diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 1e177a305..00c3c5d09 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -80,7 +80,7 @@ module.exports = { { text: 'Produit', link: '/fr/product/' }, { text: 'Programme de formation', link: 'https://mojaloop.io/mojaloop-training-program/' } ], - } + }, }, nav: [ { text: 'Adoption', link: '/adoption/' }, @@ -1256,30 +1256,883 @@ module.exports = { } ] } - ] - } - }, - - /** - * Apply plugins,ref:https://v1.vuepress.vuejs.org/zh/plugin/ - */ - plugins: [ - '@vuepress/plugin-back-to-top', - '@vuepress/plugin-medium-zoom', - 'versioning' - ], - - locales: { - '/': { - lang: 'en-US', - title: 'Mojaloop Documentation', - description: '', - }, - '/fr/': { - lang: 'fr-FR', - title: 'Documentation Mojaloop', - description: 'Documentation officielle du projet Mojaloop', - }, - }, -}; - + ], + '/fr/technical/': [ + { + title: 'Aperçu technique de Mojaloop', + collapsable: false, + sidebarDepth: 1, + children: [ + { + title: "Guide de déploiement", + // path: 'technical/deployment-guide/readme', + collapsible: true, + sidebarDepth: 2, + children: [ + ['technical/deployment-guide/', 'Déploiement de Mojaloop'], + 'technical/deployment-guide/deployment-troubleshooting', + 'technical/deployment-guide/upgrade-strategy-guide', + 'technical/deployment-guide/mojaloop-repository-update-guide' + ] + }, + { + title: "Mojaloop Hub", + collapsable: true, + sidebarDepth: 2, + children: [ + ['technical/overview/', 'Aperçu des composants Mojaloop'], + 'technical/overview/components-PI14', + 'technical/overview/components-PI12', + 'technical/overview/components-PI11', + 'technical/overview/components-PI8', + 'technical/overview/components-PI7', + 'technical/overview/components-PI6', + 'technical/overview/components-PI5', + 'technical/overview/components-PI3' + ] + }, + { + title: "Versions de Mojaloop", + path: "technical/releases" + }, + { + title: "Service de recherche de comptes", + collapsable: true, + sidebarDepth: 2, + children: [ + ['technical/account-lookup-service/', 'Aperçu'], + 'technical/account-lookup-service/als-get-participants', + 'technical/account-lookup-service/als-post-participants', + 'technical/account-lookup-service/als-post-participants-batch', + 'technical/account-lookup-service/als-del-participants', + 'technical/account-lookup-service/als-get-parties', + ] + }, + { + title: "Service de cotation", + collapsable: true, + sidebarDepth: 2, + children: [ + ['technical/quoting-service/', 'Aperçu'], + 'technical/quoting-service/qs-get-quotes', + 'technical/quoting-service/qs-post-quotes', + 'technical/quoting-service/qs-get-bulk-quotes', + 'technical/quoting-service/qs-post-bulk-quotes' + ] + }, + { + title: "Grand livre central", + collapsable: true, + sidebarDepth: 2, + children: [ + { + title: "Aperçu", + path: "technical/central-ledger/" + }, + { + title: "Opérations d'administration", + collapsable: true, + children: [ + { + title: "Aperçu", + path: "technical/central-ledger/admin-operations/", + }, + { + title: "POST Limite de participant", + path: "technical/central-ledger/admin-operations/1.0.0-post-participant-position-limit" + }, + { + title: "GET Détails de la limite de participant", + path: "technical/central-ledger/admin-operations/1.1.0-get-participant-limit-details" + }, + { + title: "GET Limites de tous les participants", + path: "technical/central-ledger/admin-operations/1.0.0-get-limits-for-all-participants" + }, + { + title: "POST Limites de participant", + path: "technical/central-ledger/admin-operations/1.1.0-post-participant-limits" + }, + { + title: "GET Statut du transfert", + path: "technical/central-ledger/admin-operations/1.1.5-get-transfer-status" + }, + { + title: "POST Callback du participant", + path: "technical/central-ledger/admin-operations/3.1.0-post-participant-callback-details" + }, + { + title: "GET Callback du participant", + path: "technical/central-ledger/admin-operations/3.1.0-get-participant-callback-details" + }, + { + title: "GET Position du participant", + path: "technical/central-ledger/admin-operations/4.1.0-get-participant-position-details" + }, + { + title: "GET Positions de tous les participants", + path: "technical/central-ledger/admin-operations/4.2.0-get-positions-of-all-participants" + } + ] + }, + { + title: "Opérations de transferts", + collapsable: true, + children: [ + { + title: "Aperçu", + path: "technical/central-ledger/transfers/" + }, + { + title: "Gestionnaire de préparation", + collapsable: true, + children: [ + { + title: "Aperçu", + path: "technical/central-ledger/transfers/1.1.0-prepare-transfer-request" + }, + { + title: "Consommation du gestionnaire de préparation", + path: "technical/central-ledger/transfers/1.1.1.a-prepare-handler-consume" + } + ] + }, + { + title: "Gestionnaire de position de préparation", + path: "technical/central-ledger/transfers/1.3.0-position-handler-consume" + }, + { + title: "Gestionnaire de position de préparation v1.1", + collapsable: true, + children: [ + { + title: "Aperçu", + path: "technical/central-ledger/transfers/1.3.0-position-handler-consume-v1.1" + }, + { + title: "Gestionnaire de position de préparation", + path: "technical/central-ledger/transfers/1.3.1-prepare-position-handler-consume" + }, + { + title: "Consommation du gestionnaire de position", + path: "technical/central-ledger/transfers/1.1.2.a-position-handler-consume" + } + ] + }, + { + title: "Gestionnaire de clôture", + path: "technical/central-ledger/transfers/2.1.0-fulfil-transfer-request" + }, + { + title: "Gestionnaire de clôture v1.1", + collapsable: true, + children: [ + { + title: "Aperçu", + path: "technical/central-ledger/transfers/2.1.0-fulfil-transfer-request-v1.1" + }, + { + title: "Consommation du gestionnaire de clôture", + path: "technical/central-ledger/transfers/2.1.1-fulfil-handler-consume" + }, + { + title: "Consommation du gestionnaire de clôture v1.1", + path: "technical/central-ledger/transfers/2.1.1-fulfil-handler-consume-v1.1" + } + ] + }, + { + title: "Gestionnaire de position de clôture", + collapsable: true, + children: [ + { + title: "Aperçu", + path: "technical/central-ledger/transfers/1.3.0-position-handler-consume" + }, + { + title: "Gestionnaire de position de clôture", + path: "technical/central-ledger/transfers/1.3.2-fulfil-position-handler-consume" + }, + { + title: "Gestionnaire de position de clôture v1.1", + path: "technical/central-ledger/transfers/1.3.2-fulfil-position-handler-consume-v1.1" + } + ] + }, + { + title: "Transfert rejeté lors de la clôture", + collapsable: true, + children: [ + { + title: "Aperçu", + path: "technical/central-ledger/transfers/2.2.0-fulfil-reject-transfer" + }, + { + title: "Transfert rejeté (a)", + path: "technical/central-ledger/transfers/2.2.0.a-fulfil-abort-transfer" + }, + { + title: "Gestionnaire de clôture (Rejet-Abandon)", + path: "technical/central-ledger/transfers/2.2.1-fulfil-reject-handler" + } + ] + }, + { + title: "Transfert rejeté lors de la clôture v1.1", + collapsable: true, + children: [ + { + title: "Aperçu", + path: "technical/central-ledger/transfers/2.2.0-fulfil-reject-transfer-v1.1" + }, + { + title: "Transfert rejeté (a) v1.1", + path: "technical/central-ledger/transfers/2.2.0.a-fulfil-abort-transfer-v1.1" + }, + { + title: "Gestionnaire de clôture (Rejet-Abandon) v1.1", + path: "technical/central-ledger/transfers/2.2.1-fulfil-reject-handler-v1.1" + } + ] + }, + { + title: "Notifications", + collapsable: true, + children: [ + { + title: "Notification au participant (a)", + path: "technical/central-ledger/transfers/1.1.4.a-send-notification-to-participant" + }, + { + title: "Notification au participant (a) - v1.1", + path: "technical/central-ledger/transfers/1.1.4.a-send-notification-to-participant-v1.1" + }, + { + title: "Notification au participant (b)", + path: "technical/central-ledger/transfers/1.1.4.b-send-notification-to-participant" + } + ] + }, + { + title: "Rejet/Abandon", + collapsable: true, + children: [ + { + title: "Gestionnaire d'abandon de position", + path: "technical/central-ledger/transfers/1.3.3-abort-position-handler-consume" + } + ] + }, + { + title: "Expiration", + collapsable: true, + children: [ + { + title: "Expiration du transfert", + path: "technical/central-ledger/transfers/2.3.0-transfer-timeout" + }, + { + title: "Consommation du gestionnaire d'expiration", + path: "technical/central-ledger/transfers/2.3.1-timeout-handler-consume" + } + ] + }, + ] + }, + { + title: "Opérations de transfert FX", + collapsable: true, + children: [ + { + title: "Aperçu", + path: "central-fx-transfers/transfers/" + }, + { + title: "Gestionnaire de préparation FX", + collapsable: true, + children: [ + { + title: "Aperçu", + path: "central-fx-transfers/transfers/1.1.0-fx-prepare-transfer-request" + }, + { + title: "Consommation du gestionnaire de préparation FX", + path: "central-fx-transfers/transfers/1.1.1.a-fx-prepare-handler-consume" + } + ] + }, + { + title: "Gestionnaire de position FX", + path: "central-fx-transfers/transfers/1.1.2.a-fx-position-handler-consume" + }, + { + title: "Gestionnaire de clôture FX", + path: "central-fx-transfers/transfers/2.1.0-fx-fulfil-transfer-request" + }, + { + title: "Processus de notifications", + path: "central-fx-transfers/transfers/1.1.4.a-send-notification-to-participant-v2.0" + }, + { + title: "Rejet/Abandon", + path: "central-fx-transfers/transfers/2.2.0-fx-fulfil-reject-transfer" + } + ] + }, + { + title: "Opérations de transferts groupés", + collapsable: true, + children: [ + { + title: "Aperçu", + path: "technical/central-bulk-transfers/" + }, + { + title: "Préparation groupée", + collapsable: true, + children: [ + { + title: "Aperçu", + path: "technical/central-bulk-transfers/transfers/1.1.0-bulk-prepare-transfer-request-overview" + }, + { + title: "Gestionnaire de préparation groupée", + path: "technical/central-bulk-transfers/transfers/1.1.1-bulk-prepare-handler-consume" + } + ] + }, + { + title: "Gestionnaire de préparation", + collapsable: true, + path: "technical/central-bulk-transfers/transfers/1.2.1-prepare-handler-consume-for-bulk" + }, + { + title: "Gestionnaire de position", + collapsable: true, + children: [ + { + title: "Aperçu", + path: "technical/central-bulk-transfers/transfers/1.3.0-position-handler-consume-overview" + }, + { + title: "Consommation du gestionnaire de position de préparation", + path: "technical/central-bulk-transfers/transfers/1.3.1-prepare-position-handler-consume" + }, + { + title: "Consommation du gestionnaire de position de clôture", + path: "technical/central-bulk-transfers/transfers/2.3.1-fulfil-position-handler-consume" + }, + { + title: "Consommation du gestionnaire d'abandon de position de clôture", + path: "technical/central-bulk-transfers/transfers/2.3.2-position-consume-abort" + } + ] + }, + { + title: "Gestionnaire de clôture groupée", + collapsable: true, + children: [ + { + title: "Aperçu", + path: "technical/central-bulk-transfers/transfers/2.1.0-bulk-fulfil-transfer-request-overview" + }, + { + title: "Consommation du gestionnaire de clôture groupée", + path: "technical/central-bulk-transfers/transfers/2.1.1-bulk-fulfil-handler-consume" + }, + { + title: "Gestionnaire de clôture - Confirmation", + path: "technical/central-bulk-transfers/transfers/2.2.1-fulfil-commit-for-bulk" + }, + { + title: "Gestionnaire de clôture - Rejet/Abandon", + path: "technical/central-bulk-transfers/transfers/2.2.2-fulfil-abort-for-bulk" + } + ] + }, + { + title: "Gestionnaire de traitement groupé", + path: "technical/central-bulk-transfers/transfers/1.4.1-bulk-processing-handler" + }, + { + title: "Notifications", + collapsable: true, + children: [ + { + title: "Notification au participant (a)", + path: "technical/central-ledger/transfers/1.1.4.a-send-notification-to-participant" + }, + { + title: "Notification au participant (b)", + path: "technical/central-ledger/transfers/1.1.4.b-send-notification-to-participant" + } + ] + }, + { + title: "Expiration", + collapsable: true, + children: [ + { + title: "Aperçu", + path: "technical/central-bulk-transfers/transfers/3.1.0-transfer-timeout-overview-for-bulk" + }, + { + title: "Consommation du gestionnaire d'expiration", + path: "technical/central-bulk-transfers/transfers/3.1.1-transfer-timeout-handler-consume" + } + ] + }, + { + title: "Aperçu sur l'abandon groupé", + path: "technical/central-bulk-transfers/transfers/4.1.0-transfer-abort-overview-for-bulk" + }, + { + title: "Aperçu sur la récupération du transfert groupé", + path: "technical/central-bulk-transfers/transfers/5.1.0-transfer-get-overview-for-bulk" + } + ] + } + ] + }, + { + // TODO: Placeholder and temporary link for this section until it can be migrated from legacy docs. + title: 'Services de règlement central', + path: 'https://docs.mojaloop.io/legacy/mojaloop-technical-overview/central-settlements/' + }, + { + title: "Service des demandes de transaction", + collapsable: true, + sidebarDepth: 2, + children: [ + { + title: "Aperçu", + path: "technical/transaction-requests-service/" + }, + { + title: "GET Demandes de transaction", + path: "technical/transaction-requests-service/transaction-requests-get" + }, + { + title: "POST Demandes de transaction", + path: "technical/transaction-requests-service/transaction-requests-post" + }, + { + title: "Autorisations", + path: "technical/transaction-requests-service/authorizations" + } + ] + }, + { + title: "Service de traitement des événements centraux", + collapsable: true, + sidebarDepth: 2, + children: [ + { + title: "Aperçu", + path: "technical/central-event-processor/" + }, + { + title: "Gestionnaire d'événements (Placeholder)", + path: "technical/central-event-processor/event-handler-placeholder" + }, + { + title: "Gestionnaire de notification pour les rejets", + path: "technical/central-event-processor/notification-handler-for-rejections" + }, + { + title: "Validation de signature", + path: "technical/central-event-processor/signature-validation" + } + ] + }, + { + title: "Cadre d'événements", + collapsable: true, + sidebarDepth: 2, + children: [ + { + title: "Aperçu", + path: "technical/event-framework/" + }, + { + title: "Processeur de flux d'événements", + path: "technical/event-stream-processor/" + } + ] + }, + { + title: "Gestion de la sécurité & des vulnérabilités", + collapsable: true, + sidebarDepth: 2, + children: [ + { + title: "Aperçu de la sécurité", + path: "technical/security/security-overview" + }, + { + title: "Gestion des vulnérabilités des dépendances", + path: "technical/security/dependency-vulnerability-management" + } + ] + }, + { + title: "Adaptateur SDK Scheme", + collapsable: true, + sidebarDepth: 2, + children: [ + { + title: "Aperçu", + path: "technical/sdk-scheme-adapter/" + }, + { + title: "Modèles de flux d'intégration", + path: "technical/sdk-scheme-adapter/IntegrationFlowPatterns" + }, + { + title: "Request To Pay - support", + path: "technical/sdk-scheme-adapter/RequestToPay" + }, + { + title: "Modèles de flux d'intégration groupée", + path: "technical/sdk-scheme-adapter/IntegrationBulkFlowPatterns" + }, + { + title: "Tests d'utilisation", + path: "technical/sdk-scheme-adapter/usage/" + }, + { + title: "Support pour les transferts groupés", + collapsable: true, + sidebarDepth: 2, + children: [ + { + title: "Aperçu", + path: "technical/sdk-scheme-adapter/BulkEnhancements/" + }, + { + title: "API", + path: "technical/sdk-scheme-adapter/BulkEnhancements/SDKBulk-API-Design" + }, { + title: "Conception DDD & Event Sourcing", + path: "technical/sdk-scheme-adapter/BulkEnhancements/SDKBulk-EventSourcing-Design" + }, { + title: "Tests", + path: "technical/sdk-scheme-adapter/BulkEnhancements/SDKBulk-Tests" + } + ] + } + ] + }, + { + title: "ML Testing Toolkit", + collapsable: true, + children: [ + { + title: "Aperçu", + path: "technical/ml-testing-toolkit/" + } + ] + } + ] + }, + { + title: 'Architecture de référence', + // path: './HubOperations/TechOps/tech-ops-introduction', + collapsable: true, // optional, defaults to true + sidebarDepth: 1, // optional, defaults to 1 + children: [ + { + title: 'Contextes délimités', + // path: 'reference-architecture/boundedContexts/', // optional, link of the title, which should be an absolute path and must exist + //collapsable: false, + initialOpenGroupIndex: -1, + children: [ + { + title: 'Termes communs & conventions', + path: 'reference-architecture/boundedContexts/commonTermsConventions/', // optional, link of the title, which should be an absolute path and must exist + // children: [ /* ... */ ], + }, + { + title: 'Recherche & découverte de compte', + path: 'reference-architecture/boundedContexts/accountLookupAndDiscovery/', // optional, link of the title, which should be an absolute path and must exist + // children: [ /* ... */ ], + }, + { + title: 'Comptes & soldes', + path: 'reference-architecture/boundedContexts/accountsAndBalances/', // optional, link of the title, which should be an absolute path and must exist + // children: [ /* ... */ ], + }, + { + title: 'Cotation/Accords', + path: 'reference-architecture/boundedContexts/quotingAgreement/', // optional, link of the title, which should be an absolute path and must exist + // children: [ /* ... */ ], + }, + { + title: 'Audit', + path: 'reference-architecture/boundedContexts/auditing/', // optional, link of the title, which should be an absolute path and must exist + // children: [ /* ... */ ], + }, + { + title: 'API FSP Interop', + path: 'reference-architecture/boundedContexts/fspInteropApi/', // optional, link of the title, which should be an absolute path and must exist + // children: [ /* ... */ ], + }, + { + title: 'Journalisation', + path: 'reference-architecture/boundedContexts/logging/', // optional, link of the title, which should be an absolute path and must exist + // children: [ /* ... */ ], + }, + { + title: 'Notifications et alertes', + path: 'reference-architecture/boundedContexts/notificationsAndAlerts/', // optional, link of the title, which should be an absolute path and must exist + // children: [ /* ... */ ], + }, + { + title: 'Gestion du cycle de vie des participants', + path: 'reference-architecture/boundedContexts/participantLifecycleManagement/', // optional, link of the title, which should be an absolute path and must exist + // children: [ /* ... */ ], + }, + //{ + // title: 'Supervision de la plateforme', + // path: '/boundedContexts/platformMonitoring/', // optional, link of the title, which should be an absolute path and must exist + // children: [ /* ... */ ], + //}, + { + title: 'Rapports', + path: 'reference-architecture/boundedContexts/reporting/', // optional, link of the title, which should be an absolute path and must exist + // children: [ /* ... */ ], + }, + { + title: 'Planification', + path: 'reference-architecture/boundedContexts/scheduling/', // optional, link of the title, which should be an absolute path and must exist + // children: [ /* ... */ ], + }, + { + title: 'Sécurité', + path: 'reference-architecture/boundedContexts/security/', // optional, link of the title, which should be an absolute path and must exist + // children: [ /* ... */ ], + }, + { + title: 'Règlements', + path: 'reference-architecture/boundedContexts/settlements/', // optional, link of the title, which should be an absolute path and must exist + // children: [ /* ... */ ], + }, + { + title: 'API tierce partie', + path: 'reference-architecture/boundedContexts/thirdPartyApi/', // optional, link of the title, which should be an absolute path and must exist + // children: [ /* ... */ ], + }, + { + title: 'Transferts', + path: 'reference-architecture/boundedContexts/transfers/', // optional, link of the title, which should be an absolute path and must exist + // children: [ /* ... */ ], + }, + ], + }, + { + title: 'Liste d\'interfaces communes', + path: 'reference-architecture/boundedContexts/commonInterfaces/', // optional, link of the title, which should be an absolute path and must exist + // children: [ /* ... */ ], + }, + + + { + title: 'Comment implémenter', + path: 'reference-architecture/howToImplement/', // optional, link of the title, which should be an absolute path and must exist + // children: [ /* ... */ ], + }, + { + title: 'Glossaire', + path: 'reference-architecture/glossary/', // optional, link of the title, which should be an absolute path and must exist + // children: [ /* ... */ ], + }, + { + title: 'Pour aller plus loin', + path: 'reference-architecture/furtherReading/', // optional, link of the title, which should be an absolute path and must exist + // children: [ /* ... */ ], + } + ] + }, + { + title: 'APIs Mojaloop', + collapsable: false, // optional, defaults to true + sidebarDepth: 1, // optional, defaults to 1 + children: [ + { + title: 'API FSPIOP', + collapsable: true, + sidebarDepth: 4, + children: [ + { + title: 'Aperçu', + path: 'api/fspiop/', + }, + { + title: 'Définitions API', + collapsable: false, + children: [ + { + title: 'v1.1 (Actuel)', + path: 'api/fspiop/v1.1/api-definition' + }, + { + title: 'Versions précédentes', + children: [ + ['api/fspiop/v1.0/api-definition', 'v1.0'], + ] + } + ] + }, + { + title: 'Modèle de données logique', + path: 'api/fspiop/logical-data-model', + collapsable: true + }, + { + title: 'Modèles de transactions génériques', + path: 'api/fspiop/generic-transaction-patterns', + collapsable: true + }, + { + title: 'Cas d\'utilisation', + path: 'api/fspiop/use-cases' + }, + { + title: 'Règles de liaison JSON', + path: 'api/fspiop/json-binding-rules' + }, + { + title: 'Règles du schéma', + path: 'api/fspiop/scheme-rules', + }, + { + title: 'Bonnes pratiques PKI', + path: 'api/fspiop/pki-best-practices', + }, + { + title: 'Signature (v1.1)', + path: 'api/fspiop/v1.1/signature', + }, + { + title: 'Chiffrement (v1.1)', + path: 'api/fspiop/v1.1/encryption', + }, + { + title: 'Glossaire', + path: 'api/fspiop/glossary', + }, + ] + }, + { + title: 'API d\'administration', + collapsable: true, + sidebarDepth: 2, + children: [ + { + title: 'Aperçu', + path: 'api/administration/' + }, + { + title: 'API du grand livre central', + path: 'api/administration/central-ledger-api', + }, + ] + }, + { + title: 'API de règlement', + collapsable: true, + sidebarDepth: 2, + children: [ + ['api/settlement/', 'Aperçu'], + ] + }, + { + title: 'API tierce partie', + collapsable: true, + sidebarDepth: 2, + children: [ + { + title: 'Aperçu', + path: 'api/thirdparty/', + }, + { + title: 'Modèles de transactions', + collapsable: true, + children: [ + { + title: 'Modèle de transaction Linking', + path: 'api/thirdparty/transaction-patterns-linking' + }, + { + title: 'Modèle de transaction Transfert', + path: 'api/thirdparty/transaction-patterns-transfer' + } + ] + }, + { + title: 'Modèles de données', + path: 'api/thirdparty/data-models', + collapsable: true + }, + ] + }, + { + title: 'Divers', + collapsable: true, + children: [ + ['api/fspiop/glossary', 'Glossaire'], + ['api/license', 'Licence'], + ], + } + ] + }, + { + title: 'Opérations du Hub Mojaloop', + collapsable: true, // optional, defaults to true + sidebarDepth: 1, // optional, defaults to 1 + children: [ + { + title: 'Contextes délimités', + // path: 'reference-architecture/boundedContexts/', // optional, link of the title, which should be an absolute path and must exist + //collapsable: false, + initialOpenGroupIndex: -1, + children: [ + '', + 'business-operations-framework/SecurityBC', + 'business-operations-framework/Microfrontend-JAMStack', + 'business-operations-framework/ReportingBC', + 'business-operations-framework/ReportDeveloperGuide', + { + title: "Implémentation des opérations de règlement", + path: 'business-operations-framework/SettlementBC' + } + ] + } + ] + } + ] + } + }, + + /** + * Apply plugins,ref:https://v1.vuepress.vuejs.org/zh/plugin/ + */ + plugins: [ + '@vuepress/plugin-back-to-top', + '@vuepress/plugin-medium-zoom', + 'versioning' + ], + + locales: { + '/': { + lang: 'en-US', + title: 'Mojaloop Documentation', + description: '', + }, + '/fr/': { + lang: 'fr-FR', + title: 'Documentation Mojaloop', + description: 'Documentation officielle du projet Mojaloop', + }, + }, +}; diff --git a/docs/fr/technical/README.md b/docs/fr/technical/README.md new file mode 100644 index 000000000..dea1fbdc8 --- /dev/null +++ b/docs/fr/technical/README.md @@ -0,0 +1,16 @@ +# Vue d'ensemble technique de Mojaloop + +## Services Mojaloop + +L'idée principale derrière Mojaloop est de connecter plusieurs Fournisseurs de Services Financiers Numériques (DFSP) au sein d'un réseau compétitif et interopérable, afin de maximiser les possibilités pour les populations défavorisées d'accéder à des services financiers à faibles coûts ou gratuits. Nous ne souhaitons pas qu'une seule entité ait le monopole sur tous les paiements d'un pays, ni créer un système qui exclut de nouveaux entrants. Avoir trop de sous-réseaux isolés n’est pas non plus une solution. Les schémas suivants illustrent les interconnexions Mojaloop entre les DFSP et le Hub Mojaloop (exemple de schéma d’implémentation) pour un transfert de pair à pair (P2P) : + +Mojaloop répond à ces défis de plusieurs façons clés : +* Un ensemble de services centraux fournit un hub permettant à l’argent de circuler d’un DFSP à un autre. Ceci est similaire au fonctionnement d’une banque centrale ou d’une chambre de compensation dans les pays développés. Outre le registre central, ces services peuvent assurer la recherche d'identité, la gestion de la fraude et l’application des règles du schéma. +* Un ensemble standardisé d’interfaces qu’un DFSP peut mettre en œuvre pour se connecter au système, ainsi que des exemples de code montrant comment utiliser le système. Un DFSP souhaitant se connecter peut adapter notre code exemple ou implémenter les interfaces standardisées dans son propre logiciel. L’objectif est de rendre la connexion au réseau interopérable aussi simple que possible pour un DFSP. +* Des implémentations open-source complètes et fonctionnelles des deux côtés des interfaces : un exemple de DFSP qui peut envoyer et recevoir des paiements, ainsi qu’un client que tout DFSP existant peut héberger pour se connecter au réseau. + +![Flux d’architecture de bout en bout Mojaloop PI5](./technical/assets/diagrams/architecture/Arch-Mojaloop-end-to-end-PI6.svg) + +Le Hub Mojaloop est le conteneur principal et la référence que nous utilisons pour décrire l’écosystème Mojaloop, qui est divisé dans les domaines suivants : +* Services Open Source Mojaloop : solution logicielle open source (OSS) de base Mojaloop soutenue par la Fondation Bill & Melinda Gates en partenariat avec la communauté open source. +* Hub Mojaloop : implémentation de référence globale (et personnalisable) de Mojaloop pour les opérateurs de hub, basée sur la solution OSS ci-dessus. \ No newline at end of file diff --git a/docs/fr/technical/api/README.md b/docs/fr/technical/api/README.md new file mode 100644 index 000000000..2499da750 --- /dev/null +++ b/docs/fr/technical/api/README.md @@ -0,0 +1,17 @@ +--- +footerCopyright: Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0) | Ericsson, Huawei, Mahindra-Comviva, Telepin, et la Fondation Bill & Melinda Gates +--- + +# Catalogue des APIs + +La famille des APIs Mojaloop regroupe plusieurs APIs différentes qui répondent à divers besoins métier ou transactionnels. Jusqu'à présent, les APIs bien définies et adoptées sont : + +- [APIs d’Interopérabilité FSP (FSPIOP)](./fspiop/) +- [API d’Administration](./administration/) +- [API de Règlement](./settlement/) +- [API d’Initiation de Paiement Tiers (3PPI/PISP)](./thirdparty/) + +D’autres APIs sont soit en cours de développement et de conception, soit prévues sur la feuille de route : + +- API inter-réseaux (FX) +- API de reporting diff --git a/docs/fr/technical/api/administration/README.md b/docs/fr/technical/api/administration/README.md new file mode 100644 index 000000000..34709b4bc --- /dev/null +++ b/docs/fr/technical/api/administration/README.md @@ -0,0 +1,15 @@ +# API d'Administration + +L'API d'Administration comprend les documents suivants. + +## API d'Administration du Central Ledger + +[La spécification de l'API Central Ledger](./central-ledger-api.md) présente et décrit l'**API Central Ledger**. Le but de cette API est de permettre aux opérateurs du Hub de gérer les processus administratifs liés à : + +- La création/l’activation/la désactivation de participants dans le Hub +- L’ajout et la mise à jour des informations de point de terminaison des participants +- La gestion des comptes des participants, des limites et des positions +- La création de comptes Hub +- L'exécution des opérations de Fonds Entrants et Sortants +- La création/la mise à jour/la consultation des modèles de règlement +- La récupération des détails des transferts diff --git a/docs/fr/technical/api/administration/central-ledger-api.md b/docs/fr/technical/api/administration/central-ledger-api.md new file mode 100644 index 000000000..0418b6076 --- /dev/null +++ b/docs/fr/technical/api/administration/central-ledger-api.md @@ -0,0 +1,1728 @@ +--- +showToc: true +--- +# API du Central Ledger + +## Introduction + +Ce document fournit des informations détaillées sur l'API Central Ledger. L’API Central Ledger est une API Mojaloop permettant aux opérateurs du Hub de gérer les processus administratifs tels que : + +- Création/activation/désactivation des participants dans le Hub +- Ajout et mise à jour des informations d’endpoints des participants +- Gestion des comptes, des limites et des positions des participants +- Création de comptes Hub +- Effectuer des opérations de dépôt (Funds In) et de retrait (Funds Out) +- Création/mise à jour/consultation des modèles de règlement (settlement) +- Récupération des détails des transferts + +Pour plus d’informations sur les concepts de participants et de modèles de règlement que l’opérateur du Hub peut gérer via l’API Central Ledger, voir la section [Concepts de base](#basic-concepts). + +
+ +## Concepts de base + +Afin de contextualiser les opérations administratives rendues possibles par l’API Central Ledger, cette section présente une brève définition de certains concepts essentiels. + +### Participant + +Le Hub lui-même ou un Prestataire de Services Financiers Numériques (DFSP) qui participe à un schéma Mojaloop. + +### Endpoint + +L’URL de callback du DFSP où le Hub envoie les callbacks de l’API. L’URL spécifiée correspond à l’endpoint configuré dans la passerelle API sortante. + +### Limite + +Actuellement, un seul type de limite est supporté, appelée "_Net Debit Cap (NDC)_". À l’avenir, d’autres types de limites pourraient être pris en charge. + +Le _Net Debit Cap_ représente la couverture de liquidité disponible pour un compte spécifique (le compte de Position). Il s’agit du montant total de fonds garantis que le système atteste disponibles afin de garantir qu’un participant a la capacité de régler les obligations résultant des transferts sur ce compte de Position. Ce montant est représenté par le solde d’un compte (le compte de Règlement), qui est lié au compte de Position via un modèle de règlement. L’origine des fonds dans ce compte peut provenir soit de dépôts/retraits effectués par les administrateurs du système, soit de fonds automatiquement crédités/débités par le système si le compte correspond à un modèle de règlement brut immédiat. + +Il doit également être possible pour un participant d’indiquer qu’un montant (ou une proportion) des fonds disponibles dans un compte de Règlement soit exclu du calcul du Net Debit Cap. Dans le cas où un participant est bénéficiaire net sur le long terme via le règlement, ou conserve un excédent de fonds pour faire face à des périodes où il n’est pas possible d’alimenter les comptes, il peut choisir d’exclure une partie du solde de son compte de règlement du calcul de couverture pour les transferts. + +### Compte + +Également appelé _Ledger_. Le Hub maintient plusieurs comptes internes pour suivre les mouvements de fonds (argent électronique ou réel) entre les DFSPs. + +### Position + +La Position représente le solde net de : +- transferts sur le compte ayant été compensés mais pas encore réglés, et +- transferts sur le compte où : + - le DFSP est débiteur, + - le transfert a été accepté pour traitement mais pas encore compensé par le Hub. + +La Position d’un compte donné est toujours vérifiable et à jour. + +Lorsqu’un transfert est initié, le Hub vérifie que le DFSP dispose d’une couverture de liquidité suffisante sur ce compte pour couvrir le montant du transfert. Sinon, le transfert sera rejeté. + +Nous autorisons actuellement que les obligations nées sur le compte – où le participant est bénéficiaire – réduisent la Position du participant, comme si ces fonds avaient déjà été réglés. + +### Opérations Funds In et Funds Out + +Les opérations Funds In et Funds Out servent à tracer (dans les comptes du Hub) les mouvements d’argent liés aux dépôts, retraits et règlements. + +Les opérations Funds In enregistrent soit le dépôt d’argent sur le compte bancaire de règlement d’un DFSP, soit le montant du règlement pour un DFSP receveur. + +Les opérations Funds Out enregistrent soit le retrait d’argent d’un compte bancaire de règlement d’un DFSP, soit le montant du règlement pour un DFSP qui envoie des fonds. + +### Modèle de règlement (Settlement model) + +Fait référence à la façon dont le règlement se produit dans un schéma. Le règlement est le processus par lequel des fonds sont transférés d’un DSFP à un autre, de sorte que le DFSP du payeur rembourse celui du bénéficiaire pour les fonds versés lors d’une transaction. Un modèle de règlement spécifie si les participants règlent séparément entre eux ou avec le schéma, si les transferts sont réglés un par un ou en lot, immédiatement ou avec délai, etc. + +
+ +## Détails HTTP + +Cette section fournit des informations détaillées sur l’usage du protocole HTTP au niveau applicatif dans l’API. + +### Champs d’entête HTTP + +Les entêtes HTTP sont généralement décrits dans la [RFC 7230](https://tools.ietf.org/html/rfc7230). Tout entête spécifique à l’API Central Ledger sera standardisé à l’avenir. + +### Méthodes HTTP + +Les méthodes HTTP suivantes, telles que définies dans la [RFC 7231](https://tools.ietf.org/html/rfc7231#section-4), sont supportées par l’API : + +- `GET` – La méthode HTTP GET est utilisée par un client pour récupérer des informations concernant un objet déjà créé sur un serveur. +- `POST` – La méthode HTTP POST est utilisée par un client pour demander la création d’un objet sur le serveur. +- `PUT` – La méthode HTTP PUT est utilisée par un client pour modifier un objet déjà existant sur le serveur (remplace la représentation de la ressource cible par le contenu de la requête). + +> **REMARQUE :** La méthode `DELETE` n’est pas prise en charge. + +### Codes de statut de réponse HTTP + +La table [Codes de statut de réponse HTTP](#http-response-status-codes) liste les codes de statut HTTP pris en charge par l’API : + +|Code Statut|Raison|Description| +|---|---|---| +|**200**|OK|Réponse standard pour une opération `GET`, `PUT`, ou `POST` réussie. La réponse contiendra une entité correspondant à la ressource demandée.| +|**201**|Created|La requête `POST` a abouti à la création d’une nouvelle ressource. La réponse ne contiendra pas d’entité décrivant ou contenant le résultat de l’action.| +|**202**|Accepted|La requête a été acceptée pour traitement, mais le traitement n’est pas encore terminé.| +|**400**|Bad Request|Le serveur n’a pas compris la requête à cause d’une syntaxe invalide.| +|**401**|Unauthorized|L’accès à la ressource nécessite une authentification.| +|**403**|Forbidden|La requête a été rejetée, et le sera également à l’avenir.| +|**404**|Not Found|La ressource demandée n’est pas disponible actuellement.| +|**405**|Method Not Allowed|Une méthode HTTP non supportée a été utilisée.| +|**406**|Not Acceptable|La ressource demandée ne peut générer que du contenu non accepté selon les entêtes Accept de la requête.| +|**500**|Internal Server Error|Message d’erreur générique, utilisé lorsqu’une condition inattendue est rencontrée et qu’aucun message plus spécifique n’est approprié.| +|**501**|Not Implemented|Le serveur ne supporte pas le service demandé. Le client ne doit pas réessayer.| +|**503**|Service Unavailable|Le serveur est temporairement indisponible pour de nouvelles requêtes. Cela doit être un état temporaire, le client doit réessayer dans un délai raisonnable.| + +
+ +## Services API + +Cette section introduit et détaille tous les services supportés par l’API pour chaque ressource et méthode HTTP. + +### Services API de haut niveau + +De façon générale, l’API permet d’effectuer les actions suivantes : + +- **`/participants`** : Consulter, créer ou modifier les détails des participants tels que la limite (Net Debit Cap), la position, ou les endpoints configurés. +- **`/settlementModels`** : Consulter, créer ou modifier les détails liés aux modèles de règlement (granularité, délais, contrôle de liquidité etc.). +- **`/transactions`** : Consulter les détails d’une transaction particulière. + +### Services API supportés + +La table [Services API supportés](#supported-api-services) inclut une description de haut niveau des services fournis par l’API. Pour plus de détails, se référer aux sections suivantes. + +| URI | Méthode HTTP `GET`| Méthode HTTP `PUT` | Méthode HTTP `POST` | Méthode HTTP `DELETE` | +|---|---|---|---|---| +| **`/participants`** | Obtenir les infos de tous les participants | Non supporté | Créer un participant dans le Hub | Non supporté | +| `/participants/limits` | Voir les limites pour tous les participants | Non supporté | Non supporté | Non supporté | +| `/participants/{name}` | Obtenir les infos d’un participant particulier | Modifier les infos du participant (activer/désactiver) | Non supporté | Non supporté | +| `/participants/{name}/endpoints` | Voir les endpoints d’un participant | Non supporté | Ajouter/Modifier les endpoints d’un participant | Non supporté | +| `/participants/{name}/limits` | Voir les limites d’un participant | Ajuster les limites d’un participant | Non supporté | Non supporté | +| `/participants/{name}/positions` | Voir les positions d’un participant | Non supporté | Non supporté | Non supporté | +| `/participants/{name}/accounts` | Voir les comptes et soldes d’un participant | Non supporté | Créer des comptes Hub | Non supporté | +| `/participants/{name}/accounts/{id}` | Non supporté | Modifier les comptes d’un participant | Enregistrer un Funds In/Out pour le compte participant | Non supporté | +| `/participants/{name}/accounts/{id}/transfers/{transferId}` | Non supporté | Non supporté | Enregistrer un transfert comme Funds In/Out pour un compte particpant | Non supporté | +| `/participants/{name}/initialPositionAndLimits` | Non supporté | Non supporté | Ajouter limites et position initiales du participant | Non supporté | +| **`/settlementModels`** | Voir tous les modèles de règlement | Non supporté | Créer un modèle de règlement | Non supporté | +| `/settlementModels/{name}` | Voir un modèle de règlement par nom | Modifier (activer/désactiver) un modèle de règlement | Non supporté | Non supporté | +| **`/transactions/{id}`** | Récupérer les détails d’une transaction par `transferId` | Non supporté | Non supporté | Non supporté | + + +
+ +## Ressource API `/participants` + +Les services proposés par la ressource `/participants` sont principalement utilisés par l’opérateur du Hub pour consulter, créer et modifier les paramètres des participants, tels que la limite (Net Debit Cap), la position ou les endpoints configurés. + +### GET /participants + +Récupère les informations de tous les participants. + +#### Exemple de requête + +``` +curl 'http:///participants' +``` + +#### Exemple de réponse + +> **REMARQUE :** Dans l’exemple ci-dessous, `dev1-central-ledger.mojaloop.live` indique l’emplacement du service Central Ledger du Hub Mojaloop. Cet élément sera différent dans votre implémentation. + +``` +HTTP/1.1 200 OK +Content-Type: application/json + +[ + { + "name": "greenbankfsp", + "id": "dev1-central-ledger.mojaloop.live/participants/greenbankfsp", + "created": "\"2021-03-04T14:20:17.000Z\"", + "isActive": 1, + "links": { + "self": "dev1-central-ledger.mojaloop.live/participants/greenbankfsp" + }, + "accounts": [ + { + "id": 15, + "ledgerAccountType": "POSITION", + "currency": "USD", + "isActive": 1, + "createdDate": null, + "createdBy": "unknown" + }, + { + "id": 16, + "ledgerAccountType": "SETTLEMENT", + "currency": "USD", + "isActive": 1, + "createdDate": null, + "createdBy": "unknown" + }, + { + "id": 21, + "ledgerAccountType": "INTERCHANGE_FEE_SETTLEMENT", + "currency": "USD", + "isActive": 1, + "createdDate": null, + "createdBy": "unknown" + } + ] + }, + { + "name": "Hub", + "id": "dev1-central-ledger.mojaloop.live/participants/Hub", + "created": "\"2021-03-04T13:37:25.000Z\"", + "isActive": 1, + "links": { + "self": "dev1-central-ledger.mojaloop.live/participants/Hub" + }, + "accounts": [ + { + "id": 1, + "ledgerAccountType": "HUB_MULTILATERAL_SETTLEMENT", + "currency": "USD", + "isActive": 1, + "createdDate": null, + "createdBy": "unknown" + }, + { + "id": 2, + "ledgerAccountType": "HUB_RECONCILIATION", + "currency": "USD", + "isActive": 1, + "createdDate": null, + "createdBy": "unknown" + } + ] + } +] +``` + +#### Modèle de données de la réponse + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String(2..30)](#string) | Le nom du participant. | +| `id` | oui | [String](#string) | L'identifiant du participant sous la forme d'un nom de domaine pleinement qualifié, combiné avec le `fspId` du participant. | +| `created` | oui | [DateTime](#datetime) | Date et heure de création du participant. | +| `isActive` | oui | [Integer(1)](#integer) | Un indicateur pour préciser si le participant est actif ou non. Les valeurs possibles sont `1` et `0`. | +| `links` | oui | [Self](#self) | Liste de liens pour un service Web RESTful Hypermedia-Driven. | +| `accounts` | oui | [Accounts](#accounts) | Liste des comptes du grand livre configurés pour le participant. | + +
+ +### POST /participants + +Crée un participant dans le Hub. + +#### Exemple de requête + +``` +curl -X POST -H "Content-Type: application/json" \ + -d '{"name": "payerfsp", "currency": "USD"}' \ + http:///participants +``` + +#### Modèle de données de la requête + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String(2..30)](#string) | Le nom du participant. | +| `currency` | oui | [CurrencyEnum](#currencyenum) | La devise dans laquelle le participant effectuera des transactions. | + +#### Exemple de réponse + +> **REMARQUE :** Dans l'exemple ci-dessous, `dev1-central-ledger.mojaloop.live` indique l'emplacement du service Central Ledger du Hub Mojaloop. Ce détail peut être différent dans votre implémentation. + +``` +HTTP/1.1 200 OK +Content-Type: application/json + +{ + "name": "payerfsp", + "id": "dev1-central-ledger.mojaloop.live/participants/payerfsp", + "created": "\"2021-01-12T10:56:30.000Z\"", + "isActive": 0, + "links": { + "self": "dev1-central-ledger.mojaloop.live/participants/hub" + }, + "accounts": [ + { + "id": 30, + "ledgerAccountType": "POSITION", + "currency": "USD", + "isActive": 0, + "createdDate": null, + "createdBy": "unknown" + }, + { + "id": 31, + "ledgerAccountType": "SETTLEMENT", + "currency": "USD", + "isActive": 0, + "createdDate": null, + "createdBy": "unknown" + } + ] +} +``` + +#### Modèle de données de la réponse + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String(2..30)](#string) | Le nom du participant. | +| `id` | oui | [String](#string) | L'identifiant du participant sous la forme d'un nom de domaine pleinement qualifié, combiné avec le `fspId` du participant. | +| `created` | oui | [DateTime](#datetime) | Date et heure de création du participant. | +| `isActive` | oui | [Integer(1)](#integer) | Un indicateur pour préciser si le participant est actif ou non. Les valeurs possibles sont `1` et `0`. | +| `links` | oui | [Self](#self) | Liste de liens pour un service Web RESTful Hypermedia-Driven. | +| `accounts` | oui | [Accounts](#accounts) | Liste des comptes du grand livre configurés pour le participant. | + +
+ +### GET /participants/limits + +Récupère les informations des limites pour tous les participants. + +#### Paramètres de requête + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `currency` | non | [CurrencyEnum](#currencyenum) | La devise de la limite. | +| `limit` | non | [String](#string) | Type de limite. | + +#### Exemple de requête + +``` +curl 'http:///participants/limits' +``` + +#### Exemple de réponse + +> **REMARQUE :** Dans l'exemple ci-dessous, `dev1-central-ledger.mojaloop.live` indique l'emplacement du service Central Ledger du Hub Mojaloop. Ce détail peut être différent dans votre implémentation. + +``` +HTTP/1.1 200 OK +Content-Type: application/json + +[ + { + "name": "payerfsp", + "currency": "USD", + "limit": { + "type": "NET_DEBIT_CAP", + "value": 10000, + "alarmPercentage": 10 + } + }, + { + "name": "payeefsp", + "currency": "USD", + "limit": { + "type": "NET_DEBIT_CAP", + "value": 10000, + "alarmPercentage": 10 + } + } +] +``` + +#### Modèle de données de la réponse + +Chaque limite dans la liste renvoyée est appliquée au nom du participant et à la devise spécifiés dans chaque objet. + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String(2..30)](#string) | Le nom du participant. | +| `currency` | oui | [CurrencyEnum](#currencyenum) | La devise configurée pour le participant. | +| `limit` | oui | [ParticipantLimit](#participantlimit) | La limite configurée pour le participant. | + +
+ +### GET /participants/{name} + +Récupère les informations sur un participant donné. + +#### Paramètres de chemin + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String(2..30)](#string) | Le nom du participant. | + +#### Exemple de requête + +``` +curl 'http:///participants/payerfsp' +``` + +#### Exemple de réponse + +> **REMARQUE :** Dans l'exemple ci-dessous, `dev1-central-ledger.mojaloop.live` indique l'emplacement du service Central Ledger du Hub Mojaloop. Ce détail peut être différent dans votre implémentation. + +``` +HTTP/1.1 200 OK +Content-Type: application/json + +{ + "name": "payerfsp", + "id": "dev1-central-ledger.mojaloop.live/participants/payerfsp", + "created": "\"2021-03-04T13:42:02.000Z\"", + "isActive": 1, + "links": { + "self": "dev1-central-ledger.mojaloop.live/participants/payerfsp" + }, + "accounts": [ + { + "id": 3, + "ledgerAccountType": "POSITION", + "currency": "USD", + "isActive": 1, + "createdDate": null, + "createdBy": "unknown" + }, + { + "id": 4, + "ledgerAccountType": "SETTLEMENT", + "currency": "USD", + "isActive": 1, + "createdDate": null, + "createdBy": "unknown" + }, + { + "id": 24, + "ledgerAccountType": "INTERCHANGE_FEE_SETTLEMENT", + "currency": "USD", + "isActive": 1, + "createdDate": null, + "createdBy": "unknown" + } + ] +} +``` + +#### Modèle de données de la réponse + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String(2..30)](#string) | Le nom du participant. | +| `id` | oui | [String](#string) | L'identifiant du participant sous la forme d'un nom de domaine pleinement qualifié, combiné avec le `fspId` du participant. | +| `created` | oui | [DateTime](#datetime) | Date et heure de création du participant. | +| `isActive` | oui | [Integer(1)](#integer) | Un indicateur pour préciser si le participant est actif ou non. Les valeurs possibles sont `1` et `0`. | +| `links` | oui | [Self](#self) | Liste de liens pour un service Web RESTful Hypermedia-Driven. | +| `accounts` | oui | [Accounts](#accounts) | Liste des comptes du grand livre configurés pour le participant. | + +
+ +### PUT /participants/{name} + +Met à jour les détails du participant (active/désactive un participant). + +#### Paramètres de chemin + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String(2..30)](#string) | Le nom du participant. | + +#### Exemple de requête + +``` +curl -X PUT -H "Content-Type: application/json" \ + -d '{"isActive": true}' \ + http:///participants/payerfsp +``` + +#### Modèle de données de la requête + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `isActive` | oui | [Boolean](boolean) | Un indicateur pour préciser si le participant est actif ou non. | + +#### Exemple de réponse + +``` +HTTP/1.1 200 OK +Content-Type: application/json + +{ + "name": "payerfsp", + "id": "dev1-central-ledger.mojaloop.live/participants/payerfsp", + "created": "\"2021-03-04T13:42:02.000Z\"", + "isActive": 1, + "links": { + "self": "dev1-central-ledger.mojaloop.live/participants/payerfsp" + }, + "accounts": [ + { + "id": 3, + "ledgerAccountType": "POSITION", + "currency": "USD", + "isActive": 1, + "createdDate": null, + "createdBy": "unknown" + }, + { + "id": 4, + "ledgerAccountType": "SETTLEMENT", + "currency": "USD", + "isActive": 1, + "createdDate": null, + "createdBy": "unknown" + }, + { + "id": 24, + "ledgerAccountType": "INTERCHANGE_FEE_SETTLEMENT", + "currency": "USD", + "isActive": 1, + "createdDate": null, + "createdBy": "unknown" + } + ] +} +``` + +#### Modèle de données de la réponse + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String(2..30)](#string) | Le nom du participant. | +| `id` | oui | [String](#string) | L'identifiant du participant sous la forme d'un nom de domaine pleinement qualifié, combiné avec le `fspId` du participant. | +| `created` | oui | [DateTime](#datetime) | Date et heure de création du participant. | +| `isActive` | oui | [Integer(1)](#integer) | Un indicateur pour préciser si le participant est actif ou non. Les valeurs possibles sont `1` et `0`. | +| `links` | oui | [Self](#self) | Liste de liens pour un service Web RESTful Hypermedia-Driven. | +| `accounts` | oui | [Accounts](#accounts) | Liste des comptes du grand livre configurés pour le participant. | + +
+ +### GET /participants/{name}/endpoints + +Récupère les informations sur les endpoints configurés pour un participant donné. + +#### Paramètres de chemin + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String(2..30)](#string) | Le nom du participant. | + +#### Exemple de requête + +``` +curl 'http:///participants/payerfsp/endpoints' +``` + +#### Exemple de réponse +``` +HTTP/1.1 200 OK +Content-Type: application/json + +[ + { + "type": "FSPIOP_CALLBACK_URL_PARTICIPANT_SUB_ID_PUT", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000/participants/{{partyIdType}}/{{partyIdentifier}}/{{partySubIdOrType}}" + }, + { + "type": "FSPIOP_CALLBACK_URL_PARTICIPANT_SUB_ID_PUT_ERROR", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000/participants/{{partyIdType}}/{{partyIdentifier}}/{{partySubIdOrType}}/error" + }, + { + "type": "FSPIOP_CALLBACK_URL_PARTICIPANT_SUB_ID_DELETE", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000/participants/{{partyIdType}}/{{partyIdentifier}}/{{partySubIdOrType}}" + }, + { + "type": "FSPIOP_CALLBACK_URL_PARTIES_SUB_ID_GET", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000/parties/{{partyIdType}}/{{partyIdentifier}}/{{partySubIdOrType}}" + }, + { + "type": "FSPIOP_CALLBACK_URL_PARTIES_SUB_ID_PUT", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000/parties/{{partyIdType}}/{{partyIdentifier}}/{{partySubIdOrType}}" + }, + { + "type": "FSPIOP_CALLBACK_URL_PARTIES_SUB_ID_PUT_ERROR", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000/parties/{{partyIdType}}/{{partyIdentifier}}/{{partySubIdOrType}}/error" + }, + { + "type": "FSPIOP_CALLBACK_URL_AUTHORIZATIONS", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000" + }, + { + "type": "FSPIOP_CALLBACK_URL_PARTICIPANT_PUT", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000/participants/{{partyIdType}}/{{partyIdentifier}}" + }, + { + "type": "FSPIOP_CALLBACK_URL_PARTICIPANT_PUT_ERROR", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000/participants/{{partyIdType}}/{{partyIdentifier}}/error" + }, + { + "type": "FSPIOP_CALLBACK_URL_PARTICIPANT_BATCH_PUT", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000/participants/{{requestId}}" + }, + { + "type": "FSPIOP_CALLBACK_URL_PARTICIPANT_BATCH_PUT_ERROR", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000/participants/{{requestId}}/error" + }, + { + "type": "FSPIOP_CALLBACK_URL_PARTIES_GET", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000/parties/{{partyIdType}}/{{partyIdentifier}}" + }, + { + "type": "FSPIOP_CALLBACK_URL_PARTIES_PUT", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000/parties/{{partyIdType}}/{{partyIdentifier}}" + }, + { + "type": "FSPIOP_CALLBACK_URL_PARTIES_PUT_ERROR", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000/parties/{{partyIdType}}/{{partyIdentifier}}/error" + }, + { + "type": "FSPIOP_CALLBACK_URL_QUOTES", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000" + }, + { + "type": "FSPIOP_CALLBACK_URL_TRX_REQ_SERVICE", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000" + }, + { + "type": "FSPIOP_CALLBACK_URL_TRANSFER_POST", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000/transfers" + }, + { + "type": "FSPIOP_CALLBACK_URL_TRANSFER_PUT", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000/transfers/{{transferId}}" + }, + { + "type": "FSPIOP_CALLBACK_URL_TRANSFER_ERROR", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000/transfers/{{transferId}}/error" + }, + { + "type": "FSPIOP_CALLBACK_URL_BULK_TRANSFER_POST", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000/bulkTransfers" + }, + { + "type": "FSPIOP_CALLBACK_URL_BULK_TRANSFER_PUT", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000/bulkTransfers/{{id}}" + }, + { + "type": "FSPIOP_CALLBACK_URL_BULK_TRANSFER_ERROR", + "value": "http://dev1-sim-payerfsp-scheme-adapter:4000/bulkTransfers/{{id}}/error" + }, + { + "type": "NET_DEBIT_CAP_THRESHOLD_BREACH_EMAIL", + "value": "some.email@gmail.com" + }, + { + "type": "NET_DEBIT_CAP_ADJUSTMENT_EMAIL", + "value": "some.email@gmail.com" + }, + { + "type": "SETTLEMENT_TRANSFER_POSITION_CHANGE_EMAIL", + "value": "some.email@gmail.com" + } +] +``` + +#### Modèle de données de la réponse + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `type` | oui | [String](#string) | Type de endpoint. | +| `value` | oui | [String](#string) | Valeur du endpoint. | + +
+ +### POST /participants/{name}/endpoints + +Ajoute/met à jour des endpoints pour un participant donné. + +#### Paramètres de chemin + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String(2..30)](#string) | Le nom du participant. | + +#### Exemple de requête + +``` +curl -X POST -H "Content-Type: application/json" \ + -d '{"type": "NET_DEBIT_CAP_ADJUSTMENT_EMAIL", "value": "some.email@org.com"}' + http:///participants/payerfsp/endpoints +``` + +#### Modèle de données de la requête + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `type` | oui | [String](#string) | Type de endpoint. | +| `value` | oui | [String](#string) | Valeur du endpoint. | + +#### Exemple de réponse + +``` +HTTP/1.1 201 Created +Content-Type: application/json +``` + +
+ + +### GET /participants/{name}/limits + +Récupère les informations de limite pour un participant donné. + +#### Paramètres de chemin + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String(2..30)](#string) | Le nom du participant. | + +#### Paramètres de requête + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `currency` | non | [CurrencyEnum](#currencyenum) | La devise de la limite. | +| `limit` | non | [String](#string) | Type de limite. | + +#### Exemple de requête + +``` +curl 'http:///participants/payerfsp/limits' +``` + +#### Exemple de réponse + +``` +HTTP/1.1 200 OK +Content-Type: application/json + +[ + { + "currency": "USD", + "limit": { + "type": "NET_DEBIT_CAP", + "value": 10000, + "alarmPercentage": 10 + } + } +] +``` + +#### Modèle de données de la réponse + +Chaque limite dans la liste renvoyée est appliquée au nom du participant et à la devise spécifiés dans chaque objet. + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `currency` | oui | [CurrencyEnum](#currencyenum) | La devise configurée pour le participant. | +| `limit` | oui | [ParticipantLimit](#participantlimit) | La limite configurée pour le participant. | + +
+ +### PUT /participants/{name}/limits + +Ajuste les limites pour un participant donné. + +#### Paramètres de chemin + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String(2..30)](#string) | Le nom du participant. | + +#### Exemple de requête + +``` +curl -X PUT -H "Content-Type: application/json" \ + -d '{ \ + "currency": "USD", \ + "limit": { \ + "type": NET_DEBIT_CAP", \ + "value": 10000, \ + "alarmPercentage": 20 + } \ + }' \ + http:///participants/payerfsp/limits +``` + +#### Modèle de données de la requête + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `currency` | oui | [CurrencyEnum](#currencyenum) | La devise configurée pour le participant. | +| `limit` | oui | [ParticipantLimit](#participantlimit) | La limite configurée pour le participant. | + +#### Exemple de réponse + +``` +HTTP/1.1 200 OK +Content-Type: application/json + +{ + "currency": "USD", + "limit": { + "type": "NET_DEBIT_CAP", + "value": 10000, + "alarmPercentage": 20 + } +} +``` + +#### Modèle de données de la réponse + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `currency` | oui | [CurrencyEnum](#currencyenum) | La devise configurée pour le participant. | +| `limit` | oui | [ParticipantLimit](#participantlimit) | La limite configurée pour le participant. | + +
+ +### GET /participants/{name}/positions + +Récupère la position d'un participant donné. + +#### Paramètres de chemin + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String(2..30)](#string) | Le nom du participant. | + +#### Paramètres de requête + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `currency` | non | [CurrencyEnum](#currencyenum) | La devise de la limite. | + +#### Exemple de requête + +``` +curl 'http:///participants/payerfsp/positions' +``` + +#### Exemple de réponse + +``` +HTTP/1.1 200 OK +Content-Type: application/json + +[ + { + "currency": "USD", + "value": 150, + "changedDate": "2021-05-10T08:01:38.000Z" + } +] +``` + +#### Modèle de données de la réponse + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `currency` | oui | [CurrencyEnum](#currencyenum) | La devise configurée pour le participant. | +| `value` | oui | [Number](#number) | Valeur de la position. | +| `changedDate` | oui | [DateTime](#datetime) | Date et heure du dernier changement de la position. | + +
+ +### GET /participants/{name}/accounts + +Récupère les comptes et soldes d’un participant donné. + +#### Paramètres de chemin + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String(2..30)](#string) | Le nom du participant. | + +#### Exemple de requête + +``` +curl 'http:///participants/payerfsp/accounts' +``` + +#### Exemple de réponse + +``` +HTTP/1.1 200 OK +Content-Type: application/json + +[ + { + "id": 3, + "ledgerAccountType": "POSITION", + "currency": "USD", + "isActive": 1, + "value": 150, + "reservedValue": 0, + "changedDate": "2021-05-10T08:01:38.000Z" + }, + { + "id": 4, + "ledgerAccountType": "SETTLEMENT", + "currency": "USD", + "isActive": 1, + "value": -165000, + "reservedValue": 0, + "changedDate": "2021-05-10T14:27:02.000Z" + }, + { + "id": 24, + "ledgerAccountType": "INTERCHANGE_FEE_SETTLEMENT", + "currency": "USD", + "isActive": 1, + "value": 0, + "reservedValue": 0, + "changedDate": "2021-03-30T12:23:06.000Z" + } +] +``` + +#### Modèle de données de la réponse + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `id` | oui | [Integer](#integer) | Identifiant du compte du grand livre. | +| `ledgerAccountType` | oui | [String](#string) | Type de compte du grand livre. | +| `currency` | oui | [CurrencyEnum](#currencyenum) | Devise du compte du grand livre. | +| `isActive` | oui | [Integer(1)](#integer) | Indique si le compte du grand livre est actif ou non. Les valeurs possibles sont `1` et `0`. | +| `value` | oui | [Number](#number) | Solde du compte. | +| `reservedValue` | oui | [Number](#number) | Valeur réservée dans le compte. | +| `changedDate` | oui | [DateTime](#datetime) | Date et heure du dernier changement du compte du grand livre. | + +
+ +### POST /participants/{name}/accounts + +Crée des comptes dans le Hub. + +#### Paramètres de chemin + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String(2..30)](#string) | Le nom du participant. | + +#### Exemple de requête + +``` +curl -X POST -H "Content-Type: application/json" \ + -d '{"currency": "USD", "type": "HUB_MULTILATERAL_SETTLEMENT"}' \ + http:///participants/payerfsp/accounts +``` + +#### Modèle de données de la requête + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `currency` | oui | [CurrencyEnum](#currencyenum) | La devise du compte du grand livre du participant. | +| `type` | oui | [String](#string) | Type de compte du grand livre. | + +#### Exemple de réponse + +``` +HTTP/1.1 200 OK +Content-Type: application/json + +{ + "name": "hub", + "id": "dev1-central-ledger.mojaloop.live/participants/hub", + "created": "2021-01-12T10:56:30.000Z", + "isActive": 0, + "links": { + "self": "dev1-central-ledger.mojaloop.live/participants/hub" + }, + "accounts": [ + { + "id": 1, + "ledgerAccountType": "HUB_MULTILATERAL_SETTLEMENT", + "currency": "USD", + "isActive": 0, + "createdDate": "2021-01-12T10:56:30.000Z", + "createdBy": "unknown" + } + ] +} +``` + +#### Modèle de données de la réponse + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String](#string) | Le nom du participant. | +| `id` | oui | [String](#string) | L'identifiant du participant sous la forme d'un nom de domaine pleinement qualifié, combiné avec le `fspId` du participant. | +| `created` | oui | [DateTime](#datetime) | Date et heure de création du participant. | +| `isActive` | oui | [Integer(1)](#integer) | Un indicateur pour préciser si le participant est actif ou non. Les valeurs possibles sont `1` et `0`. | +| `links` | oui | [Self](#self) | Liste de liens pour un service Web RESTful Hypermedia-Driven. | +| `accounts` | oui | [Accounts](#accounts) | Liste des comptes du grand livre configurés pour le participant. | + +
+ +### POST /participants/{name}/accounts/{id} + +Enregistre des mouvements de fonds entrants ou sortants d’un compte de participant. + +#### Paramètres de chemin + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String(2..30)](#string) | Le nom du participant. | +| `id` | oui | [Integer](#integer) | Identifiant du compte. | + +#### Exemple de requête + +```` +curl -X POST -H "Content-Type: application/json" \ + -d '{ \ + "transferId": "bfd38d14-893f-469d-a6ca-a312a0223949", \ + "externalReference": "660616", \ + "action": "recordFundsIn", \ + "reason": "settlement", \ + "amount": { \ + "amount": "5000", \ + "currency": "USD" \ + }, \ + "extensionList": { \ + "extension": [ \ + { \ + "key": "scheme", \ + "value": "abc" \ + } \ + ] \ + } \ + }' \ + http:///participants/payerfsp/accounts/2 +```` + +#### Modèle de données de la requête + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `transferId` | oui | [UUID](#uuid) | Identifiant du transfert. | +| `externalReference` | oui | [String](#string) | Référence à toute donnée externe, telle qu'un identifiant de la banque de règlement. | +| `action` | oui | [Enum](#enum) | L'action effectuée sur les fonds. Les valeurs possibles sont : `recordFundsIn` et `recordFundsOutPrepareReserve`. | +| `reason` | oui | [String](#string) | Raison de l'opération de funds in ou funds out. | +| `amount` | oui | [Money](#money) | Montant de l'opération (FundsIn ou FundsOut). | +| `extensionList` | non | [ExtensionList](#extensionlist) | Détails supplémentaires. | + +#### Exemple de réponse + +```` +HTTP/1.1 202 Accepted +```` + +
+ +### PUT /participants/{name}/accounts/{id} + +Met à jour un compte de participant. Actuellement, seule la modification du champ `isActive` est prise en charge. + +#### Paramètres de chemin + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String(2..30)](#string) | Le nom du participant. | +| `id` | oui | [Integer](#integer) | Identifiant du compte. | + +#### Exemple de requête + +``` +curl -X PUT -H "Content-Type: application/json" \ + -d '{"isActive": true}' \ + http:///participants/payerfsp/account/2 +``` + +#### Modèle de données de la requête + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `isActive` | oui | [Boolean](boolean) | Indique si le compte du participant est actif ou non. | + +#### Exemple de réponse + +``` +HTTP/1.1 200 OK +``` + +
+ +### PUT /participants/{name}/accounts/{id}/transfers/{transferId} + +Enregistre un transfert en tant qu’opération de fonds entrants ou sortants pour un compte de participant. + +#### Paramètres de chemin + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String(2..30)](#string) | Le nom du participant. | +| `id` | oui | [Integer](#integer) | Identifiant du compte. | +| `transferId` | oui | [UUID](#uuid) | Identifiant du transfert. | + +#### Exemple de requête + +``` +curl -X PUT -H "Content-Type: application/json" \ + -d '{"action": "recordFundsOutCommit", "reason": "fix"}' \ + http:///participants/payerfsp/account/2/transfers/bfd38d14-893f-469d-a6ca-a312a0223949 +``` + +#### Modèle de données de la requête + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `action` | oui | [Enum](#enum) | Action de funds out effectuée. Valeurs possibles : `recordFundsOutCommit` et `recordFundsOutAbort`. | +| `reason` | oui | [String](#string) | Raison de l'opération de FundsOut. | + +#### Exemple de réponse + +``` +HTTP/1.1 202 Accepted +``` + +
+ +### POST /participants/{name}/initialPositionAndLimits + +Ajoute des limites initiales et une position pour un participant particulier. + +#### Paramètres de chemin + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String(2..30)](#string) | Le nom du participant. | + +#### Exemple de requête + +```` +curl -X POST -H "Content-Type: application/json" \ + -d '{ \ + "currency": "USD", \ + "limit": { \ + "type": "NET_DEBIT_CAP", \ + "value": "10000" \ + }, \ + "initialPosition": 0 \ + }' \ + http:///participants/payerfsp/initialPositionAndLimits +```` + +#### Modèle de données de la requête + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `currency` | oui | [CurrencyEnum](#currencyenum) | Devise du participant. | +| `limit` | oui | [ParticipantLimit](#participantlimit) | Limite configurée pour le participant. | +| `initialPosition` | non | [Number](#number) | Position initiale. | + +#### Exemple de réponse + +``` +HTTP/1.1 201 Created +``` + +
+ +## Ressource API `/settlementModels` + +Les services fournis par la ressource `/settlementModels` sont utilisés par l’opérateur du Hub pour créer, mettre à jour et consulter des modèles de règlement. + +### GET /settlementModels + +Récupère les informations de tous les modèles de règlement. + +#### Exemple de requête + +``` +curl 'http:///settlementModels' +``` + +#### Exemple de réponse + +``` +HTTP/1.1 200 OK +Content-Type: application/json + +[ + { + "settlementModelId": 1, + "name": "DEFERREDNETUSD", + "isActive": true, + "settlementGranularity": "NET", + "settlementInterchange": "MULTILATERAL", + "settlementDelay": "DEFERRED", + "currency": "USD", + "requireLiquidityCheck": true, + "ledgerAccountTypeId": "POSITION", + "autoPositionReset": true + }, + { + "settlementModelId": 4, + "name": "DEFERREDNETEUR", + "isActive": true, + "settlementGranularity": "NET", + "settlementInterchange": "MULTILATERAL", + "settlementDelay": "DEFERRED", + "currency": "EUR", + "requireLiquidityCheck": true, + "ledgerAccountTypeId": "SETTLEMENT", + "autoPositionReset": true + } +] +``` + +#### Modèle de données de la réponse + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `settlementModelId` | oui | [Integer](#integer) | Identifiant du modèle de règlement. | +| `name` | oui | [String](#string) | Nom du modèle de règlement. | +| `isActive` | oui | [Boolean](boolean) | Indique si le modèle de règlement est actif ou non. | +| `settlementGranularity` | oui | [String](#string) | Spécifie si les transferts sont réglés un par un ou en lot. Valeurs possibles :
`GROSS` : Règlement exécuté après chaque transfert complété, c'est-à-dire, il y a une opération de règlement pour chaque transaction.
`NET` : Un groupe de transferts est réglé ensemble dans une seule opération de règlement, chaque participant réglant la somme nette de tous les transferts sur une période donnée. | +| `settlementInterchange` | oui | [String](#string) | Spécifie le type d’arrangement de règlement entre parties. Valeurs possibles :
`BILATERAL` : Chaque participant règle ses obligations avec les autres séparément, et le schéma n’est pas partie au règlement.
`MULTILATERAL` : Chaque participant règle avec le schéma le solde net de ses obligations, au lieu de régler séparément avec chaque partie. | +| `settlementDelay` | oui | [String](#string) | Spécifie si le règlement a lieu immédiatement après qu’un transfert est terminé ou avec un délai. Valeurs possibles :
`IMMEDIATE` : Le règlement a lieu immédiatement après la fin d’un transfert.
`DEFERRED` : Le règlement est géré par l’opérateur du Hub à la demande ou selon un calendrier. | +| `currency` | oui | [CurrencyEnum](#currencyenum) | Devise configurée pour le modèle de règlement. | +| `requireLiquidityCheck` | oui | [Boolean](boolean) | Indique si le modèle de règlement nécessite une vérification de liquidité ou non. | +| `ledgerAccountTypeId` | oui | [String](#string) | Type de compte de grand livre. Valeurs possibles :
`INTERCHANGE_FEE` : Suit les frais d’interchange appliqués aux transferts.
`POSITION` : Suit les montants dus ou à recevoir pour un DFSP.
`SETTLEMENT` : Compte bancaire de règlement du DFSP reflété dans le Hub. Sert de compte de rapprochement et reflète le mouvement des fonds réels. | +| `autoPositionReset` | oui | [Boolean](boolean) | Indique si le modèle de règlement nécessite la remise à zéro automatique de la position ou non. | + +
+ +### POST /settlementModels + +Crée un modèle de règlement. + +#### Exemple de requête + +``` +curl -X POST -H "Content-Type: application/json" \ + -d '{ \ + "name": "DEFERREDNET", \ + "settlementGranularity": "NET", \ + "settlementInterchange": "MULTILATERAL", \ + "settlementDelay": "DEFERRED", \ + "requireLiquidityCheck": true, \ + "ledgerAccountType": "POSITION", \ + "autoPositionReset": true \ + }' \ + http:///settlementModels +``` + +#### Modèle de données de la requête + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String](#string) | Nom du modèle de règlement. | +| `settlementGranularity` | oui | [String](#string) | Spécifie si les transferts sont réglés un par un ou en lot. Valeurs possibles :
`GROSS` : Règlement exécuté après chaque transfert complété, c'est-à-dire, il y a une opération de règlement pour chaque transaction.
`NET` : Un groupe de transferts est réglé ensemble dans une seule opération de règlement, chaque participant réglant la somme nette de tous les transferts sur une période donnée. | +| `settlementInterchange` | oui | [String](#string) | Spécifie le type d’arrangement de règlement entre parties. Valeurs possibles :
`BILATERAL` : Chaque participant règle ses obligations avec les autres séparément, et le schéma n’est pas partie au règlement.
`MULTILATERAL` : Chaque participant règle avec le schéma le solde net de ses obligations, au lieu de régler séparément avec chaque partie. | +| `settlementDelay` | oui | [String](#string) | Spécifie si le règlement a lieu immédiatement après qu’un transfert est terminé ou avec un délai. Valeurs possibles :
`IMMEDIATE` : Le règlement a lieu immédiatement après la fin d’un transfert.
`DEFERRED` : Le règlement est géré par l’opérateur du Hub à la demande ou selon un calendrier. | +| `currency` | oui | [CurrencyEnum](#currencyenum) | Devise configurée pour le modèle de règlement. | +| `requireLiquidityCheck` | oui | [Boolean](boolean) | Indique si le modèle de règlement nécessite une vérification de liquidité ou non. | +| `ledgerAccountTypeId` | oui | [String](#string) | Type de compte de grand livre. Valeurs possibles :
`INTERCHANGE_FEE` : Suit les frais d’interchange appliqués aux transferts.
`POSITION` : Suit les montants dus ou à recevoir pour un DFSP.
`SETTLEMENT` : Compte bancaire de règlement du DFSP reflété dans le Hub. Sert de compte de rapprochement et reflète le mouvement des fonds réels. | +| `settlementAccountType` | oui | [String](#string) | Un type spécial de compte de grand livre dans lequel les règlements doivent être versés. Valeurs possibles :
`SETTLEMENT` : Un compte de règlement pour la valeur principale des transferts (c’est-à-dire, le montant que le payeur souhaite verser au bénéficiaire).
`INTERCHANGE_FEE_SETTLEMENT` : Un compte de règlement pour les frais liés aux transferts. | +| `autoPositionReset` | oui | [Boolean](boolean) | Indique si le modèle de règlement nécessite la remise à zéro automatique de la position ou non. | + +#### Exemple de réponse + +``` +HTTP/1.1 201 Created +``` + +
+ +### GET /settlementModels/{name} + +Récupère des informations sur un modèle de règlement particulier. + +#### Paramètres de chemin + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String](#string) | Le nom du modèle de règlement. | + +#### Exemple de requête + +``` +curl 'http:///settlementModels/DEFERREDNET' +``` + +#### Exemple de réponse + +``` +HTTP/1.1 200 OK +Content-Type: application/json + +{ + "settlementModelId": 1, + "name": "DEFERREDNET", + "isActive": true, + "settlementGranularity": "NET", + "settlementInterchange": "MULTILATERAL", + "settlementDelay": "DEFERRED", + "currency": "USD", + "requireLiquidityCheck": true, + "ledgerAccountTypeId": "POSITION", + "autoPositionReset": true +} +``` + +#### Modèle de données de la réponse + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `settlementModelId` | oui | [Integer](#integer) | Identifiant du modèle de règlement. | +| `name` | oui | [String](#string) | Nom du modèle de règlement. | +| `isActive` | oui | [Boolean](boolean) | Indique si le modèle de règlement est actif ou non. | +| `settlementGranularity` | oui | [String](#string) | Spécifie si les transferts sont réglés un par un ou en lot. Valeurs possibles :
`GROSS` : Le règlement est exécuté après chaque transfert complété, c'est-à-dire qu'il y a une opération de règlement pour chaque transaction.
`NET` : Un groupe de transferts est réglé ensemble dans une seule opération de règlement, chaque participant réglant la somme nette de tous les transferts sur une période donnée.| +| `settlementInterchange` | oui | [String](#string) | Spécifie le type d’arrangement de règlement entre parties. Valeurs possibles :
`BILATERAL` : Chaque participant règle séparément ses obligations avec les autres, et le schéma n'est pas partie au règlement.
`MULTILATERAL` : Chaque participant règle avec le schéma le solde net de ses obligations, au lieu de régler séparément avec chaque partie.| +| `settlementDelay` | oui | [String](#string) | Spécifie si le règlement a lieu immédiatement après la fin d’un transfert ou avec un délai. Valeurs possibles :
`IMMEDIATE` : Le règlement a lieu immédiatement après la fin d’un transfert.
`DEFERRED` : Le règlement est géré par l’opérateur du Hub à la demande ou selon un calendrier.| +| `currency` | oui | [CurrencyEnum](#currencyenum) | Devise configurée pour le modèle de règlement. | +| `requireLiquidityCheck` | oui | [Boolean](boolean) | Indique si le modèle de règlement nécessite une vérification de liquidité. | +| `ledgerAccountTypeId` | oui | [String](#string) | Type de compte de grand livre. Valeurs possibles :
`INTERCHANGE_FEE` : Suit les frais d’interchange appliqués aux transferts.
`POSITION` : Suit combien un DFSP doit ou est dû.
`SETTLEMENT` : Le compte bancaire de règlement du DFSP reflété dans le Hub. Sert de compte de rapprochement et reflète le mouvement des fonds réels. | +| `autoPositionReset` | oui | [Boolean](boolean) | Indique si le modèle de règlement nécessite la remise à zéro automatique de la position. | + +
+ +### PUT /settlementModels/{name} + +Met à jour un modèle de règlement (active/désactive un modèle de règlement). + +#### Paramètres de chemin + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String](#string) | Le nom du modèle de règlement. | + +#### Exemple de requête + +``` +curl -X PUT -H "Content-Type: application/json" \ + -d '{"isActive": true}' \ + http:///settlementModels/DEFERREDNET +``` + +#### Modèle de données de la requête + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `isActive` | oui | [Boolean](#boolean) | Indique si le modèle de règlement est actif ou non. | + +#### Exemple de réponse + +``` +HTTP/1.1 200 OK +Content-Type: application/json + +{ + "settlementModelId": 1, + "name": "DEFERREDNET", + "isActive": true, + "settlementGranularity": "NET", + "settlementInterchange": "MULTILATERAL", + "settlementDelay": "DEFERRED", + "currency": "USD", + "requireLiquidityCheck": true, + "ledgerAccountTypeId": "POSITION", + "autoPositionReset": true +} +``` + +#### Modèle de données de la réponse + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `settlementModelId` | oui | [Integer](#integer) | Identifiant du modèle de règlement. | +| `name` | oui | [String](#string) | Nom du modèle de règlement. | +| `isActive` | oui | [Boolean](boolean) | Indique si le modèle de règlement est actif ou non. | +| `settlementGranularity` | oui | [String](#string) | Spécifie si les transferts sont réglés un par un ou en lot. Valeurs possibles :
`GROSS` : Le règlement est exécuté après chaque transfert complété, c'est-à-dire qu'il y a une opération de règlement pour chaque transaction.
`NET` : Un groupe de transferts est réglé ensemble dans une seule opération de règlement, chaque participant réglant la somme nette de tous les transferts sur une période donnée.| +| `settlementInterchange` | oui | [String](#string) | Spécifie le type d’arrangement de règlement entre parties. Valeurs possibles :
`BILATERAL` : Chaque participant règle séparément ses obligations avec les autres, et le schéma n'est pas partie au règlement.
`MULTILATERAL` : Chaque participant règle avec le schéma le solde net de ses obligations, au lieu de régler séparément avec chaque partie.| +| `settlementDelay` | oui | [String](#string) | Spécifie si le règlement a lieu immédiatement après la fin d’un transfert ou avec un délai. Valeurs possibles :
`IMMEDIATE` : Le règlement a lieu immédiatement après la fin d’un transfert.
`DEFERRED` : Le règlement est géré par l’opérateur du Hub à la demande ou selon un calendrier.| +| `currency` | oui | [CurrencyEnum](#currencyenum) | Devise configurée pour le modèle de règlement. | +| `requireLiquidityCheck` | oui | [Boolean](#boolean) | Indique si le modèle de règlement nécessite une vérification de liquidité. | +| `ledgerAccountTypeId` | oui | [String](#string) | Type de compte de grand livre. Valeurs possibles :
`INTERCHANGE_FEE` : Suit les frais d’interchange appliqués aux transferts.
`POSITION` : Suit combien un DFSP doit ou est dû.
`SETTLEMENT` : Le compte bancaire de règlement du DFSP reflété dans le Hub. Sert de compte de rapprochement et reflète le mouvement des fonds réels. | +| `autoPositionReset` | oui | [Boolean](#boolean) | Indique si le modèle de règlement nécessite la remise à zéro automatique de la position. | + +
+ +## Ressource API `/transactions` + +Les services proposés par la ressource `/transactions` sont utilisés par l'Opérateur du Hub pour récupérer les détails des transferts. + +### GET /transactions/{id} + +Récupère des informations sur une transaction particulière. + +#### Paramètres de chemin + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `id` | oui | [UUID](#uuid) | Identifiant du transfert. | + +#### Exemple de requête + +``` +curl 'http:///transactions/85feac2f-39b2-491b-817e-4a03203d4f14' +``` + +#### Exemple de réponse + +``` +HTTP/1.1 200 OK +Content-Type: application/json + +{ + "quoteId": "7c23e80c-d078-4077-8263-2c047876fcf6", + "transactionId": "85feac2f-39b2-491b-817e-4a03203d4f14", + "transactionRequestId": "a8323bc6-c228-4df2-ae82-e5a997baf898", + "payee": { + "partyIdInfo": { + "partyIdType": "MSISDN", + "partyIdentifier": "123456789", + "fspId": "MobileMoneyAbc" + }, + "name": "John Doe", + "personalInfo": { + "complexName": { + "firstName": "John", + "middleName": "William", + "lastName": "Doe" + }, + "dateOfBirth": "1966-06-16" + } + }, + "payer": { + "partyIdInfo": { + "partyIdType": "MSISDN", + "partyIdentifier": "987654321", + "fspId": "MobileMoneyXyz" + }, + "name": "Jane Doe", + "personalInfo": { + "complexName": { + "firstName": "Mary", + "middleName": "Jane", + "lastName": "Doe" + }, + "dateOfBirth": "1975-05-15" + } + }, + "amount": { + "currency": "USD", + "amount": "50" + }, + "transactionType": { + "scenario": "DEPOSIT", + "initiator": "PAYER", + "initiatorType": "CONSUMER" + } +} +``` + +#### Modèle de données de la réponse + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `quoteId` | | [UUID](#uuid) | Identifiant du devis (quote). | +| `transactionId` | | [UUID](#uuid) | Identifiant de la transaction. | +| `transactionRequestId` | | [String](#string) | Identifie une éventuelle demande de transaction envoyée précédemment. | +| `payee` | | [Party](#party) | Détails du bénéficiaire. | +| `payer` | | [Party](#party) | Détails du payeur. | +| `amount` | | [Money](#money) | Montant de la transaction. | +| `transactionType` | | [TransactionType](#transactiontype) | Détails sur le type de transaction. | +| `note` | | [String](#string) | Un mémo qui sera attaché à la transaction. | +| `extensionList` | | [ExtensionList](#extensionlist) | Détails additionnels. | + +
+ +## Modèles de données utilisés par l'API + +### Format + +Pour les détails sur les formats utilisés pour les types de données élémentaires de l’API, voir la section [Element Data Type Formats](../fspiop/logical-data-model#element-data-type-formats) dans la définition de l’API Mojaloop FSPIOP. + +### Formats de type de données élémentaires + +Cette section définit les types de données élémentaires utilisés par l'API. + +#### Amount + +Pour plus de détails, voir la section [Amount](../fspiop/logical-data-model#amount) dans la définition de l’API Mojaloop FSPIOP. + +#### Boolean + +Une valeur `"true"` ou `"false"`. + +#### DateTime + +Pour plus de détails, voir la section [DateTime](../fspiop/logical-data-model#datetime) dans la définition de l’API Mojaloop FSPIOP. + +#### Enum + +Pour plus de détails, voir la section [Enum](../fspiop/logical-data-model#enum) dans la définition de l’API Mojaloop FSPIOP. + +#### Integer + +Pour plus de détails, voir la section [Integer](../fspiop/logical-data-model#integer) dans la définition de l’API Mojaloop FSPIOP. + +#### Number + +Le type de données API `Number` est un nombre décimal en base 10 de précision arbitraire. + +#### String + +Pour plus de détails, voir la section [String](../fspiop/logical-data-model#string) dans la définition de l’API Mojaloop FSPIOP. + +#### UUID + +Pour plus de détails, voir la section [UUID](../fspiop/logical-data-model#uuid) dans la définition de l’API Mojaloop FSPIOP. + +
+ +## Définitions des éléments + +Cette section définit les types d’éléments utilisés par l’API. + +#### IsActive + +Modèle de données pour l’élément **IsActive**. + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `isActive` | oui | [Integer(1)](#integer) | Indique si un compte de grand livre/participant est actif ou non. Valeurs possibles : `1` (actif) et `0` (inactif). | + +#### IsActiveBoolean + +Modèle de données pour l’élément **IsActiveBoolean**. + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `isActive` | oui | [Boolean](#boolean) | Indique si un compte / participant / modèle de règlement est actif ou non. | + +#### CurrencyEnum + +Pour plus de détails, voir la section [Currency](../fspiop/logical-data-model#currencycode-enum) enum dans la définition de l’API Mojaloop FSPIOP. + +#### RequireLiquidityCheck + +Modèle de données pour l'élément **RequireLiquidityCheck**. + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `requireLiquidityCheck` | oui | [Boolean](#boolean) | Indique si un modèle de règlement nécessite une vérification de liquidité. | + +#### Self + +Modèle de données pour l’élément **Self**. + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `self` | oui | [String](#string) | Nom de domaine pleinement qualifié combiné avec le `fspId` du participant. | + +#### SettlementDelay + +Modèle de données pour l’élément **SettlementDelay**. + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `settlementDelay` | oui | [Enum](#enum) de String | Spécifie si le règlement a lieu immédiatement après la fin d’un transfert ou avec un délai. Valeurs autorisées :
`IMMEDIATE` : Le règlement a lieu immédiatement après la fin d’un transfert.
`DEFERRED` : Le règlement est géré par l’opérateur du Hub à la demande ou selon un calendrier. | + +#### SettlementGranularity + +Modèle de données pour l’élément **SettlementGranularity**. + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `settlementGranularity` | oui | [Enum](#enum) de String | Spécifie si les transferts sont réglés un par un ou en lot. Valeurs autorisées :
`GROSS` : Le règlement est exécuté après chaque transfert complété, c'est-à-dire, il y a une opération de règlement pour chaque transaction.
`NET` : Un groupe de transferts est réglé ensemble dans une seule opération, chaque participant réglant la somme nette de tous les transferts sur une période donnée. | + +#### SettlementInterchange + +Modèle de données pour l’élément **SettlementInterchange**. + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `settlementInterchange` | oui | [Enum](#enum) de String | Spécifie le type d’arrangement de règlement entre parties. Valeurs autorisées :
`BILATERAL` : Chaque participant règle séparément ses obligations avec les autres, et le schéma n'est pas partie au règlement.
`MULTILATERAL` : Chaque participant règle avec le schéma le solde net de ses obligations, au lieu de régler séparément avec chaque partie. | + +
+ +## Types complexes + +#### Accounts + +La liste des comptes de grand livre configurés pour le participant. Pour plus de détails sur l'objet compte, voir [IndividualAccount](#individualaccount). + +#### ErrorInformation + +Pour plus de détails, voir la section [ErrorInformation](../fspiop/logical-data-model#errorinformation) dans la définition de l’API Mojaloop FSPIOP. + +#### ErrorInformationResponse + +Modèle de données pour le type complexe contenant un élément optionnel [ErrorInformation](#errorinformation) utilisé avec les réponses 4xx et 5xx. + +#### Extension + +Pour plus de détails, voir la section [Extension](../fspiop/logical-data-model#extension) dans la définition de l’API Mojaloop FSPIOP. + +#### ExtensionList + +Pour plus de détails, voir la section [ExtensionList](../fspiop/logical-data-model#extensionlist) dans la définition de l’API Mojaloop FSPIOP. + +#### IndividualAccount + +Modèle de données pour le type complexe **IndividualAccount**. + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `id` | oui | [Integer](#integer) | Identifiant du compte de grand livre. | +| `ledgerAccountType` | oui | [String](#string) | Type du compte de grand livre (par exemple, POSITION). | +| `currency` | oui | [CurrencyEnum](#currencyenum) | La devise du compte. | +| `isActive` | oui | [Integer(1)](#integer) | Indique si le compte de grand livre est actif ou non. Valeurs possibles : `1` et `0`. | +| `createdDate` | oui | [DateTime](#datetime) | Date et heure de création du compte. | +| `createdBy` | oui | [String](#string) | L'entité qui a créé le compte. | + +#### Limit + +Modèle de données pour le type complexe **Limit**. + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `type` | oui | [String](#string) | Type de limite. | +| `value` | oui | un [Number](#number) positif | Valeur de la limite. | + +#### Money + +Pour plus de détails, voir la section [Money](../fspiop/logical-data-model#mondey) dans la définition de l’API Mojaloop FSPIOP. + +#### Participant + +Modèle de données pour le type complexe **Participant**. + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `name` | oui | [String](#string) | Nom du participant. | +| `id` | oui | [String](#string) | Identifiant du participant sous la forme d’un nom de domaine pleinement qualifié combiné avec le `fspId` du participant. | +| `created` | oui | [DateTime](#datetime) | Date et heure de création du participant. | +| `isActive` | oui | [Integer(1)](#integer) | Indique si le participant est actif ou non. Valeurs possibles : `1` et `0`. | +| `links` | oui | [Self](#self) | Liste de liens pour un service RESTful Hypermedia-Driven. | +| `accounts` | oui | [Accounts](#accounts) | Liste des comptes de grand livre configurés pour le participant. | + +#### ParticipantFunds + +Modèle de données pour le type complexe **ParticipantFunds**. + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `transferId` | oui | [UUID](#uuid) | Identifiant du transfert. | +| `externalReference` | oui | [String](#string) | Référence à toute donnée externe, telle qu’un identifiant provenant de la banque de règlement. | +| `action` | oui | [Enum](#enum) | Action effectuée sur les fonds. Valeurs possibles : `recordFundsIn` et `recordFundsOutPrepareReserve`. | +| `reason` | oui | [String](#string) | Raison de l’action FundsIn ou FundsOut. | +| `amount` | oui | [Money](#money) | Montant FundsIn ou FundsOut. | +| `extensionList` | non | [ExtensionList](#extensionlist) | Détails additionnels. | + +#### ParticipantLimit + +Modèle de données pour le type complexe **ParticipantLimit**. + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `type` | oui | [String](#string) | Type de limite de participant (par exemple, `NET_DEBIT_CAP`). | +| `value` | oui | [Number](#number) | Valeur de la limite définie pour le participant. | +| `alarmPercentage` | oui | [Number](#number) | Une notification d'alarme est déclenchée lorsqu’un pourcentage prédéfini de la limite est atteint. La spécification d’`alarmPercentage` est optionnelle. Si elle n’est pas spécifiée, la valeur par défaut est 10 %, exprimé par `10`. | + +#### ParticipantsNameEndpointsObject + +Modèle de données pour le type complexe **ParticipantsNameEndpointsObject**. + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `type` | oui | [String](#string) | Type de point de terminaison. | +| `value` | oui | [String](#string) | Valeur du point de terminaison. | + +#### ParticipantsNameLimitsObject + +Modèle de données pour le type complexe **ParticipantsNameLimitsObject**. + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `currency` | oui | [CurrencyEnum](#currencyenum) | Devise configurée pour le participant. | +| `limit` | oui | [ParticipantLimit](#participantlimit) | Limite configurée pour le participant. | + +#### Party + +Pour plus de détails, voir la section [Party](../fspiop/logical-data-model#party) dans la définition de l’API Mojaloop FSPIOP. + +#### PartyComplexName + +Pour plus de détails, voir la section [PartyComplexName](../fspiop/logical-data-model#partycomplexname) dans la définition de l’API Mojaloop FSPIOP. + +#### PartyIdInfo + +Pour plus de détails, voir la section [PartyIdInfo](../fspiop/logical-data-model#partyidinfo) dans la définition de l’API Mojaloop FSPIOP. + +#### PartyPersonalInfo + +Pour plus de détails, voir la section [PartyPersonalInfo](../fspiop/logical-data-model#partypersonalinfo) dans la définition de l’API Mojaloop FSPIOP. + +#### RecordFundsOut + +Modèle de données pour le type complexe **RecordFundsOut**. + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `action` | oui | [Enum](#enum) | Action FundsOut effectuée. Valeurs possibles : `recordFundsOutCommit` et `recordFundsOutAbort`. | +| `reason` | oui | [String](#string) | Raison de l’action FundsOut. | + +#### Refund + +Modèle de données pour le type complexe **Refund**. + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `originalTransactionId` | oui | [UUID](#uuid) | Référence à l’ID de transaction d’origine à rembourser. | +| `refundReason` | non | [String(1-128)](#string) | Texte libre indiquant le motif du remboursement. | + +#### SettlementModelsObject + +Modèle de données pour le type complexe **SettlementModelsObject**. + +| Nom | Obligatoire | Type | Description | +|---|---|--|--| +| `settlementModelId` | oui | [Integer](#integer) | Identifiant du modèle de règlement. | +| `name` | oui | [String](#string) | Nom du modèle de règlement. | +| `isActive` | oui | [Boolean](#boolean) | Indique si le modèle de règlement est actif ou non. | +| `settlementGranularity` | oui | [String](#string) | Spécifie si les transferts sont réglés un par un ou en lot. Valeurs possibles :
`GROSS` : Le règlement est exécuté après chaque transfert complété, c'est-à-dire qu'il y a une opération de règlement pour chaque transaction.
`NET` : Un groupe de transferts est réglé ensemble dans une seule opération, chaque participant réglant la somme nette de tous les transferts sur une période donnée.| +| `settlementInterchange` | oui | [String](#string) | Spécifie le type d’arrangement de règlement entre parties. Valeurs possibles :
`BILATERAL` : Chaque participant règle séparément ses obligations avec les autres, et le schéma n'est pas partie au règlement.
`MULTILATERAL` : Chaque participant règle avec le schéma le solde net de ses obligations, au lieu de régler séparément avec chaque partie.| +| `settlementDelay` | oui | [String](#string) | Spécifie si le règlement a lieu immédiatement après la fin d’un transfert ou avec un délai. Valeurs possibles :
`IMMEDIATE` : Le règlement a lieu immédiatement après la fin d’un transfert.
`DEFERRED` : Le règlement est géré par l’opérateur du Hub à la demande ou selon un calendrier.| +| `currency` | oui | [CurrencyEnum](#currencyenum) | Devise configurée pour le modèle de règlement. | +| `requireLiquidityCheck` | oui | [Boolean](#boolean) | Indique si le modèle de règlement nécessite une vérification de liquidité. | +| `ledgerAccountTypeId` | oui | [String](#string) | Type de compte de grand livre. Valeurs possibles :
`INTERCHANGE_FEE` : Suit les frais d’interchange appliqués aux transferts.
`POSITION` : Suit combien un DFSP doit ou est dû.
`SETTLEMENT` : Le compte bancaire de règlement du DFSP reflété dans le Hub. Sert de compte de rapprochement et reflète le mouvement des fonds réels.| +| `autoPositionReset` | oui | [Boolean](#boolean) | Indique si le modèle de règlement nécessite la remise à zéro automatique de la position. | + +#### TransactionType + +Pour plus de détails, voir la section [TransactionType](../fspiop/logical-data-model#transactiontype) dans la définition de l’API Mojaloop FSPIOP. diff --git a/docs/fr/technical/api/assets/diagrams/images/figure1-platforms-layout.svg b/docs/fr/technical/api/assets/diagrams/images/figure1-platforms-layout.svg new file mode 100644 index 000000000..8a12de358 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure1-platforms-layout.svg @@ -0,0 +1,3 @@ + + +
CA
CA
ALS
ALS
FSP-1
FSP-1
FSP-2
FSP-2
Switch
Switch
FSP-3
FSP-3
FSP-4
FSP-4
Issuer: CN=CA
O=CA
Subject: CN=CA
O=CA
Issuer: CN=CA...
Issuer: CN=CA
O=CA
Subject: CN=CA
O=CA
Issuer: CN=CA...
Issuer: CN=CA
O=CA
Subject: CN=CA
O=CA
Issuer: CN=CA...
Issuer: CN=CA
O=CA
Subject: CN=CA
O=CA
Issuer: CN=CA...
Issuer: CN=CA
O=CA
Subject: CN=CA
O=CA
Issuer: CN=CA...
Issuer: CN=CA
O=CA
Subject: CN=CA
O=CA
Issuer: CN=CA...
Issuer: CN=CA
O=CA
Subject: CN=CA
O=CA
Issuer: CN=CA...
Legend:
Solid lines indicate TLS-secured communication.
Dashed lines indicate certificate owner.
Legend:...
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure11.svg b/docs/fr/technical/api/assets/diagrams/images/figure11.svg new file mode 100644 index 000000000..773d8495b --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure11.svg @@ -0,0 +1,4 @@ + + + +
 1 USD 
 1 USD 
Agent Commission account
Agent Comm...
 2 USD 
 2 USD 
Fee account
Fee account
 98 USD 
 98 USD 
Payer's account
Payer's ac...
 99 USD 
 99 USD 
Payer FSP's Switch account
Payer FSP'...
 99 USD 
 99 USD 
Payer FSP Switch account
Payer FSP...
 99 USD 
 99 USD 
Payee FSP Switch account
Payee FSP...
 98 USD 
 98 USD 
1 USD
1 USD
Payee FSP's Switch account
Payee FSP'...
FSP Commision account
FSP Commis...
Fee account
Fee account
Agent Commision account
Agent Comm...
Payee's account
Payee's ac...
FSO Commission account
FSO Commis...
Payer FSP
Payer FSP
Payee FSP
Payee FSP
Switch
Switch
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure12.svg b/docs/fr/technical/api/assets/diagrams/images/figure12.svg new file mode 100644 index 000000000..c5183f904 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure12.svg @@ -0,0 +1,3 @@ + + +
Payer FSP fee
[Not supported by viewer]
Payer
Payer
 Payee FSP transaction fee 
[Not supported by viewer]
Payee FSP commission
to subsidize transaction 
[Not supported by viewer]
Internal Payee fee to Payee FSP
<font color="#ff3333">Internal Payee fee to Payee FSP</font>
Internal Payee FSP
bonus/commission
to Payee
[Not supported by viewer]
Payee
Payee
InternalPayer FSP
bonus/ commission
to Payer
[Not supported by viewer]
Switch
Switch
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure14.svg b/docs/fr/technical/api/assets/diagrams/images/figure14.svg new file mode 100644 index 000000000..070228ec6 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure14.svg @@ -0,0 +1,3 @@ + + +
 1 USD 
[Not supported by viewer]
Agent Commission account
Agent Commission account
Fee account
Fee account
 100 USD 
 100 USD 
Payer's account
Payer's account
 99 USD 
 99 USD 
Payer FSP's Switch account
[Not supported by viewer]
 99 USD 
 99 USD 
Payer FSP Switch account
[Not supported by viewer]
 99 USD 
 99 USD 
Payee FSP Switch account
[Not supported by viewer]
 100 USD 
 100 USD 
1 USD
1 USD
Payee FSP's Switch account
[Not supported by viewer]
FSP Commission account
FSP Commission account
Fee account
Fee account
Agent Commission account
Agent Commission account
Payee's account
Payee's account
FSP 
Commission account
[Not supported by viewer]
Payer FSP
[Not supported by viewer]
Payee FSP
[Not supported by viewer]
Switch
[Not supported by viewer]
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure16.svg b/docs/fr/technical/api/assets/diagrams/images/figure16.svg new file mode 100644 index 000000000..8f8828555 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure16.svg @@ -0,0 +1,3 @@ + + +
 2 USD 
[Not supported by viewer]
Agent Commission account
Agent Commission account
Fee account
Fee account
 98 USD 
 98 USD 
Payer's account
Payer's account
 99 USD 
 99 USD 
Payer FSP's Switch account
[Not supported by viewer]
 99 USD 
 99 USD 
Payer FSP Switch account
[Not supported by viewer]
 99 USD 
 99 USD 
Payee FSP Switch account
[Not supported by viewer]
 98 USD 
 98 USD 
1 USD
1 USD
Payee FSP's Switch account
[Not supported by viewer]
FSP Commission account
FSP Commission account
Fee account
Fee account
Agent Commission account
Agent Commission account
Payee's account
Payee's account
FSP 
Commission account
[Not supported by viewer]
Payer FSP
[Not supported by viewer]
Payee FSP
[Not supported by viewer]
Switch
[Not supported by viewer]
 1 USD 
[Not supported by viewer]
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure18.svg b/docs/fr/technical/api/assets/diagrams/images/figure18.svg new file mode 100644 index 000000000..a50ef985a --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure18.svg @@ -0,0 +1,3 @@ + + +
 1 USD 
[Not supported by viewer]
Agent Commission account
Agent Commission account
Fee account
Fee account
 99 USD 
 99 USD 
Payer's account
Payer's account
 97 USD 
 97 USD 
Payer FSP's Switch account
[Not supported by viewer]
 97 USD 
 97 USD 
Payer FSP Switch account
[Not supported by viewer]
 97 USD 
 97 USD 
Payee FSP Switch account
[Not supported by viewer]
 100 USD 
 100 USD 
 3 USD 
 3 USD 
Payee FSP's Switch account
[Not supported by viewer]
FSP Commission account
FSP Commission account
Fee account
Fee account
Agent Commission account
Agent Commission account
Payee's account
Payee's account
FSP 
Commission account
[Not supported by viewer]
Payer FSP
[Not supported by viewer]
Payee FSP
[Not supported by viewer]
Switch
[Not supported by viewer]
 2 USD 
[Not supported by viewer]
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure20.svg b/docs/fr/technical/api/assets/diagrams/images/figure20.svg new file mode 100644 index 000000000..12a57a2a1 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure20.svg @@ -0,0 +1,3 @@ + + +
 1 USD 
[Not supported by viewer]
Agent Commission account
Agent Commission account
Fee account
Fee account
 100 USD 
 100 USD 
Payer's account
Payer's account
 99 USD 
 99 USD 
Payer FSP's Switch account
[Not supported by viewer]
 99 USD 
 99 USD 
Payer FSP Switch account
[Not supported by viewer]
 99 USD 
 99 USD 
Payee FSP Switch account
[Not supported by viewer]
 100 USD 
 100 USD 
 1 USD 
 1 USD 
Payee FSP's Switch account
[Not supported by viewer]
FSP Commission account
FSP Commission account
Fee account
Fee account
Agent Commission account
Agent Commission account
Payee's account
Payee's account
FSP 
Commission account
[Not supported by viewer]
Payer FSP
[Not supported by viewer]
Payee FSP
[Not supported by viewer]
Switch
[Not supported by viewer]
 1 USD 
[Not supported by viewer]
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure22.svg b/docs/fr/technical/api/assets/diagrams/images/figure22.svg new file mode 100644 index 000000000..60b81e1c7 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure22.svg @@ -0,0 +1,3 @@ + + +
 1 USD 
[Not supported by viewer]
Agent Commission account
Agent Commission account
Fee account
Fee account
 100 USD 
 100 USD 
Payer's account
Payer's account
 98 USD 
 98 USD 
Payer FSP's Switch account
[Not supported by viewer]
 98 USD 
 98 USD 
Payer FSP Switch account
[Not supported by viewer]
 98 USD 
 98 USD 
Payee FSP Switch account
[Not supported by viewer]
 100 USD 
 100 USD 
 2 USD 
 2 USD 
Payee FSP's Switch account
[Not supported by viewer]
FSP Commission account
FSP Commission account
Fee account
Fee account
Agent Commission account
Agent Commission account
Payee's account
Payee's account
FSP 
Commission account
[Not supported by viewer]
Payer FSP
[Not supported by viewer]
Payee FSP
[Not supported by viewer]
Switch
[Not supported by viewer]
 2 USD 
[Not supported by viewer]
Agent
Agent
Customer
Customer
$
[Not supported by viewer]
100 USD in cash from Payee (Customer) to Payer (Agent)
[Not supported by viewer]
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure24.svg b/docs/fr/technical/api/assets/diagrams/images/figure24.svg new file mode 100644 index 000000000..411df60cc --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure24.svg @@ -0,0 +1,3 @@ + + +
 1 USD 
[Not supported by viewer]
Agent Commission account
Agent Commission account
Fee account
Fee account
 100 USD 
 100 USD 
Payer's account
Payer's account
 99 USD 
 99 USD 
Payer FSP's Switch account
[Not supported by viewer]
 99 USD 
 99 USD 
Payer FSP Switch account
[Not supported by viewer]
 99 USD 
 99 USD 
Payee FSP Switch account
[Not supported by viewer]
 100 USD 
 100 USD 
 1 USD 
 1 USD 
Payee FSP's Switch account
[Not supported by viewer]
FSP Commission account
FSP Commission account
Fee account
Fee account
Agent Commission account
Agent Commission account
Payee's account
Payee's account
FSP 
Commission account
[Not supported by viewer]
Payer FSP
[Not supported by viewer]
Payee FSP
[Not supported by viewer]
Switch
[Not supported by viewer]
 1 USD 
[Not supported by viewer]
 1 USD 
[Not supported by viewer]
Agent
Agent
Customer
Customer
$
[Not supported by viewer]
101 USD in cash from Payee (Customer) to Payer (Agent)
[Not supported by viewer]
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure26.svg b/docs/fr/technical/api/assets/diagrams/images/figure26.svg new file mode 100644 index 000000000..cee48e5df --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure26.svg @@ -0,0 +1,3 @@ + + +
Agent Commission account
Agent Commission account
Fee account
Fee account
 100 USD 
 100 USD 
Payer's account
Payer's account
 100 USD 
 100 USD 
Payer FSP's Switch account
[Not supported by viewer]
 100 USD 
 100 USD 
Payer FSP Switch account
[Not supported by viewer]
 100 USD 
 100 USD 
Payee FSP Switch account
[Not supported by viewer]
 100 USD 
 100 USD 
 1 USD 
 1 USD 
Payee FSP's Switch account
[Not supported by viewer]
FSP Commission account
FSP Commission account
Fee account
Fee account
Agent Commission account
Agent Commission account
Payee's account
Payee's account
FSP 
Commission account
[Not supported by viewer]
Payer FSP
[Not supported by viewer]
Payee FSP
[Not supported by viewer]
Switch
[Not supported by viewer]
Customer
Customer
Merchant
Merchant
 1 USD 
 1 USD 
Goods/Service worth
100 USD from Merchant (Payee)
 to Customer (Payer)
[Not supported by viewer]
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure28.svg b/docs/fr/technical/api/assets/diagrams/images/figure28.svg new file mode 100644 index 000000000..2083fcd31 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure28.svg @@ -0,0 +1,3 @@ + + +
Agent Commission account
Agent Commission account
Fee account
Fee account
 100 USD 
 100 USD 
Payer's account
Payer's account
 102 USD 
 102 USD 
Payer FSP's Switch account
[Not supported by viewer]
 102 USD 
 102 USD 
Payer FSP Switch account
[Not supported by viewer]
 102 USD 
 102 USD 
Payee FSP Switch account
[Not supported by viewer]
 100 USD 
 100 USD 
 1 USD 
 1 USD 
Payee FSP's Switch account
[Not supported by viewer]
FSP Commission account
FSP Commission account
Fee account
Fee account
Agent Commission account
Agent Commission account
Payee's account
Payee's account
FSP 
Commission account
[Not supported by viewer]
Payer FSP
[Not supported by viewer]
Payee FSP
[Not supported by viewer]
Switch
[Not supported by viewer]
 3 USD 
 3 USD 
 2 USD 
 2 USD 
 2 USD 
 2 USD 
Customer
Customer
Agent
Agent
$
[Not supported by viewer]
100 USD in cash from Agent (Payee) to Customer (Payer)
[Not supported by viewer]
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure30.svg b/docs/fr/technical/api/assets/diagrams/images/figure30.svg new file mode 100644 index 000000000..f91ca847a --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure30.svg @@ -0,0 +1,3 @@ + + +
Agent Commission account
Agent Commission account
Fee account
Fee account
 97 USD 
 97 USD 
Payer's account
Payer's account
 99 USD 
 99 USD 
Payer FSP's Switch account
[Not supported by viewer]
 99 USD 
 99 USD 
Payer FSP Switch account
[Not supported by viewer]
 99 USD 
 99 USD 
Payee FSP Switch account
[Not supported by viewer]
 97 USD 
 97 USD 
 1 USD 
 1 USD 
Payee FSP's Switch account
[Not supported by viewer]
FSP Commission account
FSP Commission account
Fee account
Fee account
Agent Commission account
Agent Commission account
Payee's account
Payee's account
FSP 
Commission account
[Not supported by viewer]
Payer FSP
[Not supported by viewer]
Payee FSP
[Not supported by viewer]
Switch
[Not supported by viewer]
 3 USD 
 3 USD 
 2 USD 
 2 USD 
 2 USD 
 2 USD 
Customer
Customer
Agent
Agent
$
[Not supported by viewer]
97 USD in cash from Agent (Payee) to Customer (Payer)
97 USD in cash from Agent (Payee) to Customer (Payer)
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure32.svg b/docs/fr/technical/api/assets/diagrams/images/figure32.svg new file mode 100644 index 000000000..943d49ae4 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure32.svg @@ -0,0 +1,3 @@ + + +
Agent Commission account
Agent Commission account
Fee account
Fee account
 100 USD 
 100 USD 
Payer's account
Payer's account
 102 USD 
 102 USD 
Payer FSP's Switch account
[Not supported by viewer]
 102 USD 
 102 USD 
Payer FSP Switch account
[Not supported by viewer]
 102 USD 
 102 USD 
Payee FSP Switch account
[Not supported by viewer]
 100 USD 
 100 USD 
 1 USD 
 1 USD 
Payee FSP's Switch account
[Not supported by viewer]
FSP Commission account
FSP Commission account
Fee account
Fee account
Agent Commission account
Agent Commission account
Payee's account
Payee's account
FSP 
Commission account
[Not supported by viewer]
Payer FSP
[Not supported by viewer]
Payee FSP
[Not supported by viewer]
Switch
[Not supported by viewer]
 3 USD 
 3 USD 
 2 USD 
 2 USD 
 2 USD 
 2 USD 
Customer
Customer
Agent
Agent
$
[Not supported by viewer]
100 USD in cash from Agent (Payee) to Customer (Payer)
[Not supported by viewer]
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure34.svg b/docs/fr/technical/api/assets/diagrams/images/figure34.svg new file mode 100644 index 000000000..db4f8f046 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure34.svg @@ -0,0 +1,3 @@ + + +
Agent Commission account
Agent Commission account
Fee account
Fee account
 100 USD 
 100 USD 
Payer's account
Payer's account
 101 USD 
 101 USD 
Payer FSP's Switch account
[Not supported by viewer]
 101 USD 
 101 USD 
Payer FSP Switch account
[Not supported by viewer]
 101 USD 
 101 USD 
Payee FSP Switch account
[Not supported by viewer]
 100 USD 
 100 USD 
Payee FSP's Switch account
[Not supported by viewer]
FSP Commission account
FSP Commission account
Fee account
Fee account
Agent Commission account
Agent Commission account
Payee's account
Payee's account
FSP 
Commission account
[Not supported by viewer]
Payer FSP
[Not supported by viewer]
Payee FSP
[Not supported by viewer]
Switch
[Not supported by viewer]
Customer
Customer
Merchant
Merchant
 1 USD 
 1 USD 
Goods/Service worth
100 USD from Merchant (Payee)
to Customer (Payer)
[Not supported by viewer]
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure36.svg b/docs/fr/technical/api/assets/diagrams/images/figure36.svg new file mode 100644 index 000000000..d5941799f --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure36.svg @@ -0,0 +1,3 @@ + + +
Agent Commission account
Agent Commission account
Fee account
Fee account
 100 USD 
 100 USD 
Payer's account
Payer's account
 101 USD 
 101 USD 
Payer FSP's Switch account
[Not supported by viewer]
 101 USD 
 101 USD 
Payer FSP Switch account
[Not supported by viewer]
 101 USD 
 101 USD 
Payee FSP Switch account
[Not supported by viewer]
 100 USD 
 100 USD 
 1 USD 
 1 USD 
Payee FSP's Switch account
[Not supported by viewer]
FSP Commission account
FSP Commission account
Fee account
Fee account
Agent Commission account
Agent Commission account
Payee's account
Payee's account
FSP 
Commission account
[Not supported by viewer]
Payer FSP
[Not supported by viewer]
Payee FSP
[Not supported by viewer]
Switch
[Not supported by viewer]
 1 USD 
[Not supported by viewer]
Customer
Customer
 2 USD 
[Not supported by viewer]
$
[Not supported by viewer]
100 USD in cash from ATM (Payee) to Customer (Payer)
100 USD in cash from ATM (Payee) to Customer (Payer)
ATM
ATM
diff --git a/docs/fr/technical/api/assets/diagrams/images/figure38.svg b/docs/fr/technical/api/assets/diagrams/images/figure38.svg new file mode 100644 index 000000000..9e6187188 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure38.svg @@ -0,0 +1,3 @@ + + +
Agent Commission account
Agent Commission account
Fee account
Fee account
 100 USD 
 100 USD 
Payer's account
Payer's account
 99 USD 
 99 USD 
Payer FSP's Switch account
[Not supported by viewer]
 99 USD 
 99 USD 
Payer FSP Switch account
[Not supported by viewer]
 99 USD 
 99 USD 
Payee FSP Switch account
[Not supported by viewer]
 100 USD 
 100 USD 
Payee FSP's Switch account
[Not supported by viewer]
FSP Commission account
FSP Commission account
Fee account
Fee account
Agent Commission account
Agent Commission account
Payee's account
Payee's account
FSP 
Commission account
[Not supported by viewer]
Payer FSP
[Not supported by viewer]
Payee FSP
[Not supported by viewer]
Switch
[Not supported by viewer]
Customer
Customer
Merchant
Merchant
 1 USD 
 1 USD 
Goods/Service worth
100 USD from Merchant (Payee)
to Customer (Payer)
[Not supported by viewer]
 1 USD 
 1 USD 
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure40.svg b/docs/fr/technical/api/assets/diagrams/images/figure40.svg new file mode 100644 index 000000000..ae2cf6677 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure40.svg @@ -0,0 +1,3 @@ + + +
 1 USD 
[Not supported by viewer]
Agent Commission account
Agent Commission account
Fee account
Fee account
 100 USD 
 100 USD 
Payer's account
Payer's account
 99 USD 
 99 USD 
Payer FSP's Switch account
[Not supported by viewer]
 99 USD 
 99 USD 
Payer FSP Switch account
[Not supported by viewer]
 99 USD 
 99 USD 
Payee FSP Switch account
[Not supported by viewer]
 100 USD 
 100 USD 
 1 USD 
 1 USD 
Payee FSP's Switch account
[Not supported by viewer]
FSP Commission account
FSP Commission account
Fee account
Fee account
Agent Commission account
Agent Commission account
Payee's account
Payee's account
FSP 
Commission account
[Not supported by viewer]
Payer FSP
[Not supported by viewer]
Payee FSP
[Not supported by viewer]
Switch
[Not supported by viewer]
 1 USD 
[Not supported by viewer]
Customer
Customer
Agent
Agent
 1 USD 
[Not supported by viewer]
$
[Not supported by viewer]
101 USD in cash from Agent (Payee) to Customer (Payer)
[Not supported by viewer]
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure46.svg b/docs/fr/technical/api/assets/diagrams/images/figure46.svg new file mode 100644 index 000000000..75093833a --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure46.svg @@ -0,0 +1,3 @@ + + +
RECEIVED
<b>RECEIVED</b>
PENDING
<b>PENDING</b>
REJECTED
<b>REJECTED</b>
ACCEPTED
<b>ACCEPTED</b>
Payer FSP receives
the transaction
request from 
the Payee FSP
[Not supported by viewer]
Payer FSP sends
the transaction
request to 
the Payee
[Not supported by viewer]
Payer 
responds
[Not supported by viewer]
Payer  approved 
the transaction
[Not supported by viewer]
Payer rejected 
the transaction
[Not supported by viewer]
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure48.svg b/docs/fr/technical/api/assets/diagrams/images/figure48.svg new file mode 100644 index 000000000..1a7fa406f --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure48.svg @@ -0,0 +1,3 @@ + + +
RECEIVED
<b>RECEIVED</b>
PENDING
<b>PENDING</b>
REJECTED
<b>REJECTED</b>
ACCEPTED
<b>ACCEPTED</b>
Peer FSP 
receives the 
request 
from the FSP
[Not supported by viewer]
Peer FSP 
validates 
the quote 
request
[Not supported by viewer]
Peer FSP
tries to 
create a 
quote
[Not supported by viewer]
Peer FSP 
successfully 
create a quote
[Not supported by viewer]
Peer FSP 
failed to 
create a quote
[Not supported by viewer]
EXPIRED
<b>EXPIRED</b>
The quote 
expires and 
is no longer 
valid
[Not supported by viewer]
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure56.svg b/docs/fr/technical/api/assets/diagrams/images/figure56.svg new file mode 100644 index 000000000..b0d58be95 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure56.svg @@ -0,0 +1,3 @@ + + +
RECEIVED
<b>RECEIVED</b>
RESERVED
<b>RESERVED</b>
ABORTED
<b>ABORTED</b>
COMMITTED
<b>COMMITTED</b>
The ledger 
receives a 
transfer 
request
[Not supported by viewer]
The ledger 
reserves 
the transfer
[Not supported by viewer]
The ledger 
receives 
results 
from the 
next ledger
[Not supported by viewer]
Next ledger 
successfully 
performed the 
transfer
[Not supported by viewer]
Next ledger 
failed to 
perform the 
transfer or the 
transfer expired
[Not supported by viewer]
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure58.svg b/docs/fr/technical/api/assets/diagrams/images/figure58.svg new file mode 100644 index 000000000..5d8ba0c93 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure58.svg @@ -0,0 +1,3 @@ + + +
RECEIVED
<b>RECEIVED</b>
PENDING
<b>PENDING</b>
REJECTED
<b>REJECTED</b>
COMPLETED
<b>COMPLETED</b>
Payee FSP
receives the
transaction
from the
Payer FSP
[Not supported by viewer]
Payee FSP 
validates 
the
transaction
[Not supported by viewer]
Payee FSP 
tries to 
perform the 
transaction
[Not supported by viewer]
Payee FSP 
successfully 
performed the 
transaction
[Not supported by viewer]
Payee FSP failed 
to 
perform 
the transaction
[Not supported by viewer]
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure60.svg b/docs/fr/technical/api/assets/diagrams/images/figure60.svg new file mode 100644 index 000000000..9f97ba682 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure60.svg @@ -0,0 +1,3 @@ + + +
RECEIVED
<b>RECEIVED</b>
PENDING
<b>PENDING</b>
REJECTED
<b>REJECTED</b>
ACCEPTED
<b>ACCEPTED</b>
Payee FSP 
receives the 
request 
from the 
Payer FSP
[Not supported by viewer]
Payee FSP
validates 
the bulk 
quote 
request
[Not supported by viewer]
Payee FSP 
tries to 
create a 
quote
[Not supported by viewer]
Payee FSP 
successfully 
created a quote
[Not supported by viewer]
Payee FSP 
failed to 
create a quote
[Not supported by viewer]
EXPIRED
<b>EXPIRED</b>
The quote 
expires and 
is no longer 
valid
[Not supported by viewer]
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure62.svg b/docs/fr/technical/api/assets/diagrams/images/figure62.svg new file mode 100644 index 000000000..466446b23 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure62.svg @@ -0,0 +1,3 @@ + + +
RECEIVED
<b>RECEIVED</b>
PENDING
<b>PENDING</b>
REJECTED
<b>REJECTED</b>
ACCEPTED
<b>ACCEPTED</b>
Payee FSP 
receives 
the bulk 
transfer 
from the 
Payer FSP
[Not supported by viewer]
Payee FSP 
validates 
the bulk 
transfer
[Not supported by viewer]
Payee FSP 
finishes 
validation 
of the bulk 
transfer
[Not supported by viewer]
Payee FSP 
accepts to 
process 
the bulk 
transfer
[Not supported by viewer]
Payee FSP 
rejects to 
process the 
bulk transfer
[Not supported by viewer]
PROCESSING
<b>PROCESSING</b>
Payee FSP 
starts to 
transfer 
funds to 
the Payees
[Not supported by viewer]
COMPLETED
<b>COMPLETED</b>
Payee FSP 
completes 
transfer of 
funds to 
the Payees
[Not supported by viewer]
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure63.svg b/docs/fr/technical/api/assets/diagrams/images/figure63.svg new file mode 100644 index 000000000..1f262897d --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure63.svg @@ -0,0 +1,3 @@ + + +
High-level 
category
[Not supported by viewer]
Low-level 
category
[Not supported by viewer]
Specific error
Specific error
1 digit
1 digit
1 digit
1 digit
2 digit
2 digit
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure7.svg b/docs/fr/technical/api/assets/diagrams/images/figure7.svg new file mode 100644 index 000000000..e3b0e5548 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure7.svg @@ -0,0 +1,3 @@ + + +
Payer fee to Payer FSP
<font color="#ff3333">Payer fee to Payer FSP</font>
Payer
Payer
 Payee FSP transaction fee 
[Not supported by viewer]
Payee FSP commission
to Payer FSP
[Not supported by viewer]
Internal Payee fee to Payee FSP
<font color="#ff3333">Internal Payee fee to Payee FSP</font>
internal Payee FSP
bonus/commission
to Payee
[Not supported by viewer]
Payee
Payee
Payer FSP
bonus/commission
 to Payee
[Not supported by viewer]
Switch
Switch
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure73.svg b/docs/fr/technical/api/assets/diagrams/images/figure73.svg new file mode 100644 index 000000000..148715368 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure73.svg @@ -0,0 +1,3 @@ + + +
Switch
(Identifier = Switch)
Switch<br>(Identifier = <b>Switch</b>)
FSP
(Identifier = MobileMoney)
FSP<br>(<b>Identifier = MobileMoney</b>)
FSP
(Identifier = BankNrOne)
FSP<br>(<b>Identifier = BankNrOne</b>)
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/images/figure9.svg b/docs/fr/technical/api/assets/diagrams/images/figure9.svg new file mode 100644 index 000000000..68f6c3716 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/images/figure9.svg @@ -0,0 +1,3 @@ + + +
 1 USD 
[Not supported by viewer]
Agent Commission account
Agent Commission account
 1 USD 
 1 USD 
Fee account
Fee account
 100 USD 
 100 USD 
Payer's account
Payer's account
 99 USD 
 99 USD 
Payer FSP's Switch account
[Not supported by viewer]
 99 USD 
 99 USD 
Payer FSP Switch account
[Not supported by viewer]
 99 USD 
 99 USD 
Payee FSP Switch account
[Not supported by viewer]
 100 USD 
 100 USD 
1 USD
1 USD
Payee FSP's Switch account
[Not supported by viewer]
FSP Commission account
FSP Commission account
Fee account
Fee account
Agent Commission account
Agent Commission account
Payee's account
Payee's account
FSP Commission account
FSP Commission account
Payer FSP
[Not supported by viewer]
Payee FSP
[Not supported by viewer]
Switch
[Not supported by viewer]
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure1.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure1.plantuml new file mode 100644 index 000000000..e80fedf1c --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure1.plantuml @@ -0,0 +1,68 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +' declare title +' title HTTP POST call flow + +' Actor Keys: +' participant - FSP, Peer FSP and Optional Switch + +' declare actors +participant "\nFSP" as FSP +participant "Optional\nSwitch" as Switch +participant "Peer\nFSP" as PEERFSP + +' start flow +FSP ->> Switch: **POST /service**\n(Service information, ID) +activate FSP +activate Switch +FSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PEERFSP: **POST /service**\n(Service information, ID) +activate PEERFSP +Switch <<-- PEERFSP: **HTTP 202** (Accepted) +PEERFSP -> PEERFSP: Create service object\naccording to request +Switch <<- PEERFSP: **PUT /service/**////\n(Service object information) +Switch -->> PEERFSP: **HTTP 200** (OK) +deactivate PEERFSP +FSP <<- Switch: **PUT /service/**////\n(Service object information) +FSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +FSP -> FSP: Handle service\nobject information +FSP -[hidden]> Switch +deactivate FSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure1.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure1.svg new file mode 100644 index 000000000..50be4512d --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure1.svg @@ -0,0 +1,77 @@ + + + + + + + + + + +   + FSP + + Optional + Switch + + Peer + FSP + + + + + + + POST /service + (Service information, ID) + + + + HTTP 202 + (Accepted) + + + + POST /service + (Service information, ID) + + + + HTTP 202 + (Accepted) + + + + + Create service object + according to request + + + + PUT /service/ + <ID> + (Service object information) + + + + HTTP 200 + (OK) + + + + PUT /service/ + <ID> + (Service object information) + + + + HTTP 200 + (OK) + + + + + Handle service + object information + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure10.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure10.plantuml new file mode 100644 index 000000000..41c039e8f --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure10.plantuml @@ -0,0 +1,138 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Example of non-disclosing send amount + +' Actor Keys: +' participant - FSP(Payer/Payee) and Optional Switch +' actor - Payee and Payer + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "Optional\nSwitch" as Switch +participant "Payee\nFSP" as PayeeFSP +actor "<$actor>\nPayee" as Payee + +' start flow +Payer ->> PayerFSP: I would like to Payee to\nsend 100 USD to Payee +activate PayerFSP +PayerFSP -> PayerFSP: Rate fee for Payer for\nhandling transaction in\nPayer FSP => fee 1 USD +PayerFSP ->> Switch: **POST /quotes**\n(amountType=SEND,\namount=99 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **POST /quotes**\n(amountType=SEND,\namount=99 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Rate transaction fee\nor commission for\nhandeling transaction in\nPayee FSP => fee 1 USD +Switch <<- PayeeFSP: **PUT /quotes/**\n(transferAmount=99 USD,\nPayeeReceiveamount=98 USD\npayeeFspFee=1 USD) +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +PayerFSP <<- Switch: **PUT /quotes/**\n(transferAmount=99 USD,\nPayeeReceiveamount=98 USD\npayeeFspFee=1 USD) +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Show total fees to Payer +PayerFSP ->> Payer: Payee will receive 98 USD\nif you send 100 USD +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure10.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure10.svg new file mode 100644 index 000000000..83d930001 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure10.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + + Optional + Switch + + Payee + FSP + + Payee + + + + + + + + + I would like to Payee to + send 100 USD to Payee + + + + + Rate fee for Payer for + handling transaction in + Payer FSP => fee 1 USD + + + + POST /quotes + (amountType=SEND, + amount=99 USD) + + + + HTTP 202 + (Accepted) + + + + POST /quotes + (amountType=SEND, + amount=99 USD) + + + + HTTP 202 + (Accepted) + + + + + Rate transaction fee + or commission for + handeling transaction in + Payee FSP => fee 1 USD + + + + PUT /quotes/ + <ID> + (transferAmount=99 USD, + PayeeReceiveamount=98 USD + payeeFspFee=1 USD) + + + + HTTP 200 + (OK) + + + + PUT /quotes/ + <ID> + (transferAmount=99 USD, + PayeeReceiveamount=98 USD + payeeFspFee=1 USD) + + + + HTTP 200 + (OK) + + + + + Show total fees to Payer + + + + Payee will receive 98 USD + if you send 100 USD + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure13.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure13.plantuml new file mode 100644 index 000000000..7ea6e0dfa --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure13.plantuml @@ -0,0 +1,146 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Example of disclosing receive amount + +' Actor Keys: +' participant - FSP(Payer/Payee) and Optional Switch +' actor - Payee and Payer + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "Optional\nSwitch" as Switch +participant "Payee\nFSP" as PayeeFSP +actor "<$actor>\nPayee" as Payee + +' start flow +Payer ->> PayerFSP: I would like to send\n100 USD to Payee +activate PayerFSP +PayerFSP -> PayerFSP: Rate fee for Payer for\nhandling transaction in\nPayer FSP => fee 1 USD +PayerFSP ->> Switch: **POST /quotes**\n(amountType=RECEIVE,\namount=100 USD, fees=1 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **POST /quotes**\n(amountType=RECEIVE,\namount=100 USD, fees=1 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Rate transaction fee or\ncommission for handeling\ntransaction in Payee FSP =>\nFSP commission 1 USD +group Optional + hnote left of PayeeFSP + Notify/Ask Payee + for approval + end note + PayeeFSP ->> Payee: If accepted, you will receive\n100 USD + PayeeFSP <<- Payee: OK +end +Switch <<- PayeeFSP: **PUT /quotes/**\n(transferAmount=99 USD,\nPayeeFspCommission=1 USD,\npayeeReceivedAmount=100 USD) +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +PayerFSP <<- Switch: **PUT /quotes/**\n(transferAmount=99 USD,\nPayeeFspCommission=1 USD\npayeeReceivedAmouint=100 USD) +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Transaction is subsidized with the\ncommission as fees are disclosed,\nshow total fees to Payer +PayerFSP ->> Payer: Sending 100 USD to Payee\nwill cost 0 USD in fees +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure13.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure13.svg new file mode 100644 index 000000000..63a4002d7 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure13.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + + Optional + Switch + + Payee + FSP + + Payee + + + + + + + + + I would like to send + 100 USD to Payee + + + + + Rate fee for Payer for + handling transaction in + Payer FSP => fee 1 USD + + + + POST /quotes + (amountType=RECEIVE, + amount=100 USD, fees=1 USD) + + + + HTTP 202 + (Accepted) + + + + POST /quotes + (amountType=RECEIVE, + amount=100 USD, fees=1 USD) + + + + HTTP 202 + (Accepted) + + + + + Rate transaction fee or + commission for handeling + transaction in Payee FSP => + FSP commission 1 USD + + + Optional + + Notify/Ask Payee + for approval + + + + If accepted, you will receive + 100 USD + + + + OK + + + + PUT /quotes/ + <ID> + (transferAmount=99 USD, + PayeeFspCommission=1 USD, + payeeReceivedAmount=100 USD) + + + + HTTP 200 + (OK) + + + + PUT /quotes/ + <ID> + (transferAmount=99 USD, + PayeeFspCommission=1 USD + payeeReceivedAmouint=100 USD) + + + + HTTP 200 + (OK) + + + + + Transaction is subsidized with the + commission as fees are disclosed, + show total fees to Payer + + + + Sending 100 USD to Payee + will cost 0 USD in fees + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure15.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure15.plantuml new file mode 100644 index 000000000..2c33654b8 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure15.plantuml @@ -0,0 +1,146 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Example of disclosing send amount + +' Actor Keys: +' participant - FSP(Payer/Payee) and Optional Switch +' actor - Payee and Payer + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "Optional\nSwitch" as Switch +participant "Payee\nFSP" as PayeeFSP +actor "<$actor>\nPayee" as Payee + +' start flow +Payer ->> PayerFSP: I would like to\ nsend 100 USD to Payee +activate PayerFSP +PayerFSP -> PayerFSP: Rate fee for Payer for\nhandling transaction in\nPayer FSP => fee 1 USD +PayerFSP ->> Switch: **POST /quotes**\n(amountType=SEND,\namount=99 USD, fees=1 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **POST /quotes**\n(amountType=SEND,\namount=99 USD, fees=1 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Rate transaction fee\nor commission for\nhandeling transaction in\nPayee FSP => fee 1 USD +group Optional +PayeeFSP ->> Payee: If accepted, you will receive\n98 USD out of Payer's 100 USD +hnote left of PayeeFSP + Notify/Ask Payee + for approval +end note +PayeeFSP <<- Payee: OK +end +Switch <<- PayeeFSP: **PUT /quotes/**\n(transferAmount=99 USD,\npayeeReceiveAmount=98 USD,\npayeeFspFee=1 USD) +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +PayerFSP <<- Switch: **PUT /quotes/**\n(transferAmount=99 USD,\npayeeReceiveAmount=98 USD\npayeeFspFees=1 USD) +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Show total fees to Payer +PayerFSP ->> Payer: Payee will receive 98 USD\nif you send 100 USD +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure15.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure15.svg new file mode 100644 index 000000000..94a536f15 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure15.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + + Optional + Switch + + Payee + FSP + + Payee + + + + + + + + + I would like to\ nsend 100 USD to Payee + + + + + Rate fee for Payer for + handling transaction in + Payer FSP => fee 1 USD + + + + POST /quotes + (amountType=SEND, + amount=99 USD, fees=1 USD) + + + + HTTP 202 + (Accepted) + + + + POST /quotes + (amountType=SEND, + amount=99 USD, fees=1 USD) + + + + HTTP 202 + (Accepted) + + + + + Rate transaction fee + or commission for + handeling transaction in + Payee FSP => fee 1 USD + + + Optional + + + + If accepted, you will receive + 98 USD out of Payer's 100 USD + + Notify/Ask Payee + for approval + + + + OK + + + + PUT /quotes/ + <ID> + (transferAmount=99 USD, + payeeReceiveAmount=98 USD, + payeeFspFee=1 USD) + + + + HTTP 200 + (OK) + + + + PUT /quotes/ + <ID> + (transferAmount=99 USD, + payeeReceiveAmount=98 USD + payeeFspFees=1 USD) + + + + HTTP 200 + (OK) + + + + + Show total fees to Payer + + + + Payee will receive 98 USD + if you send 100 USD + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure17.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure17.plantuml new file mode 100644 index 000000000..e95153b41 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure17.plantuml @@ -0,0 +1,146 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Example of disclosing send amount + +' Actor Keys: +' participant - FSP(Payer/Payee) and Optional Switch +' actor - Payee and Payer + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "Optional\nSwitch" as Switch +participant "Payee\nFSP" as PayeeFSP +actor "<$actor>\nPayee" as Payee + +' start flow +Payer ->> PayerFSP: I would like to \nsend 100 USD to Payee +activate PayerFSP +PayerFSP -> PayerFSP: Rate fee for Payer for\nhandling transaction in\nPayer FSP => fee 1 USD +PayerFSP ->> Switch: **POST /quotes**\n(amountType=SEND,\namount=99 USD, fees=1 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **POST /quotes**\n(amountType=SEND,\namount=99 USD, fees=1 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Rate transaction fee or commission\nfor handeling transaction in\nPayee FSP => FSP commission 3\nUSD (1 USD to pay for Payer's\nfee, 2 USD in excess commission) +group Optional +PayeeFSP ->> Payee: If accepted, you will receive\n100 USD out of Payer's 100 USD +hnote left of PayeeFSP + Notify/Ask Payee + for approval +end note +PayeeFSP <<- Payee: OK +end +Switch <<- PayeeFSP: **PUT /quotes/**\n(transferAmount=97 USD,\npayeeReceivedAmount=100 USD,\npayeeFspCommission=3 USD) +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +PayerFSP <<- Switch: **PUT /quotes/**\n(transferAmount=97 USD,\npayeeReceiveAmount=100 USD\npayeeFspCommission=3 USD) +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Payer should pay 100 USD, Payer\nFSP will earn in total 3 USD in fees\n(Payer fee of 1 USD paid by\nPayeeFSP, plus 2 USD in access\ncommission) +PayerFSP ->> Payer: Payee will receive 100 USD\nif you send 100 USD +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure17.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure17.svg new file mode 100644 index 000000000..aa3f4fdb4 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure17.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + + Optional + Switch + + Payee + FSP + + Payee + + + + + + + + + I would like to + send 100 USD to Payee + + + + + Rate fee for Payer for + handling transaction in + Payer FSP => fee 1 USD + + + + POST /quotes + (amountType=SEND, + amount=99 USD, fees=1 USD) + + + + HTTP 202 + (Accepted) + + + + POST /quotes + (amountType=SEND, + amount=99 USD, fees=1 USD) + + + + HTTP 202 + (Accepted) + + + + + Rate transaction fee or commission + for handeling transaction in + Payee FSP => FSP commission 3 + USD (1 USD to pay for Payer's + fee, 2 USD in excess commission) + + + Optional + + + + If accepted, you will receive + 100 USD out of Payer's 100 USD + + Notify/Ask Payee + for approval + + + + OK + + + + PUT /quotes/ + <ID> + (transferAmount=97 USD, + payeeReceivedAmount=100 USD, + payeeFspCommission=3 USD) + + + + HTTP 200 + (OK) + + + + PUT /quotes/ + <ID> + (transferAmount=97 USD, + payeeReceiveAmount=100 USD + payeeFspCommission=3 USD) + + + + HTTP 200 + (OK) + + + + + Payer should pay 100 USD, Payer + FSP will earn in total 3 USD in fees + (Payer fee of 1 USD paid by + PayeeFSP, plus 2 USD in access + commission) + + + + Payee will receive 100 USD + if you send 100 USD + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure19.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure19.plantuml new file mode 100644 index 000000000..33ed308f9 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure19.plantuml @@ -0,0 +1,159 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title P2P Transfer example with receive amount + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payee and Payer + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "\nSwitch" as Switch +participant "Payee\nFSP" as PayeeFSP +actor "<$actor>\nPayee" as Payee + +' start flow +Payer ->> PayerFSP: I would like Payee\nto receive 100 USD +activate PayerFSP +PayerFSP ->> Switch: **POST /quotes**\n(amountType=RECEIVE,\namount=100 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **POST /quotes**\n(amountType=RECEIVE,\namount=100 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Commission is 1 USD in\nPayee FSP for P2P +Switch <<- PayeeFSP: **PUT /quotes/**\n(transferAmount=99 USD,\npayeeReceiveAmount=100 USD,\npayeeFspCommission=1 USD) +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +PayerFSP <<- Switch: **PUT /quotes/**\n(transferAmount=99 USD,\npayeeReceiveAmount=100 USD,\npayeeFspCommission=1 USD) +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Payer FSP keeps commission\nas fee, Payer also should pay\nfee of 1 USD +PayerFSP ->> Payer: Transfering 100 USD to Payee\nwill cost you 101 USD\nincluding fees +deactivate PayerFSP +Payer ->> PayerFSP: Perform transaction +activate PayerFSP +PayerFSP -> PayerFSP: Receive 101 USD from Payer\naccount, 99 USD to Switch\naccount, 1 USD to fee account,\n1 USD to FSP commission account +PayerFSP ->> Switch: **POST /transfers**\n(amount=99 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch -> Switch: Receive 99 USD from Payer FSP\naccount to Payee FSP account +Switch ->> PayeeFSP: **POST /transfers**\n(amount=99 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Transfer 99 USD from Switch\naccount and 1 USD from\ncommission account\nto Payee account +PayeeFSP -> Payee: You have received 100 USD\nfrom Payer +Switch <<- PayeeFSP: **PUT /transfers/** +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +Switch -> Switch: Commit reserved transfer +PayerFSP <<- Switch: **PUT /transfers/** +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Commit reserved transfer +Payer <- PayerFSP: Transaction successful,\nyou have paid 1 USD in fee +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure19.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure19.svg new file mode 100644 index 000000000..cb8eef462 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure19.svg @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + +   + Switch + + Payee + FSP + + Payee + + + + + + + + + + + + I would like Payee + to receive 100 USD + + + + POST /quotes + (amountType=RECEIVE, + amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + POST /quotes + (amountType=RECEIVE, + amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + + Commission is 1 USD in + Payee FSP for P2P + + + + PUT /quotes/ + <ID> + (transferAmount=99 USD, + payeeReceiveAmount=100 USD, + payeeFspCommission=1 USD) + + + + HTTP 200 + (OK) + + + + PUT /quotes/ + <ID> + (transferAmount=99 USD, + payeeReceiveAmount=100 USD, + payeeFspCommission=1 USD) + + + + HTTP 200 + (OK) + + + + + Payer FSP keeps commission + as fee, Payer also should pay + fee of 1 USD + + + + Transfering 100 USD to Payee + will cost you 101 USD + including fees + + + + Perform transaction + + + + + Receive 101 USD from Payer + account, 99 USD to Switch + account, 1 USD to fee account, + 1 USD to FSP commission account + + + + POST /transfers + (amount=99 USD) + + + + HTTP 202 + (Accepted) + + + + + Receive 99 USD from Payer FSP + account to Payee FSP account + + + + POST /transfers + (amount=99 USD) + + + + HTTP 202 + (Accepted) + + + + + Transfer 99 USD from Switch + account and 1 USD from + commission account + to Payee account + + + You have received 100 USD + from Payer + + + + PUT /transfers/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + + PUT /transfers/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + Transaction successful, + you have paid 1 USD in fee + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure1_http-timeout.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure1_http-timeout.plantuml new file mode 100644 index 000000000..0b5116c3f --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure1_http-timeout.plantuml @@ -0,0 +1,68 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam sequencearrowcolor Black + +hide footbox + +' declare title +' title HTTP POST call flow + +' Actor Keys: +' participant - FSP, Peer FSP and Optional Switch + +' declare actors +participant "\nFSP" as FSP +participant "Optional\nSwitch" as Switch +participant "Peer\nFSP" as PEERFSP + +' start flow +FSP ->> Switch: **POST /service**\n(Service information, ID) +activate FSP +activate Switch +FSP <<[#Red]-- Switch : **HTTP 202** (Accepted) +Switch ->> PEERFSP: **POST /service**\n(Service information, ID) +activate PEERFSP +Switch <<[#Red]-- PEERFSP: **HTTP 202** (Accepted) +PEERFSP -> PEERFSP: Create service object\naccording to request +Switch <<- PEERFSP: **PUT /service/**////\n(Service object information) +Switch --[#Red]>> PEERFSP: **HTTP 200** (OK) +deactivate PEERFSP +FSP <<- Switch: **PUT /service/**////\n(Service object information) +FSP --[#Red]>> Switch: **HTTP 200** (OK) +deactivate Switch +FSP -> FSP: Handle service object information +FSP -[hidden]> Switch +deactivate FSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure1_http-timeout.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure1_http-timeout.svg new file mode 100644 index 000000000..49c15b416 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure1_http-timeout.svg @@ -0,0 +1,76 @@ + + + + + + + + + + +   + FSP + + Optional + Switch + + Peer + FSP + + + + + + + POST /service + (Service information, ID) + + + + HTTP 202 + (Accepted) + + + + POST /service + (Service information, ID) + + + + HTTP 202 + (Accepted) + + + + + Create service object + according to request + + + + PUT /service/ + <ID> + (Service object information) + + + + HTTP 200 + (OK) + + + + PUT /service/ + <ID> + (Service object information) + + + + HTTP 200 + (OK) + + + + + Handle service object information + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure2.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure2.plantuml new file mode 100644 index 000000000..5a7668cd6 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure2.plantuml @@ -0,0 +1,68 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml +' declare skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +' declare title +' title HTTP GET call flow + +' Actor Keys: +' participant - FSP, Peer FSP and Optional Switch + +' declare actors +participant "\nFSP" as FSP +participant "Optional\nSwitch" as Switch +participant "Peer\nFSP" as PEERFSP + +' start flow +FSP ->> Switch: **GET /service/**//// +activate FSP +activate Switch +FSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PEERFSP: **GET /service/**//// +activate PEERFSP +Switch <<-- PEERFSP: **HTTP 202** (Accepted) +PEERFSP -> PEERFSP: Lookup service\ninformation regarding\nservice with//// +Switch <<- PEERFSP: **PUT /service/**////\n(Service object information) +Switch -->> PEERFSP: **HTTP 200** (OK) +deactivate PEERFSP +FSP <<- Switch: **PUT /service/**////\n(Service object information) +FSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +FSP -> FSP: Handle service object\ninformation update +FSP -[hidden]> FSP +deactivate FSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure2.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure2.svg new file mode 100644 index 000000000..0b32be0cf --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure2.svg @@ -0,0 +1,79 @@ + + + + + + + + + + +   + FSP + + Optional + Switch + + Peer + FSP + + + + + + + GET /service/ + <ID> + + + + HTTP 202 + (Accepted) + + + + GET /service/ + <ID> + + + + HTTP 202 + (Accepted) + + + + + Lookup service + information regarding + service with + <ID> + + + + PUT /service/ + <ID> + (Service object information) + + + + HTTP 200 + (OK) + + + + PUT /service/ + <ID> + (Service object information) + + + + HTTP 200 + (OK) + + + + + Handle service object + information update + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure21.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure21.plantuml new file mode 100644 index 000000000..294c13d52 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure21.plantuml @@ -0,0 +1,167 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Agent-initiated Cash-In example with send amount + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payee/Payer(OTC) + +' declare actors +actor "<$actor>\nPayer\n(OTC)" as PayerOTC +actor "<$actor>\nPayer\n" as Payer +participant "\nPayer\nFSP" as PayerFSP +participant "\n\nSwitch" as Switch +participant "\nPayee\nFSP" as PayeeFSP +actor "<$actor>\nPayee\n" as Payee + +' start flow +PayerOTC ->> Payer: I would like to Cash-in\nthis 100 USD bill +PayerOTC <<- Payer: OK, you will receive a\nnotification from your FSP\ndisplaying the fees +Payer ->> PayerFSP: I would like to send\n100 USD to Payee +activate PayerFSP +PayerFSP -> PayerFSP: Fee is 2 USD in Payer\nFSP for Cash-in,\nPayer will receive 1\nUSD in internal commission. +PayerFSP ->> Switch: **POST /quotes**\n(amountType=SEND,\namount=98 USD, fees=2 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **POST /quotes**\n(amountType=SEND,\namount=98 USD, fees=2 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Payee FSP decides to give\n2 USD in FSP commission to\nPayer so that\nCash-in is free +PayeeFSP ->> Payee: By paying 100 USD in cash\nto Payer, you will receive\n100 USD to your account +PayeeFSP <<-- Payee: OK +Switch <<- PayeeFSP: **PUT /quotes/**\n(transferAmount=98 USD,\npayeeReceiveAmount=100 USD,\npayeeFspCommission=2 USD) +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +PayerFSP <<- Switch: **PUT /quotes/**\n(transferAmount=98 USD,\npayeeReceiveAmount=100 USD,\npayeeFspCommission=2 USD) +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +Payer <<- PayerFSP: Payee will receive 100 USD\nand has accepted the\nquote, you will receive\n1 USD in commission +deactivate PayerFSP +PayerOTC <<- Payer: You will receive 100 USD\non your account. Please give\nme the 100 USD bill +PayerOTC ->> Payer: OK, here is 100 USD +Payer ->> PayerFSP: Perform transaction +activate PayerFSP +PayerFSP -> PayerFSP: Reserve 100 USD from Payer\naccount, 98 USD to Switch\naccount and 2 USD to fee account,\n1 USD from agent commission\naccount to Payer +PayerFSP ->> Switch: **POST /transfers**\n(amount=98 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch -> Switch: Reserve 98 USD from Payer FSP\naccount to Payee FSP account +Switch ->> PayeeFSP: **POST /transfers**\n(amount=98 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Transfer 98 USD from Switch\naccount and 2 USD from\nFSP commission account\nto Payee account +PayeeFSP -> Payee: You have Cash-in 100 USD +Switch <<- PayeeFSP: **PUT /transfers/** +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +Switch -> Switch: Commit reserved transfer +PayerFSP <<- Switch: **PUT /transfers/** +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Commit reserved transfer +Payer <- PayerFSP: Transaction successful, you have\nsent 100 USD and received\n1 USD in commission +deactivate PayerFSP +PayerOTC <- Payer: Thank you! +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure21.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure21.svg new file mode 100644 index 000000000..35f3955eb --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure21.svg @@ -0,0 +1,252 @@ + + + + + + + + + + + + + + + + + + + + + + + + Payer + (OTC) + + + + Payer +   + + + +   + Payer + FSP + +   +   + Switch + +   + Payee + FSP + + Payee +   + + + + + + + + + + + + I would like to Cash-in + this 100 USD bill + + + + OK, you will receive a + notification from your FSP + displaying the fees + + + + I would like to send + 100 USD to Payee + + + + + Fee is 2 USD in Payer + FSP for Cash-in, + Payer will receive 1 + USD in internal commission. + + + + POST /quotes + (amountType=SEND, + amount=98 USD, fees=2 USD) + + + + HTTP 202 + (Accepted) + + + + POST /quotes + (amountType=SEND, + amount=98 USD, fees=2 USD) + + + + HTTP 202 + (Accepted) + + + + + Payee FSP decides to give + 2 USD in FSP commission to + Payer so that + Cash-in is free + + + + By paying 100 USD in cash + to Payer, you will receive + 100 USD to your account + + + + OK + + + + PUT /quotes/ + <ID> + (transferAmount=98 USD, + payeeReceiveAmount=100 USD, + payeeFspCommission=2 USD) + + + + HTTP 200 + (OK) + + + + PUT /quotes/ + <ID> + (transferAmount=98 USD, + payeeReceiveAmount=100 USD, + payeeFspCommission=2 USD) + + + + HTTP 200 + (OK) + + + + Payee will receive 100 USD + and has accepted the + quote, you will receive + 1 USD in commission + + + + You will receive 100 USD + on your account. Please give + me the 100 USD bill + + + + OK, here is 100 USD + + + + Perform transaction + + + + + Reserve 100 USD from Payer + account, 98 USD to Switch + account and 2 USD to fee account, + 1 USD from agent commission + account to Payer + + + + POST /transfers + (amount=98 USD) + + + + HTTP 202 + (Accepted) + + + + + Reserve 98 USD from Payer FSP + account to Payee FSP account + + + + POST /transfers + (amount=98 USD) + + + + HTTP 202 + (Accepted) + + + + + Transfer 98 USD from Switch + account and 2 USD from + FSP commission account + to Payee account + + + You have Cash-in 100 USD + + + + PUT /transfers/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + + PUT /transfers/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + Transaction successful, you have + sent 100 USD and received + 1 USD in commission + + + Thank you! + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure23.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure23.plantuml new file mode 100644 index 000000000..bb636328f --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure23.plantuml @@ -0,0 +1,167 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Agent-initiated Cash-In example with received amount + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payee/Payer(OTC) + +' declare actors +actor "<$actor>\nPayer\n(OTC)" as PayerOTC +actor "<$actor>\nPayer\n" as Payer +participant "\nPayer\nFSP" as PayerFSP +participant "\n\nSwitch" as Switch +participant "\nPayee\nFSP" as PayeeFSP +actor "<$actor>\nPayee\n" as Payee + +' start flow +PayerOTC ->> Payer: I would like to Cash-in\nso that I receive 100 USD +PayerOTC <<- Payer: OK, you will receive a\nnotification from your FSP\ndisplaying the fees +Payer ->> PayerFSP: I would like Agent (Payee) to\nreceive 100 USD +activate PayerFSP +PayerFSP -> PayerFSP: Fee is 2 USD in Payer\nFSP for Cash-in,\nPayer will receive 1\nUSD in internal commission. +PayerFSP ->> Switch: **POST /quotes**\n(amountType=RECEIVE,\namount=100 USD, fees=2 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **POST /quotes**\n(amountType=RECEIVE,\namount=100 USD, fees=2 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Payee FSP decides to give\n1 USD in commission to\nPayer so that\nCash-in only costs 1 USD +PayeeFSP ->> Payee: By paying 101 USD in cash\nto Payer, you will receive\n100 USD to your account +PayeeFSP <<-- Payee: OK +Switch <<- PayeeFSP: **PUT /quotes/** \n(transferAmount=99 USD,\npayeeReceiveAmount=100 USD,\npayeeFspCommission=1 USD) +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +PayerFSP <<- Switch: **PUT /quotes/**\n(transferAmount=99 USD,\npayeeReceiveAmount=100 USD,\npayeeFspCommission=1 USD) +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +Payer <<- PayerFSP: Payee will receive 100 USD\nand fee is 1 USD, you will receive\n1 USD in commission +deactivate PayerFSP +PayerOTC <<- Payer: You will receive 100 USD on your\naccount. Please give me 101 USD +PayerOTC ->> Payer: OK, here is 101 USD +Payer ->> PayerFSP: Perform transaction +activate PayerFSP +PayerFSP -> PayerFSP: Reserve 1 USD from Agent\ncommission to Payer account,\n100 USD from Payer account,\n99 USD to Switch account and 1\nUSD to fee account, 1 USD from\nFSP Commission to fee account +PayerFSP ->> Switch: **POST /transfers**\n(amount = 99 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch -> Switch: Reserve 99 USD from Payer FSP\naccount to Payee FSP account +Switch ->> PayeeFSP: **POST /transfers**\n(amount = 99 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Transfer 99 USD from Switch\naccount and 1 USD from\ninternal commission account\nto Payee account +PayeeFSP -> Payee: You have Cashed-in 100 USD +Switch <<- PayeeFSP: **PUT /transfers/** +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +Switch -> Switch: Commit reserved transfer +PayerFSP <<- Switch: **PUT /transfers/** +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Commit reserved transfer +Payer <- PayerFSP: Transaction successful, you have\nsent 100 USD and received\n1 USD in commission +deactivate PayerFSP +PayerOTC <- Payer: Thank you! +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure23.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure23.svg new file mode 100644 index 000000000..84b41a512 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure23.svg @@ -0,0 +1,252 @@ + + + + + + + + + + + + + + + + + + + + + + + + Payer + (OTC) + + + + Payer +   + + + +   + Payer + FSP + +   +   + Switch + +   + Payee + FSP + + Payee +   + + + + + + + + + + + + I would like to Cash-in + so that I receive 100 USD + + + + OK, you will receive a + notification from your FSP + displaying the fees + + + + I would like Agent (Payee) to + receive 100 USD + + + + + Fee is 2 USD in Payer + FSP for Cash-in, + Payer will receive 1 + USD in internal commission. + + + + POST /quotes + (amountType=RECEIVE, + amount=100 USD, fees=2 USD) + + + + HTTP 202 + (Accepted) + + + + POST /quotes + (amountType=RECEIVE, + amount=100 USD, fees=2 USD) + + + + HTTP 202 + (Accepted) + + + + + Payee FSP decides to give + 1 USD in commission to + Payer so that + Cash-in only costs 1 USD + + + + By paying 101 USD in cash + to Payer, you will receive + 100 USD to your account + + + + OK + + + + PUT /quotes/ + <ID> +   + (transferAmount=99 USD, + payeeReceiveAmount=100 USD, + payeeFspCommission=1 USD) + + + + HTTP 200 + (OK) + + + + PUT /quotes/ + <ID> + (transferAmount=99 USD, + payeeReceiveAmount=100 USD, + payeeFspCommission=1 USD) + + + + HTTP 200 + (OK) + + + + Payee will receive 100 USD + and fee is 1 USD, you will receive + 1 USD in commission + + + + You will receive 100 USD on your + account. Please give me 101 USD + + + + OK, here is 101 USD + + + + Perform transaction + + + + + Reserve 1 USD from Agent + commission to Payer account, + 100 USD from Payer account, + 99 USD to Switch account and 1 + USD to fee account, 1 USD from + FSP Commission to fee account + + + + POST /transfers + (amount = 99 USD) + + + + HTTP 202 + (Accepted) + + + + + Reserve 99 USD from Payer FSP + account to Payee FSP account + + + + POST /transfers + (amount = 99 USD) + + + + HTTP 202 + (Accepted) + + + + + Transfer 99 USD from Switch + account and 1 USD from + internal commission account + to Payee account + + + You have Cashed-in 100 USD + + + + PUT /transfers/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + + PUT /transfers/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + Transaction successful, you have + sent 100 USD and received + 1 USD in commission + + + Thank you! + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure25.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure25.plantuml new file mode 100644 index 000000000..97b9d89ee --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure25.plantuml @@ -0,0 +1,163 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Customer-Initiated Merchant Payment example + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payee/Payer(OTC) + +' declare actors +actor "<$actor>\nPayer\n" as Payer +participant "\nPayer\nFSP" as PayerFSP +participant "\n\nSwitch" as Switch +participant "\nPayee\nFSP" as PayeeFSP +actor "<$actor>\nPayee\n" as Payee +actor "<$actor>\nPayer\n(OTC)" as PayerOTC + +' start flow +Payee <<- PayerOTC: I would like to buy\nthis goods or service +Payee ->> PayerOTC: The goods or service cost\n100 USD before any fees,\nplease initiate the transaction +Payer ->> PayerFSP: I would like Payee to\nreceive 100 USD +activate PayerFSP +PayerFSP ->> Switch: **POST /quotes**\n(amountType=RECEIVE,\namount=100 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **POST /quotes**\n(amountType=RECEIVE,\namount=100 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Interoperable fee is 0 USD in\nPayee FSP for Merchant\nPayment, but 1 USD in\ninternal Payee fee for Merchant +Switch <<- PayeeFSP: **PUT /quotes/**\n(transferAmount=100 USD) +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +PayerFSP <<- Switch: **PUT /quotes/**\n(transferAmount=100 USD) +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Fee is 1 USD in Payer\nFSP for Merchant Payment,\ntotal fee is 1 USD +Payer <<- PayerFSP: Will you approve Merchant Payment\nof 100 USD to Payee? It will\ncost you 1 USD in fees. +deactivate PayerFSP +Payer ->> PayerFSP: Perform transaction +activate PayerFSP +PayerFSP -> PayerFSP: Reserve 101 USD from Payer\naccount, 100 USD to Switch\naccount and 1 USD to\nfee account +PayerFSP ->> Switch: **POST /transfers**\n(amount=100 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch -> Switch: Reserve 100 USD from Payer FSP\naccount to Payee FSP account +Switch ->> PayeeFSP: **POST /transfers**\n(amount=100 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Transfer 100 USD from Switch\naccount to Payee account, 1 USD\nfrom Payee to fee account +PayeeFSP -> Payee: You have received 100 USD\nfrom Payer and paid 1 USD\nin internal fee. Please give\ngoods or service to Payer. +Payee ->> PayerOTC: Here is your goods or service +Switch <<- PayeeFSP: **PUT /transfers/** +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +Switch -> Switch: Commit reserved transfer +PayerFSP <<- Switch: **PUT /transfers/** +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Commit reserved transfer +Payer <- PayerFSP: Payment successful, you\nhave paid 100 USD to Payee\nplus 1 USD in fees +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure25.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure25.svg new file mode 100644 index 000000000..54293ab7b --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure25.svg @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + Payer +   + + + +   + Payer + FSP + +   +   + Switch + +   + Payee + FSP + + Payee +   + + + + Payer + (OTC) + + + + + + + + + + + + I would like to buy + this goods or service + + + + The goods or service cost + 100 USD before any fees, + please initiate the transaction + + + + I would like Payee to + receive 100 USD + + + + POST /quotes + (amountType=RECEIVE, + amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + POST /quotes + (amountType=RECEIVE, + amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + + Interoperable fee is 0 USD in + Payee FSP for Merchant + Payment, but 1 USD in + internal Payee fee for Merchant + + + + PUT /quotes/ + <ID> + (transferAmount=100 USD) + + + + HTTP 200 + (OK) + + + + PUT /quotes/ + <ID> + (transferAmount=100 USD) + + + + HTTP 200 + (OK) + + + + + Fee is 1 USD in Payer + FSP for Merchant Payment, + total fee is 1 USD + + + + Will you approve Merchant Payment + of 100 USD to Payee? It will + cost you 1 USD in fees. + + + + Perform transaction + + + + + Reserve 101 USD from Payer + account, 100 USD to Switch + account and 1 USD to + fee account + + + + POST /transfers + (amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + + Reserve 100 USD from Payer FSP + account to Payee FSP account + + + + POST /transfers + (amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + + Transfer 100 USD from Switch + account to Payee account, 1 USD + from Payee to fee account + + + You have received 100 USD + from Payer and paid 1 USD + in internal fee. Please give + goods or service to Payer. + + + + Here is your goods or service + + + + PUT /transfers/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + + PUT /transfers/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + Payment successful, you + have paid 100 USD to Payee + plus 1 USD in fees + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure27.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure27.plantuml new file mode 100644 index 000000000..41fcc2b28 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure27.plantuml @@ -0,0 +1,163 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Customer-Initiated Cash-Out example (receive amount) + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payee/Payer(Agent/OTC) + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "\nSwitch" as Switch +participant "Payee\nFSP" as PayeeFSP +actor "<$actor>\nPayee\n(Agent)" as Payee +actor "<$actor>\nPayer\n(OTC)" as PayerOTC + +' start flow +Payee <<- PayerOTC: I would like to\nCash-Out 100 USD +Payee ->> PayerOTC: Please initiate the transaction +Payer ->> PayerFSP: I would like to Cash-Out\n100 USD from Agent (Payee) +activate PayerFSP +PayerFSP ->> Switch: **POST /quotes**\n(amountType=RECEIVE,\namount=100 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **POST /quotes**\n(amountType=RECEIVE,\namount=100 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Fee is 2 USD in Payee\nFSP to cover agent\ncommission, agent will receive\n1 USD in agent commission +Switch <<- PayeeFSP: **PUT /quotes/** \n(transferAmount=102 USD,\nPayFspFee=2 USD) +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +PayerFSP <<- Switch: **PUT /quotes/**\n(transferAmount=102 USD,\npayeeFspFee=2 USD) +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Payer fee is 1 USD in Payer\nFSP for Cash-Out, total fee\nis 3 USD +Payer <<- PayerFSP: Will you approve Cash-Out\nof 100 USD? It will\ncost you 3 USD in fees. +deactivate PayerFSP +Payer ->> PayerFSP: Perform transaction +activate PayerFSP +PayerFSP -> PayerFSP: Reserve 103 USD from Payer\naccount, 102 USD to Switch\naccount and 1 USD to\nfee account +PayerFSP ->> Switch: **POST /transfers**\n(amount=102 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch -> Switch: Reserve 102 USD from Payer FSP\naccount to Payee FSP account +Switch ->> PayeeFSP: **POST /transfers**\n(amount=102 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Transfer 102 USD from Switch\naccount, 101 USD to Payee\n(1 USD commission), and\n1 USD to fee account +PayeeFSP ->> Payee: You have received 100 USD\nfrom Payer plus 1 USD in\ncommission, please give 100 USD\nin cash to Payer +Payee ->> PayerOTC: Here is your 100 USD in cash +Switch <<- PayeeFSP: **PUT /transfers/** +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +Switch -> Switch: Commit reserved transfer +PayerFSP <<- Switch: **PUT /transfers/** +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Commit reserved transfer +Payer <<- PayerFSP: Transaction successful,\nyou should receive 100 USD\nin cash from Payee. You have\npaid 3 USD in fees. +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure27.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure27.svg new file mode 100644 index 000000000..45e0d08a2 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure27.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + +   + Switch + + Payee + FSP + + Payee + (Agent) + + + + Payer + (OTC) + + + + + + + + + + + + I would like to + Cash-Out 100 USD + + + + Please initiate the transaction + + + + I would like to Cash-Out + 100 USD from Agent (Payee) + + + + POST /quotes + (amountType=RECEIVE, + amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + POST /quotes + (amountType=RECEIVE, + amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + + Fee is 2 USD in Payee + FSP to cover agent + commission, agent will receive + 1 USD in agent commission + + + + PUT /quotes/ + <ID> +   + (transferAmount=102 USD, + PayFspFee=2 USD) + + + + HTTP 200 + (OK) + + + + PUT /quotes/ + <ID> + (transferAmount=102 USD, + payeeFspFee=2 USD) + + + + HTTP 200 + (OK) + + + + + Payer fee is 1 USD in Payer + FSP for Cash-Out, total fee + is 3 USD + + + + Will you approve Cash-Out + of 100 USD? It will + cost you 3 USD in fees. + + + + Perform transaction + + + + + Reserve 103 USD from Payer + account, 102 USD to Switch + account and 1 USD to + fee account + + + + POST /transfers + (amount=102 USD) + + + + HTTP 202 + (Accepted) + + + + + Reserve 102 USD from Payer FSP + account to Payee FSP account + + + + POST /transfers + (amount=102 USD) + + + + HTTP 202 + (Accepted) + + + + + Transfer 102 USD from Switch + account, 101 USD to Payee + (1 USD commission), and + 1 USD to fee account + + + + You have received 100 USD + from Payer plus 1 USD in + commission, please give 100 USD + in cash to Payer + + + + Here is your 100 USD in cash + + + + PUT /transfers/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + + PUT /transfers/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + + Transaction successful, + you should receive 100 USD + in cash from Payee. You have + paid 3 USD in fees. + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure29.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure29.plantuml new file mode 100644 index 000000000..e6886c6b9 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure29.plantuml @@ -0,0 +1,164 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Customer-Initiated Cash-Out example (send amount) + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payee/Payer(Agent/OTC) + +' declare actors +actor "<$actor>\nPayer\n" as Payer +participant "\nPayer\nFSP" as PayerFSP +participant "\n\nSwitch" as Switch +participant "\nPayee\nFSP" as PayeeFSP +actor "<$actor>\nPayee\n(Agent)" as Payee +actor "<$actor>\nPayer\n(OTC)" as PayerOTC + +' start flow +Payee <<- PayerOTC: I would like to\nCash-Out 100 USD +Payee ->> PayerOTC: Please initiate the transaction +Payer ->> PayerFSP: I would like to Cash-Out from\nAgent (Payee) so that 100 USD is\nwithdrawn from my account +activate PayerFSP +PayerFSP -> PayerFSP: Fee is 1 USD in Payer\nFSP from Cash-Out +PayerFSP ->> Switch: **POST /quotes**\n(amountType=SEND,\namount=99 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **POST /quotes**\n(amountType=SEND,\namount=99 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Fee is 2 USD in Payee FSP to\ncover agent commission, agent will\nreceive 1 USD in internal commission +Switch <<- PayeeFSP: **PUT /quotes/** \n(transferAmount=99 USD,\nPayeeFspFee=2 USD) +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +PayerFSP <<- Switch: **PUT /quotes/**\n(transferAmount=99 USD,\npayeeFspFee=2 USD) +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Calculate Payee receive amount\nas not sent from Payee FSP\n(transferAmount -\npayeeFspFee=97 USD) +Payer <<- PayerFSP: Will you approve Cash-Out\nof 97 USD? It will\ncost you 3 USD in fees. +deactivate PayerFSP +Payer ->> PayerFSP: Perform transaction +activate PayerFSP +PayerFSP -> PayerFSP: Reserve 100 USD from Payer\naccount, 99 USD to Switch\naccount and 1 USD to\nfee account +PayerFSP ->> Switch: **POST /transfers**\n(amount=99 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch -> Switch: Reserve 99 USD from Payer FSP\naccount to Payee FSP account +Switch ->> PayeeFSP: **POST /transfers**\n(amount=99 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Transfer 99 USD from Switch\naccount, 2 USD to fee account and\n98 USD (including 1 USD in\ncommission) to Payee +PayeeFSP ->> Payee: You have received 97 USD\nfrom Payer plus 1 USD in\ncommission, please give 97 USD\nin cash to Payer +Payee ->> PayerOTC: Here is your 97 USD in cash +Switch <<- PayeeFSP: **PUT /transfers/** +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +Switch -> Switch: Commit reserved transfer +PayerFSP <<- Switch: **PUT /transfers/** +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Commit reserved transfer +Payer <<- PayerFSP: Transaction successful,\nyou should receive 97 USD\nin cash from Payee. You have\npaid 3 USD in fees. +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure29.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure29.svg new file mode 100644 index 000000000..8e1c5bd64 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure29.svg @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + + Payer +   + + + +   + Payer + FSP + +   +   + Switch + +   + Payee + FSP + + Payee + (Agent) + + + + Payer + (OTC) + + + + + + + + + + + + I would like to + Cash-Out 100 USD + + + + Please initiate the transaction + + + + I would like to Cash-Out from + Agent (Payee) so that 100 USD is + withdrawn from my account + + + + + Fee is 1 USD in Payer + FSP from Cash-Out + + + + POST /quotes + (amountType=SEND, + amount=99 USD) + + + + HTTP 202 + (Accepted) + + + + POST /quotes + (amountType=SEND, + amount=99 USD) + + + + HTTP 202 + (Accepted) + + + + + Fee is 2 USD in Payee FSP to + cover agent commission, agent will + receive 1 USD in internal commission + + + + PUT /quotes/ + <ID> +   + (transferAmount=99 USD, + PayeeFspFee=2 USD) + + + + HTTP 200 + (OK) + + + + PUT /quotes/ + <ID> + (transferAmount=99 USD, + payeeFspFee=2 USD) + + + + HTTP 200 + (OK) + + + + + Calculate Payee receive amount + as not sent from Payee FSP + (transferAmount - + payeeFspFee=97 USD) + + + + Will you approve Cash-Out + of 97 USD? It will + cost you 3 USD in fees. + + + + Perform transaction + + + + + Reserve 100 USD from Payer + account, 99 USD to Switch + account and 1 USD to + fee account + + + + POST /transfers + (amount=99 USD) + + + + HTTP 202 + (Accepted) + + + + + Reserve 99 USD from Payer FSP + account to Payee FSP account + + + + POST /transfers + (amount=99 USD) + + + + HTTP 202 + (Accepted) + + + + + Transfer 99 USD from Switch + account, 2 USD to fee account and + 98 USD (including 1 USD in + commission) to Payee + + + + You have received 97 USD + from Payer plus 1 USD in + commission, please give 97 USD + in cash to Payer + + + + Here is your 97 USD in cash + + + + PUT /transfers/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + + PUT /transfers/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + + Transaction successful, + you should receive 97 USD + in cash from Payee. You have + paid 3 USD in fees. + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure2_callback_timeout.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure2_callback_timeout.plantuml new file mode 100644 index 000000000..4834069c2 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure2_callback_timeout.plantuml @@ -0,0 +1,68 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml +' declare skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +' declare title +' title HTTP GET call flow + +' Actor Keys: +' participant - FSP, Peer FSP and Optional Switch + +' declare actors +participant "\nFSP" as FSP +participant "Optional\nSwitch" as Switch +participant "Peer\nFSP" as PEERFSP + +' start flow +FSP ->> Switch: **GET /service/**//// +activate FSP +activate Switch +FSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PEERFSP: **GET /service/**//// +activate PEERFSP +Switch <<-- PEERFSP: **HTTP 202** (Accepted) +PEERFSP -> PEERFSP: Lookup service\ninformation regarding\nservice with//// +Switch <<[#Red]- PEERFSP: **PUT /service/**////\n(Service object information) +Switch -->> PEERFSP: **HTTP 200** (OK) +deactivate PEERFSP +FSP <<[#Red]- Switch: **PUT /service/**////\n(Service object information) +FSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +FSP -> FSP: Handle service object\ninformation update +FSP -[hidden]> FSP +deactivate FSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure2_callback_timeout.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure2_callback_timeout.svg new file mode 100644 index 000000000..43254c4a9 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure2_callback_timeout.svg @@ -0,0 +1,79 @@ + + + + + + + + + + +   + FSP + + Optional + Switch + + Peer + FSP + + + + + + + GET /service/ + <ID> + + + + HTTP 202 + (Accepted) + + + + GET /service/ + <ID> + + + + HTTP 202 + (Accepted) + + + + + Lookup service + information regarding + service with + <ID> + + + + PUT /service/ + <ID> + (Service object information) + + + + HTTP 200 + (OK) + + + + PUT /service/ + <ID> + (Service object information) + + + + HTTP 200 + (OK) + + + + + Handle service object + information update + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure3.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure3.plantuml new file mode 100644 index 000000000..04af955c2 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure3.plantuml @@ -0,0 +1,59 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +' declare title +' title HTTP DELETE call flow + +' Actor Keys: +' participant - FSP and Account Lookup + +' declare actors +participant "\nFSP" as FSP +participant "Account\nLookup" as ALS + +' start flow +FSP ->> ALS: **DELETE /service/**//// +activate FSP +activate ALS +FSP <<-- ALS: **HTTP 202** (Accepted) +ALS -> ALS: Delete object\naccording to request +FSP <<- ALS: **PUT /service/**////\n(Delete object information) +FSP -->> ALS: **HTTP 200** (OK) +deactivate ALS +FSP -> FSP: Handle delete object\ninformation +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure3.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure3.svg new file mode 100644 index 000000000..abeab0e1e --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure3.svg @@ -0,0 +1,50 @@ + + + + + + + + +   + FSP + + Account + Lookup + + + + + + DELETE /service/ + <ID> + + + + HTTP 202 + (Accepted) + + + + + Delete object + according to request + + + + PUT /service/ + <ID> + (Delete object information) + + + + HTTP 200 + (OK) + + + + + Handle delete object + information + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure31.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure31.plantuml new file mode 100644 index 000000000..5f62c990d --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure31.plantuml @@ -0,0 +1,177 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Agent-Initiated Cash-Out example + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payee/Payer(Agent/OTC) + +' declare actors +actor "<$actor>\nPayer\n" as Payer +participant "\nPayer\nFSP" as PayerFSP +participant "\n\nSwitch" as Switch +participant "\nPayee\nFSP" as PayeeFSP +actor "<$actor>\nPayee\n(Agent)" as Payee +actor "<$actor>\nPayer\n(OTC)" as PayerOTC + +' start flow +Payee <<- PayerOTC: I would like to\nCash-Out 100 USD +PayeeFSP <<- Payee: I would like to receive\n100 USD from Payer +activate PayeeFSP +PayeeFSP ->> Switch: **POST /transactionRequest**\n(amount=100 USD) +activate Switch +PayeeFSP <<-- Switch: **HTTP 202** (Accepted) +PayerFSP <<- Switch: **POST /transactionRequests**\n(amount=100 USD) +activate PayerFSP +PayerFSP -->> Switch: **HTTP 202** (Accepted) +PayerFSP -> PayerFSP: Perform optional validation +PayerFSP ->> Switch: **PUT /transactionRequests/**\n(Received status) +PayerFSP <<-- Switch: **HTTP 200** (OK) +deactivate PayerFSP +Switch ->> PayeeFSP: **PUT /transactionRequests/**\n(Received status) +Switch <<-- PayeeFSP: **HTTP 200** (OK) +deactivate Switch +deactivate PayeeFSP +PayerFSP ->> Switch: **POST /quotes**\n(amountType=RECEIVE,\namount=100 USD) +activate PayerFSP +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **POST /quotes**\n(amountType=RECEIVE,\namount=100 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Fee is 2 USD in Payee FSP\nto cover agent\ncommission, agent will\nreceive 1 USD in commission +Switch <<- PayeeFSP: **PUT /quotes/**\n(transferAmount=102 USD,\npayeeFSPFee=2 USD) +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +Switch ->> PayerFSP: **PUT /quotes/**\n(transferAmount=102 USD,\npayeeFSPFee=2 USD) +Switch <<-- PayerFSP: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Payer fee is 1 USD in Payer\nFSP for Cash-Out, total fees\nare 3 USD +Payer <<- PayerFSP: Will you approve Cash-out of\n100 USD to Payee? It will\ncost you 3 USD in fees. +deactivate PayerFSP +Payer ->> PayerFSP: Perform transaction +activate PayerFSP +PayerFSP -> PayerFSP: Reserve 103 USD for Payer\naccount, 102 USD to Switch\naccount, 1 USD to fee account +PayerFSP ->> Switch: **POST /transfers**\n(amount=102 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch -> Switch: Reserve 102 USD from Payer FSP\naccount to Payee FSP account +Switch ->> PayeeFSP: **POST /transfers**\n(amount=102 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Transfer 102 USD from Switch\naccount, 101 USD to Payee\n(1 USD commission), and\n1 USD to fee account +PayeeFSP ->> Payee: You have received 100 USD\nfrom Payer plus 1 USD in\ncommission, please give 100 USD\nin cash to Payer +Payee ->> PayerOTC: Here is your 100 USD in cash +Switch <<- PayeeFSP: **PUT /transfers/** +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +Switch -> Switch: Commit reserved transfer +PayerFSP <<- Switch: **PUT /transfers/** +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Commit reserved transfer +Payer <<- PayerFSP: Transaction successful,\nyou should receive 100 USD\nin cash from Payee. You have\npaid 3 USD in fees. +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure31.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure31.svg new file mode 100644 index 000000000..ee320e69b --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure31.svg @@ -0,0 +1,280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Payer +   + + + +   + Payer + FSP + +   +   + Switch + +   + Payee + FSP + + Payee + (Agent) + + + + Payer + (OTC) + + + + + + + + + + + + + + + I would like to + Cash-Out 100 USD + + + + I would like to receive + 100 USD from Payer + + + + POST /transactionRequest + (amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + POST /transactionRequests + (amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + + Perform optional validation + + + + PUT /transactionRequests/ + <ID> + (Received status) + + + + HTTP 200 + (OK) + + + + PUT /transactionRequests/ + <ID> + (Received status) + + + + HTTP 200 + (OK) + + + + POST /quotes + (amountType=RECEIVE, + amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + POST /quotes + (amountType=RECEIVE, + amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + + Fee is 2 USD in Payee FSP + to cover agent + commission, agent will + receive 1 USD in commission + + + + PUT /quotes/ + <ID> + (transferAmount=102 USD, + payeeFSPFee=2 USD) + + + + HTTP 200 + (OK) + + + + PUT /quotes/ + <ID> + (transferAmount=102 USD, + payeeFSPFee=2 USD) + + + + HTTP 200 + (OK) + + + + + Payer fee is 1 USD in Payer + FSP for Cash-Out, total fees + are 3 USD + + + + Will you approve Cash-out of + 100 USD to Payee? It will + cost you 3 USD in fees. + + + + Perform transaction + + + + + Reserve 103 USD for Payer + account, 102 USD to Switch + account, 1 USD to fee account + + + + POST /transfers + (amount=102 USD) + + + + HTTP 202 + (Accepted) + + + + + Reserve 102 USD from Payer FSP + account to Payee FSP account + + + + POST /transfers + (amount=102 USD) + + + + HTTP 202 + (Accepted) + + + + + Transfer 102 USD from Switch + account, 101 USD to Payee + (1 USD commission), and + 1 USD to fee account + + + + You have received 100 USD + from Payer plus 1 USD in + commission, please give 100 USD + in cash to Payer + + + + Here is your 100 USD in cash + + + + PUT /transfers/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + + PUT /transfers/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + + Transaction successful, + you should receive 100 USD + in cash from Payee. You have + paid 3 USD in fees. + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure33.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure33.plantuml new file mode 100644 index 000000000..188829960 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure33.plantuml @@ -0,0 +1,177 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Merchant-Initiated Merchant Payment example + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payee/Payer(OTC/Agent) + +' declare actors +actor "<$actor>\nPayer\n" as Payer +participant "\nPayer\nFSP" as PayerFSP +participant "\n\nSwitch" as Switch +participant "\nPayee\nFSP" as PayeeFSP +actor "<$actor>\nPayee\n(Agent)" as Payee +actor "<$actor>\nPayer\n(OTC)" as PayerOTC + +' start flow +Payee <<- PayerOTC: I would like to buy goods\nor service for 100 USD +PayeeFSP <<- Payee: I would like to receive\n100 USD from Payer +activate PayeeFSP +PayeeFSP ->> Switch: **POST /transactionRequests**\n(amount=100 USD) +activate Switch +PayeeFSP <<-- Switch: **HTTP 202** (Accepted) +PayerFSP <<- Switch: **POST /transactionRequests**\n(amount=100 USD) +activate PayerFSP +PayerFSP -->> Switch: **HTTP 202** (Accepted) +PayerFSP -> PayerFSP: Perform optional validation +PayerFSP ->> Switch: **PUT /transactionRequests/**\n(Receives status) +PayerFSP <<-- Switch: **HTTP 200** (OK) +deactivate PayerFSP +Switch ->> PayeeFSP: **PUT /transactionRequests/**\n(Received status) +Switch <<-- PayeeFSP: **HTTP 200** (OK) +deactivate Switch +deactivate PayeeFSP +PayerFSP ->> Switch: **POST /quotes**\n(amountType=RECEIVE,\namount=100 USD) +activate PayerFSP +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **POST /quotes**\n(amountType=RECEIVE,\namount=100 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Fee is 0 USD +Switch <<- PayeeFSP: **PUT /quotes/**\n(transferAmount=100 USD) +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +Switch ->> PayerFSP: **PUT /quotes/**\n(transferAmount=100 USD) +Switch <<-- PayerFSP: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Payer fee is 1 USD in Payer\nFSP for Merchant Payment +Payer <<- PayerFSP: Will you approve Merchant Payment\nof 100 USD to Payee? It will\ncost you 1 USD in fees. +deactivate PayerFSP +Payer ->> PayerFSP: Perform transaction +activate PayerFSP +PayerFSP -> PayerFSP: Reserve 101 USD from Payer\naccount, 100 USD to Switch\naccount, 1 USD to fee account +PayerFSP ->> Switch: **POST /transfers**\n(amount=100 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch -> Switch: Reserve 100 USD from Payer FSP\naccount to Payee FSP account +Switch ->> PayeeFSP: **POST /transfers**\n(amount=100 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Transfer 100 USD from Switch\naccount to Payee account +PayeeFSP ->> Payee: You have received 100 USD\nfrom Payer. Please give goods\nor service to Payer +Payee ->> PayerOTC: Here is your goods or service +Switch <<- PayeeFSP: **PUT /transfers/** +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +Switch -> Switch: Commit reserved transfer +PayerFSP <<- Switch: **PUT /transfers/** +PayerFSP ->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Commit reserved transfer +Payer <<- PayerFSP: Transaction successful,\nyou have paid 100 USD to Payee\nplus 1 USD in fees. +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure33.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure33.svg new file mode 100644 index 000000000..67ccb5047 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure33.svg @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Payer +   + + + +   + Payer + FSP + +   +   + Switch + +   + Payee + FSP + + Payee + (Agent) + + + + Payer + (OTC) + + + + + + + + + + + + + + + I would like to buy goods + or service for 100 USD + + + + I would like to receive + 100 USD from Payer + + + + POST /transactionRequests + (amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + POST /transactionRequests + (amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + + Perform optional validation + + + + PUT /transactionRequests/ + <ID> + (Receives status) + + + + HTTP 200 + (OK) + + + + PUT /transactionRequests/ + <ID> + (Received status) + + + + HTTP 200 + (OK) + + + + POST /quotes + (amountType=RECEIVE, + amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + POST /quotes + (amountType=RECEIVE, + amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + + Fee is 0 USD + + + + PUT /quotes/ + <ID> + (transferAmount=100 USD) + + + + HTTP 200 + (OK) + + + + PUT /quotes/ + <ID> + (transferAmount=100 USD) + + + + HTTP 200 + (OK) + + + + + Payer fee is 1 USD in Payer + FSP for Merchant Payment + + + + Will you approve Merchant Payment + of 100 USD to Payee? It will + cost you 1 USD in fees. + + + + Perform transaction + + + + + Reserve 101 USD from Payer + account, 100 USD to Switch + account, 1 USD to fee account + + + + POST /transfers + (amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + + Reserve 100 USD from Payer FSP + account to Payee FSP account + + + + POST /transfers + (amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + + Transfer 100 USD from Switch + account to Payee account + + + + You have received 100 USD + from Payer. Please give goods + or service to Payer + + + + Here is your goods or service + + + + PUT /transfers/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + + PUT /transfers/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + + Transaction successful, + you have paid 100 USD to Payee + plus 1 USD in fees. + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure35.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure35.plantuml new file mode 100644 index 000000000..1bbc06eb6 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure35.plantuml @@ -0,0 +1,205 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title ATM-Initiated Cash-Out example + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payee/Payer(OTC/Agent) + +' declare actors +actor "<$actor>\nPayer\n" as Payer +participant "\nPayer\nFSP" as PayerFSP +participant "\n\nSwitch" as Switch +participant "\nPayee\nFSP" as PayeeFSP +actor "<$actor>\nPayee\n(ATM)" as PayeeATM +actor "<$actor>\nPayer\n(OTC)" as PayerOTC + +' start flow +Payer -> PayerFSP: Pre-generate OTP for me so that\nI can use it for ATM Cash-Out +activate PayerFSP +PayerFSP -> PayerFSP: Generate OTP +Payer <<-- PayerFSP: "12345 is your OTP" +deactivate PayerFSP +PayeeATM <<- PayerOTC: I would like to\nCash-Out 100 USD +PayeeFSP <<- PayeeATM: I would like to receive\n100 USD from Payer +activate PayeeFSP +PayeeFSP ->> Switch: **POST /transactionRequests**\n(amount=100 USD) +activate Switch +PayeeFSP <<-- Switch: **HTTP 202** (Accepted) +PayerFSP <<- Switch: **POST /transactionRequests**\n(amount=100 USD) +activate PayerFSP +PayerFSP -->> Switch: **HTTP 202** (Accepted) +PayerFSP -> PayerFSP: Perform optional validation +PayerFSP ->> Switch: **PUT /transactionRequests/**\n(Received status) +PayerFSP <<-- Switch: **HTTP 200** (OK) +deactivate PayerFSP +Switch ->> PayeeFSP: **PUT /transactionRequests/**\n(Received status) +Switch <<-- PayeeFSP: **HTTP 200** (OK) +deactivate Switch +deactivate PayeeFSP +PayerFSP ->> Switch: **POST /quotes**\n(amountType=RECEIVE,\namount=100 USD) +activate PayerFSP +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **POST /quotes**\n(amountType=RECEIVE,\namount=100 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Payer fee is 1 USD for\nATM Cash-Out +Switch <<- PayeeFSP: **PUT /quotes/**\n(transferAmount=101 USD,\npayeeFspFee=1 USD) +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +Switch ->> PayerFSP: **PUT /quotes/**\n(transferAmount=101 USD,\npayeeFspFee=1 USD) +Switch <<-- PayerFSP: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Payer fee is 1 USD in Payer FSP\nfor ATM Cash-Out, total fee 2 USD +PayerFSP -[hidden]> Switch +deactivate PayerFSP +PayerFSP -[hidden]> Switch +activate PayerFSP +PayerFSP -> PayerFSP: OTP is pre-generated +Payer <<- PayerFSP: Use you pre-generated OTP to accept\ntransaction of 100 USD, 2 USD\nin fees. +PayerFSP ->> Switch: **GET /authorizations/**\n{TransactionRequestID}\n(amount=100 USD, fees=2 USD,\nretriesLeft=2, type=OTP) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **GET /authorizations/**\n{TransactionRequestID}\n(amount=100 USD, fees=2 USD,\nretriesLeft=2, type=OTP) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP ->> PayeeATM: Total fee for Cash-Out of\n100 USD is 2 USD +PayeeATM ->> PayerOTC: Please enter you OTP\nto confirm Cash-Out of 100 USD,\nfee is 2 USD +PayeeATM <<- PayerOTC: Enters "12345" +PayeeFSP <<- PayeeATM: "12345" is the OTP +Switch <<- PayeeFSP: **PUT /authorizations/**\n{transactionRequestID}\n(otp="12345") +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +PayerFSP <<- Switch: **PUT /authorizations/**\n{transactionRequestID}\n(otp="12345") +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Validate OTP sent by Payee FSP,\nOTP OK +PayerFSP -[hidden]> Switch +deactivate PayerFSP +PayerFSP -[hidden]> Switch +activate PayerFSP +PayerFSP -> PayerFSP: Reserve 102 USD from Payer\naccount, 101 USD to Switch\naccount, 1 USD to fee account +PayerFSP ->> Switch: **POST /transfers**\n(amount=101 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch -> Switch: Reserve 101 USD from Payer FSP\naccount to Payee FSP account +Switch ->> PayeeFSP: **POST /transfers**\n(amount=101 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Transfer 101 USD from Switch\naccount, 100 USD to Payee,\n1 USD to fee account +PayeeFSP ->> PayeeATM: Dispense 100 USD in Cash +PayeeATM ->> PayerOTC: Here is your 100 USD in cash +Switch <<- PayeeFSP: **PUT /transfers/** +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +Switch <- Switch: Commit reserved transfer +Switch ->> PayerFSP: **PUT /transfers/** +Switch <<-- PayerFSP: **HTTP 200** (OK) +deactivate Switch +PayerFSP <- PayerFSP: Commit reserved transfer +Payer <- PayerFSP: Transfer successful,\nyou should receive 100 USD\nin cash from ATM. You have\npaid 2 USD in fees. +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure35.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure35.svg new file mode 100644 index 000000000..7ca43eff6 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure35.svg @@ -0,0 +1,365 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Payer +   + + + +   + Payer + FSP + +   +   + Switch + +   + Payee + FSP + + Payee + (ATM) + + + + Payer + (OTC) + + + + + + + + + + + + + + + + + + Pre-generate OTP for me so that + I can use it for ATM Cash-Out + + + + + Generate OTP + + + + "12345 is your OTP" + + + + I would like to + Cash-Out 100 USD + + + + I would like to receive + 100 USD from Payer + + + + POST /transactionRequests + (amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + POST /transactionRequests + (amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + + Perform optional validation + + + + PUT /transactionRequests/ + <ID> + (Received status) + + + + HTTP 200 + (OK) + + + + PUT /transactionRequests/ + <ID> + (Received status) + + + + HTTP 200 + (OK) + + + + POST /quotes + (amountType=RECEIVE, + amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + POST /quotes + (amountType=RECEIVE, + amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + + Payer fee is 1 USD for + ATM Cash-Out + + + + PUT /quotes/ + <ID> + (transferAmount=101 USD, + payeeFspFee=1 USD) + + + + HTTP 200 + (OK) + + + + PUT /quotes/ + <ID> + (transferAmount=101 USD, + payeeFspFee=1 USD) + + + + HTTP 200 + (OK) + + + + + Payer fee is 1 USD in Payer FSP + for ATM Cash-Out, total fee 2 USD + + + + + OTP is pre-generated + + + + Use you pre-generated OTP to accept + transaction of 100 USD, 2 USD + in fees. + + + + GET /authorizations/ + {TransactionRequestID} + (amount=100 USD, fees=2 USD, + retriesLeft=2, type=OTP) + + + + HTTP 202 + (Accepted) + + + + GET /authorizations/ + {TransactionRequestID} + (amount=100 USD, fees=2 USD, + retriesLeft=2, type=OTP) + + + + HTTP 202 + (Accepted) + + + + Total fee for Cash-Out of + 100 USD is 2 USD + + + + Please enter you OTP + to confirm Cash-Out of 100 USD, + fee is 2 USD + + + + Enters "12345" + + + + "12345" is the OTP + + + + PUT /authorizations/ + {transactionRequestID} + (otp="12345") + + + + HTTP 200 + (OK) + + + + PUT /authorizations/ + {transactionRequestID} + (otp="12345") + + + + HTTP 200 + (OK) + + + + + Validate OTP sent by Payee FSP, + OTP OK + + + + + Reserve 102 USD from Payer + account, 101 USD to Switch + account, 1 USD to fee account + + + + POST /transfers + (amount=101 USD) + + + + HTTP 202 + (Accepted) + + + + + Reserve 101 USD from Payer FSP + account to Payee FSP account + + + + POST /transfers + (amount=101 USD) + + + + HTTP 202 + (Accepted) + + + + + Transfer 101 USD from Switch + account, 100 USD to Payee, + 1 USD to fee account + + + + Dispense 100 USD in Cash + + + + Here is your 100 USD in cash + + + + PUT /transfers/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + + PUT /transfers/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + Transfer successful, + you should receive 100 USD + in cash from ATM. You have + paid 2 USD in fees. + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure37.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure37.plantuml new file mode 100644 index 000000000..04e62ac13 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure37.plantuml @@ -0,0 +1,196 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Merchant-Initiated Merchant Payment authorized on POS example + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payee/Payer(OTC/Agent) + +' declare actors +actor "<$actor>\nPayer\n" as Payer +participant "\nPayer\nFSP" as PayerFSP +participant "\n\nSwitch" as Switch +participant "\nPayee\nFSP" as PayeeFSP +actor "<$actor>\nPayee\n(POS)" as PayeePOS +actor "<$actor>\nPayer\n(OTC)" as PayerOTC + +' start flow +PayeePOS <<- PayerOTC: I would like to buy goods\nor service for 100 USD +PayeeFSP <<- PayeePOS: I would like to receive\n100 USD from Payer +activate PayeeFSP +PayeeFSP ->> Switch: **POST /transactionRequests**\n(amount=100 USD) +activate Switch +PayeeFSP <<-- Switch: **HTTP 202** (Accepted) +activate PayerFSP +PayerFSP <<- Switch: **POST /transactionRequests**\n(amount=100 USD) +PayerFSP -->> Switch: **HTTP 202** (Accepted) +PayerFSP -> PayerFSP: Perform optional validation +PayerFSP ->> Switch: **PUT /transactionRequests/**\n(Received status) +PayerFSP <<-- Switch: **HTTP 200** (OK) +deactivate PayerFSP +Switch ->> PayeeFSP: **PUT /transactionRequests/**\n(Received status) +Switch <<-- PayeeFSP: **HTTP 200** (OK) +deactivate Switch +deactivate PayeeFSP +PayerFSP ->> Switch: **POST /quotes**\n(amount=100 USD,\namountType=RECEIVE) +activate PayerFSP +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **POST /quotes**\n(amount=100 USD,\namountType=RECEIVE) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: FSP Commission is 1 USD\nin Payee FSP for\nMerchant Payment +Switch <<- PayeeFSP: **PUT /quotes/**\n(transferAmount=99 USD,\npayeeFspCommission=1 USD) +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +Switch ->> PayerFSP: **PUT /quotes/**\n(transferAmount=99 USD,\npayeeFspCommission=1 USD) +Switch <<-- PayerFSP: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Payer FSP uses the\nFSP commission as\na transaction fee +PayerFSP -[hidden]> Switch +deactivate PayerFSP +PayerFSP -[hidden]> Switch +activate PayerFSP +PayerFSP -> PayerFSP: Generate OTP, "12345" +Payer <<- PayerFSP: Use OTP "12345" to accept\ntransaction to Merchant of 100 USD,\n0 USD in fees. +PayerFSP ->> Switch: **GET /authorizations/**\n{TransactionRequestID}\n(amount=100 USD, fees=0 USD,\nretriesLeft=2, type=OTP) +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **GET /authorizations/**\n{TransactionRequestID}\n(amount=100 USD, fees=0 USD,\nretriesLeft=2, type=OTP) +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP ->> PayeePOS: Total amount is 100 USD,\nfee is 0 USD +PayeePOS ->> PayerOTC: Please enter you OTP\nto confirm Merchant Payment\nof 100 USD, fee is 0 USD +PayeePOS <<- PayerOTC: Enters "12345" +PayeeFSP <<- PayeePOS: "12345" is the OTP +Switch <<- PayeeFSP: **PUT /authorizations/***\n{transactionRequestID}\n(otp="12345") +Switch -->> PayeeFSP: **HTTP 200** (OK) +PayerFSP <<- Switch: **PUT /authorizations/***\n{transactionRequestID}\n(otp="12345") +PayerFSP -->> Switch: **HTTP 200** (OK) +PayerFSP -> PayerFSP: Validate OTP sent by Payee FSP,\nOTP OK +PayerFSP -[hidden]> Switch +deactivate PayerFSP +PayerFSP -[hidden]> Switch +activate PayerFSP +PayerFSP -> PayerFSP: Reserve 100 USD from Payer\naccount, 99 USD to Switch\naccount, 1 USD to fee account +PayerFSP ->> Switch: **POST /transfers**\n(amount=99 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch -> Switch: Reserve 99 USD from Payer FSP\naccount to Payee FSP account +Switch ->> PayeeFSP: **POST /transfers**\n(amount=99 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Transfer 99 USD from Switch\naccount, 1 USD from\ncommission account\nto Payee account +PayeeFSP ->> PayeePOS: You have received 100 USD\nfrom Payer. Please give goods\nor service to Payer. +PayeePOS ->> PayerOTC: Here is your goods or service +Switch <<- PayeeFSP: **PUT /transfers/** +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +Switch <- Switch: Commit reserved transfer +Switch ->> PayerFSP: **PUT /transfers/** +Switch <<-- PayerFSP: **HTTP 200** (OK) +deactivate Switch +PayerFSP <- PayerFSP: Commit reserved transfer +Payer <- PayerFSP: Payment successful, you\nhave paid 100 USD to Payee. +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure37.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure37.svg new file mode 100644 index 000000000..ffc7084e2 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure37.svg @@ -0,0 +1,351 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Payer +   + + + +   + Payer + FSP + +   +   + Switch + +   + Payee + FSP + + Payee + (POS) + + + + Payer + (OTC) + + + + + + + + + + + + + + + + I would like to buy goods + or service for 100 USD + + + + I would like to receive + 100 USD from Payer + + + + POST /transactionRequests + (amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + POST /transactionRequests + (amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + + Perform optional validation + + + + PUT /transactionRequests/ + <ID> + (Received status) + + + + HTTP 200 + (OK) + + + + PUT /transactionRequests/ + <ID> + (Received status) + + + + HTTP 200 + (OK) + + + + POST /quotes + (amount=100 USD, + amountType=RECEIVE) + + + + HTTP 202 + (Accepted) + + + + POST /quotes + (amount=100 USD, + amountType=RECEIVE) + + + + HTTP 202 + (Accepted) + + + + + FSP Commission is 1 USD + in Payee FSP for + Merchant Payment + + + + PUT /quotes/ + <ID> + (transferAmount=99 USD, + payeeFspCommission=1 USD) + + + + HTTP 200 + (OK) + + + + PUT /quotes/ + <ID> + (transferAmount=99 USD, + payeeFspCommission=1 USD) + + + + HTTP 200 + (OK) + + + + + Payer FSP uses the + FSP commission as + a transaction fee + + + + + Generate OTP, "12345" + + + + Use OTP "12345" to accept + transaction to Merchant of 100 USD, + 0 USD in fees. + + + + GET /authorizations/ + {TransactionRequestID} + (amount=100 USD, fees=0 USD, + retriesLeft=2, type=OTP) + + + + HTTP 202 + (Accepted) + + + + GET /authorizations/ + {TransactionRequestID} + (amount=100 USD, fees=0 USD, + retriesLeft=2, type=OTP) + + + + HTTP 202 + (Accepted) + + + + Total amount is 100 USD, + fee is 0 USD + + + + Please enter you OTP + to confirm Merchant Payment + of 100 USD, fee is 0 USD + + + + Enters "12345" + + + + "12345" is the OTP + + + + PUT /authorizations/ + * + {transactionRequestID} + (otp="12345") + + + + HTTP 200 + (OK) + + + + PUT /authorizations/ + * + {transactionRequestID} + (otp="12345") + + + + HTTP 200 + (OK) + + + + + Validate OTP sent by Payee FSP, + OTP OK + + + + + Reserve 100 USD from Payer + account, 99 USD to Switch + account, 1 USD to fee account + + + + POST /transfers + (amount=99 USD) + + + + HTTP 202 + (Accepted) + + + + + Reserve 99 USD from Payer FSP + account to Payee FSP account + + + + POST /transfers + (amount=99 USD) + + + + HTTP 202 + (Accepted) + + + + + Transfer 99 USD from Switch + account, 1 USD from + commission account + to Payee account + + + + You have received 100 USD + from Payer. Please give goods + or service to Payer. + + + + Here is your goods or service + + + + PUT /transfers/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + + PUT /transfers/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + Payment successful, you + have paid 100 USD to Payee. + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure39.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure39.plantuml new file mode 100644 index 000000000..187a75c8a --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure39.plantuml @@ -0,0 +1,162 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Refund example + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payee/Payer(OTC/Agent) + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "\nSwitch" as Switch +participant "Payee\nFSP" as PayeeFSP +actor "<$actor>\nPayee" as Payee + +' start flow +Payer ->> PayerFSP: I would like a Refund\nof my Agent Cash-in of 101 USD +activate PayerFSP +PayerFSP -> PayerFSP: Find original transaction, FSP\ncommission was 1 USD which\nmeans Payer FSP wants 1 USD\nin fee to reverse. +PayerFSP ->> Switch: **POST /quotes**\n(transactionScenario=REFUND\namountType=SEND,\namount=100 USD, fee=1 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202**\n(Accepted) +Switch ->> PayeeFSP: **POST /quotes**\n(transactionScenario=REFUND\namountType=SEND,\namount=100 USD, fee=1 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202**\n(Accepted) +PayeeFSP -> PayeeFSP:Find original transaction, 1 USD\nwas received in FSP commission, \ngive back in FSP commission.\nReverse Agent commission. +PayeeFSP ->> Payee:Customer wants a refund of Cash-in,\nyou will lose 1 USD in commission\nand 100 USD will be transfered to\nyour account, please pay customer\n101 USD in cash +PayeeFSP <<- Payee: OK +Switch <<- PayeeFSP: **PUT /quote/**\n(transferAmount=99 USD,\npayeeFspCommission=1 USD) +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +PayerFSP <<- Switch: **PUT /quote/**\n(transferAmount=99 USD,\npayeeFspCommission=1 USD) +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Payer gets fee subsizidized by\nFSP commission. +Payer <<- PayerFSP: By refunding 100 USD to Agent, you\nshould receive 101 USD in cash +deactivate PayerFSP +Payer ->> PayerFSP: Perform transaction +activate PayerFSP +PayerFSP -> PayerFSP: Reverse original transaction by\nreversing 100 USD from Payer\nAccount, 99 USD to Switch account,\n1 USD to commission account +PayerFSP ->> Switch: **POST /transfers**\n(amount=99 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch -> Switch: Reserve 99 USD from Payer FSP\naccount to Payee FSP account +Switch ->> PayeeFSP: **POST /transfer/** +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Reverse original transaction by\ntransferring 100 USD to Payee\naccount, 99 USD from Switch\naccount, 1 USD from fee account,\nand 1 USD from fee account to\ninternal commission account +PayeeFSP -> Payee: You have received 100 USD\nfrom Payer in Cash-in refund,\nplease pay customer his 101 USD +Switch <<- PayeeFSP: **POST /transfer/** +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +Switch -> Switch: Commit reserved transfer +PayerFSP <<- Switch: **POST /transfer/** +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Commit reserved transfer +Payer <- PayerFSP: Transaction successful,\nyou have paid 1 USD in fee +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure39.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure39.svg new file mode 100644 index 000000000..c10af8f4f --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure39.svg @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + +   + Switch + + Payee + FSP + + Payee + + + + + + + + + + + + I would like a Refund + of my Agent Cash-in of 101 USD + + + + + Find original transaction, FSP + commission was 1 USD which + means Payer FSP wants 1 USD + in fee to reverse. + + + + POST /quotes + (transactionScenario=REFUND + amountType=SEND, + amount=100 USD, fee=1 USD) + + + + HTTP 202 + (Accepted) + + + + POST /quotes + (transactionScenario=REFUND + amountType=SEND, + amount=100 USD, fee=1 USD) + + + + HTTP 202 + (Accepted) + + + + + Find original transaction, 1 USD + was received in FSP commission, + give back in FSP commission. + Reverse Agent commission. + + + + Customer wants a refund of Cash-in, + you will lose 1 USD in commission + and 100 USD will be transfered to + your account, please pay customer + 101 USD in cash + + + + OK + + + + PUT /quote/ + <ID> + (transferAmount=99 USD, + payeeFspCommission=1 USD) + + + + HTTP 200 + (OK) + + + + PUT /quote/ + <ID> + (transferAmount=99 USD, + payeeFspCommission=1 USD) + + + + HTTP 200 + (OK) + + + + + Payer gets fee subsizidized by + FSP commission. + + + + By refunding 100 USD to Agent, you + should receive 101 USD in cash + + + + Perform transaction + + + + + Reverse original transaction by + reversing 100 USD from Payer + Account, 99 USD to Switch account, + 1 USD to commission account + + + + POST /transfers + (amount=99 USD) + + + + HTTP 202 + (Accepted) + + + + + Reserve 99 USD from Payer FSP + account to Payee FSP account + + + + POST /transfer/ + <ID> + + + + HTTP 202 + (Accepted) + + + + + Reverse original transaction by + transferring 100 USD to Payee + account, 99 USD from Switch + account, 1 USD from fee account, + and 1 USD from fee account to + internal commission account + + + You have received 100 USD + from Payer in Cash-in refund, + please pay customer his 101 USD + + + + POST /transfer/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + + POST /transfer/ + <ID> + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + + + Transaction successful, + you have paid 1 USD in fee + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure4.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure4.plantuml new file mode 100644 index 000000000..db01171d2 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure4.plantuml @@ -0,0 +1,64 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +' declare title +' title HTTP PATCH call flow + +' Actor Keys: +' participant - Switch and FSP + +' declare actors +participant "Switch" as Switch +participant "FSP" as FSP + +' start flow +activate Switch +activate FSP +Switch ->> FSP: **POST /service/**//// +FSP -->> Switch: **HTTP 202** (Accepted) +FSP ->> FSP: Create object, state of \ncreated object is a \nnon-fiinalized state +FSP ->> Switch: **PUT /service/** \n(Non-finalized state) +Switch -->> FSP: **HTTP 200** (OK) +deactivate FSP +Switch ->> Switch: Handle callback, send\nnotificaction to FSP regarding\nthe object's finalized state +Switch ->> FSP: **PATCH /service/**\n(Finalized state) +activate FSP +FSP -->> Switch: **HTTP 202** (Accepted) +deactivate Switch +FSP ->> FSP: Update object's state\naccording to new\ninformation +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure4.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure4.svg new file mode 100644 index 000000000..4d6eb7612 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure4.svg @@ -0,0 +1,73 @@ + + + + + + + + + + Switch + + FSP + + + + + + + POST /service/ + <ID> + + + + HTTP 202 + (Accepted) + + + + + + Create object, state of + created object is a + non-fiinalized state + + + + PUT /service/ + <ID> + (Non-finalized state) + + + + HTTP 200 + (OK) + + + + + + Handle callback, send + notificaction to FSP regarding + the object's finalized state + + + + PATCH /service/ + <ID> + (Finalized state) + + + + HTTP 202 + (Accepted) + + + + + + Update object's state + according to new + information + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure41.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure41.plantuml new file mode 100644 index 000000000..ee5053cd8 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure41.plantuml @@ -0,0 +1,139 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title How to use the services provided by /participants if there is no common Account Lookup System + +' Actor Keys: +' participant - FSP(User's) and FSP +' actor - User + +' declare actors +actor "<$actor>\nUser" as user +participant "User's\nFSP" as userfsp +participant "\nFSP 1" as fsp1 +participant "\nFSP 2" as fsp2 + +' start flow +user ->> userfsp: I would like to pay or receive\nfunds to/from +123456789 +activate userfsp +userfsp -> userfsp: +123456789 is not\nwithin this system,\nask FSP 1 +userfsp ->> fsp1: **GET /participants/MSISDN/123456789** +activate fsp1 +userfsp <<-- fsp1: **HTTP 202** (Accepted) +fsp1 -> fsp1: +123456789 is not\nwithin this system +userfsp <<- fsp1: **PUT /participants/MSISDN/123456789/error** +userfsp -->> fsp1: **HTTP 200** (OK) +deactivate fsp1 +userfsp -> userfsp: Not in FSP 1, ask FSP 2 +userfsp ->> fsp2: **GET /participants/MSISDN/123456789** +activate fsp2 +userfsp <<-- fsp2: **HTTP 202** (Accepted) +fsp2 -> fsp2: +123456789 is\nwithin this system +userfsp <<- fsp2: **PUT /participants/MSISDN/123456789/error** +userfsp -->> fsp2: **HTTP 200** (OK) +deactivate fsp2 +userfsp -> userfsp: +123456789 found\nin FSP 2 +userfsp -[hidden]>fsp2 +deactivate userfsp +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure41.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure41.svg new file mode 100644 index 000000000..cf028451c --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure41.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + User + + + + User's + FSP + +   + FSP 1 + +   + FSP 2 + + + + + + + I would like to pay or receive + funds to/from +123456789 + + + + + +123456789 is not + within this system, + ask FSP 1 + + + + GET /participants/MSISDN/123456789 + + + + HTTP 202 + (Accepted) + + + + + +123456789 is not + within this system + + + + PUT /participants/MSISDN/123456789/error + + + + HTTP 200 + (OK) + + + + + Not in FSP 1, ask FSP 2 + + + + GET /participants/MSISDN/123456789 + + + + HTTP 202 + (Accepted) + + + + + +123456789 is + within this system + + + + PUT /participants/MSISDN/123456789/error + + + + HTTP 200 + (OK) + + + + + +123456789 found + in FSP 2 + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure42.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure42.plantuml new file mode 100644 index 000000000..05ba8f242 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure42.plantuml @@ -0,0 +1,128 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title How to use the services provided by /participants if there is no common Account Lookup System + +' Actor Keys: +' participant - FSP(User's) and Account Lookup Service +' actor - User + +' declare actors +actor "<$actor>\nUser" as user +participant "User's\nFSP" as userfsp +participant "Account\nLookup" as ALS + +' start flow +user ->> userfsp: I would like to pay or receive\nfunds to/from +123456789 +activate userfsp +userfsp -> userfsp: +123456789 is not\nwithin this system +userfsp ->> ALS: **GET /participants/MSISDN/123456789** +activate ALS +userfsp <<-- ALS: **HTTP 202** (Accepted) +ALS -> ALS: Lookup which FSP MSISDN\n+123456789 belongs to. +userfsp <<- ALS: **PUT /participants/MSISDN/123456789**\n(FSP ID) +userfsp -->> ALS: **HTTP 200** (OK) +deactivate ALS +deactivate userfsp +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure42.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure42.svg new file mode 100644 index 000000000..1f9cf748e --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure42.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + User + + + + User's + FSP + + Account + Lookup + + + + + + I would like to pay or receive + funds to/from +123456789 + + + + + +123456789 is not + within this system + + + + GET /participants/MSISDN/123456789 + + + + HTTP 202 + (Accepted) + + + + + Lookup which FSP MSISDN + +123456789 belongs to. + + + + PUT /participants/MSISDN/123456789 + (FSP ID) + + + + HTTP 200 + (OK) + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure43.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure43.plantuml new file mode 100644 index 000000000..cc7a269f5 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure43.plantuml @@ -0,0 +1,144 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Example process for /parties resource + +' Actor Keys: +' participant - FSP(User's), Switch, Account Lookup and FSP +' actor - Payee/Payer(User) + +' declare actors +actor "<$actor>\nUser" as user +participant "User's\nFSP" as userfsp +participant "Optional\nSwitch" as Switch +participant "Account\nLookup" as ALS +participant "\nFSP 1" as fsp1 + +' start flow +user -> userfsp: I would like to pay or receive\nfunds to/from +123456789 +activate userfsp +userfsp -> userfsp: +123456789 is not\nwithin this system +userfsp ->> Switch: **GET /parties/MSISDN/123456789** +activate Switch +userfsp <<-- Switch: **HTTP 202** (Accepted) +Switch ->> ALS: **GET /participants/MSISDN/123456789** +activate ALS +Switch <<-- ALS: **HTTP 202** (Accepted) +ALS -> ALS: Lookup which FSP MSISDN\n+123456789 belongs to. +Switch <<- ALS: **PUT /participants/MSISDN/123456789**\n(FSP 1) +Switch -->> ALS: **HTTP 200** (OK) +deactivate ALS +Switch ->> fsp1: **GET /parties/MSISDN/123456789** +activate fsp1 +Switch <<-- fsp1: **HTTP 202** (Accepted) +fsp1 -> fsp1: Lookup party information\nfor +123456789 +Switch <<- fsp1: **PUT /parties/MSISDN/123456789**\n(Party information) +Switch -->> fsp1: **HTTP 200** (OK) +deactivate fsp1 +userfsp <<- Switch: **PUT /parties/MSISDN/123456789**\n(Party information) +userfsp -->> Switch: **HTTP 200** (OK) +deactivate Switch +user <- userfsp: Is "name" correct? +deactivate userfsp +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure43.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure43.svg new file mode 100644 index 000000000..0c6980acc --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure43.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + User + + + + User's + FSP + + Optional + Switch + + Account + Lookup + +   + FSP 1 + + + + + + + I would like to pay or receive + funds to/from +123456789 + + + + + +123456789 is not + within this system + + + + GET /parties/MSISDN/123456789 + + + + HTTP 202 + (Accepted) + + + + GET /participants/MSISDN/123456789 + + + + HTTP 202 + (Accepted) + + + + + Lookup which FSP MSISDN + +123456789 belongs to. + + + + PUT /participants/MSISDN/123456789 + (FSP 1) + + + + HTTP 200 + (OK) + + + + GET /parties/MSISDN/123456789 + + + + HTTP 202 + (Accepted) + + + + + Lookup party information + for +123456789 + + + + PUT /parties/MSISDN/123456789 + (Party information) + + + + HTTP 200 + (OK) + + + + PUT /parties/MSISDN/123456789 + (Party information) + + + + HTTP 200 + (OK) + + + Is "name" correct? + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure44.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure44.plantuml new file mode 100644 index 000000000..ed8d8bd0e --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure44.plantuml @@ -0,0 +1,137 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title How to use the /transactionRequests service + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payee + +' declare actors +participant "Payer\nFSP" as payerfsp +participant "Optional\nSwitch" as Switch +participant "Payee\nFSP" as payeefsp +actor "<$actor>\nPayee" as Payee + +' start flow +payeefsp <- Payee: I would like to receive\nfunds from +123456789 +activate payeefsp +payeefsp <- payeefsp: Lookup +123456789\n(process not shown her) +Switch <<- payeefsp: **POST /transactionRequests**\n(Payee information,\ntransaction details) +activate Switch +Switch -->> payeefsp: **HTTP 202** (Accepted) +payerfsp <<- Switch: **POST /transactionRequests**\n(Payee information,\ntransaction details) +activate payerfsp +payerfsp -->> Switch: **HTTP 202** (Accepted) +payeefsp -> payeefsp: Perform optional validation +payerfsp ->> Switch: **PUT /transactionRequests/**\n(Received status) +payerfsp <<-- Switch: **HTTP 200** (OK) +deactivate payerfsp +Switch ->> payeefsp: **PUT /transactionRequests/**\n(Received status) +Switch <<-- payeefsp: **HTTP 200** (OK) +deactivate Switch +payeefsp -> payeefsp: Wait for either quote and\ntransfer, or rejected\ntransaction request by Payer +payeefsp <[hidden]- payeefsp +deactivate payeefsp +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure44.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure44.svg new file mode 100644 index 000000000..e073588f1 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure44.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + Payer + FSP + + Optional + Switch + + Payee + FSP + + Payee + + + + + + + + I would like to receive + funds from +123456789 + + + + + Lookup +123456789 + (process not shown her) + + + + POST /transactionRequests + (Payee information, + transaction details) + + + + HTTP 202 + (Accepted) + + + + POST /transactionRequests + (Payee information, + transaction details) + + + + HTTP 202 + (Accepted) + + + + + Perform optional validation + + + + PUT /transactionRequests/ + <ID> + (Received status) + + + + HTTP 200 + (OK) + + + + PUT /transactionRequests/ + <ID> + (Received status) + + + + HTTP 200 + (OK) + + + + + Wait for either quote and + transfer, or rejected + transaction request by Payer + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure45.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure45.plantuml new file mode 100644 index 000000000..bcaad8a0d --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure45.plantuml @@ -0,0 +1,131 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Example process in which a transaction request is rejected + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payee + +' declare actors +participant "Payer\nFSP" as payerfsp +participant "Optional\nSwitch" as Switch +participant "Payee\nFSP" as payeefsp +actor "<$actor>\nPayee" as Payee + +' start flow +activate payerfsp +payerfsp -> payerfsp: Transaction request and\nquoting (process not shown) +payerfsp -> payerfsp: User rejection, OTP not correct,\nor automatic rejection +payerfsp ->> Switch: **PUT /transactionRequests/**\n(Rejected state) +activate Switch +payerfsp <<-- Switch: **HTTP 200** (OK) +deactivate payerfsp +Switch ->> payeefsp: **PUT /transactionRequests/**\n(Rejected state) +activate payeefsp +Switch <<-- payeefsp: **HTTP 200** (OK) +deactivate Switch +payeefsp -> Payee: Transaction failed due\nto user rejection +deactivate payeefsp +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure45.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure45.svg new file mode 100644 index 000000000..5b94d8fd5 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure45.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + Payer + FSP + + Optional + Switch + + Payee + FSP + + Payee + + + + + + + + + + Transaction request and + quoting (process not shown) + + + + + User rejection, OTP not correct, + or automatic rejection + + + + PUT /transactionRequests/ + <ID> + (Rejected state) + + + + HTTP 200 + (OK) + + + + PUT /transactionRequests/ + <ID> + (Rejected state) + + + + HTTP 200 + (OK) + + + Transaction failed due + to user rejection + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure47.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure47.plantuml new file mode 100644 index 000000000..86deaaefd --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure47.plantuml @@ -0,0 +1,150 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Example process for resource /quotes + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payer/Payee + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "Optional\nSwitch" as Switch +participant "Payee\nFSP(s)" as PayeeFSP +actor "<$actor>\nPayee" as Payee + +' start flow +Payer ->> PayerFSP: I would like to pay 100 USD\nto +123456789 +activate PayerFSP +PayerFSP -> PayerFSP: Lookup +123456789\n(process not shown here) +PayerFSP -[hidden]> Switch +deactivate PayerFSP +PayerFSP -[hidden]> Switch +activate PayerFSP +PayerFSP -> PayerFSP: Rate Payer FSP quote\n(depending on fee model) +PayerFSP ->> Switch: **POST /quotes**\n(Transaction details) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **POST /quotes**\n(Transaction details) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Rate Payee FSP\nfees/commission,\ngenerate condition +Group #OldLace Optional + hnote left of PayeeFSP #OldLace + Confirm quote + end hnote + PayeeFSP -> Payee: Here is the quote and Payer name + PayeeFSP <- Payee: I confirm +end +Switch <<- PayeeFSP: ** PUT /quotes/**\n(Payee FSP fee/commission, condition) +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +PayerFSP <<- Switch: **PUT /quotes/**\n(Payee FSP fee/commission, condition) +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Rate Payer FSP quote\n(depending on fee model) +Payer <- PayerFSP: Present fees and optionally\npayee name +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure47.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure47.svg new file mode 100644 index 000000000..e18393d9b --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure47.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + + Optional + Switch + + Payee + FSP(s) + + Payee + + + + + + + + + + I would like to pay 100 USD + to +123456789 + + + + + Lookup +123456789 + (process not shown here) + + + + + Rate Payer FSP quote + (depending on fee model) + + + + POST /quotes + (Transaction details) + + + + HTTP 202 + (Accepted) + + + + POST /quotes + (Transaction details) + + + + HTTP 202 + (Accepted) + + + + + Rate Payee FSP + fees/commission, + generate condition + + + Optional + + Confirm quote + + + Here is the quote and Payer name + + + I confirm + + + + + PUT /quotes/** + <ID> + (Payee FSP fee/commission, condition) + + + + HTTP 200 + (OK) + + + + PUT /quotes/ + <ID> + (Payee FSP fee/commission, condition) + + + + HTTP 200 + (OK) + + + + + Rate Payer FSP quote + (depending on fee model) + + + Present fees and optionally + payee name + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure49.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure49.plantuml new file mode 100644 index 000000000..553dfc514 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure49.plantuml @@ -0,0 +1,156 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Example process for resource /authorizations + +' Actor Keys: +' participant - FSP(Payee) and Switch +' actor - Payee/Payer(POS/ATM) + +' declare actors +'actor "<$actor>\nPayer" as Payer +participant "\nPayer\nFSP" as PayerFSP +participant "\nOptional\nSwitch" as Switch +participant "\nPayee\nFSP" as PayeeFSP +actor "<$actor>\nPayee\n(POS/ATM)" as Payee + +' start flow +PayeeFSP <- Payee: I would like to receive\nfunds from +123456789 +activate PayeeFSP +PayeeFSP <- PayeeFSP: Lookup +123456789\n(process not shown here) +Switch <<- PayeeFSP: **POST /transactionRequests**\n(Payee information,\ntransaction details) +activate Switch +Switch -->> PayeeFSP: **HTTP 202** (Accepted) +PayerFSP <<- Switch: **POST /transactionRequests**\n(Payee information,\ntransaction details) +activate PayerFSP +PayerFSP ->> Switch: **HTTP 202** (Accepted) +PayerFSP -> PayerFSP: Perform optional validation +PayerFSP ->> Switch: **PUT /transactionRequests/**\n(Received status) +PayerFSP <<- Switch: **HTTP 200** (OK) +deactivate PayerFSP +Switch ->> PayeeFSP: **PUT /transactionRequests/**\n(Received status) +Switch <<-- PayeeFSP: **HTTP 200** (OK) +deactivate Switch +deactivate PayeeFSP +activate PayerFSP +PayerFSP -> PayerFSP: Do quote, generate OTP,\nnotify user (process\nnot shown here) +PayerFSP ->> Switch: **GET /authorizations/**\n\n(Amount including fees) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **GET /authorizations/**\n\n(Amount including fees) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> Payee: Show fees on POS +Payee -> Payee: Payer approves/rejects\ntransaction using OTP +PayeeFSP <<-- Payee: +Switch <<- PayeeFSP: **PUT /authorizations/**\n\n(OTP) +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +PayerFSP <<- Switch: **PUT /authorizations/**\n\n(OTP) +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Validate OTP sent by Payee FSP +PayerFSP -[hidden]> Switch +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure49.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure49.svg new file mode 100644 index 000000000..3a5ae346a --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure49.svg @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + +   + Payer + FSP + +   + Optional + Switch + +   + Payee + FSP + + Payee + (POS/ATM) + + + + + + + + + + + I would like to receive + funds from +123456789 + + + + + Lookup +123456789 + (process not shown here) + + + + POST /transactionRequests + (Payee information, + transaction details) + + + + HTTP 202 + (Accepted) + + + + POST /transactionRequests + (Payee information, + transaction details) + + + + HTTP 202 + (Accepted) + + + + + Perform optional validation + + + + PUT /transactionRequests/ + <ID> + (Received status) + + + + HTTP 200 + (OK) + + + + PUT /transactionRequests/ + <ID> + (Received status) + + + + HTTP 200 + (OK) + + + + + Do quote, generate OTP, + notify user (process + not shown here) + + + + GET /authorizations/ + <TransactionRequestID> + (Amount including fees) + + + + HTTP 202 + (Accepted) + + + + GET /authorizations/ + <TransactionRequestID> + (Amount including fees) + + + + HTTP 202 + (Accepted) + + + Show fees on POS + + + + + Payer approves/rejects + transaction using OTP + + + + + + + PUT /authorizations/ + <TransactionRequestID> + (OTP) + + + + HTTP 200 + (OK) + + + + PUT /authorizations/ + <TransactionRequestID> + (OTP) + + + + HTTP 200 + (OK) + + + + + Validate OTP sent by Payee FSP + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure5.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure5.plantuml new file mode 100644 index 000000000..0b48ee49c --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure5.plantuml @@ -0,0 +1,69 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +' declare title +' title Using the customized HTTP header fields FSPIOP-Destination and FSPIOP-Source + +' Actor Keys: +' participant - FSP, Peer FSP and Optional Switch + +' declare actors +participant "\nFSP" as FSP +participant "Optional\nSwitch" as Switch +participant "Peer\nFSP" as PEERFSP + +' start flow +FSP ->> Switch: **POST /service**\n(**FSPIOP-Source=**FSP,\n**FSPIOP-Destination=**Peer FSP) +activate FSP +activate Switch +FSP <<-- Switch: **HTTP 202** (Accepted) +Switch -> Switch: Route message according\nto **FSPIOP-Destination** +Switch ->> PEERFSP: **POST /service**\n(**FSPIOP-Source=**FSP,\n**FSPIOP-Destination=**Peer FSP) +activate PEERFSP +Switch <<-- PEERFSP: **HTTP 202** (Accepted) +PEERFSP -> PEERFSP: Optionally validate messages signature\nusing stored certificate for\nFSP in **FSPIOP-Source** +PEERFSP -> PEERFSP: Replace **FSPIOP-Source**\nwith **FSPIOP-Destination**\nand visa versa for routing of callback +Switch <<- PEERFSP: **PUT /service/**////\n(**FSPIOP-Source=**Peer FSP,\n**FSPIOP-Destination=**FSP) +Switch -->> PEERFSP: **HTTP 200** (OK) +Switch -> Switch: Route message according\nto **FSPIOP-Destination** +deactivate PEERFSP +FSP <<- Switch: **PUT /service/**////\n(**FSPIOP-Source=**Peer FSP,\n**FSPIOP-Destination=**FSP) +FSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +deactivate FSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure5.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure5.svg new file mode 100644 index 000000000..54a0efff5 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure5.svg @@ -0,0 +1,112 @@ + + + + + + + + + + +   + FSP + + Optional + Switch + + Peer + FSP + + + + + + + POST /service + ( + FSPIOP-Source= + FSP, + FSPIOP-Destination= + Peer FSP) + + + + HTTP 202 + (Accepted) + + + + + Route message according + to + FSPIOP-Destination + + + + POST /service + ( + FSPIOP-Source= + FSP, + FSPIOP-Destination= + Peer FSP) + + + + HTTP 202 + (Accepted) + + + + + Optionally validate messages signature + using stored certificate for + FSP in + FSPIOP-Source + + + + + Replace + FSPIOP-Source + with + FSPIOP-Destination + and visa versa for routing of callback + + + + PUT /service/ + <ID> + ( + FSPIOP-Source= + Peer FSP, + FSPIOP-Destination= + FSP) + + + + HTTP 200 + (OK) + + + + + Route message according + to + FSPIOP-Destination + + + + PUT /service/ + <ID> + ( + FSPIOP-Source= + Peer FSP, + FSPIOP-Destination= + FSP) + + + + HTTP 200 + (OK) + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure50.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure50.plantuml new file mode 100644 index 000000000..29daf6dff --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure50.plantuml @@ -0,0 +1,145 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Payer requests resend of authorization value (OTP) + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payer/Payee(OTC/POS) + +' declare actors +actor "<$actor>\nPayer\n" as Payer +participant "\nPayer\nFSP" as PayerFSP +participant "\n\nSwitch" as Switch +participant "\nPayee\nFSP" as PayeeFSP +actor "<$actor>\nPayee\n(POS)" as PayeePOS +actor "<$actor>\nPayer\n(OTC)" as PayerOTC + +' start flow +activate PayerFSP +PayerFSP -> PayerFSP: Transaction request and\nquoting process (not shown) +PayerFSP -> PayerFSP: Generate OTP, "12345", Payer FSP\nsets maximum retries to 2 +Payer <<- PayerFSP: Use OTP "12345" to accept\ntransaction to Merchant\nof 100 USD,\n0 USD in fees. +PayerFSP ->> Switch: **GET /authorizations/**\n\n(amount=100 USD, fees=0 USD,\nretriesLeft=2, type=OTP) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **GET /authorizations/**\n\n(amount=100 USD, fees=0 USD,\nretriesLeft=2, type=OTP) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP ->> PayeePOS: Total amount is 100 USD,\nfee is 0 USD +PayeePOS ->> PayerOTC: Please enter your OTP\nto confirm Merchant Payment\nof 100 USD, fee is 0 USD +PayeePOS <<- PayerOTC: OTP not received +PayeeFSP <<- PayeePOS: OTP not received +Switch <<- PayeeFSP: **PUT /authorizations/**\n\n(resend OTP) +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +PayerFSP <<- Switch: **PUT /authorizations/**\n\n(resend OTP) +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Resend OTP (optionally\nregenerate) as customer\ndid not receive it +Payer <<- PayerFSP: Use OTP "12345" to accept\ntransaction to Merchant\nof 100 USD,\n0 USD in fees. +PayerFSP -> PayerFSP: Resend GET /authorizations\n(not shown here) +PayerFSP -[hidden]> Switch +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure50.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure50.svg new file mode 100644 index 000000000..70b657a1b --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure50.svg @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + Payer +   + + + +   + Payer + FSP + +   +   + Switch + +   + Payee + FSP + + Payee + (POS) + + + + Payer + (OTC) + + + + + + + + + + Transaction request and + quoting process (not shown) + + + + + Generate OTP, "12345", Payer FSP + sets maximum retries to 2 + + + + Use OTP "12345" to accept + transaction to Merchant + of 100 USD, + 0 USD in fees. + + + + GET /authorizations/ + <TransactionRequestID> + (amount=100 USD, fees=0 USD, + retriesLeft=2, type=OTP) + + + + HTTP 202 + (Accepted) + + + + GET /authorizations/ + <TransactionRequestID> + (amount=100 USD, fees=0 USD, + retriesLeft=2, type=OTP) + + + + HTTP 202 + (Accepted) + + + + Total amount is 100 USD, + fee is 0 USD + + + + Please enter your OTP + to confirm Merchant Payment + of 100 USD, fee is 0 USD + + + + OTP not received + + + + OTP not received + + + + PUT /authorizations/ + <TransactionRequestID> + (resend OTP) + + + + HTTP 200 + (OK) + + + + PUT /authorizations/ + <TransactionRequestID> + (resend OTP) + + + + HTTP 200 + (OK) + + + + + Resend OTP (optionally + regenerate) as customer + did not receive it + + + + Use OTP "12345" to accept + transaction to Merchant + of 100 USD, + 0 USD in fees. + + + + + Resend GET /authorizations + (not shown here) + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure51.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure51.plantuml new file mode 100644 index 000000000..505e8f947 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure51.plantuml @@ -0,0 +1,160 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Payer enters incorrect authorization value (OTP) + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payer/Payee(OTC/POS) + +' declare actors +actor "<$actor>\nPayer\n" as Payer +participant "\nPayer\nFSP" as PayerFSP +participant "\n\nSwitch" as Switch +participant "\nPayee\nFSP" as PayeeFSP +actor "<$actor>\nPayee\n(POS)" as PayeePOS +actor "<$actor>\nPayer\n(OTC)" as PayerOTC + +' start flow +activate PayerFSP +PayerFSP -> PayerFSP: Transaction request and\nquoting process (not shown) +PayerFSP -> PayerFSP: Generate OTP, "12345", Payer FSP\nsets maximum retries to 2 +Payer <<- PayerFSP: Use OTP "12345" to accept\ntransaction to Merchant\nof 100 USD,\n0 USD in fees. +PayerFSP ->> Switch: **GET /authorizations/**\n\n(amount=100 USD, fees=0 USD,\nretriesLeft=2, type=OTP) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **GET /authorizations/**\n\n(amount=100 USD, fees=0 USD,\nretriesLeft=2, type=OTP) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP ->> PayeePOS: Total amount is 100 USD,\nfee is 0 USD +PayeePOS ->> PayerOTC: Please enter your OTP\nto confirm Merchant Payment\nof 100 USD, fee is 0 USD +PayeePOS <<- PayerOTC: Enters "12346" +PayeeFSP <<- PayeePOS: "12346" is the OTP +Switch <<- PayeeFSP: **PUT /authorizations/**\n\n(authenticationValue="12346") +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +PayerFSP <<- Switch: **PUT /authorizations/**\n\n(authenticationValue="12346") +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Validate OTP sent by Payee FSP,\nOTP incorrect, decrease retriesLeft +PayerFSP ->> Switch: **GET /authorizations/**\n\n(amount=100 USD, fees=0 USD,\nretriesLeft=1, type=OTP) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **GET /authorizations/**\n\n(amount=100 USD, fees=0 USD,\nretriesLeft=1, type=OTP) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP ->> PayeePOS: Incorrect OTP,\n1 retry left +PayeePOS ->> PayerOTC: Please enter your OTP to\nconfirm Merchant Payment of\n100 USD, fee is 0 USD, last retry +PayeePOS <<- PayerOTC: Enters "12345" +PayeeFSP <<- PayeePOS: "12345" is the OTP +Switch <<- PayeeFSP: **PUT /authorizations/**\n\n(otp="12345") +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +PayerFSP <<- Switch: **PUT /authorizations/**\n\n(otp="12345") +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Validates OTP sent by\nPayee FSP, OTP OK, perform\ntransfer (not shown here) +PayerFSP -[hidden]> Switch +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure51.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure51.svg new file mode 100644 index 000000000..7918e48dc --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure51.svg @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + + + + + + + Payer +   + + + +   + Payer + FSP + +   +   + Switch + +   + Payee + FSP + + Payee + (POS) + + + + Payer + (OTC) + + + + + + + + + + + + Transaction request and + quoting process (not shown) + + + + + Generate OTP, "12345", Payer FSP + sets maximum retries to 2 + + + + Use OTP "12345" to accept + transaction to Merchant + of 100 USD, + 0 USD in fees. + + + + GET /authorizations/ + <TransactionRequestID> + (amount=100 USD, fees=0 USD, + retriesLeft=2, type=OTP) + + + + HTTP 202 + (Accepted) + + + + GET /authorizations/ + <TransactionRequestID> + (amount=100 USD, fees=0 USD, + retriesLeft=2, type=OTP) + + + + HTTP 202 + (Accepted) + + + + Total amount is 100 USD, + fee is 0 USD + + + + Please enter your OTP + to confirm Merchant Payment + of 100 USD, fee is 0 USD + + + + Enters "12346" + + + + "12346" is the OTP + + + + PUT /authorizations/ + <TransactionRequestID> + (authenticationValue="12346") + + + + HTTP 200 + (OK) + + + + PUT /authorizations/ + <TransactionRequestID> + (authenticationValue="12346") + + + + HTTP 200 + (OK) + + + + + Validate OTP sent by Payee FSP, + OTP incorrect, decrease retriesLeft + + + + GET /authorizations/ + <TransactionRequestID> + (amount=100 USD, fees=0 USD, + retriesLeft=1, type=OTP) + + + + HTTP 202 + (Accepted) + + + + GET /authorizations/ + <TransactionRequestID> + (amount=100 USD, fees=0 USD, + retriesLeft=1, type=OTP) + + + + HTTP 202 + (Accepted) + + + + Incorrect OTP, + 1 retry left + + + + Please enter your OTP to + confirm Merchant Payment of + 100 USD, fee is 0 USD, last retry + + + + Enters "12345" + + + + "12345" is the OTP + + + + PUT /authorizations/ + <TransactionRequestID> + (otp="12345") + + + + HTTP 200 + (OK) + + + + PUT /authorizations/ + <TransactionRequestID> + (otp="12345") + + + + HTTP 200 + (OK) + + + + + Validates OTP sent by + Payee FSP, OTP OK, perform + transfer (not shown here) + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure52.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure52.plantuml new file mode 100644 index 000000000..a162cad3d --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure52.plantuml @@ -0,0 +1,155 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title How to use the POST /transfers service + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payee/Payer + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "Optional\nSwitch" as Switch +participant "Payee\nFSP" as PayeeFSP +actor "<$actor>\nPayee" as Payee + +' start flow +Payer ->> PayerFSP: I would like to pay 100 USD\nto +123456789 +activate PayerFSP +PayerFSP -> PayerFSP: Lookup +123456789\n(process not shown here) +PayerFSP -[hidden]> Switch +deactivate PayerFSP +PayerFSP -[hidden]> Switch +activate PayerFSP +PayerFSP -> PayerFSP: Quote\n(process not shown here) +PayerFSP -[hidden]> Switch +deactivate PayerFSP +PayerFSP -[hidden]> Switch +activate PayerFSP +PayerFSP -> PayerFSP: Reserve transfer from Payer\naccount to Switch account +PayerFSP -[hidden]> Switch +deactivate PayerFSP +PayerFSP -[hidden]> Switch +activate PayerFSP +PayerFSP ->> Switch: **POST /transfers**\n(Transfer ID, conditions, ILP Packet\nincluding transaction details,\nexpiry=30 seconds) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch -> Switch: Reserve transfer from\nPayer FSP to Payee FSP +Switch ->> PayeeFSP: **POST /transfers**\n(Transfer ID, conditions, ILP Packet\nincluding transaction details,\nexpiry=30 seconds) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Perform transfer from Switch\naccount to Payee account,\ngenerate fulfilment +Switch <<- PayeeFSP: **PUT /transfers/**\n(Fulfilment) +PayeeFSP -> Payee: Transaction notification +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +Switch -> Switch: Commit transfer from\nPayer FSP to Payee FSP +PayerFSP <<- Switch: **PUT /transfers/**\n(Fulfilment) +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Commit transfer from Payer\naccount to Payee FSP account +Payer <- PayerFSP: Transaction notification +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure52.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure52.svg new file mode 100644 index 000000000..f66d00cc6 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure52.svg @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + + Optional + Switch + + Payee + FSP + + Payee + + + + + + + + + + + + I would like to pay 100 USD + to +123456789 + + + + + Lookup +123456789 + (process not shown here) + + + + + Quote + (process not shown here) + + + + + Reserve transfer from Payer + account to Switch account + + + + POST /transfers + (Transfer ID, conditions, ILP Packet + including transaction details, + expiry=30 seconds) + + + + HTTP 202 + (Accepted) + + + + + Reserve transfer from + Payer FSP to Payee FSP + + + + POST /transfers + (Transfer ID, conditions, ILP Packet + including transaction details, + expiry=30 seconds) + + + + HTTP 202 + (Accepted) + + + + + Perform transfer from Switch + account to Payee account, + generate fulfilment + + + + PUT /transfers/ + <ID> + (Fulfilment) + + + Transaction notification + + + + HTTP 200 + (OK) + + + + + Commit transfer from + Payer FSP to Payee FSP + + + + PUT /transfers/ + <ID> + (Fulfilment) + + + + HTTP 200 + (OK) + + + + + Commit transfer from Payer + account to Payee FSP account + + + Transaction notification + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure53.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure53.plantuml new file mode 100644 index 000000000..4d9e48767 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure53.plantuml @@ -0,0 +1,156 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Optional additional clearing check + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payee/Payer + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "Optional\nSwitch" as Switch +participant "Payee\nFSP" as PayeeFSP +actor "<$actor>\nPayee" as Payee + +' start flow +Payer ->> PayerFSP: I would like to pay 100 USD\nto +123456789 +activate PayerFSP +PayerFSP -> PayerFSP: Lookup +123456789\n(process not shown here) +PayerFSP -[hidden]> Switch +deactivate PayerFSP +PayerFSP -[hidden]> Switch +activate PayerFSP +PayerFSP -> PayerFSP: Quote (process\nnot shown here) +PayerFSP -[hidden]> Switch +deactivate PayerFSP +PayerFSP -[hidden]> Switch +activate PayerFSP +PayerFSP -> PayerFSP: Reserve transfer from Payer\naccount to Switch account +PayerFSP -[hidden]> Switch +deactivate PayerFSP +PayerFSP -[hidden]> Switch +activate PayerFSP +PayerFSP ->> Switch: **POST /transfers**\n(Transfer ID, condition, ILP Packet\nincluding transaction details,\nexpiry=30 seconds) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch -> Switch: Reserve transfer from\nPayer FSP to Payee FSP +Switch ->> PayeeFSP: **POST /transfers**\n(Transfer ID, condition, ILP Packet\nincluding transaction details,\nexpiry=20 seconds) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Perform transfer from\nSwitch account to\nPayee account +PayeeFSP -> Payee: Transaction notification +Switch -> Switch: Expiry time reached,\ncancel reservation +PayerFSP <<- Switch: **PUT /transfers/**/**error** +Switch <<- PayeeFSP: **PUT /transfers/**\n(Fulfilment) +PayerFSP -->> Switch: **HTTP 200** (OK) +Switch -->> PayeeFSP: **HTTP 200** (OK) +Switch -> Switch: Mark transfer for\nReconciliation as Payee\nFSP has completed and\nPayer FSP has cancelled +deactivate PayeeFSP +PayerFSP -> PayerFSP: Cancel transfer from Payer\naccount to Switch +deactivate Switch +Payer <- PayerFSP: Transaction failure notification +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure53.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure53.svg new file mode 100644 index 000000000..8eea5e412 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure53.svg @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + + Optional + Switch + + Payee + FSP + + Payee + + + + + + + + + + + + I would like to pay 100 USD + to +123456789 + + + + + Lookup +123456789 + (process not shown here) + + + + + Quote (process + not shown here) + + + + + Reserve transfer from Payer + account to Switch account + + + + POST /transfers + (Transfer ID, condition, ILP Packet + including transaction details, + expiry=30 seconds) + + + + HTTP 202 + (Accepted) + + + + + Reserve transfer from + Payer FSP to Payee FSP + + + + POST /transfers + (Transfer ID, condition, ILP Packet + including transaction details, + expiry=20 seconds) + + + + HTTP 202 + (Accepted) + + + + + Perform transfer from + Switch account to + Payee account + + + Transaction notification + + + + + Expiry time reached, + cancel reservation + + + + PUT /transfers/ + <ID> + / + error + + + + PUT /transfers/ + <ID> + (Fulfilment) + + + + HTTP 200 + (OK) + + + + HTTP 200 + (OK) + + + + + Mark transfer for + Reconciliation as Payee + FSP has completed and + Payer FSP has cancelled + + + + + Cancel transfer from Payer + account to Switch + + + Transaction failure notification + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure54.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure54.plantuml new file mode 100644 index 000000000..608a813b0 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure54.plantuml @@ -0,0 +1,159 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Optional additional clearing check where commit in Switch failed + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payee/Payer + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "Optional\nSwitch" as Switch +participant "Payee\nFSP" as PayeeFSP +actor "<$actor>\nPayee" as Payee + +' start flow +Payer ->> PayerFSP: I would like to pay 100 USD\nto +123456789 +activate PayerFSP +PayerFSP -> PayerFSP: Lookup +123456789\n(process not shown here) +PayerFSP -[hidden]> Switch +deactivate PayerFSP +PayerFSP -[hidden]> Switch +activate PayerFSP +PayerFSP -> PayerFSP: Quote (process\nnot shown here) +PayerFSP -[hidden]> Switch +deactivate PayerFSP +PayerFSP -[hidden]> Switch +activate PayerFSP +PayerFSP -> PayerFSP: Reserve transfer from Payer\naccount to Switch account +PayerFSP -[hidden]> Switch +deactivate PayerFSP +PayerFSP -[hidden]> Switch +activate PayerFSP +PayerFSP ->> Switch: **POST /transfers**\n(Transfer ID, condition, ILP Packet\nincluding transaction details,\nexpiry=30 seconds) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch -> Switch: Reserve transfer from\nPayer FSP to Payee FSP +Switch ->> PayeeFSP: **POST /transfers**\n(Transfer ID, condition, ILP Packet\nincluding transaction details,\nexpiry=20 seconds) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Reserve transfer from Switch\naccount to Payee account,\ngenerate fulfilment +PayeeFSP -> PayeeFSP: Request commit notification\nfrom Switch by sending transfer\nstate as reserved +Switch <<- PayeeFSP: **PUT /transfers/**\n(Fulfilment,\ntransferState=RESERVED) +Switch -->> PayeeFSP: **HTTP 200** (OK) +Switch -> Switch: Commit transfer from\nPayer FSP to Payee FSP,\nsend commit notification\nto Payee FSP +Switch ->> PayeeFSP: **PATCH /transfers/**\n(transferState=COMMITTED,\ncompletedTimestamp) +Switch <<-- PayeeFSP: **HTTP 200** (OK) +PayerFSP <<- Switch: **PUT /transfers/**\n(Fulfilment) +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayeeFSP -> PayeeFSP: Commit reserved transfer\nfrom Switch to Payee +PayeeFSP -> Payee: Transaction notification +deactivate PayeeFSP +PayerFSP -> PayerFSP: Commit transfer from Payer\naccount to Payee FSP account +Payer <- PayerFSP: Transaction notification +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure54.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure54.svg new file mode 100644 index 000000000..3a80063b6 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure54.svg @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + + Optional + Switch + + Payee + FSP + + Payee + + + + + + + + + + + + I would like to pay 100 USD + to +123456789 + + + + + Lookup +123456789 + (process not shown here) + + + + + Quote (process + not shown here) + + + + + Reserve transfer from Payer + account to Switch account + + + + POST /transfers + (Transfer ID, condition, ILP Packet + including transaction details, + expiry=30 seconds) + + + + HTTP 202 + (Accepted) + + + + + Reserve transfer from + Payer FSP to Payee FSP + + + + POST /transfers + (Transfer ID, condition, ILP Packet + including transaction details, + expiry=20 seconds) + + + + HTTP 202 + (Accepted) + + + + + Reserve transfer from Switch + account to Payee account, + generate fulfilment + + + + + Request commit notification + from Switch by sending transfer + state as reserved + + + + PUT /transfers/ + <ID> + (Fulfilment, + transferState=RESERVED) + + + + HTTP 200 + (OK) + + + + + Commit transfer from + Payer FSP to Payee FSP, + send commit notification + to Payee FSP + + + + PATCH /transfers/ + <ID> + (transferState=COMMITTED, + completedTimestamp) + + + + HTTP 200 + (OK) + + + + PUT /transfers/ + <ID> + (Fulfilment) + + + + HTTP 200 + (OK) + + + + + Commit reserved transfer + from Switch to Payee + + + Transaction notification + + + + + Commit transfer from Payer + account to Payee FSP account + + + Transaction notification + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure55.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure55.plantuml new file mode 100644 index 000000000..b0b15412e --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure55.plantuml @@ -0,0 +1,158 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Commit notification where commit of transfer in Switch failed + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payee/Payer + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "Switch" as Switch +participant "Payee\nFSP" as PayeeFSP +actor "<$actor>\nPayee" as Payee + +' start flow +Payer ->> PayerFSP: I would like to pay 100 USD\nto +123456789 +activate PayerFSP +PayerFSP -> PayerFSP: Lookup +123456789\n(process not shown here) +PayerFSP -[hidden]> Switch +deactivate PayerFSP +PayerFSP -[hidden]> Switch +activate PayerFSP +PayerFSP -> PayerFSP: Quote (process\nnot shown here) +PayerFSP -[hidden]> Switch +deactivate PayerFSP +PayerFSP -[hidden]> Switch +activate PayerFSP +PayerFSP -> PayerFSP: Reserve transfer from Payer\naccount to Switch account +PayerFSP -[hidden]> Switch +deactivate PayerFSP +PayerFSP -[hidden]> Switch +activate PayerFSP +PayerFSP ->> Switch: **POST /transfers**\n(Transfer ID, condition, ILP Packet\nincluding transaction details,\nexpiry=30 seconds) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch -> Switch: Reserve transfer from\nPayer FSP to Payee FSP +Switch ->> PayeeFSP: **POST /transfers**\n(Transfer ID, condition, ILP Packet\nincluding transaction details,\nexpiry=20 seconds) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Reserve transfer from Switch\naccount to Payee account,\ngenerate fulfilment +PayeeFSP -> PayeeFSP: Request commit notification\nfrom Switch by sending transfer\nstate as reserved +Switch <<- PayeeFSP: **PUT /transfers/**\n(Fulfilment,\ntransferState=RESERVED) +Switch -->> PayeeFSP: **HTTP 200** (OK) +Switch -> Switch: Commit transfer from\nPayer FSP to Payee FSP\nfailed, notify both FSPs +Switch ->> PayeeFSP: **PATCH /transfers/**\n(transferState=ABORTED,\ncompletedTimestamp) +Switch <<-- PayeeFSP: **HTTP 200** (OK) +PayeeFSP -> PayeeFSP: Rollback reserved transfer\nfrom Switch to Payee +PayerFSP <<- Switch: **PUT /transfers/**/**error** +deactivate PayeeFSP +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Rollback reserved transfer from\nPayer to Switch +Payer <- PayerFSP: Transaction notification +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure55.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure55.svg new file mode 100644 index 000000000..56263ad83 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure55.svg @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + + Switch + + Payee + FSP + + Payee + + + + + + + + + + + + I would like to pay 100 USD + to +123456789 + + + + + Lookup +123456789 + (process not shown here) + + + + + Quote (process + not shown here) + + + + + Reserve transfer from Payer + account to Switch account + + + + POST /transfers + (Transfer ID, condition, ILP Packet + including transaction details, + expiry=30 seconds) + + + + HTTP 202 + (Accepted) + + + + + Reserve transfer from + Payer FSP to Payee FSP + + + + POST /transfers + (Transfer ID, condition, ILP Packet + including transaction details, + expiry=20 seconds) + + + + HTTP 202 + (Accepted) + + + + + Reserve transfer from Switch + account to Payee account, + generate fulfilment + + + + + Request commit notification + from Switch by sending transfer + state as reserved + + + + PUT /transfers/ + <ID> + (Fulfilment, + transferState=RESERVED) + + + + HTTP 200 + (OK) + + + + + Commit transfer from + Payer FSP to Payee FSP + failed, notify both FSPs + + + + PATCH /transfers/ + <ID> + (transferState=ABORTED, + completedTimestamp) + + + + HTTP 200 + (OK) + + + + + Rollback reserved transfer + from Switch to Payee + + + + PUT /transfers/ + <ID> + / + error + + + + HTTP 200 + (OK) + + + + + Rollback reserved transfer from + Payer to Switch + + + Transaction notification + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure57.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure57.plantuml new file mode 100644 index 000000000..615c2acec --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure57.plantuml @@ -0,0 +1,138 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Example transaction process + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payer + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "Optional\nSwitch" as Switch +participant "Payee\nFSP" as PayeeFSP + +' start flow +Payer -> PayerFSP: I would like to pay 100 USD\nto +123456789 +activate PayerFSP +PayerFSP -> PayerFSP: Lookup +123456789\n(process not shown here) +PayerFSP -> PayerFSP: Perform quote\n(process not shown here) +PayerFSP -> PayerFSP: Perform transfer\n(process not shown here) +PayerFSP ->> Switch: **GET /transactions/** +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **GET /transactions/** +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Lookup transaction\ninformation +Switch <<- PayeeFSP: **PUT /transactions/**\n(Transaction detail) +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +PayerFSP <<- Switch: **PUT /transactions/**\n(Transaction detail) +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +Payer <- PayerFSP: Transaction notification\nincluding transaction\ndata(e.g. token ID) +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure57.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure57.svg new file mode 100644 index 000000000..98acfada5 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure57.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + + Optional + Switch + + Payee + FSP + + + + + + I would like to pay 100 USD + to +123456789 + + + + + Lookup +123456789 + (process not shown here) + + + + + Perform quote + (process not shown here) + + + + + Perform transfer + (process not shown here) + + + + GET /transactions/ + <TransactionID> + + + + HTTP 202 + (Accepted) + + + + GET /transactions/ + <TransactionID> + + + + HTTP 202 + (Accepted) + + + + + Lookup transaction + information + + + + PUT /transactions/ + <TransactionID> + (Transaction detail) + + + + HTTP 200 + (OK) + + + + PUT /transactions/ + <TransactionID> + (Transaction detail) + + + + HTTP 200 + (OK) + + + Transaction notification + including transaction + data(e.g. token ID) + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure59.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure59.plantuml new file mode 100644 index 000000000..f90967b30 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure59.plantuml @@ -0,0 +1,147 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Example bulk quote process + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payer + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "Optional\nSwitch" as Switch +participant "Payee\nFSP(s)" as PayeeFSP + +' start flow +Payer -> PayerFSP: I would like to upload\na file of bulk transactions +activate PayerFSP +PayerFSP -> PayerFSP: Lookup in which FSP each\nPayee is located in, divide\nPayees into FSP separate files\n(process not shown here) +Loop #OldLace + hnote left of PayerFSP #OldLace + For each + created bulk + file per + Payee FSP + end hnote + PayerFSP -> PayerFSP: Rate Payer FSP bulk quote\n(process not shown here) + PayerFSP ->> Switch: **POST /bulkQuotes**\n(Bulk info and list of individual quotes) + activate Switch + PayerFSP <<-- Switch: **HTTP 202** (Accepted) + Switch ->> PayeeFSP: **POST /bulkQuotes**\n(Bulk info and list of individual quotes) + activate PayeeFSP + Switch <<-- PayeeFSP: **HTTP 202** (Accepted) + PayeeFSP -> PayeeFSP: Rate Payee FSP\nfee/commission and\ngenerate condition per\nindividual transfer + Switch <<- PayeeFSP: **PUT /bulkQuotes/**\n(List of individual quote results\nand condition per transfer) + Switch -->> PayeeFSP: **HTTP 200** (OK) + deactivate PayeeFSP + PayerFSP <<- Switch: **PUT /bulkQuotes/**\n(List of individual quote results\nand condition per transfer) + PayerFSP -->> Switch: **HTTP 200** (OK) + deactivate Switch + PayerFSP -> PayerFSP: Rate payer FSP bulk quote\n(depending on fee model) +end Loop +PayerFSP -> PayerFSP: Handle quote results for\nall Payee FSPs +PayerFSP -[hidden]> Switch +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure59.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure59.svg new file mode 100644 index 000000000..558bc47e8 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure59.svg @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + + Optional + Switch + + Payee + FSP(s) + + + + + + I would like to upload + a file of bulk transactions + + + + + Lookup in which FSP each + Payee is located in, divide + Payees into FSP separate files + (process not shown here) + + + loop + + For each + created bulk + file per + Payee FSP + + + + + Rate Payer FSP bulk quote + (process not shown here) + + + + POST /bulkQuotes + (Bulk info and list of individual quotes) + + + + HTTP 202 + (Accepted) + + + + POST /bulkQuotes + (Bulk info and list of individual quotes) + + + + HTTP 202 + (Accepted) + + + + + Rate Payee FSP + fee/commission and + generate condition per + individual transfer + + + + PUT /bulkQuotes/ + <ID> + (List of individual quote results + and condition per transfer) + + + + HTTP 200 + (OK) + + + + PUT /bulkQuotes/ + <ID> + (List of individual quote results + and condition per transfer) + + + + HTTP 200 + (OK) + + + + + Rate payer FSP bulk quote + (depending on fee model) + + + + + Handle quote results for + all Payee FSPs + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure6.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure6.plantuml new file mode 100644 index 000000000..7f28f23c9 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure6.plantuml @@ -0,0 +1,77 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +' declare title +' title Example scenario where FSPIOP-Destination is unknown by FSP + +' Actor Keys: +' participant - FSP, Peer FSP, Optional Switch and Account Lookup + +' declare actors +participant "\nFSP" as FSP +participant "Optional\nSwitch" as Switch +participant "Account\nLookup" as ALS +participant "Peer\nFSP" as PEERFSP + +' start flow +FSP ->> Switch: **GET /parties/msisdn/123456789**\n(**FSPIOP-Source=**FSP) +activate FSP +activate Switch +FSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> ALS: **GET /participants/msisdn/123456789**\n(**FSPIOP-Source=**Switch,\n**FSPIOP-Destination=**Account Lookup) +activate ALS +Switch <<-- ALS: **HTTP 202** (Accepted) +ALS -> ALS: Replace **FSPIOP-Source**\nwith **FSPIOP-Destination**\nand vice versa for\nrouting of callback +Switch <<- ALS: **PUT /participants/msisdn/123456789**\n(**FSPIOP-Source=**Account Lookup,\n**FSPIOP-Destination=**Switch) +Switch -->> ALS: **HTTP 200** (OK) +deactivate ALS +Switch -> Switch: Set **FSPIOP-Destination**\nin original messages according\nto results of **PUT /participants** +Switch ->> PEERFSP: **GET /parties/msisdn/123456789**\n(**FSPIOP-Source=**FSP, **FSPIOP-Destination=**Peer FSP) +activate PEERFSP +Switch <<-- PEERFSP: **HTTP 202** (Accepted) +PEERFSP -> PEERFSP: Optionally validate message\nsignature using stored certificate\nfor FSP in **FSPIOP-Source** +PEERFSP -> PEERFSP: Replace **FSPIOP-Source**\nwith **FSPIOP-Destination** and\nvice versa for routing of callback +Switch <<- PEERFSP: **PUT /parties/msisdn/123456789**\n(**FSPIOP-Source=**Peer FSP, **FSPIOP-Destination=**FSP) +Switch -->> PEERFSP: **HTTP 200** (OK) +deactivate PEERFSP +Switch -> Switch: Route messages according\nto **FSPIOP-Destination** +FSP <<- Switch: **PUT /parties/msisdn/123456789**\n(**FSPIOP-Source=**Peer FSP,\n**FSPIOP-Destination=**FSP) +FSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +deactivate FSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure6.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure6.svg new file mode 100644 index 000000000..c61416d66 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure6.svg @@ -0,0 +1,155 @@ + + + + + + + + + + + + +   + FSP + + Optional + Switch + + Account + Lookup + + Peer + FSP + + + + + + + + GET /parties/msisdn/123456789 + ( + FSPIOP-Source= + FSP) + + + + HTTP 202 + (Accepted) + + + + GET /participants/msisdn/123456789 + ( + FSPIOP-Source= + Switch, + FSPIOP-Destination= + Account Lookup) + + + + HTTP 202 + (Accepted) + + + + + Replace + FSPIOP-Source + with + FSPIOP-Destination + and vice versa for + routing of callback + + + + PUT /participants/msisdn/123456789 + ( + FSPIOP-Source= + Account Lookup, + FSPIOP-Destination= + Switch) + + + + HTTP 200 + (OK) + + + + + Set + FSPIOP-Destination + in original messages according + to results of + PUT /participants + + + + GET /parties/msisdn/123456789 + ( + FSPIOP-Source= + FSP, + FSPIOP-Destination= + Peer FSP) + + + + HTTP 202 + (Accepted) + + + + + Optionally validate message + signature using stored certificate + for FSP in + FSPIOP-Source + + + + + Replace + FSPIOP-Source + with + FSPIOP-Destination + and + vice versa for routing of callback + + + + PUT /parties/msisdn/123456789 + ( + FSPIOP-Source= + Peer FSP, + FSPIOP-Destination= + FSP) + + + + HTTP 200 + (OK) + + + + + Route messages according + to + FSPIOP-Destination + + + + PUT /parties/msisdn/123456789 + ( + FSPIOP-Source= + Peer FSP, + FSPIOP-Destination= + FSP) + + + + HTTP 200 + (OK) + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure61.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure61.plantuml new file mode 100644 index 000000000..5f0ab8b64 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure61.plantuml @@ -0,0 +1,153 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Example bulk transfer process + +' Actor Keys: +' participant - FSP(Payer/Payee(s)) and Switch +' actor - Payer/Payee(s) + +' declare actors +actor "<$actor>\nPayer\n" as Payer +participant "Payer\nFSP" as PayerFSP +participant "Optional\nSwitch" as Switch +participant "Payee\nFSP(s)" as PayeeFSP +actor "<$actor>\nPayees\n(multiple)" as Payee + +' start flow +Payer -> PayerFSP: I would like to upload\na file of bulk transactions +activate PayerFSP +PayerFSP -> PayerFSP: Lookup in which FSP each\nPayee is located in, divide\nPayees into FSP separate files\n(process not shown here) +PayerFSP -> PayerFSP: Perform bulk quoting per\nPayee FSP\n(process not shown here) +Payer <- PayerFSP: Bulk has finished processing,\npresent fees +Payer -> PayerFSP: Execute my bulk +Loop #OldLace + hnote left of PayerFSP #OldLace + For each + created bulk + file per + Payee FSP + end hnote + PayerFSP -> PayerFSP: Reserve each individual\ntransfer from Payer\naccount to Payee FSP account + PayerFSP ->> Switch: **POST /bulkTransfers**\n(List of individual transfers\nincluding ILP packet and condition) + activate Switch + PayerFSP <<-- Switch: **HTTP 202** (Accepted) + Switch -> Switch: Reserve each individual\ntransfer from Payer FSP\nto Payee FSP + Switch ->> PayeeFSP: **POST /bulkTransfers**\n(List of individual transfers\nincluding ILP packet and condition) + activate PayeeFSP + Switch <<-- PayeeFSP: **HTTP 202** (Accepted) + PayeeFSP -> PayeeFSP: Perform each transfer from \nPayer FSP account to Payee \naccount, generate fulfilments + PayeeFSP -> Payee: Transaction notification\nfor each Payee + Switch <<- PayeeFSP: **PUT /bulkTransfers/**\n(List of fulfilments) + Switch -->> PayeeFSP: **HTTP 200** (OK) + deactivate PayeeFSP + Switch -> Switch: Commit each successful\ntransfer from Payer\nFSP to Payee FSP + PayerFSP <<- Switch: **PUT /bulkTransfers/**\n(List of fulfilments) + PayerFSP -->> Switch: **HTTP 200** (OK) + deactivate Switch + PayerFSP -> PayerFSP: Commit each successful\ntransfer from Payer account\nto Payee account +end Loop +Payer <- PayerFSP: Your bulk has been executed +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure61.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure61.svg new file mode 100644 index 000000000..31fb7c70d --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure61.svg @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + Payer +   + + + + Payer + FSP + + Optional + Switch + + Payee + FSP(s) + + Payees + (multiple) + + + + + + + + I would like to upload + a file of bulk transactions + + + + + Lookup in which FSP each + Payee is located in, divide + Payees into FSP separate files + (process not shown here) + + + + + Perform bulk quoting per + Payee FSP + (process not shown here) + + + Bulk has finished processing, + present fees + + + Execute my bulk + + + loop + + For each + created bulk + file per + Payee FSP + + + + + Reserve each individual + transfer from Payer + account to Payee FSP account + + + + POST /bulkTransfers + (List of individual transfers + including ILP packet and condition) + + + + HTTP 202 + (Accepted) + + + + + Reserve each individual + transfer from Payer FSP + to Payee FSP + + + + POST /bulkTransfers + (List of individual transfers + including ILP packet and condition) + + + + HTTP 202 + (Accepted) + + + + + Perform each transfer from + Payer FSP account to Payee + account, generate fulfilments + + + Transaction notification + for each Payee + + + + PUT /bulkTransfers/ + <ID> + (List of fulfilments) + + + + HTTP 200 + (OK) + + + + + Commit each successful + transfer from Payer + FSP to Payee FSP + + + + PUT /bulkTransfers/ + <ID> + (List of fulfilments) + + + + HTTP 200 + (OK) + + + + + Commit each successful + transfer from Payer account + to Payee account + + + Your bulk has been executed + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure64.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure64.plantuml new file mode 100644 index 000000000..589e9e159 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure64.plantuml @@ -0,0 +1,258 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Payer Initiated Transaction pattern using the asynchronous REST binding + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payer/Payee(s) + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "Optional\nSwitch" as Switch +participant "Account\nLookup" as ALS +participant "Payee\nFSP" as PayeeFSP +actor "<$actor>\nPayee" as Payee + +' start flow +autonumber 1 1 "[0]" +Payer -> PayerFSP: I would like to\npay 100 USD\nto +123456789 +activate PayerFSP +autonumber stop +PayerFSP -> PayerFSP: Payee not within\nPayer FSP system +autonumber resume +PayerFSP ->> Switch: **GET /parties/MSISDN/123456789** +activate Switch +autonumber stop +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +autonumber resume +Switch ->> ALS: **GET /participants/MSISDN/123456789** +activate ALS +autonumber stop +Switch <<-- ALS: **HTTP 202** (Accepted) +ALS -> ALS: Lookup which\nFSP MSISDN\n+123456789\nbelongs to +autonumber resume +Switch <<- ALS: **PUT /participants/MSISDN/123456789**\n(FSP ID) +autonumber stop +Switch -->> ALS: **HTTP 200** (OK) +deactivate ALS +autonumber resume +Switch ->> PayeeFSP: **GET /parties/MSISDN/123456789** +activate PayeeFSP +autonumber stop +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Lookup party\ninformation\nRegarding\nMSISDN\n+123456789 +autonumber resume +Switch <<- PayeeFSP: **Put /parties/MSISDN/123456789**\n(Party information) +autonumber stop +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +autonumber resume +PayerFSP <<- Switch: **PUT /parties/MSISDN/123456789**\n(Party information) +autonumber stop +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +deactivate PayerFSP +autonumber resume +PayerFSP -[hidden]> Switch +activate PayerFSP +PayerFSP -> PayerFSP: Rate Payer FSP quote\n(depending on fee model) +PayerFSP ->> Switch: **POST /quotes**\n(Transaction details) +activate Switch +autonumber stop +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +autonumber resume +Switch ->> PayeeFSP: **POST /quote**\n(Transaction details) +activate PayeeFSP +autonumber stop +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +autonumber resume +PayeeFSP -> PayeeFSP: Rate Payee FSP\nfee/commission,\ngenerate condition +group #OldLace Optional + hnote left of PayeeFSP #OldLace + Confirm quote + end hnote + PayeeFSP -> Payee: Here is the\nquote and\nPayer name + autonumber stop + PayeeFSP <- Payee: I confirm +end +autonumber resume +Switch <<- PayeeFSP: **PUT /quote/**\n(Payee FSP fee/commission,\ncondition) +autonumber stop +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +autonumber resume +PayerFSP <<- Switch: **PUT /quotes/**\n(Payee FSP fee/commission,\ncondition) +autonumber stop +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +autonumber resume +PayerFSP -> PayerFSP: Rate Payer FSP quote\n(depending on fee model) +autonumber stop +Payer <- PayerFSP: Present fees and\noptionally payee name +deactivate PayerFSP +autonumber resume +Payer -> PayerFSP: I approve the\ntransaction +activate PayerFSP +autonumber stop +PayerFSP -> PayerFSP: Reserve transfer from Payer\naccount to Switch account +autonumber resume +PayerFSP -> Switch: **POST /transfers**\n(Transfer ID, condition, ILP packet\nincluding transaction ID) +autonumber stop +activate Switch +PayerFSP <-- Switch: **HTTL 202** (Accepted) +autonumber resume +Switch -> Switch: Reserve transfer from\nPayer FSP to Payee FSP +autonumber stop +Switch ->> PayeeFSP: **POST /transfers**\n(Transfer ID, condition, ILP packet\nincluding transaction ID) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +autonumber resume +PayeeFSP -> PayeeFSP: Perform transfer\nfrom Switch\naccount to Payee\naccount, generate\nfulfilment +autonumber stop +PayeeFSP -> Payee: Transaction notification +autonumber resume +Switch <<- PayeeFSP: **PUT /transfers/**\n(Fulfilment) +autonumber stop +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +autonumber resume +Switch -> Switch: Commit transfer from\nPayer FSP to Payee FSP +autonumber stop +PayerFSP <<- Switch: **PUT /transfers/**\n(Fulfilment) +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +autonumber resume +PayerFSP -> PayerFSP: Commit transfer from Payer\naccount to Switch account +group #OldLace Optional + hnote left of PayerFSP #OldLace + Get transaction data + end hnote + PayerFSP ->> Switch: **GET /transactions/** + activate Switch + autonumber stop + PayerFSP <<-- Switch: **HTTP 202** (Accepted) + autonumber resume + Switch <<- PayeeFSP: **GET /transactions/** + activate PayeeFSP + autonumber stop + Switch -->> PayeeFSP: **HTTP 202** (Accepted) + autonumber resume + PayeeFSP -> PayeeFSP: Lookup\ntransaction\ninformation + Switch <<- PayeeFSP: **PUT /transactions/**\n(Transaction details) + autonumber stop + Switch -->> PayeeFSP: **HTTP 200** (OK) + deactivate PayeeFSP + autonumber resume + PayerFSP <<- Switch: **PUT /transactions/**\n(Transaction details) + autonumber stop + PayerFSP -->> Switch: **HTTP 200** (OK) + deactivate Switch +end +autonumber resume +Payer <- PayerFSP: Transaction notification\nincluding optional\ntransaction data\n(e.g. token ID) +deactivate PayerFSP +autonumber stop +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure64.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure64.svg new file mode 100644 index 000000000..a5fe0d64d --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure64.svg @@ -0,0 +1,399 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + + Optional + Switch + + Account + Lookup + + Payee + FSP + + Payee + + + + + + + + + + + + + + + + + [1] + I would like to + pay 100 USD + to +123456789 + + + + + Payee not within + Payer FSP system + + + + [2] + GET /parties/MSISDN/123456789 + + + + HTTP 202 + (Accepted) + + + + [3] + GET /participants/MSISDN/123456789 + + + + HTTP 202 + (Accepted) + + + + + Lookup which + FSP MSISDN + +123456789 + belongs to + + + + [4] + PUT /participants/MSISDN/123456789 + (FSP ID) + + + + HTTP 200 + (OK) + + + + [5] + GET /parties/MSISDN/123456789 + + + + HTTP 202 + (Accepted) + + + + + Lookup party + information + Regarding + MSISDN + +123456789 + + + + [6] + Put /parties/MSISDN/123456789 + (Party information) + + + + HTTP 200 + (OK) + + + + [7] + PUT /parties/MSISDN/123456789 + (Party information) + + + + HTTP 200 + (OK) + + + + + [9] + Rate Payer FSP quote + (depending on fee model) + + + + [10] + POST /quotes + (Transaction details) + + + + HTTP 202 + (Accepted) + + + + [11] + POST /quote + (Transaction details) + + + + HTTP 202 + (Accepted) + + + + + [12] + Rate Payee FSP + fee/commission, + generate condition + + + Optional + + Confirm quote + + + [13] + Here is the + quote and + Payer name + + + I confirm + + + + [14] + PUT /quote/ + <ID> + (Payee FSP fee/commission, + condition) + + + + HTTP 200 + (OK) + + + + [15] + PUT /quotes/ + <ID> + (Payee FSP fee/commission, + condition) + + + + HTTP 200 + (OK) + + + + + [16] + Rate Payer FSP quote + (depending on fee model) + + + Present fees and + optionally payee name + + + [17] + I approve the + transaction + + + + + Reserve transfer from Payer + account to Switch account + + + [18] + POST /transfers + (Transfer ID, condition, ILP packet + including transaction ID) + + + HTTL 202 + (Accepted) + + + + + [19] + Reserve transfer from + Payer FSP to Payee FSP + + + + POST /transfers + (Transfer ID, condition, ILP packet + including transaction ID) + + + + HTTP 202 + (Accepted) + + + + + [20] + Perform transfer + from Switch + account to Payee + account, generate + fulfilment + + + Transaction notification + + + + [21] + PUT /transfers/ + <ID> + (Fulfilment) + + + + HTTP 200 + (OK) + + + + + [22] + Commit transfer from + Payer FSP to Payee FSP + + + + PUT /transfers/ + <ID> + (Fulfilment) + + + + HTTP 200 + (OK) + + + + + [23] + Commit transfer from Payer + account to Switch account + + + Optional + + Get transaction data + + + + [24] + GET /transactions/ + <TransactionID> + + + + HTTP 202 + (Accepted) + + + + [25] + GET /transactions/ + <TransactionID> + + + + HTTP 202 + (Accepted) + + + + + [26] + Lookup + transaction + information + + + + [27] + PUT /transactions/ + <TransactionID> + (Transaction details) + + + + HTTP 200 + (OK) + + + + [28] + PUT /transactions/ + <TransactionID> + (Transaction details) + + + + HTTP 200 + (OK) + + + [29] + Transaction notification + including optional + transaction data + (e.g. token ID) + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure64a.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure64a.plantuml new file mode 100644 index 000000000..673e1daca --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure64a.plantuml @@ -0,0 +1,212 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Payer-Initiated Transaction + +' Actor Keys: +' participant - FSP(Payer/Payee), Switch and Account Lookup +' actor - Payer/Payee(s) + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "Optional\nSwitch" as Switch +participant "Account\nLookup" as ALS +participant "Payee\nFSP" as PayeeFSP +actor "<$actor>\nPayee" as Payee + +' start flow +autonumber 1 1 "[0]" +Payer -> PayerFSP: I would like to\npay 100 USD\nto +123456789 +activate PayerFSP +PayerFSP -> PayerFSP: Payee not within\nPayer FSP system +autonumber stop +PayerFSP ->> Switch: **Lookup Party Information**\n(MSISDN 123456789) +activate Switch +autonumber resume +Switch ->> ALS: **Lookup Participant Information**\n(MSISDN 123456789) +activate ALS +ALS -> ALS: Lookup which\nFSP MSISDN\n+123456789\nbelongs to +autonumber stop +Switch <<- ALS: **Return Participant Information**\n(FSP ID) +deactivate ALS +autonumber resume +Switch ->> PayeeFSP: **Lookup Party Information**\n(MSISDN 123456789) +activate PayeeFSP +PayeeFSP -> PayeeFSP: Lookup party\ninformation\nregarding\nMSISDN\n+123456789 +autonumber stop +Switch <<- PayeeFSP: **Return Party Information**\n(Party Information) +deactivate PayeeFSP +autonumber resume +PayerFSP <<- Switch: **Return Party Information**\n(Party Information) +deactivate Switch +deactivate PayerFSP +PayerFSP -[hidden]> Switch +activate PayerFSP +PayerFSP -> PayerFSP: Rate Payer FSP quote\n(depending on fee model) +PayerFSP ->> Switch: **Calculate Quote**\n(Transaction details) +activate Switch +Switch ->> PayeeFSP: **Calculate Quote**\n(Transaction details) +activate PayeeFSP +PayeeFSP -> PayeeFSP: Rate Payee FSP\nfee/commission,\ngenerate condition +group #OldLace Optional + hnote left of PayeeFSP #OldLace + Confirm quote + end hnote + PayeeFSP -> Payee: Here is the\nquote and\nPayer name + autonumber stop + PayeeFSP <- Payee: I confirm +end +autonumber resume +Switch <<- PayeeFSP: **Return Quote Information**\n(Payee FSP fee/commission,\ncondition) +deactivate PayeeFSP +PayerFSP <<- Switch: **Return Quote Information**\n(Payee FSP fee/commission,\ncondition) +deactivate Switch +PayerFSP -> PayerFSP: Rate Payer FSP quote\n(depending on fee model) +autonumber stop +Payer <- PayerFSP: Present fees and\noptionally payee name +deactivate PayerFSP +autonumber resume +Payer -> PayerFSP: I approve the\ntransaction +activate PayerFSP +autonumber stop +PayerFSP -> PayerFSP: Reserve transfer from Payer\naccount to Switch account +autonumber resume +PayerFSP -> Switch: **Preform Transfers**\n(Transfer ID, condition, ILP packet\nincluding transaction ID) +activate Switch +Switch -> Switch: Reserve transfer from\nPayer FSP to Payee FSP +autonumber stop +Switch ->> PayeeFSP: **Perform Transfer**\n(Transfer ID, condition, ILP packet\nincluding transaction ID) +activate PayeeFSP +autonumber resume +PayeeFSP -> PayeeFSP: Perform transfer\nfrom Switch\naccount to Payee\naccount, generate\nfulfilment +PayeeFSP -> Payee: Transaction notification +autonumber stop +Switch <<- PayeeFSP: **Return Transfer Information**\n(Fulfilment) +deactivate PayeeFSP +autonumber resume +Switch -> Switch: Commit transfer from\nPayer FSP to Payee FSP +autonumber stop +PayerFSP <<- Switch: **Return Transfer Information**\n(Fulfilment) +deactivate Switch +autonumber resume +PayerFSP -> PayerFSP: Commit transfer from Payer\naccount to Switch account +group #OldLace Optional + hnote left of PayerFSP #OldLace + Get transaction data + end hnote + PayerFSP ->> Switch: **Retrieve Transaction Information**\n(Transaction ID) + activate Switch + Switch <<- PayeeFSP: **Retrieve Transaction Information**\n(Transaction ID) + activate PayeeFSP + PayeeFSP -> PayeeFSP: Lookup\ntransaction\ninformation + Switch <<- PayeeFSP: **Return Transaction Information**\n(Transaction details) + deactivate PayeeFSP + PayerFSP <<- Switch: **Return Transaction Information**\n(Transaction details) + deactivate Switch +end +Payer <- PayerFSP: Transaction notification\nincluding optional\ntransaction data\n(e.g. token ID) +deactivate PayerFSP +autonumber stop +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure64a.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure64a.svg new file mode 100644 index 000000000..44df91386 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure64a.svg @@ -0,0 +1,307 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + + Optional + Switch + + Account + Lookup + + Payee + FSP + + Payee + + + + + + + + + + + + + + + + + [1] + I would like to + pay 100 USD + to +123456789 + + + + + [2] + Payee not within + Payer FSP system + + + + Lookup Party Information + (MSISDN 123456789) + + + + [3] + Lookup Participant Information + (MSISDN 123456789) + + + + + [4] + Lookup which + FSP MSISDN + +123456789 + belongs to + + + + Return Participant Information + (FSP ID) + + + + [5] + Lookup Party Information + (MSISDN 123456789) + + + + + [6] + Lookup party + information + regarding + MSISDN + +123456789 + + + + Return Party Information + (Party Information) + + + + [7] + Return Party Information + (Party Information) + + + + + [9] + Rate Payer FSP quote + (depending on fee model) + + + + [10] + Calculate Quote + (Transaction details) + + + + [11] + Calculate Quote + (Transaction details) + + + + + [12] + Rate Payee FSP + fee/commission, + generate condition + + + Optional + + Confirm quote + + + [13] + Here is the + quote and + Payer name + + + I confirm + + + + [14] + Return Quote Information + (Payee FSP fee/commission, + condition) + + + + [15] + Return Quote Information + (Payee FSP fee/commission, + condition) + + + + + [16] + Rate Payer FSP quote + (depending on fee model) + + + Present fees and + optionally payee name + + + [17] + I approve the + transaction + + + + + Reserve transfer from Payer + account to Switch account + + + [18] + Preform Transfers + (Transfer ID, condition, ILP packet + including transaction ID) + + + + + [19] + Reserve transfer from + Payer FSP to Payee FSP + + + + Perform Transfer + (Transfer ID, condition, ILP packet + including transaction ID) + + + + + [20] + Perform transfer + from Switch + account to Payee + account, generate + fulfilment + + + [21] + Transaction notification + + + + Return Transfer Information + (Fulfilment) + + + + + [22] + Commit transfer from + Payer FSP to Payee FSP + + + + Return Transfer Information + (Fulfilment) + + + + + [23] + Commit transfer from Payer + account to Switch account + + + Optional + + Get transaction data + + + + [24] + Retrieve Transaction Information + (Transaction ID) + + + + [25] + Retrieve Transaction Information + (Transaction ID) + + + + + [26] + Lookup + transaction + information + + + + [27] + Return Transaction Information + (Transaction details) + + + + [28] + Return Transaction Information + (Transaction details) + + + [29] + Transaction notification + including optional + transaction data + (e.g. token ID) + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure65.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure65.plantuml new file mode 100644 index 000000000..369c7624a --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure65.plantuml @@ -0,0 +1,283 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Payee Initiated Transaction pattern using the asynchronous REST binding + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payer/Payee(s) + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "Optional\nSwitch" as Switch +participant "Account\nLookup" as ALS +participant "Payee\nFSP" as PayeeFSP +actor "<$actor>\nPayee" as Payee + +' start flow +autonumber 1 1 "[0]" +PayeeFSP <- Payee: I would like\nto receive\n100 USD from\n+123456789 +activate PayeeFSP +PayeeFSP <- PayeeFSP: Payer not\nwithin Payee\nFSP system +autonumber stop +ALS <<- PayeeFSP: **GET /participants/MSISDN/123456789** +activate ALS +ALS -->> PayeeFSP: **HTTP 202** (Accepted) +autonumber resume +ALS -> ALS: Lookup which FSP MSISDN\n+123456789 belongs to +ALS ->> PayeeFSP: **PUT /participants/MSISDN/123456789**\n(FSP ID) +autonumber stop +ALS <<-- PayeeFSP: **HTTP 200** (OK) +deactivate ALS +deactivate PayeeFSP +autonumber resume +Switch <<- PayeeFSP: **Post /transactionRequests**\n(Payee information, transaction details) +activate PayeeFSP +activate Switch +autonumber stop +Switch -->> PayeeFSP: **HTTP 202** (Accepted) +autonumber resume +PayerFSP <<- Switch: **POST /transactionRequests**\n(Payee information,\ntransaction details) +activate PayerFSP +autonumber stop +PayerFSP -->> Switch: **HTTP 202** (Accepted) +deactivate Switch +autonumber resume +PayerFSP -> PayerFSP: Perform optional validation +PayerFSP ->> Switch: **PUT /transactionRequests/**\n(Received status) +autonumber stop +activate Switch +PayerFSP <<-- Switch: **HTTP 200** (OK) +deactivate PayerFSP +autonumber resume +Switch ->> PayeeFSP: **PUT /transactionRequests/**\n(Received status) +autonumber stop +Switch <<-- PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +deactivate Switch +autonumber resume +activate PayerFSP +PayerFSP -> PayerFSP: Rate Payer FSP quote\n(depending on fee model) +PayerFSP ->> Switch: **POST /quotes**\n(Transaction details) +activate Switch +autonumber stop +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +autonumber resume +Switch ->> PayeeFSP: **POST /quotes**\n(Transaction details) +activate PayeeFSP +autonumber stop +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Rate Payee FSP\nfees/commission,\ngenerate condition +group #OldLace Optional + hnote left of PayeeFSP #OldLace + Confirm quote + end hnote + autonumber resume + PayeeFSP -> Payee: Here is the\nquote and\nPayer name + autonumber stop + PayeeFSP <- Payee: I confirm +end +autonumber resume +Switch <<- PayeeFSP: **PUT /quotes/**\n(Payee FSP fee/commission,condition) +autonumber stop +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +autonumber resume +PayerFSP <<- Switch: **PUT /quotes/**\n(Payee FSP\nfee/commission,condition) +autonumber stop +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +autonumber resume +PayerFSP -> PayerFSP: Rate Payer FSP quote\n(depending on the fee model) +Payer <- PayerFSP: Will you approve the\ntransaction request\nfor 100 USD\n(plus fees)\nto Payee? +deactivate PayerFSP +Alt #OldLace Alternatives + hnote over of Payer #OldLace + User rejects + transaction request + end hnote + autonumber resume + Payer -> PayerFSP: I reject the\ntransaction request + activate PayerFSP + PayerFSP ->> Switch: **PUT /transactionRequests/**\n(Rejected state) + activate Switch + autonumber stop + PayerFSP <<-- Switch: **HTTP 200** (OK) + deactivate PayerFSP + autonumber resume + Switch ->> PayeeFSP: **PUT /transactionRequests/**\n(Rejected state) + activate PayeeFSP + autonumber stop + Switch <<-- PayeeFSP: **HTTP 200** (OK) + deactivate Switch + autonumber resume + PayeeFSP -> Payee: Transaction failed\ndue to user\nrejection + deactivate PayeeFSP + autonumber stop +else + hnote over of Payer #OldLace + User approves + transaction request + end hnote + Payer -> PayerFSP: I approve the\ntransaction request + activate PayerFSP + autonumber resume + PayerFSP -> PayerFSP: Reserve transfer from Payer\naccount to Switch account + autonumber stop + PayerFSP ->> Switch: **POST /transfers**\n(Transfer ID, condition, ILP packet\nincluding transaction ID) + activate Switch + PayerFSP <<-- Switch: **HTTP 202** (Accepted) + autonumber resume + Switch -> Switch: Reserve transfer\nfrom Payer\nFSP to Payee FSP + autonumber stop + Switch ->> PayeeFSP: **POST /transfers**\n(Transfer ID, condition, ILP packet\nincluding transaction ID) + activate PayeeFSP + Switch <<-- PayeeFSP: **HTTP 202** (Accepted) + autonumber resume + PayeeFSP -> PayeeFSP: Perform transfer\nfrom Switch account\nto Payee account,\ngenerate fulfilment + PayeeFSP -> Payee: Transaction\nnotification + autonumber stop + Switch <<- PayeeFSP: **PUT /transfers/**\n(Fulfilment) + Switch -->> PayeeFSP: **HTTP 200** (OK) + deactivate PayeeFSP + autonumber resume + Switch -> Switch: Commit transfer\nfrom Payer FSP\nto Payee FSP + autonumber stop + PayerFSP <<- Switch: **PUT /transfers/**\n(Fulfilment) + PayerFSP -->> Switch: **HTTP 200** (OK) + deactivate Switch + autonumber resume + PayerFSP -> PayerFSP: Commit transfer from Payer\naccount to Payee FSP account + group #LightGrey Optional + hnote over PayerFSP #LightGrey + Get transaction data + end hnote + autonumber resume + PayerFSP ->> Switch: **GET /transactions/** + activate Switch + autonumber stop + PayerFSP <<-- Switch: **HTTP 202** (Accepted) + autonumber resume + Switch ->> PayeeFSP: **GET /transactions/** + activate PayeeFSP + autonumber stop + Switch <<-- PayeeFSP: **HTTP 202** (Accepted) + autonumber resume + PayeeFSP -> PayeeFSP: Looksup transaction\ninformation + Switch <<- PayeeFSP: **PUT /transactions/**\n(Transaction details) + autonumber stop + Switch -->> PayeeFSP: **HTTP 200** (OK) + deactivate PayeeFSP + autonumber resume + PayerFSP <<- Switch: **PUT /transactions/**\n(Transaction details) + autonumber stop + PayerFSP -->> Switch: **HTTP 200** (OK) + deactivate Switch + end + autonumber resume + Payer <- PayerFSP: Transaction\nnotification + deactivate PayerFSP +end +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure65.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure65.svg new file mode 100644 index 000000000..e606726df --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure65.svg @@ -0,0 +1,462 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + + Optional + Switch + + Account + Lookup + + Payee + FSP + + Payee + + + + + + + + + + + + + + + + + + + + + + [1] + I would like + to receive + 100 USD from + +123456789 + + + + + [2] + Payer not + within Payee + FSP system + + + + GET /participants/MSISDN/123456789 + + + + HTTP 202 + (Accepted) + + + + + [3] + Lookup which FSP MSISDN + +123456789 belongs to + + + + [4] + PUT /participants/MSISDN/123456789 + (FSP ID) + + + + HTTP 200 + (OK) + + + + [5] + Post /transactionRequests + (Payee information, transaction details) + + + + HTTP 202 + (Accepted) + + + + [6] + POST /transactionRequests + (Payee information, + transaction details) + + + + HTTP 202 + (Accepted) + + + + + [7] + Perform optional validation + + + + [8] + PUT /transactionRequests/ + <ID> + (Received status) + + + + HTTP 200 + (OK) + + + + [9] + PUT /transactionRequests/ + <ID> + (Received status) + + + + HTTP 200 + (OK) + + + + + [10] + Rate Payer FSP quote + (depending on fee model) + + + + [11] + POST /quotes + (Transaction details) + + + + HTTP 202 + (Accepted) + + + + [12] + POST /quotes + (Transaction details) + + + + HTTP 202 + (Accepted) + + + + + Rate Payee FSP + fees/commission, + generate condition + + + Optional + + Confirm quote + + + [13] + Here is the + quote and + Payer name + + + I confirm + + + + [14] + PUT /quotes/ + <ID> + (Payee FSP fee/commission,condition) + + + + HTTP 200 + (OK) + + + + [15] + PUT /quotes/ + <ID> + (Payee FSP + fee/commission,condition) + + + + HTTP 200 + (OK) + + + + + [16] + Rate Payer FSP quote + (depending on the fee model) + + + [17] + Will you approve the + transaction request + for 100 USD + (plus fees) + to Payee? + + + alt + [Alternatives] + + User rejects + transaction request + + + [18] + I reject the + transaction request + + + + [19] + PUT /transactionRequests/ + <ID> + (Rejected state) + + + + HTTP 200 + (OK) + + + + [20] + PUT /transactionRequests/ + <ID> + (Rejected state) + + + + HTTP 200 + (OK) + + + [21] + Transaction failed + due to user + rejection + + + User approves + transaction request + + + I approve the + transaction request + + + + + [22] + Reserve transfer from Payer + account to Switch account + + + + POST /transfers + (Transfer ID, condition, ILP packet + including transaction ID) + + + + HTTP 202 + (Accepted) + + + + + [23] + Reserve transfer + from Payer + FSP to Payee FSP + + + + POST /transfers + (Transfer ID, condition, ILP packet + including transaction ID) + + + + HTTP 202 + (Accepted) + + + + + [24] + Perform transfer + from Switch account + to Payee account, + generate fulfilment + + + [25] + Transaction + notification + + + + PUT /transfers/ + <ID> + (Fulfilment) + + + + HTTP 200 + (OK) + + + + + [26] + Commit transfer + from Payer FSP + to Payee FSP + + + + PUT /transfers/ + <ID> + (Fulfilment) + + + + HTTP 200 + (OK) + + + + + [27] + Commit transfer from Payer + account to Payee FSP account + + + Optional + + Get transaction data + + + + [28] + GET /transactions/ + <TransactionID> + + + + HTTP 202 + (Accepted) + + + + [29] + GET /transactions/ + <TransactionID> + + + + HTTP 202 + (Accepted) + + + + + [30] + Looksup transaction + information + + + + [31] + PUT /transactions/ + <TransactionID> + (Transaction details) + + + + HTTP 200 + (OK) + + + + [32] + PUT /transactions/ + <TransactionID> + (Transaction details) + + + + HTTP 200 + (OK) + + + [33] + Transaction + notification + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure65a.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure65a.plantuml new file mode 100644 index 000000000..86398225a --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure65a.plantuml @@ -0,0 +1,234 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Payee Initiated Transaction + +' Actor Keys: +' participant - FSP(Payer/Payee), Switch and Account Lookup +' actor - Payer/Payee(s) + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "Optional\nSwitch" as Switch +participant "Account\nLookup" as ALS +participant "Payee\nFSP" as PayeeFSP +actor "<$actor>\nPayee" as Payee + +' start flow +autonumber 1 1 "[0]" +PayeeFSP <- Payee: I would like\nto receive\n100 USD from\n+123456789 +activate PayeeFSP +PayeeFSP <- PayeeFSP: Payer not\nwithin Payee\nFSP system +autonumber stop +ALS <<- PayeeFSP: **Lookup Participant Information**\n(MSISDN 123456789) +activate ALS +autonumber resume +ALS -> ALS: Lookup which FSP MSISDN\n+123456789 belongs to +ALS ->> PayeeFSP: **Returns Participant Information**\n(FSP ID) +deactivate ALS +deactivate PayeeFSP +Switch <<- PayeeFSP: **Perform Transaction Request**\n(Payee information, transaction details) +activate PayeeFSP +activate Switch +PayerFSP <<- Switch: **Perform Transaction Request**\n(Payee information,\ntransaction details) +deactivate Switch +activate PayerFSP +PayerFSP -> PayerFSP: Perform optional validation +PayerFSP ->> Switch: **Return Transaction**\n**Request Information**\n(Received status) +activate Switch +deactivate PayerFSP +Switch ->> PayeeFSP: **Return Transaction Request Information**\n(Received status) +deactivate PayeeFSP +deactivate Switch +activate PayerFSP +PayerFSP -> PayerFSP: Rate Payer FSP quote\n(depending on fee model) +autonumber stop +PayerFSP ->> Switch: **Calculate Quote**\n(Transaction detail) +activate Switch +autonumber resume +Switch ->> PayeeFSP: **Calculate Quote**\n(Transaction details) +activate PayeeFSP +PayeeFSP -> PayeeFSP: Rate Payee FSP\nfees/commission,\ngenerate condition +group #OldLace Optional + hnote left of PayeeFSP #OldLace + Confirm quote + end hnote + PayeeFSP -> Payee: Here is the\nquote and\nPayer name + autonumber stop + PayeeFSP <- Payee: I confirm +end +autonumber resume +Switch <<- PayeeFSP: **Return Quote Information**\n(Payee FSP fee/commission,condition) +deactivate PayeeFSP +PayerFSP <<- Switch: **Return Quote Information**\n(Payee FSP\nfee/commission,condition) +deactivate Switch +PayerFSP -> PayerFSP: Rate Payer FSP quote\n(depending on the fee model) +Payer <- PayerFSP: Will you approve\ntransaction\nrequest for\n100 USD(plusfees)\nto Payee? +deactivate PayerFSP +Alt #OldLace Alternatives + hnote over of Payer #OldLace + User rejects + transaction request + end hnote + Payer -> PayerFSP: I reject the\ntransaction request + activate PayerFSP + PayerFSP ->> Switch: **Return Transaction**\n**Request Information**\n(Rejected state) + deactivate PayerFSP + activate Switch + Switch ->> PayeeFSP: **Return Transaction Request Information**\n(Rejected state) + deactivate Switch + activate PayeeFSP + PayeeFSP -> Payee: Transaction failed\ndue to user\nrejection + deactivate PayeeFSP + autonumber stop +else + hnote over of Payer #OldLace + User rejects + transaction request + end hnote + Payer -> PayerFSP: I approve the\ntransaction request + activate PayerFSP + autonumber resume + PayerFSP -> PayerFSP: Reserve transfer from Payer\naccount to Switch account + autonumber stop + PayerFSP ->> Switch: **Perform Transfer**\n(Transfer ID, condition, ILP packet\nincluding transaction ID) + activate Switch + autonumber resume + Switch -> Switch: Reserve transfer\nfrom Payer\nFSP to Payee FSP + autonumber stop + Switch ->> PayeeFSP: **Perform Transfer**\n(Transfer ID, condition, ILP packet\nincluding transaction ID) + activate PayeeFSP + autonumber resume + PayeeFSP -> PayeeFSP: Perform transfer\nfrom Switch account\nto Payee account,\ngenerate fulfilment + PayeeFSP -> Payee: Transaction\nnotification + autonumber stop + Switch <<- PayeeFSP: **Retrun Transfer Information**\n(Fulfilment) + deactivate PayeeFSP + autonumber resume + Switch -> Switch: Commit transfer\nfrom Payer FSP\nto Payee FSP + autonumber stop + PayerFSP <<- Switch: **Return Transfer Information**\n(Fulfilment) + deactivate Switch + autonumber resume + PayerFSP -> PayerFSP: Commit transfer from Payer\naccount to Payee FSP account + group #LightGrey Optional + hnote over PayerFSP #LightGrey + Get transaction data + end hnote + PayerFSP ->> Switch: **Retrieve Transaction Information**\n(Transaction ID) + activate Switch + Switch ->> PayeeFSP: **Retrieve Transaction Information**\n(Transaction ID) + activate PayeeFSP + PayeeFSP -> PayeeFSP: Looksup transaction\ninformation + Switch <<- PayeeFSP: **Return Transaction Information**\n(Transaction detail) + deactivate PayeeFSP + PayerFSP <<- Switch: **Return Transaction Information**\n(Transaction detail) + deactivate Switch + end + Payer <- PayerFSP: Transaction\nnotification + deactivate PayerFSP +end +autonumber stop +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure65a.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure65a.svg new file mode 100644 index 000000000..cb9409cac --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure65a.svg @@ -0,0 +1,355 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + + Optional + Switch + + Account + Lookup + + Payee + FSP + + Payee + + + + + + + + + + + + + + + + + + + + + + [1] + I would like + to receive + 100 USD from + +123456789 + + + + + [2] + Payer not + within Payee + FSP system + + + + Lookup Participant Information + (MSISDN 123456789) + + + + + [3] + Lookup which FSP MSISDN + +123456789 belongs to + + + + [4] + Returns Participant Information + (FSP ID) + + + + [5] + Perform Transaction Request + (Payee information, transaction details) + + + + [6] + Perform Transaction Request + (Payee information, + transaction details) + + + + + [7] + Perform optional validation + + + + [8] + Return Transaction + Request Information + (Received status) + + + + [9] + Return Transaction Request Information + (Received status) + + + + + [10] + Rate Payer FSP quote + (depending on fee model) + + + + Calculate Quote + (Transaction detail) + + + + [11] + Calculate Quote + (Transaction details) + + + + + [12] + Rate Payee FSP + fees/commission, + generate condition + + + Optional + + Confirm quote + + + [13] + Here is the + quote and + Payer name + + + I confirm + + + + [14] + Return Quote Information + (Payee FSP fee/commission,condition) + + + + [15] + Return Quote Information + (Payee FSP + fee/commission,condition) + + + + + [16] + Rate Payer FSP quote + (depending on the fee model) + + + [17] + Will you approve + transaction + request for + 100 USD(plusfees) + to Payee? + + + alt + [Alternatives] + + User rejects + transaction request + + + [18] + I reject the + transaction request + + + + [19] + Return Transaction + Request Information + (Rejected state) + + + + [20] + Return Transaction Request Information + (Rejected state) + + + [21] + Transaction failed + due to user + rejection + + + User rejects + transaction request + + + I approve the + transaction request + + + + + [22] + Reserve transfer from Payer + account to Switch account + + + + Perform Transfer + (Transfer ID, condition, ILP packet + including transaction ID) + + + + + [23] + Reserve transfer + from Payer + FSP to Payee FSP + + + + Perform Transfer + (Transfer ID, condition, ILP packet + including transaction ID) + + + + + [24] + Perform transfer + from Switch account + to Payee account, + generate fulfilment + + + [25] + Transaction + notification + + + + Retrun Transfer Information + (Fulfilment) + + + + + [26] + Commit transfer + from Payer FSP + to Payee FSP + + + + Return Transfer Information + (Fulfilment) + + + + + [27] + Commit transfer from Payer + account to Payee FSP account + + + Optional + + Get transaction data + + + + [28] + Retrieve Transaction Information + (Transaction ID) + + + + [29] + Retrieve Transaction Information + (Transaction ID) + + + + + [30] + Looksup transaction + information + + + + [31] + Return Transaction Information + (Transaction detail) + + + + [32] + Return Transaction Information + (Transaction detail) + + + [33] + Transaction + notification + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure66.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure66.plantuml new file mode 100644 index 000000000..179a4e1b1 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure66.plantuml @@ -0,0 +1,346 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' Payee Initiated Transaction using OTP pattern using the asynchronous REST binding + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payer/Payee(s) + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "Optional\nSwitch" as Switch +participant "Account\nLookup" as ALS +participant "Payee\nFSP" as PayeeFSP +actor "<$actor>\nPayee" as Payee + +' start flow +autonumber 1 1 "[0]" +Group #Oldlace Option #1 + hnote left of Payer #Oldlace + User + initiated + OTP + end hnote + Payer -> PayerFSP: Generate\nOTP for me + activate PayerFSP + PayerFSP -> PayerFSP: Generate OTP + Payer <- PayerFSP: Your OTP\nis 12345 + deactivate PayerFSP +end +PayeeFSP <- Payee: I would like\nto receive\n100 USD from\n+123456789 +activate PayeeFSP +autonumber stop +PayeeFSP <- PayeeFSP: MSISDN not within\nPayee FSP system +autonumber resume +ALS <<- PayeeFSP: **GET /participants/MSISDN/123456789** +activate ALS +autonumber stop +ALS -->> PayeeFSP: **HTTP 202** (Accepted) +autonumber resume +ALS <- ALS: Lookup which FSP MSISDN\n+123456789 belongs to +ALS -> PayeeFSP: **PUT /participants/MSISDN/123456789**\n(FSP ID) +autonumber stop +ALS <<-- PayeeFSP: **HTTP 200** (OK) +deactivate ALS +deactivate PayeeFSP +autonumber resume +Switch <<- PayeeFSP: **POST /transactionRequests**\n(Payee information, transaction details, OTP authorization) +activate PayeeFSP +activate Switch +autonumber stop +Switch -->> PayeeFSP: **HTTP 202** (Accepted) +autonumber resume +PayerFSP <<- Switch: **POST /transactionRequests**\n(Payee information,\ntransaction details, OTP authorization) +activate PayerFSP +autonumber stop +PayerFSP -->> Switch: **HTTP 202** (Accepted) +autonumber resume +PayerFSP -> PayerFSP: Perform optional validation +PayerFSP ->> Switch: **Put /transactionRequests/**\n(Received status) +autonumber stop +PayerFSP <<-- Switch: **HTTP 200** (OK) +deactivate PayerFSP +autonumber resume +Switch ->> PayeeFSP: **Put /transactionRequests/**\n(Received status) +autonumber stop +Switch <<-- PayeeFSP: **HTTP 200** (OK) +deactivate Switch +deactivate PayeeFSP +PayerFSP -[hidden]> Switch +deactivate PayerFSP +PayerFSP -[hidden]> Switch +activate PayerFSP +autonumber resume +PayerFSP -> PayerFSP: Rate Payer FSP quote\n(depending on fee model) +PayerFSP ->> Switch: **POST /qoutes**\n(Transaction details) +activate Switch +autonumber stop +PayerFSP <<-- Switch: **HTTP 202**\n(Accepted) +autonumber resume +Switch ->> PayeeFSP: **POST /qoutes**\n(Transaction details) +activate PayeeFSP +autonumber stop +Switch <<-- PayeeFSP: **HTTP 202**\n(Accepted) +PayeeFSP -> PayeeFSP: Rate Payee FSP\nfees/commission,\ngenerate condition +Group #Oldlace Optional + hnote left of PayeeFSP #Oldlace + Confirm + quote + end hnote + autonumber resume + PayeeFSP -> Payee: Her is the\nquote and\nPayer name + autonumber stop + PayeeFSP <- Payee: I confirm +end +autonumber resume +Switch <<- PayeeFSP: **PUT /quote/**\n(Payee FSP fee/commission,\ncondition) +autonumber stop +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +autonumber resume +PayerFSP <<- Switch: **PUT /quote/**\n(Payee FSP fee/commission,\ncondition) +autonumber stop +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +autonumber resume +PayerFSP -> PayerFSP: Rate Payer FSP quote\n(depending on fee model) +autonumber stop +PayerFSP -[hidden]> Switch +deactivate PayerFSP +Group #Oldlace Option #2 + hnote left of Payer #Oldlace + Automatic + generated + OTP + end hnote + PayerFSP -[hidden]> Switch + activate PayerFSP + autonumber resume + PayerFSP -> PayerFSP: Generate OTP + Payer <- PayerFSP: Use OTP\nto confirm +end +PayerFSP ->> Switch: **GET /authorizations/**\n(Amount and fees) +activate Switch +autonumber stop +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +autonumber resume +Switch ->> PayeeFSP: **GET /authorizations/**\n(Amount and fees) +activate PayeeFSP +autonumber stop +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +autonumber resume +PayeeFSP -> Payee: Show fees\non POS +Payee -> Payee: Payer\napproves/rejects\ntransaction\nusing OTP +autonumber stop +PayeeFSP <<-- Payee: Entered OTP +autonumber resume +Switch <<- PayeeFSP: **PUT /authorizations/**\n(OTP) +autonumber stop +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +autonumber resume +PayerFSP <<- Switch: **PUT /authorizations/**\n(OTP) +autonumber stop +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +autonumber resume +PayerFSP -> PayerFSP: Validate OTP sent by Payee FSP +autonumber stop +PayerFSP -[hidden]> Switch +deactivate PayerFSP +Group #Oldlace Alternatives + hnote left of Payer #Oldlace + OTP + validation + failed + end hnote + autonumber resume + PayerFSP ->> Switch: **PUT /transactionRequests/**\n(Rejected state) + activate PayerFSP + activate Switch + autonumber stop + PayerFSP <<-- Switch: **HTTP 200** (OK) + deactivate PayerFSP + autonumber resume + Switch ->> PayeeFSP: **PUT /transactionRequests/**\n(Rejected state) + activate PayeeFSP + autonumber stop + Switch <<-- PayeeFSP: **HTTP 200** (OK) + deactivate Switch + autonumber resume + PayeeFSP -> Payee: Transaction\nfailed due to\nincorrect OTP + deactivate PayeeFSP + autonumber stop +else + hnote left of Payer #Oldlace + OTP + validation + successful + end hnote + PayerFSP -[hidden]> Switch + autonumber 33 1 + activate PayerFSP + PayerFSP -> PayerFSP: Reserve transfer from Payer\naccount to Switch account + autonumber stop + PayerFSP ->> Switch: **POST /transfers**\n(Transfer ID, condition,\nILP packet including transaction ID) + activate Switch + PayerFSP <<-- Switch: **HTTP 202** (Accepted) + autonumber resume + Switch -> Switch: Reserve transfer\nfrom Payer FSP\nto Payee FSP + autonumber stop + Switch ->> PayeeFSP: **POST /transfers**\n(Transfer ID, condition, \nILP packet including transaction ID) + activate PayeeFSP + Switch <<-- PayeeFSP: **HTTP 202** (Accepted) + autonumber resume + PayeeFSP -> PayeeFSP: Lookup\ntransaction\ninformation + PayeeFSP -> Payee: Transaction\nnotification + autonumber stop + Switch <<- PayeeFSP: **PUT /transfers/**\n(Fulfilment) + Switch -->> PayeeFSP: **HTTP 200** (OK) + deactivate PayeeFSP + autonumber resume + Switch -> Switch: Commit transfer\nfrom Payer FSP\nto Payee FSP + autonumber stop + PayerFSP <<- Switch: **PUT /transfers/**\n(Fulfilment) + PayerFSP -->> Switch: **HTTP 200** (OK) + deactivate Switch + autonumber resume + PayerFSP -> PayerFSP: Commits transfer from Payer\naccount to Payee FSP account + autonumber stop + PayerFSP -[hidden]> Switch + Group #Lightgrey Optional + hnote left of PayerFSP #Lightgrey + Get transaction + data + end hnote + autonumber resume + PayerFSP ->> Switch: **GET /transactions/** + activate Switch + autonumber stop + PayerFSP <<-- Switch: **HTTP 202** (Accepted) + autonumber resume + Switch ->> PayeeFSP: **GET /transactions/** + activate PayeeFSP + autonumber stop + Switch <<-- PayeeFSP: **HTTP 202** (Accepted) + autonumber resume + PayeeFSP -> PayeeFSP: Lookup\ntransaction\ninformation + autonumber resume + Switch <<- PayeeFSP: **PUT /transactions/**\n(Transaction details) + autonumber stop + Switch -->> PayeeFSP: **HTTP 200** (OK) + deactivate PayeeFSP + autonumber resume + PayerFSP ->> Switch: **PUT /transactions/**\n(Transaction details) + autonumber stop + PayerFSP <<-- Switch: **HTTP 200** (OK) + deactivate Switch + end + autonumber resume + Payer <- PayerFSP: Transaction\nnotification + deactivate PayerFSP +end +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure66.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure66.svg new file mode 100644 index 000000000..10475e8cf --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure66.svg @@ -0,0 +1,568 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + + Optional + Switch + + Account + Lookup + + Payee + FSP + + Payee + + + + + + + + + + + + + + + + + + + + + + + + + Option #1 + + User + initiated + OTP + + + [1] + Generate + OTP for me + + + + + [2] + Generate OTP + + + [3] + Your OTP + is 12345 + + + [4] + I would like + to receive + 100 USD from + +123456789 + + + + + MSISDN not within + Payee FSP system + + + + [5] + GET /participants/MSISDN/123456789 + + + + HTTP 202 + (Accepted) + + + + + [6] + Lookup which FSP MSISDN + +123456789 belongs to + + + [7] + PUT /participants/MSISDN/123456789 + (FSP ID) + + + + HTTP 200 + (OK) + + + + [8] + POST /transactionRequests + (Payee information, transaction details, OTP authorization) + + + + HTTP 202 + (Accepted) + + + + [9] + POST /transactionRequests + (Payee information, + transaction details, OTP authorization) + + + + HTTP 202 + (Accepted) + + + + + [10] + Perform optional validation + + + + [11] + Put /transactionRequests/ + <ID> + (Received status) + + + + HTTP 200 + (OK) + + + + [12] + Put /transactionRequests/ + <ID> + (Received status) + + + + HTTP 200 + (OK) + + + + + [13] + Rate Payer FSP quote + (depending on fee model) + + + + [14] + POST /qoutes + (Transaction details) + + + + HTTP 202 + (Accepted) + + + + [15] + POST /qoutes + (Transaction details) + + + + HTTP 202 + (Accepted) + + + + + Rate Payee FSP + fees/commission, + generate condition + + + Optional + + Confirm + quote + + + [16] + Her is the + quote and + Payer name + + + I confirm + + + + [17] + PUT /quote/ + <ID> + (Payee FSP fee/commission, + condition) + + + + HTTP 200 + (OK) + + + + [18] + PUT /quote/ + <ID> + (Payee FSP fee/commission, + condition) + + + + HTTP 200 + (OK) + + + + + [19] + Rate Payer FSP quote + (depending on fee model) + + + Option #2 + + Automatic + generated + OTP + + + + + [20] + Generate OTP + + + [21] + Use OTP + to confirm + + + + [22] + GET /authorizations/ + <TransactionRequestID> + (Amount and fees) + + + + HTTP 202 + (Accepted) + + + + [23] + GET /authorizations/ + <TransactionRequestID> + (Amount and fees) + + + + HTTP 202 + (Accepted) + + + [24] + Show fees + on POS + + + + + [25] + Payer + approves/rejects + transaction + using OTP + + + + Entered OTP + + + + [26] + PUT /authorizations/ + <TransactionRequestID> + (OTP) + + + + HTTP 200 + (OK) + + + + [27] + PUT /authorizations/ + <TransactionRequestID> + (OTP) + + + + HTTP 200 + (OK) + + + + + [28] + Validate OTP sent by Payee FSP + + + Alternatives + + OTP + validation + failed + + + + [29] + PUT /transactionRequests/ + <ID> + (Rejected state) + + + + HTTP 200 + (OK) + + + + [30] + PUT /transactionRequests/ + <ID> + (Rejected state) + + + + HTTP 200 + (OK) + + + [31] + Transaction + failed due to + incorrect OTP + + + OTP + validation + successful + + + + + 33 + Reserve transfer from Payer + account to Switch account + + + + POST /transfers + (Transfer ID, condition, + ILP packet including transaction ID) + + + + HTTP 202 + (Accepted) + + + + + 34 + Reserve transfer + from Payer FSP + to Payee FSP + + + + POST /transfers + (Transfer ID, condition, + ILP packet including transaction ID) + + + + HTTP 202 + (Accepted) + + + + + 35 + Lookup + transaction + information + + + 36 + Transaction + notification + + + + PUT /transfers/ + <ID> + (Fulfilment) + + + + HTTP 200 + (OK) + + + + + 37 + Commit transfer + from Payer FSP + to Payee FSP + + + + PUT /transfers/ + <ID> + (Fulfilment) + + + + HTTP 200 + (OK) + + + + + 38 + Commits transfer from Payer + account to Payee FSP account + + + Optional + + Get transaction + data + + + + 39 + GET /transactions/ + <TransactionID> + + + + HTTP 202 + (Accepted) + + + + 40 + GET /transactions/ + <TransactionID> + + + + HTTP 202 + (Accepted) + + + + + 41 + Lookup + transaction + information + + + + 42 + PUT /transactions/ + <TransactionID> + (Transaction details) + + + + HTTP 200 + (OK) + + + + 43 + PUT /transactions/ + <TransactionID> + (Transaction details) + + + + HTTP 200 + (OK) + + + 44 + Transaction + notification + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure66a.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure66a.plantuml new file mode 100644 index 000000000..8e944f64d --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure66a.plantuml @@ -0,0 +1,288 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Payee-Initiated Transaction using OTP + +' Actor Keys: +' participant - FSP(Payer/Payee), Switch and Account Lookup +' actor - Payer/Payee(s) + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "Optional\nSwitch" as Switch +participant "Account\nLookup" as ALS +participant "Payee\nFSP" as PayeeFSP +actor "<$actor>\nPayee" as Payee + +' start flow +autonumber 1 1 "[0]" +Group #Oldlace Option #1 + hnote left of Payer #Oldlace + User + initiated + OTP + end hnote + Payer -> PayerFSP: Generate\nOTP for me + activate PayerFSP + PayerFSP -> PayerFSP: Generate OTP + Payer <- PayerFSP: Your OTP\nis 12345 + deactivate PayerFSP +end +PayeeFSP <- Payee: I would like\nto receive\n100 USD from\n+123456789 +activate PayeeFSP +autonumber stop +PayeeFSP <- PayeeFSP: MSISDN not within\nPayee FSP system +autonumber resume +ALS <<- PayeeFSP: **Lookup Participant Information**\n(MSISDN 123456789) +activate ALS +ALS <- ALS: Lookup which FSP MSISDN\n+123456789 belongs to +ALS -> PayeeFSP: **Return Participant Information**\n(FSP ID) +deactivate ALS +deactivate PayeeFSP +Switch <<- PayeeFSP: **Perform Transaction Request**\n(Payee information, transaction details, OTP authorization) +activate PayeeFSP +activate Switch +PayerFSP <<- Switch: **Perform Transaction Request**\n(Payee information,\ntransaction details, OTP authorization) +activate PayerFSP +autonumber stop +autonumber resume +PayerFSP -> PayerFSP: Perform optional validation +PayerFSP ->> Switch: **Return Transaction**\n**Request Information**\n(Received status) +deactivate PayerFSP +autonumber resume +Switch ->> PayeeFSP: **Return Transaction Request Information**\n(Received status) +deactivate Switch +deactivate PayeeFSP +autonumber stop +PayerFSP -[hidden]> Switch +activate PayerFSP +autonumber resume +PayerFSP -> PayerFSP: Rate Payer FSP quote\n(depending on fee model) +autonumber stop +PayerFSP ->> Switch: **Calculate Quote**\n(Transaction details) +activate Switch +autonumber resume +Switch ->> PayeeFSP: **Calculate Quote**\n(Transaction details) +activate PayeeFSP +PayeeFSP -> PayeeFSP: Rate Payee FSP\nfees/commission,\ngenerate condition +Group #Oldlace Optional + hnote left of PayeeFSP #Oldlace + Confirm + quote + end hnote + autonumber resume + PayeeFSP -> Payee: Her is the\nquote and\nPayer name + autonumber stop + PayeeFSP <- Payee: I confirm +end +autonumber resume +Switch <<- PayeeFSP: **Return Quote Information**\n(Payee FSP fee/commision, condition) +deactivate PayeeFSP +PayerFSP <<- Switch: **Return Quote Information**\n(Payee FSP fee/commission,\ncondition) +deactivate Switch +PayerFSP -> PayerFSP: Rate Payer FSP quote\n(depending on fee model) +autonumber stop +PayerFSP -[hidden]> Switch +deactivate PayerFSP +Group #Oldlace Option #2 + hnote left of Payer #Oldlace + Automatic + generated + OTP + end hnote + PayerFSP -[hidden]> Switch + activate PayerFSP + autonumber resume + PayerFSP -> PayerFSP: Generate OTP + Payer <- PayerFSP: Use OTP\nto confirm +end +PayerFSP ->> Switch: **Perform Authorization**\n(Amount and fees) +activate Switch +Switch ->> PayeeFSP: **Perform Authorization**\n(Amount and fees) +activate PayeeFSP +PayeeFSP -> Payee: Show fees\non POS +Payee -> Payee: Payer\napproves/rejects\ntransaction\nusing OTP +autonumber stop +PayeeFSP <<-- Payee: Entered OTP +autonumber resume +Switch <<- PayeeFSP: **Return Authorization Result**\n(OTP) +deactivate PayeeFSP +PayerFSP <<- Switch: **Return Authorization Result**\n(OTP) +autonumber stop +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +autonumber resume +PayerFSP -> PayerFSP: Validate OTP sent by Payee FSP +autonumber stop +PayerFSP -[hidden]> Switch +deactivate PayerFSP +Group #Oldlace Alternatives + hnote left of Payer #Oldlace + OTP + validation + failed + end hnote + PayerFSP -[hidden]> Switch + activate PayerFSP + autonumber resume + PayerFSP ->> Switch: **Return Transaction Request Information**\n(Rejected state) + activate Switch + deactivate PayerFSP + Switch ->> PayeeFSP: **Return Transaction Request Information**\n(Rejected state) + activate PayeeFSP + deactivate Switch + PayeeFSP -> Payee: Transaction\nfailed due to\nincorrect OTP + deactivate PayeeFSP + autonumber stop +else + hnote left of Payer #Oldlace + OTP + validation + successful + end hnote + PayerFSP -[hidden]> Switch + autonumber 33 1 + activate PayerFSP + PayerFSP -> PayerFSP: Reserve transfer from Payer\naccount to Switch account + autonumber stop + PayerFSP ->> Switch: **Perform Transfer**\n(Transfer ID, condition, ILP packet\nincluding transaction ID) + activate Switch + autonumber resume + Switch -> Switch: Reserve transfer\nfrom Payer FSP\nto Payee FSP + autonumber stop + Switch ->> PayeeFSP: **Perform Transfer**\n(Transfer ID, condition, \nILP packet including transaction ID)\n + activate PayeeFSP + autonumber resume + PayeeFSP -> PayeeFSP: Perform transfer\nfrom Switch account\nto Payee account,\ngenerate fulfilment + PayeeFSP -> Payee: Transaction\nnotification + autonumber stop + Switch <<- PayeeFSP: **Return Transfer Information**\n(Fulfilment) + deactivate PayeeFSP + autonumber resume + Switch -> Switch: Commit transfer\nfrom Payer FSP\nto Payee FSP + autonumber stop + PayerFSP <<- Switch: **Return Transfer Information**\n(Fulfilment) + deactivate Switch + autonumber resume + PayerFSP -> PayerFSP: Commits transfer from Payer\naccount to Payee FSP account + Group #Lightgrey Optional + hnote left of PayerFSP #Lightgrey + Get transaction + data + end hnote + PayerFSP ->> Switch: **Retrieve Transaction Information**\n(Transaction ID) + activate Switch + Switch ->> PayeeFSP: **Retrieve Transaction Information**\n(Transaction ID) + activate PayeeFSP + PayeeFSP -> PayeeFSP: Lookup\ntransaction\ninformation + Switch <<- PayeeFSP: **Return Transaction Information**\n(Transaction details) + deactivate PayeeFSP + PayerFSP ->> Switch: Return Transaction Information**\n(Transaction details) + deactivate Switch + end + Payer <- PayerFSP: Transaction\nnotification + deactivate PayerFSP +end +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure66a.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure66a.svg new file mode 100644 index 000000000..25303cb58 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure66a.svg @@ -0,0 +1,442 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + + Optional + Switch + + Account + Lookup + + Payee + FSP + + Payee + + + + + + + + + + + + + + + + + + + + + + + + + Option #1 + + User + initiated + OTP + + + [1] + Generate + OTP for me + + + + + [2] + Generate OTP + + + [3] + Your OTP + is 12345 + + + [4] + I would like + to receive + 100 USD from + +123456789 + + + + + MSISDN not within + Payee FSP system + + + + [5] + Lookup Participant Information + (MSISDN 123456789) + + + + + [6] + Lookup which FSP MSISDN + +123456789 belongs to + + + [7] + Return Participant Information + (FSP ID) + + + + [8] + Perform Transaction Request + (Payee information, transaction details, OTP authorization) + + + + [9] + Perform Transaction Request + (Payee information, + transaction details, OTP authorization) + + + + + [10] + Perform optional validation + + + + [11] + Return Transaction + Request Information + (Received status) + + + + [12] + Return Transaction Request Information + (Received status) + + + + + [13] + Rate Payer FSP quote + (depending on fee model) + + + + Calculate Quote + (Transaction details) + + + + [14] + Calculate Quote + (Transaction details) + + + + + [15] + Rate Payee FSP + fees/commission, + generate condition + + + Optional + + Confirm + quote + + + [16] + Her is the + quote and + Payer name + + + I confirm + + + + [17] + Return Quote Information + (Payee FSP fee/commision, condition) + + + + [18] + Return Quote Information + (Payee FSP fee/commission, + condition) + + + + + [19] + Rate Payer FSP quote + (depending on fee model) + + + Option #2 + + Automatic + generated + OTP + + + + + [20] + Generate OTP + + + [21] + Use OTP + to confirm + + + + [22] + Perform Authorization + (Amount and fees) + + + + [23] + Perform Authorization + (Amount and fees) + + + [24] + Show fees + on POS + + + + + [25] + Payer + approves/rejects + transaction + using OTP + + + + Entered OTP + + + + [26] + Return Authorization Result + (OTP) + + + + [27] + Return Authorization Result + (OTP) + + + + HTTP 200 + (OK) + + + + + [28] + Validate OTP sent by Payee FSP + + + Alternatives + + OTP + validation + failed + + + + [29] + Return Transaction Request Information + (Rejected state) + + + + [30] + Return Transaction Request Information + (Rejected state) + + + [31] + Transaction + failed due to + incorrect OTP + + + OTP + validation + successful + + + + + 33 + Reserve transfer from Payer + account to Switch account + + + + Perform Transfer + (Transfer ID, condition, ILP packet + including transaction ID) + + + + + 34 + Reserve transfer + from Payer FSP + to Payee FSP + + + + Perform Transfer + (Transfer ID, condition, + ILP packet including transaction ID) +   + + + + + 35 + Perform transfer + from Switch account + to Payee account, + generate fulfilment + + + 36 + Transaction + notification + + + + Return Transfer Information + (Fulfilment) + + + + + 37 + Commit transfer + from Payer FSP + to Payee FSP + + + + Return Transfer Information + (Fulfilment) + + + + + 38 + Commits transfer from Payer + account to Payee FSP account + + + Optional + + Get transaction + data + + + + 39 + Retrieve Transaction Information + (Transaction ID) + + + + 40 + Retrieve Transaction Information + (Transaction ID) + + + + + 41 + Lookup + transaction + information + + + + 42 + Return Transaction Information + (Transaction details) + + + + 43 + Return Transaction Information** + (Transaction details) + + + 44 + Transaction + notification + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure67.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure67.plantuml new file mode 100644 index 000000000..0576dc323 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure67.plantuml @@ -0,0 +1,222 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Bulk Transactions pattern using the asynchronous REST binding + +' Actor Keys: +' participant - FSP(Payer/Payee(s)), Switch and Account Lookup Services (ALS) +' actor - Payer/Payee(s) + +' declare actors +actor "<$actor>\nPayer\n" as Payer +participant "\nPayer\nFSP" as PayerFSP +participant "\nOptional\nSwitch" as Switch +participant "\nAccount\nLookup" as ALS +participant "\nPayee\nFSP(s)" as PayeeFSP +actor "<$actor>\nPayees\n(multiple)" as Payee + +' start flow +autonumber 1 1 "[0]" +Payer -> PayerFSP: I would like to upload\na file of bulk transactions +activate PayerFSP +Loop #Oldlace + hnote left of PayerFSP #Oldlace + For each + transaction + in bulk file + end hnote + PayerFSP -> PayerFSP: Locate Payee, if not\nwithin Payer FSP\nuse Account Lookup + PayerFSP ->> ALS: **GET /participants/****/** + activate ALS + autonumber stop + PayerFSP <<-- ALS: **HTTP 202** (Accepted) + autonumber resume + ALS -> ALS: Lookup FSP for\nrequested Type/ID + autonumber stop + PayerFSP ->> ALS: **PUT /participants/****/** + PayerFSP <<-- ALS: **HTTP 200** (OK) + deactivate ALS + autonumber resume + PayerFSP -> PayerFSP: Place transaction\nin bulk file\nper Payee FSP + autonumber stop +end Loop +PayerFSP -[hidden]> Switch +deactivate PayerFSP +PayerFSP -[hidden]> Switch +activate PayerFSP +Loop #Oldlace + hnote left of PayerFSP #Oldlace + For each + created bulk + file per + Payee FSP + end hnote + PayerFSP -> PayerFSP: Rate Payer FSP bulk quote\n(depending on fee model) + autonumber resume + PayerFSP ->> Switch: **POST /bulkQuotes**\n(Bulk info and list\nof individual quotes) + autonumber stop + activate Switch + autonumber resume + PayerFSP <<-- Switch: **HTTP 202** (Accepted) + Switch ->> PayeeFSP: **POST /bulkQuotes**\n(Bulk info and list of individual quotes) + activate PayeeFSP + autonumber stop + Switch <<-- PayeeFSP: **HTTP 202** (Accepted) + autonumber resume + PayeeFSP -> PayeeFSP: Rate Payee FSP\nfee/commission and\ngenerate condition per\nindividual transfer + autonumber stop + Switch <<- PayeeFSP: **PUT /bulkQuotes/**\n(List of individual quote results\nand condition per transfer) + Switch -->> PayeeFSP: **HTTP 200** (OK) + deactivate PayeeFSP + autonumber resume + PayerFSP <<- Switch: **PUT /bulkQuotes/**\n(List of individual quote results\nand condition per transfer) + autonumber stop + PayerFSP -->> Switch: **HTTP 200** (OK) + deactivate Switch + autonumber resume + PayerFSP -> PayerFSP: Rate Payer FSP bulk quote\n(depending on fee model) +end Loop + +PayerFSP -> PayerFSP: Calculate total fee for Payer +Payer <- PayerFSP: Bulk has finished processing,\npresent fees +deactivate PayerFSP +Payer -> PayerFSP: Execute my bulk +activate PayerFSP +Loop #Oldlace + hnote left of PayerFSP #Oldlace + For each + created bulk + file per + Payee FSP + end hnote + PayerFSP -> PayerFSP: Reserve each individual\ntransfer from Payer\naccount to Payee FSP account + autonumber stop + PayerFSP ->> Switch: **POST /bulkTransfers**\n(List of individual transfers\nincluding ILP packet and condition) + activate Switch + PayerFSP <<-- Switch: **HTTP 202** (Accepted) + autonumber resume + Switch -> Switch: Reserve each individual\ntransfer from Payer FSP\nto Payee FSP + autonumber stop + Switch ->> PayeeFSP: **POST /bulkTransfers**\n(List of individual transfers\nincluding ILP packet and condition) + activate PayeeFSP + Switch <<-- PayeeFSP: **HTTP 202** (Accepted) + autonumber resume + PayeeFSP -> PayeeFSP: Perform each transaction from\nPayer FSP account to Payee\naccount, generate fulfilments + PayeeFSP -> Payee: Transaction notification\nfor each Payee + Switch <<- PayeeFSP: **PUT /bulkTransfers/**\n(List of fulfilments) + autonumber stop + Switch -->> PayeeFSP: **HTTP 200** (OK) + deactivate PayeeFSP + Switch -> Switch: Commit each successful\ntransfer from Payer\nFSP to Payee FSP + autonumber resume + PayerFSP <<- Switch: **PUT /bulkTransfers/**\n(List of fulfilments) + autonumber stop + PayerFSP -->> Switch: **HTTP 200** (OK) + deactivate Switch + autonumber resume + PayerFSP -> PayerFSP: Commit each successful\ntransfer from Payer account\nto Payee FSP account +end Loop +Payer <- PayerFSP: Your bulk has been executed +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure67.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure67.svg new file mode 100644 index 000000000..7372a33e3 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure67.svg @@ -0,0 +1,319 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Payer +   + + + +   + Payer + FSP + +   + Optional + Switch + +   + Account + Lookup + +   + Payee + FSP(s) + + Payees + (multiple) + + + + + + + + + + + + + [1] + I would like to upload + a file of bulk transactions + + + loop + + For each + transaction + in bulk file + + + + + [2] + Locate Payee, if not + within Payer FSP + use Account Lookup + + + + [3] + GET /participants/ + <PartyIdType> + / + <PartyId> + + + + HTTP 202 + (Accepted) + + + + + [4] + Lookup FSP for + requested Type/ID + + + + PUT /participants/ + <PartyIdType> + / + <PartyId> + + + + HTTP 200 + (OK) + + + + + [5] + Place transaction + in bulk file + per Payee FSP + + + loop + + For each + created bulk + file per + Payee FSP + + + + + Rate Payer FSP bulk quote + (depending on fee model) + + + + [6] + POST /bulkQuotes + (Bulk info and list + of individual quotes) + + + + [7] + HTTP 202 + (Accepted) + + + + [8] + POST /bulkQuotes + (Bulk info and list of individual quotes) + + + + HTTP 202 + (Accepted) + + + + + [9] + Rate Payee FSP + fee/commission and + generate condition per + individual transfer + + + + PUT /bulkQuotes/ + <ID> + (List of individual quote results + and condition per transfer) + + + + HTTP 200 + (OK) + + + + [10] + PUT /bulkQuotes/ + <ID> + (List of individual quote results + and condition per transfer) + + + + HTTP 200 + (OK) + + + + + [11] + Rate Payer FSP bulk quote + (depending on fee model) + + + + + [12] + Calculate total fee for Payer + + + [13] + Bulk has finished processing, + present fees + + + [14] + Execute my bulk + + + loop + + For each + created bulk + file per + Payee FSP + + + + + [15] + Reserve each individual + transfer from Payer + account to Payee FSP account + + + + POST /bulkTransfers + (List of individual transfers + including ILP packet and condition) + + + + HTTP 202 + (Accepted) + + + + + [16] + Reserve each individual + transfer from Payer FSP + to Payee FSP + + + + POST /bulkTransfers + (List of individual transfers + including ILP packet and condition) + + + + HTTP 202 + (Accepted) + + + + + [17] + Perform each transaction from + Payer FSP account to Payee + account, generate fulfilments + + + [18] + Transaction notification + for each Payee + + + + [19] + PUT /bulkTransfers/ + <ID> + (List of fulfilments) + + + + HTTP 200 + (OK) + + + + + Commit each successful + transfer from Payer + FSP to Payee FSP + + + + [20] + PUT /bulkTransfers/ + <ID> + (List of fulfilments) + + + + HTTP 200 + (OK) + + + + + [21] + Commit each successful + transfer from Payer account + to Payee FSP account + + + [22] + Your bulk has been executed + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure67a.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure67a.plantuml new file mode 100644 index 000000000..9f4ba3a5d --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure67a.plantuml @@ -0,0 +1,200 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title Bulk Transaction + +' Actor Keys: +' participant - FSP(Payer/Payee(s)), Switch and Account Lookup Services (ALS) +' actor - Payer/Payee(s) + +' declare actors +actor "<$actor>\nPayer\n" as Payer +participant "\nPayer\nFSP" as PayerFSP +participant "\nOptional\nSwitch" as Switch +participant "\nAccount\nLookup" as ALS +participant "\nPayee\nFSP(s)" as PayeeFSP +actor "<$actor>\nPayees\n(multiple)" as Payee + +' start flow +autonumber 1 1 "[0]" +Payer -> PayerFSP: I would like to upload\na file of bulk transactions +activate PayerFSP +Loop #Oldlace + hnote left of PayerFSP #Oldlace + For each + transaction + in bulk file + end hnote + PayerFSP -> PayerFSP: Locate Payee, if not\nwithin Payer FSP\nuse Account Lookup + PayerFSP ->> ALS: **Lookup Participant Information**\n(Payee Party ID Type and Party ID) + activate ALS + ALS -> ALS: Lookup FSP for\nrequested Type/ID + PayerFSP ->> ALS: **Return Participant Information**\n(FSP ID) + autonumber stop + deactivate ALS + PayerFSP -> PayerFSP: Place transaction\nin bulk file\nper Payee FSP + PayerFSP -[hidden]> Switch + deactivate PayerFSP +end Loop +Loop #Oldlace + hnote left of PayerFSP #Oldlace + For each + created bulk + file per + Payee FSP + end hnote + PayerFSP -[hidden]> Switch + activate PayerFSP + PayerFSP -> PayerFSP: Rate Payer FSP bulk quote\n(depending on fee model) + autonumber resume + PayerFSP ->> Switch: **Calculate Bulk Quote**\n(Bulk info and list\nof individual quotes) + Switch ->> PayeeFSP: **Calculate Bulk Quote**\n(Bulk info and list of individual quotes) + activate PayeeFSP + activate Switch + PayeeFSP -> PayeeFSP: Rate Payee FSP\nfee/commission and\ngenerate condition per\nindividual transfer + autonumber stop + Switch <<- PayeeFSP: **Return Bulk Quote Information**\n(List of individual quote results\nand condition per transfer) + deactivate PayeeFSP + autonumber resume + PayerFSP <<- Switch: **Return Bulk Quote Information**\n(List of individual quote results\nand condition per transfer) + deactivate Switch + PayerFSP -> PayerFSP: Rate Payer FSP bulk quote\n(depending on fee model) +end Loop +autonumber resume +PayerFSP -> PayerFSP: Calculate total fee for Payer +Payer <- PayerFSP: Bulk has finished processing,\npresent fees +deactivate PayerFSP +Payer -> PayerFSP: Execute my bulk +activate PayerFSP +Loop #Oldlace + hnote left of PayerFSP #Oldlace + For each + created bulk + file per + Payee FSP + end hnote + PayerFSP -> PayerFSP: Reserve each individual\ntransfer from Payer\naccount to Payee FSP account +autonumber stop + PayerFSP ->> Switch: **Perform Bulk Transfer**\n(List of individual transfers\nincluding ILP packet and condition) + activate Switch +autonumber resume + Switch -> Switch: Reserve each individual\ntransfer from Payer FSP\nto Payee FSP + autonumber stop + Switch ->> PayeeFSP: **Perform Bulk Transfer**\n(List of individual transfers\nincluding ILP packet and condition) + activate PayeeFSP +autonumber resume + PayeeFSP -> PayeeFSP: Perform each transaction from\nPayer FSP account to Payee\naccount, generate fulfilments + PayeeFSP -> Payee: Transaction notification\nfor each Payee + Switch <<- PayeeFSP: **Return Bulk Transfer Information**\n(List of fulfilments) + autonumber stop + deactivate PayeeFSP + Switch -> Switch: Commit each successful\ntransfer from Payer\nFSP to Payee FSP + autonumber resume + PayerFSP <<- Switch: **Return Bulk Transfer Information**\n(List of fulfilments) + deactivate Switch + PayerFSP -> PayerFSP: Commit each successful\ntransfer from Payer account\nto Payee FSP account +end Loop +Payer <- PayerFSP: Your bulk has been executed +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure67a.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure67a.svg new file mode 100644 index 000000000..11e7f3675 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure67a.svg @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Payer +   + + + +   + Payer + FSP + +   + Optional + Switch + +   + Account + Lookup + +   + Payee + FSP(s) + + Payees + (multiple) + + + + + + + + + + + + + [1] + I would like to upload + a file of bulk transactions + + + loop + + For each + transaction + in bulk file + + + + + [2] + Locate Payee, if not + within Payer FSP + use Account Lookup + + + + [3] + Lookup Participant Information + (Payee Party ID Type and Party ID) + + + + + [4] + Lookup FSP for + requested Type/ID + + + + [5] + Return Participant Information + (FSP ID) + + + + + Place transaction + in bulk file + per Payee FSP + + + loop + + For each + created bulk + file per + Payee FSP + + + + + Rate Payer FSP bulk quote + (depending on fee model) + + + + [6] + Calculate Bulk Quote + (Bulk info and list + of individual quotes) + + + + [7] + Calculate Bulk Quote + (Bulk info and list of individual quotes) + + + + + [8] + Rate Payee FSP + fee/commission and + generate condition per + individual transfer + + + + Return Bulk Quote Information + (List of individual quote results + and condition per transfer) + + + + [9] + Return Bulk Quote Information + (List of individual quote results + and condition per transfer) + + + + + [10] + Rate Payer FSP bulk quote + (depending on fee model) + + + + + [11] + Calculate total fee for Payer + + + [12] + Bulk has finished processing, + present fees + + + [13] + Execute my bulk + + + loop + + For each + created bulk + file per + Payee FSP + + + + + [14] + Reserve each individual + transfer from Payer + account to Payee FSP account + + + + Perform Bulk Transfer + (List of individual transfers + including ILP packet and condition) + + + + + [15] + Reserve each individual + transfer from Payer FSP + to Payee FSP + + + + Perform Bulk Transfer + (List of individual transfers + including ILP packet and condition) + + + + + [16] + Perform each transaction from + Payer FSP account to Payee + account, generate fulfilments + + + [17] + Transaction notification + for each Payee + + + + [18] + Return Bulk Transfer Information + (List of fulfilments) + + + + + Commit each successful + transfer from Payer + FSP to Payee FSP + + + + [19] + Return Bulk Transfer Information + (List of fulfilments) + + + + + [20] + Commit each successful + transfer from Payer account + to Payee FSP account + + + [21] + Your bulk has been executed + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure68.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure68.plantuml new file mode 100644 index 000000000..2acdac867 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure68.plantuml @@ -0,0 +1,64 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +' declare title +' title Error on server during processing of request + +' Actor Keys: +' participant - Client and Server + + +' declare actors +participant "Client" as client +participant "Server" as server + +' start flow +autonumber 1 1 "[0]" +client ->> server: **POST /service** +activate client +activate server +client <<-- server: **HTTP 202** (Accepted) +autonumber stop +server -> server: Some processing error\noccurs, i.e. the request\ncan not be handled as\nrequested. +autonumber resume +client <<- server: **PUT /service/****/error** +client -->> server: **HTTP 200** (OK) +deactivate server +deactivate client +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure68.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure68.svg new file mode 100644 index 000000000..f1b5d40d1 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure68.svg @@ -0,0 +1,47 @@ + + + + + + + + + Client + + Server + + + + + + [1] + POST /service + + + + [2] + HTTP 202 + (Accepted) + + + + + Some processing error + occurs, i.e. the request + can not be handled as + requested. + + + + [3] + PUT /service/ + <ID> + /error + + + + [4] + HTTP 200 + (OK) + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure69.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure69.plantuml new file mode 100644 index 000000000..c1f3ba428 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure69.plantuml @@ -0,0 +1,81 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +' declare title +' title Handling of error callback from POST /transfers + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch + + +' declare actors +participant "Payer\nFSP" as PayerFSP +participant "Optional\nSwitch" as Switch +participant "Payee\nFSP" as PayeeFSP + +' start flow +autonumber 1 1 "[0]" +activate PayerFSP +PayerFSP -> PayerFSP: Reserve transfer from Payer\naccount to Switch account +PayerFSP ->> Switch: **POST /transfers**\n(Transfer ID, condition, ILP Packet\nincluding transaction details) +activate Switch +autonumber stop +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch -> Switch: Reserve transfer from\nPayer FSP to Payee FSP +autonumber resume +Switch ->> PayeeFSP: **POST /transfers**\n(Transfer ID, condition, ILP Packet\nincluding transaction details) +activate PayeeFSP +autonumber stop +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Some processing error occurs,\ne.g. a limit breach +autonumber resume +Switch <<- PayeeFSP: **PUT /transfers/****/error** +autonumber stop +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +Switch -> Switch: Cancel transfer from\nPayer FSP to Payee FSP +autonumber resume +PayerFSP <<- Switch: **PUT /transfers/****/error**\n(Error information) +autonumber stop +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Cancel transfer from Payer\naccount to Payee FSP account +PayerFSP -[hidden]> Switch +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure69.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure69.svg new file mode 100644 index 000000000..c8e47a23b --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure69.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + Payer + FSP + + Optional + Switch + + Payee + FSP + + + + + + + + [1] + Reserve transfer from Payer + account to Switch account + + + + [2] + POST /transfers + (Transfer ID, condition, ILP Packet + including transaction details) + + + + HTTP 202 + (Accepted) + + + + + Reserve transfer from + Payer FSP to Payee FSP + + + + [3] + POST /transfers + (Transfer ID, condition, ILP Packet + including transaction details) + + + + HTTP 202 + (Accepted) + + + + + Some processing error occurs, + e.g. a limit breach + + + + [4] + PUT /transfers/ + <ID> + /error + + + + HTTP 200 + (OK) + + + + + Cancel transfer from + Payer FSP to Payee FSP + + + + [5] + PUT /transfers/ + <ID> + /error + (Error information) + + + + HTTP 200 + (OK) + + + + + Cancel transfer from Payer + account to Payee FSP account + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure70.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure70.plantuml new file mode 100644 index 000000000..42f6da819 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure70.plantuml @@ -0,0 +1,81 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +' declare title +' title Handling of error callback from API Service /bulkTransfers + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch + + +' declare actors +participant "Payer\nFSP" as PayerFSP +participant "Optional\nSwitch" as Switch +participant "Payee\nFSP(s)" as PayeeFSP + +' start flow +autonumber 1 1 "[0]" +activate PayerFSP +PayerFSP -> PayerFSP: Reserve each individual\ntransfer from Payer\naccount to Payee FSP account +PayerFSP ->> Switch: **POST /bulkTransfers**\n(List of individual transfers\nincluding ILP packet and condition) +activate Switch +autonumber stop +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch -> Switch: Reserve each individual\ntransfer from Payer FSP\nto Payee FSP +autonumber resume +Switch ->> PayeeFSP: **POST /bulkTransfers**\n(List of individual transfers\nincluding ILP packet and condition) +activate PayeeFSP +autonumber stop +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Some processing error occurs,\ne.g. a validation failure that prevents\nthe bulk transfer to be performed +autonumber resume +Switch <<- PayeeFSP: **PUT /bulkTransfers/****/error**\n(Error information) +autonumber stop +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +Switch -> Switch: Cancel each reserved\ntransfer from Payer\nFSP to Payee FSP +autonumber resume +PayerFSP <<- Switch: **PUT /bulkTransfers/****/error**\n(Error information) +autonumber stop +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Cancel each transfer\nfrom Payer account\nto Payee FSP account +PayerFSP -[hidden]> Switch +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure70.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure70.svg new file mode 100644 index 000000000..bbdcd79ec --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure70.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + Payer + FSP + + Optional + Switch + + Payee + FSP(s) + + + + + + + + [1] + Reserve each individual + transfer from Payer + account to Payee FSP account + + + + [2] + POST /bulkTransfers + (List of individual transfers + including ILP packet and condition) + + + + HTTP 202 + (Accepted) + + + + + Reserve each individual + transfer from Payer FSP + to Payee FSP + + + + [3] + POST /bulkTransfers + (List of individual transfers + including ILP packet and condition) + + + + HTTP 202 + (Accepted) + + + + + Some processing error occurs, + e.g. a validation failure that prevents + the bulk transfer to be performed + + + + [4] + PUT /bulkTransfers/ + <ID> + /error + (Error information) + + + + HTTP 200 + (OK) + + + + + Cancel each reserved + transfer from Payer + FSP to Payee FSP + + + + [5] + PUT /bulkTransfers/ + <ID> + /error + (Error information) + + + + HTTP 200 + (OK) + + + + + Cancel each transfer + from Payer account + to Payee FSP account + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure71.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure71.plantuml new file mode 100644 index 000000000..858f8bca1 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure71.plantuml @@ -0,0 +1,70 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +' declare title +' title Error handling from client using resend of request + +' Actor Keys: +' participant - Client and Server + + +' declare actors +participant "Client" as client +participant "Server" as server + +' start flow +autonumber 1 1 "[0]" +client ->> server: **POST /service** +activate client +client -> client: Timeout, resend\nservice request +client ->> server: **POST /service** +activate server +client <<-- server: **HTTP 202** (Accepted) +autonumber stop +client -> client: Timeout, resend\nservice request +autonumber resume +client ->> server: **POST /service** +autonumber stop +client <<-- server: **HTTP 202** (Accepted) +autonumber resume +client <<- server: **PUT /service/** +client -->> server: **HTTP 200** (OK) +deactivate server +deactivate client +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure71.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure71.svg new file mode 100644 index 000000000..155304af7 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure71.svg @@ -0,0 +1,66 @@ + + + + + + + + + Client + + Server + + + + + + [1] + POST /service + + + + + [2] + Timeout, resend + service request + + + + [3] + POST /service + + + + [4] + HTTP 202 + (Accepted) + + + + + Timeout, resend + service request + + + + [5] + POST /service + + + + HTTP 202 + (Accepted) + + + + [6] + PUT /service/ + <ID> + + + + [7] + HTTP 200 + (OK) + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure72.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure72.plantuml new file mode 100644 index 000000000..6bf57abd8 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure72.plantuml @@ -0,0 +1,67 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke + +hide footbox + +' declare title +' title Error handling from client using GET request + +' Actor Keys: +' participant - Client and Server + + +' declare actors +participant "Client" as client +participant "Server" as server + +' start flow +autonumber 1 1 "[0]" +client ->> server: **POST /service** +activate client +activate server +client <<-- server: **HTTP 202** (Accepted) +'autonumber stop +client -> client: No update received within\nreasonable time period,\ncheck status +'autonumber resume +client ->> server: **GET /service** +autonumber stop +client <<-- server: **HTTP 202** (Accepted) +autonumber resume +client <<- server: **PUT /service/** +client -->> server: **HTTP 200** (OK) +deactivate server +deactivate client +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure72.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure72.svg new file mode 100644 index 000000000..148863300 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure72.svg @@ -0,0 +1,57 @@ + + + + + + + + + Client + + Server + + + + + + [1] + POST /service + + + + [2] + HTTP 202 + (Accepted) + + + + + [3] + No update received within + reasonable time period, + check status + + + + [4] + GET /service + <ID> + + + + HTTP 202 + (Accepted) + + + + [5] + PUT /service/ + <ID> + + + + [6] + HTTP 200 + (OK) + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure74.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure74.plantuml new file mode 100644 index 000000000..752507fa1 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure74.plantuml @@ -0,0 +1,220 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title End-to-end flow, from provision of account holder FSP information to a successful transaction + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payer/Payee(s) + +' declare actors +actor "<$actor>\nMats\nHagman" as Payer +participant "\nBank\nNrOne" as PayerFSP +participant "\n\nSwitch" as Switch +participant "\nMobile\nMoney" as MM +actor "<$actor>\nHenrik\nKarlsson" as Payee + +' start flow +autonumber 1 1 "[0]" +Switch <<- MM: **POST /participants/MSISDN/123456789**\n(fspid=MobileMoney) +activate Switch +activate MM +autonumber stop +Switch -->> MM: **HTTP 202** (Accepted) +autonumber resume +Switch <<-- Switch: Save FSP information for\nMSISDN 123456789 +Switch ->> MM: **PUT /participants/MSISDN/123456789**\n(fspid=MobileMoney) +autonumber stop +Switch <<-- MM: **HTTP 200** (OK) +deactivate MM +deactivate Switch +autonumber resume +Payer -> PayerFSP: I would like MSISDN +123456789\nto receive 100 USD +activate PayerFSP +autonumber stop +PayerFSP -> PayerFSP: MSISDN +123456789\nnot within BankNrOne +autonumber resume +PayerFSP ->> Switch: **GET /parties/MSISDN/123456789** +activate Switch +autonumber stop +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch -> Switch: Lookup which FSP MSISDN\n+123456789 belongs to +autonumber resume +Switch ->> MM: **GET /parties/MSISDN/123456789** +activate MM +autonumber stop +Switch <<-- MM: **HTTP 202** (Accepted) +MM -> MM: Lookup party information\nregarding MSISDN +123456789 +autonumber resume +Switch <<- MM: **PUT /Parties/MSISDN/123456789**\n(Party Information) +autonumber stop +Switch -->> MM: **HTTP 200** (OK) +deactivate MM +autonumber resume +PayerFSP <<- Switch: **PUT /Parties/MSISDN/123456789**\n(Party Information) +autonumber stop +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +deactivate PayerFSP +autonumber resume +PayerFSP ->> Switch: **POST /quotes**\n(amountType=RECEIVE, amount=100) +activate PayerFSP +activate Switch +autonumber stop +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +autonumber resume +Switch ->> MM: **POST /quotes**\n(amountType=RECEIVE, amount=100) +activate MM +autonumber stop +Switch <<-- MM: **HTTP 202** (Accepted) +MM -> MM: Internal rating for fees/commission,\n1 USD in FSP commission, generate\nand store fulfilment, generate\ncondition out of fulfilment +autonumber resume +Switch <<- MM: **PUT /quotes/**\n(transferAmount=99 USD\npayeeFspCommission=1 USD) +autonumber stop +Switch -->> MM: **HTTP 200** (OK) +deactivate MM +autonumber resume +PayerFSP <<- Switch: **PUT /quotes/**\n(transferAmount=99 USD\npayeeFspCommission=1 USD) +autonumber stop +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: BankNrOne keeps commission as\nfee, transaction is free for Mats +autonumber resume +Payer <- PayerFSP: Transferring 100 USD to Henrik\nKarlsson will cost 0 USD in fees +deactivate PayerFSP +Payer -> PayerFSP: I approve the transaction +activate PayerFSP +autonumber stop +PayerFSP -> PayerFSP: Reserve 100 USD from Mats\nHagman's account,\n99 USD to Switch and\n1 USD to FSP commission +autonumber resume +PayerFSP ->> Switch: **POST /transfers**\n(amount=99 USD, PayerFsp=BankNrOne\npayeeFsp=MobileMoney) +activate Switch +autonumber stop +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch -> Switch: Reserve 99 USD from\nBankNrOne to MobileMoney +autonumber resume +Switch ->> MM: **POST /transfers**\n(amount=99 USD, PayerFsp=BankNrOne\npayeeFsp=MobileMoney) +activate MM +autonumber stop +Switch <<-- MM: **HTTP 202** (Accepted) +MM -> MM: Perform transfer of 100 USD to\nHenrik Karlsson's account,\n99 USD from Switch\naccount, and 1 USD from FSP\ncommission account +autonumber resume +MM -> MM: Retrieve fulfilment +MM -> Payee: You have received 100 USD\nfrom Mats Hagman +Switch <<- MM: **PUT /transfers/**\n(Fulfilment) +autonumber stop +Switch -->> MM: **HTTP 200** (OK) +deactivate MM +Switch -> Switch: Commit transfer from\nBankNrOne to MobileMoney +autonumber resume +PayerFSP <<- Switch: **PUT /transfers/**\n(Fulfilment) +autonumber stop +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Commit transfer from Mats\nHagman's account to\nSwitch account +autonumber resume +Payer <- PayerFSP: You have transferred 100 USD\nto Henrik Karlsson +autonumber stop +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure74.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure74.svg new file mode 100644 index 000000000..0d00d55c4 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure74.svg @@ -0,0 +1,327 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mats + Hagman + + + +   + Bank + NrOne + +   +   + Switch + +   + Mobile + Money + + Henrik + Karlsson + + + + + + + + + + + + + + + + + [1] + POST /participants/MSISDN/123456789 + (fspid=MobileMoney) + + + + HTTP 202 + (Accepted) + + + + + + [2] + Save FSP information for + MSISDN 123456789 + + + + [3] + PUT /participants/MSISDN/123456789 + (fspid=MobileMoney) + + + + HTTP 200 + (OK) + + + [4] + I would like MSISDN +123456789 + to receive 100 USD + + + + + MSISDN +123456789 + not within BankNrOne + + + + [5] + GET /parties/MSISDN/123456789 + + + + HTTP 202 + (Accepted) + + + + + Lookup which FSP MSISDN + +123456789 belongs to + + + + [6] + GET /parties/MSISDN/123456789 + + + + HTTP 202 + (Accepted) + + + + + Lookup party information + regarding MSISDN +123456789 + + + + [7] + PUT /Parties/MSISDN/123456789 + (Party Information) + + + + HTTP 200 + (OK) + + + + [8] + PUT /Parties/MSISDN/123456789 + (Party Information) + + + + HTTP 200 + (OK) + + + + [9] + POST /quotes + (amountType=RECEIVE, amount=100) + + + + HTTP 202 + (Accepted) + + + + [10] + POST /quotes + (amountType=RECEIVE, amount=100) + + + + HTTP 202 + (Accepted) + + + + + Internal rating for fees/commission, + 1 USD in FSP commission, generate + and store fulfilment, generate + condition out of fulfilment + + + + [11] + PUT /quotes/ + <ID> + (transferAmount=99 USD + payeeFspCommission=1 USD) + + + + HTTP 200 + (OK) + + + + [12] + PUT /quotes/ + <ID> + (transferAmount=99 USD + payeeFspCommission=1 USD) + + + + HTTP 200 + (OK) + + + + + BankNrOne keeps commission as + fee, transaction is free for Mats + + + [13] + Transferring 100 USD to Henrik + Karlsson will cost 0 USD in fees + + + [14] + I approve the transaction + + + + + Reserve 100 USD from Mats + Hagman's account, + 99 USD to Switch and + 1 USD to FSP commission + + + + [15] + POST /transfers + (amount=99 USD, PayerFsp=BankNrOne + payeeFsp=MobileMoney) + + + + HTTP 202 + (Accepted) + + + + + Reserve 99 USD from + BankNrOne to MobileMoney + + + + [16] + POST /transfers + (amount=99 USD, PayerFsp=BankNrOne + payeeFsp=MobileMoney) + + + + HTTP 202 + (Accepted) + + + + + Perform transfer of 100 USD to + Henrik Karlsson's account, + 99 USD from Switch + account, and 1 USD from FSP + commission account + + + + + [17] + Retrieve fulfilment + + + [18] + You have received 100 USD + from Mats Hagman + + + + [19] + PUT /transfers/ + <ID> + (Fulfilment) + + + + HTTP 200 + (OK) + + + + + Commit transfer from + BankNrOne to MobileMoney + + + + [20] + PUT /transfers/ + <ID> + (Fulfilment) + + + + HTTP 200 + (OK) + + + + + Commit transfer from Mats + Hagman's account to + Switch account + + + [21] + You have transferred 100 USD + to Henrik Karlsson + + diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure8.plantuml b/docs/fr/technical/api/assets/diagrams/sequence/figure8.plantuml new file mode 100644 index 000000000..69a6186af --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure8.plantuml @@ -0,0 +1,135 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation + +- Name Surname +-------------- +******'/ + +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} +hide footbox + +' declare title +' title Example of non-disclosing receive amount + +' Actor Keys: +' participant - FSP(Payer/Payee) and Optional Switch +' actor - Payee and Payer + +' declare actors +actor "<$actor>\nPayer" as Payer +participant "Payer\nFSP" as PayerFSP +participant "Optional\nSwitch" as Switch +participant "Payee\nFSP" as PayeeFSP +actor "<$actor>\nPayee" as Payee + +' start flow +Payer ->> PayerFSP: I would like to Payee to\nreceive 100 USD +activate PayerFSP +PayerFSP ->> Switch: **POST /quotes**\n(amountType=RECEIVED,\namount=100 USD) +activate Switch +PayerFSP <<-- Switch: **HTTP 202** (Accepted) +Switch ->> PayeeFSP: **POST /quotes**\n(amountType=RECEIVE,\namount=100 USD) +activate PayeeFSP +Switch <<-- PayeeFSP: **HTTP 202** (Accepted) +PayeeFSP -> PayeeFSP: Rate transaction fee or\ncommission for handeling\ntransaction in Payee FSP => \nFSP commission 1 USD +Switch <<- PayeeFSP: **PUT /quotes/**\n(transferAmount=99 USD,\npayeeFspCommission=1 USD) +Switch -->> PayeeFSP: **HTTP 200** (OK) +deactivate PayeeFSP +PayerFSP <<- Switch: **PUT /quotes/** +PayerFSP -->> Switch: **HTTP 200** (OK) +deactivate Switch +PayerFSP -> PayerFSP: Keep commission\nfee for Payer for\nhandling transaction in\nPayer FSP => total fee 1 USD +PayerFSP ->> Payer: Sending 100 USD to Payee\nwill cost 1 USD in fees +deactivate PayerFSP +@enduml diff --git a/docs/fr/technical/api/assets/diagrams/sequence/figure8.svg b/docs/fr/technical/api/assets/diagrams/sequence/figure8.svg new file mode 100644 index 000000000..7ffa03a23 --- /dev/null +++ b/docs/fr/technical/api/assets/diagrams/sequence/figure8.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + Payer + + + + Payer + FSP + + Optional + Switch + + Payee + FSP + + Payee + + + + + + + + + I would like to Payee to + receive 100 USD + + + + POST /quotes + (amountType=RECEIVED, + amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + POST /quotes + (amountType=RECEIVE, + amount=100 USD) + + + + HTTP 202 + (Accepted) + + + + + Rate transaction fee or + commission for handeling + transaction in Payee FSP => + FSP commission 1 USD + + + + PUT /quotes/ + <ID> + (transferAmount=99 USD, + payeeFspCommission=1 USD) + + + + HTTP 200 + (OK) + + + + PUT /quotes/ + <ID> + + + + HTTP 200 + (OK) + + + + + Keep commission + fee for Payer for + handling transaction in + Payer FSP => total fee 1 USD + + + + Sending 100 USD to Payee + will cost 1 USD in fees + + diff --git a/docs/fr/technical/api/assets/figure1-platforms-layout.svg b/docs/fr/technical/api/assets/figure1-platforms-layout.svg new file mode 100644 index 000000000..8a12de358 --- /dev/null +++ b/docs/fr/technical/api/assets/figure1-platforms-layout.svg @@ -0,0 +1,3 @@ + + +
CA
CA
ALS
ALS
FSP-1
FSP-1
FSP-2
FSP-2
Switch
Switch
FSP-3
FSP-3
FSP-4
FSP-4
Issuer: CN=CA
O=CA
Subject: CN=CA
O=CA
Issuer: CN=CA...
Issuer: CN=CA
O=CA
Subject: CN=CA
O=CA
Issuer: CN=CA...
Issuer: CN=CA
O=CA
Subject: CN=CA
O=CA
Issuer: CN=CA...
Issuer: CN=CA
O=CA
Subject: CN=CA
O=CA
Issuer: CN=CA...
Issuer: CN=CA
O=CA
Subject: CN=CA
O=CA
Issuer: CN=CA...
Issuer: CN=CA
O=CA
Subject: CN=CA
O=CA
Issuer: CN=CA...
Issuer: CN=CA
O=CA
Subject: CN=CA
O=CA
Issuer: CN=CA...
Legend:
Solid lines indicate TLS-secured communication.
Dashed lines indicate certificate owner.
Legend:...
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/docs/fr/technical/api/assets/scheme-rules-figure-1-http-timeout.png b/docs/fr/technical/api/assets/scheme-rules-figure-1-http-timeout.png new file mode 100644 index 000000000..9d3faf74e Binary files /dev/null and b/docs/fr/technical/api/assets/scheme-rules-figure-1-http-timeout.png differ diff --git a/docs/fr/technical/api/assets/scheme-rules-figure-2-callback-timeout.png b/docs/fr/technical/api/assets/scheme-rules-figure-2-callback-timeout.png new file mode 100644 index 000000000..04f5da996 Binary files /dev/null and b/docs/fr/technical/api/assets/scheme-rules-figure-2-callback-timeout.png differ diff --git a/docs/fr/technical/api/assets/sequence-diagram-figure-1.png b/docs/fr/technical/api/assets/sequence-diagram-figure-1.png new file mode 100644 index 000000000..53215785d Binary files /dev/null and b/docs/fr/technical/api/assets/sequence-diagram-figure-1.png differ diff --git a/docs/fr/technical/api/fspiop/README.md b/docs/fr/technical/api/fspiop/README.md new file mode 100644 index 000000000..0ea34535c --- /dev/null +++ b/docs/fr/technical/api/fspiop/README.md @@ -0,0 +1,28 @@ +--- +footerCopyright: Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0) | Ericsson, Huawei, Mahindra-Comviva, Telepin, et la Fondation Bill & Melinda Gates +--- + +# API FSPIOP + +La spécification Open API pour l’interopérabilité des FSP inclut les documents suivants : + +## Documents Logiques + +* [Modèle de Données Logique](./logical-data-model.md) +* [Modèles de Transactions Génériques](./generic-transaction-patterns.md) +* [Cas d’Utilisation](./use-cases.md) + +## Documents de Liaison REST Asynchrone + +* Définition de l’API + * [FSPIOP v1.1](./v1.1/api-definition.md) + * [FSPIOP v1.0](./v1.0/api-definition.md) +* [API Central Ledger](#central-ledger-api) +* [Règles de Liaison JSON](#json-binding-rules) +* [Règles des Schémas](./scheme-rules.md) + +## Intégrité des Données, Confidentialité et Non-Répudiation + +* [Bonnes Pratiques PKI](./pki-best-practices.md) +* [Signature](./v1.1/signature.md) +* [Cryptage](./v1.1/encryption.md) diff --git a/docs/fr/technical/api/fspiop/definitions.md b/docs/fr/technical/api/fspiop/definitions.md new file mode 100644 index 000000000..3ca5ba8c7 --- /dev/null +++ b/docs/fr/technical/api/fspiop/definitions.md @@ -0,0 +1,13 @@ +--- +footerCopyright: Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0) | Ericsson, Huawei, Mahindra-Comviva, Telepin, et la Fondation Bill & Melinda Gates +--- + +# API FSPIOP + +## Versions + +|Version|Date|Description des changements| +|---|---|---| +|[1.0](./v1.0/api-definition)|2018-03-13|Version initiale| +|[1.1](./v1.1/api-definition)|2020-05-19|1. Cette version comprend une nouvelle option pour qu'un FSP du Bénéficiaire demande une notification de confirmation auprès du Switch. Le Switch doit alors envoyer la notification de confirmation en utilisant la nouvelle requête **PATCH /transfers/**_{ID}_. L’option d’utiliser la notification de confirmation remplace l’ancienne option de « Vérification de compensation additionnelle facultative ». La section décrivant cela a été remplacée par la nouvelle section « Notification de confirmation ». Comme la ressource **transfers** a été mise à jour avec la nouvelle requête **PATCH**, cette ressource est passée à la version 1.1. Dans le cadre de l’ajout de la possibilité d’utiliser une notification de confirmation, les changements suivants ont été apportés :
a. PATCH a été ajouté comme méthode HTTP autorisée dans la Section 3.2.2. b. Le déroulement de l’appel pour **PATCH** est décrit en Section 3.2.3.5.
c. Le Tableau 6 en Section 6.1.1 a été mis à jour pour inclure **PATCH** comme méthode HTTP possible.
d. La Section 6.7.1 contient la nouvelle version de la ressource **transfers**.
e. La Section 6.7.2.6 décrit le processus d’utilisation des notifications de confirmation.
f. La Section 6.7.3.3 décrit la nouvelle requête **PATCH /transfers**/_{ID}_.

2. En plus des changements mentionnés ci-dessus concernant la notification de confirmation, les modifications suivantes n’affectant pas l’API ont été effectuées :
a. La Figure 6 a été corrigée car elle contenait une erreur de copier-coller.
b. Ajout de la Section 6.1.2 pour décrire une vue complète de la version actuelle de chaque ressource.
c. Ajout d’une section pour chaque ressource permettant de consulter l’historique des versions de la ressource.
d. Corrections éditoriales mineures.

3. Les descriptions de deux champs d’en-tête HTTP dans le Tableau 1 ont été mises à jour afin d’apporter plus de précisions et de contextes.
a. La description du champ d’en-tête **FSPIOP-Destination** a été mise à jour pour indiquer qu’il doit être laissé vide si la destination n’est pas connue de l’expéditeur initial, mais dans tous les autres cas, il doit être ajouté par l’expéditeur initial d’une requête.
b. La description du champ d’en-tête **FSPIOP-URI** a été rendue plus spécifique.

4. Les exemples utilisés dans ce document ont été actualisés pour utiliser la bonne interprétation du type complexe ExtensionList tel que défini dans le Tableau 84. Ceci n’implique pas de changement en tant que tel.
a. La Liste 5 a été mise à jour en ce sens.

5. Le modèle de données a été mis à jour pour ajouter un élément optionnel ExtensionList au type complexe **PartyIdInfo** sur la base de la Demande de modification : https://github.com/mojaloop/mojaloop-specification/issues/30. Suite à cela, le modèle de données tel que spécifié dans le Tableau 103 a été mis à jour. Pour la cohérence, le modèle de données pour les appels **POST /participants/**_{Type}/{ID}_ et **POST /participants/**_{Type}/{ID}/{SubId}_ dans le Tableau 10 a été également mis à jour pour inclure l’élément ExtensionList optionnel.

6. Une nouvelle Section 6.5.2.2 est ajoutée pour décrire le processus impliqué dans le rejet d’un devis.

7. Une note a été ajoutée à la Section 6.7.4.1 pour clarifier l’utilisation de l’état ABORTED dans les retours d’appel **PUT /transfers/**_{ID}_.| +|**1.1.1**|2021-09-22|Cette version du document ajoute uniquement des informations concernant les en-têtes HTTP optionnels supportant la traçabilité dans le [Tableau 2](#table-2), voir _Support de la traçabilité distribuée pour OpenAPI Interoperability_ pour plus d’informations. Il n'y a aucun changement dans les ressources dans cette version.| \ No newline at end of file diff --git a/docs/fr/technical/api/fspiop/generic-transaction-patterns.md b/docs/fr/technical/api/fspiop/generic-transaction-patterns.md new file mode 100644 index 000000000..53bbfc9f0 --- /dev/null +++ b/docs/fr/technical/api/fspiop/generic-transaction-patterns.md @@ -0,0 +1,494 @@ +--- +footerCopyright: Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0) | Ericsson, Huawei, Mahindra-Comviva, Telepin, and the Bill & Melinda Gates Foundation +--- +# Modèles de Transactions Génériques + +## Préface + +Cette section contient des informations sur la manière d'utiliser ce document. + +### Conventions Utilisées dans Ce Document + +Les conventions suivantes sont utilisées dans ce document pour identifier les différents types d’information : + +|Type d’Information|Convention|Exemple| +|---|---|---| +|**Éléments de l’API, comme les ressources**|Gras|**/authorization**| +|**Variables**|Italique entre accolades|_{ID}_| +|**Termes du glossaire**|Italique à la première occurrence ; défini dans le _Glossaire_|L'objectif de l’API est de permettre des transactions financières interopérables entre un _Payeur_ (un payeur de fonds électroniques dans une transaction de paiement) situé dans un _FSP_ (une entité qui fournit un service financier numérique à un utilisateur final) et un _Bénéficiaire_ (un destinataire de fonds électroniques dans une transaction de paiement) situé dans un autre FSP.| +|**Documents de référence**|Italique|Les informations utilisateurs ne devraient généralement pas être utilisées par les déploiements d’API ; les mesures de sécurité détaillées dans _Signature API_ et _Cryptage API_ doivent être employées.| + +### Informations sur la Version du Document + +|Version|Date|Description des changements| +|---|---|---| +|**1.0**|2018-03-13|Version initiale| + +
+ +## Introduction + +Ce document présente les quatre modèles de transactions génériques pris en charge dans une version logique de l’API d’Interopérabilité. De plus, tous les services logiques faisant partie de l’API sont présentés à un niveau élevé. + +### Spécification Open API pour l'Interopérabilité des FSP + +La spécification Open API pour l’interopérabilité des FSP inclut les documents suivants. + +#### Documents Logiques + +- [Modèle de Données Logique](#) + +- [Modèles de Transactions Génériques](./generic-transaction-patterns) + +- [Cas d’Utilisation](./use-cases) + +#### Documents de Liaison REST Asynchrone + +- [Définition de l’API](./api-definition) + +- [Règles de Liaison JSON](./json-binding-rules) + +- [Règles des Schémas](./scheme-rules) + +#### Intégrité des Données, Confidentialité et Non-Repudiation + +- [Bonnes Pratiques PKI](./pki-best-practices) + +- [Signature](./v1.1/signature) + +- [Cryptage](./v1.1/encryption) + +#### Documents Généraux + +- [Glossaire](./glossary) + +
+ +## Services Logiques de l’API + +L’API d’Interopérabilité se compose de plusieurs ressources d’API logiques. Chaque ressource définit un ou plusieurs services utilisables par les clients pour se connecter à un serveur ayant implémenté l’API. Cette section présente ces services. + +**Note:** Les services API identifiés dans cette section peuvent ne pas être concernés (et donc ne pas apparaître) dans les modèles de transactions génériques identifiés dans [Modèles de Transactions Génériques](#generic-transaction-patterns). + +Par exemple, certains services servent à la fourniture d'informations, font partie des cas d'erreurs ou servent à la récupération d'informations non nécessaires dans un modèle de transaction générique. + +
+ +### Fonctionnalités Communes + +Cette section présente des fonctionnalités utilisées par plusieurs ressources ou services logiques de l'API. + +#### Adressage des Parties + +Une Partie est une entité telle qu’un individu, une entreprise, une organisation ayant un compte financier dans un des FSPs. Une partie est identifiée par une combinaison d’un _Type d’ID_ et d’un _ID_, et éventuellement aussi par un _sous-type_ ou un _sous-ID_. Quelques exemples de combinaisons _Type d’ID_ et _ID_ : + +- _Type d’ID_ : **MSISDN**, _ID_ : **+123456789** + +- _Type d’ID_ : **Email**, _ID_ : **john@doe.com** + +#### Interledger + +L’API inclut un support de base pour le protocole Interledger (ILP) en définissant une mise en œuvre concrète du protocole « Interledger Payment Request »[1](https://interledger.org/rfcs/0011-interledger-payment-request)(ILP) dans les ressources logiques **Devis** et **Transferts**. Plus de détails sur le protocole ILP sont disponibles sur le site du projet Interledger[2](https://interledger.org), dans le livre blanc Interledger[3](https://interledger.org/interledger.pdf) et dans la spécification d’architecture Interledger[4](https://interledger.org/rfcs/0001-interledger-architecture). + +
+ +### Ressource API Participants + +Dans l’API, un _Participant_ est l’équivalent d’un FSP qui participe à un schéma d’interopérabilité. L’objectif principal de la ressource API logique **Participants** est de permettre aux FSPs de savoir dans quel autre FSP se situe une contrepartie dans une transaction financière interopérable. Il existe également des services définis pour que les FSPs puissent fournir des informations à un système commun. + +#### Requêtes + +Cette section identifie les requêtes de services de l’API logique qui peuvent être envoyées d’un client à un serveur. + +##### Recherche d’Informations sur un Participant + +La requête logique `Recherche d’Informations sur un Participant` est utilisée par un FSP pour demander à un autre système (qui peut être un autre FSP ou un système commun) des informations concernant dans quel FSP se situe une contrepartie dans une transaction financière interopérable. + +- Réponse en cas de succès : [Retourner Informations Participation](#return-participant-information) + +- Réponse en cas d’erreur : [Retourner Erreur des Informations de Participation](#return-participant-information-error) + +##### Création d’Informations sur un Participant + +La requête logique `Création d’Informations sur un Participant` est utilisée pour fournir des informations sur le FSP dans lequel se trouve une partie. + +- Réponse en cas de succès : [Retourner Informations Participation](#return-participant-information) + +- Réponse en cas d’erreur : [Retourner Erreur des Informations de Participation](#return-participant-information-error) + +##### Création d’Informations de Participants en Masse + +La requête logique `Création d’Informations de Participants en Masse` est utilisée pour fournir des informations sur le(s) FSP(s) dans le(s)quel(s) se trouvent une ou plusieurs parties. + +- Réponse en cas de succès : [Retourner Informations de Participants en Masse](#return-bulk-participant-information) + +- Réponse en cas d’erreur : [Retourner Erreur des Informations de Participants en Masse](#return-bulk-participant-information-error) + +##### Suppression d’Informations sur un Participant + +La requête logique `Suppression d’Informations sur un Participant` est utilisée pour retirer des informations concernant le FSP dans lequel se trouve une partie. + +- Réponse en cas de succès : [Retourner Informations Participation](#return-participant-information) + +- Réponse en cas d’erreur : [Retourner Erreur des Informations de Participation](#return-participant-information-error) + +
+ +#### Réponses + +Cette section identifie les réponses de service logique de l’API pouvant être renvoyées à un client par un serveur. + +##### Retourner Informations Participation + +Réponse utilisée pour retourner des informations suite aux requêtes [Recherche d’Informations sur un Participant](#lookup-participant-information), [Création d’Informations sur un Participant](#create-participant-information) et [Suppression d’Informations sur un Participant](#delete-participant-information). + +##### Retourner Informations de Participants en Masse + +Réponse utilisée pour retourner les informations suite à la requête [Création d’Informations de Participants en Masse](#create-bulk-participant-information). + +
+ +#### Réponses d’Erreur + +Cette section identifie les réponses d’erreur pouvant être renvoyées à un client par un serveur. + +##### Retourner Erreur des Informations de Participation + +Réponse d’erreur utilisée en cas de problème lors des requêtes [Recherche d’Informations sur un Participant](#lookup-participant-information), [Création d’Informations sur un Participant](#create-participant-information) et [Suppression d’Informations sur un Participant](#delete-participant-information). + +##### Retourner Erreur des Informations de Participants en Masse + +Réponse d’erreur utilisée en cas de problème lors de la requête [Création d’Informations de Participants en Masse](#create-bulk-participant-information). + +
+ +### Ressource API Parties + +Dans l’API, une _Partie_ est un individu, une entreprise, une organisation ou une entité similaire possédant un compte financier dans l’un des FSP. L’objectif principal de la ressource API logique **Parties** est de permettre aux FSP de récupérer des informations sur une contrepartie dans une transaction interopérable (nom, date de naissance, etc.). + +#### Requêtes + +##### Recherche d’Informations sur une Partie + +La requête logique `Recherche d’Informations sur une Partie` est utilisée par un FSP pour demander à un autre FSP des informations concernant une contrepartie dans une transaction financière interopérable. + +- Réponse en cas de succès : [Retourner Informations sur la Partie](#return-party-information) + +- Réponse en cas d’erreur : [Retourner Erreur des Informations sur la Partie](#return-party-information-error) + +
+ +#### Réponses + +##### Retourner Informations sur la Partie + +Réponse utilisée pour retourner des informations suite à la requête [Recherche d’Informations sur une Partie](#lookup-party-information). + +
+ +#### Réponses d’Erreur + +##### Retourner Erreur des Informations sur la Partie + +Réponse d’erreur utilisée pour retourner des informations d’erreur suite à la requête [Recherche d’Informations sur une Partie](#lookup-party-information). + +
+ +### Ressource API Demandes de Transaction + +Dans l’API, une _Demande de Transaction_ est une demande d’un Bénéficiaire vers un Payeur pour transférer des fonds électroniques au Bénéficiaire, que le Payeur peut accepter ou refuser. L’objectif de la ressource logique **Demandes de Transaction** est qu’un FSP du bénéficiaire envoie la demande de transfert au FSP du payeur. + +#### Requêtes + +##### Exécuter une Demande de Transaction + +La requête `Exécuter une Demande de Transaction` sert à envoyer une demande de transfert d’un FSP bénéficiaire vers un FSP payeur, c’est-à-dire à demander si le payeur accepte ou refuse la transaction. + +- Réponse en cas de succès : [Retourner Informations sur la Demande de Transaction](#return-transaction-request-information) + +- Réponse en cas d’erreur : [Retourner Erreur de la Demande de Transaction](#return-transaction-request-information-error) + +##### Récupérer des Informations sur une Demande de Transaction + +Cette requête est envoyée du FSP du bénéficiaire vers le FSP du payeur pour récupérer des informations sur une demande antérieure. + +- Réponse en cas de succès : [Retourner Informations sur la Demande de Transaction](#return-transaction-request-information) + +- Réponse en cas d’erreur : [Retourner Erreur de la Demande de Transaction](#return-transaction-request-information-error) + +
+ +#### Réponses + +##### Retourner Informations sur la Demande de Transaction + +Réponse utilisée pour retourner des informations suite aux requêtes [Exécuter une Demande de Transaction](#perform-transaction-request) ou [Récupérer des Informations sur une Demande de Transaction](#retrieve-transaction-request-information). + +
+ +#### Réponses d’Erreur + +##### Retourner Erreur de la Demande de Transaction + +Réponse d’erreur utilisée pour retourner des informations d’erreur concernant les requêtes [Exécuter une Demande de Transaction](#perform-transaction-request) ou [Récupérer des Informations sur une Demande de Transaction](#retrieve-transaction-request-information). + +
+ +### Ressource API Devis + +Dans l’API, un _Devis_ représente le prix pour effectuer une transaction financière interopérable entre un FSP payeur et un FSP bénéficiaire. L’objectif principal de la ressource logique **Devis** est que le FSP payeur demande au FSP bénéficiaire de calculer sa part du devis. + +#### Requêtes + +##### Calculer un Devis + +La requête `Calculer un Devis` est envoyée par un FSP payeur pour demander au FSP bénéficiaire de calculer sa part du devis. Le FSP bénéficiaire doit aussi générer le paquet ILP et la condition (voir [Interledger](#interledger)) à la réception de la demande. + +- Réponse en cas de succès : [Retourner Informations sur le Devis](#return-quote-information) + +- Réponse en cas d’erreur : [Retourner Erreur du Devis](#return-quote-information-error) + +
+ +##### Récupérer des Informations sur un Devis + +Cette requête permet au FSP payeur de demander des informations sur un devis déjà émis. + +- Réponse en cas de succès : [Retourner Informations sur le Devis](#return-quote-information) + +- Réponse en cas d’erreur : [Retourner Erreur du Devis](#return-quote-information-error) + +
+ +#### Réponses + +##### Retourner Informations sur le Devis + +Réponse utilisée pour retourner des informations suite aux requêtes [Calculer un Devis](#calculate-quote) ou [Récupérer des Informations sur un Devis](#retrieve-quote-information). + +
+ +#### Réponses d’Erreur + +##### Retourner Erreur du Devis + +Réponse d’erreur utilisée pour retourner des informations d’erreur concernant les requêtes [Calculer un Devis](#calculate-quote) ou [Récupérer des Informations sur un Devis](#retrieve-quote-information). + +
+ +### Ressource API Autorisations + +Dans l’API, une _Autorisation_ est une approbation d’un payeur pour effectuer une transaction interopérable par saisie des identifiants applicables dans le système FSP du bénéficiaire. Exemple : un payeur effectuant une opération sur un DAB géré par un autre FSP. L’objectif principal de la ressource logique **Autorisations** est que le FSP payeur demande au FSP bénéficiaire de solliciter la saisie des identifiants au payeur. + +#### Requêtes + +##### Exécuter une Autorisation + +La requête `Exécuter une Autorisation` est envoyée par un FSP payeur au FSP bénéficiaire pour demander la saisie des identifiants permettant d’approuver la transaction interopérable. + +- Réponse en cas de succès : [Retourner Résultat d’Autorisation](#return-authorization-result) + +- Réponse en cas d’erreur : [Retourner Erreur d’Autorisation](#return-authorization-error) + +
+ +#### Réponses + +##### Retourner Résultat d’Autorisation + +Réponse utilisée pour retourner des informations suite à la requête [Exécuter une Autorisation](#perform-authorization). + +
+ +#### Réponses d’Erreur + +##### Retourner Erreur d’Autorisation + +Réponse d’erreur utilisée pour retourner les erreurs concernant la requête [Exécuter une Autorisation](#perform-authorization). + +
+ +### Ressource API Transferts + +Dans l’API, un _Transfert_ désigne un transfert de fonds hop-to-hop via ILP (voir [Interledger](#interledger) pour plus d’informations). + +Le transfert contient également des informations sur la transaction interopérable de bout en bout. L’objectif principal de la ressource logique **Transferts** est qu’un FSP ou le Switch demande au prochain acteur de la chaîne ILP d’effectuer le transfert. + +#### Requêtes + +##### Effectuer un Transfert + +La requête `Effectuer un Transfert` permet à un FSP ou au Switch de demander au prochain acteur de la chaîne de réserver le transfert correspondant à la transaction. + +- Réponse en cas de succès : [Retourner Informations sur le Transfert](#return-transfer-information) + +- Réponse en cas d’erreur : [Retourner Erreur du Transfert](#return-transfer-information-error) + +##### Récupérer des Informations sur un Transfert + +Permet de demander au prochain acteur des informations concernant le transfert concerné. + +- Réponse en cas de succès : [Retourner Informations sur le Transfert](#return-transfer-information) + +- Réponse en cas d’erreur : [Retourner Erreur du Transfert](#return-transfer-information-error) + +
+ +#### Réponses + +##### Retourner Informations sur le Transfert + +Réponse utilisée pour retourner des informations suite aux requêtes [Effectuer un Transfert](#perform-transfer) ou [Récupérer des Informations sur un Transfert](#retrieve-transfer-information). Suite à la réception de cette réponse, le FSP ou Switch doit valider l’exécution (voir [Interledger](#interledger)) et valider le transfert réservé si la validation est positive. + +
+ +#### Réponses d’Erreur + +##### Retourner Erreur du Transfert + +Réponse d’erreur utilisée pour retourner des erreurs liées aux requêtes [Effectuer un Transfert](#perform-transfer) ou [Récupérer des Informations sur un Transfert](#retrieve-transfer-information). + +
+ +### Ressource API Transactions + +Dans l’API, une _Transaction_ est une transaction financière interopérable de bout en bout entre le FSP du payeur et celui du bénéficiaire. L’objectif principal de la ressource logique **Transactions** est que le FSP payeur demande des informations de bout en bout au FSP bénéficiaire, par exemple pour obtenir un code ou un jeton à utiliser pour retirer un service ou un produit. + +### Requêtes + +Permet d’identifier les requêtes de services API logiques pouvant être envoyées d’un client à un serveur. + +##### Récupérer des Informations sur une Transaction + +La requête `Récupérer des Informations sur une Transaction` permet au FSP payeur de demander au FSP bénéficiaire des informations sur une transaction effectuée précédemment (en utilisant la ressource logique **Transferts**, voir [API Ressource Transferts](#api-resource-transfers)). + +- Réponse en cas de succès : [Retourner Informations sur le Transfert](#return-transfer-information) + +- Réponse en cas d’erreur : [Retourner Erreur du Transfert](#return-transfer-information-error) + +
+ +#### Réponses + +##### Retourner Informations sur la Transaction + +Réponse utilisée pour retourner des informations suite à la requête [Récupérer des Informations sur un Transfert](#retrieve-transfer-information). + +
+ +#### Réponses d’Erreur + +##### Retourner Erreur d’Informations sur la Transaction + +Réponse d’erreur utilisée pour retourner des erreurs liées à la requête [Récupérer des Informations sur un Transfert](#retrieve-transfer-information). + +
+ +### Ressource API Devis en Masse + +Dans l’API, un _Devis en Masse_ désigne un ensemble de devis individuels (voir la section [Ressource API Devis](#api-resource-quotes)) pour effectuer plusieurs transactions interopérables de FSP payeur à FSP bénéficiaire. + +L’objectif principal de la ressource **Devis en Masse** est que le FSP payeur demande au FSP bénéficiaire de calculer sa part du devis en masse. + +#### Requêtes + +##### Calculer un Devis en Masse + +La requête `Calculer un Devis en Masse` est utilisée par un FSP payeur pour demander au FSP bénéficiaire de calculer sa part du devis pour effectuer plusieurs transactions interopérables. + +Le FSP bénéficiaire doit aussi générer le paquet ILP et la condition pour chaque devis. + +- Réponse en cas de succès : [Retourner Informations Devis en Masse](#return-bulk-quote-information) + +- Réponse en cas d’erreur : [Retourner Erreur Devis en Masse](#return-bulk-quote-information-error) + +##### Récupérer des Informations sur un Devis en Masse + +Permet à un FSP payeur de demander à un FSP bénéficiaire des informations sur un devis en masse précédemment envoyé. + +- Réponse en cas de succès : [Retourner Informations Devis en Masse](#return-bulk-quote-information) + +- Réponse en cas d’erreur : [Retourner Erreur Devis en Masse](#return-bulk-quote-information-error) + +
+ +#### Réponses + +##### Retourner Informations Devis en Masse + +Réponse utilisée pour retourner des informations suite aux requêtes [Calculer un Devis en Masse](#calculate-bulk-quote) ou [Récupérer des Informations sur un Devis en Masse](#retrieve-bulk-quote-information). + +
+ +#### Réponses d’Erreur + +##### Retourner Erreur Devis en Masse + +Réponse d’erreur utilisée pour retourner des erreurs liées aux requêtes [Calculer un Devis en Masse](#calculate-bulk-quote) ou [Récupérer des Informations sur un Devis en Masse](#retrieve-bulk-quote-information). + +
+ +### Ressource API Transferts en Masse + +Dans l’API, un _Transfert en Masse_ est un ensemble de transferts ILP hop-to-hop (voir [Interledger](#interledger)), chacun correspondant à une transaction. Les transferts contiennent aussi les détails des transactions de bout en bout. + +La ressource logique **Transferts en Masse** permet à un FSP ou au Switch de demander au prochain acteur d’effectuer les transferts nécessaires. + +#### Requêtes + +##### Effectuer un Transfert en Masse + +Permet à un FSP ou Switch de demander au prochain acteur de réserver les transferts nécessaires à une transaction financière interopérable. + +- Réponse en cas de succès : [Retourner Infos Transfert en Masse](#return-bulk-transfer-information) + +- Réponse en cas d’erreur : [Retourner Erreur Transfert en Masse](#return-bulk-transfer-information-error) + +##### Récupérer Informations sur un Transfert en Masse + +Permet de demander des informations sur un transfert donné. + +- Réponse en cas de succès : [Retourner Infos Transfert en Masse](#return-bulk-transfer-information) + +- Réponse en cas d’erreur : [Retourner Erreur Transfert en Masse](#return-bulk-transfer-information-error) + +
+ +#### Réponses + +##### Retourner Infos Transfert en Masse + +Réponse pour retourner les informations suite aux requêtes [Effectuer un Transfert en Masse](#perform-bulk-transfer) ou [Récupérer Informations Transfert en Masse](#retrieve-bulk-transfer-information). + +À réception, le FSP ou le Switch doit valider les fulfilments et valider les transferts réservés si la validation est réussie. + +
+ +#### Réponses d’Erreur + +##### Retourner Erreur Transfert en Masse + +Réponse utilisée pour retourner des erreurs concernant [Effectuer un Transfert en Masse](#perform-bulk-transfer) ou [Récupérer Informations Transfert en Masse](#retrieve-bulk-transfer-information). + +
+ +## Modèles de Transactions Génériques + +Cette section expose les trois principaux modèles de transactions définis dans l’API d’Interopérabilité : + +- [Transaction Initiée par le Payeur](#payer-initiated-transaction) + +- [Transaction Initiée par le Bénéficiaire](#payee-initiated-transaction) + +- [Transaction en Masse](#bulk-transaction) + +Chaque modèle décrit comment transférer des fonds d’un payeur dans un FSP à un bénéficiaire dans un autre FSP. + +Les modèles [Transaction Initiée par le Payeur](#payer-initiated-transaction) et [Transaction Initiée par le Bénéficiaire](#payee-initiated-transaction) concernent chacun un transfert unique entre un payeur et un bénéficiaire. La différence principale porte sur l’initiateur de la transaction. + +Le modèle [Transaction en Masse](#bulk-transaction) est utilisé lorsqu’un seul payeur souhaite transférer des fonds à plusieurs bénéficiaires, éventuellement dans des FSP différents, en une seule opération. + +Cette section fournit également des informations sur le modèle alternatif _Transaction Initiée par le Bénéficiaire avec OTP_. De plus, elle couvre à haut niveau tous les services logiques inclus dans l’API. + +
+ diff --git a/docs/fr/technical/api/fspiop/glossary.md b/docs/fr/technical/api/fspiop/glossary.md new file mode 100644 index 000000000..3191d44ce --- /dev/null +++ b/docs/fr/technical/api/fspiop/glossary.md @@ -0,0 +1,121 @@ +--- +footerCopyright: Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0) | Ericsson, Huawei, Mahindra-Comviva, Telepin, et la Fondation Bill & Melinda Gates +--- + +# Glossaire + +## Préface + +Cette section fournit des informations sur la façon d'utiliser ce document. + +### Conventions utilisées dans ce document + +Les conventions suivantes sont utilisées dans ce document pour identifier les types d'informations spécifiés. + +| **Type d’Information** | **Convention** | **Exemple** | +| :--- | :--- | :--- | +| **Éléments de l'API tels que les ressources** | Gras | **/authorization** | +| **Variables** | Italique entre accolades | _{ID}_ | +| **Glossaire** | Italique à la première occurrence ; défini dans le _Glossaire_ | Le but de l’API est de permettre des transactions financières interopérables entre un _Payer_ (un payeur de fonds électroniques dans une transaction de paiement) situé dans un _FSP_ (une entité qui fournit un service financier numérique à un utilisateur final) et un _Payee_ (un bénéficiaire de fonds électroniques dans une transaction de paiement) situé dans un autre FSP. | +| **Documents de la bibliothèque** | Italique | Les informations utilisateur ne doivent, en général, pas être utilisées par les déploiements d’API ; les mesures de sécurité détaillées dans _API Signature_ et _API Encryption_ doivent être utilisées à la place.| + +### Informations sur la version du document + +| **Version** | **Date** | **Description du changement** | +| :--- | :--- | :--- | +| **1.0** | 2018-03-13 | Version initiale | + +
+ +## Introduction + +Ce document fournit le glossaire pour la spécification Open API pour l’interopérabilité FSP. Les termes ont été compilés à partir de trois sources : + +- ITU-T Digital Financial Services Focus Group Glossary (ITU-T)[ITU-T Digital Financial Services Focus Group Glossary (ITU-T)](https://www.itu.int/dms_pub/itu-t/opb/tut/T-TUT-ECOPO-2018-PDF-E.pdf), +- Retours des fournisseurs de services technologiques (TSP) dans les groupes de travail Product Development Partnership (PDP), et +- Retours de l’équipe L1P IST Reference Implementation (RI). + +Les informations sont partagées conformément à la licence Creative Commons[LICENSE](https://github.com/mojaloop/mojaloop-specification/blob/master/LICENSE.md). + + +### Open API pour la spécification d’interopérabilité FSP + +L’Open API pour la spécification d’interopérabilité FSP comprend les documents suivants. + +#### Documents logiques + +- [Logical Data Model](./logical-data-model) + +- [Generic Transaction Patterns](./generic-transaction-patterns) + +- [Use Cases](./use-cases) + +#### Documents de liaison REST asynchrone + +- [API Definition](./api-definition) + +- [JSON Binding Rules](./json-binding-rules) + +- [Scheme Rules](./scheme-rules) + +#### Intégrité des données, confidentialité et non-répudiation + +- [PKI Best Practices](./pki-best-practices) + +- [Signature](./v1.1/signature) + +- [Encryption](./v1.1/encryption) + +#### Documents généraux + +- [Glossary](#) + +
+ + +## Glossaire de l’API + +| **Terme** | **Termes alternatifs et connexes** | **Définition** | **Source** | +| --- | --- | --- | --- | +| **Access Channel** | POS ("Point of Sale"), Customer Access Point, ATM, Branch, MFS Access Point | Lieux ou moyens utilisés pour initier ou recevoir un paiement. Les "Access Channels" peuvent inclure les agences bancaires, les distributeurs automatiques (ATM), terminaux POS, points d’agents, téléphones portables et ordinateurs. | ITU-T | +| **Account ID** | | Identifiant unique assigné par le FSP ayant créé le compte. | PDP | +| **Account Lookup System** | | Entité abstraite utilisée pour retrouver dans quel FSP un compte, un wallet, ou une identité est hébergé. Peut être hébergée sur son propre serveur, au sein d’un financial switch ou chez divers FSPs. | PDP | +| **Active User** | | Terme utilisé par plusieurs fournisseurs pour décrire combien de détenteurs de compte utilisent fréquemment leur service. | +| **Agent** | Agent Til , Agent Outlet | Entité autorisée par le fournisseur pour gérer diverses fonctions comme l’enrôlement client, cash-in et cash-out avec un agent til. | ITU-T | +| **Agent Outlet** | Access Point | Emplacement physique accueillant un ou plusieurs agent tills, permettant de réaliser des opérations d’enrôlement, cash-in et cash-out pour des clients au nom d’un ou plusieurs fournisseurs. Le droit d’exclusivité peut dépendre de la loi nationale. Un Agent Outlet peut exercer d’autres activités. | ITU-T | +| **Agent Till** | Registered Agent | « Agent till » : ligne enregistrée délivrée par un fournisseur (SIM spéciale ou terminal POS), servant aux opérations d’enrôlement, cash-in, cash-out. La loi nationale peut définir quels fournisseurs peuvent l’émettre. | ITU-T | +| **Aggregator** | Merchant Aggregator | Fournisseur spécialisé de services aux marchands, gérant généralement les transactions pour de nombreux petits commerçants. Les règles du scheme peuvent limiter leur champ d’action. | ITU-T | +| **Anti-Money Laundering** | AML ; aussi "Combating the Financing of Terrorism", ou CFT | Initiatives visant à détecter et arrêter l’utilisation des systèmes financiers pour dissimuler des fonds obtenus illégalement. | ITU-T | +| **API** | Application Programming Interface | Ensemble de méthodes clairement définies pour permettre l’interaction et l’échange de données entre différents programmes logiciels. |PDP | +| **Arbitration** | | Recours à un arbitre (et non au tribunal) pour résoudre des litiges. | ITU-T | +| **Authentication** | Verification, Validation | Processus permettant de s’assurer qu’une personne ou une transaction est valide pour le processus effectué (ouverture de compte, initiation de transaction, etc) | ITU-T | +| **Authorization** | | Processus utilisé lors d’un "pull" payment (tel un paiement carte), où le payee demande à la banque du payer de confirmer la validité de la transaction. | ITU-T | +| **Authorized /institution entity** | | Institution non financière autorisée par la Banque d’État ou autres autorités de régulation à fournir des services financiers mobiles. | PDP | +| **Automated Clearing House** | ACH | Système électronique d’échanges d’ordres de paiement entre fournisseurs de services de paiement, via médias magnétiques ou réseaux de télécommunications, puis compensation entre participants. | ITU-T | +| **Bank** | Savings Bank, Credit Union, Payments Bank | Système financier agréé dans un pays, capable d’accepter des dépôts et d’effectuer des paiements sur les comptes des clients. | ITU-T | +| **Bank Accounts and Transaction Services** | Mobile Banking, Remote Banking, Digital Banking| Compte de transactions détenu auprès d’une banque, parfois accessible par téléphone mobile (mobile banking). | ITU-T | +| **Bank-Led Model** | Bank-Centric Model| Système où les banques sont les principaux fournisseurs de services financiers numériques à l’utilisateur final. | ITU-T | +| **Basic Phone** | | Appareil minimal requis pour l’utilisation des services financiers digitaux. | PDP | +| **Bill Payment** | C2B, Utility Payments, School Payments | Réalisation d’un paiement pour un service récurrent, en personne (“face to face”) ou à distance. | ITU-T | +| **Biometric Authentication** | | Utilisation d’une caractéristique physique d'une personne (empreinte digitale, iris...) pour l’authentifier. | ITU-T | +| **Biometric Authentication** | | Tout processus validant l’identité d’un utilisateur souhaitant accéder à un système par mesure d’une caractéristique intrinsèque. | ITU-T | +| **Blacklist** | | Registre d’entités (utilisateurs enregistrés) refusés/désactivés d’un privilège, service, accès… N’ayant pas droit d’accès/usage/prise en compte. Cette pratique permet d’identifier explicitement les utilisateurs à refuser. | PDP | +| **Blockchain** | Digital Currency, Cryptocurrency, Distributed Ledger Technology | Technologie sous-jacente à Bitcoin et autres crypto-monnaies : un registre numérique partagé, mis à jour en continu. | ITU-T | +| **Borrowing** | | Emprunter de l’argent pour un besoin à court ou long terme. | ITU-T | +| **Bulk Payments** | G2C, B2C, G2P, Social Transfers| Versements de masse gouvernement-consommateur : allocations, transferts, salaires, pensions… | ITU-T | +| **Bulk Payment Services** | | Service permettant à une agence gouvernementale ou entreprise d’effectuer des paiements à un grand nombre de bénéficiaires. | ITU-T | +| **Bulk upload service** | | Service permettant l’import de multiples transactions par session, souvent via transfert de fichier bulk pour initialiser des paiements (ex: fichier de paie). | ITU-T | +| **Bundling** | Packaging, Tying | Modèle dans lequel un fournisseur regroupe des services en un seul produit que l’utilisateur final accepte d’acheter ou d’utiliser. | ITU-T | +| **Business** | | Entité (ex : société anonyme, SARL, etc) utilisant le mobile money pour effectuer / recevoir des paiements, verser les salaires… | PDP | +| **Cash Management** | Agent Liquidity Management | Gestion des soldes de liquidité chez un agent. | ITU-T | +| **Cash-In** | CICO (Cash-In Cash-Out) | Crédit d’eMoney en échange d’argent liquide, typiquement chez un agent. | ITU-T | +| **Cash-Out** | CICO (Cash-In Cash-Out) | Remise d’argent physique en échange d’un débit sur compte eMoney, typiquement chez un agent. | ITU-T | +| **Certificate Signing Request** | CSR | Message envoyé d’un demandeur à une Autorité de Certification pour demander un certificat d’identité numérique. | | +| **Chip Card** | EMV Chip Card, Contactless Chip Card | Carte à puce comportant un microprocesseur, pouvant être sans contact ou à contact (insérée en terminal). | ITU-T | +| **Clearing** | | Processus de transmission, rapprochement et confirmation des transactions avant leur règlement. Inclut parfois le netting et la création des positions finales. | RI | +| **Clearing House** | | Emplacement ou mécanisme central où les institutions financières échangent instructions de paiement ou d’autres obligations, avant règlement selon les règles et procédures du clearinghouse. | ITU-T | +| **Client Authentication** | TLS | Certificat utilisé pour authentifier un client durant un handshake SSL ; celuici permet de vérifier que le client est bien celui revendiqué (Source: Techopedia). | | +| **Closed-Loop** | | Système de paiement utilisé par un fournisseur unique ou un groupe fermé de fournisseurs. | ITU-T | + +[...pour les besoins de place, continuer à traduire chaque définition en français en gardant les keywords anglais dans la colonne 1 (et 2). À la demande de l'utilisateur, tout le tableau sera traduit dans le style illustré ci-dessus...] + diff --git a/docs/fr/technical/api/fspiop/json-binding-rules.md b/docs/fr/technical/api/fspiop/json-binding-rules.md new file mode 100644 index 000000000..7dc1d484e --- /dev/null +++ b/docs/fr/technical/api/fspiop/json-binding-rules.md @@ -0,0 +1,218 @@ +--- +showToc: true +footerCopyright: Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0) | Ericsson, Huawei, Mahindra-Comviva, Telepin, et la Fondation Bill & Melinda Gates +--- +# Règles d’Association JSON (JSON Binding Rules) + +## Préface + +Cette section contient des informations sur la manière d’utiliser ce document. + +### Conventions Utilisées dans ce Document + +Les conventions suivantes sont utilisées dans ce document pour identifier les types d’informations spécifiés. + +|Type d’information|Convention|Exemple| +|---|---|---| +|**Éléments de l’API, tels que ressources**|Gras|**/authorization**| +|**Variables**|Italique entre accolades|_{ID}_| +|**Termes du glossaire**|Italique à la première occurrence ; défini dans _Glossaire_|Le but de l’API est de permettre des transactions financières interopérables entre un _Payeur_ (qui paie les fonds électroniques dans une transaction de paiement) situé dans un _PSF_ (entité qui fournit un service financier numérique à un utilisateur final) et un _Bénéficiaire_ (qui reçoit des fonds électroniques dans une transaction de paiement) situé dans un autre PSF.| +|**Documents bibliothèques**|Italique|Les informations utilisateur ne doivent, en général, pas être utilisées par les déploiements API ; les mesures de sécurité détaillées dans _Signature API_ et _Chiffrement API_ doivent être utilisées à la place.| + +### Informations sur la Version du Document + +|Version|Date|Description des changements| +|---|---|---| +|**1.0**|2018-03-13|Version initiale| + +## Introduction + +L’objectif de ce document est d’exprimer le modèle de données utilisé par l’API Ouverte pour l’Interopérabilité des PSF (ci-après appelée « l’API ») sous la forme de règles d’association JSON Schema, ainsi que les règles de validation de leurs instances correspondantes. + +Ce document complète et développe l’information fournie dans _Open API for FSP Interoperability Specification_. Les contenus de la spécification sont listés dans [Vue d’ensemble de l’API FSPIOP](/). + +Les types utilisés dans l’API PDP relèvent principalement de trois catégories : + +- Types de données et formats de base utilisés + +- Types d’éléments + +- Types complexes + +Les différents types utilisés dans _Définition de l’API_, _Modèle de Données_ et _Spécification Open API_, ainsi que les règles de transformation JSON auxquelles leurs instances doivent se conformer, sont identifiés dans les sections suivantes. + +
+ +### Spécification Open API pour l’Interopérabilité des PSF + +La Spécification Open API pour l’Interopérabilité des PSF inclut les documents suivants. + +#### Documents Logiques + +- [Modèle de Données Logique](./logical-data-model) + +- [Modèles Généraux de Transaction](./generic-transaction-patterns) + +- [Cas d’Utilisation](./use-cases) + +#### Documents de Liaison REST Asynchrone + +- [Définition de l’API](./api-definition) + +- [Règles d’Association JSON](#) + +- [Règles de Schéma](./scheme-rules) + +#### Intégrité des Données, Confidentialité et Non-répudiation + +- [Bonnes Pratiques PKI](./pki-best-practices) + +- [Signature](./v1.1/signature) + +- [Chiffrement](./v1.1/encryption) + +#### Documents Généraux + +- [Glossaire](./glossary) + +
+ +## Mots-clés et Utilisation + +Les _mots-clés_ utilisés dans les Schémas JSON et les règles sont dérivés de la _Spécification JSON Schema_[1](http://json-schema.org/documentation.html). Les types de mots-clés employés sont identifiés dans les sections [Mots-Clés de Validation](#validation-keywords), [Mots-Clés de Métadonnées](#metadata-keywords) et [Instance-et-$ref](#instance-and-$ref). Comme expliqué plus en détail plus loin, certains de ces mots-clés spécifient des paramètres de validation tandis que d’autres sont plus descriptifs, comme les métadonnées. La description suivante précise, par exemple, si un champ DOIT[2](https://www.ietf.org/rfc/rfc2119.txt) être présent dans la définition ou s’il est associé à un certain type de données. + +### Mots-Clés de Validation + +Cette section[3](http://json-schema.org/latest/json-schema-validation.html) fournit des descriptions des mots-clés utilisés pour la validation dans la _Définition de l’API_. Les mots-clés de validation dans un schéma imposent des exigences pour la validation réussie d’une instance. + +#### maxLength + +La valeur de ce mot-clé DOIT être un entier non négatif. Une instance chaîne est valide vis-à-vis de ce mot-clé si sa longueur est inférieure ou égale à la valeur de ce dernier. La longueur d’une instance chaîne est le nombre de ses caractères selon la RFC 7159 [RFC7159]. + +#### minLength + +La valeur de ce mot-clé DOIT être un entier non négatif. Une instance chaîne est valide pour ce mot-clé si sa longueur est supérieure ou égale à la valeur de ce dernier. Omettre ce mot-clé a le même effet que de lui assigner la valeur **0**. + +#### pattern + +La valeur de ce mot-clé DOIT être une chaîne de caractères. Cette chaîne DEVRAIT être une expression régulière valide selon la syntaxe ECMA 262. Une instance chaîne est valide si l’expression régulière correspond avec succès. Rappel : les expressions régulières ne sont pas implicitement ancrées. + +#### items + +La valeur de `items` DOIT être un schéma JSON valide ou un tableau de schémas valides. Ce mot-clé détermine comment les instances enfants sont validées pour les tableaux ; il ne valide pas directement l’instance immédiate. Si `items` est un schéma, la validation réussit si tous les éléments du tableau valident contre ce schéma. Si `items` est un tableau de schémas, la validation réussit si chaque élément valide contre le schéma à la même position. Omettre ce mot-clé a le même effet que de spécifier un schéma vide. + +#### maxItems + +La valeur de ce mot-clé DOIT être un entier non négatif. Une instance de tableau est valide contre `maxItems` si sa taille est inférieure ou égale à cette valeur. + +#### minItems + +La valeur de ce mot-clé DOIT être un entier non négatif. Une instance de tableau est valide contre `minItems` si sa taille est supérieure ou égale à cette valeur. Omettre ce mot-clé a le même effet que la valeur **0**. + +#### required + +La valeur de ce mot-clé DOIT être un tableau. Les éléments DOIVENT être des chaînes de caractères uniques. Une instance objet est valide contre ce mot-clé si chaque élément du tableau est le nom d’une propriété présente dans l’instance. Omettre ce mot-clé revient à avoir un tableau vide. + +#### properties + +La valeur de `properties` DOIT être un objet. Chaque valeur de cet objet DOIT être un schéma JSON valide. Ce mot-clé définit comment les enfants sont validés pour les objets ; il ne valide pas l’instance immédiate elle-même. La validation réussit si, pour chaque nom commun entre l’instance et le schéma, l’instance enfant valide contre le schéma correspondant. Omettre ce mot-clé revient à un objet vide. + +#### enum + +La valeur de ce mot-clé DOIT être un tableau. Il DEVRAIT inclure au moins un élément. Les éléments DEVRAIENT être uniques. Une instance valide contre ce mot-clé si sa valeur est égale à un des éléments du tableau. Les éléments peuvent être de toute valeur, y compris null. + +#### type + +La valeur de ce mot-clé DOIT être une chaîne ou un tableau. Si c’est un tableau, les éléments DOIVENT être des chaînes uniques. Les chaînes DOIVENT être un des six types primitifs (null, boolean, object, array, number, ou string), ou integer pour les entiers. Une instance valide si et seulement si elle fait partie de l’un des ensembles listés pour ce mot-clé. + +Cette spécification utilise le type string pour tous les types de base et d’éléments, mais applique des restrictions avec des expressions régulières via `patterns`. Les types complexes sont des objets et contiennent des propriétés de type élément ou objet à leur tour. Les types array servent à spécifier des listes, actuellement seulement utilisées dans des types complexes. + +### Mots-Clés de Métadonnées + +Cette section décrit les champs utilisés dans les définitions JSON des types. Elle précise si un champ DOIT être présent dans la définition et s’il est associé à un type de données principal. + +#### definitions + +La valeur de ce mot-clé DOIT être un objet. Chaque membre DOIT être un schéma JSON valide. Ce mot-clé ne joue pas de rôle dans la validation. Il offre un emplacement standardisé pour inclure des schémas JSON dans un schéma plus général. + +#### title et description + +La valeur des deux mots-clés DOIT être une chaîne. Ces deux mots-clés peuvent fournir à une interface utilisateur des informations sur les données produites. Un titre sera de préférence court, tandis qu’une description expliquera le but de l’instance décrite. + +### Instance et $ref + +Deux mots-clés, **Instance** et **$ref** sont utilisés dans les définitions JSON Schema ou les règles de transformation dans ce document, décrits dans [Instance](#instance) et [Références de Schéma avec $ref](#schema-references-with-$ref-keyword). `Instance` n’est pas utilisé dans la Spécification Open API ; ce terme sert à décrire des règles de validation et de transformation dans ce document. `$ref` contient une URI comme référence à d’autres types ; il est utilisé dans la Spécification. + +#### Instance + +JSON Schema interprète les documents selon un modèle de données. Une valeur JSON interprétée selon ce modèle est appelée une `instance`[4](http://json-schema.org/latest/json-schema-core.html\#rfc.section.4.2). Une instance a un des six types primitifs, et une plage de valeurs selon le type : + +- **null** : Production JSON `null`. + +- **boolean** : Valeur `true` ou `false` de la production JSON. + +- **object** : Ensemble non ordonné de propriétés associant une chaîne à une instance (production object). + +- **array** : Liste ordonnée d’instances (production array JSON). + +- **number** : Nombre décimal en précision arbitraire, base-10, production number. + +- **string** : Suite de points de code Unicode (production string JSON). + +Les espaces blancs et le formatage sont hors du champ du JSON Schema. Comme un objet ne peut pas avoir deux propriétés avec la même clé, le comportement d’un document JSON essayant d’avoir deux propriétés de même nom est indéfini. + +#### Références de schéma avec le mot-clé $ref + +Le mot-clé `$ref`[5](http://json-schema.org/latest/json-schema-core.html\#rfc.section.8) sert à référencer un schéma et permet de valider des structures récursives via l’auto-référence. Un objet schéma avec une propriété `$ref` DOIT être interprété comme référence. La valeur de `$ref` DOIT être une référence URI. Concernant l’URI de base courante, elle identifie l’URI d’un schéma à utiliser. Toutes autres propriétés d’un objet `$ref` DOIVENT être ignorées. + +L’URI n’est pas un localisateur réseau, seulement un identifiant. Un schéma n’a pas besoin d’être téléchargeable à partir de l’adresse si c’est une URL réseau, et les implémentations ne DOIVENT PAS effectuer d’opération réseau quand elles rencontrent une URI réseau. Un schéma NE DOIT PAS tourner en boucle infinie sur un schéma. Par exemple, si deux schémas "#alice" et "#bob" ont une propriété "allOf" qui référence l’autre, un validateur naïf pourrait passer en boucle. Les schémas NE DOIVENT PAS utiliser de telles boucles récursives ; le comportement est indéfini. + +On l’utilise avec la syntaxe `"$ref"` et il est mappé à une définition existante. La syntaxe de la valeur `_$ref_`, `#/definitions/`, indique que le type référencé vient de la section Définitions de la Spécification Open API (typiquement, les sections sont Paths, Definitions, Responses et Parameters). Un exemple se trouve en [Liste 26](#listing-26), où les types pour les propriétés _authentication_ et _authenticationValue_ sont fournis par des références vers les types `AuthenticationType` et `AuthenticationValue`. + +### Définitions JSON et Exemples + +Les définitions JSON et exemples sont fournis après la plupart des sections définissant les règles de transformation, si pertinent. Ils sont fournis au format JSON, tirés de la version JSON de la Spécification Open API. Les expressions régulières dans les exemples peuvent avoir de petites différences (parfois un ‘**\\**’ supplémentaire) par rapport à celles des règles car les exemples sont issus de la version JSON alors que les règles viennent de la spécification standard Open API (Swagger). Ils sont fournis dans la section concernée sous forme de Liste numérotée. Par exemple, [Liste 1](#listing-1) fournit la version JSON de la définition du type de données `Amount`. + +Pour chaque type de données, une description du schéma JSON extrait de la Spécification Open API et (si pertinent) un exemple pour ce type sont fournis. Après la description du schéma, viennent les règles de transformation qui s’appliquent à une instance de ce type particulier. + +
+ +## Types Éléments et Types de Base + +Cette section contient les définitions et règles de transformation pour les formats de base et les types _éléments_ utilisés par l’API comme spécifié dans _API Definition_ et _API Data Model_. Ces définitions sont basiques dans le contexte de la spécification API, mais *pas* dans la spécification technique Open API. Souvent, ces types de données de base sont dérivés des types de base supportés par Open API, comme le type string. + +### Type de Donnée Amount + +Cette section fournit la définition JSON Schema pour le type de donnée `Amount`. [Liste 1](#listing-1) fournit le schéma JSON pour le type `Amount`. + +- Paire clé-valeur JSON avec Nom "**title**" et Valeur "**Amount**" + +- Paire clé-valeur JSON avec Nom "**type**" et Valeur "**string**" + +- Paire clé-valeur JSON avec Nom "**pattern**" et Valeur "**^([0]|([1-9][0-9]{0,17}))([.][0-9]{0,3}[1-9])?$**" + +- Paire clé-valeur JSON avec Nom "**description**" et Valeur "**Le type de données Amount de l’API est une chaîne JSON dans un format canonique, restreint par une expression régulière pour des raisons d’interopérabilité. Ce format n’autorise pas de zéros en fin, mais permet un montant sans unité mineure de devise. Seules quatre décimales au plus dans l’unité mineure ; aucune valeur négative n’est permise. Pas plus de 18 chiffres dans l’unité majeure.**" + +##### Liste 1 + +```JSON +"Amount": { + "title": "Amount", + "type": "string", + "pattern": + "^([0]|([1-9][0-9]{0,17}))([.][0-9]{0,3}[1-9])?$", + "maxLength": 32, + "description": "Le type de données Amount de l’API est une chaîne JSON dans un format canonique, restreint par une expression régulière pour des raisons d’interopérabilité." +} +``` +**Liste 1 -- JSON Schema pour le type Amount** + +Les règles de transformation pour une instance du type Amount sont les suivantes : + +- Une instance de type `Amount` DOIT être de type string. + +- L’instance DOIT correspondre à l’expression régulière **^([0]|([1-9][0-9]{0,17}))([.][0-9]{0,3}[1-9])?$** + +- La longueur de cette instance est limitée comme ci-dessus à 23, avec 18 chiffres pour l’unité majeure et 4 pour l’unité mineure. Exemples valides : **124.45**, **5, 5.5, 4.4444, 0.5, 0, 181818181818181818** + + diff --git a/docs/fr/technical/api/fspiop/logical-data-model.md b/docs/fr/technical/api/fspiop/logical-data-model.md new file mode 100644 index 000000000..f74b191c5 --- /dev/null +++ b/docs/fr/technical/api/fspiop/logical-data-model.md @@ -0,0 +1,273 @@ +--- +footerCopyright: Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0) | Ericsson, Huawei, Mahindra-Comviva, Telepin, et la Fondation Bill & Melinda Gates +--- + +# Modèle de Données Logique + +## Préface + +Cette section contient des informations sur la façon d'utiliser ce document. + +### Conventions utilisées dans ce document + +Les conventions suivantes sont utilisées dans ce document pour identifier les types d'informations spécifiés. + +|Type d'information|Convention|Exemple| +|---|---|---| +|**Éléments de l'API, comme les ressources**|Gras|**/authorization**| +|**Variables**|Italique entre crochets|_{ID}_| +|**Termes du glossaire**|Italique à la première occurrence ; défini dans le _Glossaire_|Le but de l'API est de permettre des transactions financières interopérables entre un _Payeur_ (un payeur de fonds électroniques dans une transaction de paiement) situé dans un _FSP_ (une entité qui fournit un service financier numérique à un utilisateur final) et un _Bénéficiaire_ (destinataire de fonds électroniques dans une transaction de paiement) situé dans un autre FSP.| +|**Documents de bibliothèque**|Italique|Les informations utilisateur ne devraient généralement pas être utilisées par les déploiements API ; les mesures de sécurité détaillées dans _Signature API_ et _Chiffrement API_ doivent être utilisées à la place.| + +### Informations sur la version du document + +|Version|Date|Description du changement| +|---|---|---| +|**1.0**|2018-03-13|Version initiale| + +
+ +## Introduction + +Ce document spécifie le modèle de données logique utilisé par Open API (Interface de Programmation d'Applications) pour l'Interopérabilité des Fournisseurs de Services Financiers (FSP, Financial Service Provider) (ci-après appelée « l’API »). + +La section [Éléments de Services](#api-services-elements) répertorie les éléments utilisés par chaque service. + +La section [Modèle de Données de Support](#api-supporting-data-model) décrit le modèle de données en termes d’éléments de base, de types de données simples et de types complexes. + +### Spécification Open API pour l’Interopérabilité des FSP + +La spécification Open API pour l'interopérabilité des FSP inclut les documents suivants. + +#### Documents logiques + +- [Modèle de Données Logique](#) + +- [Modèles de Transaction Génériques](./generic-transaction-patterns) + +- [Cas d’Utilisation](./use-cases) + +#### Documents de liaison REST asynchrone + +- [Définition de l'API](./api-definition) + +- [Règles de Liaison JSON](./json-binding-rules) + +- [Règles de Schéma](./scheme-rules) + +#### Intégrité des Données, Confidentialité et Non-Répudiation + +- [Bonnes Pratiques PKI](./pki-best-practices) + +- [Signature](./v1.1/signature) + +- [Chiffrement](./v1.1/encryption) + +#### Documents généraux + +- [Glossaire](./glossary) + +
+ +## Éléments des services de l’API + +Cette section identifie et décrit les éléments utilisés par chaque service. + +### Ressource API : Participants + +Cette section décrit le modèle de données des services pour la ressource **Participants**. + +#### Requêtes + +Cette section décrit le modèle de données des services qui peuvent être demandés par un client à l’API pour la ressource **Participants**. +
+ +##### Recherche d’Informations sur un Participant + +Le Tableau 1 contient le modèle de données pour _Recherche d’Informations sur un Participant_. + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **partyIdType** | 1 | [PartyIdType](#partyidtype-element) | Le type de l'identifiant. | +| **partyIdentifier** | 1 | [PartyIdentifier](#partyidentifier-element) | Un identifiant pour la Partie. | +| **partySubIdOrType** | 0..1 | [PartyIdSubIdOrType](#partysubidortype-element) | Un sous-identifiant ou sous-type pour la Partie.| + +**Tableau 1 – Modèle de données de Recherche d’Informations sur un Participant** + +
+ +##### Création d’Informations sur un Participant + +Le Tableau 2 ci-dessous contient le modèle de données pour _Création d’Informations sur un Participant_. + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **partyIdType** | 1 | [PartyIdType](#partyidtype-element) |Le type de l'identifiant. | +| **partyIdentifier** | 1 | [PartyIdentifier](#partyidentifier-element) | Un identifiant pour la Partie. | +| **partySubIdOrType** | 0..1 | [PartyIdSubIdOrType](#partysubidortype-element) | Un sous-identifiant ou sous-type pour la Partie. | +| **fspId** | 1 | [FspId](#fspid-element) | Identifiant FSP auquel la Partie appartient. | +| **currency** | 0..1 | [Currency](#currency-element) | Indique que la devise fournie est prise en charge par la Partie. | + +**Tableau 2 – Modèle de données de Création d’Informations sur un Participant** + +
+ +##### Création d’Informations en Masse sur des Participants + +Le Tableau 3 ci-dessous contient le modèle de données pour _Création d’Informations en Masse sur des Participants_. + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **requestId** | 1 | [CorrelationId](#correlationid-element) | L’ID de la demande, déterminé par le client. Utilisé pour identifier le rappel du serveur. | +| **partyList** | 1..10000 | [PartyIdInfo](#partyidinfo) | Liste des éléments Party que le Client veut mettre à jour ou créer des informations FSP à propos. | +| **currency** | 0..1 | [Currency](#currency-enum) | Indique que la devise fournie est prise en charge par chaque PartyIdInfo de la liste. | + +**Tableau 3 – Modèle de données de Création en Masse d’Informations sur les Participants** + +
+ +##### Suppression d’Informations sur un Participant + +Le Tableau 4 ci-dessous contient le modèle de données pour _Suppression d’Informations sur un Participant_. + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **partyIdType** | 1 | [PartyIdType](#partyidtype-element) | Le type de l’identifiant. | +| **partyIdentifier** | 1 | [PartyIdentifier](#partyidentifier-element) | Un identifiant pour la Partie. | +| **partySubIdOrType** | 0..1 | [PartyIdSubIdOrType](#partysubidortype-element) | Un sous-identifiant ou sous-type pour la Partie. | + +**Tableau 4 – Modèle de données de Suppression d’Informations sur un Participant** + +
+ +#### Réponses + +Cette section décrit le modèle de données des réponses utilisées par le serveur dans l’API pour les services fournis par la ressource **Participants**. + +##### Retour des Informations sur un Participant + +Le Tableau 5 ci-dessous contient le modèle de données pour _Retour des Informations sur un Participant_. + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **partyIdType** | 1 | [PartyIdType](#partyidtype-element) | Le type de l'identifiant. | +| **partyIdentifier** | 1 | [PartyIdentifier](#partyidentifier-element) | Un identifiant pour la Partie. | +| **partySubIdOrType** | 0..1 | [PartyIdSubIdOrType](#partysubidortype-element) | Un sous-identifiant ou sous-type pour la Partie. | +| **fspId** | 0..1 | [FspId](#fspid-element) | Identifiant FSP auquel la Partie appartient. | + +**Tableau 5 – Modèle de données de Retour des Informations sur un Participant** + +
+ +##### Retour d’Informations en Masse sur des Participants + +Le Tableau 6 ci-dessous contient le modèle de données pour _Retour d’Informations en Masse sur des Participants_. + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **requestId** | 1 | [CorrelationId](#correlationid-element) | L’ID de la demande, déterminé par le client. Utilisé pour identifier le rappel du serveur. | +| **partyList** | 1..10000 | [PartyResult](#partyresult) | Liste des éléments PartyResult pour lesquels la création a été tentée (et a réussi ou échoué). | +| **Currency** | 0..1 | [Currency](#currency-element) | Indique que la devise fournie a été indiquée comme acceptée pour chaque PartyIdInfo ajouté avec succès. | + +**Tableau 6 – Modèle de données de Retour d’Informations en Masse sur les Participants** + +
+ +#### Réponses d’erreur + +Cette section décrit le modèle de données des réponses d'erreur utilisées par le serveur dans l’API pour les services fournis par la ressource **Participants**. + +##### Erreur de Retour d’Informations sur un Participant + +Le Tableau 7 ci-dessous contient le modèle de données pour _Erreur de Retour d’Informations sur un Participant_. + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **partyIdType** | 1 | [PartyIdType](#partyidtype-element) | Le type de l'identifiant. | +| **partyIdentifier** | 1 | [PartyIdentifier](#partyidentifier-element) | Un identifiant pour la Partie. | +| **partySubIdOrType** | 0..1 | [PartyIdSubIdOrType](#partysubidortype-element) | Un sous-identifiant ou sous-type pour la Partie. | +| **errorInformation** | 1 | [ErrorInformation](#errorinformation) | Code d’erreur, description de la catégorie. | + +**Tableau 7 – Modèle de données d’Erreur de Retour d’Informations sur un Participant** + +
+ +##### Erreur de Retour d’Informations en Masse sur des Participants + +Le Tableau 8 ci-dessous contient le modèle de données pour _Erreur de Retour d’Informations en Masse sur des Participants_. + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **requestId** | 1 | [CorrelationId](#correlationid-element) | L’ID de la demande, déterminé par le client. Utilisé pour identifier le rappel du serveur. | +| **errorInformation** | 1 | [ErrorInformation](#errorinformation) | Code d’erreur, description de la catégorie. | + +**Tableau 8 – Modèle de données d’Erreur de Retour d’Informations en Masse sur des Participants** + +
+ +### Ressource API : Parties + +Cette section décrit le modèle de données des services pour la ressource **Parties**. + +#### Requêtes + +Cette section décrit le modèle de données des services qui peuvent être demandés par un client dans l’API pour la ressource **Parties**. + +##### Recherche d’Informations sur une Partie + +Le Tableau 9 ci-dessous contient le modèle de données pour _Recherche d’Informations sur une Partie_. + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **partyIdType** | 1 | [PartyIdType](#partyidtype-element) | Le type de l'identifiant. | +| **partyIdentifier** | 1 | [PartyIdentifier](#partyidentifier-element) | Un identifiant pour la Partie. | +| **partySubIdOrType** | 0..1 | [PartyIdSubIdOrType](#partysubidortype-element) | Un sous-identifiant ou sous-type pour la Partie. | + +**Tableau 9 – Modèle de données de Recherche d’Informations sur une Partie** + +
+ +#### Réponses + +Cette section décrit le modèle de données des réponses utilisées par le serveur dans l’API pour les services fournis par la ressource **Parties**. + +##### Retour d’Informations sur une Partie + +Le Tableau 10 ci-dessous contient le modèle de données pour _Retour d’Informations sur une Partie_. + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **partyIdType** | 1 | [PartyIdType](#partyidtype-element) | Le type de l'identifiant. | +| **partyIdentifier** | 1 | [PartyIdentifier](#partyidentifier-element) | Un identifiant pour la Partie. | +| **partySubIdOrType** | 0..1 | [PartySubIdOrType](#partysuboridtype-element) | Un sous-identifiant ou sous-type pour la Partie. | +| **party** | 1 | [Party](#party) | Informations concernant la Partie demandée. | + +**Tableau 10 – Modèle de données de Retour d’Informations sur une Partie** + +
+ +#### Réponses d’erreur + +##### Erreur de Retour d’Informations sur une Partie + +Le Tableau 11 ci-dessous contient le modèle de données pour _Erreur de Retour d’Informations sur une Partie_. + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **partyIdType** | 1 | [PartyIdType](#partyidtype-element) | Le type de l'identifiant. | +| **partyIdentifier** | 1 | [PartyIdentifier](#partyidentifier-element) | Un identifiant pour la Partie. | +| **partySubIdOrType** | 0..1 | [PartySubIdOrType](#partysuboridtype-element) | Un sous-identifiant ou sous-type pour la Partie. | +| **errorInformation** | 1 | [ErrorInformation](#errorinformation) | Code d’erreur, description de la catégorie. | + +**Tableau 11 – Modèle de données d’Erreur de Retour d’Informations sur une Partie** + +
+ +### Ressource API : Demandes de Transactions + +_… Etc (CONTINUER pour tout le document en respectant la structure, la terminologie et en traduisant l’anglais vers le français, conserver les noms techniques JSON/tables tels quels, traduire entête, descriptions, colonnes, paragraphes, légendes, intitulés, titres, notes, et ne pas traduire la syntaxe des expressions régulières, noms de champs d’API ou extraits de code)._ + +
+ +_En raison de la longueur et le volume de la documentation, cette traduction doit continuer selon le même schéma pour toutes les autres sections détaillées, en maintenant la fidélité et la clarté pour un public technique francophone._ + diff --git a/docs/fr/technical/api/fspiop/pki-best-practices.md b/docs/fr/technical/api/fspiop/pki-best-practices.md new file mode 100644 index 000000000..9bc84b865 --- /dev/null +++ b/docs/fr/technical/api/fspiop/pki-best-practices.md @@ -0,0 +1,700 @@ +--- +footerCopyright: Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0) | Ericsson, Huawei, Mahindra-Comviva, Telepin, et la Fondation Bill & Melinda Gates +--- + +# Bonnes Pratiques de l’Infrastructure à Clé Publique (PKI) + +## Préface + +Cette section contient des informations sur la manière d’utiliser ce document. + +### Conventions Utilisées dans Ce Document + +Les conventions suivantes sont utilisées dans ce document pour identifier les types spécifiques d’informations. + +| Type d’Information | Convention | Exemple | +|---|---|---| +| **Éléments de l’API, comme les ressources** | Gras | **/authorization** | +| **Variables** | Italique entre accolades | _{ID}_ | +| **Termes du glossaire** | Italique à la première occurrence ; défini dans le _Glossaire_ | Le but de l’API est de permettre des transactions financières interopérables entre un _Payeur_ (un payeur de fonds électroniques dans une transaction de paiement) situé dans un _FSP_ (une entité qui fournit un service financier numérique à un utilisateur final) et un _Bénéficiaire_ (un destinataire de fonds électroniques dans une transaction de paiement) situé dans un autre FSP. | +| **Documents de la bibliothèque** | Italique | Les informations utilisateur ne devraient, en général, pas être utilisées par les déploiements d’API ; les mesures de sécurité détaillées dans _Signature API_ et _Cryptage API_ doivent être utilisées à la place. | + +### Informations sur la Version du Document + +| Version | Date | Description du Changement | +|---|---|---| +| **1.0** | 2018-03-13 | Version initiale | + +## Introduction + +Ce document explique les _bonnes pratiques de l’Infrastructure à Clé Publique_ (PKI)1 à appliquer dans un déploiement de l’_Open API pour l’Interopérabilité des FSP_ (ci-après cité comme « l’API »). Voir la section [Contexte PKI](#pki-background) pour plus d’informations à propos de la PKI. + +L’API doit être mise en œuvre dans un environnement composé soit : + +- de _Fournisseurs de Services Financiers_ (FSP) qui communiquent avec d’autres FSP (en configuration bilatérale), ou + +- d’un _Switch_ qui agit comme une plateforme intermédiaire entre les plateformes des FSP. Un _Système de Recherche de Comptes_ (ALS) est également disponible pour identifier dans quel FSP se trouve un titulaire de compte. + +Pour plus d’informations sur l’environnement, voir la section [Topologie du Réseau](#network-topology). [Stratégie de gestion PKI de l’Autorité de Certification](#certificate-authority-pki-management-strategy) et [Stratégie de gestion PKI de la Plateforme](#platform-pki-management-strategy) identifient les stratégies de gestion pour la CA et la plateforme. + +La communication entre plateformes s’effectue en utilisant un protocole HTTP basé sur REST (REpresentational State Transfer) (pour plus d’informations, voir _Définition de l’API_). Ce protocole ne fournit pas de moyen d’assurer l’intégrité ou la confidentialité entre plateformes, il est donc nécessaire d’ajouter des couches de sécurité supplémentaires pour protéger les informations sensibles contre la modification ou l’exposition à des parties non autorisées. + +
+ +### Spécification Open API pour l’Interopérabilité des FSP + +La spécification Open API pour l’Interopérabilité des FSP inclut les documents suivants. + +#### Documents Logiques + +- [Modèle de Données Logique](./logical-data-model) + +- [Modèles de Transactions Génériques](./generic-transaction-patterns) + +- [Cas d’Utilisation](./use-cases) + +#### Documents de Liaison REST Asynchrone + +- [Définition de l’API](./api-definition) + +- [Règles de Liaison JSON](./json-binding-rules) + +- [Règles des Schémas](./scheme-rules) + +#### Intégrité des Données, Confidentialité et Non-Répudiation + +- [Bonnes Pratiques PKI](#) + +- [Signature](./v1.1/signature) + +- [Cryptage](./v1.1/encryption) + +#### Documents Généraux + +- [Glossaire](./glossary) + +
+ + +## Contexte PKI + +L’Infrastructure à Clé Publique (PKI) est un ensemble de standards, procédures et logiciels permettant la mise en œuvre de l’authentification utilisant la cryptographie à clé publique. La PKI est utilisée pour demander, installer, configurer, gérer et révoquer des certificats numériques. La PKI fournit l’authentification via des certificats numériques ; ces certificats sont signés et fournis par des _Autorités de Certification_ (CA). + +La PKI utilise la cryptographie à clé publique et fonctionne avec des certificats conformes à la norme X.509. Elle offre également des fonctionnalités telles que : + +- Authentification de l’utilisateur + +- Production et distribution de certificats + +- Maintien, gestion et révocation des certificats + +La PKI est constituée de plusieurs composants qui permettent à l’infrastructure de fonctionner ; ce n’est pas un processus ou algorithme unique. Outre l’authentification, la PKI permet également de garantir l’intégrité, la non-répudiation et le chiffrement. + +Pour obtenir une clé publique, une entité doit obtenir un certificat numérique. Cette dernière doit demander ce certificat à une CA ou à une _Autorité d’Enregistrement_ (RA) - une organisation qui traite des demandes au nom d’une CA. Tous les participants doivent faire confiance à la CA pour gérer et maintenir les certificats. La CA exige que l’entité fournisse plusieurs informations (_Common Name_ (CN), _Organization_ (O), _Country_ (C), etc.) et valide leur demande avant de fournir le certificat. Ce certificat est la preuve que l’entité est bien celle qu’elle prétend être dans le monde numérique (comme un passeport dans le monde réel). + +La PKI se combine bien avec une _solution Diffie-Hellman_ (un mécanisme sécurisé pour l’échange d’une clé symétrique partagée entre deux pairs anonymes) pour fournir des échanges de clés sécurisés. Parce que Diffie-Hellman n’offre pas d’authentification, la PKI est utilisée avec des protocoles supplémentaires, tels que _Pretty Good Privacy_ (PGP) et _Transport Layer Security_ (TLS). + +### Protection en Couches + +L’API doit être utilisée avec une protection au niveau du transport et au niveau applicatif. + +#### Protection au Niveau du Transport + +Pour protéger le niveau de transport, _Transport Layer Security_2 (TLS) doit être utilisé. TLS est une technique fondamentale pour sécuriser la communication point à point. Elle s’est avérée stable et sûre lors de l’utilisation d’algorithmes robustes avec les versions les plus récentes, et son usage est largement répandu. TLS est un mécanisme sécurisé pour échanger une clé symétrique partagée entre deux pairs anonymes, avec vérification d’identité (c’est-à-dire via des certificats de confiance). Cela garantit la _confidentialité_ (personne n’a lu le contenu) et l’_intégrité_ (personne n’a modifié le contenu). Une bonne utilisation de TLS nécessite une gestion des certificats. + +#### Protection au Niveau Applicatif + +Cette couche assure l’intégrité et la confidentialité de bout en bout. L’API utilise le standard _JSON Web Signature_3 (JWS) pour l’intégrité et la _non-répudiation_ (preuve de l’intégrité et de l’origine des données), et le standard JSON Web Encryption (JWE)4 pour la confidentialité. Une version étendue de JWE est utilisée pour supporter le chiffrement au niveau des champs. + +L’utilisation de ces standards nécessite la gestion de certificats ; par conséquent, les _Autorités de Certification_ (CA) et les techniques PKI associées sont nécessaires. Pour plus d’informations, voir le Contexte PKI. + +## Topologie du Réseau + +Cette section identifie les plateformes constituant l’API. + +### Disposition Point-à-Point des Plateformes + +La Figure 1 montre un exemple de disposition point-à-point des plateformes. + +![Figure1 Platforms Layout](../assets/figure1-platforms-layout.svg) + +**Figure 1 - Disposition des plateformes** + +Toute la communication entre plateformes doit être sécurisée par TLS utilisant l’_authentification client_, aussi connue sous le nom d’_authentification mutuelle_. + +### Rôles des Plateformes + +#### Autorité de Certification (CA) + +La CA réalise les fonctions suivantes : + +- Signature des _demandes de signature de certificat_ (CSR) – Les CSR sont un mécanisme sécurisé pour l’échange d’une clé symétrique partagée entre deux pairs anonymes. La CA signe différents types de certificats (par exemple, TLS, signature de contenu, chiffrement de contenu). + +- Révocation des certificats – Marquer un ou plusieurs certificats comme non valides. + +- Support des CRL – Maintenir et fournir des listes de révocation de certificats (CRL) à télécharger afin que les clients puissent voir les certificats révoqués. + +- Support du protocole OCSP – Fournir des vérifications de révocation en temps réel. + +#### Système de Recherche de Comptes (ALS) + +- Stocke les informations de base sur les titulaires de compte. + +- Répond à des questions comme : « Où dois-je envoyer ma demande de transaction financière pour le titulaire du compte **MSISDN 0123456** ? » + +#### Fournisseur de Services Financiers (FSP) + +Possède les titulaires de compte vers qui ou depuis qui l’argent est transféré. + +#### Switch + +- Relaye les informations de transaction vers d’autres plateformes. + +- Peut exécuter des services financiers, comme spécifié dans la _Définition de l’API_. + +## Stratégie de Gestion de la PKI de la CA + +Cette section décrit la stratégie de gestion PKI pour les Autorités de Certification. + +### Importance de la CA et Critères de Sélection + +Le rôle de la CA est important car : + +- La CA fournit une seule entité légale de confiance pour toutes les plateformes. + +- Le protocole TLS point à point dépend des certificats. + +- Les protocoles de bout en bout JWS et JWE dépendent des certificats pour la preuve de non-répudiation et de confidentialité. + +#### Raisons de Ne Pas Utiliser une CA Publique + +- Une CA publique peut révoquer le certificat intermédiaire utilisé pour signer vos certificats, interrompant ainsi toute communication entre les plateformes. + +- Une CA publique signe également des certificats qui ne font pas partie du dispositif _Open API pour l’Interopérabilité des FSP_. Parce que vous faites confiance au certificat signé, vous faites confiance à tous les certificats signés par cette CA. + +- Aucun service de l’API n’est ouvert au public ; il n’y a donc aucune raison d’utiliser une CA publique déjà approuvée par les clients publics (tels que les navigateurs web). + +#### Options pour une CA Privée + +- Construire sa propre CA depuis zéro + +- Construire une CA à l’aide d’outils existants (par exemple, _openssl_) + +- Utiliser une CA complète (par exemple, le produit open source _EJBCA_) + +### Chaîne de Certificats de Confiance + +Une CA centralisée facilite la gestion des certificats pour les plateformes impliquées. En approuvant le certificat de la même CA, chaque plateforme n’a qu’un seul certificat à approuver : le certificat racine auto-signé de la CA. + +La CA doit signer tous les types de certificats (TLS, signature et chiffrement), mais uniquement pour les participants du dispositif _Open API pour l’Interopérabilité des FSP_. + +Aucun certificat CA intermédiaire n’est nécessaire car une disposition segmentée n’est pas utilisée dans ce cadre. + +### Certificat Racine de la CA + +- La CA doit créer un certificat racine auto-signé pour signer tous les types de certificats pris en charge (TLS, signature et chiffrement). + +- La longueur minimale de la clé RSA asymétrique est de 4096 bits, et l’algorithme de signature doit être sha512WithRSAEncryption. + +- Les _contraintes de base X.509_ doivent avoir l’attribut **CA** positionné à **TRUE**. + +- La durée de validité du certificat racine doit être de dix ans. Après huit ans, un nouveau certificat racine auto-signé doit être créé par la CA ; la paire de clés RSA asymétriques doit être recréée, et non réutilisée. Ce certificat sert alors à signer les CSR des plateformes. Cependant, l’ancien certificat racine reste actif jusqu’à expiration, ce qui laisse deux ans aux plateformes pour changer de certificat racine sans perturber les communications sécurisées en cours. + +### Signature des CSR des Plateformes + +La CA doit fournir un mécanisme permettant aux plateformes de faire signer leurs CSR. Les méthodes de signature courantes sont l’e-mail et une page web. La solution et la politique choisies doivent être connues des plateformes. + +La CA signe trois types de certificats : TLS (pour la communication), JWS (pour la signature) et JWE (pour le chiffrement). Exigences communes : + +- Longueur minimale de la clé RSA asymétrique : 2048 bits, algorithme de signature : sha256WithRSAEncryption. + +- Les contraintes de base X.509 doivent avoir **CA** à **FALSE**. + +- Les DN du sujet doivent inclure au moins les attributs suivants : + + - _Nom Commun_ (CN) : doit être le nom d’hôte de la plateforme qui a créé le certificat. Un CN ne peut jamais être identique pour deux plateformes ou organisations différentes. + + - _Organisation_ (O) : le nom de l’organisation. + + - _Pays_ (C) : le pays de l’organisation. + +- L’URL permettant de télécharger les CRL doit être présente. + +- L’URL d’envoi des requêtes OCSP doit être présente. + +- La durée de validité doit être de deux ans. + +En fonction du type de certificat à signer, les usages de la clé X.509 et les usages étendus X.509 diffèrent ; voir Tableau 1. + +| Type de Certificat | Usage de Clé X.509 | Usage Étendu de Clé X.509 | +| --- | --- | --- | +| **Certificats TLS** | Signature numérique, chiffrement de clé | Authentification TLS serveur web, authentification TLS client web | +| **Certificats de Signature** | Signature numérique | | +| **Certificats de Chiffrement** | Chiffrement de clé | | + +**Tableau 1 – Types de certificats et usages de clé** + +### Révocation des Certificats + +- La CA doit être capable de révoquer les certificats d’une plateforme. Révoquer un certificat signifie qu’il n’est plus approuvé par aucune partie. Il sera marqué comme invalide par la CA et son état de révocation publié aux plateformes, soit par une liste de révocation (CRL) téléchargeable, soit via une requête HTTP en temps réel utilisant le _protocole OCSP_. + +- La CA doit permettre à la fois le téléchargement de CRL et les requêtes OCSP. + +- La CA doit mettre à jour et signer la CRL quotidiennement et fournir (chaque jour) une URL HTTP permettant aux plateformes de télécharger la CRL. Cette URL doit être stockée dans les _points de distribution CRL_ de chaque certificat signé. + +- L’URL OCSP doit être présente dans l’_Authority Information Access_ de chaque certificat signé. Une réponse OCSP doit être signée. Les valeurs de nonce dans une requête OCSP doivent être prises en charge pour éviter les attaques par relecture. + +- La CA a le droit de révoquer les certificats, mais n’a pas l’obligation d’informer les plateformes. Les plateformes n’ont pas le droit de révoquer des certificats, mais elles ont l’obligation de vérifier régulièrement leur état de révocation. + +### Enrôlement et Renouvellement de Certificats + +La CA n’accepte pas l’enrôlement ou le renouvellement de certificats pour lesquels une paire de clés asymétriques est réutilisée. Pour plus de sécurité, la paire de clés doit être recréée à chaque enrôlement ou renouvellement via un nouveau CSR. + +## Stratégie de Gestion PKI de la Plateforme + +Cette section décrit la stratégie de gestion PKI pour les plateformes. + +### Clés, Certificats et Magasins + +Un certificat fournit l’identité de son propriétaire via une CA de confiance qui l’a signé. Cela peut être validé via la chaîne de certificats. Il permet également d’assurer l’intégrité (signature) et la confidentialité (chiffrement) des données en utilisant sa paire de clés asymétriques (_clé publique et clé privée_). La clé publique est dans le certificat signé ; la clé privée doit être protégée et maintenue confidentielle. Une solution courante consiste à stocker certificats et clés privées dans un magasin protégé. Ce magasin peut être un fichier, un répertoire ou tout autre espace offrant accès et confidentialité. + +Une seule clé privée et son certificat associé peuvent servir à toutes les tâches cryptographiques, mais pour renforcer la sécurité, chaque plateforme doit disposer des éléments suivants : + +- Une clé privée et un certificat pour la communication TLS + +- Une clé privée et un certificat pour l’intégrité de bout-en-bout avec JWS + +- Une clé privée et un certificat pour la confidentialité de bout-en-bout avec JWE + +Différentes clés et types de certificats peuvent être dans le même magasin, mais une configuration courante est la suivante : + +- Pour la communication TLS : + + - Un magasin de clés protégé (key store) pour stocker la clé privée, son certificat associé et la chaîne de certificats, utilisés lors de l’authentification serveur et client en TLS. + + - Un magasin de certificats protégé pour stocker les certificats TLS de confiance. Ces certificats seront approuvés lors de la poignée de main TLS, permettant de communiquer avec leurs détenteurs. Comme tous les participants font confiance à la même CA, il suffit d’y placer le certificat racine de la CA. + +- Pour la signature et le chiffrement : + + - Un magasin de clés protégé pour stocker les clés privées, leurs certificats associés et les chaînes de certificats utilisés pour signer et chiffrer. + + - Une clé privée et chaîne de certificats pour la signature JWS, et une autre pour le chiffrement JWE. + + - Un magasin de certificats protégé pour les certificats de signature et chiffrement de confiance d’autres plateformes. On y stocke les certificats de chaque plateforme à laquelle vous souhaitez faire confiance pour l’intégrité/confidentialité de bout à bout. + +### Création d’un CSR et Obtention de la Signature de la CA + +Pour communiquer avec les autres plateformes, vous devez créer un magasin de clés (s’il n’existe pas déjà), une paire de clés asymétriques et un certificat associé identifiant votre plateforme. Ce certificat non signé doit être signé par la CA pour être approuvé. La procédure commence par une demande de signature de certificat (CSR). + +Lors de la création de vos clés, certificats et CSR, les exigences suivantes s’appliquent : + +- Longueur minimale de la clé RSA asymétrique : 2048 bits, algorithme de signature : sha256WithRSAEncryption. + +- Les champs suivants dans le nom distingué du sujet sont obligatoires : + + - Common Name (CN) : doit être le nom d’hôte de la plateforme. Un CN ne doit pas être utilisé pour deux plateformes ou organisations différentes. + + - Organization (O) : nom de l’organisation. + + - Country (C) : pays de l’organisation. + +**Pour des exemples de création de magasin, de certificat et de CSR, voir Annexe C – Tâches PKI courantes** + +Créer votre CSR et l’envoyer à votre CA conformément à leurs instructions. + +**Remarque :** La même procédure doit être réalisée pour toutes vos clés et certificats (TLS, signature et chiffrement). + +### Importation d’un CSR Signé + +Après la signature de votre CSR, vous recevrez deux certificats dans la réponse de la CA. Le premier est votre certificat signé. Le second est le certificat racine de la CA qui a servi à la signature. Vous devez approuver ce certificat. + +D’abord, importez votre certificat signé dans votre magasin de clés (il doit remplacer l’ancien non signé ; voir les exemples pour importer un certificat signé). + +Ensuite, importez le certificat racine de la CA dans le même magasin pour compléter la chaîne entre votre certificat et la CA (voir les exemples pour importer le certificat de la CA). + +#### Certificats TLS + +Pour les certificats TLS, vous devez également importer le certificat racine de la CA dans le magasin de confiance TLS pour approuver automatiquement les autres plateformes lors de l’établissement de nouveaux canaux. Voir exemples pour l’import dans le trust store. + +La procédure ci-dessus doit être répétée pour chaque CSR signé. Rappelez-vous d’envoyer votre certificat et le certificat racine de la CA à toutes les autres plateformes avec lesquelles vous devez communiquer. + +La CA créera une période de validité de deux ans pour chaque certificat signé. Après 18 mois, générez un nouveau CSR à faire signer par la même CA. Le certificat et le certificat racine de la CA doivent de nouveau être importés dans vos magasins et envoyés aux autres plateformes. Cela accorde à chacun une fenêtre de six mois pour s’assurer que le nouveau certificat fonctionne. Après deux ans, l’ancien certificat expiré peut être supprimé. + +### Approuver les Certificats des Autres Plateformes + +De même que vos pairs doivent avoir vos certificats pour vous faire confiance, ils doivent vous envoyer les leurs pour que vous les approuviez. + +Assurez-vous de toujours recevoir au moins deux certificats de tout pair : + +- Le certificat signé du pair à approuver + +- Le certificat racine de la CA qui l’a signé + +**Remarque :** Le certificat CA d’un pair peut être différent du vôtre si la CA a créé un nouveau certificat racine avant expiration de l’ancien. + +Examinez toujours les certificats reçus (vérifiez le CN, la période de validité, etc.) et validez la chaîne (chaque certificat est bien signé par la bonne CA) avant de les importer dans votre magasin. + +Pour des exemples, voir comment visualiser un certificat. + +Importez ensuite le certificat et le certificat racine de la CA du pair dans votre magasin de confiance (voir les exemples pour importer un certificat approuvé). + +### Vérification de l’État de Révocation des Certificats + +Les certificats peuvent être révoqués par la CA. Un certificat révoqué n’est plus approuvé et doit être supprimé du magasin de confiance. Un certificat peut aussi être _en attente_ (« on hold »), c’est-à-dire en cours d’investigation, et ne doit pas être supprimé. + +Toutes les plateformes doivent effectuer régulièrement des vérifications de révocation. Deux méthodes courantes existent : utiliser une liste CRL téléchargée ou une requête HTTP en temps réel (OCSP). + +#### Liste de Révocation (CRL) + +Il s’agit d’un fichier maintenu par la CA, contenant la liste des numéros de série des certificats révoqués. Le fichier peut être téléchargé par toute plateforme à tout moment. L’URL de la CRL est incluse dans le certificat lui-même (_CRL Distribution Points_). Une CRL est signée et doit être validée. + +Une CRL doit être téléchargée chaque jour et mise en cache par la plateforme. + +Voir exemples pour la vérification via CRL. + +#### Protocole OCSP + +L’état d’un certificat peut être obtenu via une requête OCSP à un _OCSP Responder_ (souvent la CA). La requête contient le numéro de série du certificat ; la réponse renvoie l’état, signée. + +La requête doit contenir une valeur de nonce que le répondeur retournera afin que la plateforme la valide à la réception. Ceci empêche les attaques par relecture. + +Une requête/réponse OCSP est très rapide et peut être réalisée pour chaque opération de certificat client, mais selon la charge, elle peut être mise en cache. + +L’URL OCSP est présente dans _Authority Information Access_. + +Voir exemples de vérification via une requête OCSP. + +### Renouvellement des Certificats + +Ne renouvelez pas les certificats réutilisant la même paire de clés. Pour la sécurité, la paire de clés doit être recréée à chaque fois via une nouvelle CSR. + +## Protection de la Couche de Transport + +Cette section décrit la protection de la couche de transport. + +### TLS + +TLS assure l’intégrité et la confidentialité point à point et doit être utilisé pour toute communication entre pairs. + +La configuration requiert _l’authentification serveur_ (le serveur se présente avec son certificat TLS) et _l’authentification client_ (ou mutuelle), le client présentant aussi son certificat TLS. + +#### Versions de TLS + +La version minimale requise de TLS est 1.2 ou supérieure. + +#### Suites de Chiffrement TLS + +Les suites de chiffrement suivantes doivent être utilisées : + +- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 + +- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + +- TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 + +- TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 + +- TLS_RSA_WITH_AES_256_GCM_SHA384 + +- TLS_RSA_WITH_AES_128_GCM_SHA256 + +## Protection de la Couche Applicative + +Cette section décrit la protection de la couche applicative. + +### JSON Web Signature + +Le standard _JSON Web Signature_ (JWS) est utilisé pour garantir l’intégrité et la non-répudiation de bout en bout : il assure que l’expéditeur est bien celui indiqué et que le message n’a pas été altéré. + +L’utilisation de JWS est obligatoire et les certificats doivent être utilisés. Voir _Signature API_ pour plus d’informations. + +### JSON Web Encryption + +Le standard _JSON Web Encryption_ (JWE) est utilisé pour assurer la confidentialité de bout en bout, c’est-à-dire protéger les données contre toute lecture non autorisée. + +L’utilisation de JWE est optionnelle et appliquée sur des champs spécifiques, pour répondre à des exigences réglementaires pouvant exister selon le type de données ou le pays. + +Pour plus d’informations sur l’application de JWE aux champs, voir la spécification avancée _API Encryption_. + + +## Liste des Annexes + +### Annexe A – Tailles de Clé et Algorithmes + +Le tableau 2 présente la longueur des clés et l’algorithme requis pour chaque entité. + +| Entité | Algorithme | Taille de clé/hash | +| --- | --- | --- | +| Clés asymétriques CA | RSA | 4096 bits | +| Algorithme de signature CA | RSA avec SHA2 | >= 256 bits | +| Clés asymétriques TLS | RSA | 2048 bits | +| Algorithme de signature TLS | RSA avec SHA2 | >= 256 bits | +| Clés asymétriques de signature | RSA | 2048 bits | +| Algorithme de signature | RSA avec SHA2 | >= 256 bits | +| Clés asymétriques de chiffrement | RSA | 2048 bits | +| HMAC | SHA2 - AES | >= 256 bits| +| Clés symétriques | AES | 256 bits | +| Hachage | SHA2 | >= 256 bits | + +**Tableau 2 – Tailles de clé et algorithmes** + +### Annexe B – Terminologie + +| | | +| --- | --- | +| PKI | Infrastructure à Clé Publique +| API | Interface de Programmation Applicative +| TLS | Transport Layer Security (Sécurité de la couche de transport) +| JWS | JSON Web Signature +| JWE | JSON Web Encryption +| FSP | Fournisseur de Services Financiers +| AL | Account Lookup (Recherche de comptes) +| CA | Autorité de Certification +| CSR | Certificate Signing Request (Demande de Signature de Certificat) +| CRL | Certificate Revocation List (Liste de révocation de certificats) +| OCSP | Online Certificate Status Protocol +| PEM | Privacy Enhanced Mail +| RSA | Rivest, Shamir, & Adleman +| HMA | Hashed Message Authentication Code +| AES | Advanced Encryption Standard +| SHA | Secure Hash Algorithm + +### Annexe C – Tâches PKI Courantes + +#### Annexe C.1 – Création d’un magasin, d’un certificat, et d’une CSR + +**Avec Java keytool** + +Utilisez la commande suivante pour créer une paire de clés asymétriques RSA et les informations de certificat associées à faire signer par la CA. Elle crée automatiquement un keystore JKS si le fichier indiqué n’existe pas : + +``` +keytool -genkey -dname "CN=" -alias -keyalg RSA - +keystore -keysize 2048 +``` + +**Exemple :** + +``` +keytool -genkey -dname "CN=bank-fsp" -alias tlscert -keyalg RSA -keystore +tlskeystore.jks -keysize 2048 +``` + +**Notes :** + +1. L’attribut CN indique le nom d’hôte qui s’authentifie avec ce certificat lors d’une session TLS. +2. Lorsque vous êtes invité à saisir un mot de passe, utilisez le même pour la clé et le keystore. + +Utilisez la commande suivante pour créer la CSR à signer par la CA : + +``` +keytool -certreq -alias -keystore –file .csr +``` + +**Exemple :** + +``` +keytool -certreq -alias tlscert -keystore tlskeystore.jks -file tlscert.csr +``` + +**Avec openssl** + +Pour créer une paire de clés RSA et une CSR : + +``` +openssl req -new -newkey rsa:2048 -nodes -subj "/CN=" -out +.csr -keyout .key +``` + +**Exemple :** + +``` +openssl req -new -newkey rsa:2048 -nodes -subj "/CN=bank-fsp" -out tlscert.csr - +keyout tlscert.key +``` + +**Note :** L’attribut CN indique le nom d’hôte utilisé pour s’identifier lors d’une session TLS. + +Remarque : la clé privée créée est non chiffrée. Utilisez la commande suivante pour l’encrypter : + +``` +openssl rsa -aes256 -in -out +``` + +**Exemple :** + +``` +openssl rsa -aes256 -in tlscert.key -out tlscert_encrypted.key +``` + +#### Annexe C.2 – Importer un certificat signé dans votre keystore + +**Avec Java keytool** + +Importez le certificat signé dans votre keystore. Il doit remplacer l’ancien certificat non signé, donc veillez à utiliser le bon alias. + +``` +keytool -importcert -alias -file -keystore +``` + +**Exemple :** + +``` +keytool -importcert -alias tlscert -file bank-fsp.pem -keystore tlskeystore.jks +``` + +**Avec openssl** + +Supprimez votre ancien CSR et remplacez-le par le nouveau certificat signé. + +#### Annexe C.3 – Importer le certificat CA dans votre keystore + +**Avec Java keytool** + +Importez le certificat CA dans votre keystore : + +``` +keytool -importcert -alias -file -keystore +``` + +**Exemple :** + +``` +keytool -importcert -alias rootca -file rootca.pem -keystore tlskeystore.jks +``` + +Lorsque vous êtes invité à confirmer la confiance : + +``` +Trust this certificate? [no]: yes +Certificate was added to keystore +``` + +**Avec openssl** + +Placez le certificat CA avec les autres fichiers de certificats. + +#### Annexe C.4 – Importer le certificat CA dans le trust store TLS + +**Avec Java keytool** + +Importez le certificat CA dans votre trust store : + +``` +keytool -importcert -alias -file -keystore +``` + +**Exemple :** + +``` +keytool -importcert -alias rootca -file rootca.pem -keystore tlstruststore.jks +``` + +Puis : + +``` +Trust this certificate? [no]: yes +Certificate was added to keystore +``` +**Avec openssl** + +Placez le certificat CA avec vos autres certificats. + +#### Annexe C.5 – Visualiser un certificat + +**Avec Java keytool** + +Listez tous les certificats du keystore dans un format lisible : + +``` +keytool -list -keystore -v +``` + +**Exemple :** + +``` +keytool -list -keystore tlskeystore.jks -v +``` + +**Avec openssl** + +Affichez le contenu lisible d’un certificat PEM : + +``` +openssl x509 -in -text -nout +``` + +**Exemple :** + +``` +openssl x509 -in rootca.pem -text -nout +``` + +#### Annexe C.6 – Importer un certificat approuvé + +**Avec Java keytool** + +Importez le certificat dans le trust store : + +``` +keytool -importcert -alias -file -keystore +``` + +**Exemple :** + +``` +keytool -importcert -alias trustedcert -file cert.pem -keystore truststore.jks +``` + +Puis : + +``` +Trust this certificate? [no]: yes +Certificate was added to keystore +``` + +**Avec openssl** + +Placez le certificat approuvé avec vos autres certificats. + +#### Annexe C.7 – Vérifier un certificat via une CRL + +**Avec Java** + +Vous pouvez utiliser une bibliothèque comme Bouncy Castle ou le support natif, voir : [https://stackoverflow.com/questions/10043376/java-x509-certificate-parsing-and-validating/10068006#10068006](#https://stackoverflow.com/questions/10043376/java-x509-certificate-parsing-and-validating/10068006#10068006) + +**Avec openssl** + +Exemple : [https://raymii.org/s/articles/OpenSSL_manually_verify_a_certificate_against_a_CRL.html](#https://raymii.org/s/articles/OpenSSL_manually_verify_a_certificate_against_a_CRL.html) + +#### Annexe C.8 – Vérifier un certificat via une requête OCSP + +**Avec Java** + +Exemples : [https://stackoverflow.com/questions/5161504/ocsp-revocation-on-client-certificate](#https://stackoverflow.com/questions/5161504/ocsp-revocation-on-client-certificate) + +**Avec openssl** + +Exemple : [https://raymii.org/s/articles/OpenSSL_Manually_Verify_a_certificate_against_an_OCSP.html](#https://raymii.org/s/articles/OpenSSL_Manually_Verify_a_certificate_against_an_OCSP.html) + + +1 Ce terme, ainsi que d’autres termes en italique, sont définis dans le Glossaire de la spécification Open API pour l’Interopérabilité des FSP. + +2 [https://tools.ietf.org/html/rfc5246](#https://tools.ietf.org/html/rfc5246) - The Transport Layer Security (TLS) Protocol - Version 1.2 + +3 [https://tools.ietf.org/html/rfc7515](#https://tools.ietf.org/html/rfc7515) - JSON Web Signature (JWS) + +4 [https://tools.ietf.org/html/rfc7516](#https://tools.ietf.org/html/rfc7516) - JSON Web Encryption (JWE) + +
+ +## Table des Figures + +- [Figure 1 - Disposition des plateformes](#platforms-point-to-point-layout) + +
+ +## Tableaux + +- [Tableau 1 – Types de certificats et usages de clé](#Table-1–Certificate-type-and-key-usage) + +- [Tableau 2 – Tailles de clé et algorithmes](#Table-2-Key-lengths-and-algorithms) \ No newline at end of file diff --git a/docs/fr/technical/api/fspiop/sandbox.md b/docs/fr/technical/api/fspiop/sandbox.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/fr/technical/api/fspiop/scheme-rules.md b/docs/fr/technical/api/fspiop/scheme-rules.md new file mode 100644 index 000000000..a45cd5c0c --- /dev/null +++ b/docs/fr/technical/api/fspiop/scheme-rules.md @@ -0,0 +1,217 @@ +--- +footerCopyright: Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0) | Ericsson, Huawei, Mahindra-Comviva, Telepin, et la Fondation Bill & Melinda Gates +--- +# Règles de Schéma + +## Préface + +Cette section contient des informations sur l’utilisation de ce document. + +### Conventions utilisées dans ce document + +Les conventions suivantes sont utilisées dans ce document pour identifier les types d’informations spécifiés. + +|Type d’information|Convention|Exemple| +|---|---|---| +|**Éléments de l’API, comme les ressources**|Gras|**/authorization**| +|**Variables**|Italique entre accolades|_{ID}_| +|**Termes du glossaire**|Italique à la première occurrence ; défini dans le _Glossaire_|Le but de l’API est de permettre des transactions financières interopérables entre un _Payeur_ (un payeur de fonds électroniques dans une transaction de paiement) situé dans un _FSP_ (une entité qui fournit un service financier numérique à un utilisateur final) et un _Bénéficiaire_ (destinataire de fonds électroniques dans une transaction de paiement) situé dans un autre FSP.| +|**Documents de bibliothèque**|Italique|Les informations utilisateur ne devraient généralement pas être utilisées par les déploiements API ; les mesures de sécurité détaillées dans _Signature API_ et _Chiffrement API_ doivent être utilisées à la place.| + +### Informations sur la version du document + +|Version|Date|Description du changement| +|---|---|---| +|**1.0**|2018-03-13|Version initiale| + +## Introduction + +Ce document définit les règles de schéma pour l’Open API d’Interopérabilité FSP (ci-après appelée l’API) dans trois catégories. + +1. Règles de schéma métier : + + a. Ces règles métier doivent être régies par les FSP et, éventuellement, par une autorité de régulation mettant en œuvre l’API dans le cadre d’un schéma. + + b. L’autorité réglementaire ou l’autorité de mise en œuvre doit identifier les valeurs valides pour ces règles de schéma métier dans son document de politique API. + +2. Règles de schéma de mise en œuvre de l’API : + + a. Ces paramètres API doivent être convenus entre les FSP et, éventuellement, le Switch. Ces paramètres doivent faire partie de la politique de mise en œuvre du schéma. + + b. Tous les participants doivent configurer ces paramètres API comme indiqué par les règles de schéma de niveau API pour la mise en œuvre avec laquelle ils travaillent. + +3. Règles de schéma de sécurité et non-fonctionnelles : + + a. Les règles de schéma de sécurité et non-fonctionnelles doivent être déterminées et identifiées dans la politique de mise en œuvre du schéma. + +
+ +### Spécification Open API pour l’Interopérabilité des FSP + +La spécification Open API pour l’interopérabilité des FSP inclut les documents suivants. + +#### Documents logiques + +- [Modèle de Données Logique](./logical-data-model) + +- [Modèles de Transaction Génériques](./generic-transaction-patterns) + +- [Cas d’Utilisation](./use-cases) + +#### Documents de liaison REST asynchrone + +- [Définition de l’API](./api-definition) + +- [Règles de Liaison JSON](./json-binding-rules) + +- [Règles de Schéma](#) + +#### Intégrité des Données, Confidentialité et Non-Répudiation + +- [Bonnes Pratiques PKI](./pki-best-practices) + +- [Signature](./v1.1/signature) + +- [Chiffrement](./v1.1/encryption) + +#### Documents généraux + +- [Glossaire](./glossary) + +
+ +## Règles de Schéma Métier + +Cette section décrit les règles de schéma métier. Le modèle de données des paramètres de cette section se trouve dans la _Définition de l’API_. + +#### Type d’Authentification + +La règle de schéma de type d’authentification contrôle les types d’authentification OTP et QR code. Elle énumère les différents types d’authentification disponibles pour l’authentification du _Payeur_. Un schéma peut choisir de prendre en charge tous les types d’authentification mentionnés dans “AuthenticationTypes” dans la _Définition de l’API_ ou un sous-ensemble de ceux-ci. + +#### Identification KYC Consommateur Requise + +Un schéma peut imposer la vérification de l’identification KYC (Know Your Customer) du consommateur par un Agent ou un Marchand au moment de la transaction (par exemple, retrait, dépôt, paiement marchand). L’API ne peut pas contrôler cette règle de schéma ; cela doit donc être documenté dans la politique du schéma afin que cette règle soit suivie par tous les participants. Le schéma peut également décider des preuves d’identification KYC valides qui doivent être acceptées par tous les FSP. + +#### Devise + +Un schéma peut recommander de permettre des transactions dans plusieurs devises. Ce schéma peut définir la liste des devises valides dans lesquelles les transactions peuvent être effectuées par les participants ; cependant ce n’est pas obligatoire. Un Switch peut agir en tant que routeur de transaction et ne valide pas la devise de la transaction. Si un schéma ne définit pas la liste des devises valides, alors le Switch joue ce rôle et le FSP participant peut accepter ou rejeter la transaction selon les devises qu’il supporte. Les échanges de devises ne sont pas pris en charge ; c’est-à-dire que la devise de transaction du Payeur et du _Bénéficiaire_ doit être la même. + +#### Format d’ID FSP + +Un schéma peut déterminer le format de l’ID FSP. L’ID FSP doit être de type chaîne de caractères. Chaque participant recevra un ID FSP unique attribué par le schéma. Chaque FSP doit préfixer l’ID FSP au code marchand (identifiant unique du marchand) afin que le code marchand soit unique parmi tous les participants (c’est-à-dire dans l’ensemble du schéma). Le schéma peut également déterminer une stratégie alternative pour garantir l’unicité des identifiants FSP et des codes marchands à travers les FSP participants. + +#### Type de Transaction d’Interopérabilité + +L’API prend en charge les cas d’utilisation documentés dans _Cas d’Utilisation_. Un schéma peut recommander la mise en œuvre de tous les cas d’usages supportés ou d’un sous-ensemble d’entre eux. Un schéma peut aussi recommander de déployer des cas d’utilisation en plusieurs phases. Deux FSP ou plus du schéma peuvent décider de mettre en œuvre d’autres cas d’usage supportés par l’API. Un Switch peut agir en tant que routeur de transaction et ne valide pas le type de transaction ; le FSP peut accepter ou rejeter la transaction en fonction des types de transaction qu’il supporte. Si un FSP participant initie un type de transaction API pris en charge en raison d’une mauvaise configuration côté Payeur, alors la transaction doit être rejetée par le FSP pair si celui-ci ne prend pas en charge ce type de transaction spécifique. + +#### Géo-Localisation Requise + +L’API prend en charge la géolocalisation du Payeur et du Bénéficiaire ; cependant, cela est optionnel. Un schéma peut imposer la géolocalisation des transactions. Dans ce cas, tous les participants doivent transmettre la géolocalisation de leur partie respective. + +#### Paramètres d’Extension + +L’API prend en charge un ou plusieurs paramètres d’extension. Un schéma peut recommander que la liste des paramètres d’extension soit supportée. Tous les participants doivent se conformer à la règle de schéma et prendre en charge les paramètres d’extension obligatoires du schéma. + +#### Format du Code Marchand + +L’API prend en charge la transaction de paiement marchand. Généralement, un consommateur saisit ou scanne un code marchand pour initier un paiement marchand. Dans le cas d’un paiement marchand, le code marchand doit être unique dans tous les schémas. Actuellement, le code marchand n’est pas unique comme le sont les numéros de mobile ou les adresses email. Il est donc recommandé de préfixer ou suffixer le code marchand (avec l’ID FSP) afin que celui-ci soit unique à travers les FSP. + +#### Taille maximale des paiements en lot + +L’API prend en charge le cas d’utilisation du paiement en lot. Le schéma peut définir le nombre maximal de transactions dans un paiement en lot. + +#### Longueur de l’OTP + +L’API prend en charge le mot de passe à usage unique (OTP) comme type d’authentification. Un schéma peut définir la longueur minimale et maximale de l’OTP à utiliser par tous les FSP. + +#### Délai d’expiration de l’OTP + +Le délai d’expiration d’un OTP est configuré par chaque FSP. Un schéma peut recommander qu’il soit uniforme pour tous les schémas afin que les utilisateurs des différents FSP aient une expérience homogène. + +#### Types d’ID de Partie + +L’API prend en charge le système de recherche de compte. Une recherche de compte peut être effectuée sur la base de types valides d’ID de partie. Un schéma peut choisir les types d’ID de partie à prendre en charge à partir de **PartyIDType** dans la Définition de l’API. + +#### Types d’Identifiant Personnel + +Un schéma peut choisir les types d’identifiant personnel valides ou pris en charge mentionnés dans **PersonalIdentifierType** dans la Définition de l’API. + +#### Format du Code QR + +Un schéma doit standardiser le format du code QR dans les deux scénarios suivants : + +##### Transaction initiée par le Payeur + +Le Payeur scanne le code QR du Bénéficiaire (Marchand) pour initier une transaction initiée par le payeur. Dans ce cas, le code QR doit être standardisé pour inclure les informations du bénéficiaire, le montant de la transaction, le type de transaction, et une note éventuelle. Le schéma doit standardiser le format du code QR pour le bénéficiaire. + +##### Transaction initiée par le Bénéficiaire + +Le bénéficiaire scanne le code QR du Payeur pour initier une transaction initiée par le bénéficiaire. Par exemple, un marchand scanne le code QR du Payeur pour initier un paiement marchand. Dans ce cas, le code QR doit être standardisé pour localiser le payeur sans utiliser le système de recherche de compte. Le schéma doit standardiser le format du code QR : c’est-à-dire ID FSP, Type d’ID de Partie et ID Payeur, ou seulement Type d’ID de Partie et ID de Partie. + +## Règles de Schéma de Mise en œuvre de l’API + +Cette section décrit les règles de schéma de mise en œuvre de l’API. + +#### Version de l’API + +Les informations de version de l’API doivent être incluses dans tous les appels API comme défini dans la _Définition de l'API_. Un schéma doit recommander que tous les FSP implémentent la même version de l’API. + +#### HTTP ou HTTPS + +L’API prend en charge HTTP et HTTPS. Un schéma doit recommander que la communication soit sécurisée à l’aide de TLS (voir la section [Sécurité des communications](#securite-des-communications)). + +#### Délai d’expiration HTTP + +Les FSP et le Switch doivent configurer le délai d’expiration HTTP. Si un FSP ne reçoit pas de réponse HTTP (soit **HTTP 202** soit **HTTP 200**) à une requête **POST** ou **PUT**, alors le FSP doit générer un délai d’attente. Se référer au diagramme de la Figure 1 pour les délais d’expiration des **HTTP 202** et **HTTP 200**, indiqués en pointillés. + +###### Figure-1 + +![Figure 1 HTTP Timeout](../assets/scheme-rules-figure-1-http-timeout.png) + +**Figure 1 – Délai d’expiration HTTP** + +#### Délais d’expiration des rappels (Callback) + +Les FSP et le Switch doivent configurer les délais d’expiration des rappels (callbacks). Le délai d’expiration de rappel du FSP initiateur doit être supérieur à celui du Switch. Un schéma doit déterminer ce délai pour le FSP initiateur et le Switch. Se référer au diagramme de la Figure 2 pour les délais d’expiration de rappel mis en évidence en rouge. + +###### Figure-2 + +![Figure 1 Callback Timeout](../assets/scheme-rules-figure-2-callback-timeout.png) + +**Figure 2 – Délai d’expiration des rappels** + +## Règles de Schéma de Sécurité et de Non-Fonctionnel + +Cette section décrit les règles de schéma concernant la sécurité, l’environnement et autres exigences réseau. + +#### Synchronisation de l’Horloge + +Il est important de synchroniser les horloges entre les FSP et les Switch. Il est recommandé d’utiliser un ou plusieurs serveurs NTP pour la synchronisation de l’horloge. + +#### Chiffrement des Champs de Données + +Les champs de données devant être chiffrés seront déterminés par les lois nationales et locales, ainsi que par toute norme à laquelle il faut se conformer. Le chiffrement doit respecter la section _Chiffrement_. + +#### Signature numérique des messages + +Un schéma peut décider que tous les messages doivent être signés comme décrit dans la section _Signature_. Les messages de réponse n'ont pas à être signés. + +#### Certificats numériques + +Pour utiliser les fonctionnalités de signature et de chiffrement détaillées dans les sections _Signature_ et _Chiffrement_ d’un schéma, les FSP et les Switch doivent obtenir des certificats numériques tels que spécifiés par l’_AC_ (Autorité de Certification) désignée dans le schéma. + +#### Exigence cryptographique + +Toutes les parties doivent prendre en charge les encodages et les algorithmes de chiffrement spécifiés dans _Chiffrement_, si les fonctionnalités de chiffrement doivent être utilisées dans le schéma. + +#### Sécurité des communications + +Un schéma doit exiger que toute communication HTTP entre les parties soit sécurisée à l’aide de TLS[1](https://tools.ietf.org/html/rfc5246) version 1.2 ou ultérieure. + +1 [https://tools.ietf.org/html/rfc5246](https://tools.ietf.org/html/rfc5246) - The Transport Layer Security (TLS) Protocol - Version 1.2 + +### Table des figures + +[Figure 1 – Délai d’expiration HTTP](#figure-1) + +[Figure 2 – Callback](#figure-2) \ No newline at end of file diff --git a/docs/fr/technical/api/fspiop/use-cases.md b/docs/fr/technical/api/fspiop/use-cases.md new file mode 100644 index 000000000..8e4ee2982 --- /dev/null +++ b/docs/fr/technical/api/fspiop/use-cases.md @@ -0,0 +1,139 @@ +--- +footerCopyright: Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0) | Ericsson, Huawei, Mahindra-Comviva, Telepin, and the Bill & Melinda Gates Foundation +--- + +# Cas d’Utilisation + +## Préface + +Cette section contient des informations sur la façon d'utiliser ce document. + +### Conventions utilisées dans ce document + +Les conventions suivantes sont utilisées dans ce document pour identifier les types d'informations spécifiques. + +|Type d'information|Convention|Exemple| +|---|---|---| +|**Éléments de l'API, tels que les ressources**|Gras|**/authorization**| +|**Variables**|Italique entre accolades|_{ID}_| +|**Termes du glossaire**|Italique à la première occurrence ; défini dans _Glossaire_|Le but de l'API est de permettre des transactions financières interopérables entre un _Payer_ (un payeur de fonds électroniques dans une transaction de paiement) situé dans un _FSP_ (une entité qui fournit un service financier numérique à un utilisateur final) et un _Payee_ (un bénéficiaire de fonds électroniques dans une transaction de paiement) situé dans un autre FSP.| +|**Documents de référence**|Italique|Les informations utilisateur ne devraient, en général, pas être utilisées par les déploiements de l'API ; les mesures de sécurité détaillées dans _Signature API_ et _Chiffrement API_ devraient être utilisées à la place.| + +### Informations sur la version du document + +|Version|Date|Description du changement| +|---|---|---| +|**1.0**|2018-03-13|Version initiale| + +
+ +## Introduction + +L'objectif de ce document est de définir un ensemble de cas d'utilisation pouvant être mis en œuvre à l'aide de l’Open API pour l’interopérabilité FSP (appelée ci-après l’API). Les cas d’utilisation référencés dans ce document donnent un aperçu des flux de traitement des transactions et des règles métier de chaque étape ainsi que des conditions d’erreur pertinentes. + +Le but principal de l’API est de permettre le transfert de transactions financières entre un _Fournisseur de Services Financiers_ (FSP) et un autre. + +Il convient de noter que l’API n’est responsable que de l’échange de messages entre les FSP et un switch lorsque qu’une transaction entre FSPs est initiée par un _Utilisateur Final_ dans l’un des FSPs. Ceci peut se produire dans deux scénarios : + +- Un scénario bilatéral dans lequel les FSPs communiquent directement entre eux + +- Un scénario basé sur Switch dans lequel toutes les communications passent par un Switch + +La réconciliation, la compensation et le règlement après les transactions en temps réel sont hors du champ de l’API. De plus, la recherche de comptes est prise en charge par l’API, mais dépend de l’implémentation dans un marché local dans lequel un tiers ou un Switch fournirait ces services. Par conséquent, la nécessité de processus d’intégration efficaces et de règles de schéma appropriées doit être prise en compte lors de la mise en œuvre des cas d’utilisation. + +
+ +### Spécification Open API pour l’interopérabilité FSP + +La spécification Open API pour l’interopérabilité FSP comprend les documents suivants. + +#### Documents généraux + +- _Glossaire_ + +#### Documents logiques + +- _Modèle de données logique_ + +- _Schémas de transaction génériques_ + +- _Cas d’utilisation_ + +#### Documents de liaison REST asynchrone + +- _Définition API_ + +- _Règles de liaison JSON_ + +- _Règles de schéma_ + +#### Intégrité des données, confidentialité et non-répudiation + +- _Meilleures pratiques PKI_ + +- _Signature_ + +- _Chiffrement_ + +
+ +## Résumés des cas d’utilisation + +Les schémas de transaction génériques suivants sont présentés dans [Schémas de transaction génériques]() pour réduire la duplication des descriptions de chaque cas d’utilisation. Ces modèles résument les flux de transaction communs et les fonctions partagées des cas d'utilisation pertinents. + +- **Transaction initiée par le payeur** + - Dans une _transaction initiée par le payeur_, c’est le _Payeur_ (c’est-à-dire celui qui effectue le paiement électronique) qui initie la transaction. + + Ce modèle doit être utilisé chaque fois qu’un Payeur souhaite transférer des fonds à une autre partie dont le compte n’est pas situé dans le même FSP. + +- **Transaction initiée par le bénéficiaire** + - Dans une _transaction initiée par le bénéficiaire_, c’est le _Payee_ (c’est-à-dire le receveur des fonds électroniques) qui initie la transaction. + + Ce modèle doit être utilisé chaque fois qu’un bénéficiaire souhaite recevoir des fonds d’une autre partie dont le compte n’est pas situé dans le même FSP. + +- **Transaction initiée par le bénéficiaire avec OTP** + - Une _transaction initiée par le bénéficiaire avec mot de passe à usage unique (OTP)_ est similaire à la transaction initiée par le bénéficiaire, mais les informations de transaction (y compris les frais et les taxes) et l'approbation du payeur sont affichées ou saisies sur un appareil du bénéficiaire. + + - Ce modèle doit être utilisé lorsque le bénéficiaire souhaite recevoir des fonds d'une autre partie dont le compte n’est pas dans le même FSP, et que les informations et l’approbation sont gérées sur l'appareil du bénéficiaire. + +- **Transactions en lots** + - Dans une _transaction en lot_, c’est le payeur (l’expéditeur de fonds) qui initie plusieurs transactions vers plusieurs bénéficiaires situés potentiellement dans différents FSPs. + + - Le modèle doit être utilisé chaque fois qu’un payeur souhaite transférer des fonds à plusieurs bénéficiaires lors de la même transaction. Les bénéficiaires peuvent être dans différents FSPs. + +Il est recommandé de lire tous les schémas de transaction génériques avant de lire les cas d'utilisation. Pour plus d’informations, voir [Schémas de transaction génériques](). + +Chaque cas d’utilisation décrit des variations et des considérations spéciales pour le schéma de transaction générique auquel il se réfère. Les cas d’utilisation sont présentés dans le [Tableau 1](#table-1) ci-dessous : + +##### Tableau 1 + +| Nom du cas d’utilisation | Description | +| --- | --- | +| P2P |Ce cas décrit le processus métier et les règles selon lesquelles un Utilisateur Final initie une transaction pour envoyer de l’argent à un autre Utilisateur Final n’appartenant pas au même FSP que le Payeur.

C’est généralement une transaction à distance où Payeur et Bénéficiaire ne sont pas au même endroit. | +| Dépôt d'espèce initié par l’agent | Ce cas décrit le processus métier et les règles où un client demande à un agent d’un autre FSP d’effectuer un dépôt sur son compte.

Il s’agit généralement d’une transaction en face à face où le client et l’agent sont au même endroit. | +| Retrait d'espèce initié par l’agent | Ce cas décrit le processus métier et les règles où un client demande qu’un agent d’un autre FSP effectue un retrait de son compte.

Il s’agit généralement d’une transaction en face à face où le client et l’agent sont au même endroit. | +| Retrait d'espèce initié par l’agent
Autorisé sur POS
| Ce cas décrit le processus métier où un client demande à un agent d’un autre FSP d’effectuer un retrait. L’agent initie la transaction via un terminal de point de vente (_POS_) et le client saisit un OTP sur le POS pour l’autoriser. Alternativement, l’agent peut utiliser le POS pour scanner un QR code généré par l’application mobile du client. | +| Retrait d'espèce initié par le client | Ce cas décrit le processus métier où un client enregistré initie un retrait d’espèces via un agent n’appartenant pas à son FSP.

C’est également typiquement une transaction en face à face. | +| Paiement marchand initié par le client

| Ce cas décrit le processus métier où un utilisateur final initie une transaction d’achat pour payer un marchand n’étant pas dans le même FSP.

C’est généralement une transaction en face à face lors d’un achat en magasin.

Une variante est le paiement en ligne où un QR code est généré et affiché sur une page web, puis scanné par le client pour compléter la transaction. | +| Paiement marchand initié par le marchand

| Ce cas décrit le processus où un commerçant initie une demande de paiement vers un client ; le client révise le montant et confirme via authentification sur son propre appareil. | +| Paiement marchand initié par le marchand
Autorisé sur POS
| Ce cas décrit le processus où un marchand initie une demande de paiement ; le client révise la demande sur le terminal du marchand et autorise le paiement par OTP ou QR code. Les informations d’authentification du client sont envoyées du FSP du bénéficiaire vers le FSP du payeur pour authentification. | +| Retrait d'espèce initié par DAB | Ce cas décrit le processus où un DAB lance une demande de retrait sur un compte client. Le client pré-génère un OTP pour le retrait et l’utilise sur le DAB pour lancer l’opération. Le FSP du payeur valide l’OTP reçu pour authentification. | +| Paiements en lot | _Paiements en lot_ est utilisé lorsqu’une organisation ou une entreprise effectue des paiements, par exemple, de l’aide ou des salaires à plusieurs bénéficiaires ayant des comptes dans différents FSPs. L’organisation peut grouper les transactions pour faciliter l’envoi et la validation avant exécution. Il est aussi possible de suivre les résultats des transactions individuelles après exécution. | +| Remboursement | Ce cas décrit le flux métier pour rembourser une transaction d’interopérabilité complétée. | + +**Tableau 1 – Résumé des cas d’utilisation** + +
+ +## Cas d’Utilisation + +Cette section illustre les façons dont l’API peut être utilisée via les cas d’utilisation identifiés dans le [Tableau 1](#table-1) – _Résumé des cas d’utilisation_. + +Pour chaque cas d’utilisation, les éléments suivants sont présentés : +- Description du cas d’utilisation +- Référence au schéma générique +- Acteurs et rôles +- Ajouts au schéma de transaction générique +- Conditions d’erreur pertinentes + +(La traduction complète du document est très volumineuse. Veuillez indiquer si vous souhaitez poursuivre avec la traduction de l’intégralité du contenu ci-dessous, ou d’une partie spécifique.) diff --git a/docs/fr/technical/api/fspiop/v1.0/README.md b/docs/fr/technical/api/fspiop/v1.0/README.md new file mode 100644 index 000000000..96cef71e4 --- /dev/null +++ b/docs/fr/technical/api/fspiop/v1.0/README.md @@ -0,0 +1,4 @@ +--- +showToc: false +--- +https://raw.githubusercontent.com/mojaloop/mojaloop-specification/master/fspiop-api/documents/v1.0-document-set/fspiop-rest-v1.0-OpenAPI-implementation.yaml \ No newline at end of file diff --git a/docs/fr/technical/api/fspiop/v1.0/api-definition.md b/docs/fr/technical/api/fspiop/v1.0/api-definition.md new file mode 100644 index 000000000..96cef71e4 --- /dev/null +++ b/docs/fr/technical/api/fspiop/v1.0/api-definition.md @@ -0,0 +1,4 @@ +--- +showToc: false +--- +https://raw.githubusercontent.com/mojaloop/mojaloop-specification/master/fspiop-api/documents/v1.0-document-set/fspiop-rest-v1.0-OpenAPI-implementation.yaml \ No newline at end of file diff --git a/docs/fr/technical/api/fspiop/v1.1/api-definition.md b/docs/fr/technical/api/fspiop/v1.1/api-definition.md new file mode 100644 index 000000000..2ed3eb739 --- /dev/null +++ b/docs/fr/technical/api/fspiop/v1.1/api-definition.md @@ -0,0 +1,5399 @@ +--- +footerCopyright: Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0) | Ericsson, Huawei, Mahindra-Comviva, Telepin, et la Bill & Melinda Gates Foundation +--- + +## Préface + +Cette section contient des informations sur la manière d'utiliser ce document. + +### Conventions utilisées dans ce document + +Les conventions suivantes sont utilisées dans ce document pour identifier les types d'informations spécifiés. + +|Type d'information|Convention|Exemple| +|---|---|---| +|**Éléments de l'API, tels que les ressources**|Gras|**/authorization**| +|**Variables**|Italique avec des chevrons|_{ID}_| +|**Termes du glossaire**|Italique lors de la première occurrence ; défini dans le _Glossaire_|Le but de l’API est de permettre des transactions financières interopérables entre un _Payeur_ (un payeur de fonds électroniques dans une transaction de paiement) situé dans un _FSP_ (une entité qui fournit un service financier numérique à un utilisateur final) et un _Bénéficiaire_ (un bénéficiaire de fonds électroniques dans une transaction de paiement) situé dans un autre FSP.| +|**Documents de bibliothèque**|Italique|Les informations utilisateur ne devraient généralement pas être utilisées par les déploiements de l’API ; à la place, les mesures de sécurité détaillées dans _Signature API et Chiffrement API_ doivent être utilisées.| + +### Informations sur la version du document + +|Version|Date|Description des modifications| +|---|---|---| +|**1.0**|2018-03-13|Version initiale| +|**1.1**|2020-05-19|1. Cette version contient une nouvelle option pour qu'un FSP Bénéficiaire demande une notification de validation (commit) du Switch. Le Switch doit ensuite envoyer la notification de validation à l'aide de la nouvelle requête **PATCH /transfers/**_{ID}_. L'option d'utiliser la notification de validation remplace l'ancienne option "Contrôle supplémentaire de compensation facultatif". La section décrivant cela a été remplacée par la nouvelle section "Commit Notification (Notification de validation)". La ressource **transfers** a été mise à jour avec la nouvelle requête **PATCH**, cette ressource est donc passée en version 1.1. Dans le cadre de l'ajout de la possibilité d'utiliser une notification de validation, les changements suivants ont été apportés :
a. PATCH a été ajouté comme méthode HTTP autorisée dans la section 3.2.2. b. Le flux d’appel pour **PATCH** est décrit dans la section 3.2.3.5.
c. Le tableau 6 en section 6.1.1 a été mis à jour pour inclure **PATCH** comme méthode HTTP possible.
d. La section 6.7.1 contient la nouvelle version de la ressource **transfers**.
e. La section 6.7.2.6 décrit le processus d’utilisation des notifications de validation
f. La section 6.7.3.3 décrit la nouvelle requête **PATCH /transfers**/_{ID}_.

2. En plus des changements mentionnés ci-dessus concernant la notification de validation, les modifications suivantes n'affectant pas l'API ont été apportées :
a. Figure 6 mise à jour car elle contenait une erreur de copier-coller.
b. Ajout de la section 6.1.2 pour fournir une vue complète de la version actuelle de chaque ressource.
c. Ajout d'une section pour chaque ressource afin de voir l’historique des versions de ressource.
d. Corrections éditoriales mineures.

3. Les descriptions de deux des champs d'en-tête HTTP du Tableau 1 ont été mises à jour pour ajouter plus de spécificité et de contexte
a. La description du champ d'en-tête **FSPIOP-Destination** a été mise à jour pour indiquer qu'il doit rester vide si la destination n'est pas connue de l'émetteur original, mais dans tous les autres cas, doit être ajouté par l'émetteur original de la requête.
b. La description du champ d'en-tête **FSPIOP-URI** a été rendue plus spécifique.

4. Les exemples utilisés dans ce document ont été mis à jour pour utiliser la bonne interprétation du type complexe ExtensionList défini dans le Tableau 84. Ceci n'implique pas de changement en soi.
a. L’exemple 5 a été mis à jour à ce sujet.

5. Le modèle de données est mis à jour pour ajouter un élément optionnel ExtensionList au type complexe **PartyIdInfo** selon la demande de changement : https://github.com/mojaloop/mojaloop-specification/issues/30. Par conséquent, le modèle de données comme spécifié dans le Tableau 103 a été mis à jour. Pour plus de cohérence, le modèle de données pour les appels **POST /participants/**_{Type}/{ID}_ et **POST /participants/**_{Type}/{ID}/{SubId}_ dans le Tableau 10 a également été mis à jour pour inclure l’élément optionnel ExtensionList.

6. Une nouvelle section 6.5.2.2 est ajoutée pour décrire le processus impliqué dans le rejet d’un devis.

7. Une note est ajoutée à la Section 6.7.4.1 pour clarifier l’utilisation de l’état ABORTED dans les callbacks **PUT /transfers/**_{ID}_.| +|**1.1.1**|2021-09-22|Cette version du document ajoute uniquement des informations sur les en-têtes HTTP optionnels relatifs à la prise en charge de la traçabilité dans [Table 2](#table-2), voir _Distributed Tracing Support for OpenAPI Interoperability_ pour plus d’informations. Aucun changement n’est apporté à aucune ressource dans cette version.| + +## Introduction + +Ce document introduit et décrit l’_Open API_ (Interface de Programmation Applicative) _pour l’interopérabilité FSP_ (Fournisseur de Services Financiers), appelé ci-après « l’API ». L'objectif de l'API est de permettre des transactions financières interopérables entre un _Payeur_ (un payeur de fonds électroniques dans une transaction de paiement) situé dans un _FSP_ (une entité qui fournit un service financier numérique à un utilisateur final) et un _Bénéficiaire_ (un bénéficiaire de fonds électroniques dans une transaction de paiement) situé dans un autre FSP. L'API ne précise aucun service frontal entre un Payeur ou un Bénéficiaire et son propre FSP ; tous les services définis dans l'API sont entre FSPs. Les FSPs sont connectés soit (a) directement entre eux, soit (b) par un _Switch_ placé entre les FSPs pour router les transactions financières vers le FSP approprié. + +Le transfert de fonds d'un Payeur à un Bénéficiaire doit être effectué quasi en temps réel. Dès qu'une transaction financière a été acceptée par les deux parties, elle est réputée irrévocable. Cela signifie qu'une transaction terminée ne peut pas être annulée dans l'API. Pour annuler une transaction, une nouvelle transaction de remboursement négative doit être créée à partir du Bénéficiaire de la transaction d'origine. + +L'API est conçue pour être suffisamment générique pour prendre en charge de nombreux cas d'utilisation et l’extensibilité de ceux-ci. Cependant, elle doit contenir suffisamment de détails pour permettre une implémentation sans ambiguïté. + +La version 1.0 de l'API est conçue pour être utilisée dans un pays ou une région ; les envois internationaux nécessitant un échange de devises ne sont pas pris en charge. Cette version contient également une prise en charge de base du [protocole Interledger](#4-interledger-protocol), qui sera utilisé dans les futures versions de l’API pour gérer les transactions multi-devises et multi-intermédiaires. + +Ce document : + +- Définit une liaison REST asynchrone de l'API logique introduite dans _Modèles de transactions génériques_. +- Complète et développe les informations fournies dans [Spécification Open API pour l’Interopérabilité FSP](#open-api-for-fsp-interoperability-specification). + +### Spécification Open API pour l’Interopérabilité FSP + +La spécification Open API pour l’Interopérabilité FSP inclut les documents suivants. + +#### Documents logiques + +- [Modèle de données logique](../logical-data-model) + +- [Modèles de transaction génériques](../generic-transaction-patterns) + +- [Cas d’utilisation](../use-cases) + +#### Documents de liaison REST asynchrone + +- [Définition de l’API](../definitions) + +- [Règles d’assemblage JSON](../json-binding-rules) + +- [Règles de schéma](../scheme-rules) + +#### Intégrité des données, confidentialité et non-répudiation + +- [Meilleures pratiques PKI](../pki-best-practices) + +- [Signature](../v1.1/signature) + +- [Chiffrement](../v1.1/encryption) + +#### Documents généraux + +- [Glossaire](../glossary) + +
+ +## Définition de l’API + +Cette section introduit la technologie utilisée par l’API, incluant : + +- [Caractéristiques générales](#general-characteristics) +- [Détails HTTP](#http-details) +- [Gestion des versions de l'API](#api-versioning) + +### Caractéristiques générales + +Cette section décrit les caractéristiques générales de l’API. + +#### Style architectural + +L’API est basée sur le style architectural REST (REpresentational State Transfer1). Il existe cependant quelques différences avec une implémentation REST typique. Ces différences incluent : + +- **API totalement asynchrone** : pour pouvoir gérer de nombreux processus longs concurrents et avoir un mécanisme unique de gestion des requêtes, tous les services API sont asynchrones. Exemples : + - Transactions financières en lots + - Une transaction financière nécessitant une interaction utilisateur + +- **Décentralisée** : les services sont décentralisés, il n’existe pas d’autorité centrale pour piloter une transaction. + +- **Orientée service** : les ressources proposées par l’API sont relativement orientées service comparées à une API REST classique. + +- **Pas totalement sans état** : certaines informations d’état doivent être conservées à la fois côté client et côté serveur durant le processus de transaction. + +- **Le client choisit l’identifiant commun** : dans une implémentation REST typique (avec distinction claire client/serveur), c’est le serveur qui génère l’ID lors de la création de l’objet. Dans cette API, un devis ou une transaction financière réside à la fois dans le FSP du Payeur et du Bénéficiaire, car les services sont décentralisés. Il est donc nécessaire d’avoir un identifiant commun pour l’objet. Les raisons en sont doubles : + - L’ID commun est utilisé dans l’URI du callback asynchrone vers le client. Le client sait donc à quelle URI écouter pour le callback correspondant à la requête. + - Le client peut utiliser l’ID commun dans une requête HTTP **GET** directement s’il ne reçoit pas de callback depuis le serveur (voir [Détails HTTP](#http-details) pour plus d’informations). + + Pour maintenir l’unicité des IDs communs, chacun est défini comme un UUID (Identifiant Universel Unique2). Pour garantir encore plus l’unicité, il est recommandé au serveur d’associer chaque ID d’objet à l’ID FSP du client. Si un serveur reçoit tout de même un ID commun non unique lors d’une requête HTTP **POST** (voir [Détails HTTP](#http-details) pour plus de détails), la requête doit être gérée comme indiqué dans la section [Services idempotents côté serveur](#idempotent-services-in-server). + +#### Protocole de niveau application + +HTTP, tel que défini dans RFC 72303, est utilisé comme protocole de niveau applicatif dans l’API. Toute communication en environnement de production doit être sécurisée en utilisant HTTPS (HTTP sur TLS4). Pour plus de détails, voir [Détails HTTP](#http-details). + +#### Syntaxe URI + +La syntaxe des URIs suit la RFC 39865 pour identifier les ressources et services proposés par l’API. Cette section introduit et précise les sujets d’implémentation propres à chaque partie de la syntaxe. + +Une URI générique a la forme présentée dans [Exemple 1](#listing-1), où la partie \[_user:password@_\]_host_\[_:port_\] correspond à la partie `Authority` décrite dans la section [Authority](#authority). +_{resource}_. + +###### Exemple 1 + +``` +scheme:[//[user:password@]host[:port]][/]path[?query][#fragment] +``` + +**Exemple 1 -- Format générique d’URI** + +##### Schéma + +Conformément à la section [Protocole de niveau application](#aplication-level-protocol), le _schéma_ (ensemble de règles, pratiques et standards nécessaires au fonctionnement des services de paiement) sera toujours soit **http**, soit **https**. + +##### Autorité + +La partie d’autorité consiste en une partie d’authentification optionnelle (`User Information`), une partie hôte obligatoire, suivie d’un port optionnel. + +###### Informations utilisateur + +Les informations utilisateur ne devraient généralement pas être utilisées par les déploiements API ; les mesures de sécurité détaillées dans *Signature API* et _Chiffrement API_ doivent être privilégiées. + +###### Hôte + +L’hôte correspond à l’adresse du serveur. Il peut s’agir d’une adresse IP ou d’un nom d’hôte. Elle variera (généralement) selon le déploiement. + +###### Port + +Le numéro de port est optionnel ; par défaut, le port HTTP est **80** et HTTPS **443**, mais d’autres ports peuvent être utilisés. Le port à utiliser peut différer selon le déploiement. + +##### Chemin (Path) + +Le chemin pointe vers une ressource ou un service effectif de l’API. Les ressources de l’API sont : + +- **participants** +- **parties** +- **quotes** +- **transactionRequests** +- **authorizations** +- **transfers** +- **transactions** +- **bulkQuotes** +- **bulkTransfers** + +Toutes les ressources ci-dessus sont également organisées de façon hiérarchique, séparées par un ou plusieurs slash (**'/'**). Les ressources supportent différents services selon la méthode HTTP utilisée. Toutes les ressources et services API supportés, avec URI et méthode HTTP, figurent dans [le tableau 6](#table-6). + +##### Query + +La partie query est optionnelle ; elle n’est actuellement utilisée et supportée que par certains services de l’API. Voir les ressources API dans la section [Services API](#api-services) pour plus de détails sur les services qui supportent les chaînes de requête. Tous les autres services doivent ignorer toute chaîne de requête reçue, car des chaînes de requête pourront être ajoutées dans de futures versions mineures de l’API (voir [Méthodes HTTP](#http-methods)). + +S’il y a plusieurs paires clé-valeur dans la chaîne de requête, celles-ci doivent être séparées par le symbole esperluette (**'&'**). + +[L'exemple 2](#listing-2) montre un exemple d’URI issue de la ressource **/authorization**, où quatre paires clé-valeur différentes sont présentes, séparées par le symbole esperluette. + +###### Exemple 2 + +``` +/authorization/3d492671-b7af-4f3f-88de-76169b1bdf88?authenticationType=OTP&retriesLeft=2&amount=102¤cy=USD +``` + +**Exemple 2 -- URI contenant plusieurs paires clé-valeur dans la chaîne de requête** + +##### Fragment + +Le fragment est une partie optionnelle d’une URI. Il n’est pris en charge par aucun service de l’API et doit donc être ignoré s’il est reçu. + +#### Normalisation et comparaison d’URI + +Comme précisé dans la RFC 72306, les parties [schéma](#scheme)) et [hôte](#host)) de l’URI doivent être considérées comme insensibles à la casse. Toutes les autres parties doivent être traitées en tenant compte de la casse. + +#### Jeu de caractères + +Le jeu de caractères doit toujours être supposé UTF-8, défini dans 36297. Il n’est donc pas nécessaire de l’indiquer dans les en-têtes HTTP (voir [Champs d’en-tête HTTP](#http-header-fields)). Aucun autre jeu de caractères que UTF-8 n’est supporté par l’API. + +#### Format d’échange de données + +L’API utilise JSON (JavaScript Object Notation), défini dans RFC 71598, comme format d’échange. JSON est ouvert, léger, lisible et indépendant de la plateforme, bien adapté pour l’échange de données entre systèmes. + +
+ +### Détails HTTP + +Cette section contient des informations détaillées concernant l’utilisation du protocole HTTP dans l’API. + +#### Champs d’en-tête HTTP + +Les en-têtes HTTP sont généralement décrits dans la RFC 72309. Les deux sections suivantes décrivent les champs d’en-tête HTTP qui doivent être attendus et mis en œuvre dans l’API. + +L’API prend en charge une taille maximale de 65536 octets (64 kilooctets) dans l’en-tête HTTP. + +#### Champs d’en-tête HTTP de requête + +[Le tableau 1](#table-1) contient les champs d’en-tête HTTP de requête qui doivent être supportés par les implémentations de l’API. Une implémentation doit également s’attendre à d’autres champs d’en-tête HTTP standards et non standards non listés ici. + +###### Tableau 1 + +|Champ|Exemples de valeurs|Cardinalité|Description| +|---|---|---|---| +|**Accept**|**application/vnd.interoperability.resource+json**|0..1
Obligatoire dans une requête client. Non utilisé dans un callback du serveur.
Le champ d’en-tête **Accept**10 indique la version de l’API que le client souhaite utiliser côté serveur. Voir [En-tête Accept HTTP](#http-accept-header) pour demander une version spécifique de l’API.| +|**Content-Length**|**3495**|0..1|Le champ **Content-Length**11 indique la taille attendue du corps de la requête. Présent seulement s’il y a un corps.
**Note** : l’API autorise une taille maximale de 5 Mo (5242880 octets).
| +|**Content-Type**|**application/vnd.interoperability.resource+json;version=1.0**|1|**Content-Type**12 indique la version spécifique de l’API utilisée pour envoyer le corps de la requête. Voir [Version acceptée demandée par le client](#acceptable-version-requested-by-client) pour plus d’informations.| +|**Date**|**Tue, 15 Nov 1994 08:12:31 GMT**|1|Le champ **Date**13 indique la date à laquelle la requête a été envoyée.| +|**X-Forwarded-For**|**X-Forwarded-For: 192.168.0.4, 136.225.27.13**|1..0|Le champ **X-Forwarded-For**14 est une norme officieuse utilisée pour indiquer l’IP d’origine du client à titre informatif, une requête pouvant passer par plusieurs proxys, pare-feux, etc. Plusieurs valeurs **X-Forwarded-For** comme dans l’exemple doivent être attendues et supportées.
**Note** : Une alternative à **X-Forwarded-For** est définie dans RFC 723915. Cependant, en 2018, RFC 7239 est moins utilisé/supporté que **X-Forwarded-For**.
| +|**FSPIOP-Source**|**FSP321**|1|Le champ d’en-tête **FSPIOP-Source** est un champ non standard HTTP utilisé par l’API pour identifier l’émetteur de la requête HTTP. Il doit être placé par l’émetteur original de la requête. Nécessaire pour le routage (voir [Routage par FSPIOP-Source et FSPIOP-Destination](#call-flow-routing-using-fspiop-destination-and-fspiop-source)) et la vérification de signature (**FSPIOP-Signature**).| +|**FSPIOP-Destination**|**FSP123**|0..1|Le champ **FSPIOP-Destination** est non standard HTTP, utilisé pour le routage (via en-tête HTTP) des requêtes/réponses vers la destination. Il doit être défini par l’émetteur initial de la requête, si la destination est connue (valable pour tous les services sauf GET /parties), afin que les entités intermédiaires n’aient pas à parser le corps pour le routage (voir [Routage](#3236-call-flow-routing-using-fspiop-destination-and-fspiop-source)). Si la destination n’est pas connue (valable pour GET /parties), ce champ doit rester vide.| +|**FSPIOP-Encryption**||0..1|Champ non standard HTTP utilisé pour le chiffrement de bout en bout de la requête.
Voir Chiffrement API.
| +|**FSPIOP-Signature**||0..1|Champ non standard, utilisé pour la signature de bout en bout de la requête.
Voir Signature API.
| +|**FSPIOP-URI**|**/parties/msisdn/123456789**|0..1|Champ non standard HTTP utilisé pour la vérification de la signature, contient l’URI du service. Obligatoire si la signature est utilisée.
Dans le contexte de l’API Mojaloop FSPIOP, la valeur FSPIOP-URI commence au **_service_** dans l’URI. Par exemple, si l’URL est http://stg-simulator.moja.live/payerfsp/participants/MSISDN/123456789, alors la valeur FSPIOP-URI est « /participants/MSISDN/123456789 ».| +|**FSPIOP-HTTP-Method**|**GET**|0..1|Champ non standard HTTP utilisé pour la vérification de la signature : doit contenir la méthode HTTP du service utilisé. Obligatoire si la signature est utilisée, voir Signature API.| + +**Tableau 1 -- Champs d’en-tête HTTP de requête obligatoires** + +[Le tableau 2](#table-2) liste les champs d’en-tête de requête HTTP dont la prise en charge par les implémentations de l’API est optionnelle. + +###### Tableau 2 + +|Champ|Exemples de valeurs|Cardinalité|Description| +|---|---|---|---| +|**traceparent**|**00-91e502e28cd723686e9940bd3f378f85-b0f903d000944947-01**|0..1|L’en-tête traceparent représente la requête entrante dans un système de traçage dans un format commun. Voir _Distributed Tracing Support for OpenAPI Interoperability_ pour plus d’information.| +|**tracestate**|**banknrone=b0f903d0009449475**|0..1|Fournit des informations de traçage spécifiques au fournisseur et prend en charge plusieurs traces distribuées. Voir _Distributed Tracing Support for OpenAPI Interoperability_ pour plus d’information.| + +**Tableau 2 -- Champs d’en-tête HTTP de requête optionnels** + +##### Champs d’en-tête HTTP de réponse + +[Le tableau 3](#table-3) contient les champs d’en-tête HTTP de réponse obligatoires. Une implémentation peut aussi recevoir d’autres en-têtes HTTP standards ou non standards non listés ici. + +###### Tableau 3 + +|Champ|Exemples de valeurs|Cardinalité|Description| +|---|---|---|---| +|**Content-Length**|**3495**|0..1|Champ **Content-Length**16 indiquant la taille attendue du corps. Envoyé uniquement si corps présent.| +|**Content-Type**|**application/vnd.interoperability.resource+json;version=1.0**|1|Champ **Content-Type**17 indiquant la version de l’API utilisée pour envoyer le corps. Voir [Section 3.3.4.2](#3342-acceptable-version-requested-by-client) pour plus de détails.| + +**Tableau 3 -- Champs d’en-tête HTTP de réponse** + +#### Méthodes HTTP + +Les méthodes HTTP suivantes, telles que définies dans RFC 723118, sont supportées par l’API : + +- **GET** : utilisée par le client pour demander des informations sur un objet précédemment créé côté serveur. Comme tous les services API sont asynchrones, la réponse directe à la requête **GET** ne contient pas l’objet demandé : cet objet viendra en callback dans une requête **PUT**. + +- **PUT** : utilisée comme callback à une précédente requête **GET**, **POST** ou **DELETE** émise par le client. Le callback contient soit : + + - Informations sur l’objet précédemment créé (**POST**) ou informations demandées (**GET**) + - Accusé de réception de suppression d’un objet (**DELETE**) + - Informations d’erreur si la requête **POST** ou **GET** n’a pu être traitée côté serveur + +- **POST** : utilisée par le client pour demander la création d’un objet côté serveur. Comme l’API est asynchrone, la réponse directe ne contient pas l’objet : celui-ci viendra en callback via un **PUT**. + +- **DELETE** : utilisée pour demander la suppression d’un objet côté serveur. **DELETE** ne doit être supporté qu’au sein d’un système commun Account Lookup System (ALS) pour supprimer des informations sur une Party (détenteur de compte chez un FSP) précédemment ajoutée ; aucun autre type d’objet ne peut être supprimé. Comme tous les services sont asynchrones, la réponse à **DELETE** ne contient pas l’accusé de réception final : celui-ci viendra via un callback en **PUT**. + +- **PATCH** : utilisée pour notifier une mise à jour d’un objet existant. Comme l’API est asynchrone, la réponse à **PATCH** ne contient pas de corps : cette méthode sert de notification et ne génère pas de callback. + +
+ +#### Séquencement HTTP + +Tous les séquences et services sont asynchrones. Aucun service ne supporte le mode synchrone. + +##### Appel POST HTTP + +[La figure 1](#figure-1) montre le cas normal de création d’un objet dans un FSP pair via HTTP **POST**. Le service **_/service_** du schéma doit être remplacé par n’importe lequel des services du [Tableau 6](#table-6) supportant **POST**. + +###### Figure 1 + +![](../../assets/diagrams/sequence/figure1.svg) + +**Figure 1 — Séquence d’appel POST HTTP** + +##### Appel GET HTTP + +[La figure 2](#figure-2) montre le cas d’obtention d’informations sur un objet dans un FSP pair via HTTP **GET**. Le service **/service/**_{ID}_ du schéma doit être adapté à n’importe quel service listé dans [Tableau 6](#table-6) supportant **GET**. + +###### Figure 2 + +![](../../assets/diagrams/sequence/figure2.svg) + +**Figure 2 — Séquence d’appel GET HTTP** + +##### Appel DELETE HTTP + +[La figure 3](#figure-3) décrit l’appel d’API pour supprimer des informations FSP sur une Party via HTTP **DELETE** dans un ALS. Le service **/service/**_{ID}_ doit être adapté à un service du [Tableau 6](#table-6) supportant **DELETE**. DELETE n’est géré que par un ALS commun (c’est pourquoi l’ALS n’apparaît que côté serveur dans la figure). + +###### Figure 3 + +![](../../assets/diagrams/sequence/figure3.svg) + +**Figure 3 — Séquence d’appel DELETE HTTP** + +**Remarque :** il est également possible que les requêtes vers l’ALS passent par un Switch, ou que l’ALS et le Switch soient le même serveur. + +##### Callback PUT HTTP + +Le **PUT** HTTP est toujours utilisé comme callback sur une requête **POST**, **GET** ou **DELETE**. + +Le flux d’appel d’une requête **PUT** et de la réponse peut être observé dans les figures 1, 2 et 3 indiquées précédemment. + +##### Séquence PATCH HTTP + +[La figure 4](#figure-4) montre un exemple de séquence pour le **PATCH** HTTP, utilisé pour envoyer une notification. D’abord, un objet est créé via un **POST** depuis le Switch. L’objet est créé dans le FSP à l’état non finalisé. Le FSP demande ensuite à être notifié de l’état final par le Switch via un callback **PUT** avec l’état non finalisé. Le Switch gère le callback et envoie la notification d’état finalisé via un **PATCH**. La seule ressource supportant PATCH est /transfers. + +###### Figure 4 + +![](../../assets/diagrams/sequence/figure4.svg) + +**Figure 4 — Séquence PATCH HTTP** + +**Remarque :** les requêtes vers l’ALS peuvent aussi être routées via un Switch, voire ALS et Switch peuvent être le même serveur. + +##### Routage par FSPIOP-Source et FSPIOP-Destination + +Les en-têtes HTTP non standard **FSPIOP-Destination** et **FSPIOP-Source** servent au routage et à la vérification de signature (voir _Signature API_). [La figure 5](#figure-5) montre l’usage de ces en-têtes dans un appel **POST /service** abstrait, lorsque le FSP de destination est connu. + +###### Figure 5 + +![](../../assets/diagrams/sequence/figure5.svg) + +**Figure 5 — Usage des en-têtes HTTP personnalisés FSPIOP-Destination et FSPIOP-Source** + +Pour certains services avec un Switch, la destination n’est pas connue. Par exemple, un FSP envoie un **GET /parties** au Switch sans savoir quel autre FSP détient la Party (voir [Section 6.3.2](#632-service-details)). **FSPIOP-Destination** sera alors vide (ou défini à l’ID du Switch) émis depuis le FSP, et renseigné à sa vraie valeur par le Switch lors du routage. Voir [Figure 6](#figure-6) pour illustration. + +###### Figure 6 + +![](../../assets/diagrams/sequence/figure6.svg) + +**Figure 6 — Exemple : FSPIOP-Destination inconnu pour le FSP** + +
+ +#### Codes de statut HTTP de réponse + +L’API prend en charge les codes HTTP de réponse indiqués dans le [tableau 4](#table-4) : + +###### Tableau 4 + +|Code|Raison|Description| +|---|---|---| +|**200**|`OK`|Réponse standard pour une requête réussie. Utilisé dans l’API en réponse à un callback pour marquer la complétion d’un service asynchrone.| +|**202**|`Accepted`|La requête a été acceptée pour un traitement ultérieur côté serveur, sans garantie de succès. Utilisé comme accusé de réception d’une requête asynchrone.| +|**400**| `Bad Request`|L’application ne peut pas traiter la requête : syntaxe incorrecte ou corps dépassant la taille autorisée.| +|**401**|`Unauthorized`|La requête nécessite une authentification.| +|**403**|`Forbidden`|La requête a été refusée et sera systématiquement refusée à l’avenir.| +|**404**|`Not Found`|La ressource indiquée dans l’URI n’a pas été trouvée.| +|**405**|`Method Not Allowed`|Méthode HTTP non supportée ; voir Tableau 6 pour les méthodes autorisées par service.| +|**406**|`Not acceptable`|Le serveur ne peut générer de contenu conformément à l’en-tête Accept reçu ; cela indique qu'il ne supporte pas la version demandée.| +|**501**|`Not Implemented`|Le serveur ne supporte pas le service demandé. Le client ne doit pas retenter.| +|**503**|`Service Unavailable`|Le serveur n’est actuellement pas disponible pour de nouvelles requêtes. Cela devrait être temporaire : le client doit retenter dans un temps raisonnable.| + + **Tableau 4 — Codes de statut HTTP supportés dans l’API** + +Tout code de statut HTTP 3*xx*20 retourné côté serveur ne doit pas être retenté et requiert une investigation manuelle. + +Une implémentation de l’API doit aussi savoir gérer d’autres erreurs non listées, en particulier si la requête passe par des proxies. + +Comme toutes les requêtes API sont asynchrones, les codes d’erreur HTTP serveur supplémentaires (5*xx*21 non définis au tableau 4) ne sont pas utilisés par l’API elle-même. Toute erreur serveur lors du traitement réel sera notifiée via un callback d’erreur au client (voir [Section 9.2](#92-error-in-server-during-processing-of-request)). + +
+ +##### Informations d’erreur en réponse HTTP + +En plus du code HTTP, toutes les réponses d’erreur HTTP (4*xx* et 5*xx*) peuvent contenir un élément **ErrorInformation**, défini dans la section [ErrorInformation](#errorinformation). Cet élément doit, si possible, permettre de fournir plus d’informations au client. + +
+ +##### Services idempotents côté serveur + +Tout service supportant **GET** doit être _idempotent_ : la même requête peut être envoyée plusieurs fois sans changer l’objet. (L’état de l’objet côté serveur peut toutefois évoluer : par exemple, l’état d’une transaction peut changer, mais le FSP envoyant **GET** ne peut changer l’état). + +Tout service supportant **POST** doit aussi être idempotent si le client réutilise le même identifiant. Le serveur ne doit pas créer un nouvel objet s’il reçoit à nouveau la même requête **POST**. Ceci facilite la gestion de la reprise après erreur côté client, mais impose des contraintes au serveur — voir l’exemple [ici](#client-missing-response-from-server---using-resend-of-request). + +##### Analyse des duplicats côté serveur lors de la réception d’un POST + +Lors de la réception d’une requête côté serveur, il doit vérifier si un objet de service portant le même identifiant existe déjà : par exemple, si le client a déjà envoyé **POST /transfers** avec le même **transferId**. Si l’objet existe déjà, le serveur vérifie si ses paramètres correspondent à ceux de la nouvelle requête. + +- Si l’objet existant a les mêmes paramètres que la nouvelle requête, on considère qu’il s’agit d’un renvoi de la part du client. + - Si le serveur n’a pas encore traité la requête précédente/créée et n’a donc pas envoyé de callback, la nouvelle requête peut être ignorée (un callback va être envoyé de toute façon). + - Si le serveur a fini de traiter l’ancienne requête et a déjà envoyé un callback, un nouveau callback doit être envoyé, comme si une requête **GET** avait été reçue. + +- Si l’ancien objet n’a pas les mêmes paramètres que la requête, un callback d’erreur expliquant qu’un objet avec le même identifiant existe déjà mais avec des paramètres différents doit être envoyé au client. + +Pour simplifier cette analyse, il est recommandé de stocker un hash de toutes les requêtes **POST** reçues côté serveur afin de les comparer facilement lors de réceptions ultérieures. + +
+ +### Gestion des versions de l’API + +La stratégie de développement de l’API est de maintenir la compatibilité ascendante entre l’API et ses ressources/services au maximum, cependant des changements doivent être attendus par les parties qui implémentent. La gestion des versions de l’API est propre à chaque ressource (par exemple : **/participants**, **/quotes**, **/transfers**). + +Il existe deux types de versions de ressource API : les versions _mineures_ (backwards-compatibles), et _majeures_ (non compatibles en rétro). + +- À chaque changement des caractéristiques de l’API impactant un service, la ressource concernée voit sa version augmentée (mineure ou majeure selon la compatibilité). +- Un changement dans un service spécifique voit sa ressource correspondante recevoir une nouvelle version. + +Le format de la version de ressource est _x.y_ où _x_ est le numéro majeur, _y_ le mineur. À chaque nouvelle version majeure, la version mineure repart à **0**. La version initiale de chaque ressource est **1.0**. + +#### Changements n’affectant pas la version de ressource API + +Certains changements n’affecteront pas la version, par exemple : modification de l’ordre des paramètres d’une requête ou d’un callback. + +#### Changement mineur de version de ressource + +Les modifications suivantes sont considérées comme rétrocompatibles. Les implémenteurs doivent concevoir client/serveur pour les accepter d’emblée sans casse fonctionnelle : + +- Ajout de paramètres d’entrée facultatifs (chaînes de requête, etc.) +- Ajout de paramètres facultatifs dans une requête ou un callback +- Ajout de codes d’erreur + +Ces changements affectent la version mineure. + +#### Changement majeur de version de ressource + +Les modifications ci-après sont considérées comme rétro-incompatibles. L’implémenteur n’a PAS à garantir la prise en charge automatique : + +- Suppression ou ajout de paramètres obligatoires +- Paramètres facultatifs devenant obligatoires +- Renommage de paramètres +- Changement de types de données +- Changement de logique métier +- Modification des URI de ressource/service + +Cette liste n’est pas exhaustive. + +#### Négociation de version entre client et serveur + +L’API prend en charge une négociation basique par HTTP content negotiation. Un client doit envoyer la version de ressource API souhaitée dans l’en-tête **Accept** (voir [En-tête Accept HTTP](#http-accept-header)). Si le serveur supporte cette version, elle est utilisée au callback ([Version acceptable…](#acceptable-version-requested-by-client)). Si le serveur ne la supporte pas, il doit répondre HTTP 40622 avec une liste des versions supportées ([Version non acceptable…](#non-acceptable-version-requested-by-client)). + +#### En-tête Accept HTTP + +Voir ci-dessous un exemple de requête HTTP simplifiée avec seulement l’en-tête **Accept**23. Il convient de l’utiliser pour un client souhaitant une version majeure précise d’une ressource. [Exemple 3](#listing-3) : « Je souhaite la version majeure 1, sinon donne la dernière ». + +###### Exemple 3 + +``` +POST /service HTTP/1.1 +Accept: application/vnd.interoperability.{resource}+json;version=1, +application/vnd.interoperability.{resource}+json + +{ + ... +} +``` + +**Exemple 3 — En-tête HTTP Accept : requête pour la version 1 ou la dernière supportée** + +Pour l’exemple de [l’exemple 3](#listing-3) : + +- **_POST /service_** doit être adapté à n’importe quelle méthode/service supporté (voir [Tableau 6](#table-6)). +- L’en-tête **Accept** indique la version de ressource API que le client souhaite utiliser. + - Le type d’application est toujours **application/vnd.interoperability.**_{resource}_ où _{resource}_ est la vraie ressource (**participants**, **quotes**, ...). + - Le seul format d’échange de données actuellement supporté est **json**. + - Pour n’importe quelle version mineure d’une version majeure : envoyer uniquement la version majeure : **version=1** ou **version=2**. + - Pour une version mineure précise : utiliser **version=1.2** ou **version=2.8**. L’utilisation d’une version majeure.mineure spécifique est à éviter habituellement (les versions mineures étant rétrocompatibles). + +#### Version acceptable demandée par le client + +Si le serveur supporte la version API demandée via Accept, il doit utiliser cette version dans le callback. La version majeure.mineure utilisée doit toujours être indiquée dans l’en-tête **Content-Type**, même si le client n’a demandé que la majeure. Par exemple (voir [exemple 4](#listing-4)) : version 1.0 utilisée : + +###### Exemple 4 + +``` +Content-Type: application/vnd.interoperability.resource+json;version=1.0 +``` + +**Exemple 4 — Champ HTTP Content-Type** + +#### Version non acceptable demandée par le client + +Si le serveur ne supporte pas la version demandée dans **Accept**, il doit répondre HTTP 406 pour signifier l’absence de support. + +**Remarque :** il est aussi possible que cette information soit envoyée via un callback d’erreur et non directement — par exemple si la requête passe via un Switch qui supporte la version, mais que le FSP de destination non. + +En plus du HTTP 406, les versions supportées doivent figurer dans la liste des extensions de l’erreur, avec le numéro majeur comme clé et le mineur comme valeur. Voir [exemple 5](#listing-5) : « Je ne supporte pas la version demandée, mais je supporte 1.0, 2.1 et 4.2. » + +###### Exemple 5 + +```json +{ + "errorInformation": { + "errorCode": "3001", + "errorDescription": "Le client a demandé une version non supportée, voir la liste d'extensions pour les versions supportées.", + "extensionList": { + "extension": + [ + { "key": "1", "value": "0"}, + { "key": "2", "value": "1"}, + { "key": "4", "value": "2"} + ] + } + } +} +``` + +**Exemple 5 — Message d’erreur : la version demandée n’est pas supportée** + + +
+ +## Protocole Interledger + +La version actuelle de l’API introduit une prise en charge basique du protocole Interledger (ILP), à travers l’implémentation concrète du protocole Interledger Payment Request24 dans la ressource API [/quotes](#api-resource-quotes) et [**/transfers**](#api-resource-transfers). + +### Plus d’informations + +Ce document contient les informations ILP utiles à l’API. Pour davantage d’informations, consultez le site du projet Interledger25, le livre blanc Interledger26, et la spécification Interledger architecture27. + +### Introduction à Interledger + +ILP est une norme pour l’interconnexion des réseaux de paiement. De la même façon que le protocole IP constitue les bases pour la transmission et l’adressage entre réseaux de données différents, ILP définit des bases pour l’adressage des transactions financières et le transfert de valeur entre comptes sur différents réseaux de paiement. + +ILP n’est pas un schéma en soi. C’est un ensemble de standards qui, s’il est mis en œuvre par plusieurs schémas de paiement, permettra leur interopérabilité. Par conséquent, implémenter ILP implique d’adapter un schéma existant à ces standards. Cela implique notamment que les transferts se fassent en deux phases (_réserve_ et _validation_) et la définition d’une correspondance entre les comptes du schéma et le schéma d’adressage mondial ILP. Cela peut se faire en modifiant le schéma lui-même, ou via des entités qui fournissent une compatibilité ILP via des adaptateurs. + +Les prérequis pour un paiement ILP sont l’adresse ILP du Bénéficiaire (voir [Adressage ILP](#ilp-addressing)) et la condition (voir [Transferts conditionnels](#conditional-transfers)). Dans la version actuelle de l’API, ces deux informations doivent être renvoyées par le FSP Bénéficiaire lors d’un devis ([**/quotes**](#api-resource-quotes)). + +### Adressage ILP + +Un composant clé du standard ILP est le schéma d’adressage28. Il s’agit d’un schéma hiérarchique définissant une ou plusieurs adresses pour chaque compte d’un registre. + +[Le tableau 5](#table-5) donne des exemples d’adresses ILP dans différents scénarios. À noter : la structure est standardisée, le contenu non, sauf pour le premier segment (avant le premier point). + +###### Tableau 5 + +|Adresse ILP|Description| +|---|---| +|**g.tz.fsp1.msisdn.1234567890**|Un compte mobile money chez **FSP1** pour l’utilisateur de **MSISDN 1234567890**.| +|**g.pk.fsp2.ac03396c-4dba-4743**|Un compte mobile money chez **FSP2** identifié par un ID opaque.| +|**g.us.bank1.bob**|Un compte bancaire chez **Bank1** pour l’utilisateur **bob**.| + +**Tableau 5 — Exemples d’adresses ILP** + +Le but principal d’une adresse ILP est d’identifier un compte et de router une transaction financière vers ce compte. + +**Remarque :** Une adresse ILP ne doit pas servir à identifier une contrepartie dans l’API d’interopérabilité. Voir la section [Remboursement](#refund) pour l’adressage d’une Party dans l’API. + +Penser à une adresse ILP comme à une adresse IP : jamais vue par l’utilisateur final, mais utilisée côté système pour router une transaction et identifier un compte. Un même compte aura souvent plusieurs adresses ILP. Le système qui tient le compte peut suivre toutes ou seulement une partie si elles partagent un préfixe commun. + +### Transferts conditionnels + +ILP se base sur les _transferts conditionnels_, où tous les registres impliqués dans une transaction financière peuvent d’abord réserver des fonds du compte Payeur puis, plus tard, les déposer dans celui du Bénéficiaire. Le transfert du Payeur au Bénéficiaire dépend de la présentation d’un _accomplissement_ (fulfilment) qui respecte la condition associée à la requête d’origine. + +Pour supporter les transferts conditionnels, un registre doit permettre d’attacher une condition et une expiration à chaque transfert. Le registre doit réserver les fonds du compte Payeur, puis attendre l’un des événements suivants : + +- L’accomplissement de la condition est soumis au registre : les fonds sont crédités sur le compte du Bénéficiaire. +- L’expiration est atteinte, ou la transaction est rejetée (par le Bénéficiaire, son FSP…). Le transfert est alors annulé et les fonds remis au Payeur. + +Lorsqu’un accomplissement est soumis, le registre doit s’assurer qu’il satisfait bien la condition associée à la requête. Si oui, le transfert est validé ; sinon, il est refusé, et reste en attente jusqu’à obtention d’un accomplissement valide ou expiration. + +ILP supporte différentes conditions, mais les implémenteurs de l’API doivent utiliser le hash SHA-256 d’un pré-image de 32 octets. La condition jointe au transfert est le SHA-256, l’accomplissement étant le pré-image. Ainsi, quand la condition jointe est un SHA-256, une fois un accomplissement soumis, le registre le valide en calculant son SHA-256 et vérifiant qu’il correspond. + +Voir [Interledger Payment Request](#interledger-payment-request) pour des informations concrètes sur la génération de l’accomplissement (fulfilment) et de la condition. + +### Paquet ILP + +Le _paquet ILP_ sert à emballer des données de bout en bout pouvant être transmises service par service. Il est inclus comme champ dans les requêtes « hop by hop » et ne doit jamais être modifié par un intermédiaire. L'intégrité du paquet est liée à celle du transfert de fonds, car le déclencheur de validation (fulfilment) est généré à partir d'un hash du paquet. + +Le paquet a un format binaire strict, car il peut transiter par des systèmes à haut débit/volume, qui doivent lire l’adresse ILP et le montant depuis les headers, sans avoir à interpréter le champ **data** du paquet (voir [Exemple 6](#listing-6)). Comme ils ne doivent pas l’interpréter, ce champ reste au format octet variable dans la définition. Voir [Interledger Payment Request](#interledger-payment-request) pour le détail sur la manière de peupler ce champ dans l’API. + +Le paquet ILP relie les transferts livre à livre qui composent tout paiement ILP. Il est parsé par le destinataire du premier transfert, utilisé pour savoir vers où router le suivant et pour quel montant, lui est passé, etc., jusqu’au Bénéficiaire final qui fournit l’accomplissement, ce qui valide les transferts en chaîne, du dernier au premier. + +Le format du paquet ILP est défini en ASN.129 (Abstract Syntax Notation One), voir [Exemple 6](#listing-6). L’encodage se fait avec les règles canoniques Octet Encoding Rules. + +###### Exemple 6 + +``` +InterledgerProtocolPaymentMessage ::= SEQUENCE { + -- Montant qui doit être reçu à destination : amount UInt64, + -- Adresse ILP destinataire : account Address, + -- Information pour le destinataire (couche de transport) : data OCTET STRING (SIZE (0..32767)), + -- Extensibilité ASN.1 + extensions SEQUENCE { + ... + } +} +``` + +**Exemple 6 — Format du paquet ILP en ASN.1** + +**Remarque :** Les seuls éléments obligatoires sont le montant à transférer au Bénéficiaire et son adresse ILP. + +
+ +## Fonctionnalités courantes de l'API + +Cette section décrit les fonctionnalités communes utilisées par l'API, incluant : + +- [Devis (Quoting)](#quoting) +- [Adressage des Parties](#party-addressing) +- [Mapping de cas d’utilisation vers les types de transactions](#mapping-of-use-cases-to-transaction-types) + +### Devis (Quoting) + +Le devis est le processus qui détermine les frais et les commissions nécessaires pour effectuer une transaction financière entre deux FSP. Il est toujours initié par le FSP Payeur vers le FSP Bénéficiaire, ce qui signifie que le devis circule dans le même sens qu'une transaction financière. + +Deux modes différents pour établir un devis entre FSP sont pris en charge dans l’API : _Non-divulgation des frais_ et _Divulgation des frais_. + +- La _Non-divulgation des frais_ doit être utilisée lorsque le FSP Payeur ne souhaite pas montrer sa structure de frais au FSP Bénéficiaire, ou lorsqu’il souhaite avoir plus de contrôle sur les frais payés par le Payeur une fois le devis établi (ce dernier cas s’applique uniquement pour le _montant à recevoir_ ; voir la liste suivante). + +- La _Divulgation des frais_ peut être utilisée dans des cas où le FSP Bénéficiaire souhaite subventionner la transaction ; par exemple, lors d'un dépôt d'espèces chez un agent d’un autre FSP. + +La _Non-divulgation des frais_ doit être le mode standard de devis supporté dans la plupart des schémas. La _Divulgation des frais_ peut être utilisée dans certains schémas, par exemple lorsqu’une structure de frais dynamique est utilisée et qu’un FSP souhaite pouvoir subventionner le cas d’usage de dépôt d’espèces sur la base d’un coût dynamique. + +En outre, le Payeur peut décider si le montant doit être un _montant à recevoir_ ou _montant à envoyer_. + +- _Montant à envoyer_ doit être interprété comme le montant réel à déduire du compte du Payeur, frais inclus. + +- _Montant à recevoir_ doit être interprété comme le montant qui doit être crédité sur le compte du Bénéficiaire, indépendamment des frais de transaction interopérables. Ce montant exclut d’éventuels frais internes ajoutés par le FSP Bénéficiaire. + +Le FSP Bénéficiaire peut choisir d’envoyer ou non le montant réellement reçu par le Bénéficiaire dans la réponse au FSP Payeur. Ce montant doit inclure les éventuels frais internes appliqués par le FSP Bénéficiaire au Bénéficiaire. + +Toutes les taxes sont supposées être internes au FSP, ce qui signifie qu'elles ne sont pas transmises via l'API. Consultez [Informations fiscales](#tax-information) pour plus de détails sur la fiscalité. + +**Remarque :** Les frais dynamiques mis en œuvre via un Switch ou tout autre intermédiaire ne sont pas pris en charge dans cette version de l’API. + +#### Non-divulgation des frais + +Les paiements de frais et de commissions relatifs à une transaction interopérable lorsque les frais ne sont pas divulgués sont illustrés dans la [Figure 7](#figure-7). Les frais et commissions faisant directement partie de l’API sont identifiés en texte vert. Les éléments internes (frais, commissions, bonus internes) sont identifiés en texte rouge—et ne font pas partie de la transaction entre un FSP Payeur et un FSP Bénéficiaire, mais le montant reçu par le Bénéficiaire après déduction de frais internes peut être communiqué à titre informatif par le FSP Bénéficiaire. + +Pour un _montant à envoyer_ (voir [Montant à envoyer sans divulgation](#non-disclosing-send-amount)), des frais internes du FSP Payeur appliqués au Payeur vont affecter le montant envoyé par ce FSP (ex : pour une transaction de 100 USD avec 1 USD de frais, 99 USD sont envoyés). Pour un _montant à recevoir_ (voir [Montant à recevoir sans divulgation](#non-disclosing-receive-amount)), ces frais internes n'ont pas d'effet sur le montant envoyé. Les bonus ou commissions internes du FSP Payeur doivent être cachés, quel que soit le mode (envoi/réception). + +###### Figure 7 + +![Figure 7](../../assets/diagrams/images/figure7.svg) + +**Figure 7 -- Frais et commissions liés à l’interopérabilité lorsque les frais ne sont pas divulgués** + +Voir [Types de frais](#fee-types) pour plus d’informations sur les types de frais envoyés via l’API. + +#### Montant à recevoir sans divulgation + +[Figure 8](#figure-8) présente un exemple de montant à recevoir sans divulgation, où le Payeur souhaite que le Bénéficiaire reçoive exactement 100 USD. Dans ce cas, le FSP Payeur ne fixe pas nécessairement les frais internes avant d’avoir reçu le devis, puisque le FSP Bénéficiaire connaît déjà le montant qu’il recevra. + +Dans cet exemple, le FSP Bénéficiaire décide de verser une commission au FSP Payeur, car les fonds sont injectés dans le système du FSP Bénéficiaire et seront ultérieurement dépensés, ce qui représente un gain futur pour le FSP Bénéficiaire. Le FSP Payeur décide ensuite des frais à facturer au Payeur. Par exemple, s'il veut percevoir 1 USD de frais du Payeur (et reçoit aussi 1 USD de commission), il gagne au total 2 USD. + +###### Figure 8 + +![](../../assets/diagrams/sequence/figure8.svg) + +**Figure 8 -- Exemple de montant à recevoir sans divulgation** + +###### Figure 9 + +![Figure 9](../../assets/diagrams/images/figure9.svg) + +**Figure 9 -- Vue simplifiée du mouvement de fonds pour l’exemple précédent** + +Pour calculer l’élément **transferAmount** dans le FSP Bénéficiaire pour un devis à montant à recevoir sans divulgation, appliquer l’équation [Listing 9](#listing-9), où le _Montant de transfert_ correspond à **transferAmount** ([Tableau 24](#table-24)), le _Montant du devis_ à **amount** ([Tableau 23](#table-23)), les _frais FSP Bénéficiaire_ à **payeeFspFee** ([Tableau 24](#table-24)), et la commission FSP Bénéficiaire à **payeeFspCommission** ([Tableau 24](#table-24)). + +###### Listing 7 + +``` +Montant de transfert = Montant du devis + Frais FSP Bénéficiaire – Commission FSP Bénéficiaire +``` + +**Listing 7 -- Relation entre le montant de transfert et le montant du devis pour ce cas** + +#### Montant à envoyer sans divulgation + +[Figure 10](#figure-10) montre un exemple où le Payeur souhaite envoyer 100 USD. Ici, le FSP Payeur doit déterminer les frais, commissions ou les deux avant d’envoyer le devis, pour que le FSP Bénéficiaire connaisse le montant qui sera reçu. Le montant retiré du compte du Payeur n’est pas communiqué, ni les frais. + +Dans cet exemple, le FSP Payeur et le FSP Bénéficiaire veulent chacun 1 USD de frais, donc le Bénéficiaire recevra 98 USD. Le montant reçu peut être indiqué dans la réponse sous l’élément **payeeReceiveAmount**, mais ce n’est pas obligatoire. + +###### Figure 10 + +![](../../assets/diagrams/sequence/figure10.svg) + +**Figure 10 -- Exemple de montant à envoyer sans divulgation** + +###### Figure 11 + +[Figure 11](#figure-11) : vue simplifiée du mouvement d’argent. + +![Figure 11](../../assets/diagrams/images/figure11.svg) + +**Figure 11 -- Vue simplifiée du mouvement de fonds pour cet exemple** + +Pour calculer **transferAmount**, utiliser l’équation du [Listing 8](#listing-8) : _Montant du transfert_ = **transferAmount** ([Tableau 24](#table-24)), _Montant du devis_ = **amount**, commission = **payeeFspCommission**. + +###### Listing 8 + +``` +Montant de transfert = Montant du devis – Commission FSP Bénéficiaire +``` + +**Listing 8 -- Relation entre le montant de transfert et le montant du devis pour ce cas** + +La raison pour laquelle les frais FSP Bénéficiaire sont absents de l’équation : le Payeur veut envoyer un certain montant de son compte, le Bénéficiaire reçoit donc moins au lieu que des frais soient ajoutés au montant. + +#### Divulgation des frais + +Les paiements de frais et de commissions relatifs à une transaction interopérable lorsque les frais sont divulgués se trouvent en [Figure 12](#figure-12). Ce qui est directement lié à l’API est indiqué en vert. Les frais, bonus, et commissions internes sont en rouge : ils impactent le montant envoyé/reçu mais ne sont pas transmis dans la transaction interopérable. Le montant net reçu par le Bénéficiaire (après frais internes) peut être transmis à titre d’information. + +Quand la divulgation des frais est utilisée, la commission envoyée par le FSP Bénéficiaire doit subventionner tout ou partie du coût de la transaction pour le Payeur. Si la commission est supérieure aux frais pour le Payeur, l’excédent doit être traité comme un frais payé du Bénéficiaire au Payeur. Un exemple : [ici](#excess-fsp-commission-example). + +###### Figure 12 + +![Figure 12](../../assets/diagrams/images/figure12.svg) + +**Figure 12 -- Frais et commissions liés à l’interopérabilité lorsque les frais +sont divulgués** + +Voir [Types de frais](#fee-types) pour plus d'informations. + +#### Montant à recevoir avec divulgation + +[Figure 13](#figure-13) : le Payeur veut que le Bénéficiaire reçoive 100 USD. Le FSP Payeur doit évaluer la transaction en interne avant d’envoyer la demande de devis, car les frais sont divulgués. Exemple : le FSP Payeur veut 1 USD de frais, le FSP Bénéficiaire attribue 1 USD de commission pour subventionner, rendant la transaction gratuite pour le Payeur. + +###### Figure 13 + +![](../../assets/diagrams/sequence/figure13.svg) + +**Figure 13 -- Exemple avec montant à recevoir en divulgation** + +[Figure 14](#figure-14) : vue simplifiée. + +###### Figure 14 + +![Figure 14](../../assets/diagrams/images/figure14.svg) + +**Figure 14 -- Vue simplifiée du mouvement de fonds** + +Pour calculer **transferAmount** côté FSP Bénéficiaire pour ce type de devis, appliquer l'équation du [Listing 9](#listing-9), où _Montant transfert_ = **transferAmount**, _Montant devis_ = **amount**, frais FSP Bénéficiaire = **payeeFspFee**, commission FSP Bénéficiaire = **payeeFspCommission**. + +###### Listing 9 + +``` +Montant de transfert = Montant du devis + Frais FSP Bénéficiaire – Commission FSP Bénéficiaire +``` + +**Listing 9 -- Relation pour ce cas** + +#### Montant à envoyer avec divulgation + +[Figure 15](#figure-15) : le Payeur souhaite envoyer 100 USD au Bénéficiaire. Les frais doivent être calculés avant la demande de devis, car ils sont divulgués. Exemple : chaque FSP souhaite 1 USD de frais. + +###### Figure 15 + +![](../../assets/diagrams/sequence/figure15.svg) + +**Figure 15 -- Exemple avec montant à envoyer en divulgation** + +###### Figure 16 + +[Figure 16](#figure-16) : vue simplifiée du mouvement de fonds. + +![Figure 16](../../assets/diagrams/images/figure16.svg) + +**Figure 16 -- Vue simplifiée pour ce cas** + +Pour calculer **transferAmount** (côté FSP Bénéficiaire), l’équation du [Listing 10](#listing-10) doit être utilisée : + +###### Listing 10 + +``` +Si (Frais Payeur <= Commission FSP Bénéficiaire) + Montant de transfert = Montant du devis +Sinon + Montant de transfert = Montant du devis – (Frais Payeur – Commission FSP Bénéficiaire) +``` + +**Listing 10 -- Relation pour ce cas** + +Les frais FSP Bénéficiaire sont absents : on souhaite envoyer un montant précis, le Bénéficiaire reçoit donc moins, plutôt que d’ajouter les frais « par-dessus ». + +#### Exemple d’excédent de commission FSP + +[Figure 17](#figure-17) : excédent de commission FSP avec divulgation du montant à envoyer : le Payeur souhaite envoyer 100 USD, le FSP Payeur veut 1 USD de frais, le FSP Bénéficiaire donne 3 USD de commission. Sur les 3 USD, 1 USD couvre les frais Payeur, 2 USD reviennent au FSP Payeur. + +###### Figure 17 + +![](../../assets/diagrams/sequence/figure17.svg) + +**Figure 17 -- Exemple d’excédent de commission** + +###### Figure 18 + +[Figure 18](#figure-18) : vue simplifiée du mouvement de fonds. + +![Figure 18](../../assets/diagrams/images/figure18.svg) + +**Figure 18 -- Vue simplifiée pour ce cas** + +#### Types de frais + +Comme vu en [Figure 7](#figure-7) et [Figure 12](#figure-12), il existe deux types de frais et commissions dans l’objet Quote entre FSP : + +1. **Frais FSP Bénéficiaire** : frais de transaction que le FSP Bénéficiaire souhaite obtenir pour la gestion de la transaction. +2. **Commission FSP Bénéficiaire** : commission que le FSP Bénéficiaire veut verser au FSP Payeur (non-divulgation) ou subventionner la transaction en payant à la place du FSP Payeur (divulgation). Si excédent, il est traité comme frais payé du Bénéficiaire vers le Payeur, voir l’exemple d’excès de commission. + +
+ +#### Équations de devis + +Section contenant des formules utiles pour les devis qui n’ont pas encore été mentionnées. + +#### Relation entre montant reçu par le Bénéficiaire et montant de transfert + +Le montant que doit recevoir le Bénéficiaire, hors frais internes, bonus ou commission FSP Bénéficiaire, peut être calculé par le FSP Payeur via [Listing 11](#listing-11). _Montant de transfert_ = **transferAmount**, frais FSP Bénéficiaire = **payeeFspFee**, commission = **payeeFspCommission**. + +###### Listing 11 + +``` +Montant reçu Bénéficiaire = Montant de transfert - Frais FSP Bénéficiaire + Commission FSP Bénéficiaire +``` + +**Listing 11 -- Relation entre montant de transfert et montant reçu** + +Le montant reçu peut optionnellement être transmis lors du retour du devis sous **payeeReceiveAmount**. + +
+ +#### Informations fiscales + +Aucune information de taxe n’est transmise via l’API (toute la fiscalité est considérée comme interne). Les sections suivantes détaillent les cas les plus courants. + +##### Taxe sur la commission des agents + +Taxe sur la commission d’un agent (en tant que revenu). C’est l’agent ou son FSP qui gère la relation avec l’administration fiscale, selon le cas. Toutes les commissions agent étant internes, rien n’est transmis dans l’API. + +##### Taxe sur les frais internes FSP + +Un FSP peut être taxé sur certains frais internes reçus : ex : frais Payeur vers son FSP, ou frais Bénéficiaire vers son FSP. Cette taxe doit être gérée et collectée en interne par le FSP concerné. + +##### Taxe sur le montant (TVA, taxe de vente, ... ) + +La TVA ou les taxes de vente sont des taxes sur un montant, typiquement supportées par le consommateur lors d’un achat marchand. Le marchand collecte la taxe et reverse à l’administration. Si la TVA s’applique, elle doit être incluse dans la somme demandée au client, et le montant reçu par le FSP Bénéficiaire est taxé en conséquence. + +##### Taxe sur frais FSP + +Dans l’API, un FSP Bénéficiaire peut ajouter un frais à payer par le Payeur ou son FSP. Il doit gérer la fiscalité conformément à la pratique locale, en interne et sans transmettre de détail via l’API. + +##### Taxe sur la commission FSP + +Un FSP Bénéficiaire peut ajouter une commission, soit pour subventionner la transaction (divulgation), soit pour inciter le FSP Payeur (non-divulgation). + +###### Non-divulgation des frais + +Dans ce cas, toute commission FSP Bénéficiaire doit être considérée comme un frais reçu par le FSP Payeur. La taxe correspondante est gérée en interne comme tout frais reçu. + +###### Divulgation des frais + +Si le montant de commission est inférieur ou égal aux frais à la charge du Payeur, la commission sert à couvrir ces frais. Si elle les dépasse, l’excédent est traité comme dans la non-divulgation. + +
+ +#### Exemples pour chaque cas d’usage + +Cette section présente un ou plusieurs exemples pour chaque cas. + +#### Virement P2P + +Un virement P2P est typiquement un montant à recevoir, sans aucune divulgation de frais côté Bénéficiaire ([Figure 19](#figure-19)). Ex : le Payeur veut que le Bénéficiaire reçoive 100 USD. Le FSP Bénéficiaire offre une commission au FSP Payeur. Le FSP Payeur prend 1 USD de frais à son client : il gagne donc 2 USD (1 USD venant du client, 1 USD en commission). 99 USD sont transférés après déduction de la commission. + +###### Figure 19 + +![](../../assets/diagrams/sequence/figure19.svg) + +**Figure 19 -- Exemple virement P2P avec montant à recevoir** + +###### Vue simplifiée du mouvement de fonds + +###### Figure 20 + +Voir [Figure 20](#figure-20) pour une vue très simplifiée du mouvement. + +![Figure 20](../../assets/diagrams/images/figure20.svg) + +**Figure 20 -- Vue simplifiée virement P2P** + +##### Dépôt d’espèces initié par l’agent (Montant à envoyer) + +[Figure 21](#figure-21) : dépôt avec divulgation des frais. Le Bénéficiaire veut savoir les frais avant d’accepter l’opération. Exemple : le client souhaite déposer 100 USD chez un agent du FSP Payeur. Celui-ci prend 2 USD de frais, le FSP Bénéficiaire subventionne la transaction avec 2 USD de commission pour couvrir ces frais. 98 USD sont transférés après déduction de la commission. + +###### Figure 21 + +![](../../assets/diagrams/sequence/figure21.svg) + +**Figure 21 -- Exemple dépôt agent, montant à envoyer** + +###### Vue simplifiée + +Voir [Figure 22](#figure-22). + +###### Figure 22 + +![Figure 22](../../assets/diagrams/images/figure22.svg) + +**Figure 22 -- Vue simplifiée dépôt agent** + +##### Dépôt d’espèces initié par l’agent (Montant à recevoir) + +[Figure 23](#figure-23) : dépôt avec divulgation des frais, client souhaite recevoir exactement 100 USD. Le FSP Payeur souhaite 2 USD de frais pour la commission agent ; le FSP Bénéficiaire subventionne 1 USD en commission (50 % des frais). 99 USD transférés après déduction de la commission. + +###### Figure 23 + +![](../../assets/diagrams/sequence/figure23.svg) + +**Figure 23 -- Exemple dépôt agent, montant à recevoir** + +###### Vue simplifiée + +###### Figure 24 + +Voir [Figure 24](#figure-24). + +![Figure 24](../../assets/diagrams/images/figure24.svg) + +**Figure 24 -- Vue simplifiée dépôt agent montant à recevoir** + +##### Paiement marchand initié par le client + +Typiquement un montant à recevoir sans divulgation des frais. Ex : achat de biens/ services pour 100 USD auprès d’un marchand dans le FSP Bénéficiaire. Le FSP Bénéficiaire ne facture pas le client mais prend un frais caché d’1 USD au marchand. Le FSP Payeur prélève 1 USD au client. 100 USD sont transférés. + +###### Figure 25 + +![](../../assets/diagrams/sequence/figure25.svg) + +**Figure 25 -- Exemple paiement marchand client** + +###### Vue simplifiée + +Voir [Figure 26](#figure-26). + +###### Figure 26 + +![Figure 26](../../assets/diagrams/images/figure26.svg) + +**Figure 26 -- Vue simplifiée paiement marchand client** + +##### Retrait d’espèces initié par le client (Montant à recevoir) + +Typiquement, montant à recevoir sans divulgation des frais. Ex : le client veut retirer 100 USD en espèces. Le FSP Bénéficiaire prend 2 USD de frais (commission agent), le FSP Payeur prend 1 USD. 102 USD transférés. + +###### Figure 27 + +![](../../assets/diagrams/sequence/figure27.svg) + +**Figure 27 -- Exemple retrait client (montant à recevoir)** + +###### Vue simplifiée + +Voir [Figure 28](#figure-28). + +###### Figure 28 + +![Figure 28](../../assets/diagrams/images/figure28.svg) + +**Figure 28 -- Vue simplifiée retrait client (montant à recevoir)** + +##### Retrait d’espèces initié par le client (Montant à envoyer) + +Normalement, typiquement montant à recevoir, mais ici exemple avec montant à envoyer : voir [Figure 29](#figure-29). Le client veut retirer 100 USD de son compte. Le FSP Bénéficiaire prend 2 USD (commission agent), le FSP Payeur prend 1 USD. 99 USD transférés. + +###### Figure 29 + +![](../../assets/diagrams/sequence/figure29.svg) + +**Figure 29 -- Exemple retrait client (montant à envoyer)** + +###### Vue simplifiée + +Voir [Figure 30](#figure-30). + +###### Figure 30 + +![Figure 30](../../assets/diagrams/images/figure30.svg) + +**Figure 30 -- Vue simplifiée retrait client (montant à envoyer)** + +#### Retrait initié par agent + +Montant à recevoir, pas de divulgation des frais côté FSP Payeur. Ex : le client veut recevoir 100 USD en liquide. Frais : 2 USD côté FSP Bénéficiaire ; 1 USD côté FSP Payeur. 102 USD transférés. + +###### Figure 31 + +![](../../assets/diagrams/sequence/figure31.svg) + +**Figure 31 -- Exemple retrait agent** + +###### Vue simplifiée + +Voir [Figure 32](#figure-32). + +###### Figure 32 + +![Figure 32](../../assets/diagrams/images/figure32.svg) + +**Figure 32 -- Vue simplifiée retrait agent** + +##### Paiement marchand initié par le marchand + +Montant à recevoir, pas de divulgation des frais. Ex : achat de 100 USD, aucun frais Bénéficiaire, mais 1 USD de frais côté Payeur. 100 USD transférés. + +###### Figure 33 + +![](../../assets/diagrams/sequence/figure33.svg) + +**Figure 33 -- Exemple paiement marchand initié par marchand** + +###### Vue simplifiée + +Voir [Figure 34](#figure-34). + +###### Figure 34 + +![Figure 34](../../assets/diagrams/images/figure34.svg) + +**Figure 34 -- Vue simplifiée paiement marchand initié par marchand** + +##### Retrait initié par ATM + +Montant à recevoir, pas de divulgation. Ex : retrait de 100 USD en espèces, 1 USD de frais côté FSP Bénéficiaire (frais ATM), 1 USD côté FSP Payeur. 101 USD transférés. + +###### Figure 35 + +![](../../assets/diagrams/sequence/figure35.svg) + +**Figure 35 -- Exemple retrait ATM** + +###### Vue simplifiée + +Voir [Figure 36](#figure-36). + +###### Figure 36 + +![Figure 36](../../assets/diagrams/images/figure36.svg) + +**Figure 36 -- Vue simplifiée retrait ATM** + +##### Paiement marchand initié par le marchand autorisé sur un TPE + +Montant à recevoir, pas de divulgation des frais. Ex : achat de 100 USD, le FSP Bénéficiaire accorde 1 USD de commission, le FSP Payeur l’utilise comme frais. 100 USD transférés. + +###### Figure 37 + +![](../../assets/diagrams/sequence/figure37.svg) + +**Figure 37 -- Exemple paiement marchand sur TPE** + +###### Vue simplifiée + +Voir [Figure 38](#figure-38). + +###### Figure 38 + +![Figure 38](../../assets/diagrams/images/figure38.svg) + +**Figure 38 -- Vue simplifiée paiement marchand sur TPE** + +##### Remboursement + +[Figure 39](#figure-39) présente un exemple de remboursement du montant entier d’un dépôt d’espèces (voir exemple plus haut). + +###### Figure 39 + +![](../../assets/diagrams/sequence/figure39.svg) + +**Figure 39 -- Exemple de remboursement** + +#### 5.1.6.11.1 Vue simplifiée du mouvement de fonds + +Voir [Figure 40](#figure-40). + +###### Figure 40 + +![Figure 40](../../assets/diagrams/images/figure40.svg) + +**Figure 40 -- Vue simplifiée du remboursement** + +
+ +### Adressage des Parties + +Les deux parties d’une transaction financière (le `Payeur` et le `Bénéficiaire`) sont identifiées dans l’API par un _Type d’ID de Partie_ ([**PartyIdType**](#partyidtype-element)), un _ID de Partie_ ([**PartyIdentifier**](#partyidentifier-element)), et, éventuellement, un _Sous-ID ou Type de Partie_ ([PartySubIdOrType](#partysubidortype-element)). Certains sous-types sont prévus en standard pour des identifiants personnels ([PersonalIdentifierType](#personalidentifiertype-enum)), par ex. pour le numéro de passeport ou le permis de conduire. + +Exemples de base d’utilisation des éléments _Party ID Type_ et _Party ID_ : + +- Pour utiliser le numéro de téléphone mobile **+123456789** comme contrepartie, mettre *Party ID Type* à **MSISDN** et _Party ID_ à **+123456789**. + - Exemple de service pour obtenir le FSP : + + **GET /participants/MSISDN/+123456789** + +- Pour utiliser l'adresse email **john\@doe.com**, mettre _Party ID Type_ à **EMAIL** et _Party ID_ à **john\@doe.com**. + - Exemple : + + **GET /participants/EMAIL/john\@doe.com** + +- Pour utiliser l’IBAN **SE45 5000 0000 0583 9825 7466** : _Party ID Type_ = **IBAN**, _Party ID_ = **SE4550000000058398257466** (sans espaces). + - Exemple : + + **GET /participants/IBAN/SE4550000000058398257466** + +Exemples avancés : + +- Pour une personne dont le numéro de passeport est **12345678** : _Party ID Type_ = **PERSONAL_ID**, _Party ID_ = **12345678**, _Party Sub ID or Type_ = **PASSPORT**. + - Exemple : + + **GET /participants/PERSONAL_ID/123456789/PASSPORT** + +- Pour **employeeId1** travaillant chez **Shoe-company** : _Party ID Type_ = **BUSINESS**, _Party ID_ = **Shoe-company**, _Party Sub ID or Type_ = **employeeId1** + - Exemple : + + **GET /participants/BUSINESS/Shoe-company/employeeId1** + +**5.2.1 Caractères interdits dans Party ID et Party Sub ID or Type** + +Le _Party ID_ et _Party Sub ID or Type_ font partie de l’URI (voir [Syntaxe URI](#uri-syntax)), donc certaines restrictions existent : + +- Barre oblique (**/**) interdite (utilisée dans le [Path](#path) pour la séparation). +- Point d’interrogation (**?**) interdit (identifie la [Query](#query) dans l’URI). + +
+ +### Correspondance des cas d’usage et des types de transaction + +Cette section décrit comment mapper les cas d’usage non-bulk actuellement supportés dans l’API vers le type complexe [**TransactionType**](#transactiontype)), en utilisant les éléments [TransactionScenario](#transactionscenario)), et [TransactionInitiator](#transactioninitiator)). + +Plus de détails dans _Cas d’usage de l’API_. + +#### Virement P2P + +Pour effectuer un virement P2P : + +- [**TransactionScenario**](#transactionscenario) = **TRANSFER** +- [**TransactionInitiator**](#transactioninitiator) = **PAYER** +- [**TransactionInitiatorType**](#transactioninitiatortype) = **CONSUMER** + +#### Dépôt d’espèces initié par agent + +- [**TransactionScenario**](#transactionscenario) = **DEPOSIT** +- [**TransactionInitiator**](#transactioninitiator) = **PAYER** +- [**TransactionInitiatorType**](#transactioninitiatortype) = **AGENT** + +#### Retrait d’espèces initié par agent + +- [**TransactionScenario**](#transactionscenario) = **WITHDRAWAL** +- [**TransactionInitiator**](#transactioninitiator) = **PAYEE** +- [**TransactionInitiatorType**](#transactioninitiatortype) = **AGENT** + +#### Retrait d’espèces par agent sur TPE + +- [**TransactionScenario**](#transactionscenario) = **WITHDRAWAL** +- [**TransactionInitiator**](#transactioninitiator) = **PAYEE** +- [**TransactionInitiatorType**](#transactioninitiatortype) = **AGENT** + +#### Retrait d’espèces initié par client + +- [**TransactionScenario**](#transactionscenario) = **WITHDRAWAL** +- [**TransactionInitiator**](#transactioninitiator) = **PAYER** +- [**TransactionInitiatorType**](#transactioninitiatortype) = **CONSUMER** + +#### Paiement marchand initié par client + +- [**TransactionScenario**](#transactionscenario) = **PAYMENT** +- [**TransactionInitiator**](#transactioninitiator) = **PAYER** +- [**TransactionInitiatorType**](#transactioninitiatortype) = **CONSUMER** + +#### Paiement marchand initié par marchand + +- [**TransactionScenario**](#transactionscenario) = **PAYMENT** +- [**TransactionInitiator**](#transactioninitiator) = **PAYEE** +- [**TransactionInitiatorType**](#transactioninitiatortype) = **BUSINESS** + +#### Paiement marchand initié par marchand sur TPE + +- [**TransactionScenario**](#transactionscenario) = **PAYMENT** +- [**TransactionInitiator**](#transactioninitiator) = **PAYEE** +- [**TransactionInitiatorType**](#transactioninitiatortype) = **DEVICE** + +#### Retrait initié par ATM + +- [**TransactionScenario**](#transactionscenario) = **WITHDRAWAL** +- [**TransactionInitiator**](#transactioninitiator) = **PAYEE** +- [**TransactionInitiatorType**](#transactioninitiatortype) = **DEVICE** + +#### Remboursement + +Pour effectuer un remboursement, configurez les éléments comme suit : + +- [**TransactionScenario**](#transactionscenario) à **REFUND** +- [**TransactionInitiator**](#transactioninitiator) à **PAYER** +- [**TransactionInitiatorType**](#transactioninitiatortype) dépend de l’initiateur du remboursement. + +De plus, le type complexe [Refund](#refund) doit être renseigné avec l’identifiant de la transaction d’origine à rembourser. + +
+ +## Services de l’API + +Cette section présente et détaille tous les services que l’API prend en charge pour chaque ressource et méthode HTTP. Chaque ressource et service de l’API est également mappé à une ressource et un service logique décrits dans les [Modèles génériques de transaction](../generic-transaction-patterns). + +### Services API de haut niveau + +À un niveau élevé, l’API peut être utilisée pour réaliser les actions suivantes : + +- **Recherche d’informations sur un participant** — Déterminer dans quel FSP se situe la contrepartie d’une transaction financière. + - Utilisez les services fournis par la ressource API **/participants**. + +- **Recherche d’informations sur une partie** — Obtenir des informations sur la contrepartie d’une transaction financière. + - Utilisez les services fournis par la ressource API **/parties**. + +- **Demande de transaction** — Demander à un payeur de transférer des fonds électroniques au bénéficiaire, à la demande du bénéficiaire. Le payeur peut approuver ou refuser la demande. Une approbation initiera effectivement la transaction financière. + - Utilisez les services fournis par la ressource API **/transactionRequests**. + +- **Calculer une cotation** — Calculer tous les éléments d’une transaction qui influenceront le montant de la transaction, c’est-à-dire les frais et la commission du FSP. + - Utilisez les services fournis par la ressource API **/quotes** pour la cotation d’une transaction individuelle (un payeur vers un bénéficiaire). + - Utilisez les services fournis par la ressource API **/bulkQuotes** pour la cotation d’une transaction groupée (un payeur vers plusieurs bénéficiaires). + +- **Réaliser une autorisation** — Demander au payeur de saisir les identifiants requis lorsqu’il a initié la transaction depuis un terminal de paiement, un DAB, ou un appareil similaire dans le système FSP du bénéficiaire. + - Utilisez les services fournis par la ressource API **/authorizations**. + +- **Effectuer un transfert** — Réaliser effectivement la transaction financière en transférant les fonds électroniques du payeur au bénéficiaire, éventuellement via des registres intermédiaires. + - Utilisez les services fournis par la ressource API **/transfers** pour une transaction unique (un payeur vers un bénéficiaire). + - Utilisez les services fournis par la ressource API **/bulkTransfers** pour une transaction groupée (un payeur vers plusieurs bénéficiaires). + +- **Récupérer les informations de transaction** — Obtenir les informations relatives à la transaction financière ; par exemple, un jeton créé en cas de transaction réussie. + - Utilisez les services fournis par la ressource API **/transactions**. + +#### Services API pris en charge + +[Tableau 6](#table-6) inclut des descriptions de haut niveau des services que l’API propose. Pour plus d’informations détaillées, consultez les sections suivantes. + +###### Tableau 6 + +|URI|Méthode HTTP GET|Méthode HTTP PUT|Méthode HTTP POST|Méthode HTTP DELETE|Méthode HTTP PATCH| +|---|---|---|---|---|---| +|**/participants**|Non pris en charge|Non pris en charge|Demande à un ALS de créer les informations FSP concernant les parties fournies dans le corps ou, si l'information existe déjà, demande à l’ALS de la mettre à jour|Non pris en charge|Non pris en charge| +|**/participants/**_{ID}_|Non pris en charge|Callback pour informer un FSP pair d’une liste de parties précédemment créée.|Non pris en charge|Non pris en charge|Non pris en charge| +|**/participants/**_{Type}_/_{ID}_ Alternative : **/participants/**_{Type}_/_{ID}_/_{SubId}_|Obtenir les informations FSP concernant une partie depuis un FSP pair ou un ALS.|Callback pour informer un FSP pair des informations FSP demandées ou créées.|Demander à un ALS de créer une information FSP concernant une partie ou, si elle existe déjà, de la mettre à jour|Demander à un ALS de supprimer les informations FSP concernant une partie.|Non pris en charge| +|**/parties/**_{Type}_/_{ID}_ Alternative : **/parties/**_{Type}_/_{ID}_/_{SubId}_|Obtenir des informations concernant une partie depuis un FSP pair.|Callback pour informer un FSP pair des informations demandées sur la partie.|Non pris en charge|Non pris en charge|Non pris en charge| +|**/transactionRequests**|Non pris en charge|Non pris en charge|Demander à un FSP pair de solliciter l’approbation d’un payeur pour transférer des fonds à un bénéficiaire. Le payeur peut approuver ou refuser la demande.|Non pris en charge|Non pris en charge| +|**/transactionRequests/**_{ID}_|Obtenir des informations concernant une demande de transaction déjà envoyée.|Callback pour informer un FSP pair d’une demande de transaction déjà envoyée.|Non pris en charge|Non pris en charge|Non pris en charge| +|**/quotes**|Non pris en charge|Non pris en charge|Demander à un FSP pair de créer une nouvelle cotation pour réaliser une transaction.|Non pris en charge|Non pris en charge| +|**/quotes/**_{ID}_|Obtenir des informations concernant une cotation déjà demandée.|Callback pour informer un FSP pair d’une cotation demandée précédemment.|Non pris en charge|Non pris en charge|Non pris en charge| +|**/authorizations/**_{ID}_|Obtenir l’autorisation pour une transaction du payeur qui interagit avec le système FSP du bénéficiaire.|Callback pour informer le FSP payeur concernant les informations d’autorisation.|Non pris en charge|Non pris en charge|Non pris en charge| +|**/transfers**|Non pris en charge|Non pris en charge|Demander à un FSP pair d’effectuer le transfert des fonds liés à une transaction.|Non pris en charge|Non pris en charge| +|**/transfers/**_{ID}_|Obtenir des informations concernant un transfert déjà effectué.|Callback pour informer un FSP pair d’un transfert déjà effectué.|Non pris en charge|Non pris en charge|Notification d’engagement au FSP bénéficiaire| +|**/transactions/**_{ID}_|Obtenir des informations concernant une transaction déjà réalisée.|Callback pour informer un FSP pair d’une transaction déjà réalisée.|Non pris en charge|Non pris en charge|Non pris en charge| +|**/bulkQuotes**|Non pris en charge|Non pris en charge|Demander à un FSP pair de créer une nouvelle cotation pour effectuer une transaction groupée.|Non pris en charge|Non pris en charge| +|**/bulkQuotes/**_{ID}_|Obtenir des informations concernant une cotation groupée déjà demandée.|Callback pour informer un FSP pair d’une cotation groupée déjà demandée.|Non pris en charge|Non pris en charge|Non pris en charge| +|**/bulkTransfers**|Non pris en charge|Non pris en charge|Demander à un FSP pair de créer un transfert groupé.|Non pris en charge|Non pris en charge| +|**/bulkTransfers/**_{ID}_|Obtenir des informations concernant un transfert groupé déjà envoyé.|Callback pour informer un FSP pair d’un transfert groupé déjà envoyé.|Non pris en charge|Non pris en charge|Non pris en charge| + +**Tableau 6 – Services fournis par l’API** + +#### Versions actuelles des ressources + +[Tableau 7](#table-7) contient la version de chaque ressource décrite dans ce document. + +###### Tableau 7 + +|Ressource|Version actuelle|Dernière modification| +|---|---|---| +|/participants|1.1|Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.| +|/parties|1.1|Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.| +|/transactionRequests|1.1|Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.| +|/quotes|1.1|Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.| +|/authorizations|1.0|Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.| +|/transfers|1.1|Ajout d’une possible notification de validation via PATCH /transfers/``. Le processus d’utilisation des notifications de validation est décrit à la section 6.7.2.6. Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.| +|/transactions|1.0|Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.| +|/bulkQuotes|1.1|Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.| +|/bulkTransfers|1.1|Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.| + +**Tableau 7 – Versions actuelles des ressources** + +
+ +### Ressource API /participants + +Cette section définit la ressource API logique **Participants**, décrite dans les [Modèles génériques de transaction](../generic-transaction-patterns#api-resource-participants). + +Les services fournis par la ressource **/participants** servent principalement à déterminer dans quel FSP se trouve la contrepartie d’une transaction financière. Selon le schéma, ces services doivent être pris en charge, au minimum, soit par les FSP individuels soit par un service commun. + +Si un service commun (par exemple, un ALS) est pris en charge dans le schéma, les services de la ressource **/participants** peuvent aussi être utilisés par les FSP pour ajouter et supprimer des informations dans ce système. + +#### Historique des versions de la ressource + +[Tableau 8](#table-8) fournit une description de chaque version différente de la ressource **/participants**. + +###### Tableau 8 + +|Version|Date|Description| +|---|---|---| +|1.0|2018-03-13|Version initiale| +|1.1|2020-05-19|Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour. +Pour garantir la cohérence, le modèle de données pour les appels **POST /participants/**_{Type}/{ID}_ et **POST /participants/**_{Type}/{ID}/{SubId}_ du Tableau 10 a également été mis à jour pour inclure l’élément ExtensionList optionnel.| + +**Tableau 8 – Historique des versions pour la ressource /participants** + +#### Détails des services + +Différents modèles sont utilisés pour la recherche de compte, selon qu’un ALS existe ou non. Les sections suivantes décrivent chaque modèle à tour de rôle. + +#### Système sans service commun de recherche de comptes + +[Figure 41](#figure-41) montre comment effectuer une recherche de compte s’il n’existe pas d’ALS commun dans un schéma. Le processus consiste à demander aux autres FSP (en séquence) s’ils « possèdent » la partie avec le couple identité/type délivré jusqu’à trouver la partie. + +Si ce modèle est utilisé, tous les FSP doivent prendre en charge à la fois la partie cliente et serveur des différents services HTTP **GET** de la ressource **/participants**. Les services HTTP **POST** ou **DELETE** de la ressource **/participants** ne doivent pas être utilisés, car les FSP sont directement sollicités pour récupérer les informations (au lieu d’un ALS commun). + +###### Figure 41 + +![](../../assets/diagrams/sequence/figure41.svg) + + +**Figure 41 — Comment utiliser les services fournis par /participants s’il n’existe pas de système commun de recherche de comptes** + +#### Système de recherche de comptes commun + +[Figure 42](#figure-42) montre comment une recherche de compte peut être effectuée s’il existe un ALS commun dans un schéma. Le processus consiste à demander au service commun de recherche de comptes quel FSP détient la partie avec l’identité fournie. Le service commun est représenté comme « Account Lookup » dans les flux ; ce service peut être mis en œuvre par le Switch ou comme un service séparé, selon le marché. + +Les FSP n’ont pas besoin de prendre en charge la partie serveur des différents services HTTP **GET** sous la ressource **/participants** ; cette partie doit être assurée par l’ALS. À la place, les FSP (clients) doivent fournir des informations FSP concernant leurs comptes et titulaires de comptes (parties) à l’ALS (serveur) en utilisant les méthodes HTTP **POST** (pour créer ou mettre à jour les informations FSP, voir [POST /participants](#post-participants) et [POST /participants/_{Type}_/_{ID}_](#post-participants-type-id)) et HTTP **DELETE** (pour supprimer les informations FSP existantes, voir [DELETE /participants/_{Type}_/_{ID}_](#delete-participantstypeid)). + +###### Figure 42 + +![](../../assets/diagrams/sequence/figure42.svg) + + +**Figure 42 — Comment utiliser les services fournis par /participants s’il existe un système commun de recherche de comptes** + +#### Requêtes + +Cette section décrit les services qu’un client peut demander sur la ressource **/participants**. + +##### GET /participants/_{Type}_/_{ID}_ + +URI alternative : **GET /participants/**_{Type}_**/**_{ID}_**/**_{SubId}_ + +Service logique API : [Recherche d’informations sur un participant](../generic-transaction-patterns#lookup-participant-information) + +La requête HTTP **GET /participants/**_{Type}_**/**_{ID}_ (ou **GET /participants/**_{Type}_**/**_{ID}_**/**_{SubId}_) sert à déterminer dans quel FSP se trouve la partie demandée, définie par _{Type}_, _{ID}_ et éventuellement _{SubId}_ (par exemple, **GET** **/participants/MSISDN/123456789**, ou **GET /participants/BUSINESS/shoecompany/employee1**). Voir [Remboursement](#refund) pour plus d’informations sur l’adressage d’une partie. + +Cette requête HTTP doit prendre en charge une chaîne de requête (voir [Syntaxe URI](#uri-syntax) pour plus d’informations sur la syntaxe URI) pour filtrer par devise. Pour utiliser le filtrage par devise, la requête HTTP **GET /participants/**_{Type}_**/**_{ID}_**?currency=**_XYZ_ doit être utilisée, où _XYZ_ est la devise demandée. + +Informations de callback et de modèle de données pour **GET /participants/**_{Type}_**/**_{ID}_ (alternative **GET /participants/**_{Type}_**/**_{ID}_**/**_{SubId}_): + +- Callback – [**PUT /participants/**_{Type}_/_{ID}_](#put-participants-type-id) +- Callback d’erreur – [**PUT /participants/**_{Type}_/_{ID}_**/error**](#put-participants-type-iderror) +- Modèle de données — Corps vide + +##### POST /participants + +URI alternative : N/A + +Service logique API : [Création d’informations bulk sur un participant](../generic-transaction-patterns#create-bulk-participant-information) + +La requête HTTP **POST /participants** est utilisée pour créer des informations sur le serveur concernant la liste d’identités fournie. Cette requête doit être utilisée pour la création groupée d’informations FSP pour plusieurs parties. Le paramètre de devise optionnel doit indiquer que chaque partie fournie prend en charge la devise. + +Callback et modèle de données pour **POST /participants** : + +- Callback – [**PUT /participants/**_{ID}_](#put-participants-type-id) +- Callback d’erreur – [**PUT /participants/**_{ID}_ **/error**](#put-participants-type-iderror) +- Modèle de données – Voir [Tableau 9](#table-9) + +###### Tableau 9 + +|Nom|Cardinalité|Type|Description| +|---|---|---|---| +|**requestId**|1|CorrelationId|L’identifiant de la requête, choisi par le client. Utilisé pour identifier le callback du serveur.| +|**partyList**|1..10000|PartyIdInfo|Liste des éléments PartyIdInfo pour lesquels le client souhaite créer ou mettre à jour les informations FSP.| +|**currency**|0..1|Currency|Indique que la devise fournie est prise en charge par chaque PartyIdInfo de la liste.| + +**Tableau 9 — Modèle de données POST /participants** + +##### POST /participants/_{Type}_/_{ID}_ + +URI alternative : **POST /participants/**_{Type}_/_{ID}_/_{SubId}_ + +Service logique API : [Création d’informations sur un participant](../generic-transaction-patterns#create-participant-information) + +La requête HTTP **POST /participants/**_{Type}_**/**_{ID}_ (ou **POST /participants/**_{Type}_**/**_{ID}_**/**_{SubId}_) est utilisée pour créer sur le serveur les informations concernant l’identité fournie, définie par _{Type}_, _{ID}_ et éventuellement _{SubId}_ (par exemple, **POST /participants/MSISDN/123456789** ou **POST /participants/BUSINESS/shoecompany/employee1**). Voir [Remboursement](#refund) pour plus d’informations sur l’adressage d’une partie. + +Callback et modèle de données pour **POST /participants**/_{Type}_**/**_{ID}_ (alternative **POST** **/participants/**_{Type}_**/**_{ID}_**/**_{SubId}_): + +- Callback – [**PUT /participants/**_{Type}_**/**_{ID}_](#put-participants-type-id) +- Callback d’erreur — [**PUT /participants/**_{Type}_**/**_{ID}_**/error**](#put-participants-type-iderror) +- Modèle de données – Voir [Tableau 10](#table-10) + +###### Tableau 10 + +|Nom|Cardinalité|Type|Description| +|---|---|---|---| +|**fspId**|1|FspId|Identifiant FSP auquel appartient la partie.| +|**currency**|0..1|Currency|Indique que la devise fournie est prise en charge par la partie.| +|**extensionList**|0..1|ExtensionList|Extension optionnelle, spécifique au déploiement.| + +**Tableau 10 — Modèle de données POST /participants/_{Type}_/_{ID}_ (ou POST /participants/_{Type}_/_{ID}_/_{SubId}_)** + +##### DELETE /participants/_{Type}_/_{ID}_ + +URI alternative : **DELETE /participants/**_{Type}_**/**_{ID}_**/**_{SubId}_ + +Service logique API : [Suppression d’informations sur un participant](../generic-transaction-patterns#delete-participant-information) + +La requête HTTP **DELETE /participants/**_{Type}_**/**_{ID}_ (ou **DELETE /participants/**_{Type}_**/**_{ID}_**/**_{SubId}_) est utilisée pour supprimer les informations sur le serveur concernant l’identité fournie, définie par _{Type}_ et _{ID}_ (par exemple, **DELETE /participants/MSISDN/123456789**) et éventuellement _{SubId}_. Voir [Remboursement](#refund) pour plus d’informations sur l’adressage d’une partie. + +Cette requête HTTP doit prendre en charge une chaîne de requête (voir [Syntaxe URI](#uri-syntax)) pour supprimer les informations FSP concernant uniquement une devise spécifique. Pour supprimer uniquement une devise spécifique, la requête HTTP **DELETE** **/participants/**_{Type}_**/**_{ID}_**?currency**_=XYZ_ doit être utilisée, où _XYZ_ est la devise demandée. + +**Note :** L’ALS doit vérifier que c’est bien le FSP actuel de la partie qui supprime l’information FSP. + +Callback et modèle de données pour **DELETE /participants/**_{Type}_**/**_{ID}_ (alternative **GET** **/participants/**_{Type}_**/**_{ID}_**/**_{SubId}_): + +- Callback – [**PUT /participants/**_{Type}_**/**_{ID}_](#put-participants-type-id) +- Callback d’erreur – [**PUT /participants/**_{Type}_**/**_{ID}_**/error**](#put-participants-type-iderror) +- Modèle de données — Corps vide + +
+ +#### Callbacks + +Cette section décrit les callbacks utilisés par le serveur pour les services fournis par la ressource **/participants**. + +##### PUT /participants/_{Type}_/_{ID}_ + +URI alternative : **PUT /participants/**_{Type}_**/**_{ID}_**/**_{SubId}_ + +Service logique API : [Retour d’information sur un participant](../generic-transaction-patterns#return-participant-information) + +Le callback **PUT /participants/**_{Type}_**/**_{ID}_ (ou **PUT /participants/**_{Type}_**/**_{ID}_**/**_{SubId}_) est utilisé pour informer le client d’un succès à la suite d’une recherche, création ou suppression des informations FSP liées à la partie. Si l’information FSP a été supprimée, l’élément **fspId** doit être vide ; sinon il doit contenir l’information FSP de la partie. + +Voir [Tableau 11](#table-11) pour le modèle de données. + +###### Tableau 11 + +|Nom|Cardinalité|Type|Description| +|---|---|---|---| +|**fspId**|0..1|FspId|Identifiant FSP auquel appartient la partie.| + +**Tableau 11 — Modèle de données PUT /participants/_{Type}_/_{ID}_ (ou PUT /participants/_{Type}_/_{ID}_/_{SubId}_)** + +##### PUT /participants/_{ID}_ + +URI alternative : N/A + +Service logique API : [Retour d’informations groupées sur les participants](../generic-transaction-patterns#return-bulk-participant-information) + +Le callback **PUT /participants/**_{ID}_ est utilisé pour informer le client du résultat de la création de la liste d’identités fournie. + +Voir [Tableau 12](#table-12) pour le modèle de données. + +###### Tableau 12 + +|Nom|Cardinalité|Type|Description| +|---|---|---|---| +|**partyList**|1..10000|PartyResults|Liste des éléments PartyResult qui ont été créés ou dont la création a échoué.| +|**currency**|0..1|Currency|Indique que la devise fournie a été définie comme prise en charge par chaque PartyIdInfo ajouté avec succès.| + +**Tableau 12 — Modèle de données PUT /participants/_{ID}_** + +####Callbacks d’erreur + +Cette section décrit les callbacks d’erreur utilisés par le serveur pour la ressource **/participants**. + +##### PUT /participants/_{Type}_/_{ID}_/error + +URI alternative : **PUT /participants/**_{Type}_**/**_{ID}_**/**_{SubId}_**/error** + +Service logique API : [Erreur de retour d’information sur un participant](../generic-transaction-patterns#return-participant-information-error) + +Si le serveur ne parvient pas à trouver, créer ou supprimer l’association FSP pour l’identité fournie, ou si une autre erreur de traitement est survenue, le callback d’erreur **PUT /participants/**_{Type}_**/**_{ID}_**/error** (ou **PUT /participants/**_{Type}_**/**_{ID}_**/**_{SubId}_**/error**) est utilisé. Voir [Tableau 13](#table-13) pour le modèle de données. + +###### Tableau 13 + +|Nom|Cardinalité|Type|Description| +|---|---|---|---| +|**errorInformation**|1|ErrorInformation|Code d’erreur, description de la catégorie.| + +**Tableau 13 — Modèle de données PUT /participants/_{Type}_/_{ID}_/error (ou PUT /participants/_{Type}_/_{ID}_/_{SubId}_/error)** + +##### PUT /participants/_{ID}_/error + +URI alternative : N/A + +Service logique API : [Erreur de retour d’informations sur des participants groupés](../generic-transaction-patterns#return-bulk-participant-information-error) + +En cas d’erreur lors de la création des informations FSP sur le serveur, le callback d’erreur **PUT /participants/**_{ID}_**/error** est utilisé. L’_{ID}_ de l’URI doit contenir le **requestId** (voir [Tableau 9](#table-9)) qui a servi à la création de l’information du participant. Voir [Tableau 14](#table-14) pour le modèle de données. + +###### Tableau 14 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| --- | --- | --- | --- | +| **errorInformation** | 1 | ErrorInformation | Code d’erreur, description de la catégorie. | + +**Tableau 14 — Modèle de données PUT /participants/_{ID}_/error** + +#### États + +Aucun état n’est défini pour la ressource **/participants** ; soit le serveur détient des informations FSP pour l’identité demandée, soit il n’en détient pas. + +
+ +### Ressource API /parties + +Cette section définit la ressource API logique **Parties**, décrite dans les [Modèles génériques de transaction](../generic-transaction-patterns#api-resource-parties). + +Les services fournis par la ressource **/parties** servent à obtenir des informations concernant une partie détenue par un FSP pair. + +#### Historique des versions de la ressource + +[Tableau 15](#table-15) présente une description de chaque version de la ressource **/parties**. + +###### Tableau 15 + +|Version|Date|Description| +|---|---|---| +|1.0|2018-03-13|Version initiale| +|1.1|2020-05-19|Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.| + +**Tableau 15 — Historique des versions de la ressource /parties** + +#### Détails des services + +[Figure 43](#figure-43) contient un exemple de processus pour la ressource [**/parties**](../generic-transaction-patterns#api-resource-parties). D’autres déploiements sont possibles, par exemple un où le Switch et l’ALS sont sur le même serveur, ou un où le FSP de l’utilisateur interroge directement le FSP 1 pour obtenir les informations sur la partie. + +###### Figure 43 + +![](../../assets/diagrams/sequence/figure43.svg) + +**Figure 43 — Exemple de processus pour la ressource /parties** + +
+ +#### Requêtes + +Cette section décrit les services qui peuvent être demandés par un client sur la ressource **/parties** de l’API. + +##### GET /parties/_{Type}_/_{ID}_ + +URI alternative : **GET /parties/**_{Type}_**/**_{ID}_**/**_{SubId}_ + +Service logique API : [Recherche d’informations sur une partie](../generic-transaction-patterns#lookup-party-information) + +La requête HTTP **GET /parties/**_{Type}_**/**_{ID}_ (ou **GET /parties/**_{Type}_**/**_{ID}_**/**_{SubId}_) est utilisée pour rechercher des informations sur la partie demandée, définie par _{Type}_, _{ID}_ et éventuellement _{SubId}_ (par exemple, **GET /parties/MSISDN/123456789** ou **GET /parties/BUSINESS/shoecompany/employee1**). Voir [Remboursement](#refund) pour plus d’informations sur l’adressage d’une partie. + +Callback et modèle de données pour **GET /parties/**_{Type}_**/**_{ID}_ (alternative **GET /parties/**_{Type}_**/**_{ID}_**/**_{SubId}_): + +- Callback – [**PUT /parties/**_{Type}_**/**_{ID}_](#put-partiestypeid) +- Callback d’erreur – [**PUT /parties/**_{Type}_**/**_{ID}_**/error**](#put-partiestypeiderror) +- Modèle de données — Corps vide + +
+ +#### Callbacks + +Cette section décrit les callbacks utilisés par le serveur pour les services fournis par la ressource **/parties**. + +##### PUT /parties/_{Type}_/_{ID}_ + +URI alternative : **PUT /parties/**_{Type}_**/**_{ID}_**/**_{SubId}_ + +Service logique API : [Retour d’informations sur une partie](../generic-transaction-patterns#return-party-information) + +Le callback **PUT /parties/**_{Type}_**/**_{ID}_ (ou **PUT /parties/**_{Type}_**/**_{ID}_**/**_{SubId}_) est utilisé pour informer le client d’un succès à la suite de la recherche d’une partie. Voir [Tableau 16](#table-16) pour le modèle de données. + +###### Tableau 16 + +|**Nom**|**Cardinalité**|**Type**|**Description**| +|---|---|---|---| +|**party**|1|Party|Informations sur la partie demandée.| + +**Tableau 16 — Modèle de données PUT /parties/_{Type}_/_{ID}_ (ou PUT /parties/_{Type}_/_{ID}_/_{SubId}_)** + +#### Callbacks d’erreur + +Cette section décrit les callbacks d’erreur utilisés par le serveur pour la ressource **/parties**. + +#### PUT /parties/_{Type}_/_{ID}_/error + +URI alternative : **PUT /parties/**_{Type}_**/**_{ID}_**/**_{SubId}_**/error** + +Service logique API : [Erreur de retour d’informations sur une partie](../generic-transaction-patterns#return-party-information-error) + +Si le serveur ne peut pas trouver les informations de la partie pour l’identité fournie, ou si une autre erreur de traitement est survenue, le callback d’erreur **PUT /parties/**_{Type}_**/**_{ID}_**/error** (ou **PUT /parties/**_{Type}_**/**_{ID}_**/**_{SubId}_**/error**) est utilisé. Voir [Tableau 17](#table-17) pour le modèle de données. + +###### Tableau 17 + +|**Nom**|**Cardinalité**|**Type**|**Description**| +|---|---|---|---| +|**errorInformation**|1|ErrorInformation|Code d’erreur, description de la catégorie.| + +**Tableau 17 — Modèle de données PUT /parties/_{Type}_/_{ID}_/error (ou PUT /parties/_{Type}_/_{ID}_/_{SubId}_/error)** + +#### États + +Aucun état n’est défini pour la ressource **/parties** ; soit un FSP dispose d’informations sur l’identité demandée, soit il n’en a pas. + +
+ +### Ressource API /transactionRequests + +Cette section définit la ressource API logique **Transaction Requests** (« demandes de transaction »), décrite dans les [Modèles génériques de transaction](../generic-transaction-patterns#api-resource-transaction-requests). + +Le service principal qu’offre la ressource **/transactionRequests** permet à un bénéficiaire de demander à un payeur de lui transférer des fonds électroniques. Le payeur peut approuver ou refuser la demande émise par le bénéficiaire. La décision du payeur peut être prise de manière programmatique si : + +- Le bénéficiaire est de confiance (c’est-à-dire que le payeur l’a pré-approuvé dans son FSP), ou +- Une valeur d’autorisation — c’est-à-dire un **mot de passe à usage unique** (OTP) — a été vérifiée correctement à l’aide de la ressource API **/authorizations** (voir [Section 6.6](#66-api-resource-authorizations)). + +Alternativement, le payeur peut prendre la décision manuellement. + +#### Historique des versions de la ressource + +[Tableau 18](#table-18) présente une description de chaque version de la ressource **/transactionRequests**. + +###### Tableau 18 + +|Version|Date|Description| +|---|---|---| +|1.0|2018-03-13|Version initiale| +|1.1|2020-05-19|Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.| + +**Tableau 18 — Historique des versions de la ressource /transactionRequests** + +#### Détails des services + +[Figure 44](#figure-44) montre comment fonctionne le processus de demande de transaction à l’aide de la ressource **/transactionRequests**. L’approbation ou le refus n’est pas montré dans la figure. Un refus est un callback **PUT /transactionRequests/**_{ID}_ avec un état **REJECTED**, similaire au callback de la figure avec l’état **RECEIVED**, tel que décrit dans la [Section 6.4.2.1](#6421-payer-rejected-transaction-request). Une approbation du payeur n’est pas envoyée en tant que callback ; à la place, une cotation et un transfert sont envoyés contenant une référence à la demande de transaction. + +###### Figure 44 + +![](../../assets/diagrams/sequence/figure44.svg) + +**Figure 44 — Comment utiliser le service /transactionRequests** + +##### Demande de transaction rejetée par le payeur + +[Figure 45](#figure-45) montre le processus par lequel une demande de transaction est rejetée. Les raisons possibles du refus incluent : + +- Le payeur a rejeté la demande manuellement. +- Un dépassement de limite automatique s’est produit. +- Le payeur a saisi un OTP de façon erronée plus que le nombre de fois autorisé. + +###### Figure 45 + +![](../../assets/diagrams/sequence/figure45.svg) + +**Figure 45 — Exemple de processus dans lequel une demande de transaction est rejetée** + +#### Requêtes + +Cette section décrit les services qu’un client peut demander pour la ressource **/transactionRequests**. + +##### GET /transactionRequests/_{ID}_ + +URI alternative : N/A + +Service logique API : [Récupérer les informations de demande de transaction](../generic-transaction-patterns#retrieve-transaction-request-information) + +La requête HTTP **GET /transactionRequests/**_{ID}_ est utilisée pour obtenir des informations sur une demande de transaction préalablement créée ou sollicitée. L’_{ID}_ dans l’URI doit contenir le **transactionRequestId** (voir [Tableau 15](#table-15)) qui a été utilisé lors de la création de la demande de transaction. + +Callback et modèle de données pour **GET /transactionRequests/**_{ID}_ : + +- Callback — [**PUT /transactionRequests/**_{ID}_](#put-transactionrequestsid) +- Callback d’erreur — [**PUT /transactionRequests/**_{ID}_**/error**](#put-transactionrequestsiderror) +- Modèle de données — Corps vide + +##### POST /transactionRequests + +URI alternative : N/A + +Service logique API : [Effectuer une demande de transaction](../generic-transaction-patterns#perform-transaction-request) + +La requête HTTP **POST /transactionRequests** est utilisée pour demander la création d’une demande de transaction financière sur le serveur. + +Callback et modèle de données pour **POST /transactionRequests** : + +- Callback — [**PUT /transactionRequests/**_{ID}_](#put-transactionrequestsid) +- Callback d’erreur — [**PUT /transactionRequests/**_{ID}_**/error**](#put-transactionrequestsiderror) +- Modèle de données — Voir [Tableau 19](#table-19) + +###### Tableau 19 + +|**Nom**|**Cardinalité**|**Type**|**Description**| +|---|---|---|---| +|**transactionRequestId**|1|CorrelationId|Identifiant partagé entre les FSP pour l’objet de la demande de transaction, défini par le FSP bénéficiaire. L’ID doit être réutilisé pour les renvois de la même demande de transaction. Un nouvel ID doit être généré pour chaque nouvelle demande.| +|**payee**|1|Party|Informations sur le bénéficiaire de la transaction financière proposée.| +|**payer**|1|PartyInfo|Informations sur le type de payeur, id, sous-type/id, FSP Id dans la transaction financière proposée.| +|**amount**|1|Money|Montant demandé à transférer du payeur au bénéficiaire.| +|**transactionType**|1|TransactionType|Type de transaction.| +|**note**|0..1|Note|Motif de la demande de transaction, destiné au payeur.| +|**geoCode**|0..1|GeoCode|Longitude et latitude de la partie initiatrice. Peut être utilisé pour détecter une fraude.| +|**authenticationType**|0..1|AuthenticationType|OTP ou code QR, sinon vide.| +|**expiration**|0..1|DateTime|Peut être défini pour obtenir un échec rapide si le FSP pair met trop longtemps à répondre. Il peut aussi être utile pour le consommateur, l’agent ou le commerçant de savoir que leur demande a une durée limitée.| +|**extensionList**|0..1|ExtensionList|Extension optionnelle, spécifique au déploiement.| + +**Tableau 19 — Modèle de données POST /transactionRequests** + +#### Callbacks + +Cette section décrit les callbacks utilisés par le serveur pour la ressource **/transactionRequests**. + +##### PUT /transactionRequests/_{ID}_ + +URI alternative : N/A + +Service logique API : **Retour d’informations de demande de transaction** + +Le callback **PUT /transactionRequests/**_{ID}_ est utilisé pour informer le client d’une demande de transaction créée ou sollicitée. L’_{ID}_ dans l’URI doit contenir le **transactionRequestId** (voir [Tableau 19](#table-19)) utilisé lors de la création de la demande, ou l’_{ID}_ utilisé dans le [**GET /transactionRequests/**_{ID}_](#get-transactionrequestsid). Voir [Tableau 20](#table-20) pour le modèle de données. + +###### Tableau 20 + +|**Nom**|**Cardinalité**|**Type**|**Description**| +|---|---|---|---| +|**transactionId**|0..1|CorrelationId|Identifie la transaction liée (si une transaction a été créée).| +|**transactionRequestState**|1|TransactionRequestState|État de la demande de transaction.| +|**extensionList**|0..1|ExtensionList|Extension optionnelle, spécifique au déploiement.| + +**Tableau 20 — Modèle de données PUT /transactionRequests/_{ID}_** + +#### Callbacks d’erreur + +Cette section décrit les callbacks d’erreur utilisés par le serveur pour la ressource **/transactionRequests**. + +##### PUT /transactionRequests/_{ID}_/error + +URI alternative : N/A + +Service logique API : [Erreur de retour d’informations sur une demande de transaction](../generic-transaction-patterns#return-transaction-request-information-error) + +Si le serveur ne parvient pas à trouver ou créer une demande de transaction, ou si une autre erreur de traitement survient, le callback d’erreur **PUT /transactionRequests/**_{ID}_**/error** est utilisé. L’_{ID}_ de l’URI doit contenir le **transactionRequestId** (voir [Tableau 19](#table-19)) utilisé lors de la création de la demande, ou l’_{ID}_ utilisé dans le [**GET /transactionRequests/**_{ID}_](#get-transactionrequestsid). Voir [Tableau 21](#table-21) pour le modèle de données. + +###### Tableau 21 + +|**Nom**|**Cardinalité**|**Type**|**Description**| +|---|---|---|---| +|**errorInformation**|1|ErrorInformation|Code d’erreur, description de la catégorie.| + +**Tableau 21 — Modèle de données PUT /transactionRequests/_{ID}_/error** + +#### 6.4.6 États + +Les états possibles d’une demande de transaction sont représentés dans la [Figure 46](#figure-46). + +**Note :** Un serveur n’a pas besoin de conserver les objets de demande de transaction qui ont été rejetés dans sa base de données. Cela signifie qu’un client doit s’attendre à recevoir un callback d’erreur pour une demande de transaction rejetée. + +###### Figure 46 + +![Figure 46](../../assets/diagrams/images/figure46.svg) + +**Figure 46 — États possibles d’une demande de transaction** + +
+ +### Ressource API /quotes + +Cette section définit la ressource API logique **Quotes** (« cotations »), décrite dans les [Modèles génériques de transaction](../generic-transaction-patterns#api-resource-quotes). + +Le principal service proposé par la ressource **/quotes** est le calcul des frais éventuels et des commissions FSP liés à la réalisation d’une transaction financière interopérable. Les FSP payeur et bénéficiaire doivent chacun calculer leur part de la cotation pour obtenir une vue globale de tous les frais et commissions applicables à la transaction. + +Une cotation est irrévocable ; elle ne peut pas être modifiée après sa création. Elle peut cependant expirer (toutes les cotations sont valables uniquement jusqu’à leur date d’expiration). + +**Note :** Une cotation n’est pas une garantie que la transaction financière réussira. La transaction peut toujours échouer ultérieurement. Une cotation garantit uniquement que les frais et commissions appliqués à la transaction spécifiée restent valables jusqu’à expiration de la cotation. + +Pour plus d’informations, voir la section [Cotation](#quoting). + +#### Historique des versions de la ressource + +[Tableau 22](#table-22) présente une description de chaque version de la ressource **/quotes**. + +###### Tableau 22 + +|Version|Date|Description| +|---|---|---| +|1.0|2018-03-13|Version initiale| +|1.1|2020-05-19|Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.| + +**Tableau 22 – Historique des versions de la ressource /quotes** + +#### Détails des services + +[Figure 47](#figure-47) présente un exemple de processus pour la ressource API **/quotes**. Cet exemple montre une transaction initiée par le payeur, mais elle peut aussi être initiée par le bénéficiaire, en utilisant la ressource API [**/transactionRequests**](#api-resource-transactionrequests). Dans ce cas, la recherche sera effectuée par le FSP du bénéficiaire. + +###### Figure 47 + +![](../../assets/diagrams/sequence/figure47.svg) + +**Figure 47 — Exemple de processus pour la ressource /quotes** + +#### Détails de l’expiration de la cotation + +La demande de cotation du FSP payeur peut contenir une date d’expiration, si le FSP payeur souhaite indiquer à partir de quand il n’est plus utile pour le FSP bénéficiaire de renvoyer une cotation. Par exemple, la transaction peut expirer ou sa cotation peut expirer. + +Le FSP bénéficiaire doit définir une expiration dans le callback de la cotation pour indiquer à partir de quand elle n’est plus valable pour le FSP payeur. + +#### Rejet d’une cotation + +Le FSP bénéficiaire peut rejeter une demande de cotation émise par le FSP payeur en envoyant le callback d’erreur **PUT /quotes/**_{ID}_/**error** plutôt que le callback **PUT /quotes/**_{ID}_. +Selon le modèle générique de transaction utilisé (voir Section 8 pour plus d’informations), le FSP payeur peut rejeter une cotation en utilisant l’une des méthodes suivantes : + +- Si la transaction est initiée par le payeur (voir Section 8.1), le FSP payeur ne doit pas informer le FSP bénéficiaire du rejet. La cotation créée chez le FSP bénéficiaire doit avoir une date d’expiration, après laquelle elle est automatiquement supprimée. +- Si la transaction est initiée par le bénéficiaire (voir Section 8.2 et 8.3), le FSP payeur doit informer le FSP bénéficiaire du rejet par le callback **PUT /transactionRequests/**_{ID}_ avec un état « rejected ». Le processus est décrit plus en détail à la Section 6.4.2.1. + +#### Demande de paiement Interledger + +Dans le cadre de la prise en charge d’Interledger et de l’implémentation concrète de la demande de paiement Interledger (voir [Protocole Interledger](#interledger-protocol)), le FSP bénéficiaire doit : + +- Déterminer l’adresse ILP (voir [Adresses ILP](#ILP-addressing) pour plus d’informations) du bénéficiaire et le montant qu’il recevra. Notez que puisque l’élément **amount** dans le paquet ILP est défini comme un UInt64 (donc valeur entière), le montant doit être multiplié par l’exposant de la devise (par exemple, l’exposant de l’USD est 2, donc le montant doit être multiplié par 102, et celui du JPY est 0, donc multiplié par 100). L’adresse ILP et le montant doivent être renseignés dans le paquet ILP (voir [ILP Packet](#ilp-packet) pour plus d’informations). + +- Renseigner l’élément **data** dans le paquet ILP par le modèle de données [Transaction](#transaction). +- Générer la fulfilment et la condition (voir [Transferts conditionnels](#conditional-transfers) pour plus de détails). Renseigner l’élément **condition** dans le [PUT /quotes/**_{ID}_](#put-quotes-id)). Le [Tableau 19](#table-19) montre le modèle de données avec la condition générée. + +La fulfilment est un secret temporaire généré pour chaque transaction financière par le FSP bénéficiaire et utilisé comme déclencheur pour valider les transferts constituant un paiement ILP. + +Le FSP bénéficiaire utilise un secret local pour générer un HMAC SHA-256 du paquet ILP. Le même secret peut être utilisé pour toutes les transactions financières, ou le FSP bénéficiaire peut stocker un secret différent par bénéficiaire ou selon une autre segmentation. + +Le choix et la cardinalité du secret local sont une décision d’implémentation, qui peut être dictée par les règles du schéma. Le seul prérequis est que le FSP bénéficiaire puisse déterminer à quel secret correspond un paquet ILP reçu ultérieurement dans le cadre d’un transfert entrant (voir [Ressource API Transfers](#api-resource-transfers)). + +La fulfilment et la condition sont générées conformément à l’algorithme défini dans le [Listing 12](#listing-12). Une fois que le FSP bénéficiaire a dérivé la condition, la fulfilment peut être supprimée puisqu’elle peut être régénérée plus tard. + +###### Listing 12 + +Génération du fulfilment (accomplissement) et de la condition + +**Entrées :** + +- Secret local (chaîne binaire de 32 octets) +- Paquet ILP + +**Algorithme :** + +1. Le fulfilment est obtenu en exécutant l’algorithme HMAC SHA-256 sur le paquet ILP en utilisant le secret local comme clé. + +2. La condition est obtenue en exécutant l’algorithme de hachage SHA-256 sur le fulfilment. + +**Sorties :** + +- Fulfilment (chaîne binaire de 32 octets) +- Condition (chaîne binaire de 32 octets) + +**Listing 12 -- Algorithme pour générer le fulfilment et la condition** + +#### Requêtes + +Cette section décrit les services pouvant être demandés par un client de l’API sur la ressource **/quotes**. + +##### GET /quotes/_{ID}_ + +URI alternative : N/A + +Service logique de l’API : [Récupérer les informations de la cotation](../generic-transaction-patterns#retrieve-quote-information) + +La requête HTTP **GET /quotes/**_{ID}_ permet d’obtenir des informations sur une cotation préalablement créée ou demandée. Le _{ID}_ dans l’URI doit contenir le **quoteId** (voir [Tableau 23](#table-23)) qui a été utilisé pour la création de la cotation. + +Informations sur les callbacks et le modèle de données pour **GET /quotes/**_{ID}_ : + +- Callback -- [**PUT /quotes/**_{ID}_](#put-quotes-id) +- Callback d’erreur -- [**PUT /quotes/**_{ID}_**/_error_**](#put-quotes-iderror) +- Modèle de données -- Corps vide + +##### POST /quotes + +URI alternative : N/A + +Service logique de l’API : [Calculer les informations de la cotation](../generic-transaction-patterns#calculate-quote-information) + +La requête HTTP **POST /quotes** est utilisée pour demander la création d’une cotation pour la transaction financière fournie sur le serveur. + +Informations sur les callbacks et le modèle de données pour **POST /quotes** : + +- Callback -- [**PUT /quotes/**_{ID}_](#put-quotes-id) +- Callback d’erreur -- [**PUT /quotes/**_{ID}_**/error**](#put-quotes-iderror) +- Modèle de données -- Voir [Tableau 23](#table-23) + +###### Tableau 23 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| --- | --- | --- | --- | +| **quoteId** | 1 | CorrelationId | Identifiant commun entre les FSPs pour l’objet cotation, décidé par le FSP du payeur. Cet ID doit être réutilisé pour les renvois de la même cotation pour une transaction. Un nouvel ID doit être généré pour chaque nouvelle cotation pour une transaction. | +| **transactionId** | 1 | CorrelationId | Identifiant commun (décidé par le FSP du payeur) entre les FSPs pour l’objet de la future transaction. La transaction réelle sera créée dans le cadre d’un processus de transfert réussi. L’ID doit être réutilisé pour les renvois de la même cotation pour une transaction. Un nouvel ID doit être généré pour chaque nouvelle cotation pour une transaction. | +| **transactionRequestId** | 0..1 | CorrelationId | Identifie une demande de transaction optionnelle envoyée précédemment. | +| **payee** | 1 | Party | Informations concernant le bénéficiaire de la transaction financière proposée. | +| **payer** | 1 | Party | Informations concernant le payeur de la transaction financière proposée. | +| **amountType** | 1 | AmountType |**SEND** pour montant envoyé, **RECEIVE** pour montant reçu. | +| **amount** | 1 | Money | Selon **amountType** :
Si **SEND** : Le montant que le payeur souhaite envoyer ; c’est-à-dire le montant à prélever du compte payeur, frais inclus. Le montant est mis à jour par chaque entité participant à la transaction.
Si **RECEIVE** : Le montant que le bénéficiaire doit recevoir ; c’est-à-dire le montant qui doit être envoyé au destinataire, frais exclus. Le montant n’est pas mis à jour par les entités participantes.
| +| **fees** | 0..1 | Money | Frais associés à la transaction.
  • L’élément fees doit être vide si les frais ne doivent pas être divulgués.
  • L’élément fees doit être renseigné si les frais doivent être divulgués.
  • | +| **transactionType** | 1 | TransactionType | Type de transaction pour laquelle la cotation est demandée. | +| **geoCode** | 0..1 | GeoCode | Longitude et latitude de la partie initiatrice. Peut être utilisé pour détecter la fraude. | +| **note** | 0..1 | Note | Mémo à joindre à la transaction. | +| **expiration** | 0..1 | DateTime | L’expiration est optionnelle. Elle peut être fixée afin d’obtenir un échec rapide si le FSP pair met trop de temps à répondre. Elle peut également être utile pour que le consommateur, l’agent ou le commerçant sache que leur demande a une limite de temps. | +| **extensionList** | 0..1 | ExtensionList | Extension optionnelle, spécifique au déploiement. | + +**Tableau 23 -- Modèle de données POST /quotes** + +#### Callbacks + +Cette section décrit les callbacks utilisés par le serveur sous la ressource **/quotes**. + +#### PUT /quotes/_{ID}_ + +URI alternative : N/A + +Service logique de l’API : [Retourner les informations de la cotation](../generic-transaction-patterns#return-quote-information) + +Le callback **PUT /quotes/**_{ID}_ est utilisé pour informer le client d’une cotation demandée ou créée. Le _{ID}_ dans l’URI doit contenir le **quoteId** (voir [Tableau 23](#table-23)) qui a été utilisé pour la création de la cotation, ou le _{ID}_ utilisé dans le [**GET /quotes/**_{ID}_](#get-quotesid). Voir [Tableau 24](#table-24) pour le modèle de données. + +###### Tableau 24 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| --- | --- | --- | --- | +| **transferAmount** | 1 | Money | Le montant que le FSP payeur doit transférer au FSP bénéficiaire. | +| **payeeReceiveAmount** | 0..1 | Money | Le montant que le bénéficiaire doit recevoir dans la transaction de bout en bout. Optionnel si le FSP bénéficiaire ne souhaite pas divulguer de potentiels frais au bénéficiaire. | +| **payeeFspFee** | 0..1 | Money | Partie des frais de la transaction imputée au FSP bénéficiaire. | +| **payeeFspCommission** | 0..1 | Money | Commission du FSP bénéficiaire sur la transaction. | +| **expiration** | 1 | DateTime | Date et heure jusqu’à laquelle la cotation est valide et peut être honorée lorsqu’elle est utilisée dans la transaction suivante. | +| **geoCode** | 0..1 | GeoCode | Longitude et latitude du bénéficiaire. Peut être utilisé pour détecter la fraude. | +| **ilpPacket** | 1 | IlpPacket | Le paquet ILP qui doit être joint au transfert par le payeur. | +| **condition** | 1 | IlpCondition | La condition qui doit être jointe au transfert par le payeur. | +| **extensionList** | 0..1 | ExtensionList | Extension optionnelle, spécifique au déploiement. | + +**Tableau 24 -- Modèle de données PUT /quotes/_{ID}_** + +#### Callbacks d’erreur + +Cette section décrit les callbacks d’erreur utilisés par le serveur +sous la ressource **/quotes**. + +##### PUT /quotes/_{ID}_/error + +URI alternative : N/A + +Service logique de l’API : [Retourner une erreur d’information de cotation](../generic-transaction-patterns#return-quote-information-error) + +Si le serveur ne parvient pas à trouver ou créer une cotation, ou qu’une autre erreur de traitement se produit, le callback d’erreur **PUT** **/quotes/**_{ID}_**/error** est utilisé. Le _{ID}_ dans l’URI doit contenir le **quoteId** (voir [Tableau 23](#table-23)) utilisé pour la création de la cotation, ou le _{ID}_ utilisé dans le [**GET /quotes/**_{ID}_](#get-quotesid). Voir [Tableau 25](#table-25) pour le modèle de données. + +###### Tableau 25 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| --- | --- | --- | --- | +| **errorInformation** | 1 | ErrorInformation | Code d’erreur, description de la catégorie.| + +**Tableau 25 -- Modèle de données PUT /quotes/_{ID}_/error** + +#### États + +###### Figure 48 + +[Figure 48](#figure-48) contient la machine à états UML (Unified Modeling Language) pour les états possibles d’un objet cotation. + +**Remarque :** Un serveur n’a pas besoin de conserver en base les objets cotation ayant été rejetés ou expirés. Cela signifie qu’un client doit s’attendre à ce qu’un callback d’erreur puisse être retourné pour une cotation expirée ou rejetée. + +![Figure 48](../../assets/diagrams/images/figure48.svg) + +**Figure 48 -- États possibles d’une cotation** + +
    + +### Ressource d’API /authorizations + +Cette section définit la ressource logique d’API **Authorizations**, décrite dans [Modèles de transaction génériques](../gerneric-transaction-patterns#api-resource-authorizations). + +La ressource **/authorizations** est utilisée pour demander au payeur de saisir les identifiants applicables dans le système du FSP bénéficiaire pour approuver la transaction financière, lorsqu’il a initié la transaction depuis un POS, un DAB ou similaire, dans le système du FSP bénéficiaire et souhaite autoriser via un OTP. + +#### Historique des versions de la ressource + +[Tableau 26](#table-26) décrit les différentes versions de la ressource **/authorizations**. + +###### Tableau 26 + +|Version|Date|Description| +|---|---|---| +|1.0|2018-03-13|Version initiale| + +**Tableau 26 – Historique des versions de la ressource /authorizations** + +#### Détails des services + +[Figure 49](#figure-49) présente un exemple de processus pour la ressource API **/authorizations**. Le FSP bénéficiaire envoie d’abord une [demande de transaction](#api-resource-transactionrequests)) qui est autorisée via OTP. Le FSP payeur réalise ensuite la cotation (voir [Ressource API Quotes](#api-resource-quotes)) avant qu’une demande d’autorisation soit envoyée au système du FSP bénéficiaire pour que le payeur approuve via la saisie de l’OTP. Si l’OTP est correct, le processus de transfert doit être initié (voir [Ressource API Transfers](#api-resource-transfers)). + +###### Figure 49 + +![](../../assets/diagrams/sequence/figure49.svg) + + +**Figure 49 -- Exemple de processus pour la ressource /authorizations** + +#### Renvoi de la valeur d’autorisation + +Si la notification contenant la valeur d’autorisation n’atteint pas le payeur, celui-ci peut demander le renvoi de la valeur d’autorisation si le POS, le DAB ou appareil similaire propose cette option. Voir [Figure 50](#figure-50) pour un exemple où le payeur demande un renvoi de l’OTP. + +###### Figure 50 + +![](../../assets/diagrams/sequence/figure50.svg) + + +**Figure 50 -- Le payeur demande le renvoi de la valeur d’autorisation (OTP)** + +##### Tentative de saisie de la valeur d’autorisation + +Le FSP payeur doit décider du nombre de tentatives autorisées pour la saisie de la valeur d’autorisation sur le POS, DAB ou appareil similaire. Ce nombre est fixé dans la chaîne de requête **retriesLeft** (voir [Syntaxe URI](#uri-syntax) pour plus de détails) dans le service [**GET** **/authorizations/**_{ID}_](#get-authorizationsid). Si le FSP payeur envoie retriesLeft=1, cela signifie qu’il s’agit de la dernière tentative autorisée par le payeur. Voir [Figure 51](#figure-51) pour un exemple où le payeur saisit un OTP incorrect et où la valeur **retriesLeft** est alors décrémentée. + +###### Figure 51 + +![](../../assets/diagrams/sequence/figure51.svg) + + +**Figure 51 -- Le payeur saisit une valeur d’autorisation incorrecte (OTP)** + +##### Échec de l’autorisation OTP + +Si l’utilisateur échoue à saisir le bon OTP dans le nombre de tentatives autorisées, le processus décrit dans [Demande de transaction rejetée par le payeur](#payer-rejected-transaction-request) est suivi. + +#### Requêtes + +Cette section décrit les services pouvant être demandés par un client de l’API sur la ressource **/authorizations**. + +##### GET /authorizations/_{ID}_ + +URI alternative : N/A + +Service logique d’API : [Réaliser l’autorisation](../generic-transaction-patterns#perform-authorization) + +La requête HTTP **GET /authorizations/**_{ID}_ est utilisée pour demander au payeur de saisir les identifiants dans le système du FSP bénéficiaire. Le _{ID}_ dans l’URI doit contenir le **transactionRequestID** (voir [Tableau 15](#table-15)), obtenu via le service [**POST** **/transactionRequests**](#post-transactionrequests)) plus tôt dans le processus. + +Cette requête nécessite que la chaîne de requête (voir [Syntaxe URI](#uri-syntax) pour plus d’infos) contienne les paires clé-valeur suivantes : + +- **authenticationType=**_{Type}_, où _{Type}_ est une valeur valide de l’énumération [AuthenticationType](#authenticationtype). +- **retriesLeft=**_{NrOfRetries}_, où _{NrOfRetries}_ est le nombre de tentatives restantes avant le rejet de la transaction financière. _{NrOfRetries}_ doit être exprimé via le type de données [Integer](#integer)). **retriesLeft=1** signifie qu’il s’agit de la dernière tentative. +- **amount=**_{Amount}_, où _{Amount}_ est le montant de la transaction qui sera prélevé du compte du payeur. _{Amount}_ doit être de type [Amount](#amount). +- **currency=**_{Currency}_, où _{Currency}_ est la devise de la transaction. La valeur _{Currency}_ doit être conforme à l’énumération [CurrencyCode](#currencycode)). + +Exemple d’URI contenant toutes les clés requises : + +**GET /authorization/3d492671-b7af-4f3f-88de-76169b1bdf88?authenticationType=OTP&retriesLeft=2&amount=102¤cy=USD** + +Informations sur les callbacks et le modèle de données pour **GET /authorization/**_{ID}_ : + +- Callback - [**PUT /authorizations/**_{ID}_](#6641-put-authorizationsid) +- Callback d’erreur - [**PUT /authorizations/**_{ID}_**/error**](#6651-put-authorizationsiderror) +- Modèle de données -- Corps vide + +#### 6.6.4 Callbacks + +Cette section décrit les callbacks utilisés par le serveur sous la ressource **/authorizations**. + +#### 6.6.4.1 PUT /authorizations/_{ID}_ + +URI alternative : N/A + +Service logique d’API : [Retourner le résultat de l’autorisation](../generic-transaction-patterns#return-authorization-result) + +Le callback **PUT /authorizations/** _{ID}_ est utilisé pour informer le client du résultat d’une autorisation précédemment demandée. Le _{ID}_ dans l’URI doit contenir l’identifiant utilisé dans le [**GET /authorizations/**_{ID}_](#get-authorizationsid). **Voir** [Tableau 27](#table-27) **pour** le modèle de données. + +###### Tableau 27 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| --- | --- | --- | --- | +| **authenticationInfo** | 0..1 | AuthenticationInfo | OTP ou code QR si renseigné, sinon vide. | +| **responseType** | 1 | AuthorizationResponse | Enum contenant le résultat : si le client a saisi la valeur d’authentification, a rejeté la transaction ou a demandé le renvoi de la valeur d’authentification. | + +**Tableau 27 – Modèle de données PUT /authorizations/{ID}** + +#### Callbacks d’erreur + +Cette section décrit les callbacks d’erreur utilisés par le serveur sous la ressource **/authorizations**. + +#### PUT /authorizations/_{ID}_/error + +URI alternative : N/A + +Service logique d’API : [Retourner une erreur d’autorisation](../generic-transaction-patterns#return-authorization-error) + +Si le serveur ne trouve pas la demande de transaction, ou une autre erreur de traitement survient, le callback d’erreur **PUT** **/authorizations/**_{ID}_ **/error** est utilisé. Le _{ID}_ dans l’URI doit être celui utilisé dans le [**GET /authorizations/**_{ID}_](#get-authorizationsid). **Voir** [Tableau 28](#table-28) **pour** le modèle de données. + +###### Tableau 28 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| --- | --- | --- | --- | +| **errorInformation** | 1 | ErrorInformation | Code d’erreur, description de la catégorie | + +**Tableau 28 -- Modèle de données PUT /authorizations/_{ID}_/error** + +#### États + +Aucun état n’est défini pour la ressource **/authorizations**. + +
    + +### Ressource d’API /transfers + +Cette section définit la ressource logique d’API **Transfers**, décrite dans [Modèles de transaction génériques](../generic-transation-patterns#api-resource-transfers). + +Les services fournis par la ressource d’API **/transfers** servent à effectuer le(s) transfert(s) ILP hop-by-hop et à réaliser la transaction financière de bout en bout en envoyant les détails de transaction du FSP payeur au FSP bénéficiaire. Les détails de la transaction sont envoyés en tant que partie du modèle de données de transfert dans le paquet ILP. + +Le protocole Interledger suppose que la mise en place d’une transaction financière se fait via un protocole de bout en bout, mais qu’un transfert ILP est réalisé via des protocoles hop-by-hop entre FSPs connectés au même registre. Dans la version actuelle de l’API, la ressource **/quotes** établit la transaction financière. Avant de réaliser un transfert, la cotation doit être effectuée pour préparer la transaction. Voir [Ressource API Quotes](#api-resource-quotes) pour plus d’informations. + +Un transfert ILP s’effectue entre deux détenteurs de comptes sur chaque côté d’un registre commun. Il s’exprime généralement par une demande d’exécution d’un transfert sur le registre et une notification au bénéficiaire que le transfert est réservé en sa faveur, incluant une condition devant être remplie pour commettre le transfert. + +Quand le FSP bénéficiaire présente le fulfilment au registre commun, le transfert est commis sur le registre. Simultanément, le FSP payeur est notifié que le transfert a été commis ainsi que du fulfilment. + +#### Historique des versions de la ressource + +Le Tableau 29 décrit les différentes versions de la ressource **/transfers**. + +| Version | Date | Description| +| ---- | ---- | ---- | +| **1.0** | 2018-03-13 | Version initiale | +| **1.1** | 2020-05-19 | Ajout du support des notifications de commit via la méthode HTTP **PATCH**. La nouvelle requête **PATCH /transfers/{ID}** est décrite en Section 6.7.3.3. Le processus d’utilisation des notifications de commit est décrit en Section 6.7.2.6.

    Le modèle de données est mis à jour pour inclure un élément ExtensionList optionnel au type complexe PartyIdInfo (voir Change Request : [https://github.com/mojaloop/mojaloop-specification/issues/30](https://github.com/mojaloop/mojaloop-specification/issues/30)). Suite à cela, le modèle de données du Tableau 93 a été mis à jour.| + +**Tableau 29 –- Historique des versions pour la ressource /transfers** + +#### Détails des services + +Cette section fournit des détails concernant les transferts hop-by-hop et les transactions financières de bout en bout. + +#### Processus + +[Figure 52](#figure-52) illustre le fonctionnement du processus transactionnel utilisant le service **POST /transfers**. + +###### Figure 52 + +![](../../assets/diagrams/sequence/figure52.svg) + + +**Figure 52 -- Utilisation du service POST /transfers** + +#### Irrévocabilité des transactions + +L’API est conçue pour ne supporter que les transactions financières irrévocables ; c’est-à-dire qu’une transaction ne peut pas être modifiée, annulée ou inversée après sa création. Cela vise à simplifier et réduire les coûts pour les FSPs utilisant l’API. Une grande partie du coût opérationnel des systèmes financiers est due à l’inversion des transactions. + +Dès qu’un FSP payeur envoie une transaction au FSP bénéficiaire (via **POST /transfers** incluant la transaction de bout en bout), la transaction est irrévocable côté FSP payeur. Elle peut toutefois encore être rejetée côté FSP bénéficiaire, mais le payeur ne peut plus modifier ou rejeter la transaction. Une exception à cela serait si le délai d’expiration du transfert est dépassé avant que le FSP bénéficiaire ne réponde (voir [Quote expirée](#expired-quote) et [Client recevant un transfert expiré](#client-receiving-expired-transfer) pour plus d’informations). Dès que la transaction a été acceptée par le FSP bénéficiaire, elle est irrévocable pour toutes les parties. + +#### Cotation expirée + +Si un serveur reçoit une transaction utilisant une cotation expirée, il doit refuser le transfert ou la transaction. + +#### Timeout et expiration + +Le FSP payeur doit toujours définir un temps d’expiration pour le transfert afin de permettre les cas d’utilisation nécessitant un traitement ou un échec rapide. Si le cas d’utilisation ne nécessite pas de réponse rapide, un délai d’expiration plus long peut être fixé. Si le FSP bénéficiaire ne répond pas avant le temps d’expiration, la transaction est annulée côté FSP payeur. Ce dernier doit cependant s’attendre à un callback du bénéficiaire. + +Les délais d’expiration courts sont souvent requis dans le commerce de détail, où un client se trouve devant un commerçant ; les deux parties doivent savoir si la transaction a réussi avant la remise d’un produit ou service. + +Dans [Figure 52](#figure-52), un délai d’expiration de 30 secondes à partir de l’heure courante a été défini dans la requête du FSP payeur, et de 20 secondes dans la requête du Switch au FSP bénéficiaire. Cette stratégie de réduction du délai à chaque maillon de la chaîne du FSP payeur au bénéficiaire doit toujours être utilisée pour permettre un délai de communication supplémentaire. + +**Remarque :** Il est possible qu’un callback de succès soit reçu par le FSP payeur après l’expiration, par exemple lors d’une congestion réseau. Le FSP payeur devrait laisser un délai supplémentaire après l’expiration avant d’annuler la transaction dans le système. Si un callback de succès arrive après annulation, la transaction doit être marquée pour rapprochement et traitée à part. + +#### Client recevant un transfert expiré + +[Figure 53](#figure-53) illustre un scénario d’erreur lié à l’expiration et au timeout. Pour une raison quelconque, le callback du FSP bénéficiaire prend plus de temps à arriver que le délai d’expiration dans le Switch. Cela conduit le Switch à annuler le transfert réservé et à envoyer un callback d’erreur au FSP payeur. Ainsi, FSP payeur et bénéficiaire ont deux visions différentes du résultat de la transaction ; celle-ci doit être marquée pour rapprochement. + +###### Figure 53 + +![](../../assets/diagrams/sequence/figure53.svg) + + +**Figure 53 -- Client recevant un transfert expiré** + +Pour limiter ce type d’erreur, les clients (FSP payeur et Switch optionnel dans la [Figure 52](#figure-52)) participant au transfert ILP doivent permettre un délai supplémentaire post expiration permettant de recevoir le callback du serveur. Le(s) client(s) doivent aussi interroger le serveur après expiration et avant la fin du délai supplémentaire en cas de perte du callback. Un rapprochement pourrait néanmoins rester nécessaire, même avec ce délai et une interrogation du serveur. + +#### Notification de commit + +Comme alternative pour éviter le scénario d’erreur décrit dans [Client recevant un transfert expiré](#client-receiving-expired-transfer), pour les cas où il est compliqué d’effectuer un remboursement, un FSP bénéficiaire peut (si le schéma le permet) réserver le transfert puis attendre la notification de commit émise par le Switch. Demander une notification de commit plutôt qu’un commit direct relève de la décision métier du FSP bénéficiaire (si le schéma l’autorise), selon le contexte de la transaction. Par exemple, un retrait cash ou un paiement commerçant est plus risqué qu’un transfert P2P du fait de la difficulté de remboursement a posteriori. +Pour demander la notification de commit depuis le Switch, le FSP bénéficiaire doit marquer l’état du transfert (voir Section 6.7.6) comme réservé (reserved) au lieu de commis (committed) dans le callback **PUT /transfers/**_{ID}_ . Selon l’état, le Switch doit alors effectuer : + +- Si le transfert est commis, le Switch n’envoie pas de notification de commit puisque le FSP bénéficiaire a déjà accepté le risque. C’est la méthode de commit par défaut décrite dans [Processus](#process). +- Si le transfert est réservé, le Switch doit envoyer une notification de commit au FSP bénéficiaire à la fin du traitement (commit ou annulation). + +La notification de commit est envoyée avec la requête **PATCH /transfers/**_{ID}_ du Switch au FSP bénéficiaire. Si ce dernier ne reçoit pas la notification dans un délai raisonnable, il doit renvoyer le callback **PUT /transfers/**_{ID}_ au Switch. Le FSP bénéficiaire doit recevoir la notification de commit du Switch avant de commettre le transfert, ou accepter le risque que le transfert ait échoué côté Switch. Il n’a pas le droit de rollbacker sans avoir reçu un état "aborted" (voir Section 6.7.6) du Switch, car il a déjà envoyé le fulfilment (déclencheur du commit). +[Figure 54](#figure-54) illustre un cas où une notification de commit est demandée. Ici, le commit a réussi côté Switch. + +###### Figure 54 + +![](../../assets/diagrams/sequence/figure54.svg) + + +**Figure 54 -- Notification de commit après succès du transfert dans le Switch** + +[Figure 55](#figure-55) montre un exemple où le commit dans le Switch a échoué (par exemple expiration du délai dans le Switch à cause d’un incident réseau). C’est le même scénario que [Figure 53](#figure-53), mais sans rapprochement à réaliser car le FSP bénéficiaire reçoit la notification de commit avant de réaliser effectivement le transfert. + +###### Figure 55 + +![](../../assets/diagrams/sequence/figure55.svg) + + +**Figure 55 -- Notification de commit après échec du commit dans le Switch** + +#### Remboursements + +Au lieu de supporter les inversions, l’API supporte les remboursements. Pour rembourser une transaction via l’API, une nouvelle transaction doit être créée par le bénéficiaire initial. Celle-ci doit annuler la transaction originale (en totalité ou partiellement) ; par exemple, si le client X a envoyé 100 USD au commerçant Y, celui-ci crée une nouvelle transaction pour reverser 100 USD à X. Il existe un type de transaction spécifique pour indiquer un remboursement ; cela permet de gérer différemment la cotation. L’ID de la transaction d’origine doit être inclus dans la nouvelle transaction à des fins d’information et de rapprochement. + +#### Demande de paiement Interledger + +Dans le cadre du support d’Interledger et de la demande de paiement Interledger (voir [Protocole Interledger](#interledger-protocol)), le FSP payeur doit joindre au transfert le paquet ILP, la condition ainsi qu’une date d’expiration. La condition et le paquet ILP sont les mêmes que ceux envoyés par le FSP bénéficiaire dans le callback de la cotation ; voir [Demande de paiement Interledger](#interledger-payment-request) pour plus d’informations. + +Le paiement ILP de bout en bout est une chaîne d’un ou plusieurs transferts conditionnels tous dépendants de la même condition. La condition est fournie par le FSP payeur lors de l’initiation du transfert vers le prochain ledger. + +Le récepteur du transfert extrait l’adresse ILP du bénéficiaire dans le paquet ILP et effectue un autre transfert sur le ledger suivant, en joignant le même paquet ILP et condition et en fixant une expiration plus courte que celle du transfert entrant. + +Quand le FSP bénéficiaire reçoit le dernier transfert entrant pour le compte du bénéficiaire, il extrait le paquet ILP et procède ainsi : + +1. Valide que l’adresse ILP du bénéficiaire dans le paquet ILP correspond au compte bénéficiaire de destination. +2. Valide que le montant dans le paquet ILP correspond au montant du transfert et déclenche la réservation sur le registre local (moins les éventuels frais cachés au bénéficiaire, voir [Cotations](#quoting)). +3. Si la réservation est un succès, le FSP bénéficiaire génère le fulfilment à l’aide du même algorithme que celui utilisé pour générer la condition envoyée dans le callback de la cotation (voir [Demande de paiement Interledger](#interledger-payment-request)). +4. Le fulfilment est soumis au registre du FSP bénéficiaire pour engager la réservation en faveur du bénéficiaire. Le registre valide que le hash SHA-256 du fulfilment correspond à la condition du transfert. Si oui, il valide la transaction. Sinon, il la rejette, et le FSP bénéficiaire annule la réservation préalablement effectuée. + +Le fulfilment est ensuite transmis au FSP payeur via la même chaîne de registres dans le callback du transfert. Chaque ledger engage les fonds après validation du fulfilment, et l’entité initiatrice est notifiée que ses fonds ont été libérés et reçoit le fulfilment. + +Le dernier transfert à engager est celui sur le registre du FSP payeur, où la réservation est déduite de son compte. Le FSP payeur notifie alors le payeur du succès de la transaction. + +#### Requêtes + +Cette section décrit les services pouvant être demandés par un client de l’API sur la ressource **/transfers**. + +##### GET /transfers/_{ID}_ + +URI alternative : N/A + +Service logique d’API : [Retourner le résultat de l’autorisation](../generic-transaction-patterns#return-authorization-result) + +La requête HTTP **GET /transfers/**_{ID}_ est utilisée pour obtenir des informations sur un transfert créé ou demandé précédemment. Le _{ID}_ dans l’URI doit contenir le **transferId** (voir [Tableau 23](#table-23)) utilisé lors de la création du transfert. + +Informations sur les callbacks et modèle de données pour **GET /transfers/**_{ID}_ : + +- Callback -- [**PUT /transfers/**_{ID}_](#put-transfersid) +- Callback d’erreur -- [**PUT /transfers/**_{ID}_**/error**](#put-transfersiderror) +- Modèle de données -- Corps vide + +##### POST /transfers + +URI alternative : N/A + +Service logique d’API : [Effectuer le transfert](../generic-transaction-patterns#perform-transfer) + +La requête HTTP **POST /transfers** est utilisée pour demander la création d’un transfert pour le prochain ledger, et une transaction financière pour le FSP bénéficiaire. + +Informations sur les callbacks et modèle de données pour **POST /transfers** : + +- Callback -- [**PUT /transfers/**_{ID}_](#put-transfersid) +- Callback d’erreur -- [**PUT /transfers/**_{ID}_**/error**](#put-transfersiderror) +- Modèle de données -- Voir [Tableau 30](#table-30) + +###### Tableau 30 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| --- | --- | --- | --- | +| **transferId** | 1| CorrelationId | Identifiant commun entre les FSPs et le Switch optionnel pour l’objet de transfert, défini par le FSP payeur. À réutiliser pour les rééditions, à régénérer pour chaque nouveau transfert. | +| **payeeFsp** | 1 | FspId | FSP bénéficiaire dans la transaction financière proposée. | +| **payerFsp** | 1 | FspId | FSP payeur dans la transaction financière proposée. | +| **amount** | 1 | Money | Montant à transférer. | +| **ilpPacket** | 1 | IlpPacket | Paquet ILP contenant le montant remis au bénéficiaire, l’adresse ILP du bénéficiaire et toutes données end-to-end. | +| **condition** | 1 | IlpCondition | Condition devant être remplie pour engager le transfert. | +| **expiration** | 1 | DateTime | L’expiration permet de générer un échec rapide si besoin. Le transfert doit être annulé si aucun fulfilment n’est délivré avant cette limite. | +| **extensionList** | 0..1 | ExtensionList | Extension optionnelle, spécifique au déploiement. | + +**Tableau 30 – Modèle de données POST /transfers** + +##### PATCH /transfers/_{ID}_ + +URI alternative : N/A + +Service logique d’API : [Notification de commit](../generic-transaction-patterns#commit-notification) + +La requête HTTP **PATCH /transfers/**_{ID}_ est utilisée par un Switch pour mettre à jour l’état d’un transfert réservé si le FSP bénéficiaire a demandé une notification de commit, une fois le traitement terminé côté Switch. Le _{ID}_ doit contenir le transferId (voir Tableau 30) utilisé pour la création du transfert. Notez que cette requête ne génère pas de callback. Voir Tableau 31 pour le modèle de données. + +###### Tableau 31 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| --- | --- | --- | --- | +| **completedTimestamp** | 1| DateTime | Date et heure d’achèvement de la transaction | +| **transferState** | 1 | TransferState | État du transfert | +| **extensionList** | 0..1 | ExtensionList | Extension optionnelle, spécifique au déploiement. | + +**Tableau 31 – Modèle de données PATCH /transfers/_{ID}_** + +#### Callbacks + +Cette section décrit les callbacks utilisés par le serveur sous la ressource **/transfers**. + +##### PUT /transfers/_{ID}_ + +URI alternative : N/A + +Service logique d’API : [Retourner les informations du transfert](../generic-transaction-patterns#return-transfer-information) + +Le callback **PUT /transfers/**_{ID}_ est utilisé pour informer le client d’un transfert demandé ou créé. Le _{ID}_ dans l’URI doit contenir le **transferId** (voir [Tableau 30](#table-30)) utilisé à la création ou celui utilisé dans le [**GET** **/transfers/**_{ID}_](#6731-get-transfersid). **Voir** [Tableau 32](#table-32) **pour** le modèle de données. + +**Remarque** : pour les callbacks **PUT /transfers/**_{ID}_ , l’état ABORTED n’est pas une option valide pour le champ **transferState** en Tableau 32. Si un transfert doit être rejeté, l’émetteur du callback doit utiliser un callback d’erreur, c’est-à-dire callback sur l’endpoint /error. Cependant, l’état ‘ABORTED’ est valide en réponse à un appel **GET /transfers/**_{ID}_ . + +###### Tableau 32 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| --- | --- | --- | --- | +| **fulfilment** | 0..1 | IlpFulfilment | Fulfilment (accomplissement) de la condition spécifiée avec la transaction. Obligatoire en cas de succès du transfert. | +| **completedTimestamp** | 0..1 | DateTime | Date et heure d’achèvement de la transaction | +| **transferState** | 1 | TransferState | État du transfert | +| **extensionList** | 0..1 | ExtensionList | Extension optionnelle, spécifique au déploiement | + +**Tableau 32 -- Modèle de données PUT /transfers/_{ID}_** + +#### Callbacks d’erreur + +Cette section décrit les callbacks d’erreur utilisés par le serveur sous la ressource **/transfers**. + +##### PUT /transfers/_{ID}_/error + +URI alternative : N/A + +Service logique d’API : [Retourner une erreur d’information de transfert](../generic-transaction-patterns#return-transfer-information-error) + +Si le serveur ne trouve pas ou ne crée pas un transfert, ou qu’une autre erreur de traitement survient, le callback d’erreur **PUT** + +**/transfers/**_{ID}_**/error** est utilisé. Le _{ID}_ dans l’URI doit être le **transferId** (voir [Tableau 30](#table-30)) utilisé lors de la création du transfert, ou celui utilisé dans le [**GET /transfers/**_{ID}_](#6731-get-transfersid). Voir [Tableau 33](#table-33) pour le modèle de données. + +###### Tableau 33 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| --- | --- | --- | --- | +| **errorInformation** | 1 | ErrorInformation | Code d’erreur, description de la catégorie. | + +**Tableau 33 -- Modèle de données PUT /transfers/_{ID}_/error** + +**6.7.6 États** + +###### Figure 56 + +Les états possibles d’un transfert sont représentés dans [Figure 56](#figure-56). + +![Figure 56](../../assets/diagrams/images/figure56.svg) + +**Figure 56 -- États possibles d’un transfert** + +
    + + +### Ressource d’API /transactions + +Cette section définit la ressource logique d’API **Transactions**, décrite dans [Modèles de transaction génériques](../generic-transaction-patterns#api-resource-transactions). + +Les services fournis par la ressource **/transactions** permettent d’obtenir des informations sur la transaction financière de bout en bout exécutée ; par exemple, obtenir les détails d’un éventuel code/ticket généré lors de la transaction. + +La transaction financière réelle est exécutée via la ressource d’API [**/transfers**](#67-api-resource-transfers), qui inclut la transaction de bout en bout entre le FSP payeur et le FSP bénéficiaire. + +#### Historique des versions de la ressource + +[Tableau 34](#table-34) décrit les différentes versions de la ressource **/transactions**. + +###### Tableau 34 + +|Version|Date|Description| +|---|---|---| +|1.0|2018-03-13|Version initiale| + +**Tableau 34 – Historique des versions de la ressource /transactions** + +#### Détails des services + +[Figure 57](#figure-57) montre un exemple du processus de transaction. La transaction réelle sera exécutée lors du processus de transfert. Le service **GET /transactions/**_{TransactionID}_ peut ensuite être utilisé pour obtenir plus d’informations sur la transaction financière exécutée lors du transfert. + +###### Figure 57 + +![](../../assets/diagrams/sequence/figure57.svg) + + +**Figure 57 -- Exemple de processus de transaction** + +#### Requêtes + +Cette section décrit les services pouvant être demandés par un client sur la ressource **/transactions**. + +##### GET /transactions/_{ID}_ + +URI alternative : N/A + +Service logique d’API : [Récupérer les informations sur la transaction](../generic-transaction-patterns#retrieve-transaction-information) + +La requête HTTP **GET /transactions/**_{ID}_ est utilisée pour obtenir des informations sur une transaction financière précédemment créée. Le _{ID}_ doit correspondre au **transactionId** utilisé lors de la création de la cotation (voir [Tableau 23](#table-23)), car la transaction est créée dans le cadre d’un autre processus (le transfert, voir [API Resource Transfers](#api-resource-transfers)). + +Informations sur les callbacks et modèles de données pour **GET /transactions/**_{ID}_ : + +- Callback -- [**PUT /transactions/**_{ID}_](#put-transactionsid) +- Callback d’erreur -- [**PUT /transactions/**_{ID}_**/error**](#put-transactionsiderror) +- Modèle de données -- Corps vide + +#### Callbacks + +Cette section décrit les callbacks utilisés par le serveur sous la ressource **/transactions**. + +##### PUT /transactions/_{ID}_ + +URI alternative : N/A + +Service logique d’API : [Retourner les informations de la transaction](../generic-transaction-patterns#return-transaction-information) + +Le callback **PUT /transactions/**_{ID}_ est utilisé pour informer le client d’une transaction demandée. Le _{ID}_ doit être celui utilisé dans le [**GET /transactions/**_{ID}_](#get-transactionsid). Voir [Tableau 35](#table-35) pour le modèle de données. + +###### Tableau 35 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| --- | --- | --- | --- | +| **completedTimestamp** | 0..1 | DateTime | Date et heure d’achèvement de la transaction. | +| **transactionState** | 1 | TransactionState | État de la transaction. | +| **code** | 0..1 | Code | Information de code/jeton de rédemption optionnelle fournie au payeur après finalisation de la transaction. | +| **extensionList** | 0..1 | ExtensionList | Extension optionnelle, spécifique au déploiement. | + +**Tableau 35 -- Modèle de données PUT /transactions/_{ID}_** + +#### Callbacks d’erreur + +Cette section décrit les callbacks d’erreur utilisés par le serveur sous la ressource **/transactions**. + +##### PUT /transactions/_{ID}_/error + +URI alternative : N/A + +Service logique d’API : [Retourner une erreur concernant la transaction](../generic-transaction-patterns#retrieve-transaction-information-error) + +Si le serveur ne parvient pas à trouver ou créer une transaction, ou en cas d’erreur de traitement, le callback d’erreur **PUT** **/transactions/**_{ID}_**/error** est utilisé. Le _{ID}_ doit être celui utilisé dans le [**GET /transactions/**_{ID}_](#get-transactionsid). Voir [Tableau 36](#table-36) pour le modèle de données. + +###### Tableau 36 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| --- | --- | --- | --- | +| **errorInformation** | 1 | ErrorInformation | Code d’erreur, description de la catégorie. | + +**Tableau 36 -- Modèle de données PUT /transactions/_{ID}_/error** + +#### États + +###### Figure 58 + +Les états possibles d'une transaction sont illustrés à la [Figure 58](#figure-58). + +**Remarque :** À des fins de rapprochement, un serveur doit conserver dans sa base de données, pendant une période définie par le système, les objets transactionnels ayant été rejetés. Cela signifie qu’un client peut s’attendre à recevoir un callback approprié concernant une transaction (si celle-ci a bien été reçue par le serveur) lorsqu’il demande des informations à son sujet. + +![Figure 58](../../assets/diagrams/images/figure58.svg) + +**Figure 58 -- États possibles d'une transaction** + +
    + +### Ressource API /bulkQuotes + +Cette section définit la ressource logique d'API **Bulk Quotes** (Devis en lot), comme décrit dans [Modèles de transactions génériques](../generic-transaction-patterns#api-resource-bulk-quotes). + +Les services fournis par la ressource API **/bulkQuotes** sont utilisés pour demander la création d’un devis en lot, c’est-à-dire un devis pour plus d’une transaction financière. Pour plus d’informations concernant un devis unique pour une transaction, voir la ressource API [/quotes](#api-resource-quotes). + +Un objet de devis en lot créé contient un devis pour chaque transaction individuelle du lot au sein d’un FSP Pair. Un devis en lot est irrévocable ; il ne peut pas être modifié après sa création. Toutefois, il peut expirer (tous les devis en lot ne sont valables que jusqu’à leur expiration). + +**Remarque :** Un devis en lot n’est pas une garantie de réussite de la transaction financière. La transaction en lot peut toujours échouer ultérieurement dans le processus. Un devis en lot garantit seulement que les frais et commissions FSP applicables à l'opération spécifiée restent valables tant que le devis n’est pas expiré. + +#### Historique des versions de la ressource + +Le Tableau 37 présente une description de chaque version différente de la ressource **/bulkQuotes**. + +| Version | Date | Description| +| ---- | ---- | ---- | +| **1.0** | 2018-03-13 | Version initiale | +| **1.1** | 2020-05-19 | Le modèle de données a été mis à jour pour ajouter un élément optionnel ExtensionList au type complexe PartyIdInfo suite à la demande de changement : https://github.com/mojaloop/mojaloop-specification/issues/30. Par la suite, le modèle de données tel que spécifié dans le Tableau 93 a été mis à jour.| + +**Tableau 37 –- Historique des versions pour la ressource /bulkQuotes** + +#### Détails du service + +La [Figure 59](#figure-59) illustre le fonctionnement du processus de devis en lot, utilisant le service **POST /bulkQuotes**. À la réception d’un lot de transactions de la part du Payeur, le FSP du Payeur doit : + +1. Rechercher à quel FSP appartient chaque Bénéficiaire ; par exemple, en utilisant la ressource API [/participants](#api-resource-participants). + +2. Diviser le lot selon le FSP du Bénéficiaire. Le service **POST /bulkQuotes** est alors utilisé pour chaque FSP de Bénéficiaire pour obtenir les devis en lot de chacun. Chaque résultat de devis contiendra le paquet ILP et la condition (voir [Paquet ILP](#ilp-packet) et [Transferts conditionnels](#conditional-transfers)) nécessaires pour effectuer chaque transfert dans le transfert en lot (voir la ressource API [/bulkTransfers](#api-resource-bulktransfers)), qui réalisera effectivement la transaction financière du Payeur vers chaque Bénéficiaire. + +###### Figure 59 + +![](../../assets/diagrams/sequence/figure59.svg) + +**Figure 59 -- Exemple de processus de devis en lot** + +#### Requêtes + +Cette section décrit les services pouvant être demandés par un client sur la ressource API **/bulkQuotes**. + +##### GET /bulkQuotes/_{ID}_ + +URI alternative : N/A + +Service logique d’API : [Récupérer les informations du devis en lot](../generic-transaction-patterns#retrieve-bulk-quote-information) + +La requête HTTP **GET /bulkQuotes/**_{ID}_ est utilisée pour obtenir des informations concernant un devis en lot préalablement créé ou demandé. + +Le _{ID}_ de l’URI doit contenir le **bulkQuoteId** (voir [Tableau 38](#table-38)) utilisé pour la création du devis en lot. + +Informations sur les callbacks et le modèle de données pour **GET /bulkQuotes/**_{ID}_ : + +- Callback -- [PUT /bulkQuotes/**_{ID}_](#put-bulkquotesid) +- Callback d’erreur -- [PUT /bulkQuotes/**_{ID}_**/error**](#put-bulkquotesiderror) +- Modèle de données -- Corps vide + +##### POST /bulkQuotes + +URI alternative : N/A + +Service logique d’API : **Calculer un devis en lot** + +La requête HTTP **POST /bulkQuotes** est utilisée pour demander la création d’un devis en lot pour les transactions financières fournies sur le serveur. + +Informations sur les callbacks et le modèle de données pour **POST /bulkQuotes** : + +- Callback -- [**PUT /bulkQuotes/**_{ID}_](#6941-put-bulkquotesid) +- Callback d’erreur -- [**PUT /bulkQuotes/**_{ID}_**/error**](#6951-put-bulkquotesiderror) +- Modèle de données -- Voir [Tableau 38](#table-38) + +###### Tableau 38 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| --- | --- | --- | --- | +| **bulkQuoteId** | 1 | CorrelationId | Identifiant commun entre les FSPs pour l'objet devis en lot, décidé par le FSP du Payeur. L’ID doit être réutilisé pour les renvois du même devis en lot. Un nouvel ID doit être généré pour chaque nouveau devis en lot. | +| **payer** | 1 | Party | Informations sur le Payeur dans la transaction financière proposée. | +| **geoCode** | 0..1 | GeoCode | Longitude et latitude de la Partie initiatrice. Peut être utilisé pour détecter une fraude. | +| **expiration** | 0..1 | DateTime | L’expiration est optionnelle et permet au FSP du Bénéficiaire de savoir quand un devis n’a plus besoin d’être renvoyé. | +| **individualQuotes** | 1..1000 | IndividualQuote | Liste des éléments de devis individuels. | +| **extensionList** | 0..1 | ExtensionList | Extension optionnelle, spécifique au déploiement. | + +**Tableau 38 -- Modèle de données POST /bulkQuotes** + +#### Callbacks + +Cette section décrit les callbacks utilisés par le serveur sous la ressource **/bulkQuotes**. + +##### PUT /bulkQuotes/_{ID}_ + +URI alternative : N/A + +Service logique d’API : [Retourner les informations du devis en lot](../generic-transaction-patterns#return-bulk-quote-information) + +Le callback **PUT /bulkQuotes/**_{ID}_ est utilisé pour informer le client d’un devis en lot demandé ou créé. Le _{ID}_ de l’URI doit contenir le **bulkQuoteId** (voir [Tableau 38](#table-38)) utilisé pour la création du devis en lot, ou le _{ID}_ qui a été utilisé dans le [**GET /bulkQuotes/**_{ID}_](#6931-get-bulkquotesid). Voir [Tableau 39](#table-39) pour le modèle de données. + +###### Tableau 39 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| --- | --- | --- | --- | +| **individualQuoteResults** | 0..1000 | IndividualQuoteResult | Frais pour chaque transaction individuelle, si certains sont facturés par transaction. | +| **expiration** | 1 | DateTime | Date et heure jusqu'à laquelle le devis est valable et peut être honoré dans une demande de transaction ultérieure. | +| **extensionList** | 0..1 | ExtensionList | Extension optionnelle, spécifique au déploiement. | + +**Tableau 39 -- Modèle de données PUT /bulkQuotes/_{ID}_** + +#### Callbacks d’erreur + +Cette section décrit les callbacks d’erreur utilisés par le serveur sous la ressource **/bulkQuotes**. + +##### PUT /bulkQuotes/_{ID}_/error + +URI alternative : N/A + +Service logique d’API : [Retourner une erreur concernant le devis en lot](../generic-transaction-patterns#retrieve-bulk-quote-information-error) + +Si le serveur ne parvient pas à trouver ou créer un devis en lot, ou en cas d’erreur de traitement, le callback d’erreur **PUT** **/bulkQuotes/**_{ID}_**/error** est utilisé. Le _{ID}_ de l’URI doit contenir le **bulkQuoteId** (voir [Tableau 38](#table-38)) utilisé pour la création du devis, ou le _{ID}_ utilisé dans le [**GET /bulkQuotes/**_{ID}_](#6931-get-bulkquotesid). Voir [Tableau 40](#table-40) pour le modèle de données. + +###### Tableau 40 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| --- | --- | --- | --- | +| **errorInformation** | 1 | ErrorInformation | Code d’erreur, description de la catégorie. | + +**Tableau 40 -- Modèle de données PUT /bulkQuotes/_{ID}_/error** + +#### États + +###### Figure 60 + +Les états possibles d’un devis en lot sont illustrés à la [Figure 60](#figure-60). + +**Remarque :** Un serveur n’a pas besoin de conserver dans sa base de données les objets de devis en lot qui ont été rejetés ou expirés. Cela signifie qu’un client doit s’attendre à recevoir un callback d’erreur pour un devis en lot rejeté ou expiré. + +![Figure 60](../../assets/diagrams/images/figure60.svg) + +**Figure 60 -- États possibles d’un devis en lot** + +
    + +### Ressource API /bulkTransfers + +Cette section définit la ressource logique d'API **Bulk Transfers** (Transferts en lot), comme décrit dans [Modèles de transactions génériques](../generic-transaction-patterns#api-resource-bulk-transfers). + +Les services fournis par la ressource API **/bulkTransfers** sont utilisés pour demander la création d’un transfert en lot ou pour obtenir des informations sur un transfert en lot précédemment demandé. Pour plus d'informations sur un transfert individuel, voir la ressource API [/transfers](#api-resource-transfers). Avant qu’un transfert en lot ne puisse être demandé, un devis en lot doit être réalisé. Voir la ressource API [/bulkQuotes](#api-resource-bulkquotes) pour plus d’informations. + +Un transfert en lot est irrévocable ; il ne peut pas être modifié, annulé ou inversé après avoir été envoyé par le FSP du Payeur. + +#### Historique des versions de la ressource + +Le Tableau 41 présente une description de chaque version différente de la ressource **/bulkTransfers**. + +| Version | Date | Description| +| ---- | ---- | ---- | +| **1.0** | 2018-03-13 | Version initiale | +| **1.1** | 2020-05-19 | Le modèle de données a été mis à jour pour ajouter un élément optionnel ExtensionList au type complexe PartyIdInfo suite à la demande de changement : https://github.com/mojaloop/mojaloop-specification/issues/30. Par la suite, le modèle de données tel que spécifié dans le Tableau 93 a été mis à jour.| + +**Tableau 41 –- Historique des versions pour la ressource /bulkTransfers** + +#### Détails du service + +La [Figure 61](#figure-61) illustre le fonctionnement du processus de transfert en lot utilisant le service **POST /bulkTransfers**. Lors de la réception des transactions groupées du Payeur, le FSP du Payeur doit effectuer les étapes suivantes : + +1. Rechercher à quel FSP appartient chaque Bénéficiaire ; par exemple, en utilisant la ressource API **/participants**, [Section 6.2](#62-api-resource-participants). +2. Effectuer le processus de devis en lot en utilisant la ressource API **/bulkQuotes**, [Section 6.9](#69-api-resource-bulkquotes). Le callback du devis en lot doit contenir les paquets ILP requis et les conditions nécessaires à l’exécution de chaque transfert. +3. Effectuer le processus de transfert en lot comme dans la [Figure 61](#figure-61) en utilisant **POST /bulkTransfers**. Ceci réalise chaque transfert “hop-to-hop” et la transaction financière de bout en bout. Pour plus d’informations sur les transferts “hop-to-hop” versus les transactions financières de bout en bout, voir [Section 6.7](#67-api-resource-transfers). + +###### Figure 61 + +![](../../assets/diagrams/sequence/figure61.svg) + +**Figure 61 -- Exemple de processus de transfert en lot** + +#### Requêtes + +Cette section décrit les services pouvant être demandés par un client sur la ressource **/bulkTransfers**. + +##### GET /bulkTransfers/_{ID}_ + +URI alternative : N/A + +Service logique d’API : [Récupérer les informations du transfert en lot](../generic-transaction-patterns#retrieve-bulk-transfer-information) + +La requête HTTP **GET /bulkTransfers/**_{ID}_ est utilisée pour obtenir des informations concernant un transfert en lot préalablement créé ou demandé. Le _{ID}_ de l’URI doit contenir le **bulkTransferId** (voir [Tableau 42](#table-42)) utilisé pour la création du transfert. + +Informations sur les callbacks et le modèle de données pour **GET /bulkTransfers/**_{ID}_ : + +- Callback -- [PUT /bulkTransfers/_{ID}_](#put-bulktransfersid) +- Callback d’erreur -- [PUT /bulkTransfers/_{ID}_/error](#put-bulktransfersiderror) +- Modèle de données -- Corps vide + +##### POST /bulkTransfers + +URI alternative : N/A + +Service logique d’API : [Exécuter un transfert en lot](../generic-transaction-patterns#perform-bulk-transfer) + +La requête HTTP **POST /bulkTransfers** est utilisée pour demander la création d’un transfert en lot sur le serveur. + +- Callback - [PUT /bulkTransfers/_{ID}_](#put-bulktransfersid) +- Callback d’erreur - [PUT /bulkTransfers/_{ID}_/error](#put-bulktransfersiderror) +- Modèle de données -- Voir [Tableau 42](#table-42) + +###### Tableau 42 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| --- | --- | --- | --- | +| **bulkTransferId** | 1 | CorrelationId | Identifiant commun entre les FSPs et éventuellement le Switch pour l'objet transfert en lot, décidé par le FSP du Payeur. L’ID doit être réutilisé pour les renvois du même transfert en lot. Un nouvel ID doit être généré pour chaque nouveau transfert en lot. | +| **bulkQuoteId** | 1 | CorrelationId | ID du devis en lot associé | +| **payeeFsp** | 1 | FspId | Identifiant du FSP du Bénéficiaire. | +| **payerFsp** | 1 | FspId | Identifiant du FSP du Payeur. | +| **individualTransfers** | 1..1000 | IndividualTransfer | Liste des éléments IndividualTransfer. | +| **expiration** | 1 | DateTime | Date d’expiration des transferts. | +| **extensionList** | 0..1 | ExtensionList | Extension optionnelle, spécifique au déploiement. | + +**Tableau 42 -- Modèle de données POST /bulkTransfers** + +#### Callbacks + +Cette section décrit les callbacks utilisés par le serveur sous la ressource **/bulkTransfers**. + +##### PUT /bulkTransfers/_{ID}_ + +URI alternative : N/A + +Service logique d’API : [Récupérer les informations du transfert en lot](../generic-transaction-patterns#retrieve-bulk-transfer-information) + +Le callback **PUT /bulkTransfers/**_{ID}_ est utilisé pour informer le client d’un transfert en lot demandé ou créé. Le _{ID}_ de l’URI doit contenir le **bulkTransferId** (voir [Tableau 42](#table-42)) utilisé pour la création du transfert ([POST /bulkTransfers](#post-bulktransfers)), ou le _{ID}_ utilisé dans le [GET /bulkTransfers/_{ID}_](#get-bulktransfersid). Voir [Tableau 43](#table-43) pour le modèle de données. + +###### Tableau 43 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| --- | --- | --- | --- | +| **completedTimestamp** | 0..1 | DateTime | Date et heure de la finalisation de la transaction de lot. | +| **individualTransferResults** | 0..1000 | **Erreur ! Source de référence introuvable.** | Liste des éléments **Erreur ! Source de référence introuvable.** | +| **bulkTransferState** | 1 | BulkTransferState | État du transfert en lot. | +| **extensionList** | 0..1 | ExtensionList | Extension optionnelle, spécifique au déploiement. | + +**Tableau 43 -- Modèle de données PUT /bulkTransfers/_{ID}_** + +#### Callbacks d’erreur + +Cette section décrit les callbacks d’erreur utilisés par le serveur sous la ressource **/bulkTransfers**. + +##### PUT /bulkTransfers/_{ID}_/error + +URI alternative : N/A + +Service logique d’API : [Retourner une erreur concernant le transfert en lot](../generic-transaction-patterns#retrieve-bulk-transfer-information-error) + +Si le serveur ne parvient pas à trouver ou créer un transfert en lot, ou en cas d’erreur de traitement, le callback d’erreur **PUT /bulkTransfers/**_{ID}_**/error** est utilisé. Le _{ID}_ de l’URI doit contenir le **bulkTransferId** (voir [Tableau 42](#table-42)) utilisé pour la création du transfert ([POST /bulkTransfers](#post-bulktransfers)), ou le _{ID}_ utilisé dans le [GET /bulkTransfers/_{ID}_](#get-bulktransfersid). Voir [Tableau 44](#table-44) pour le modèle de données. + +###### Tableau 44 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| --- | --- | --- | --- | +| **errorInformation** | 1 | ErrorInformation | Code d’erreur, description de la catégorie. | + +**Tableau 44 -- Modèle de données PUT /bulkTransfers/_{ID}_/error** + +#### États + +###### Figure 62 + +Les états possibles d’un transfert en lot sont illustrés à la [Figure 62](#figure-62). + +**Remarque :** À des fins de rapprochement, un serveur doit conserver dans sa base de données les objets de transfert en lot ayant été rejetés durant une période définie par le marché. Cela signifie qu’un client peut s’attendre à recevoir un callback approprié concernant un transfert en lot (si celui-ci a bien été reçu par le serveur) lorsqu’il demande des informations à son sujet. + +![Figure 62](../../assets/diagrams/images/figure62.svg) + +**Figure 62 -- États possibles d’un transfert en lot** + +
    + +## Modèles de données de support de l’API + +Cette section fournit des informations sur des modèles de données complémentaires utilisés par l’API. + +### Introduction sur le format + +Cette section introduit les formats utilisés pour les types de données des éléments employés par l’API. + +Tous les types de données d’élément ont à la fois une longueur minimale et maximale. Ces longueurs sont indiquées de l’une des façons suivantes : + +- Une longueur minimale et maximale +- Une longueur exacte +- Une expression régulière limitant l’élément de façon à n’autoriser qu’une ou plusieurs longueurs spécifiques. + +#### Longueur minimale et maximale + +Lorsqu’une longueur minimale et maximale est utilisée, cela sera indiqué après le type de données entre parenthèses : d’abord la valeur minimale (incluse), suivie de deux points consécutifs, puis la valeur maximale (incluse). + +Exemples : + +- `String(1..32)` – Une chaîne de caractères d’au moins un caractère et au maximum 32 caractères. +- `Integer(3..10)` - Un entier d’au moins 3 chiffres et au maximum 10 chiffres. + +#### Longueur exacte + +Lorsqu’une longueur exacte est utilisée, cela sera indiqué après le type de données entre parenthèses contenant une seule valeur exacte. Les autres longueurs ne sont pas permises. + +Exemples : + +- `String(3)` – Une chaîne de caractères d’exactement trois caractères. +- `Integer(4)` – Un entier d’exactement quatre chiffres. + +#### Expressions régulières + +Certains types de données d’élément sont limités par des expressions régulières. Les expressions régulières dans ce document utilisent la norme de syntaxe et les classes de caractères établies par le langage de programmation Perl[30](https://perldoc.perl.org/perlre.html#Regular-Expressions). + +### Formats des types de données d’éléments + +Cette section définit les types de données d’éléments utilisés par l’API. + + + +#### String + +Le type de données API `String` est une chaîne JSON normale[31](https://tools.ietf.org/html/rfc7159#section-7), limitée par un nombre maximum et minimum de caractères. + +##### Exemple de format I + +`String(1..32)` – Une chaîne de caractères d’au moins *1* caractère et au maximum *32* caractères. + +Un exemple de `String(1..32)` apparaît ci-dessous : + +- _Cette chaîne fait 28 caractères_ + +##### Exemple de format II + +`String(1..128)` – Une chaîne de caractères d’au moins *1* caractère et au maximum *128* caractères. + +Un exemple de `String(32..128)` apparaît ci-dessous : + +- _Cette chaîne est plus longue que 32 caractères, mais inférieure à 128_ + +
    + +#### Enum + +Le type de données API `Enum` est une liste restreinte de valeurs JSON [String](#string)) autorisées ; une énumération de valeurs. D’autres valeurs que celles définies dans la liste ne sont pas autorisées. + +##### Exemple de format + +`Enum of String(1..32)` – Une chaîne de caractères d’au moins un caractère et au maximum 32 caractères restreinte par la liste des valeurs autorisées. La description de l’élément contient un lien vers l’énumération. + +
    + +#### UndefinedEnum + +Le type de données d’API **UndefinedEnum** est une chaîne JSON constituée de 1 à 32 caractères en majuscule, incluant le caractère de soulignement (\*\*_**\*\*). + +##### Expression régulière + +L’expression régulière limitant le type **UndefinedEnum** apparaît dans [Liste 13](#listing-13). + +###### Liste 13 + +``` +^[A-Z_]{1,32}$ +``` + +**Liste 13 -- Expression régulière pour le type de données UndefinedEnum** + +
    + +#### Name + +Le type de données API `Name` est une chaîne JSON, restreinte par une expression régulière pour éviter les caractères généralement non utilisés dans un nom. + +##### Expression régulière + +L’expression régulière limitant le type `Name` apparaît dans la [Liste 14](#listing-14) ci-dessous. La contrainte n’autorise pas une chaîne constituée uniquement d’espaces, tous les caractères Unicode32 sont autorisés, ainsi que le point (**.**), l’apostrophe (**'**), le tiret (**-**), la virgule (**,**) et l’espace ( ). Le nombre maximal de caractères pour **Name** est 128. + +**Remarque :** Dans certains langages de programmation, le support Unicode doit être explicitement activé. Par exemple, si Java est utilisé, il faut activer le flag `UNICODE_CHARACTER_CLASS` pour permettre les caractères Unicode. + +###### Liste 14 + +``` +^(?!\s*$)[\w .,'-]{1,128}$ +``` + +**Liste 14 -- Expression régulière pour le type de données Name** + +
    + +#### Integer + +Le type de données API `Integer` est une chaîne JSON composée uniquement de chiffres. Les nombres négatifs et les zéros initiaux ne sont pas autorisés. Le type de données est toujours limité par un nombre de chiffres. + +##### 7.2.5.1 Expression régulière + +L’expression régulière restreignant le type `Integer` apparaît à la [Liste 15](#listing-15). + +###### Liste 15 + +``` +^[1-9]\d*$ +``` + +**Liste 15 -- Expression régulière pour le type de données Integer** + + +##### Exemple de format + +`Integer(1..6)` – Un `Integer` d’au moins un chiffre et de six chiffres au maximum. + +Un exemple de `Integer(1..6)` apparaît ci-dessous : + +- _123456_ + +
    + +#### OtpValue + +Le type de données API `OtpValue` est une chaîne JSON de trois à dix caractères composée uniquement de chiffres. Les nombres négatifs ne sont pas autorisés. Un ou plusieurs zéros initiaux sont autorisés. + +##### Expression régulière + +L’expression régulière limitant le type `OtpValue` apparaît dans la [Liste 16](#listing-16). + +###### Liste 16 + +``` +^\d{3,10}$ +``` + +**Liste 16 -- Expression régulière pour le type de données OtpValue** + +
    + +#### BopCode + +Le type de données API `BopCode` est une chaîne JSON de trois caractères, composée uniquement de chiffres. Les nombres négatifs ne sont pas autorisés. Un zéro initial n’est pas permis. + +##### Expression régulière + +L’expression régulière limitant le type `BopCode` apparaît à la [Liste 17](#listing-17). + +###### Liste 17 + +``` +^[1-9]\d{2}$ +``` + +**Liste 17 -- Expression régulière pour le type de données BopCode** + +
    + +#### ErrorCode + +Le type de données API `ErrorCode` est une chaîne JSON de quatre caractères, composée uniquement de chiffres. Les nombres négatifs ne sont pas autorisés. Un zéro initial n’est pas permis. + +##### Expression régulière + +L’expression régulière limitant le type `ErrorCode` apparaît à la [Liste 18](#listing-18). + +###### Liste 18 + +``` +^[1-9]\d{3}$ +``` + +**Liste 18 -- Expression régulière pour le type de données ErrorCode** + +
    + +#### TokenCode + +Le type de données API `TokenCode` est une chaîne JSON comprise entre quatre et 32 caractères. Elle peut être composée de chiffres, de lettres majuscules (**A** à **Z**), de lettres minuscules (**a** à **z**), ou d’une combinaison des trois. + +##### 7.2.9.1 Expression régulière + +L’expression régulière limitant le type `TokenCode` apparaît à la [Liste 19](#listing-19). + +###### Liste 19 + +``` +^[0-9a-zA-Z]{4,32}$ +``` + +**Liste 19 -- Expression régulière pour le type de données TokenCode** + +
    + +#### MerchantClassificationCode + +Le type de données API `MerchantClassificationCode` est une chaîne JSON composée de un à quatre chiffres. + +##### 7.2.10.1 Expression régulière + +L’expression régulière limitant le type `MerchantClassificationCode` apparaît à la [Liste 20](#listing-20). + +###### Liste 20 + +``` +^[\d]{1,4}$ +``` + +**Liste 20 -- Expression régulière pour le type de données MerchantClassificationCode** + +
    + +#### Latitude + +Le type de données API `Latitude` est une chaîne JSON au format lexical restreinte par une expression régulière pour des raisons d’interopérabilité. + +##### 7.2.11.1 Expression régulière + +L’expression régulière limitant le type `Latitude` apparaît à la [Liste 21](#listing-21). + +###### Liste 21 + +``` +^(\+|-)?(?:90(?:(?:\.0{1,6})?)|(?:[0-9]|[1-8][0-9])(?:(?:\.[0-9]{1,6})?))$ +``` + +**Liste 21 -- Expression régulière pour le type de données Latitude** + +
    + +#### Longitude + +Le type de données API `Longitude` est une chaîne JSON au format lexical restreinte par une expression régulière pour des raisons d’interopérabilité. + +##### 7.2.12.1 Expression régulière + +L’expression régulière limitant le type `Longitude` apparaît à la [Liste 22](#listing-22). + +###### Liste 22 + +``` +^(\+|-)?(?:180(?:(?:\.0{1,6})?)|(?:[0-9]|[1-9][0-9]|1[0-7][0-9])(?:(?:\.[0-9]{1,6})?))$ +``` + +**Liste 22 -- Expression régulière pour le type de données Longitude** + +
    + +#### Amount + +Le type de données API `Amount` est une chaîne JSON au format canonique restreinte par une expression régulière pour des raisons d’interopérabilité. + +##### Expression régulière + +L’expression régulière limitant le type `Amount` apparaît à la [Liste 23](#listing-23). Ce motif n’autorise aucune décimale finale à zéro, mais autorise un montant sans unité monétaire mineure. Il permet également uniquement quatre chiffres dans l’unité monétaire mineure ; une valeur négative n’est pas acceptée. L’utilisation de plus de 18 chiffres dans l’unité monétaire majeure n’est pas acceptée. + +###### Liste 23 + +``` +^([0]|([1-9][0-9]{0,17}))([.][0-9]{0,3}[1-9])?$ +``` + +**Liste 23 -- Expression régulière pour le type de données Amount** + +##### Exemples de valeurs + +Consultez le [Tableau 45](#table-45) pour les résultats de validation pour quelques exemples de valeurs **Amount** à l’aide de l’[expression régulière](#regular-expression-6). + +###### Tableau 45 + +| **Valeur** | **Résultat de validation** | +| --- | --- | +| **5** | Acceptée | +| **5.0** | Rejetée | +| **5.** | Rejetée | +| **5.00** | Rejetée | +| **5.5** | Acceptée | +| **5.50** | Rejetée | +| **5.5555** | Acceptée | +| **5.55555** | Rejetée | +| **555555555555555555** | Acceptée | +| **5555555555555555555** | Rejetée | +| **-5.5** | Rejetée | +| **0.5** | Acceptée | +| **.5** | Rejetée | +| **00.5** | Rejetée | +| **0** | Acceptée | + +**Tableau 45 -- Exemples de résultats pour différentes valeurs du type Amount** + +
    + +#### DateTime + +Le type de données API `DateTime` est une chaîne JSON au format lexical qui est restreinte par une expression régulière pour des raisons d’interopérabilité. + +##### 7.2.14.1 Expression Régulière + +L’expression régulière limitant le type `DateTime` apparaît à la [Liste 24](#listing-24). Le format est conforme à l’ISO 8601, exprimé en une date, une heure et un fuseau horaire combinés. Une version plus lisible du format est : + +_aaaa_**-**_MM_**-**_jj_**T**_HH_**:**_mm_**:**_ss_**.**_SSS_[**-**_HH_**:**_MM_] + +###### Liste 24 + +``` +^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468\][048]|[13579][26])00)-02-29)T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:(\.\d{3}))(?:Z|[+-][01]\d:[0-5]\d)$ +``` + +**Liste 24 -- Expression régulière pour le type de données DateTime** + +##### Exemples + +Deux exemples du type `DateTime` apparaissent ci-dessous : + +**2016-05-24T08:38:08.699-04:00** + +**2016-05-24T08:38:08.699Z** (où **Z** indique le fuseau horaire Zulu, identique à UTC). + +
    + +#### Date + +Le type de données API `Date` est une chaîne JSON au format lexical restreinte par une expression régulière pour garantir l’interopérabilité. + +##### Expression Régulière + +L’expression régulière restreignant le type **Date** apparaît à la [Liste 25](#listing-25). Ce format, tel que spécifié dans la norme ISO 8601, contient uniquement une date. Une version plus lisible est _aaaa_**-**_MM_**-**_jj_. + +###### Liste 25 + +``` +^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)$ +``` + +**Liste 25 -- Expression régulière pour le type de données Date** + +##### Exemples + +Deux exemples de type `Date` apparaissent ci-dessous : + +- _1982-05-23_ + +- _1987-08-05_ + +
    + +#### UUID + +Le type de données API `UUID` (Identifiant Unique Universel) est une chaîne JSON au format canonique, conforme à la RFC 4122, restreinte par une expression régulière pour garantir l’interopérabilité. Un UUID fait toujours 36 caractères de long, soit 32 caractères hexadécimaux et quatre tirets (« - »). + +##### 7.2.16.1 Expression Régulière + +L’expression régulière restreignant le type `UUID` figure à la [Liste 26](#listing-26). + +###### Liste 26 + +``` +^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ +``` + +**Liste 26 -- Expression régulière pour le type de données UUID** + +##### Exemple + +Un exemple de type `UUID` : + +- _a8323bc6-c228-4df2-ae82-e5a997baf898_ + +
    + +#### BinaryString + +Le type de données API `BinaryString` est une chaîne JSON. La chaîne est un encodage base64url d’une séquence d’octets bruts, où un caractère de bourrage (‘**=**’) est ajouté à la fin des données si besoin afin de garantir que la chaîne est un multiple de quatre caractères. La contrainte de longueur indique le nombre de caractères autorisés. + +##### Expression Régulière + +L’expression régulière limitant le type `BinaryString` apparaît à la [Liste 27](#listing-27). + +###### Liste 27 + +``` +^[A-Za-z0-9-_]+[=]{0,2}$ +``` + +**Liste 27 -- Expression régulière pour le type de données BinaryString** + +##### Exemple de format + +`BinaryString(32)` – 32 octets de données encodés en base64url. + +Un exemple de `BinaryString(32..256)` figure ci-dessous. Notez qu’un caractère de bourrage `'='` a été ajouté pour garantir que la chaîne soit un multiple de quatre caractères. + +- _QmlsbCAmIE1lbGluZGEgR2F0ZXMgRm91bmRhdGlvbiE=_ + +
    + +#### BinaryString32 + +Le type de données API `BinaryString32` est une version à taille fixe du type de données API `BinaryString` défini [plus haut](#binarystring), où les données sont toujours de 32 octets. **BinaryString32** ne doit pas utiliser de caractère de bourrage puisque la taille des données sous-jacentes est fixe. + +##### Expression Régulière + +L’expression régulière limitant le type `BinaryString32` apparaît à la [Liste 28](#listing-28). + +###### Liste 28 + +``` +^[A-Za-z0-9-_]{43}$ +``` + +**Liste 28 -- Expression régulière pour le type de données BinaryString32** + +##### Exemple de format + +`BinaryString(32)` – 32 octets de données encodés en base64url. + +Un exemple de `BinaryString32` figure ci-dessous. Il s’agit des mêmes données binaires que dans l’exemple du [format d’exemple](#example-format-4) du type `BinaryString`, mais comme la taille sous-jacente est fixe, le caractère de bourrage `'='` est exclu. + +``` +QmlsbCAmIE1lbGluZGEgR2F0ZXMgRm91bmRhdGlvbiE +``` + +
    + +### Définitions des éléments + +Cette section définit les types d’éléments utilisés par l’API. + +#### Élément AmountType + +[Le tableau 46](#table-46) ci-dessous présente le modèle de données pour l’élément `AmountType`. + +###### Tableau 46 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **AmountType** | 1 | [Enum](#enum) de [String(1..32)](#string) | Cet élément contient le type de montant. Voir l’énumération [AmountType](#amounttype-enum) pour plus d’informations sur les valeurs autorisées. | + +**Tableau 46 – Élément AmountType** + +
    + +#### Élément AuthenticationType + +[Le tableau 47](#table-47) ci-dessous présente le modèle de données pour l’élément `AuthenticationType`. + +###### Tableau 47 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **Authentication** | 1 | [Enum](#enum) de [String(1..32)](#string) | Cet élément contient le type d’authentification. Voir l’énumération [AuthenticationType](#authenticationtype-enum) pour les valeurs possibles. | + +**Tableau 47 – Élément AuthenticationType** + +
    + +#### Élément AuthenticationValue + +[Le tableau 48](#table-48) ci-dessous présente le modèle de données pour l’élément `AuthenticationValue`. + +###### Tableau 48 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **AuthenticationValue** | 1 | Dépend de [AuthenticationType](#authenticationtype-element).

    Si `OTP` : le type est [Integer(1..6)](#integer). Par exemple : **123456**

    OtpValue
    Si `QRCODE` : le type est [String(1..64)](#string) | Cet élément contient la valeur d’authentification. Le format dépend du type d’authentification utilisé dans le type complexe [AuthenticationInfo](#authenticationinfo). | + +**Tableau 48 – Élément AuthenticationValue** + +
    + +#### Élément AuthorizationResponse + +[Le tableau 49](#table-49) ci-dessous présente le modèle de données pour l’élément `AuthorizationResponse`. + +###### Tableau 49 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **AuthorizationResponse** | 1 | [Enum](#enum) de [String(1..32)](#string) | Cet élément contient la réponse d’autorisation. Voir l’énumération [AuthorizationResponse](#authorizationresponse-enum) pour les valeurs possibles. | + +**Tableau 49 – Élément AuthorizationResponse** + +
    + +#### Élément BalanceOfPayments + +[Le tableau 50](#table-50) ci-dessous présente le modèle de données pour l’élément `BalanceOfPayment`. + +###### Tableau 50 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **BalanceOfPayments** | 1 | [BopCode](#bopcode) | Les valeurs et significations possibles sont définies dans [https://www.imf.org/external/np/sta/bopcode/](https://www.imf.org/external/np/sta/bopcode/) | + +**Tableau 50 – Élément BalanceOfPayments** + +
    + +#### Élément BulkTransferState + +[Le tableau 51](#table-51) ci-dessous présente le modèle de données pour l’élément `BulkTransferState`. + +###### Tableau 51 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **BulkTransferState** | 1 | [Enum](#enum) de [String(1..32)](#string) | Voir l’énumération [BulkTransferState](#bulktransferstate-enum) pour connaître les valeurs autorisées.| + +**Tableau 51 – Élément BulkTransferState** + +
    + +#### Élément Code + +[Le tableau 52](#table-52) ci-dessous présente le modèle de données pour l’élément `Code`. + +###### Tableau 52 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **Code** | 1 | [TokenCode](#tokencode) | Tout code/jeton retourné par l’IFP bénéficiaire. | + +**Tableau 52 – Élément Code** + +
    + +#### Élément CorrelationId + +[Le tableau 53](#table-53) ci-dessous présente le modèle de données pour l’élément `CorrelationId`. + +###### Tableau 53 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **CorrelationId** | 1 |[UUID](#uuid) | Identifiant permettant de corréler tous les messages d’une même séquence. | + + +**Tableau 53 – Élément CorrelationId** + +
    + +#### Élément Currency + +[Le tableau 54](#table-54) ci-dessous présente le modèle de données pour l’élément `Currency`. + +###### Tableau 54 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **Currency** | 1 | [Enum](#enum) de [String(3)](#string) | Voir l’énumération [Currency](#currencycode-enum) pour plus d’informations sur les valeurs autorisées. | + +**Tableau 54 – Élément Currency** + +
    + +#### Élément DateOfBirth + +[Le tableau 55](#table-55) ci-dessous présente le modèle de données pour l’élément `DateOfBirth`. + +###### Tableau 55 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **DateOfBirth** | 1 | Exemples

    Deux exemples du type [DateTime](#datetime) figurent ci-dessous :

    2016-05-24T08:38:08.699-04:00

    2016-05-24T08:38:08.699Z (où Z indique le fuseau Zulu, équivalent à UTC).

    Date

    | Date de naissance du participant.| + +**Tableau 55 – Élément DateOfBirth** + +
    + +#### Élément ErrorCode + +[Le tableau 56](#table-56) ci-dessous présente le modèle de données pour l’élément `ErrorCode`. + +###### Tableau 56 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **ErrorCode** | 1 | [ErrorCode](#errorcode) | Code d’erreur à quatre chiffres, voir la section sur les [Codes d’erreur](#error-codes) pour plus d’informations. | + +**Tableau 56 – Élément ErrorCode** + +
    + +#### Élément ErrorDescription + +[Le tableau 57](#table-57) ci-dessous présente le modèle de données pour l’élément `ErrorDescription`. + +###### Tableau 57 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **ErrorDescription** | 1 | [String(1..128)](#string) | Description de l’erreur. | + +**Tableau 57 – Élément ErrorDescription** + +
    + +#### Élément ExtensionKey + +[Le tableau 58](#table-58) ci-dessous présente le modèle de données pour l’élément `ExtensionKey`. + +###### Tableau 58 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **ExtensionKey** | 1 | [String(1..32)](#string) | La clé de l’extension. | + +**Tableau 58 – Élément ExtensionKey** + +
    + +#### Élément ExtensionValue + +[Le tableau 59](#table-59) ci-dessous présente le modèle de données pour l’élément `ExtensionValue`. + +###### Tableau 59 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **ExtensionValue** | 1 | [String(1..128)](#string) | La valeur de l’extension. | + +**Tableau 59 – Élément ExtensionValue** + +
    + +#### Élément FirstName + +[Le tableau 60](#table-60) ci-dessous présente le modèle de données pour l’élément `FirstName`. + +###### Tableau 60 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **FirstName** | 1 | [Name](#name) | Prénom du participant | + +**Tableau 60 – Élément FirstName** + +
    + +#### Élément FspId + +[Le tableau 61](#table-61) ci-dessous présente le modèle de données pour l’élément `FspId`. + +###### Tableau 61 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **FspId** | 1 | [String(1..32)](#string)| Identifiant de l’IFP (Institution Financière de Paiement). | + +**Tableau 61 – Élément FspId** + +
    + +#### Élément IlpCondition + +[Le tableau 62](#table-62) ci-dessous présente le modèle de données pour l’élément `IlpCondition`. + +###### Tableau 62 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **IlpCondition** | 1 | [BinaryString32](#binarystring32) | Condition qui doit être jointe au transfert par le Payeur. | + +**Tableau 62 – Élément IlpCondition** + +
    + +#### Élément IlpFulfilment + +[Le tableau 63](#table-63) ci-dessous présente le modèle de données pour l’élément `IlpFulfilment`. + +###### Tableau 63 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **IlpFulfilment** | 1 | [BinaryString32](#binarystring32) | Exécution qui doit être jointe au transfert par le Bénéficiaire. | + +**Tableau 63 – Élément IlpFulfilment** + +
    + +#### Élément IlpPacket + +[Le tableau 64](#table-64) ci-dessous présente le modèle de données pour l’élément `IlpPacket`. + +###### Tableau 64 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **IlpPacket** | 1 | Exemple

    Un exemple de type [UUID](#uuid) :

    a8323bc6-c228-4df2-ae82-e5a997baf898

    [BinaryString(1..32768)](#binarystring)

    | Informations pour le destinataire (informations de niveau transport). | + +**Tableau 64 – Élément IlpPacket** + +
    + +#### Élément LastName + +[Le tableau 65](#table-65) ci-dessous présente le modèle de données pour l’élément `LastName`. + +###### Tableau 65 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **LastName** | 1 | [Name](#name) | Nom de famille du participant (définition ISO 20022). | + +**Tableau 65 – Élément LastName** + +
    + +#### Élément MerchantClassificationCode + +[Le tableau 66](#table-66) ci-dessous présente le modèle de données pour l’élément `MerchantClassificationCode`. + +###### Tableau 66 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **MerchantClassificationCode** | 1 | [MerchantClassificationCode](#merchantclassificationcode) | Un ensemble limité de numéros prédéfinis. Cette liste identifie des types de marchands populaires comme frais d’école, bars et restaurants, épiceries, etc. | + +**Tableau 66 – Élément MerchantClassificationCode** + +
    + +#### Élément MiddleName + +[Le tableau 67](#table-67) ci-dessous présente le modèle de données pour l’élément `MiddleName`. + +###### Tableau 67 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **MiddleName** | 1 | [Name](#name) | Deuxième prénom du participant (définition ISO 20022). | + +**Tableau 67 – Élément MiddleName** + +
    + +#### Élément Note + +[Le tableau 68](#table-68) ci-dessous présente le modèle de données pour l’élément `Note`. + +###### Tableau 68 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **Note** | 1 | [String(1..128)](#string) | Mémo ou libellé affecté à la transaction. | + +**Tableau 68 – Élément Note** + +
    + +#### Élément PartyIdentifier + +[Le tableau 69](#table-69) ci-dessous présente le modèle de données pour l’élément `PartyIdentifier`. + +###### Tableau 69 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **PartyIdentifier** | 1 | [String(1..128)](#string) | Identifiant du participant.| + +**Tableau 69 – Élément PartyIdentifier** + +
    + +#### Élément PartyIdType + +[Le tableau 70](#table-70) ci-dessous présente le modèle de données pour l’élément `PartyIdType`. + +###### Tableau 70 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **PartyIdType** | 1 | Enum de [String(1..32)](#string) | Voir l’énumération [PartyIdType](#partyidtype-enum) pour plus d’informations sur les valeurs autorisées. | + +**Tableau 70 – Élément PartyIdType** + +
    + +#### Élément PartyName + +[Le tableau 71](#table-71) ci-dessous présente le modèle de données pour l’élément `PartyName`. + +###### Tableau 71 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **PartyName** | 1 | `Name` | Nom du participant. Peut être un vrai nom ou un surnom. | + +**Tableau 71 – Élément PartyName** + +
    + +#### Élément PartySubIdOrType + +[Le tableau 72](#table-72) ci-dessous présente le modèle de données pour l’élément `PartySubIdOrType`. + +###### Tableau 72 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **PartySubIdOrType** | 1 | [String(1..128)](#string) | Un sous-identifiant d’un [PartyIdentifier](#partyidentifier-element) ou un sous-type du [PartyIdType](#partyidtype-element), souvent un `PersonalIdentifierType`. | + +**Tableau 72 – Élément PartySubIdOrType** + +
    + +#### Élément RefundReason + +[Le tableau 73](#table-73) ci-dessous présente le modèle de données pour l’élément `RefundReason`. + +###### Tableau 73 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **RefundReason** | 1 | [String(1..128)](#string) | Raison du remboursement. | + +**Tableau 73 – Élément RefundReason** + +
    + +#### Élément TransactionInitiator + +[Le tableau 74](#table-74) ci-dessous présente le modèle de données pour l’élément `TransactionInitiator`. + +###### Tableau 74 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **TransactionInitiator** | 1 | [Enum](#enum) de [String(1..32)](#string) | Voir l’énumération [TransactionInitiator](#transactioninitiator-enum) pour plus d’informations sur les valeurs autorisées. | + +**Tableau 74 – Élément TransactionInitiator** + +
    + +#### Élément TransactionInitiatorType + +[Le tableau 75](#table-75) ci-dessous présente le modèle de données pour l’élément `TransactionInitiatorType`. + +###### Tableau 75 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **TransactionInitiatorType** | 1 | [Enum](#enum) de [String(1..32)](#string) | Voir l’énumération [TransactionInitiatorType](#transactioninitiatortype-enum) pour plus d’informations sur les valeurs autorisées. | + +**Tableau 75 – Élément TransactionInitiatorType** + +
    + +#### Élément TransactionRequestState + +[Le tableau 76](#table-76) ci-dessous présente le modèle de données pour l’élément `TransactionRequestState`. + +###### Tableau 76 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **TransactionRequestState** | 1 | [Enum](#enum) de [String(1..32)](#string) | Voir l’énumération [TransactionRequestState](#transactionrequeststate-enum) pour plus d’informations sur les valeurs autorisées. | + +**Tableau 76 – Élément TransactionRequestState** + +
    + +#### Élément TransactionScenario + +[Le tableau 77](#table-77) ci-dessous présente le modèle de données pour l’élément `TransactionScenario`. + +###### Tableau 77 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **TransactionScenario** | 1 | [Enum](#enum) de [String(1..32)](#string) | Voir l’énumération [TransactionScenario](#transactionscenario-enum) pour plus d’informations sur les valeurs autorisées. | + +**Tableau 77 – Élément TransactionScenario** + +
    + +#### Élément TransactionState + +[Le tableau 78](#table-78) ci-dessous présente le modèle de données pour l’élément `TransactionState`. + +###### Tableau 78 + +|Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **TransactionState** | 1 | [Enum](#enum) de [String(1..32)](#string) | Voir l’énumération [TransactionState](#transactionstate-enum) pour plus d’informations sur les valeurs autorisées. | + +**Tableau 78 – Élément TransactionState** + +
    + + +#### Élément TransactionSubScenario + +[Le tableau 79](#table-79) ci-dessous présente le modèle de données pour l’élément `TransactionSubScenario`. + +###### Tableau 79 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **TransactionSubScenario** | 1 | [UndefinedEnum](#undefinedenum) | Sous-scénario possible, défini localement au sein du système.| + +**Tableau 79 – Élément TransactionSubScenario** + +
    + +#### Élément TransferState + +[Le tableau 80](#table-80) ci-dessous présente le modèle de données pour l’élément `TransferState`. + +###### Tableau 80 + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| **TransactionState** | 1 | [Enum](#enum) de [String(1..32)](#string) | Voir l’énumération [TransferState](#transferstate-enum) pour plus d’informations sur les valeurs autorisées. | + +**Tableau 80 – Élément TransferState** + +
    + +### Types Complexes + +Cette section décrit les types complexes utilisés par l’API. + +#### AuthenticationInfo + +[Le tableau 81](#table-81) présente le modèle de données pour le type complexe `AuthenticationInfo`. + +###### Tableau 81 + +| **Nom** | **Cardinalité** | **Format** | **Description** | +| --- | --- | --- | --- | +| **authentication** | 1 | `AuthenticationType` | Type d’authentification. | +| **authenticationValue** | 1 | `AuthenticationValue` | Valeur d’authentification. | + +**Tableau 81 -- Type complexe AuthenticationInfo** + +
    + +#### ErrorInformation + +[Le tableau 82](#table-82) présente le modèle de données pour le type complexe `ErrorInformation`. + +###### Tableau 82 + +| **Nom** | **Cardinalité** | **Format** | **Description** | +| --- | --- | --- | --- | +| **errorCode** | 1 | `Errorcode` | Numéro d’erreur spécifique. | +| **errorDescription** | 1 | `ErrorDescription` | Chaîne décrivant l’erreur. | +| **extensionList** | 1 | `ExtensionList` | Liste facultative d’extensions, spécifique au déploiement. | + +**Tableau 82 -- Type complexe ErrorInformation** + +
    + +#### Extension + +[Le tableau 83](#table-83) présente le modèle de données pour le type complexe `Extension`. + +###### Tableau 83 + +| **Nom** | **Cardinalité** | **Format** | **Description** | +| --- | --- | --- | --- | +| **key** | 1 | `ExtensionKey` | Clé d’extension. | +| **value** | 1 | `ExtensionValue` | Valeur de l’extension. | + +**Tableau 83 -- Type complexe Extension** + +
    + +#### ExtensionList + +[Le tableau 84](#table-84) présente le modèle de données pour le type complexe `ExtensionList`. + +###### Tableau 84 + +| **Nom** | **Cardinalité** | **Format** | **Description** | +| --- | --- | --- | --- | +| **extension** | 1..16 | `Extension` | Nombre d’éléments Extension. | + +**Tableau 84 -- Type complexe ExtensionList** + +
    + +#### IndividualQuote + +[Le tableau 85](#table-85) présente le modèle de données pour le type complexe `IndividualQuote`. + +###### Tableau 85 + +| **Nom** | **Cardinalité** | **Format** | **Description** | +| --- | --- | --- | --- | +| **quoteId** | 1 | `CorrelationId` | Identifie le message du devis. | +| **transactionId** | 1 | `CorrelationId` | Identifie le message de transaction. | +| **payee** | 1 | `Party` | Informations concernant le bénéficiaire dans la transaction financière proposée. | +| **amountType** | 1 | `AmountType` | **SEND** pour le montant envoyé, **RECEIVE** pour le montant à recevoir. | +| **amount** | 1 | `Money` | Selon **amountType** :
    Si **SEND** : montant que le payeur souhaite envoyer, c’est-à-dire le montant à débiter y compris les frais. Le montant est mis à jour par chaque entité participante.
    Si **RECEIVE** : montant à recevoir par le bénéficiaire (hors frais). Le montant n’est pas mis à jour par les entités participantes. | +| **fees** | 0..1 | `Money` | Frais de la transaction.
    • Doit être vide si les frais ne doivent pas être divulgués.
    • Doit être renseigné si les frais sont à divulguer.
    | +| **transactionType** | 1 | `TransactionType` | Type de transaction pour laquelle le devis est demandé. | +| **note** | 0..1 | Note | Mémo joint à la transaction. | +| **extensionList** | 0..1 | `ExtensionList` | Extension facultative, spécifique au déploiement. | + +**Tableau 85 -- Type complexe IndividualQuote** + +
    + +#### IndividualQuoteResult + +[Le tableau 86](#table-86) présente le modèle de données pour le type complexe `IndividualQuoteResult`. + +###### Tableau 86 + +| **Nom** | **Cardinalité** | **Format** | **Description** | +| --- | --- | --- | --- | +| **quoteId** | 1 | `CorrelationId` | Identifie le message du devis. | +| **payee** | 0..1 | `Party` | Informations sur le bénéficiaire dans la transaction financière proposée. | +| **transferAmount** | 0..1 | `Money` | Montant que le FSP du Payeur doit transférer au FSP du Bénéficiaire. | +| **payeeReceiveAmount** | 0..1 | `Money` | Montant que le Bénéficiaire devra recevoir au final. Facultatif si le FSP du Bénéficiaire ne souhaite pas divulguer de frais optionnels. | +| **payeeFspFee** | 0..1 | `Money` | Part des frais de transaction du FSP du Bénéficiaire. | +| **payeeFspCommission** | 0..1 | `Money` | Commission de transaction du FSP du Bénéficiaire. | +| **ilpPacket** | 0..1 | `IlpPacket` | Paquet ILP à joindre au transfert par le Payeur. | +| **condition** | 0..1 | `IlpCondition` | Condition à joindre au transfert par le Payeur. | +| **errorInformation** | 0..1 | `ErrorInformation` | Code d’erreur, description de la catégorie.
    **Remarque :** Les paramètres payee, transferAmount, payeeReceiveAmount, payeeFspFee, payeeFspCommission, ilpPacket et condition ne doivent pas être définis si errorInformation est renseigné.
    | +| **extensionList** | 0..1 | `ExtensionList` | Extension facultative, spécifique au déploiement. | + +**Tableau 86 -- Type complexe IndividualQuoteResult** + +
    + +#### IndividualTransfer + +[Le tableau 87](#table-87) présente le modèle de données pour le type complexe `IndividualTransfer`. + +###### Tableau 87 + +| **Nom** | **Cardinalité** | **Format** | **Description** | +| --- | --- | --- | --- | +| **transferId** | 1 | `CorrelationId` | Identifie les messages liés à la même séquence **/transfers**. | +| **transferAmount** | 1 | `Money` | Montant de la transaction à envoyer. | +| **ilpPacket** | 1 | `IlpPacket` | Paquet ILP contenant le montant destiné au bénéficiaire, l’adresse ILP du bénéficiaire et toutes données end-to-end. | +| **condition** | 1 | `IlpCondition` | Condition qui doit être remplie pour engager le transfert. | +| **extensionList** | 0..1 | `ExtensionList` | Extension facultative, spécifique au déploiement. | + +**Tableau 87 -- Type complexe IndividualTransfer** + +
    + +#### IndividualTransferResult + +[Le tableau 88](#table-88) présente le modèle de données pour le type complexe `IndividualTransferResult`. + +###### Tableau 88 + +| **Nom** | **Cardinalité** | **Format** | **Description** | +| --- | --- | --- | --- | +| **transferId** | 1 | `CorrelationId` | Identifie les messages liés à la même séquence /transfers. | +| **fulfilment** | 0..1 | `IlpFulfilment` | Fulfilment (preuve) de la condition définie avec la transaction.
    **Remarque :** Soit **fulfilment**, soit **errorInformation** doit être renseigné, jamais les deux. | +| **errorInformation** | 0..1 | `ErrorInformation` | Si le transfert est REJECTED, les informations d’erreur peuvent être fournies.
    **Remarque :** Soit **fulfilment**, soit **errorInformation** doit être renseigné, jamais les deux.| +| **extensionList** | 0..1 | `ExtensionList` | Extension facultative, spécifique au déploiement. | + +**Tableau 88 -- Type complexe IndividualTransferResult** + +
    + +#### GeoCode + +[Le tableau 89](#table-89) présente le modèle de données pour le type complexe `GeoCode`. + +###### Tableau 89 + +| **Nom** | **Cardinalité** | **Format** | **Description** | +| --- | --- | --- | --- | +| **latitude** | 1 | `Latitude` | Latitude de la Partie. | +| **longitude** | 1 | `Longitude` | Longitude de la Partie. | + +**Tableau 89 -- Type complexe GeoCode** + +
    + +#### Money + +[Le tableau 90](#table-90) présente le modèle de données pour le type complexe `Money`. + +###### Tableau 90 + +| **Nom** | **Cardinalité** | **Format** | **Description** | +| --- | --- | --- | --- | +| **currency** | 1 | `Currency` | Devise du montant. | +| **amount** | 1 | `Amount` | Montant d’argent. | + +**Tableau 90 -- Type complexe Money** + +
    + +#### Party + +[Le tableau 91](#table-91) présente le modèle de données pour le type complexe `Party`. + +###### Tableau 91 + +| **Nom** | **Cardinalité** | **Format** | **Description** | +| --- | --- | --- | --- | +| **partyIdInfo** | 1 | `PartyIdInfo` | Type d’id de la Partie, id, sous-id ou type, et FSP Id. | +| **merchantClassificationCode** | 0..1 | `MerchantClassificationCode` | Utilisé pour la partie Bénéficiaire marchande. | +| **name** | 0..1 | `PartyName` | Nom affiché de la Partie, peut être un nom réel ou un pseudo. | +| **personalInfo** | 0..1 | `PartyPersonalInfo` | Informations personnelles pour vérifier l’identité de la Partie (nom, prénom, date de naissance, etc.). | + +**Tableau 91 -- Type complexe Party** + +
    + +#### PartyComplexName + +[Le tableau 92](#table-92) présente le modèle de données pour le type complexe `PartyComplexName`. + +###### Tableau 92 + +| **Nom** | **Cardinalité** | **Format** | **Description** | +| --- | --- | --- | --- | +| **firstName** | 0..1 | `FirstName` | Prénom de la Partie. | +| **middleName** | 0..1 | `MiddleName` | Deuxième prénom de la Partie. | +| **lastName** | 0..1 | `LastName` | Nom de famille de la Partie. | + +**Tableau 92 -- Type complexe PartyComplexName** + +
    + +#### PartyIdInfo + +[Le tableau 93](#table-93) présente le modèle de données pour le type complexe `PartyIdInfo`. + +###### Tableau 93 + +| **Nom** | **Cardinalité** | **Format** | **Description** | +| --- | --- | --- | --- | +| **partyIdType** | 1 | `PartyIdType` | Type d’identifiant. | +| **partyIdentifier** | 1 | `PartyIdentifier` | Identifiant de la Partie. | +| **partySubIdOrType** | 0..1 | `PartySubIdOrType` | Sous-identifiant ou sous-type pour la Partie. | +| **fspId** | 0..1 | `FspId` | Identifiant FSP (si connu). | +| **extensionList** | 0..1 | `ExtensionList` | Extension facultative, spécifique au déploiement. | + +**Tableau 93 -- Type complexe PartyIdInfo** + +
    + +#### PartyPersonalInfo + +[Le tableau 94](#table-94) présente le modèle de données pour le type complexe `PartyPersonalInfo`. + +###### Tableau 94 + +| **Nom** | **Cardinalité** | **Format** | **Description** | +| --- | --- | --- | --- | +| **complexName** | 0..1 | `PartyComplexName` | Prénom, deuxième prénom et nom de famille de la Partie. | +| **dateOfBirth** | 0..1 | `DateOfBirth` | Date de naissance de la Partie. | + +**Tableau 94 -- Type complexe PartyPersonalInfo** + +
    + +#### PartyResult + +[Le tableau 95](#table-95) présente le modèle de données pour le type complexe `PartyResult`. + +###### Tableau 95 + +| **Nom** | **Cardinalité** | **Format** | **Description** | +| --- | --- | --- | --- | +| **partyId** | 1 | `PartyIdInfo` | Type d’id de la Partie, id, sous-id ou type, et FSP Id. | +| **errorInformation** | 0..1 | `ErrorInformation` | Si la Partie n’a pas pu être ajoutée, une information d’erreur doit être fournie. Sinon, ce paramètre doit être vide pour indiquer le succès. | + +**Tableau 95 -- Type complexe PartyResult** + +
    + +#### Refund + +[Le tableau 96](#table-96) présente le modèle de données pour le type complexe `Refund`. + +###### Tableau 96 + +| **Nom** | **Cardinalité** | **Format** | **Description** | +| --- | --- | --- | --- | +| **originalTransactionId** | 1 | `CorrelationId` | Référence à l’ID de la transaction d’origine à rembourser. | +| **refundReason** | 0..1 | `RefundReason` | Texte libre précisant la raison du remboursement. | + +**Tableau 96 -- Type complexe Refund** + +
    + +#### Transaction + +[Le tableau 97](#table-97) présente le modèle de données pour le type complexe Transaction. Le type Transaction sert à véhiculer des données de bout en bout entre le FSP Payeur et le FSP Bénéficiaire dans le paquet ILP, voir [IlpPacket](#ilp-packet). Les champs **transactionId** et **quoteId** sont décidés par le FSP Payeur lors du [POST /quotes](#post-quotes), voir [Tableau 23](#table-23). + +###### Tableau 97 + +| **Nom** | **Cardinalité** | **Format** | **Description** | +| --- | --- | --- | --- | +| **transactionId** | 1 | `CorrelationId` | ID de la transaction, défini par le FSP Payeur lors de la création du devis. | +| **quoteId** | 1 | `CorrelationId` | ID du devis, défini par le FSP Payeur lors de la création du devis. | +| **payee** | 1 | `Party` | Informations sur le bénéficiaire dans la transaction proposée. | +| **payer** | 1 | `Party` | Informations sur le payeur dans la transaction proposée. | +| **amount** | 1 | `Money` | Montant de la transaction à envoyer. | +| **transactionType** | 1 | `TransactionType` | Type de la transaction. | +| **note** | 0..1 | `Note` | Mémo associé à la transaction, destiné au bénéficiaire. | +| **extensionList** | 0..1 | `ExtensionList` | Extension facultative, spécifique au déploiement. | + +**Tableau 97 -- Type complexe Transaction** + +
    + +#### TransactionType + +[Le tableau 98](#table-98) présente le modèle de données pour le type complexe `TransactionType`. + +###### Tableau 98 + +| **Nom** | **Cardinalité** | **Format** | **Description** | +| --- | --- | --- | --- | +| **scenario** | 1 | `TransactionScenario` | Dépôt, retrait, remboursement, ... | +| **subScenario** | 0..1 | `TransactionSubScenario` | Sous-scénario éventuel, défini localement. | +| **initiator** | 1 | `TransactionInitiator` | Initiateur de la transaction : Payeur ou Bénéficiaire. | +| **initiatorType** | 1 | `TransactionInitiatorType` | Consommateur, agent, entreprise, ... | +| **refundInfo** | 0..1 | `Refund` | Informations supplémentaires particulières pour les remboursements. À renseigner uniquement si le scénario est REFUND. | +| **balanceOfPayments** | 0..1 | `BalanceOfPayments` | Code Balance des Paiements. | + +**Tableau 98 -- Type complexe TransactionType** + +
    + +### Énumérations + +Cette section présente les énumérations utilisées par l’API. + +#### AmountType enum + +[Le tableau 99](#table-99) présente les valeurs autorisées pour l’énumération `AmountType`. + +###### Tableau 99 + +| **Nom** | **Description** | +| --- | --- | +| **SEND** | Montant que le payeur souhaite envoyer ; c’est-à-dire le montant à débiter, frais inclus. | +| **RECEIVE** | Montant que le payeur souhaite que le bénéficiaire reçoive, c’est-à-dire montant crédité hors frais. | + +**Tableau 99 -- Énumération AmountType** + +
    + +#### AuthenticationType enum + +[Le tableau 100](#table-100) présente les valeurs autorisées pour l’énumération `AuthenticationType`. + +###### Tableau 100 + +| **Nom** | **Description** | +| --- | --- | +| **OTP** | Mot de passe à usage unique généré par le FSP du payeur. | +| **QRCODE** | Code QR utilisé comme mot de passe à usage unique. | + +**Tableau 100 -- Énumération AuthenticationType** + +
    + +#### AuthorizationResponse enum + +[Le tableau 101](#table-101) présente les valeurs autorisées pour l’énumération `AuthorizationResponse`. + +###### Tableau 101 + +| **Nom** | **Description** | +| --- | --- | +| **ENTERED** | Le consommateur a saisi la valeur d’authentification. | +| **REJECTED** | Le consommateur a rejeté la transaction. | +| **RESEND** | Le consommateur demande de renvoyer la valeur d’authentification. | + +**Tableau 101 -- Énumération AuthorizationResponse** + +
    + +#### BulkTransferState enum + +[Le tableau 102](#table-102) présente les valeurs autorisées pour l’énumération `BulkTransferState`. + +###### Tableau 102 + +| **Nom** | **Description** | +| --- | --- | +| **RECEIVED** | Le FSP bénéficiaire a reçu le transfert en lot du FSP payeur. | +| **PENDING** | Le FSP bénéficiaire a validé le transfert en lot. | +| **ACCEPTED** | Le FSP bénéficiaire a accepté le transfert en lot pour traitement. | +| **PROCESSING** | Le FSP bénéficiaire a commencé à transférer les fonds aux bénéficiaires. | +| **COMPLETED** | Le FSP bénéficiaire a terminé le transfert des fonds aux bénéficiaires. | +| **REJECTED** | Le FSP bénéficiaire a rejeté le traitement du transfert en lot. | + +**Tableau 102 -- Énumération BulkTransferState** + +
    + +#### Code devise (CurrencyCode) enum + +Les codes de devise définis par la norme ISO 421736 sous forme de codes alphabétiques à trois lettres sont utilisés comme représentation standard des devises. Les codes ISO 4217 ne sont pas listés ici, les implémenteurs sont invités à se référer directement à la norme ISO 4217. + +
    + +#### PartyIdType enum + +[Le tableau 103](#Table-103) présente les valeurs autorisées pour l’énumération `PartyIdType`. + +###### Tableau 103 + +| **Nom** | **Description** | +| --- | --- | +| **MSISDN** | Un MSISDN (numéro international de téléphone mobile) est utilisé pour référencer une Partie. Il doit être au format E.164 ITU-T, éventuellement précédé d’un "+". | +| **EMAIL** | Une adresse email est utilisée pour référencer une Partie. Format selon RFC 3696. | +| **PERSONAL_ID** | Un identifiant personnel (numéro de passeport, d'acte de naissance, d’enregistrement national, etc.) Pour le type voir [PartySubIdOrType](#partysubidortype-element). | +| **BUSINESS** | Une entreprise spécifique (ex : société, organisation) est utilisée pour référencer un participant. Format libre. Pour cibler un identifiant spécifique (utilisateur, facture, etc.) utiliser [PartySubIdOrType](#partysubidortype-element). | +| **DEVICE** | Un identifiant de dispositif spécifique (ex : TPE ou DAB) est utilisé pour une Partie. Pour une référence sous une entreprise, utiliser [PartySubIdOrType](#partysubidortype-element). | +| **ACCOUNT_ID** | Un numéro de compte bancaire ou identifiant FSP doit être utilisé pour référencer un participant. Format libre variant selon le pays et le FSP. | +| **IBAN** | Un numéro IBAN est utilisé pour référencer un participant. Jusqu’à 34 caractères alphanumériques sans espaces. | +| **ALIAS** | Un alias est utilisé pour référencer un participant (ex : username/pseudo). Un sous-compte peut aussi être ciblé via [PartySubIdOrType](#partysubidortype-element). | + +**Tableau 103 -- Énumération PartyIdType** + +
    + +#### PersonalIdentifierType enum + +[Le tableau 104](#table-104) présente les valeurs autorisées pour l’énumération `PersonalIdentifierType`. + +###### Tableau 104 + +| **Nom** | **Description** | +| --- | --- | +| **PASSPORT** | Numéro de passeport. | +| **NATIONAL_REGISTRATION** | Numéro d’enregistrement national. | +| **DRIVING_LICENSE** | Permis de conduire. | +| **ALIEN_REGISTRATION** | Numéro d’enregistrement d’étranger. | +| **NATIONAL_ID_CARD** | Numéro de carte d’identité nationale. | +| **EMPLOYER_ID** | Numéro d’identification fiscale (employeur). | +| **TAX_ID_NUMBER** | Numéro d’identification fiscale. | +| **SENIOR_CITIZENS_CARD** | Numéro de carte senior. | +| **MARRIAGE_CERTIFICATE** | Numéro d’acte de mariage. | +| **HEALTH_CARD** | Numéro de carte de santé. | +| **VOTERS_ID** | Numéro de carte d’électeur. | +| **UNITED_NATIONS** | Numéro ONU. | +| **OTHER_ID** | Tout autre type d’identifiant. | + +**Tableau 104 -- Énumération PersonalIdentifierType** + +
    + +#### TransactionInitiator + +[Le tableau 105](#table-105) décrit les valeurs autorisées pour l’énumération `TransactionInitiator`. + +###### Tableau 105 + +| **Nom** | **Description** | +| --- | --- | +| **PAYER** | Le payeur initie la transaction. Le compte source lui appartient ou lui est associé d’une manière ou d’une autre. | +| **PAYEE** | Le bénéficiaire initie la transaction en envoyant une demande de transaction. Le payeur doit approuver (automatiquement ou manuellement). | + +**Tableau 105 -- Énumération TransactionInitiator** + +
    + +#### TransactionInitiatorType + +[Le tableau 106](#table-106) présente les valeurs autorisées pour l’énumération `TransactionInitiatorType`. + +###### Tableau 106 + +| **Nom** | **Description** | +| --- | --- | +| **CONSUMER** | Le consommateur est l’initiateur de la transaction. | +| **AGENT** | L’agent est l’initiateur de la transaction. | +| **BUSINESS** | L’entreprise est l’initiatrice de la transaction. | +| **DEVICE** | L’équipement est l’initiateur de la transaction. | + +**Tableau 106 -- Énumération TransactionInitiatorType** + +
    + +#### TransactionRequestState + +[Le tableau 107](#table-107) présente les valeurs autorisées pour l’énumération `TransactionRequestState`. + +###### Tableau 107 + +| **Nom** | **Description** | +| --- | --- | +| **RECEIVED** | Le FSP du payeur a reçu la transaction du FSP du bénéficiaire. | +| **PENDING** | Le FSP du payeur a transmis la demande de transaction au payeur. | +| **ACCEPTED** | Le payeur a approuvé la transaction. | +| **REJECTED** | Le payeur a rejeté la transaction. | + +**Tableau 107 -- Énumération TransactionRequestState** + +
    + +#### TransactionScenario + +[Le tableau 108](#table-108) présente les valeurs autorisées pour l’énumération `TransactionScenario`. + +###### Tableau 108 + +| **Nom** | **Description** | +| --- | --- | +| **DEPOSIT** | Pour effectuer un dépôt (cash-in) : transfert de fonds électroniques vers le consommateur, remise d’espèces au commerçant. | +| **WITHDRAWAL** | Pour effectuer un retrait (cash-out) : transfert de fonds électroniques au commerçant, remise d’espèces au client. | +| **TRANSFER** | Pour un transfert de personne à personne (P2P). | +| **PAYMENT** | Pour effectuer le paiement d’un consommateur à un commerçant ou une organisation, ou un paiement B2B. Peut concerner un achat en ligne, un paiement sur place, une facture, un don, etc. | +| **REFUND** | Pour effectuer un remboursement. | + +**Tableau 108 -- Énumération TransactionScenario** + +
    + +#### TransactionState + +[Le tableau 109](#table-109) présente les valeurs autorisées pour l’énumération `TransactionState`. + +###### Tableau 109 + +| **Nom** | **Description** | +| --- | --- | +| **RECEIVED** | Le FSP du bénéficiaire a reçu la transaction du FSP du payeur. | +| **PENDING** | Le FSP du bénéficiaire a validé la transaction. | +| **COMPLETED** | Le FSP du bénéficiaire a exécuté la transaction avec succès. | +| **REJECTED** | Le FSP du bénéficiaire a échoué à réaliser la transaction. | + +**Tableau 109 -- Énumération TransactionState** + +
    + +#### TransferState + +[Le tableau 110](#table-110) présente les valeurs autorisées pour l’énumération `TransferState`. + +###### Tableau 110 + +| **Nom** | **Description** | +| --- | --- | +| **RECEIVED** | Le ledger suivant a reçu le transfert. | +| **RESERVED** | Le ledger suivant a réservé le transfert. | +| **COMMITTED** | Le ledger suivant a validé le transfert. | +| **ABORTED** | Le ledger suivant a annulé le transfert à cause d’un rejet ou d’un échec. | + +**Tableau 110 -- Énumération TransferState** + +
    + +### Codes d’erreur + +###### Figure 63 + +Chaque code d’erreur de l’API est un nombre à quatre chiffres, par exemple **1234**, où le premier chiffre (**1** ici) indique la catégorie d’erreur principale, le deuxième (**2**) la sous-catégorie, et les deux derniers (**34**) l’erreur spécifique. [Figure 63](#figure-63) montre la structure d’un code d’erreur. Les sections suivantes détaillent les codes d’erreur définis pour chaque catégorie. + +![Figure 63](../../assets/diagrams/images/figure63.svg) + +**Figure 63 -- Structure des codes d’erreur** + +Chaque combinaison de catégories principale et secondaire possède une erreur générique (_x_**0**_xx_), utilisable s’il n’existe pas d’erreur plus spécifique, ou si le serveur ne souhaite pas communiquer plus d’information. + +Toutes les erreurs spécifiques inférieures à _xx_**40** (c’est-à-dire de _xx_**00** à _xx_**39**) sont réservées à un usage ultérieur de l’API. Celles à partir de _xx_**40** peuvent servir pour des besoins propres à un schéma. Si un client reçoit une erreur inconnue propre à un schéma, elle devra être traitée comme une erreur générique de la catégorie (_xx_**00**). + +#### Erreurs de communication -- 1_xxx_ + +Toutes les erreurs de communication ou réseau n’étant pas couvertes par un code HTTP doivent utiliser le code d’erreur principal **1** (codes **1**_xxx_). Comme tous les services de l’API sont asynchrones, ces erreurs sont généralement émises par le Switch au client FSP si le FSP pair est injoignable ou si aucun callback n’est reçu dans le délai convenu. + +Sous-catégories pour les erreurs de communication : + +- **Erreur de communication générique** -- **10**_xx_ + +Voir [Tableau 111](#table-111) pour la liste des erreurs de ce type. + +###### Tableau 111 + +| **Code d’erreur** | **Nom** | **Description** | /participants | /parties | /transactionRequests | /quotes | /authorizations | /transfers | /transactions | /bulkQuotes | /bulkTransfers | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| **1000** | Erreur de communication | Erreur de communication générique. | X | X | X | X | X | X | X | X | X | +| **1001** | Erreur de communication destination | La destination de la requête n’a pas pu être jointe (échec de réponse intermédiaire). | X | X | X | X | X | X | X | X | X | + +**Tableau 111 -- Erreurs de communication -- 1_xxx_** + +#### Erreurs serveur -- 2_xxx_ + +Toutes les erreurs survenues côté serveur où ce dernier n’a pas pu satisfaire une requête apparemment valide du client utilisent la catégorie **2** (codes **2**_xxx_). Ces erreurs signifient que le serveur est conscient d’avoir rencontré une erreur ou d’être incapable de traiter la demande. + +Sous-catégories pour les erreurs serveur : + +- **Erreur serveur générique** -- **20**_xx_ + +Voir [Tableau 112](#Table-112) pour les erreurs serveur définies. + +###### Tableau 112 + +| **Code d’erreur** | **Nom** | **Description** | /participants | /parties | /transactionRequests | /quotes | /authorizations | /transfers | /transactions | /bulkQuotes | /bulkTransfers | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| **2000** | Erreur serveur générique | Erreur serveur générique pour ne pas divulguer d’informations privées. | X | X | X | X | X | X | X | X | X | +| **2001** | Erreur serveur interne | Exception inattendue générique (bug ou cas non géré). | X | X | X | X | X | X | X | X | X | +| **2002** | Non implémenté | Service demandé non supporté par le serveur. | X | X | X | X | X | X | X | X | X | +| **2003** | Service indisponible | Service demandé indisponible (maintenance, panne temporaire, etc.). | X | X | X | X | X | X | X | X | X | +| **2004** | Timeout serveur | Le serveur n’a pas reçu de callback dans le délai imparti (timeout). | X | X | X | X | X | X | X | X | X | +| **2005** | Serveur surchargé | Le serveur refuse les requêtes pour surcharge. Réessayez plus tard. | X | X | X | X | X | X | X | X | X | + +**Tableau 112 -- Erreurs serveur -- 2_xxx_** + +#### Erreurs côté Client -- 3_xxx_ + +Toutes les erreurs possibles se produisant sur le serveur, où ce dernier signale que le client a envoyé un ou plusieurs paramètres erronés, doivent utiliser le code d’erreur principal **3** (codes d’erreur **3**_xxx_). Ces codes d’erreur indiquent que le serveur n’a pas pu effectuer le service selon la demande du client. Le serveur doit fournir une explication sur la raison pour laquelle le service n’a pas pu être exécuté. + +Catégories de bas niveau définies sous les erreurs client : + +- **Erreur Générique du Client** -- **30**_xx_ + + - Voir [Tableau 113](#table-113) pour la liste des erreurs génériques côté client définies dans l’API. + +- **Erreur de Validation** -- **31**_xx_ + + - Voir [Tableau 114](#table-114) pour la liste des erreurs de validation dans l’API. + +- **Erreur d’Identifiant** -- **32**_xx_ + + - Voir [Tableau 115](#table-115) pour la liste des erreurs d’identification dans l’API. + +- **Erreur d’Expiration** -- **33**_xx_ + + - Voir [Tableau 116](#table-116) pour la liste des erreurs d’expiration dans l’API. + +###### Tableau 113 + +| **Code d’erreur** | **Nom** | **Description** | /participants | /parties | /transactionRequests | /quotes | /authorizations | /transfers | /transactions | /bulkQuotes | /bulkTransfers | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| **3000** | Erreur générique côté client | Erreur générique côté client, utilisée pour ne pas divulguer d’informations sensibles. | X | X | X | X | X | X | X | X | X | +| **3001** | Version demandée non acceptable | Le client a demandé une version du protocole qui n’est pas supportée par le serveur. | X | X | X | X | X | X | X | X | X | +| **3002** | URI inconnue | L’URI fournie est inconnue du serveur. | X | X | X | X | X | X | X | X | X | +| **3003** | Erreur d’ajout d’information de Partie | Une erreur s’est produite lors de l’ajout ou de la mise à jour des informations concernant une Partie. | X | X | X | X | X | X | X | X | X | + +**Tableau 113 -- Erreurs génériques côté client -- 30_xx_** + +###### Tableau 114 + +| **Code d’erreur** | **Nom** | **Description** | /participants | /parties | /transactionRequests | /quotes | /authorizations | /transfers | /transactions | /bulkQuotes | /bulkTransfers | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| **3100** | Erreur de validation générique | Erreur de validation générique utilisée pour ne pas divulguer d’informations sensibles. | X | X | X | X | X | X | X | X | X | +| **3101** | Syntaxe mal formée | Le format du paramètre n’est pas valide. Par exemple, montant fixé à **5.ABC**. Le champ de description d’erreur devrait préciser quel élément est erroné. | X | X | X | X | X | X | X | X | X | +| **3102** | Élément obligatoire manquant | Élément obligatoire absent dans le modèle de données. | X | X | X | X | X | X | X | X | X | +| **3103** | Trop d’éléments | Le nombre d’éléments dans un tableau dépasse le nombre maximum autorisé. | X | X | X | X | X | X | X | X | X | +| **3104** | Charge utile trop volumineuse | La taille de la charge utile dépasse la taille maximale autorisée. | X | X | X | X | X | X | X | X | X | +| **3105** | Signature invalide | Certains paramètres du message ont été modifiés, rendant la signature invalide. Cela peut indiquer que le message a été modifié de manière malveillante. | X | X | X | X | X | X | X | X | X | +| **3106** | Requête modifiée | Une précédente requête avec le même ID a déjà été traitée, mais avec des paramètres différents. ||| X | X | X | X | X | X | X | +| **3107** | Paramètre d’extension obligatoire manquant | Un paramètre d’extension obligatoire pour le schéma est absent. ||| X | X | X | X | X | X | X | + +**Tableau 114 -- Erreurs de validation -- 31_xx_** + +###### Tableau 115 + +| **Code d’erreur** | **Nom** | **Description** | /participants | /parties | /transactionRequests | /quotes | /authorizations | /transfers | /transactions | /bulkQuotes | /bulkTransfers | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| **3200** | Identifiant générique non trouvé | Erreur générique d’identifiant fournie par le client. | X | X | X | X | X | X | X | X | X | +| **3201** | Erreur FSP Destinataire | Le FSP destinataire n’existe pas ou est introuvable. | X | X | X | X | X | X | X | X | X | +| **3202** | Identifiant FSP Payeur introuvable | Identifiant FSP Payeur fourni introuvable. |||||| X ||| X | +| **3203** | Identifiant FSP Bénéficiaire introuvable | Identifiant FSP Bénéficiaire fourni introuvable. |||||| X ||| X | +| **3204** | Partie non trouvée | Partie avec l’identifiant, le type d’identifiant et le sous-id ou type optionnel fournis non trouvée. | X | X | X | X |||||| +| **3205** | Identifiant de devis introuvable | Devis fourni introuvable sur le serveur. |||| X || X |||| +| **3206** | ID de demande de transaction introuvable | Demande de Transaction fournie introuvable sur le serveur. ||| X ||| X |||| +| **3207** | ID de transaction introuvable | ID de transaction fourni introuvable sur le serveur. ||||||| X ||| +| **3208** | ID de transfert introuvable | ID de transfert fourni introuvable sur le serveur. |||||| X |||| +| **3209** | ID de devis groupé introuvable | ID de devis groupé fourni introuvable sur le serveur. |||||||| X | X | +| **3210** | ID de transfert groupé introuvable | ID de transfert groupé fourni introuvable sur le serveur. ||||||||| X | + +**Tableau 115 -- Erreurs d’identifiant -- 32_xx_** + +###### Tableau 116 + +| **Code d’erreur** | **Nom** | **Description** | /participants | /parties | /transactionRequests | /quotes | /authorizations | /transfers | /transactions | /bulkQuotes | /bulkTransfers | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| **3300** | Erreur générique d’expiration | Erreur d’objet expiré générique, à utiliser pour ne pas divulguer d’informations sensibles. | X | X | X | X | X | X | X | X | X | +| **3301** | Demande de transaction expirée | Le client a demandé d’utiliser une demande de transaction qui a déjà expiré. |||| X |||||| +| **3302** | Devis expiré | Le client a demandé d’utiliser un devis qui a déjà expiré. ||||| X | X ||| X | +| **3303** | Transfert expiré | Le client a demandé d’utiliser un transfert qui a déjà expiré. | X | X | X | X | X | X | X | X | X | + +**Tableau 116 -- Erreurs d’expiration -- 33_xx_** + +#### Erreurs côté Payeur -- 4_xxx_ + +Toutes les erreurs se produisant sur le serveur dont la cause est liée au Payeur ou à son FSP doivent utiliser le code d’erreur principal **4** (codes **4**_xxx_). Ces codes d’erreur indiquent qu’il n’y a pas eu d’erreur sur le serveur ni dans la requête du client, mais que la requête a échoué pour une raison liée au Payeur ou à son FSP. Le serveur doit fournir une explication sur la raison pour laquelle le service n’a pas pu être exécuté. + +Catégories de bas niveau définies pour les erreurs côté Payeur : + +- **Erreur Générique Payeur** -- **40**_xx_ +- **Erreur de Rejet Payeur** -- **41**_xx_ +- **Erreur de Limite Payeur** -- **42**_xx_ +- **Erreur de Permission Payeur** -- **43**_xx_ +- **Erreur Payeur Bloqué** -- **44**_xx_ + +Voir [Tableau 117](#table-117) pour les erreurs Payeur définies dans l’API. + +###### Tableau 117 + +| **Code d’erreur** | **Nom** | **Description** | /participants | /parties | /transactionRequests | /quotes | /authorizations | /transfers | /transactions | /bulkQuotes | /bulkTransfers | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| **4000** | Erreur générique Payeur | Erreur générique liée au Payeur ou à son FSP. Utilisée pour protéger les informations pouvant être sensibles. ||| X | X | X | X | X | X | X | +| **4001** | FSP Payeur liquidité insuffisante | Le FSP Payeur n’a pas assez de liquidité pour effectuer le transfert. |||||| X |||| +| **4100** | Rejet générique Payeur | Le Payeur ou le FSP Payeur a rejeté la requête. ||| X | X | X | X | X | X | X | +| **4101** | Payeur a rejeté la demande de transaction | Le Payeur a rejeté la demande de transaction du Bénéficiaire. ||| X ||||||| +| **4102** | FSP Payeur type de transaction non supporté | Le FSP Payeur ne supporte pas ou a rejeté le type de transaction demandé. ||| X ||||||| +| **4103** | Payeur devise non supportée | Le Payeur n’a pas de compte supportant la devise demandée. ||| X ||||||| +| **4200** | Erreur de limite Payeur | Erreur de limite générique, par exemple nombre de paiements journalier/mensuel dépassé ou montant de la transaction supérieur au maximum autorisé. ||| X | X || X || X | X | +| **4300** | Erreur de permission Payeur | Erreur de permission générique, le Payeur ou son FSP n’a pas les droits pour réaliser le service. ||| X | X | X | X | X | X | X | +| **4400** | Erreur Payeur bloqué générique | Erreur Payeur bloqué générique ; le Payeur est bloqué ou a échoué les contrôles réglementaires. ||| X | X | X | X | X | X | X | + +**Tableau 117 -- Erreurs côté Payeur -- 4_xxx_** + +#### Erreurs côté Bénéficiaire -- 5_xxx_ + +Toutes les erreurs se produisant sur le serveur pour lesquelles le Bénéficiaire ou son FSP est la cause de l’erreur utilisent le code d’erreur principal **5** (codes **5**_xxx_). Ces codes d’erreur indiquent qu’il n’y a pas eu d’erreur sur le serveur ni dans la requête du client, mais que la requête a échoué pour une raison liée au Bénéficiaire ou à son FSP. Le serveur doit fournir une explication sur la raison pour laquelle le service n’a pas pu être exécuté. + +Catégories de bas niveau pour les erreurs Bénéficiaire : + +- **Erreur Générique Bénéficiaire** -- **50**_xx_ +- **Erreur de Rejet Bénéficiaire** -- **51**_xx_ +- **Erreur de Limite Bénéficiaire** -- **52**_xx_ +- **Erreur de Permission Bénéficiaire** -- **53**_xx_ +- **Erreur Bénéficiaire Bloqué** -- **54**_xx_ + +Voir [Tableau 118](#table-118) pour toutes les erreurs Bénéficiaire définies dans l’API. + +###### Tableau 118 + +| **Code d’erreur** | **Nom** | **Description** | /participants | /parties | /transactionRequests | /quotes | /authorizations | /transfers | /transactions | /bulkQuotes | /bulkTransfers | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| **5000** | Erreur générique Bénéficiaire | Erreur générique due au Payeur ou à son FSP, à utiliser pour ne pas divulguer d’informations sensibles. ||| X | X | X | X | X | X | X | +| **5001** | FSP Bénéficiaire liquidité insuffisante | FSP Bénéficiaire n’a pas assez de liquidité pour effectuer le transfert. |||||| X |||| +| **5100** | Rejet générique Bénéficiaire | Le Bénéficiaire ou son FSP a rejeté la requête. ||| X | X | X | X | X | X | X | +| **5101** | Bénéficiaire a rejeté le devis | Le Bénéficiaire ne souhaite pas poursuivre la transaction après réception du devis. |||| X |||| X || +| **5102** | FSP Bénéficiaire type de transaction non supporté | FSP Bénéficiaire ne supporte pas ou a rejeté le type de transaction demandé. |||| X ||||| X | +| **5103** | FSP Bénéficiaire a rejeté le devis | Le FSP Bénéficiaire ne souhaite pas poursuivre la transaction après réception du devis. |||| X |||| X || +| **5104** | Bénéficiaire a rejeté la transaction | Le Bénéficiaire a rejeté la transaction financière. |||||| X ||| X | +| **5105** | FSP Bénéficiaire a rejeté la transaction | Le FSP Bénéficiaire a rejeté la transaction financière. |||||| X ||| X | +| **5106** | Devise non supportée par le Bénéficiaire | Le Bénéficiaire ne possède pas de compte prenant en charge la devise demandée. |||| X || X || X | X | +| **5200** | Erreur de limite Bénéficiaire | Erreur de limite générique, par exemple Bénéficiaire recevant plus de paiements par jour/mois que permis, ou recevant un paiement dépassant le montant maximum par transaction. ||| X | X || X || X | X | +| **5300** | Erreur de permission Bénéficiaire | Erreur de permission générique, le Bénéficiaire ou son FSP n’a pas les droits pour réaliser le service. ||| X | X | X | X | X | X | X | +| **5400** | Erreur Bénéficiaire bloqué générique | Erreur générique Bénéficiaire bloqué, le Bénéficiaire est bloqué ou a échoué les contrôles réglementaires. ||| X | X | X | X | X | X | X | + +**Tableau 118 -- Erreurs côté Bénéficiaire -- 5_xxx_** + + +## Liaison avec les schémas génériques des transactions + +Cette section décrit comment les schémas logiques de transaction présentés dans [Schémas de Transactions Génériques](../generic-transaction-patterns) sont utilisés dans la liaison REST asynchrone de l’API. De nombreuses informations sont présentées sous forme de diagrammes de séquence. Pour plus d’informations sur les étapes de ces diagrammes, voir [Schémas de Transactions Génériques](../generic-transaction-patterns). + +### Transaction Initiée par le Payeur + +Le schéma `Transaction Initiée par le Payeur` est introduit dans [Schémas de Transactions Génériques](../generic-transaction-patterns#payer-initiated-transaction). À un niveau général, ce schéma doit être utilisé chaque fois qu’un Payeur souhaite transférer des fonds à une autre Partie qui ne se trouve pas dans le même FSP que le Payeur. [Figure 64](#figure-64) présente le diagramme de séquence pour une `Transaction Initiée par le Payeur` utilisant la liaison REST asynchrone de la version logique. Le processus de chaque numéro dans le diagramme de séquence est décrit dans [Schémas de Transactions Génériques](../generic-transaction-patterns#payer-initiated-transaction). + +###### Figure 64 + +![](../../assets/diagrams/sequence/figure64.svg) + +**Figure 64 -- Schéma Transaction Initiée par le Payeur utilisant l’API REST asynchrone** + +### Transaction Initiée par le Bénéficiaire + +Le schéma `Transaction Initiée par le Bénéficiaire` est introduit dans [Schémas de Transactions Génériques](../generic-transaction-patterns#payer-initiated-transaction). À un niveau général, le schéma doit être utilisé lorsqu’un Bénéficiaire souhaite demander au Payeur de transférer des fonds vers le Bénéficiaire. Le Payeur et le Bénéficiaire sont supposés dans des FSP différents, et l’approbation de la transaction est réalisée dans le FSP Payeur. Si l’entrée et l’approbation de la transaction ont lieu sur un appareil du Bénéficiaire, utilisez plutôt le schéma connexe Transaction Initiée par le Bénéficiaire avec OTP](#payee-initiated-transaction-using-otp). [Figure 65](#figure-65) présente le diagramme de séquence pour une `Transaction Initiée par le Bénéficiaire` utilisant la liaison REST asynchrone de la version logique. Le processus pour chaque numéro du diagramme est décrit dans [Schémas de Transactions Génériques](../generic-transaction-patterns#payee-initiated-transaction). + +###### Figure 65 + +![](../../assets/diagrams/sequence/figure65.svg) + +**Figure 65 -- Schéma Transaction Initiée par le Bénéficiaire utilisant l’API REST asynchrone** + +### Transaction Bénéficiaire Initiée avec OTP + +Le schéma `Transaction Initiée par le Bénéficiaire avec OTP` est introduit dans [Schémas de Transactions Génériques](../generic-transaction-patterns#payee-initiated-transaction-using-otp). À un niveau général, ce schéma ressemble à [Transaction Initiée par le Bénéficiaire](#payee-initiated-transaction) ; cependant, dans ce schéma les informations de transaction et l’approbation du Payeur sont affichées et saisies sur un appareil du Bénéficiaire. Comme pour les autres schémas, le Payeur et le Bénéficiaire sont dans des FSP différents. [Figure 66](#figure-66) montre le diagramme pour une `Transaction Initiée par le Bénéficiaire avec OTP` utilisant la liaison REST asynchrone de la version logique. Le processus de chaque étape du diagramme est décrit dans [Schémas de Transactions Génériques](../generic-transaction-patterns#payee-initiated-transaction-using-otp). + +###### Figure 66 + +![](../../assets/diagrams/sequence/figure66.svg) + +**Figure 66 -- Schéma Transaction Initiée par le Bénéficiaire avec OTP via REST asynchrone** + +### Transactions Groupées + +Le schéma `Transactions Groupées` est introduit dans [Schémas de Transactions Génériques](../generic-transaction-patterns#bulk-transactions). Ce schéma est utilisé lorsque le Payeur souhaite transférer des fonds à plusieurs Bénéficiaires au sein d’une seule transaction. Les Bénéficiaires peuvent être dans différents FSP. [Figure 67](#figure-67) montre le diagramme de séquence pour des `Transactions Groupées` utilisant la liaison REST asynchrone de la version logique. L’explication de chaque étape du diagramme est disponible dans [Schémas de Transactions Génériques](../generic-transaction-patterns#bulk-transactions). + +###### Figure 67 + +![](../../assets/diagrams/sequence/figure67.svg) + +**Figure 67 -- Schéma Transactions groupées via REST asynchrone** + +
    + +## Gestion des erreurs de l’API + +Cette section décrit comment gérer les réponses ou callbacks absents ainsi que les erreurs à traiter côté serveur lors du traitement d’une requête. + +### Requête Erronée + +Si un serveur reçoit une requête de service erronée qui peut être traitée immédiatement (par exemple, syntaxe mal formée ou ressource non trouvée), un code d’erreur HTTP approprié côté client (commençant par **4_xx_**) doit être retourné au client dans la réponse. Les codes d’erreur HTTP définis pour l’API sont listés dans le [Tableau 4](#table-4). La réponse HTTP peut aussi contenir un élément [**ErrorInformation**](#errorinformation) afin de donner plus de détails sur l’erreur (voir [Informations d’erreur dans la réponse HTTP](#error-information-in-http-response)). + +
    + +### Erreur serveur lors du traitement d’une requête + +[Figure 68](#figure-68) montre un exemple sur la gestion d’une erreur survenue lors du traitement serveur. + +###### Figure 68 + +![](../../assets/diagrams/sequence/figure68.svg) + +**Figure 68 -- Erreur côté serveur lors du traitement d’une requête** + +#### Étapes internes du traitement + +La liste suivante décrit les étapes de la séquence (voir [Figure 68](#figure-68)). + +1. Le client souhaite que le serveur crée un nouvel objet de service et utilise donc une requête **POST**. + +2. Le serveur reçoit la requête. Il envoie immédiatement une réponse **accepted** au client, puis tente de créer l’objet selon la demande. Une erreur de traitement survient et la demande ne peut être satisfaite. Le serveur envoie alors le callback **_PUT_ /**_{resource}_**/**_{ID}_**/error** incluant un code d’erreur ([Codes d’erreur](#error-codes)) et une description pour notifier le client. + +3. Le client reçoit le callback d’erreur et répond immédiatement avec **OK**. Il gère ensuite l’erreur. + +4. Le serveur reçoit la réponse **OK** et le processus est terminé. + +
    + +### Gestion côté client d’un callback d’erreur + +Les sections suivantes expliquent comment un client doit traiter les callbacks d’erreur reçus d’un serveur. + +#### Ressource API /participants + +L’erreur typique du service **/participants** est que la Partie demandée n’a pas été trouvée. Le client peut soit essayer un autre serveur, soit informer l’utilisateur final que la Partie recherchée est introuvable. + +#### Ressource API /parties + +L’erreur typique du service **/parties** est que la Partie demandée n’a pas été trouvée. Le client peut soit essayer un autre serveur, soit informer l’utilisateur final que les informations recherchées sont indisponibles. + +#### Ressource API /quotes + +L’erreur typique du service **/quotes** est qu’un devis n’a pas pu être calculé pour la transaction demandée. Le client doit notifier l’utilisateur final que la transaction n’a pas pu être réalisée. + +#### Ressource API /transactionRequests + +L’erreur typique du service **/transactionRequests** est que le Payeur a rejeté la transaction ou qu’une validation automatique a échoué. Le client doit informer le Bénéficiaire que la demande de transaction a échoué. + +#### Ressource API /authorizations + +L’erreur typique du service **/authorizations** est que la demande de transaction n’a pas été trouvée. Le client doit informer le Payeur que la demande a été annulée. + +#### Ressource API /transfers + +L’erreur typique du service **/transfers** est qu’un échec a eu lieu lors du transfert hop-to-hop ou lors de la transaction financière de bout en bout. Par exemple : dépassement de limite ou Bénéficiaire introuvable. Dans tous les cas d’erreur, le client (FSP Payeur) doit annuler la réservation pour la transaction financière réalisée avant la demande d’exécution sur le serveur (FSP Bénéficiaire). Voir [Figure 69](#figure-69) pour un exemple avec un Switch financier entre les FSP. + +###### Figure 69 + +![](../../assets/diagrams/sequence/figure69.svg) + +**Figure 69 -- Gestion du callback d’erreur suite à POST /transfers** + +##### Étapes internes du traitement + +La liste suivante détaille les étapes de la séquence (voir [Figure 69](#figure-69)). + +1. La réservation du transfert est faite depuis le compte du Payeur vers un compte Switch combiné ou un compte FSP Bénéficiaire. Lorsque la réservation est réussie, la demande [POST /transfers](#post-transfers) est utilisée sur le Switch. Le transfert devient alors irrévocable côté FSP Payeur. Le FSP Payeur attend la réponse **accepted** du Switch. + +2. Le Switch reçoit la demande [POST /transfers](#post-transfers), envoie de suite une réponse **accepted** au FSP Payeur, puis effectue toutes les validations internes nécessaires. Si tout est valide, une réservation est effectuée du FSP Payeur vers le FSP Bénéficiaire. Une fois cette réservation réussie, [POST /transfers](#post-transfers) est utilisé côté FSP Bénéficiaire. Le transfert est alors irrévocable du côté Switch. Le Switch attend une réponse **accepted** du FSP Bénéficiaire. + +3. Le FSP Bénéficiaire reçoit le [POST /transfers](#post-transfers) et envoie immédiatement une réponse **accepted** au Switch. Il effectue ses propres validations. On suppose ici qu’une validation échoue (par exemple, pour dépassement de limite). Le callback d’erreur [PUT /transfers/_{ID}_/error](#put-transfers-id-error) est utilisé vers le Switch pour informer le FSP Payeur de l’erreur. Le FSP Bénéficiaire attend alors la réponse **OK** du Switch pour conclure le processus. + +4. Le Switch reçoit le callback d’erreur [PUT /transfers/_{ID}_/error](#put-transfers-id-error) et répond immédiatement avec **OK**. Il annule le transfert réservé suite à la réception du callback d’erreur. Le Switch utilise alors le callback [PUT /transfers/_{ID}_/error](#put-transfers-id-error) vers le FSP Payeur avec les mêmes paramètres, et attend une réponse **OK** pour terminer la procédure. + +5. Le FSP Payeur reçoit le callback [PUT /transfers/_{ID}_/error](#put-transfers-id-error) et répond immédiatement avec **OK**. Il annule sa propre réservation de transfert suite à la réception du callback d’erreur. + +#### Ressource API /transactions + +L’erreur normale du service **/transactions** est que la transaction n’a pas été trouvée dans le FSP Pair. + +#### Ressource API /bulkQuotes + +L’erreur typique du service **/bulkQuotes** est qu’un devis n’a pas pu être calculé pour la transaction demandée. Le client doit notifier l’utilisateur final que la transaction demandée a échoué. + +#### Ressource API /bulkTransfers + +L’erreur classique du service **/bulkTransfers** est que la transaction groupée n’a pas été acceptée, par exemple suite à une erreur de validation. Dans tous les cas d’erreur, le client (FSP Payeur) doit annuler la réservation des transactions financières effectuées avant la demande côté FSP Bénéficiaire. Voir [Figure 70](#figure-70) pour un exemple avec Switch financier entre les FSP. + +###### Figure 70 + +![](../../assets/diagrams/sequence/figure70.svg) + +**Figure 70 -- Gestion du callback d’erreur pour le service API /bulkTransfers** + +##### Étapes internes du traitement + +La liste suivante décrit les étapes de la séquence (voir [Figure 70](#figure-70)). + +1. Chaque transfert individuel du transfert groupé est réservé depuis le compte du Payeur vers un compte Switch combiné ou un compte FSP Bénéficiaire. Une fois toutes les réservations individuelles réussies, [POST /bulkTransfers](#post-bulktransfers) est utilisé sur le Switch. Le transfert groupé devient alors irrévocable côté FSP Payeur. Ce dernier attend une réponse **accepted** du Switch. + +2. Le Switch reçoit [POST /bulkTransfers](#post-bulktransfers) et répond immédiatement **accepted** au FSP Payeur. Il réalise toutes les validations nécessaires. Si celles-ci passent, chaque transfert individuel est réservé du FSP Payeur au FSP Bénéficiaire. Une fois les réservations validées, [POST /bulkTransfers](#post-bulktransfers) est utilisé vers le FSP Bénéficiaire. Le transfert groupé devient irrévocable côté Switch, qui attend alors la réponse **accepted** du FSP Bénéficiaire. + +3. Le FSP Bénéficiaire reçoit [POST /bulkTransfers](#post-bulktransfers), répond de suite **accepted** au Switch, puis effectue ses validations sur le transfert groupé. Supposons qu’une validation empêche tout le transfert groupé. Le callback d’erreur [PUT /bulkTransfers/_{ID}_/error](#put-bulktransfers-id-error) est utilisé vers le Switch pour informer le FSP Payeur. Le FSP Bénéficiaire attend ensuite la réponse **OK** du Switch. + +4. Le Switch reçoit le callback d’erreur [PUT /bulkTransfers/_{ID}_/error](#put-bulktransfers-id-error) et répond immédiatement par **OK**. Il annule toutes les réservations de transferts précédentes, puis utilise à son tour le callback [PUT /bulkTransfers/_{ID}_/error](#put-bulktransfers-id-error) vers le FSP Payeur avec les paramètres identiques, et attend la réponse **OK** pour conclure. + +5. Le FSP Payeur reçoit le callback [PUT /bulkTransfers/_{ID}_/error](#put-bulktransfers-id-error), répond par **OK** et annule toutes les réservations précédentes suite à la réception du callback d’erreur. + +
    + +### Absence de réponse du serveur côté Client - Réenvoi de la requête + +[Figure 71](#figure-71) présente un exemple (UML) où un client (FSP ou Switch) gère une absence de réponse d’un serveur (Switch ou FSP Pair) suite à une requête de service, via le renvoi de la même requête de service. + +###### Figure 71 + +![](../../assets/diagrams/sequence/figure71.svg) + +**Figure 71 -- Gestion d’erreur côté client via réenvoi de la requête** + +#### Étapes internes du traitement + +Voici la description détaillée de chaque étape (voir [Figure 71](#figure-71)). + +1. Le client sollicite la création d’un nouvel objet de service coté serveur. La requête HTTP est perdue. + +2. Le client constate qu’aucune réponse n’a été reçue dans un délai imparti, et renvoie la requête de service. + +3. Le serveur reçoit la nouvelle requête, envoie immédiatement une réponse **accepted** au client, puis procède à la création de l’objet selon la demande initiale. + +4. La réponse HTTP **accepted** du serveur se perd en retour, le client constate à nouveau une absence de réponse dans le délai, et renvoie la requête de service. + +5. Le serveur reçoit la nouvelle requête, envoie à nouveau une réponse **accepted** au client, et constate qu’il s’agit d’un doublon (cf. étape 3). Nul besoin de créer un nouvel objet ; un callback est alors envoyé pour notifier le client de l’objet déjà créé à l’étape 3. + +6. Le client reçoit le callback concernant l’objet créé, envoie une réponse HTTP **OK** au serveur pour conclure le processus. + +7. Le serveur reçoit la réponse **OK** du client, le processus est terminé. + +
    + +### Absence de réponse du client côté Serveur + +Un serveur utilisant l’API n’est pas responsable de s’assurer qu’un callback a bien été livré au client. Toutefois, il est recommandé de réessayer en cas de non-réception d'une réponse **OK** du client. + +#### Absence de callback côté client - Utilisation de GET + +[Figure 72](#figure-72) est un diagramme de séquence UML illustrant la manière dont un client (Switch ou FSP Pair) peut gérer une absence de callback de la part d’un client (FSP ou Switch) dans un délai raisonnable. + +###### Figure 72 + +![](../../assets/diagrams/sequence/figure72.svg) + +**Figure 72 -- Gestion d’erreur côté client via requête GET** + +#### Étapes internes du traitement + +La liste suivante détaille les étapes de la séquence (voir [Figure 71](#figure-71)). + +1. Le client souhaite que le serveur crée un nouvel objet de service ; une requête de service est envoyée. + +2. Le serveur reçoit la requête de service, répond immédiatement **accepted** au client, puis crée l’objet conformément à la demande. La création est longue (ex : transfert groupé volumineux). + +3. Le serveur constate l’absence de callback côté client dans un délai raisonnable. Le client utilise alors une requête **GET** avec l’ID fourni initialement. + +4. Le serveur reçoit la requête **GET**, répond **accepted** pour signifier que la demande sera traitée. + +5. Le client reçoit la réponse **accepted** et attend le callback, qui arrive plus tard ; le client envoie alors **OK** en retour et le processus est terminé. + +6. Le serveur envoie le callback contenant l’information demandée, puis reçoit le **OK** qui termine le processus. + +
    + +## Exemple bout-en-bout + +Cette section contient un exemple complet où un titulaire de compte est provisionné, puis un transfert P2P depuis un Payeur sur un FSP vers un Bénéficiaire sur un autre FSP est effectué. L’exemple inclut les requêtes et réponses HTTP, les en-têtes HTTP, et les modèles de données JSON, mais exclut la sécurité JWS ([_Signature_](./signature.md)) et le chiffrement JWE ([_Encryption_](./encryption.md)). + +### Configuration de l’exemple + +Description de l’environnement de l’exemple. + +#### Nœuds + +###### Figure 73 + +Les nœuds de l’exemple bout-en-bout sont simplifiés à deux FSP : une banque (identifiant **BankNrOne**), un opérateur mobile money (**MobileMoney**), et un Switch (identifiant **Switch**). Le Switch joue aussi le rôle de ALS (Account Lookup System, ou Système de Recherche de Compte) ([voir Figure 73](#figure-73)). + +![Figure 73](../../assets/diagrams/images/figure73.svg) + +**Figure 73 -- Nœuds de l’exemple bout-en-bout** + +#### Titulaires de comptes + +Les titulaires de compte dans l’exemple sont : + +- Un titulaire de compte chez **BankNrOne** nommé Mats Hagman. Il dispose d’un compte IBAN **SE4550000000058398257466** en USD. + +- Un titulaire de compte chez **MobileMoney** nommé Henrik Karlsson. Il dispose d’un compte mobile identifié par **123456789** (numéro), en USD. + +#### Scénario + +Le scénario : Mats Hagman (**BankNrOne**) souhaite transférer 100 USD à Henrik Karlsson (**MobileMoney**). Avant que Henrik ne soit trouvable, son FSP **MobileMoney** doit fournir au Switch l’information d’affectation de FSP. Le déroulé complet se trouve en [Autres Informations](#other-notes). + +#### Autres Informations + +Les messages JSON sont formatés avec couleurs, indentation et retours à la ligne pour la lisibilité. + +Il est supposé que chaque FSP dispose d’un compte Switch pré-approvisionné dans son propre établissement. + +### Déroulé de l’exemple + +[Figure 74](#figure-74) illustre l’ensemble du processus, du provisioning des informations FSP jusqu’à la transaction. + +###### Figure 74 + +![](../../assets/diagrams/sequence/figure74.svg) + +**Figure 74 -- Déroulé complet : de la fourniture d’information FSP compte au succès de la transaction** + +### Provisionnement du Titulaire de Compte + +Avant que le bénéficiaire Henrik Karlsson ne soit trouvable via le FSP **BankNrOne**, il doit être provisionné dans l’ALS (le Switch) par son FSP (**MobileMoney**). Cela s’effectue via [**POST /participants**](#6232-post-participants) (version bulk) ou [POST /participants/_{Type}_/_{ID}_](#post-participants-type-id) (version simple). Comme il n'y a ici qu'un bénéficiaire, la version simple est utilisée par **MobileMoney**. Le provisioning peut avoir lieu à tout moment, lors de la création du compte ou lors de la connexion initiale au Switch. + +#### FSP MobileMoney provisionne Henrik Karlsson : Étape 1 du déroulé + +[Listing 29](#listing-29) montre la demande HTTP où **MobileMoney** provisionne les infos FSP pour Henrik Karlsson, identifié par **MSISDN** et **123456789** (voir [Adressage de Parties](#party-addressing)). L’élément JSON **fspId** est mis à l’identifiant du FSP et **currency** à la devise du compte (USD). + +Voir [Tableau 1](#table-1) pour les en-têtes HTTP requis, +et [POST /participants/_{Type}_/_{ID}_](#post-participants-type-id) pour plus d’infos. Pour le routage avec **FSPIOP-Destination** et **FSPIOP-Source**, voir [Routage du flux d’appel](#call-flow-routing-using-fspiop-destination-and-fspiop-source). Pour la négociation de version, voir [Négociation de version entre client et serveur](#version-negotiation-between-client-and-server). + +###### Listing 29 + +``` +POST /participants/MSISDN/123456789 HTTP/1.1 +Accept: application/vnd.interoperability.participants+json;version=1 +Content-Length: 50 +Content-Type: +application/vnd.interoperability.participants+json;version=1.0 +Date: Tue, 14 Nov 2017 08:12:31 GMT +FSPIOP-Source: MobileMoney +FSPIOP-Destination: Switch +{ + "fspId": "MobileMoney", + "currency": "USD" +} +``` + +**Listing 29 -- Provision d’informations FSP pour le titulaire Henrik Karlsson** + +[Listing 30](#listing-30) présente la réponse HTTP synchrone où le Switch accuse réception immédiate (après vérif de headers, etc.). + +Voir [Tableau 3](#table-3) pour les en-têtes de réponse requis. + +###### Listing 30 + +``` +HTTP/1.1 202 Accepted +Content-Type: +application/vnd.interoperability.participants+json;version=1.0 +``` + +**Listing 30 -- Réponse synchrone à la requête de provision** + +
    + +#### Traitement du provisionnement par le Switch : Étape 2 + +Une fois la demande reçue ([Listing 29](#listing-29)) et la réponse envoyée ([Listing 30](#listing-30)), le Switch vérifie le corps de la demande. Par exemple, il s’assure que **fspId** correspond à **FSPIOP-Source**, que la devise est autorisée, etc. + +Après validation, l’information que le compte identifié par **MSISDN** et **123456789** est chez le FSP **MobileMoney** est enregistrée en base Switch. + +
    + +#### Switch envoie le callback de succès : Étape 3 + +Le Switch doit ensuite notifier le FSP **MobileMoney** du succès du provisioning, via [PUT /participants/_{Type}_/_{ID}_](#put-participants-type-id). [Listing 31](#listing-31) illustre cette requête HTTP. + +Voir [Tableau 1](#table-1) pour les en-têtes requis. Dans le callback, **Accept** ne doit pas être utilisé (appel de service précédent). Les headers **FSPIOP-Destination** et **FSPIOP-Source** sont inversés par rapport à la demande d’origine. + +###### Listing 31 + +``` +PUT /participants/MSISDN/123456789 HTTP/1.1 +Content-Length: 50 +Content-Type: +Date: Tue, 14 Nov 2017 08:12:32 GMT +FSPIOP-Source: MobileMoney +FSPIOP-Destination: Switch +{ + "fspId": "MobileMoney", + "currency": "USD" +} +``` + +**Listing 31 -- Callback pour le provisioning demandé précédemment** + +[Listing 32](#listing-32) montre la réponse HTTP synchrone où le FSP **MobileMoney** accuse réception immédiate (après vérification des headers…) pour conclure le process après réception du callback. + +Voir [Tableau 3](#table-3) pour les en-têtes requis. + +###### Listing 32 + +``` +HTTP/1.1 200 OK +Content-Type: +application/vnd.interoperability.participants+json;version=1.0 +``` + +**Listing 32 -- Réponse synchrone au callback** + +
    + +### Transfert P2P + +Comme le bénéficiaire visé, Henrik Karlsson, est désormais connu du Switch (qui fait aussi office d’ALS), comme détaillé dans la section [Provision Account Holder](#provision-account-holder), Mats Hagman peut maintenant initier et approuver le cas d'utilisation Transfert P2P de sa banque vers Henrik Karlsson. + +#### Initiation du cas d’utilisation : Étape 4 du flux de bout en bout + +Mats Hagman sait que Henrik Karlsson possède le numéro de téléphone **123456789**, il saisit donc ce numéro sur son appareil comme bénéficiaire et 100 USD comme montant. La communication réelle entre l’appareil de Mats et sa banque **BankNrOne** est hors du périmètre de cette API. + +
    + +#### Demande d'information sur la partie auprès du Switch : Étape 5 du flux de bout en bout + +À l’étape 5 du flux de bout en bout, **BankNrOne** reçoit la demande de Mats Hagman visant à transférer 100 USD au numéro de téléphone 123456789. **BankNrOne** effectue une recherche interne pour savoir si le compte 123456789 existe dans la banque, mais ne le trouve pas. **BankNrOne** utilise alors le service [GET /parties/_{Type}_/_{ID}_](#get-parties-type-id) du Switch pour voir si ce dernier a des informations sur le compte. + +[Exemple 33](#listing-33) illustre la requête HTTP où le PSP **BankNrOne** demande au Switch des informations sur la partie correspondant au compte identifié par **MSISDN** et **123456789**. + +Voir [Tableau 1](#table-1) pour les en-têtes HTTP requis dans une requête, ainsi que [GET /parties/_{Type}_/_{ID}_](#get-parties-type-id) pour plus d'informations sur ce service. **Plus** d’informations sur le routage des requêtes via **FSPIOP-Destination** et **FSPIOP-Source** sont disponibles dans [Routage des flux d'appels avec FSPIOP Destination et FSPIOP Source](#call-flow-routing-using-fspiop-destination-and-fspiop-source). Dans cette requête, le FSP **BankNrOne** ne connaît pas le FSP du bénéficiaire. Par conséquent, l’en-tête **FSPIOP-Destination** n’est pas présent. Les informations sur la négociation de version de l’API se trouvent dans [Négociation de version entre client et serveur](#version-negotiation-between-client-and-server). + +###### Exemple 33 + +``` +GET /parties/MSISDN/123456789 HTTP/1.1 +Accept: application/vnd.interoperability.parties+json;version=1 +Content-Type: application/vnd.interoperability.parties+json;version=1.0 +Date: Tue, 15 Nov 2017 10:13:37 GMT +FSPIOP-Source: BankNrOne +``` + +**Exemple 33 — Obtenir les informations d’une partie pour le compte identifié par MSISDN et 123456789 depuis BankNrOne** + +[Exemple 34](#listing-34) montre la réponse HTTP synchrone où le Switch accuse réception immédiatement (après vérification basique des en-têtes requis, par exemple) de la requête HTTP illustrée dans [Exemple 33](#listing-33). + +Voir [Tableau 3](#table-3) pour les en-têtes HTTP requis dans une réponse HTTP. + +###### Exemple 34 + +``` +HTTP/1.1 202 Accepted +Content-Type: application/vnd.interoperability.parties+json;version=1.0 +``` + +**Exemple 34 — Réponse synchrone à la demande d’information sur une partie** + +#### Demande d'information sur la partie auprès du FSP : Étape 6 du flux de bout en bout + +Quand le Switch a reçu la requête HTTP [Exemple 33](#listing-33) et envoyé la réponse synchrone [Exemple 34](#listing-34), il peut vérifier dans sa base de données s’il dispose d’informations sur le FSP auquel appartient le titulaire du compte identifié par **MSISDN** et **123456789**. Comme cette information a été provisionnée selon la section [Provision Account Holder](#provision-account-holder), le Switch sait que le compte est chez le FSP **MobileMoney**. Le Switch envoie donc la requête HTTP illustrée dans [Exemple 35](#listing-35). + +Voir [Tableau 1](#table-1) pour les en-têtes HTTP requis, et [GET /parties/_{Type}_/_{ID}_](#get-parties-type-id) pour plus d’informations sur ce service. **Plus** d’informations sur le routage via **FSPIOP-Destination** et **FSPIOP-Source** se trouvent dans [Routage des flux d'appels avec FSPIOP Destination et FSPIOP Source](#call-flow-routing-using-fspiop-destination-and-fspiop-source). Dans cette requête, le Switch ajoute l’entête **FSPIOP-Destination** car il connaît le FSP destination. Les informations sur la négociation de version API sont dans [Négociation de version entre client et serveur](#version-negotiation-between-client-and-server). + + + +###### Exemple 35 + +``` +GET /parties/MSISDN/123456789 HTTP/1.1 +Accept: application/vnd.interoperability.parties+json;version=1 +Content-Type: application/vnd.interoperability.parties+json;version=1.0 +Date: Tue, 15 Nov 2017 10:13:38 GMT +FSPIOP-Source: BankNrOne +FSPIOP-Destination: MobileMoney +``` + +**Exemple 35 — Demande d’information de partie pour le compte identifié par MSISDN et 123456789, envoyée par le Switch** + +[Exemple 36](#listing-36) montre la réponse HTTP synchrone dans laquelle le FSP **MobileMoney** accuse réception immédiatement (après vérification basique des en-têtes requis, par exemple) de la requête HTTP illustrée dans [Exemple 35](#listing-35). + +Voir [Tableau 3](#table-3) pour les en-têtes HTTP requis dans une réponse HTTP. + +###### Exemple 36 + +``` +HTTP/1.1 202 Accepted +Content-Type: application/vnd.interoperability.parties+json;version=1.0 +``` + +**Exemple 36 — Réponse synchrone à la demande d’information sur une partie** + +
    + +#### Recherche de l’information sur la partie dans le FSP MobileMoney : Étape 7 du flux de bout en bout + +Quand le FSP **MobileMoney** a reçu la requête HTTP [Exemple 35](#listing-35) et envoyé la réponse synchrone [Exemple 36](#listing-36), il peut chercher dans sa base de données des informations supplémentaires sur le compte identifié par **MSISDN** et **123456789**. Comme le compte existe et appartient à Henrik Karlsson, le FSP **MobileMoney** envoie le callback illustré dans [Exemple 37](#listing-37). **MobileMoney** ne souhaite pas partager certains détails, par exemple la date de naissance, avec l’autre FSP (**BankNrOne**), donc certains éléments facultatifs ne sont pas envoyés. + +Voir [Tableau 1](#table-1) pour les en-têtes HTTP requis dans une requête, +et [PUT /participants/_{Type}_/_{ID}_](#put-participants-type-id) pour plus d’informations sur le callback. **Dans** le callback, l’entête **Accept** ne doit pas être envoyé. Les en-têtes HTTP **FSPIOP-Destination** et **FSPIOP-Source** sont inversés par rapport à la requête HTTP [Exemple 35](#listing-35), comme expliqué dans [Routage des flux d'appels avec FSPIOP Destination et FSPIOP Source](#call-flow-routing-using-fspiop-destination-and-fspiop-source). + +###### Exemple 37 + +```` +PUT /parties/MSISDN/123456789 HTTP/1.1 +Content-Type: application/vnd.interoperability.parties+json;version=1.0 +Content-Length: 347 +Date: Tue, 15 Nov 2017 10:13:39 GMT +FSPIOP-Source: MobileMoney +FSPIOP-Destination: BankNrOne +{ + "party": { + "partyIdInfo": { + "partyIdType": "MSISDN", + "partyIdentifier": "123456789", + "fspId": "MobileMoney" + }, + "personalInfo": { + "complexName": { + "firstName": "Henrik", + "lastName": "Karlsson" + } + } + } +} +```` + +**Exemple 37 — Callback en réponse à la demande d’information sur la partie** + +[Exemple 38](#listing-38) présente la réponse HTTP synchrone du Switch qui confirme immédiatement (après vérification des en-têtes requis, par exemple) la fin du processus, après réception du callback [Exemple 37](#listing-37). + +Voir [Tableau 3](#table-3) pour les en-têtes HTTP requis en réponse. + +###### Exemple 38 + +``` +HTTP/1.1 200 OK +Content-Type: application/vnd.interoperability.parties+json;version=1.0 +``` + +**Exemple 38 — Réponse synchrone au callback d’information sur une partie** + +
    + +#### Relais du callback au FSP BankNrOne : Étape 8 du flux de bout en bout + +Quand le Switch a reçu le callback [Exemple 37](#listing-37) et envoyé la réponse synchrone [Exemple 38](#listing-38), il doit relayer exactement le même callback que dans [Exemple 37](#listing-37) au FSP **BankNrOne**, qui doit alors répondre de façon synchrone avec la même réponse que dans [Exemple 38](#listing-38). + +La requête et la réponse HTTP ne sont pas répétées ici, car identiques à la dernière section, mais envoyées cette fois du Switch vers **BankNrOne** (requête HTTP [Exemple 37](#listing-37)) et de **BankNrOne** vers le Switch (réponse HTTP [Exemple 38](#listing-38)). + +
    + +#### Envoi d’une demande de devis par le FSP BankNrOne : Étape 9 du flux de bout en bout + +Après avoir reçu les informations de partie via le callback [PUT /parties/_{Type}_/_{ID}_](#put-parties-type-id), le FSP **BankNrOne** sait désormais que le compte identifié par **MSISDN** et **123456789** existe et qu’il est chez le FSP **MobileMoney**. Il connaît aussi le nom du titulaire. Selon l’implémentation, le nom du bénéficiaire visé (Henrik Karlsson) pourrait être affiché à Mats Hagman dès cette étape, avant l’envoi du devis. Dans cet exemple, une demande de devis est envoyée avant d’afficher le nom ou d’éventuels frais. + +Le FSP **BankNrOne** envoie la requête HTTP présentée dans [Exemple 39](#listing-39) pour demander un devis. **BankNrOne** ne souhaite pas divulguer ses frais (voir [Quoting](#quoting) pour plus d’infos), il n’inclut donc pas l’élément **fees** dans la demande. L’élément **amountType** est positionné sur RECEIVE car Mats veut qu’Henrik reçoive 100 USD. Le **transactionType** est défini selon la [Correspondance des cas d’usage avec les types de transaction](#mapping-of-use-cases-to-transaction-types). Les infos sur Mats sont envoyées dans l’élément **payer**. **BankNrOne** a aussi généré deux UUID pour l’ID du devis (7c23e80c-d078-4077-8263-2c047876fcf6) et l’ID de la transaction (85feac2f-39b2-491b-817e-4a03203d4f14). Ces identifiants doivent être uniques, voir [Style architectural](#architectural-style). + +Voir [Tableau 1](#table-1) pour les en-têtes HTTP requis dans une requête, et [Section 6.5.3.2](#6532-post-quotes) concernant le service [POST /quotes](#6532-post-quotes). **Plus** d’informations sur le routage via **FSPIOP-Destination** et **FSPIOP-Source** se trouvent dans [Routage des flux d'appels avec FSPIOP Destination et FSPIOP Source](#call-flow-routing-using-fspiop-destination-and-fspiop-source). Des informations sur la négociation de version API se trouvent dans [Négociation de version entre client et serveur](#version-negotiation-between-client-and-server). + +###### Exemple 39 + +```` +POST /quotes HTTP/1.1 +Accept: application/vnd.interoperability.quotes+json;version=1 +Content-Type: application/vnd.interoperability.quotes+json;version=1.0 +Content-Length: 975 +Date: Tue, 15 Nov 2017 10:13:40 GMT +FSPIOP-Source: BankNrOne +FSPIOP-Destination: MobileMoney +{ + "quoteId": "7c23e80c-d078-4077-8263-2c047876fcf6", + "transactionId": "85feac2f-39b2-491b-817e-4a03203d4f14", + "payee": { + "partyIdInfo": { + "partyIdType": "MSISDN", + "partyIdentifier": "123456789", + "fspId": "MobileMoney" + } + }, + "payer": { + "personalInfo": { + "complexName": { + "firstName": "Mats", + "lastName": "Hagman" + } + }, + "partyIdInfo": { + "partyIdType": "IBAN", + "partyIdentifier": "SE4550000000058398257466", + "fspId": "BankNrOne" + } + }, + "amountType": "RECEIVE", + "amount": { + "amount": "100", + "currency": "USD" + }, + "transactionType": { + "scenario": "TRANSFER", + "initiator": "PAYER", + "initiatorType": "CONSUMER" + }, + "note": "From Mats", + "expiration": "2017-11-15T22:17:28.985-01:00" +} +```` + +**Exemple 39 — Demande de devis pour une transaction de 100 USD** + +[Exemple 40](#listing-40) montre la réponse HTTP synchrone dans laquelle le Switch accuse réception immédiatement (après vérification des en-têtes, par exemple) de la requête HTTP illustrée dans [Exemple 39](#listing-39). + +Voir [Tableau 3](#table-3) pour les en-têtes HTTP requis dans une réponse. + +###### Exemple 40 + +``` +HTTP/1.1 202 Accepted +Content-Type: application/vnd.interoperability.quotes+json;version=1.0 +``` + +**Exemple 40 — Réponse synchrone à la demande de devis** + +#### Transmission de la demande de devis par le Switch : Étape 10 du flux de bout en bout + +Après réception de la demande de devis, [Exemple 39](#listing-39), et l’envoi de la réponse synchrone [Exemple 40](#listing-40), le Switch doit relayer la même demande que dans [Exemple 39](#listing-39) au FSP **MobileMoney**, lequel doit alors répondre de manière synchrone avec la même réponse que dans [Exemple 40](#listing-40). + +La requête et la réponse HTTP ne sont pas répétées ici, car identiques à la dernière section, mais cette fois du Switch vers **MobileMoney** (requête HTTP [Exemple 39](#listing-39)) puis de **MobileMoney** vers le Switch (réponse HTTP [Exemple 40](#listing-40)). + +
    + +#### Détermination des frais et de la commission FSP dans MobileMoney : Étape 11 du flux de bout en bout + +Quand le FSP **MobileMoney** a reçu la requête HTTP [Exemple 39](#listing-40) et envoyé la réponse synchrone [Exemple 40](#listing-40), il doit valider la requête puis calculer les frais applicables et/ou la commission FSP pour effectuer la transaction demandée via le devis. + +Dans cet exemple, le FSP **MobileMoney** décide de prendre 1 USD de commission car il va recevoir de l’argent, ce qui peut engendrer de futurs revenus (frais ultérieurs). Comme le bénéficiaire (Henrik Karlsson) doit recevoir 100 USD et que la commission FSP est de 1 USD, le FSP **BankNrOne** n’aura à transférer que 99 USD au FSP **MobileMoney** (voir [Non Disclosing Receive Amount](#non-disclosing-receive-amount) pour l’équation). Les 99 USD sont renseignés dans l’élément transferAmount du callback, c’est donc le montant à transférer plus tard entre FSPs. + +Pour envoyer le callback, le FSP **MobileMoney** doit alors créer un paquet ILP (voir [ILP Packet](#ilp-packet) pour plus d’infos) encodé en base64url, car l'élément **ilpPacket** du callback [PUT /quotes/_{ID}_](#put-quotes-id) est défini comme [BinaryString](#binarystring). La manière de remplir ce paquet ILP est expliquée dans [Interledger Payment Request](#interledger-payment-request). L’adresse ILP d’Henrik dans le FSP **MobileMoney** est fixée à **g.se.mobilemoney.msisdn.123456789** (voir [ILP Addressing](#ilp-addressing)). Comme le montant du transfert est de 99 USD et que l’exposant de la devise USD est 2, le montant renseigné dans le paquet ILP est 9900 (99 \* 10^2 = 9900). L’autre élément du paquet ILP est **data**. Comme expliqué dans [Interledger Payment Request](#interledger-payment-request), cet élément doit contenir le modèle de données Transaction (voir [Transaction](#transaction)). Avec les informations de la demande de devis, la Transaction dans cet exemple est illustrée dans [Exemple 41](#listing-41). Après encodage base64url du paquet ILP complet avec **amount**, **account** et le **data**, cela donne l’élément **ilpPacket** du callback [PUT /quotes/_{ID}_](#put-quotes-id). + +Une fois le paquet ILP créé, la réalisation (fulfilment) et la condition sont générées selon l’algorithme défini dans [Exemple 12](#listing-12). En utilisant un secret d’exemple généré (voir [Exemple 42](#listing-42)), la réalisation devient celle de [Exemple 43](#listing-43) après execution de HMAC SHA-256 sur le paquet ILP avec ce secret comme clé (le tout en base64url). Le FSP **MobileMoney** doit stocker la réalisation en base de données pour ne pas avoir à la régénérer plus tard. La condition correspond au hash SHA-256 de la réalisation (voir [Exemple 44](#listing-44), base64url). + +Le callback complet envoyé en réponse à la demande de devis est présenté dans [Exemple 45](#listing-45). + +Voir [Tableau 1](#table-1) pour les en-têtes HTTP requis dans une requête, et [PUT /quotes/_{ID}_](#put-quotes-id) pour plus d’infos sur le callback. **L’ID** dans l’URI doit être celui spécifié comme quote ID dans la demande de devis, ici 7c23e80c-d078-4077-8263-2c047876fcf6. Dans le callback, l’entête **Accept** ne doit pas être envoyé. Les en-têtes HTTP **FSPIOP-Destination** et **FSPIOP-Source** sont inversés par rapport à la demande [Exemple 39](#listing-39), conformément à [Routage des flux d'appels avec FSPIOP Destination et FSPIOP Source](#call-flow-routing-using-fspiop-destination-and-fspiop-source). + +###### Listing 41 + +``` +{ + "transactionId": "85feac2f-39b2-491b-817e-4a03203d4f14", + "quoteId": "7c23e80c-d078-4077-8263-2c047876fcf6", + "payee": { + "partyIdInfo": { + "partyIdType": "MSISDN", + "partyIdentifier": "123456789", + "fspId": "MobileMoney" + }, + "personalInfo": { + "complexName": { + "firstName": "Henrik", + "lastName": "Karlsson" + } + } + }, + "payer": { + "personalInfo": { + "complexName": { + "firstName": "Mats", + "lastName": "Hagman" + } + }, + "partyIdInfo": { + "partyIdType": "IBAN", + "partyIdentifier": "SE4550000000058398257466", + "fspId": "BankNrOne" + } + }, + "amount": { + "amount": "99", + "currency": "USD" + }, + "transactionType": { + "scenario": "TRANSFER", + "initiator": "PAYER", + "initiatorType": "CONSUMER" + }, + "note": "From Mats" +} +``` + +**Liste 41 -- Objet JSON Transaction** + +###### Listing 42 + +``` +JdtBrN2tskq9fuFr6Kg6kdy8RANoZv6BqR9nSk3rUbY +``` + +**Liste 42 -- Secret généré, encodé en base64url** + +###### Listing 43 + +``` +mhPUT9ZAwd-BXLfeSd7-YPh46rBWRNBiTCSWjpku90s +``` + +**Liste 43 -- Fulfilment calculé à partir du paquet ILP et du secret, encodé en base64url** + +###### Listing 44 + +``` +fH9pAYDQbmoZLPbvv3CSW2RfjU4jvM4ApG\_fqGnR7Xs +``` + +**Liste 44 -- Condition calculée à partir du fulfilment, encodée en base64url** + +###### Listing 45 + +``` +PUT /quotes/7c23e80c-d078-4077-8263-2c047876fcf6 HTTP/1.1 +Content-Type: application/vnd.interoperability.quotes+json;version=1.0 +Content-Length: 1802 +Date: Tue, 15 Nov 2017 10:13:41 GMT +FSPIOP-Source: MobileMoney +FSPIOP-Destination: BankNrOne +{ + "transferAmount": { + "amount": "99", + "currency": "USD" + }, + "payeeReceiveAmount": { + "amount": "100", + "currency": "USD" + }, + "expiration": "2017-11-15T14:17:09.663+01:00", + "ilpPacket": "AQAAAAAAACasIWcuc2UubW9iaWxlbW9uZXkubXNpc2RuLjEyMzQ1Njc4OY- +IEIXsNCiAgICAidHJhbnNhY3Rpb25JZCI6ICI4NWZlY- +WMyZi0zOWIyLTQ5MWItODE3ZS00YTAzMjAzZDRmMTQiLA0KICAgICJxdW90ZUlkIjogIjdjMjNlOD- +BjLWQwNzgtNDA3Ny04MjYzLTJjMDQ3ODc2ZmNmNiIsDQogICAgInBheWVlIjogew0KICAgICAgI- +CAicGFydHlJZEluZm8iOiB7DQogICAgICAgICAgICAicGFydHlJZFR5cGUiOiAiTVNJU0ROIiwNCiAgI- +CAgICAgICAgICJwYXJ0eUlkZW50aWZpZXIiOiAiMTIzNDU2Nzg5IiwNCiAgICAgICAgI- +CAgICJmc3BJZCI6ICJNb2JpbGVNb25leSINCiAgICAgICAgfSwNCiAgICAgI- +CAgInBlcnNvbmFsSW5mbyI6IHsNCiAgICAgICAgICAgICJjb21wbGV4TmFtZSI6IHsNCiAgICAgICAgI- +CAgICAgICAiZmlyc3ROYW1lIjogIkhlbnJpayIsDQogICAgICAgICAgICAgICAgImxhc3ROYW1lIjogIk- +thcmxzc29uIg0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCiAgICAicGF5ZXIi- +OiB7DQogICAgICAgICJwZXJzb25hbEluZm8iOiB7DQogICAgICAgICAgICAiY29tcGxleE5hbWUi- +OiB7DQogICAgICAgICAgICAgICAgImZpcnN0TmFtZSI6ICJNYXRzIiwNCiAgICAgICAgICAgICAgI- +CAibGFzdE5hbWUiOiAiSGFnbWFuIg0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgI- +CAicGFydHlJZEluZm8iOiB7DQogICAgICAgICAgICAicGFydHlJZFR5cGUiOiAiSUJBTiIsDQogICAgI- +CAgICAgICAicGFydHlJZGVudGlmaWVyI- +jogIlNFNDU1MDAwMDAwMDA1ODM5ODI1NzQ2NiIsDQogICAgICAgICAgICAiZnNwSWQiOiAiQmFua05yT25 +lIg0KICAgICAgICB9DQogICAgfSwNCiAgICAiYW1vdW50Ijogew0KICAgICAgICAiYW1vdW50IjogIjEw- +MCIsDQogICAgICAgICJjdXJyZW5jeSI6ICJVU0QiDQogICAgfSwNCiAgICAidHJhbnNhY3Rpb25UeXBlI- +jogew0KICAgICAgICAic2NlbmFyaW8iOiAiVFJBTlNGRVIiLA0KICAgICAgICAiaW5pdGlhdG9yI- +jogIlBBWUVSIiwNCiAgICAgICAgImluaXRpYXRvclR5cGUiOiAiQ09OU1VNRVIiDQogICAgfSwNCiAgI- +CAibm90ZSI6ICJGcm9tIE1hdHMiDQp9DQo\u003d\u003d", + "condition": "fH9pAYDQbmoZLPbvv3CSW2RfjU4jvM4ApG_fqGnR7Xs" +} +``` + +**Liste 45 -- Callback du devis** + +**Remarque :** L’élément **ilpPacket** dans la [Liste 45](#listing-45) devrait être sur une seule ligne dans une vraie implémentation ; il est affiché ici avec des sauts de ligne pour montrer toute la valeur. + +[La Liste 46](#listing-46) montre la réponse HTTP synchrone où le Switch accuse immédiatement réception (après vérification basique des en-têtes requis, par exemple) du callback de la [Liste 45](#listing-45). + +Voir [Tableau 3](#table-3) pour les en-têtes HTTP requis dans une réponse HTTP. + +###### Listing 46 + +``` +HTTP/1.1 200 OK +Content-Type: application/vnd.interoperability.quotes+json;version=1.0 +``` + +**Liste 46 -- Réponse synchrone au callback de devis** + +#### Transmission du callback au FSP BankNrOne : Étape 12 du flux de bout en bout + +Lorsque le Switch a reçu le callback de devis dans la [Liste 45](#listing-45) et a envoyé la réponse synchrone dans la [Liste 46](#listing-46), il doit relayer exactement le même callback que dans la [Liste 45](#listing-45) au FSP **BankNrOne**. Le FSP **BankNrOne** doit alors répondre de manière synchrone avec la même réponse que dans la [Liste 46](#listing-46). + +La requête et la réponse HTTP ne sont pas répétées ici, car elles sont identiques à la section précédente, mais cette fois-ci envoyées du Switch vers **BankNrOne** (requête HTTP de la [Liste 45](#listing-45)) puis de **BankNrOne** vers le Switch (réponse HTTP de la [Liste 46](#listing-46)). + +
    + +#### Détermination des frais dans le FSP BankNrOne : Étape 13 du flux de bout en bout + +Lorsque le FSP **BankNrOne** a reçu le callback du devis dans la [Liste 45](#listing-45) et qu’il a envoyé la réponse synchrone de la [Liste 46](#listing-46), il peut alors déterminer les frais pour le payeur Mats Hagman. Dans cet exemple, les frais pour le payeur sont fixés à 0 USD, mais la commission du FSP reçue du FSP **MobileMoney** reste un revenu pour le FSP **BankNrOne**. Cela signifie que pour que le bénéficiaire Henrik Karlsson reçoive 100 USD, le payeur Mats Hagman doit transférer 100 USD de son compte. 99 USD seront alors transférés entre les FSPs **BankNrOne** et **MobileMoney**. + +Le FSP **BankNrOne** notifie alors Mats Hagman que la transaction de transfert de 100 USD à Henrik Karlsson coûtera 0 USD de frais. La façon dont Mats Hagman est notifié est hors du champ de cette API. + +
    + +#### Acceptation de la transaction par le payeur : Étape 14 du flux de bout en bout + +Dans cet exemple, Mats Hagman accepte d’effectuer la transaction. La manière dont l’acceptation est envoyée est hors du périmètre de cette API. + +#### Envoi de la demande de transfert depuis FSP BankNrOne : Étape 15 du flux de bout en bout + +Une fois que Mats Hagman a accepté la transaction, le FSP **BankNrOne** réserve les mouvements internes nécessaires pour effectuer la transaction. Cela signifie que 100 USD seront réservés du compte de Mats Hagman, où 1 USD sera un revenu pour le FSP et 99 USD seront transférés au compte Switch préfinancé. Après le succès des réservations, le FSP **BankNrOne** envoie un [POST /transfers](#post-transfers) au Switch comme dans la [Liste 47](#listing-47). Les mêmes éléments **ilpPacket** et **condition** sont envoyés comme reçus dans le callback de devis et le champ **amount** correspond au **transferAmount** reçu, voir [Liste 45](#listing-45). + +Voir [Tableau 1](#table-1) pour les en-têtes HTTP requis dans une requête et [Post Transfers](#post-transfers) pour plus d’informations sur le service [POST /transfers](#post-transfers). Davantage d'informations concernant le routage des requêtes via **FSPIOP-Destination** et **FSPIOP-Source** peuvent être trouvées dans [Routage des flux d'appels avec FSPIOP Destination et FSPIOP Source](#call-flow-routing-using-fspiop-destination-and-fspiop-source). L’information sur la négociation de version API se trouve dans [Négociation de version entre client et serveur](#version-negotiation-between-client-and-server). + +###### Listing 47 + +``` +POST /transfers HTTP/1.1 +Accept: application/vnd.interoperability.transfers+json;version=1 +Content-Type: application/vnd.interoperability.transfers+json;version=1.0 +Content-Length: 1820 +Date: Tue, 15 Nov 2017 10:14:01 +FSPIOP-Source: BankNrOne +FSPIOP-Destination: MobileMoney +{ + "transferId":"11436b17-c690-4a30-8505-42a2c4eafb9d", + "payerFsp":"BankNrOne", + "payeeFsp": "MobileMoney", + "amount": { + "amount": "99", + "currency": "USD" + }, + "expiration": "2017-11-15T11:17:01.663+01:00", + "ilpPacket": "AQAAAAAAACasIWcuc2UubW9iaWxlbW9uZXkubXNpc2RuLjEyMzQ1Njc4OY- +IEIXsNCiAgICAidHJhbnNhY3Rpb25JZCI6ICI4NWZlY- +WMyZi0zOWIyLTQ5MWItODE3ZS00YTAzMjAzZDRmMTQiLA0KICAgICJxdW90ZUlkIjogIjdjMjNlOD- +BjLWQwNzgtNDA3Ny04MjYzLTJjMDQ3ODc2ZmNmNiIsDQogICAgInBheWVlIjogew0KICAgICAgI- +CAicGFydHlJZEluZm8iOiB7DQogICAgICAgICAgICAicGFydHlJZFR5cGUiOiAiTVNJU0ROIiwNCiAgI- +CAgICAgICAgICJwYXJ0eUlkZW50aWZpZXIiOiAiMTIzNDU2Nzg5IiwNCiAgICAgICAgI- +CAgICJmc3BJZCI6ICJNb2JpbGVNb25leSINCiAgICAgICAgfSwNCiAgICAgI- +CAgInBlcnNvbmFsSW5mbyI6IHsNCiAgICAgICAgICAgICJjb21wbGV4TmFtZSI6IHsNCiAgICAgICAgI- +CAgICAgICAiZmlyc3ROYW1lIjogIkhlbnJpayIsDQogICAgICAgICAgICAgICAgImxhc3ROYW1lIjogIk- +thcmxzc29uIg0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCiAgICAicGF5ZXIi- +OiB7DQogICAgICAgICJwZXJzb25hbEluZm8iOiB7DQogICAgICAgICAgICAiY29tcGxleE5hbWUi- +OiB7DQogICAgICAgICAgICAgICAgImZpcnN0TmFtZSI6ICJNYXRzIiwNCiAgICAgICAgICAgICAgI- +CAibGFzdE5hbWUiOiAiSGFnbWFuIg0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgI- +CAicGFydHlJZEluZm8iOiB7DQogICAgICAgICAgICAicGFydHlJZFR5cGUiOiAiSUJBTiIsDQogICAgI- CAgICAgICAicGFydHlJZGVudGlmaWVyI- +jogIlNFNDU1MDAwMDAwMDA1ODM5ODI1NzQ2NiIsDQogICAgICAgICAgICAiZnNwSWQiOiAiQmFua05yT25 lIg0KICAgICAgICB9DQogICAgfSwNCiAgICAiYW1vdW50Ijogew0KICAgICAgICAiYW1vdW50IjogIjEw- +MCIsDQogICAgICAgICJjdXJyZW5jeSI6ICJVU0QiDQogICAgfSwNCiAgICAidHJhbnNhY3Rpb25UeXBlI- +jogew0KICAgICAgICAic2NlbmFyaW8iOiAiVFJBTlNGRVIiLA0KICAgICAgICAiaW5pdGlhdG9yI- +jogIlBBWUVSIiwNCiAgICAgICAgImluaXRpYXRvclR5cGUiOiAiQ09OU1VNRVIiDQogICAgfSwNCiAgI- +CAibm90ZSI6ICJGcm9tIE1hdHMiDQp9DQo\u003d\u003d", +"condition": "fH9pAYDQbmoZLPbvv3CSW2RfjU4jvM4ApG_fqGnR7Xs" +} +``` + +**Liste 47 -- Requête de transfert de BankNrOne à MobileMoney** + +**Remarque :** L’élément **ilpPacket** dans la [Liste 47](#listing-47) devrait être sur une seule ligne dans une vraie implémentation ; il est affiché ici avec des sauts de ligne pour montrer toute la valeur. + +[La Liste 48](#listing-48) montre la réponse HTTP synchrone où le Switch accuse réception immédiatement (après une vérification élémentaire des en-têtes requis par exemple) de la requête HTTP dans la [Liste 47](#listing-47). + +Voir [Tableau 3](#table-3) pour les en-têtes HTTP requis dans une réponse. + +###### Listing 48 + +``` +HTTP/1.1 202 Accepted +Content-Type: application/vnd.interoperability.transfers+json;version=1.0 +``` + +**Liste 48 -- Réponse synchrone à la demande de transfert** + +
    + +#### Envoi de la demande de transfert depuis le Switch : Étape 16 du flux de bout en bout + +Lorsque le Switch a reçu la demande de transfert dans la [Liste 47](#listing-47) et envoyé la réponse synchrone dans la [Liste 48](#listing-48), il doit réserver le transfert du compte de **BankNrOne** vers le compte de **MobileMoney** au sein du Switch. Après succès de la réservation, le Switch relaie quasiment la même requête que dans la [Liste 47](#listing-47) au FSP **MobileMoney**, à l’exception de l’élément **expiration** qui doit être réduit, comme expliqué dans [Timeout and Expiry](#timeout-and-expiry). La [Liste 49](#listing-49) montre la requête HTTP avec l’**expiration** réduite de 30 secondes par rapport à la [Liste 47](#listing-47). Le FSP **MobileMoney** doit alors répondre de façon synchrone avec la même réponse qu’en [Liste 48](#listing-48). + +###### Listing 49 + +``` +POST /transfers HTTP/1.1 +Accept: application/vnd.interoperability.transfers+json;version=1 +Content-Type: application/vnd.interoperability.transfers+json;version=1.0 +Content-Length: 1820 +Date: Tue, 15 Nov 2017 10:14:01 GMT +FSPIOP-Source: BankNrOne +FSPIOP-Destination: MobileMoney +{ + "transferId":"11436b17-c690-4a30-8505-42a2c4eafb9d", + "payerFsp":"BankNrOne", + "payeeFsp": "MobileMoney", + "amount": { + "amount": "99", + "currency": "USD" + }, + "expiration": "2017-11-15T11:16:31.663+01:00", + "ilpPacket": "AQAAAAAAACasIWcuc2UubW9iaWxlbW9uZXkubXNpc2RuLjEyMzQ1Njc4OY- +IEIXsNCiAgICAidHJhbnNhY3Rpb25JZCI6ICI4NWZlY- +WMyZi0zOWIyLTQ5MWItODE3ZS00YTAzMjAzZDRmMTQiLA0KICAgICJxdW90ZUlkIjogIjdjMjNlOD- +BjLWQwNzgtNDA3Ny08MjYzLTJjMDQ3ODc2ZmNmNiIsDQogICAgInBheWVlIjogew0KICAgICAgI- +CAicGFydHlJZEluZm8iOiB7DQogICAgICAgICAgICAicGFydHlJZFR5cGUiOiAiTVNJU0ROIiwNCiAgI- +CAgICAgICAgICJwYXJ0eUlkZW50aWZpZXIiOiAiMTIzNDU2Nzg5IiwNCiAgICAgICAgI- +CAgICJmc3BJZCI6ICJNb2JpbGVNb25leSINCiAgICAgICAgfSwNCiAgICAgI- +CAgInBlcnNvbmFsSW5mbyI6IHsNCiAgICAgICAgICAgICJjb21wbGV4TmFtZSI6IHsNCiAgICAgICAgI- +CAgICAgICAiZmlyc3ROYW1lIjogIkhlbnJlayIsDQogICAgICAgICAgICAgICAgImxhc3ROYW1lIjogIk- +thcmxzc29uIg0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCiAgICAicGF5ZXIi- +OiB7DQogICAgICAgICJwZXJzb25hbEluZm8iOiB7DQogICAgICAgICAgICAiY29tcGxleE5hbWUi- +OiB7DQogICAgICAgICAgICAgICAgImZpcnN0TmFtZSI6ICJNYXRzIiwNCiAgICAgICAgICAgICAgI- +CAibGFzdE5hbWUiOiAiSGFnbWFuIg0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgI- +CAicGFydHlJZEluZm8iOiB7DQogICAgICAgICAgICAicGFydHlJZFR5cGUiOiAiSUJBTiIsDQogICAgI- +CAgICAgICAicGFydHlJZGVudGlmaWVyI- +jogIlNFNDU1MDAwMDAwMDA1ODM5ODI1NzQ2NiIsDQogICAgICAgICAgICAiZnNwSWQiOiAiQmFua05yT25 +lIg0KICAgICAgICB9DQogICAgfSwNCiAgICAiYW1vdW50Ijogew0KICAgICAgICAiYW1vdW50IjogIjEw- +MCIsDQogICAgICAgICJjdXJyZW5jeSI6ICJVU0QiDQogICAgfSwNCiAgICAidHJhbnNhY3Rpb25UeXBlI- +jogew0KICAgICAgICAic2NlbmFyaW8iOiAiVFJBTlNGRVIiLA0KICAgICAgICAiaW5pdGlhdG9yI- +jogIlBBWUVSIiwNCiAgICAgICAgImluaXRpYXRvclR5cGUiOiAiQ09OU1VNRVIiDQogICAgfSwNCiAgI- +CAibm90ZSI6ICJGcm9tIE1hdHMiDQp9DQo\u003d\u003d", +"condition": "fH9pAYDQbmoZLPbvv3CSW2RfjU4jvM4ApG_fqGnR7Xs" +} +``` + +**Liste 49 -- Requête de transfert de BankNrOne à MobileMoney avec expiration réduite** + +**Remarque :** L’élément **ilpPacket** dans la [Liste 49](#listing-49) devrait être sur une seule ligne dans une vraie implémentation ; il est affiché ici avec des sauts de ligne pour montrer toute la valeur. + +
    + +#### Réalisation du transfert dans FSP MobileMoney : Étape 17 du flux de bout en bout + +Lorsque le FSP **MobileMoney** a reçu la requête de transfert dans la [Liste 47](#listing-47), il doit effectuer le transfert comme décrit dans la précédente demande de devis, ce qui signifie que 100 USD doivent être transférés sur le compte de Henrik Karlsson, dont 99 USD depuis le compte Switch préfinancé et 1 USD depuis un compte commission FSP. + +Comme preuve de réalisation de la transaction, le FSP **MobileMoney** récupère alors le fulfilment stocké [(Liste 43](#listing-43)) depuis la base de données (enregistré lors de la [Détermination des frais et de la commission FSP dans MobileMoney](#determine-fees-and-fsp-commission-in-fsp-mobilemoney-step-11-in-end-to-end-flow)) et le place dans l’élément **fulfilment** du callback [PUT /transfers/_{ID}_](#put-transfersid). Le champ **transferState** est positionné à COMMITTED et **completedTimestamp** à la date de réalisation de la transaction ; voir [Liste 50](#listing-50) pour la requête complète. + +En même temps, une notification est envoyée au bénéficiaire Henrik Karlsson pour l’informer qu’il a reçu 100 USD de Mats Hagman. + +La manière dont est envoyée la notification est hors du périmètre de cette API. + +Voir [Tableau 1](#table-1) pour les en-têtes HTTP requis dans une requête, et [PUT /transfers/_{ID}_](#put-transfersid) pour plus d’infos sur le callback. **L’ID** dans l’URI doit être celui présent dans la demande de transfert, qui est dans l’exemple 11436b17-c690-4a30-8505-42a2c4eafb9d. Dans le callback, l’en-tête **Accept** ne doit pas être envoyé. Les en-têtes HTTP **FSPIOP-Destination** et **FSPIOP-Source** sont maintenant inversés par rapport à la requête HTTP en [Liste 47](#listing-47), comme détaillé dans [Routage des flux d’appels avec FSPIOP Destination et FSPIOP Source](#call-flow-routing-using-fspiop-destination-and-fspiop-source). + +###### Listing 50 + +``` +PUT /transfers/11436b17-c690-4a30-8505-42a2c4eafb9d HTTP/1.1 +Content-Type: application/vnd.interoperability.transfers+json;version=1.0 +Content-Length: 166 +Date: Tue, 15 Nov 2017 10:14:02 GMT +FSPIOP-Source: MobileMoney +FSPIOP-Destination: BankNrOne +{ + "fulfilment": "mhPUT9ZAwd-BXLfeSd7-YPh46rBWRNBiTCSWjpku90s", + "completedTimestamp": "2017-11-16T04:15:35.513+01:00", + "transferState": "COMMITTED" +} +``` + +**Liste 50 -- Callback pour la demande de transfert** + +[La Liste 51](#listing-51) montre la réponse HTTP synchrone dans laquelle le Switch accuse immédiatement réception (après vérification basique des en-têtes requis par exemple) après avoir reçu le callback de la [Liste 50](#listing-50). + +Voir [Tableau 3](#table-3) pour les en-têtes HTTP requis dans une réponse HTTP. + +###### Listing 51 + +``` +HTTP/1.1 200 OK +Content-Type: application/vnd.interoperability.transfers+json;version=1.0 +``` + +**Liste 51 -- Réponse synchrone au callback de transfert** + +
    + +#### Réception de la notification de transaction par le bénéficiaire : Étape 18 du flux de bout en bout + +Le bénéficiaire Henrik Karlsson reçoit la notification de transaction et est ainsi informé du succès de la transaction. + +
    + +#### Réalisation du transfert dans le Switch : Étape 19 du flux de bout en bout + +Lorsque le Switch a reçu le callback de la [Liste 50](#listing-50) et envoyé la réponse synchrone de la [Liste 51](#listing-51), il doit valider le fulfilment, effectuer le transfert réservé antérieurement et relayer exactement le même callback que dans la [Liste 50](#listing-50) au FSP **BankNrOne**. **BankNrOne** doit alors répondre de façon synchrone avec la même réponse que dans la [Liste 51](#listing-51). + +La validation du fulfilment se fait en calculant le hash SHA-256 du fulfilment et en s’assurant que le hash est égal à la condition reçue lors de la demande de transfert. + +La requête et la réponse HTTP ne sont pas répétées ici car elles sont identiques à la section précédente, mais cette fois envoyées du Switch vers **BankNrOne** (requête HTTP de la [Liste 50](#listing-51)) puis de **BankNrOne** vers le Switch (réponse HTTP de la [Liste 51](#listing-51)). + +
    + +#### Réalisation du transfert dans FSP BankNrOne : Étape 20 du flux de bout en bout + +Quand le FSP **BankNrOne** a reçu le callback de la [Liste 50](#listing-50) et envoyé la réponse synchrone de la [Liste 51](#listing-51), il doit valider le fulfilment (voir [Section 10.4.16](#10416-perform-transfer-in-switch----step-19-in-end-to-end-flow)), puis effectuer le transfert réservé précédemment. + +Une fois le transfert réservé effectué, le payeur Mats Hagman doit être notifié du succès de la transaction. La façon dont la notification est envoyée est hors du champ de cette API. + +#### Réception de la notification de transaction par le payeur : Étape 21 du flux de bout en bout + +Le payeur Mats Hagman reçoit la notification de transaction et est ainsi informé du succès de la transaction. + + + + + +1 [http://www.ics.uci.edu/\~fielding/pubs/dissertation/rest\_arch\_style.htm](http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm) -- Transfert de Représentation d’État (REST) + +2 [https://tools.ietf.org/html/rfc4122](https://tools.ietf.org/html/rfc4122) -- Espace de noms UUID (Identifiant Unique Universel) + +3 [https://tools.ietf.org/html/rfc7230](https://tools.ietf.org/html/rfc7230) -- Hypertext Transfer Protocol (HTTP/1.1): Syntaxe des messages et routage + +4 [https://tools.ietf.org/html/rfc5246](https://tools.ietf.org/html/rfc5246) -- Le protocole TLS (Transport Layer Security) – Version 1.2 + +5 [https://tools.ietf.org/html/rfc3986](https://tools.ietf.org/html/rfc3986) -- Uniform Resource Identifier (URI) : Syntaxe générique + +6 [https://tools.ietf.org/html/rfc7230\#section-2.7.3](https://tools.ietf.org/html/rfc7230#section-2.7.3) -- HTTP/1.1 : Normalisation et comparaison des URI http et https + +7 [https://tools.ietf.org/html/rfc3629](https://tools.ietf.org/html/rfc3629) -- UTF-8, un format de transformation d’ISO 10646 + +8 [https://tools.ietf.org/html/rfc7159](https://tools.ietf.org/html/rfc7159) -- Format d’échange de données JSON + +9 [https://tools.ietf.org/html/rfc7230\#section-3.2](https://tools.ietf.org/html/rfc7230#section-3.2) -- HTTP/1.1 : Champs d’en-tête + +10 [https://tools.ietf.org/html/rfc7231\#section-5.3.2](https://tools.ietf.org/html/rfc7231#section-5.3.2) -- HTTP/1.1 : Accept + +11 [https://tools.ietf.org/html/rfc7230\#section-3.3.2](https://tools.ietf.org/html/rfc7230#section-3.3.2) -- HTTP/1.1 : Content-Length + +12 [https://tools.ietf.org/html/rfc7231\#section-3.1.1.5](https://tools.ietf.org/html/rfc7231#section-3.1.1.5) -- HTTP/1.1 : Content-Type + +13 [https://tools.ietf.org/html/rfc7231\#section-7.1.1.2](https://tools.ietf.org/html/rfc7231#section-7.1.1.2) -- HTTP/1.1 : Date + +14 [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For) -- X-Forwarded-For + +15 [https://tools.ietf.org/html/rfc7239](https://tools.ietf.org/html/rfc7239) -- Extension HTTP Forwarded + +16 [https://tools.ietf.org/html/rfc7230\#section-3.3.2](https://tools.ietf.org/html/rfc7230#section-3.3.2) -- HTTP/1.1 : Content-Length + +17 [https://tools.ietf.org/html/rfc7231\#section-3.1.1.5](https://tools.ietf.org/html/rfc7231#section-3.1.1.5) -- HTTP/1.1 : Content-Type + +18 [https://tools.ietf.org/html/rfc7231\#section-4](https://tools.ietf.org/html/rfc7231#section-4) -- HTTP/1.1 : Méthodes de requête + +19 [https://tools.ietf.org/html/rfc7231\#section-6](https://tools.ietf.org/html/rfc7231#section-6) -- HTTP/1.1 : Codes d’état de réponse + +20 [https://tools.ietf.org/html/rfc7231\#section-6.4](https://tools.ietf.org/html/rfc7231#section-6.4) -- HTTP/1.1 : Redirection 3xx + +21 [https://tools.ietf.org/html/rfc7231\#section-6.6](https://tools.ietf.org/html/rfc7231#section-6.6) -- HTTP/1.1 : Erreur serveur 5xx + +22 [https://tools.ietf.org/html/rfc7231\#section-6.5.6](https://tools.ietf.org/html/rfc7231#section-6.5.6) -- HTTP/1.1 : 406 Non Acceptable + +23 [https://tools.ietf.org/html/rfc7231\#section-5.3.2](https://tools.ietf.org/html/rfc7231#section-5.3.2) -- HTTP/1.1 : Accept + +24 [https://interledger.org/rfcs/0011-interledger-payment-request/](https://interledger.org/rfcs/0011-interledger-payment-request/) -- Demande de paiement Interledger (IPR) + +25 [https://interledger.org/](https://interledger.org/) -- Interledger + +26 [https://interledger.org/interledger.pdf](https://interledger.org/interledger.pdf) -- Un protocole pour les paiements Interledger + +27 [https://interledger.org/rfcs/0001-interledger-architecture/](https://interledger.org/rfcs/0001-interledger-architecture/) -- Architecture Interledger + +28 [https://interledger.org/rfcs/0015-ilp-addresses/](https://interledger.org/rfcs/0015-ilp-addresses/) -- Adresses ILP + +29 [https://www.itu.int/rec/dologin\_pub.asp?lang=e&id=T-REC-X.696-201508-I!!PDF-E&type=items](https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-X.696-201508-I!!PDF-E&type=items) -- Règles d’encodage ASN.1 : Spécification des Octet Encoding Rules (OER) + +30 [https://perldoc.perl.org/perlre.html\#Regular-Expressions](https://perldoc.perl.org/perlre.html#Regular-Expressions) -- perlre - Expressions régulières Perl + +31 [https://tools.ietf.org/html/rfc7159\#section-7](https://tools.ietf.org/html/rfc7159#section-7) -- JSON : Chaînes + +32 [http://www.unicode.org/](http://www.unicode.org/) -- Le consortium Unicode + +33 [https://www.iso.org/iso-8601-date-and-time-format.html](https://www.iso.org/iso-8601-date-and-time-format.html) -- Format de date et d’heure - ISO 8601 + +34 [https://tools.ietf.org/html/rfc4122](https://tools.ietf.org/html/rfc4122) -- Espace de noms UUID (Identifiant Unique Universel) + +35 [https://tools.ietf.org/html/rfc4648\#section-5](https://tools.ietf.org/html/rfc4648#section-5) -- Encodages Base16, Base32 et Base64 - Base64 compatible URL et nom de fichier + +36 [https://www.iso.org/iso-4217-currency-codes.html](https://www.iso.org/iso-4217-currency-codes.html) -- Codes de devises - ISO 4217 + +37 [https://www.itu.int/rec/T-REC-E.164/en](https://www.itu.int/rec/T-REC-E.164/en) -- E.164 : Plan international de numérotation téléphonique publique + +38 [https://tools.ietf.org/html/rfc3696](https://tools.ietf.org/html/rfc3696) -- Techniques d’application pour la vérification et la transformation des noms + +39 [https://tools.ietf.org/html/rfc7231\#section-6.5](https://tools.ietf.org/html/rfc7231#section-6.5) -- HTTP/1.1 : Erreur client 4xx \ No newline at end of file diff --git a/docs/fr/technical/api/fspiop/v1.1/encryption.md b/docs/fr/technical/api/fspiop/v1.1/encryption.md new file mode 100644 index 000000000..cd6be4560 --- /dev/null +++ b/docs/fr/technical/api/fspiop/v1.1/encryption.md @@ -0,0 +1,308 @@ +--- +footerCopyright: Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0) | Ericsson, Huawei, Mahindra-Comviva, Telepin, et la Bill & Melinda Gates Foundation +--- +# Chiffrement + +## Préface + +Cette section contient des informations sur la façon d'utiliser ce document. + +### Conventions Utilisées dans ce Document + +Les conventions suivantes sont utilisées dans ce document pour identifier les types spécifiés d'information : + +| **Type d'Information** | **Convention** | **Exemple** | +| :--- | :--- | :--- | +| **Éléments de l'API, tels que ressources** | Gras | **/authorization** | +| **Variables** | Italique entre accolades | _{ID}_ | +| **Termes du glossaire** | Italique à la première occurrence ; défini dans le _Glossaire_ | Le but de l'API est de permettre des transactions financières interopérables entre un _Payeur_ (un payeur de fonds électroniques dans une transaction de paiement) situé dans un _FSP_ (une entité fournissant un service financier numérique à un utilisateur final) et un _Bénéficiaire_ (un destinataire de fonds électroniques dans une transaction de paiement) situé dans un autre FSP. | +| **Documents de bibliothèque** | Italique | Les informations utilisateur ne devraient, en général, pas être utilisées par les déploiements de l’API ; les mesures de sécurité détaillées dans _Signature de l'API_ et _Chiffrement de l'API_ devraient être utilisées à la place. | + +### Informations sur les versions du document + +| **Version** | **Date** | **Description des modifications** | +| :--- | :--- | :--- | +|**1.1**|2020-05-19|Cette version contient les modifications suivantes : 1. Les éléments ExtensionList de la Section 4 ont été mis à jour sur la base du problème [Interpretation of the Data Model for the ExtensionList element](https://github.com/mojaloop/mojaloop-specification/issues/51), afin de corriger le modèle de données de l'objet extensionList.| +| **1.0** | 2018-03-13 | Version initiale | + +
    + +## Introduction + +Ce document détaille les méthodes de sécurité à mettre en œuvre pour l'Open API (Interface de Programmation Applicative) pour l'interopérabilité des FSP (Fournisseurs de Services Financiers) (ci-après citée « l’API ») afin de garantir la confidentialité des messages API entre un client API et le serveur API. + +En sécurité de l'information, la _confidentialité_ signifie que l'information n'est pas rendue disponible ou divulguée à des personnes, entités ou processus non autorisés (extrait de l’ISO27000[The ISO 27000 Directory](http://www.27000.org)). Pour l’API, la confidentialité signifie que certains champs sensibles du contenu d’un message API ne peuvent être consultés ou identifiés de manière non autorisée ou non détectée par les intermédiaires impliqués dans la communication API. Autrement dit, si certains champs d’un message API sont chiffrés par le client API, alors seul le destinataire prévu de l’API peut déchiffrer ces champs. + +Le chiffrement JSON Web Encryption (JWE, défini dans la RFC 7516[JSON Web Encryption (JWE)](https://tools.ietf.org/html/rfc7516)) doit être appliqué à l'API pour assurer la confidentialité de bout en bout des messages. Lorsqu'un client API envoie une requête HTTP (telle qu'une requête API ou un message de rappel) à un contrepartie, le client API peut déterminer s'il existe des champs sensibles dans le message API à protéger selon la réglementation ou le schéma local. S'il y a un champ à protéger, le client API utilise JWE pour chiffrer la valeur de ce champ. Par la suite, le texte chiffré de ce champ sera transmis à la contrepartie. + +Pour prendre en charge le chiffrement de plusieurs champs d’un message API, le JWE est étendu dans ce document pour s’adapter aux exigences de l’API. + +
    + +### Spécification Open API pour l'interopérabilité FSP + +La Spécification Open API pour l’Interopérabilité FSP comprend les documents suivants. + +#### Documents logiques + +- [Modèle de Données Logique](./logical-data-model) + +- [Modèles de Transactions Génériques](./generic-transaction-patterns) + +- [Cas d'Utilisation](./use-cases) + +#### Documents de liaison REST asynchrones + +- [Définition de l'API](./api-definition) + +- [Règles de Liaison JSON](../json-binding-rules) + +- [Règles de Schéma](./scheme-rules) + +#### Intégrité des données, Confidentialité et Non-répudiation + +- [Bonnes pratiques PKI](./pki-best-practices) + +- [Signature](./v1.1/signature) + +- [Chiffrement](#) + +#### Documents généraux + +- [Glossaire](./glossary) + +
    + +## Définition du chiffrement de l'API + +Cette section présente la technologie utilisée par le chiffrement de l'API, notamment : + +- Le format d'échange de données pour les champs chiffrés d’un message API. +- Le mécanisme de chiffrement et de déchiffrement des champs. + +### Modèle de données pour le chiffrement + +L’API utilise l’en-tête HTTP personnalisé **FSPIOP-Encryption** pour représenter les champs chiffrés d’un message API ; sa valeur est une sérialisation d’objet JSON. Le modèle de données de ce paramètre est décrit dans la [Table 1](#table-1), [Table 2](#table-2) et [Table 3](#table-3). + +**Note** : Si **FSPIOP-Encryption** est présent dans un message API, alors il doit aussi être protégé par la signature de l’API. Cela signifie que **FSPIOP-Encryption** doit être inclus dans le JWS Protected Header de la signature. + +###### Table 1 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| :--- | :---: | :--- | :--- | +| **encryptedFields** | 1 | EncryptedFields | Informations sur les champs chiffrés d’un message API | +**Table 1 -- Modèle de données du champ d’en-tête HTTP FSPIOP-Encryption** + +###### Table 2 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| :--- | :---: | :--- | :--- | +| **encryptedField** | 1..* | EncryptedField | Informations sur un champ chiffré d’un message API | +**Table 2 -- Modèle de données du type complexe EncryptedFields** + +###### Table 3 + +| **Nom** | **Cardinalité** | **Type** | **Description** | +| :--- | :---: | :--- | :--- | +|**fieldName** | 1 | String(1..512) | Cet élément identifie le champ à chiffrer dans le contenu d’un message API.
    Comme la charge utile (payload) de l’API est une chaîne de sérialisation d’objet JSON, le nom du champ doit permettre d’identifier le chemin exact de l’élément dans l’objet JSON. Un point (‘**.**’) est utilisé pour séparer les éléments dans un chemin d’élément. Par exemple, **payer.personalInfo.dateOfBirth** est une valeur valide pour cet élément pour la requête API **POST /quotes**.
    | +| **encryptedKey** | 1 | String(1..512) | Valeur de la clé de chiffrement de contenu chiffrée (CEK). Sa valeur est encodée en BASE64URL (Clé Chiffrée JWE).
    S'il y a plusieurs champs à chiffrer dans le message API, il est recommandé d'utiliser la même clé chiffrée JWE pour simplifier la mise en œuvre ; cependant, c'est une décision propre à chaque FSP selon leur implémentation.
    | +|**protectedHeader** | 1 | String(1..1024) | Cet élément identifie les paramètres d’en-tête appliqués à JWE pour chiffrer le champ spécifié. Sa valeur est encodée en BASE64URL(UTF8(JWE Protected Header)).
    Par exemple, si le JWE Protected Header appliqué au chiffrement est ```{"alg":"RSA-OAEP-256","enc":"A256GCM"}```, alors la valeur est ```eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ```.
    | +| **initializationVector** | 1 | String(1..128) | Valeur du Vecteur d'Initialisation utilisé lors du chiffrement du texte clair. Sa valeur est encodée en BASE64URL (Vecteur d'Initialisation JWE). | +| **authenticationTag** | 1 | String(1..128) | Valeur de l’étiquette d’authentification résultant du chiffrement authentifié du texte en clair avec des Données Authentifiées Additionnelles. Sa valeur est encodée en BASE64URL (Tag d’authentification JWE) | +**Table 3 -- Modèle de données du type complexe EncryptedField** + +### Chiffrement des champs d’un message API + +Cette section décrit le processus de chiffrement des champs de message. L’ordre des étapes n'est pas significatif dans les cas où il n'y a pas de dépendances entre les entrées et sorties des étapes. + +1. Déterminer l'algorithme utilisé pour déterminer la valeur de la CEK (c'est l'algorithme enregistré dans le paramètre d'en-tête **alg** du JWE résultant). Parce que la CEK doit être chiffrée avec la clé publique du destinataire de l’API, l’algorithme disponible pour protéger la CEK dans l’API ne peut être que **RSA-OAEP-256**. +2. S'il y a plusieurs champs à chiffrer dans le message API, exécuter les étapes 3-15 pour chaque champ. +3. Générer une CEK aléatoire. Le FSP peut générer la valeur en utilisant sa propre application ou l’implémentation JWE employée. +4. Chiffrer la CEK avec l’algorithme déterminé par le paramètre d’en-tête JWE **alg**. +5. Calculer la valeur encodée en BASE64URL(JWE Encrypted Key). +6. Générer un vecteur d'initialisation JWE aléatoire de la taille correcte pour l’algorithme de chiffrement de contenu (si requis par l’algorithme) ; sinon, que le vecteur soit une séquence d’octets vide. +7. Calculer la valeur encodée du vecteur d'initialisation BASE64URL(JWE Initialization Vector). +8. Si un paramètre **zip** a été inclus, compresser le texte clair en utilisant l’algorithme de compression spécifié et que *M* soit la séquence d’octets représentant le texte clair compressé ; sinon, que _M_ soit la séquence d’octets représentant le texte clair. +9. Créer l'objet JSON ou les objets contenant le jeu désiré de paramètres d’en-tête, qui constituent ensemble le JWE Protected Header. Outre le paramètre **alg**, le paramètre **enc** doit être inclus dans le protected header JWE. Les valeurs disponibles pour le paramètre **enc** dans l’API ne peuvent être que : **A128GC**_M_, **A192GC**_M_, **A256GC**_M_. **A256GC**_M_ est recommandé. +10. Calculer la valeur encodée du protected header BASE64URL(UTF8(JWE Protected Header)). +11. Prendre pour paramètre de Données Authentifiées Additionnelles la valeur ASCII(Encoded Protected Header). +12. Chiffrer *M* en utilisant la CEK, le vecteur d'initialisation JWE et la Donnée Authentifiée Additionnelle selon l’algorithme de chiffrement de contenu spécifié pour créer la valeur du texte chiffré JWE et le Tag d’authentification JWE (qui est la sortie du chiffrement). +13. Calculer la valeur chiffrée encodée en BASE64URL (JWE Cipher Text). +14. Calculer la valeur du tag d’authentification encodée en BASE64URL (JWE Authentication Tag). +15. Calculer l'élément **encryptedField** (voir la Table 3) pour le paramètre d'en-tête HTTP **FSPIOP-Encryption**. +16. Calculer la valeur du paramètre d’en-tête HTTP **FSPIOP-Encryption** comme décrit dans la documentation [FSPIOP API](/fspiop). La valeur de ce **FSPIOP-Encryption** est une chaîne de sérialisation d’objet JSON. + +**Note** : Si JWE est utilisé pour chiffrer certains champs de la charge utile, alors le client API doit : + +1. Chiffrer les champs désirés. + +2. Remplacer la valeur de ces champs par le texte chiffré encodé dans la charge utile. + +3. Signer la charge utile. + +### Déchiffrement des champs d’un message API + +Si le paramètre d’en-tête HTTP **FSPIOP-Encryption** (qui est aussi protégé par la signature de l’API) est présent, alors le destinataire du message API doit déchiffrer les champs chiffrés du message API après que la signature de l’API ait été validée avec succès. Le processus de déchiffrement est l’inverse du chiffrement. L’ordre des étapes n’est pas significatif dans les cas où il n’y a pas de dépendance entre les entrées et sorties des étapes. S’il y a plusieurs champs chiffrés, alors tous les champs doivent être déchiffrés avec succès ; sinon cela indique que le message API est invalide. + +1. Analyser le paramètre d’en-tête HTTP **FSPIOP-Encryption** pour obtenir les informations sur les champs chiffrés, y compris le nom du champ, le protected header JWE, la clé chiffrée JWE, le vecteur d’initialisation JWE et le tag d’authentification JWE pour chaque champ. S’il y a plusieurs champs à déchiffrer, exécuter les étapes 2-9 pour chaque champ. +2. Obtenir le texte chiffré du champ chiffré en analysant la charge utile avec le chemin de champ spécifié. La valeur du champ spécifié est déjà encodée en BASE64URL. +3. Vérifier que la séquence d'octets résultant du décodage du protected header JWE encodé est une représentation UTF-8 valide d'un objet JSON conforme au format d’échange JSON (cf. RFC 7159[The JavaScript Object Notation (JSON) Data Interchange Format](https://tools.ietf.org/html/rfc7159)) ; le protected header JWE doit être cet objet JSON. +4. Vérifier que les paramètres dans le protected header JWE comprennent et peuvent traiter tous les champs requis pour prendre en charge la spécification JWE ; par exemple, l’algorithme utilisé. +5. Déterminer si l’algorithme spécifié par le paramètre **alg** du header correspond à l’algorithme de la clé publique / privée du destinataire de l’API. +6. Déchiffrer la clé chiffrée JWE avec la clé privée du destinataire API pour obtenir la CEK JWE. +7. Prendre pour paramètre de Données Authentifiées Additionnelles la valeur ASCII (Encoded Protected Header). +8. Déchiffrer le texte chiffré JWE en utilisant la CEK, le vecteur d'initialisation JWE, la Donnée Authentifiée Additionnelle et le Tag d’authentification JWE avec l’algorithme de chiffrement spécifié, pour retourner le texte déchiffré tout en validant le tag d’authentification conformément à l’algorithme. Si le tag d’authentification JWE est incorrect, refuser l’entrée sans aucun déchiffrement. +9. Si un paramètre **zip** a été inclus, le destinataire de l’API doit décompresser le texte déchiffré en utilisant l'algorithme de compression spécifié. + +## Exemples de chiffrement/déchiffrement d’API + +Cette section utilise un processus typique de cotation pour expliquer comment le chiffrement et le déchiffrement de l’API sont réalisés avec JWE. Puisque l’algorithme de clé publique / privée du destinataire de l’API ne peut être que RSA, la clé RSA utilisée pour cet exemple est représentée ci-dessous au format JSON Web Key (JWK, défini dans la RFC 7517[JSON Web Key(JWK)](https://tools.ietf.org/html/rfc7517)) (avec retours à la ligne pour l’affichage uniquement) : + +```json +{ + "kty": "RSA", + "n": "oahUIoWw0K0usKNuOR6H4wkf4oBUXHTxRvgb48E- + BVvxkeDNjbC4he8rUWcJoZmds2h7M70imEVhRU5djINXtqllXI4DFqcI1DgjT9Le + wND8MW2Krf3Spsk_ZkoFnilakGygTwpZ3uesH- + PFABNIUYpOiN15dsQRkgr0vEhxN92i2asbOenSZeyaxziK72UwxrrKoExv6kc5tw + XTq4h-QChLOln0_mtUZwfsRaMStPs6mS6XrgxnxbWhojf663tuEQueGC- + FCMfra36C9knDFGzKsNa7LZK2djYgyD3JR_MB_4NUJW_TqOQtwHYbxevoJArm- + L5StowjzGy-_bq6Gw", + "e": "AQAB", + "d": "kLdtIj6GbDks_ApCSTYQtelcNttlKiOyPzMrXHeI-yk1F7-kpDxY4- + WY5NWV5KntaEeXS1j82E375xxhWMHXyvjYecPT9fpwR_M9gV8n9Hrh2anTpTD93D + t62ypW3yDsJzBnTnrYu1iwWRgBKrEYY46qAZIrA2xAwnm2X7uGR1hghkqDp0Vqj3 + kbSCz1XyfCs6_LehBwtxHIyh8Ripy40p24moOAbgxVw3rxT_vlt3UVe4WO3JkJOz + lpUf-KTVI2Ptgm-dARxTEtE-id-4OJr0h-K- + VFs3VSndVTIznSxfyrj8ILL6MG_Uv8YAu7VILSB3lOW085-4qE3DzgrTjgyQ", + "p": "1r52Xk46c-LsfB5P442p7atdPUrxQSy4mti_tZI3Mgf2EuFVbUoDBvaRQ- + SWxkbk- + moEzL7JXroSBjSrK3YIQgYdMgyAEPTPjXv_hI2_1eTSPVZfzL0lffNn03IXqWF5M + DFuoUYE0hzb2vhrlN_rKrbfDIwUbTrjjgieRbwC6Cl0", + "q": + "wLb35x7hmQWZsWJmB_vle87ihgZ19S8lBEROLIsZG4ayZVe9Hi9gDVCOBmUDdaD + YVTSNx_8Fyw1YYa9XGrGnDew00J28cRUoeBB_jKI1oma0Orv1T9aXIWxKwd4gvxF + ImOWr3QRL9KEBRzk2RatUBnmDZJTIAfwTs0g68UZHvtc", + "dp": "ZK- + YwE7diUh0qR1tR7w8WHtolDx3MZ_OTowiFvgfeQ3SiresXjm9gZ5KLhMXvo-uz- + KUJWDxS5pFQ_M0evdo1dKiRTjVw_x4NyqyXPM5nULPkcpU827rnpZzAJKpdhWAgq + rXGKAECQH0Xt4taznjnd_zVpAmZZq60WPMBMfKcuE", + "dq": + "Dq0gfgJ1DdFGXiLvQEZnuKEN0UUmsJBxkjydc3j4ZYdBiMRAy86x0vHCjywcMlY + Yg4yoC4YZa9hNVcsjqA3FeiL19rk8g6Qn29Tt0cj8qqyFpz9vNDBUfCAiJVeESOj + JDZPYHdHY8v1b-o-Z2X5tvLx-TCekf7oxyeKDUqKWjis", + "qi": "VIMpMYbPf47dT1w_zDUXfPimsSegnMOA1zTaX7aGk_8urY6R8- + ZW1FxU7AlWAyLWybqq6t16VFd7hQd0y6flUK4SlOydB61gwanOsXGOAOv82cHq0E + 3eL4HrtZkUuKvnPrMnsUUFlfUdybVzxyjz9JF_XyaY14ardLSjf4L_FNY" +} +``` + +### Exemple de chiffrement + +Le texte de message suivant est un exemple d’une requête POST /quotes sans chiffrement envoyée par le FSP Payeur à un FSP Bénéficiaire. + +```json +POST /quotes HTTP/1.1 +FSPIOP-Destination:5678 +Accept:application/vnd.interoperability.quotes+json;version=1.0 +Content-Length:975 +Date:Tue, 23 May 2017 21:12:31 GMT +FSPIOP-Source:1234 +Content-Type:application/vnd.interoperability.quotes+json;version=1.0 +``` + +```json +{ + "payee": { + "partyIdInfo": { "partyIdType": "MSISDN", "partyIdentifier": "15295558888", + "fspId": "5678" } }, + "amountType": "RECEIVE", + "transactionType": { "scenario": "TRANSFER", "initiator": "PAYER", + "subScenario": "P2P Transfer across MM systems", "initiatorType": "CONSUMER" }, + "note": "Ceci est un exemple pour POST /quotes", + "amount": { "amount": "150","currency": "USD" }, + "fees": { "amount": "1.5", "currency": "USD" }, + "extensionList": { + "extension": [ + { "value": "value1", "key": "key1"}, + { "value": "value2", "key": "key2"}, + { "value": "value3", "key": "key3" } + ] + }, + "geoCode": { "latitude": "57.323889", "longitude": "125.520001" + }, + "expiration": "2017-05-24T08:40:00.000-04:00", + "payer": { + "personalInfo": { + "complexName": { "firstName": "Bill", "middleName": "Ben", "LastName": "Lee" + }, "dateOfBirth": "1986-02-14" }, + "partyIdInfo": { "partyIdType": "MSISDN", + "partySubIdOrType": "RegisteredCustomer", "partyIdentifier": "16135551212", + "fspId": "1234" + }, "name": "Bill Lee" + }, "quoteId": "59e331fa-345f-4554-aac8-fcd8833f7d50", + "transactionId": "36629a51-393a-4e3c-b347-c2cb57e1e1fc" +} +``` + +Dans ce cas, le FSP Payeur souhaite chiffrer deux champs du message API : **payer** et **payee.partyIdInfo.partyIdentifier**. + +#### Chiffrer les champs requis + +Comme il y a deux champs à chiffrer, le FSP Payeur doit les chiffrer l’un après l’autre. + +##### Chiffrer "payer" + +Le FSP Payeur exécute les étapes suivantes pour chiffrer le champ **payer** dans le message API **POST /quotes**. + +1. Déterminer l’algorithme utilisé pour déterminer la CEK. Dans ce cas, supposons qu’il s’agit de **RSA-OAEP-256**. +2. Générer une CEK aléatoire de 256 bits. Dans ce cas, sa valeur est (notation tableau JSON) : + +``` +191 100 167 60 2 248 21 136 172 39 145 120 102 7 73 31 166 66 114 199 219 157 104 162 7 253 10 105 33 136 57 167 +``` + +3. Chiffrer la CEK avec la clé publique du FSP Bénéficiaire indiquée au format JSON Web Key dans [Exemples de chiffrement/déchiffrement d’API](#api-encryptiondecryption-examples). Dans ce cas, la valeur chiffrée est : + +``` +22 210 45 47 ... (les valeurs restent identiques, inchangées pour la traduction) +``` + +4. Calculer la valeur de la clé chiffrée en BASE64URL(JWE Encrypted Key). La valeur sera : + +``` +FtItL5lft09UGsIqG5gyw6MS63mMeOCBtHgVAC7EFXL7lH9LxipX-rpiD4j5g-BJb2yfj... +``` + +... *(Le reste des exemples, tableaux, et représentations JSON sont laissés tels quels car ce sont des valeurs techniques universelles.)* + +### Exemple de déchiffrement + +Dans cet exemple, le FSP Bénéficiaire reçoit le message API POST /quotes du FSP Payeur. Le message est décrit dans le [Modèle de données pour le chiffrement](#encryption-data-model). Si le FSP Bénéficiaire détecte que le paramètre d'en-tête HTTP **FSPIOP-Encryption** est présent dans le message, il sait alors que certains champs ont été chiffrés par le FSP Payeur. Le FSP Bénéficiaire effectue alors les étapes suivantes pour déchiffrer les champs chiffrés. + +#### Analyser FSPIOP-Encryption + +Le FSP Bénéficiaire vérifie que la valeur de **FSPIOP-Encryption** est une représentation encodée UTF-8 d’un objet JSON valide selon la RFC 7159. Le FSP analyse alors le paramètre d’en-tête HTTP **FSPIOP-Encryption** pour obtenir les informations sur les champs chiffrés : nom du champ, Protected Header JWE, Clé chiffrée JWE, Vecteur d'initialisation JWE, et Tag d’authentification JWE pour chaque champ. + +#### Déchiffrer les champs chiffrés + +Dans ce cas, le FSP Bénéficiaire extrait deux champs **payer** et **payee.partyIdInfo.partyIdentifier** de l’en-tête HTTP **FSPIOP-Encryption**, puis les déchiffre l’un après l’autre. + +##### Déchiffrer payer + +Le FSP Payeur exécute les étapes suivantes pour déchiffrer le champ **payer** dans le message API **POST /quotes**. + +1. Obtenir le Protected Header JWE encodé BASE64URL depuis **FSPIOP-Encryption** pour le champ **payer**. Sa valeur est : + +``` +eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0NNIn0 +``` + +... *(Les étapes détaillées sont conservées, simplement traduites ; les valeurs techniques ne changent pas.)* + +
    + +## Table des Tableaux +- [Table 1 -- Modèle de données du champ d’en-tête HTTP FSPIOP-Encryption](#table-1) +- [Table 2 -- Modèle de données du type complexe EncryptedFields](#table-2) +- [Table 3 -- Modèle de données du type complexe EncryptedField](#table-3) \ No newline at end of file diff --git a/docs/fr/technical/api/fspiop/v1.1/signature.md b/docs/fr/technical/api/fspiop/v1.1/signature.md new file mode 100644 index 000000000..f615d4463 --- /dev/null +++ b/docs/fr/technical/api/fspiop/v1.1/signature.md @@ -0,0 +1,425 @@ +--- +footerCopyright: Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0) | Ericsson, Huawei, Mahindra-Comviva, Telepin, et la Fondation Bill & Melinda Gates +--- +# Signature + +## Préface + +Cette section contient des informations sur la manière d'utiliser ce document. + +### Conventions utilisées dans ce document + +Ce document utilise les conventions de notation pour BASE64URL(OCTETS), UTF8(CHAÎNE), ASCII(CHAÎNE), et || définies dans la RFC 7515[1](https://tools.ietf.org/html/rfc7515#section-1.1). + +Les conventions suivantes sont utilisées dans ce document pour identifier les types d'information spécifiés. + +|Type d'information|Convention|Exemple| +|---|---|---| +|**Éléments de l'API, tels que les ressources**|Gras|**/authorization**| +|**Variables**|Italique entre accolades|_{ID}_| +|**Termes du glossaire**|Italique à la première occurrence; définis dans le _Glossaire_|Le but de l'API est de permettre des transactions financières interopérables entre un _Payeur_ (un payeur de fonds électroniques dans une transaction de paiement) situé dans un _FSP_ (entité fournissant un service financier numérique à un utilisateur final) et un _Bénéficiaire_ (un destinataire des fonds électroniques dans une transaction de paiement) situé dans un autre FSP.| +|**Documents de bibliothèque**|Italique|Les informations utilisateur ne doivent généralement pas être utilisées par les implémentations de l'API ; les mesures de sécurité détaillées dans _Signature de l'API_ et _Chiffrement de l'API_ doivent être utilisées à la place.| + +### Informations sur les versions du document + +|Version|Date|Description des changements| +|---|---|---| +|**1.1**|2020-05-19|Cette version contient les changements suivants : 1. Les sections 3.1, 3.2 et 3.3 ont été mises à jour selon « Solution Proposal 12 - Clarify usage of FSPIOP-Destination ». 2. Les éléments ExtensionList dans la section 4 ont été mis à jour en fonction du problème [Interpretation of the Data Model for the ExtensionList element](https://github.com/mojaloop/mojaloop-specification/issues/51), pour corriger le modèle de données de l'objet extensionList.| +|**1.0**|2018-03-13|Version initiale| + +
    + +## Introduction + +Ce document détaille les méthodes de sécurité à implémenter pour l'Open API pour l'interopérabilité des FSP (ci-après dénommée l'API) afin de garantir l’_intégrité_ et la _non-répudiation_ entre le client API et le serveur API. + +En sécurité de l'information, l’_intégrité des données_ signifie maintenir et assurer l'exactitude et la complétude des données sur tout leur cycle de vie. Pour l'API, l'intégrité des données signifie qu'un message API ne peut être modifié de manière non autorisée ou non détectée par les parties impliquées dans la communication API. + +Dans les termes juridiques, la _non-répudiation_ signifie qu'une personne s'engage à remplir ses obligations contractuelles. Cela signifie aussi qu'une des parties à une transaction ne peut pas nier avoir reçu la transaction, pas plus que l'autre partie ne peut nier l’avoir envoyée. Pour l'API, la non-répudiation signifie qu’un client API ne peut pas nier avoir envoyé un message API à une contrepartie. La signature JSON Web (JWS), telle que définie dans la RFC 7515[2](https://tools.ietf.org/html/rfc7515), doit être appliquée à l'API pour garantir l'intégrité et la non-répudiation du message, soit pour des champs composants d'une charge utile API, soit pour la totalité de celle-ci. À chaque fois qu'un client API envoie un message API à une contrepartie, le client API doit signer le message avec sa clé privée. Après que la contrepartie a reçu le message API, elle doit valider la signature avec la clé publique du client API. Seul le message HTTP request d'une API doit être signé ; toute réponse API HTTP NE DOIT PAS être signée. + +**Note :** La clé publique correspondante doit soit être partagée à l'avance avec la contrepartie, soit être récupérée par la contrepartie (par exemple via l'autorité de certification du schéma local). + +Comme les frais d'intermédiaire ne sont pas supportés dans la version courante de l'API, les intermédiaires impliqués dans le transit du message API ne peuvent pas modifier la charge utile du message API. Ainsi, la signature au niveau de la charge utile complète est utilisée pour protéger l'intégrité de l'ensemble du message API de bout en bout. Peu importe le nombre d'intermédiaires, la charge utile originale ne peut pas être modifiée. Le destinataire final du message API doit valider la signature générée par le client API original en se basant sur la charge utile reçue. + +**Note :** La nécessité pour les intermédiaires d’effectuer la validation de la signature en transit dépend de l’implémentation interne de chaque intermédiaire ou du schéma local. + +**Note :** Dans une future version de l'API, les frais d’intermédiaire pourraient être pris en charge ; la signature au niveau du champ pourrait alors aussi être supportée. Cependant, ces deux fonctionnalités sont hors du périmètre de cette version de l'API. + +
    + +### Spécification Open API pour l'interopérabilité des FSP + +La spécification Open API pour l'interopérabilité des FSP inclut les documents suivants. + +#### Documents logiques + +- [Modèle de données logique](./logical-data-model) + +- [Schémas de transactions génériques](./generic-transaction-patterns) + +- [Cas d'utilisation](./use-cases) + +#### Documents de liaison REST asynchrone + +- [Définition de l'API](./definitions) + +- [Règles d'encodage JSON](./json-binding-rules) + +- [Règles du schéma](./scheme-rules) + +#### Intégrité des données, confidentialité et non-répudiation + +- [Bonnes pratiques PKI](./pki-best-practices) + +- [Signature](#) + +- [Chiffrement](./v1.1/encryption) + +#### Documents généraux + +- [Glossaire](../glossary) + +
    + +## Définition de la signature API + +Cette section présente la technologie utilisée par la signature API, y compris le format d'échange de données pour la signature d'un message API et le mécanisme utilisé pour générer et vérifier une signature. + +### Modèle de données de la signature + +L'API utilise un paramètre d'en-tête HTTP personnalisé **FSPIOP-Signature** pour représenter la signature produite par le client API initiateur pour le message API. Le modèle de données de ce paramètre est décrit dans le [Tableau 1](#table-1). + +**Note :** Actuellement, l'API ne prend pas en charge les intermédiaires dans un message API ; seul l'initiateur du message peut signer un message. Si cela est requis à l'avenir, un nouveau paramètre d'en-tête HTTP personnalisé sera défini, mais cela est hors périmètre pour cette version de l'API. + +###### Tableau 1 + +| Nom | Cardin. | Type | Description | +| --- | --- | --- | --- | +| protectedHeader | 1 | Chaîne(1..32768) |
    Cet élément indique les paramètres d'en-tête HTTP protégés par la signature. Sa valeur doit être BASE64URL(UTF8(JWS Protected Header)).

    Selon la spécification JWS, le paramètre d'en-tête **alg** doit être présent pour identifier l'algorithme cryptographique utilisé pour sécuriser le JWS.

    Un paramètre personnalisé **FSPIOP-URI** représentant le chemin d'URI et les paramètres de requête du message de requête HTTP des APIs doit être présent.

    Un paramètre personnalisé **FSPIOP-HTTP-Method** contenant la méthode HTTP utilisée dans le message HTTP doit être présent.

    Un paramètre personnalisé **FSPIOP-Source** indiquant le système qui a envoyé la requête API doit être présent.

    Le paramètre d'en-tête HTTP personnalisé **FSPIOP-Destination** est obligatoire dans protectedHeader si le FSP de destination est connu par l'initiateur du message. Sinon, cet en-tête ne doit pas être protégé car il peut être modifié par les systèmes intermédiaires. Voir Définition de l'API pour plus d'informations sur les services pour lesquels l'en-tête FSPIOP-Destination est optionnel.
    | +| signature | 1 | Chaîne(1..512) | Cet élément représente la signature. Sa valeur fait partie de la sérialisation JWS : BASE64URL(JWS Signature). | +**Tableau 1 – Modèle de données du champ d'en-tête HTTP FSPIOP-Signature** + +### Génération d'une signature + +Pour créer la signature d'un message API, on effectue les étapes suivantes. L’ordre des étapes n’est pas significatif lorsque les entrées et sorties ne dépendent pas les unes des autres. + +1. Créer le contenu à utiliser comme JWS Payload. Puisque la signature est actuellement au niveau de la charge utile complète, le corps complet HTTP du message API est le JWS Payload. + +2. Calculer la valeur encodée du payload : BASE64URL(JWS Payload). + +3. Créer l'objet ou les objets JSON contenant les paramètres désirés pour le JWS Protected Header. + + A. Le paramètre **alg** du JWS Protected Header doit être présent. Dans l’API, les algorithmes disponibles pour la signature sont **RS256, RS384, RS512**. Une clé d’une taille de 2048 bits ou supérieure doit être utilisée avec ces algorithmes. + + B. Les autres paramètres enregistrés dans l’IANA JSON _Web Signature and Encryption Header Parameters_[3](https://www.iana.org/assignments/jose/jose.xhtml#web-signature-encryption-header-parameters) sont optionnels. + + C. Le paramètre personnalisé **FSPIOP-URI** doit être inclus dans le JWS Protected Header pour protéger le chemin d'URI et les paramètres de requête des API. + + D. Le paramètre personnalisé **FSPIOP-HTTP-Method** doit être inclus dans le JWS Protected Header pour protéger la méthode HTTP de la requête. + + E. Le paramètre **FSPIOP-Source** doit être présent, sa valeur provenant du paramètre d'en-tête HTTP correspondant **FSPIOP-Source**. + + F. Le paramètre **FSPIOP-Destination** doit être présent si le FSP de destination est connu par l'initiateur du message, et sa valeur doit être la même que le paramètre d'en-tête HTTP **FSPIOP-Destination**. + + G. Il est recommandé d'inclure d'autres paramètres d’en-tête HTTP des APIs dans le JWS Protected Header, mais ils sont optionnels. + +4. Calculer la valeur encodée de l'en-tête : BASE64URL(UTF8(JWS Protected Header)). + +5. Calculer la signature JWS selon la spécification JWS en utilisant la sortie des étapes 2 et 4. + +6. Calculer la valeur encodée de la signature : BASE64URL(JWS Signature). + +7. Calculer la valeur pour le paramètre d'en-tête HTTP **FSPIOP-Signature** tel que décrit dans la section [Modèle de données de la signature](#signature-data-model). La valeur de ce **FSPIOP-Signature** est une chaîne de sérialisation d’objet JSON. + +**Note :** Si JSON Web Encryption (JWE) est utilisé pour chiffrer certains champs de la charge utile (voir « Chiffrement »), alors le client API doit tout d’abord chiffrer les champs concernés, remplacer leur texte en clair par le texte chiffré encodé dans la charge utile, puis enfin signer la charge utile. + +### Validation de la signature + +Lors de la validation de la signature d'une requête API, on effectue les étapes suivantes. L’ordre des étapes n’est pas significatif lorsque les entrées et sorties ne dépendent pas les unes des autres. Si l’une des étapes échoue, alors la signature ne peut pas être validée. + +1. Extraire le paramètre d’en-tête HTTP **FSPIOP-Signature** pour obtenir les composants **protectedHeader** et **signature**. + +2. Utiliser BASE64URL pour décoder la représentation encodée du JWS Protected Header. Vérifier que la séquence d’octets obtenue est une représentation UTF-8 d’un objet JSON complètement valide conforme au format JSON Data Interchange, défini dans la RFC 7159[4](https://tools.ietf.org/html/rfc7159). + +3. Vérifier les paramètres du JWS Protected Header. + + a) Le paramètre **alg** doit être présent et sa valeur doit être l'une de **RS256, RS384, RS512**. + + b) Les autres paramètres enregistrés dans l’IANA JSON _Web Signature and Encryption Header Parameters_ sont optionnels. + + c) Le paramètre **FSPIOP-URI** doit être présent et sa valeur doit correspondre exactement à l'URL cible de la requête. + + d) Le paramètre **FSPIOP-HTTP-Method** doit être présent et sa valeur doit être la même que la méthode d'opération de la requête. + + e) Le paramètre **FSPIOP-Source** doit être présent, et sa valeur doit être la même que celle du paramètre d’en-tête HTTP **FSPIOP-Source**. + + f) Si le paramètre **FSPIOP-Destination** est présent dans le JWS Protected Header, alors sa valeur doit être la même que celle du paramètre d’en-tête HTTP **FSPIOP-Destination**. + + g) S'il y a d'autres paramètres d'en-tête HTTP présents dans le JWS Protected Header, leurs valeurs doivent être validées avec les valeurs d’en-tête HTTP correspondantes. + +4. Calculer la valeur encodée du payload : BASE64URL(JWS Payload). Actuellement, il s'agit du corps HTTP complet du message API. + +5. Valider la signature JWS contre JWS Signing Input ASCII(BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload)) de la manière définie par l’algorithme utilisé, qui doit correspondre à la valeur du paramètre d’en-tête **alg**. + +6. Consigner si la validation a réussi. + +
    + +## Exemples de signatures API + +Cette section utilise un processus de devis typique pour expliquer comment la signature API est implémentée via JWS. Les FSP de l’API peuvent vérifier que leur implémentation interne pour la signature API est correcte à l’aide du scénario suivant. + +Le cas de cette section utilise RS256 comme algorithme de signature. La clé RSA utilisée dans cet exemple de signature est représentée en format JSON Web Key (JWK), défini dans la RFC 7517[5](https://tools.ietf.org/html/rfc7517), ci-dessous (avec retours à la ligne et indentation pour la présentation uniquement) : + +```json +{ + "kty": "RSA", + "n": "ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddxHmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMsD1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSHSXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdVMTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ", + "e": "AQAB", + "d": "Eq5xpGnNCivDflJsRQBXHx1hdR1k6Ulwe2JZD50LpXyWPEAeP88vLNO97IjlA7_GQ5sLKMgvfTeXZx9SE-7YwVol2NXOoAJe46sui395IW_GO-pWJ1O0BkTGoVEn2bKVRUCgu-GjBVaYLU6f3l9kJfFNS3E0QbVdxzubSu3Mkqzjkn439X0M_V51gfpRLI9JYanrC4D4qAdGcopV_0ZHHzQlBjudU2QvXt4ehNYTCBr6XCLQUShb1juUO1ZdiYoFaFQT5Tw8bGUl_x_jTj3ccPDVZFD9pIuhLhBOneufuBiB4cS98l2SR_RQyGWSeWjnczT0QU91p1DhOVRuOopznQ", + "p": "4BzEEOtIpmVdVEZNCqS7baC4crd0pqnRH_5IB3jw3bcxGn6QLvnEtfdUdiYrqBdss1l58BQ3KhooKeQTa9AB0Hw_Py5PJdTJNPY8cQn7ouZ2KKDcmnPGBY5t7yLc1QlQ5xHdwW1VhvKn-nXqhJTBgIPgtldC-KDV5z-y2XDwGUc", + "q": "uQPEfgmVtjL0Uyyx88GZFF1fOunH3-7cepKmtH4pxhtCoHqpWmT8YAmZxaewHgHAjLYsp1ZSe7zFYHj7C6ul7TjeLQeZD_YwD66t62wDmpe_HlB-TnBA-njbglfIsRLtXlnDzQkv5dTltRJ11BKBBypeeF6689rjcJIDEz9RWdc", + "dp": "BwKfV3Akq5_MFZDFZCnW-wzl-CCo83WoZvnLQwCTeDv8uzluRSnm71I3QCLdhrqE2e9YkxvuxdBfpT_PI7Yz-FOKnu1R6HsJeDCjn12Sk3vmAktV2zb34MCdy7cpdTh_YVr7tss2u6vneTwrA86rZtu5Mbr1C1XsmvkxHQAdYo0", + "dq": "h_96-mK1R_7glhsum81dZxjTnYynPbZpHziZjeeHcXYsXaaMwkOlODsWa7I9xXDoRwbKgB719rrmI2oKr6N3Do9U0ajaHF-NKJnwgjMd2w9cjz3_-kyNlxAr2v4IKhGNpmM5iIgOS1VZnOZ68m6_pbLBSp3nssTdlqvd0tIiTHU", + "qi": "IYd7DHOhrWvxkwPQsRM2tOgrjbcrfvtQJipd-DlcxyVuuM9sQLdgjVk2oy26F0EmpScGLq2MowX7fhd_QJQ3ydy5cY7YIBi87w93IKLEdfnbJtoOPLUW0ITrJReOgo1cq9SbsxYawBgfp_gh6A5603k2-ZQwVK0JKSHuLFkuQ3U" +} +``` + +### Génération d'une signature exemple + +Le texte de message ci-dessous est un exemple de `POST /quotes` sans signature, envoyé par le FSP Payeur vers un destinataire (retours à la ligne et indentation à des fins de présentation uniquement). + +```json +POST /quotes HTTP/1.1 +Accept:application/vnd.interoperability.quotes+json;version=1.0 +FSPIOP-Source:1234 +FSPIOP-Destination:5678 +Content-Length:975 +Date:Tue, 23 May 2017 21:12:31 GMT +Content-Type:application/vnd.interoperability.quotes+json;version=1.0 +{ + "amount": { "amount": "150", "currency": "USD" },"transactionType": { + "scenario": "TRANSFER", "initiator": "PAYER","subScenario": "P2P Transfer across MM systems","initiatorType": "CONSUMER" + }, + "transactionId": "36629a51-393a-4e3c-b347-c2cb57e1e1fc","quoteId": "59e331fa-345f-4554-aac8-fcd8833f7d50","expiration": "2017-05-24T08:40:00.000-04:00", + "payer": { + "personalInfo": { + "dateOfBirth": "1986-02-14", + "complexName": { "middleName": "Ben", + "LastName": "Lee", "firstName": "Bill" } }, + "name": "Bill Lee", + "partyIdInfo": { "fspId": "1234", "partyIdType": "MSISDN", + "partySubIdOrType": "RegisteredCustomer","partyIdentifier": "16135551212" } + }, + "payee": { + "partyIdInfo": { "fspId": "5678", + "partyIdType": "MSISDN", + "partyIdentifier": "15295558888" } + }, + "fees": { "amount": "1.5", "currency": "USD" }, + "extensionList": { + "extension": [ + { "value": "value1", "key": "key1" }, + { "value": "value2", "key": "key2" }, + { "value": "value3", "key": "key3" } + ] + }, + "note": "this is a sample for POST /quotes", + "geoCode": { + "longitude": "125.520001", "latitude": "57.323889" }, + "amountType": "RECEIVE" +} +``` + +#### Calcul de l'entrée de la signature + +Conformément à la spécification JWS, l'entrée de la signature est BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload). + +En supposant que les paramètres d'en-tête HTTP **Date** et **FSPIOP-Destination** soient protégés par la signature, et que l'algorithme RS256 soit utilisé pour signer le message, le JWS Protected Header est le suivant (indentation pour la présentation uniquement) : + +```json +{ + "alg":"RS256", + "FSPIOP-Destination":"5678", + "FSPIOP-URI":"/quotes", + "FSPIOP-HTTP-Method":"POST", + "Date":"Tue, 23 May 2017 21:12:31 GMT", + "FSPIOP-Source":"1234" +} +``` + +L'encodage de ce JWS Protected Header en BASE64URL(UTF8(JWS Protected Header)) donne : + +``` +eyJhbGciOiJSUzI1NiIsIkZTUElPUC1EZXN0aW5hdGlvbiI6IjU2NzgiLCJGU1BJT1AtVVJJIjoiL3F1b3RlcyIsIkZTUElPUC1IVFRQLU1ldGhvZCI6IlBPU1QiLCJEYXRlIjoiVHVlLCAyMyBNYXkgMjAxNyAyMToxMjozMSBHTVQiLCJGU1BJT1AtU291cmNlIjoiMTIzNCJ9 +``` + +Dans ce cas, le JWS Payload est le corps HTTP décrit dans la section [Génération d'une signature](#generating-a-signature). En codant ce JWS Payload en BASE64URL(JWS Payload), on obtient : + +``` +eyJwYXllZSI6eyJwYXJ0eUlkSW5mbyI6eyJwYXJ0eUlkVHlwZSI6Ik1TSVNETiIsInBhcnR5SWRlbnRpZmllciI6IjE1Mjk1NTU4ODg4IiwiZnNwSWQiOiI1Njc4In19LCJhbW91bnRUeXBlIjoiUkVDRUlWRSIsInRyYW5zYWN0aW9uVHlwZSI6eyJzY2VuYXJpbyI6IlRSQU5TRkVSIiwiaW5pdGlhdG9yIjoiUEFZRVIiLCJzdWJTY2VuYXJpbyI6IlAyUCBUcmFuc2ZlciBhY3Jvc3MgTU0gc3lzdGVtcyIsImluaXRpYXRvclR5cGUiOiJDT05TVU1FUiJ9LCJub3RlIjoidGhpcyBpcyBhIHNhbXBsZSBmb3IgUE9TVCAvcXVvdGVzIiwiYW1vdW50Ijp7ImFtb3VudCI6IjE1MCIsImN1cnJlbmN5IjoiVVNEIn0sImZlZXMiOnsiYW1vdW50IjoiMS41IiwiY3VycmVuY3kiOiJVU0QifSwiZXh0ZW5zaW9uTGlzdCI6W3sidmFsdWUiOiJ2YWx1ZTEiLCJrZXkiOiJrZXkxIn0seyJ2YWx1ZSI6InZhbHVlMiIsImtleSI6ImtleTIifSx7InZhbHVlIjoidmFsdWUzIiwia2V5Ijoia2V5MyJ9XSwiZ2VvQ29kZSI6eyJsYXRpdHVkZSI6IjU3LjMyMzg4OSIsImxvbmdpdHVkZSI6IjEyNS41MjAwMDEifSwiZXhwaXJhdGlvbiI6IjIwMTctMDUtMjRUMDg6NDA6MDAuMDAwLTA0OjAwIiwicGF5ZXIiOnsicGVyc29uYWxJbmZvIjp7ImNvbXBsZXhOYW1lIjp7ImZpcnN0TmFtZSI6IkJpbGwiLCJtaWRkbGVOYW1lIjoiQmVuIiwiTGFzdE5hbWUiOiJMZWUifSwiZGF0ZU9mQmlydGgiOiIxOTg2LTAyLTE0In0sInBhcnR5SWRJbmZvIjp7InBhcnR5SWRUeXBlIjoiTVNJU0ROIiwicGFydHlTdWJJZE9yVHlwZSI6IlJlZ2lzdGVyZWRDdXN0b21lciIsInBhcnR5SWRlbnRpZmllciI6IjE2MTM1NTUxMjEyIiwiZnNwSWQiOiIxMjM0In0sIm5hbWUiOiJCaWxsIExlZSJ9LCJxdW90ZUlkIjoiNTllMzMxZmEtMzQ1Zi00NTU0LWFhYzgtZmNkODgzM2Y3ZDUwIiwidHJhbnNhY3Rpb25JZCI6IjM2NjI5YTUxLTM5M2EtNGUzYy1iMzQ3LWMyY2I1N2UxZTFmYyJ9 +``` + +#### Production de la signature + +Utiliser la clé privée RSA fournie, le JWS Protected Header et le JWS Payload pour générer la signature, puis encoder la signature en BASE64URL(JWS Signature) donne : + +``` +dz2ntyS0_rDyA0pLeWluG--tBcYYrlvG99ffkXcEB-dz2ntyS0_rDyA0pLeWluG--tBcYYrlvG99ffkXcEB-uve5Qzvzyn0ZUi82J7h17RsdfHPuTnbEGvCeU9Y4Bg0nIZHGL4icswaaO09T5hPPYKBTzVQeHkokLmL4dXpHdr1ggSEpu3WEU3nfgOFGGAdOq355i1iGuDbhqm_lSfVHaqdVCEhkJ2Y_r2glO2QpdZrcbvsBV39derj_PlfISBBGjdh0dIPxnFIVcZuPHiq9Ha2MslrBHfqwFfNeU_xhErBd2PywkDQJbKOlfqdkmFC9bS8Ofx0O6Mg7qdFGw-QkseJTfp0HMbH1d9e6H0cocY8xfuDNGaZpOJhxiYtiPLg +``` + +#### Reproduction de la requête API avec signature + +Comme décrit dans la section [Modèle de données de la signature](#signature-data-model), la signature API est représentée par un en-tête HTTP personnalisé **FSPIOP-Signature** ; donc la requête API avec la signature dans ce cas ressemble à : + +```json +POST /quotes HTTP/1.1 +FSPIOP-Destination:5678 +Accept:application/vnd.interoperability.quotes+json;version=1.0 +Content-Length:975 +Date:Tue, 23 May 2017 21:12:31 GMT +FSPIOP-Source:1234 +Content-Type:application/vnd.interoperability.quotes+json;version=1.0 +FSPIOP-Signature: {"signature": "dz2ntyS0_rDyA0pLeWluG--tBcYYrlvG99ffkXcEBuve5Qzvzyn0ZUi82J7h17RsdfHPuTnbEGvCeU9Y4Bg0nIZHGL4icswaaO09T5hPPYKBTzVQeHkokLmL4dXpHdr1ggSEpu3WEU3nfgOFGGAdOq355i1iGuDbhqm_lSfVHaqdVCEhkJ2Y_r2glO2QpdZrcbvsBV39derj_PlfISBBGjdh0dIPxnFIVcZuPHiq9Ha2MslrBHfqwFfNeU_xhErBd2PywkDQJbKOlfqdkmFC9bS8Ofx0O6Mg7qdFGwQkseJTfp0HMbH1d9e6H0cocY8xfuDNGaZpOJhxiYtiPLg", "protectedHeader": "eyJhbGciOiJSUzI1NiIsIkZTUElPUC1EZXN0aW5hdGlvbiI6IjU2NzgiLCJGU1BJT1AtVVJJIjoiL3F1b3RlcyIsIkZTUElPUC1IVFRQLU1ldGhvZCI6IlBPU1QiLCJEYXRlIjoiVHVlLCAyMyBNYXkgMjAxNyAyMToxMjozMSBHTVQiLCJGU1BJT1AtU291cmNlIjoiMTIzNCJ9" +} +{ + "amount": { "amount": "150", "currency": "USD" }, + "transactionType": { + "scenario": "TRANSFER", "initiator": "PAYER", + "subScenario": "P2P Transfer across MM systems", + "initiatorType": "CONSUMER" }, + "transactionId": "36629a51-393a-4e3c-b347-c2cb57e1e1fc", + "quoteId": "59e331fa-345f-4554-aac8-fcd8833f7d50", + "expiration": "2017-05-24T08:40:00.000-04:00", + "payer": { + "personalInfo": { "dateOfBirth": "1986-02-14", + "complexName": { "middleName": "Ben", + "LastName": "Lee", "firstName": "Bill" } }, + "name": "Bill Lee", + "partyIdInfo": { "fspId": "1234", "partyIdType": "MSISDN", + "partySubIdOrType": "RegisteredCustomer", + "partyIdentifier": "16135551212" } }, + "payee": { "partyIdInfo": { "fspId": "5678", + "partyIdType": "MSISDN", + "partyIdentifier": "15295558888" } }, + "fees": { "amount": "1.5", "currency": "USD" }, + "extensionList": { + "extension": [ + { "value": "value1", "key": "key1" }, + { "value": "value2", "key": "key2" }, + { "value": "value3", "key": "key3" } + ] + }, + "note": "this is a sample for POST /quotes", + "geoCode": { "longitude": "125.520001", "latitude": "57.323889" }, + "amountType": "RECEIVE" +} +``` + +### Validation de la signature + +Après que le FSP Bénéficiaire ait reçu le message API `POST /quotes` du FSP Payeur, le FSP Bénéficiaire doit valider la signature signée par le FSP Payeur. + +#### Analyse de FSPIOP-Signature + +1. Analysez le paramètre d’en-tête HTTP **FSPIOP-Signature** pour obtenir les composants **protectedHeader** et **signature**. Dans ce cas, la valeur de **protectedHeader** est : + +``` +eyJhbGciOiJSUzI1NiIsIkZTUElPUC1EZXN0aW5hdGlvbiI6IjU2NzgiLCJGU1BJT1AtVVJJIjo +iL3F1b3RlcyIsIkZTUElPUC1IVFRQLU1ldGhvZCI6IlBPU1QiLCJEYXRlIjoiVHVlLCAyMyBNYX +kgMjAxNyAyMToxMjozMSBHTVQiLCJGU1BJT1AtU291cmNlIjoiMTIzNCJ9 +``` + +2. Utilisez BASE64URL pour décoder la représentation encodée du JWS Protected Header. Vérifiez que la séquence d’octets obtenue est une représentation UTF-8 d’un objet JSON conforme au format RFC7159. Dans ce cas, l'objet JSON décodé est : + +```json +{ + "alg":"RS256", + "FSPIOP-Destination":"5678", + "FSPIOP-URI":"/quotes", + "FSPIOP-HTTP-Method":"POST", + "Date":"Tue, 23 May 2017 21:12:31 GMT", + "FSPIOP-Source":"1234" +} +``` + +3. Vérifier que le paramètre **alg** est valide pour l’API. Il doit faire partie de **RS256, RS384, RS512**. Dans ce cas, la valeur **alg** est **RS256**, ce qui est valide. + +4. Vérifier que la valeur du paramètre **FSPIOP-URI** est la même que l’URL d’entrée de ce message API. + +5. Vérifier que la valeur du paramètre **FSPIOP-HTTP-Method** est la même que la méthode HTTP de ce message API. + +6. Vérifier que la valeur de l'en-tête HTTP **FSPIOP-Source** est la même que celle indiquée dans ce JWS Protected Header. + +7. Vérifier que la valeur de l’en-tête HTTP **FSPIOP-Destination** est la même que celle indiquée dans ce JWS Protected Header. + +8. Vérifier les autres paramètres d’en-tête HTTP protégés. Ici, le paramètre **Date** est protégé par le JWS Protected Header. Si les paramètres **Date** dans l’en-tête HTTP et le JWS Protected Header sont égaux, alors la validation est réussie. Les deux paramètres **Date** dans l’exemple doivent avoir la valeur : + +``` +"Tue, 23 May 2017 21:12:31 GMT" +``` + +La validation est réussie. + +#### Vérification de la signature JWS + +1. Dans ce cas, le JWS Payload est le corps complet du message HTTP de l'API, donc (indentation incluse pour la présentation) : + +```json +{ + "amount": { "amount": "150", "currency": "USD" }, + "transactionType": { "scenario": "TRANSFER", "initiator": "PAYER", + "subScenario": "P2P Transfer across MM systems", + "initiatorType": "CONSUMER" + }, + "transactionId": "36629a51-393a-4e3c-b347-c2cb57e1e1fc", + "quoteId": "59e331fa-345f-4554-aac8-fcd8833f7d50", + "expiration": "2017-05-24T08:40:00.000-04:00", + "payer": { + "personalInfo": { "dateOfBirth": "1986-02-14", + "complexName": { "middleName": "Ben", + "LastName": "Lee", "firstName": "Bill" } }, + "name": "Bill Lee", + "partyIdInfo": { "fspId": "1234", + "partyIdType": "MSISDN", + "partySubIdOrType": "RegisteredCustomer", + "partyIdentifier": "16135551212" } }, + "payee": { + "partyIdInfo": { "fspId": "5678", + "partyIdType": "MSISDN", + "partyIdentifier": "15295558888" } }, + "fees": { "amount": "1.5", "currency": "USD" }, + "extensionList": { + "extension": [ + { "value": "value1", "key": "key1" }, + { "value": "value2", "key": "key2" }, + { "value": "value3", "key": "key3" } + ] + }, + "note": "this is a sample for POST /quotes", + "geoCode": { "longitude": "125.520001", "latitude": "57.323889" }, + "amountType": "RECEIVE" +} + ``` + +2. Calculez la valeur encodée du payload : BASE64URL(JWS Payload). Obtenez la valeur encodée suivante : + +``` +eyJwYXllZSI6eyJwYXJ0eUlkSW5mbyI6eyJwYXJ0eUlkVHlwZSI6Ik1TSVNETiIsInBhcnR5SWRlbnRpZmllciI6IjE1Mjk1NTU4ODg4IiwiZnNwSWQiOiI1Njc4In19LCJhbW91bnRUeXBlIjoiUkVDRUlWRSIsInRyYW5zYWN0aW9uVHlwZSI6eyJzY2VuYXJpbyI6IlRSQU5TRkVSIiwiaW5pdGlhdG9yIjoiUEFZRVIiLCJzdWJTY2VuYXJpbyI6IlAyUCBUcmFuc2ZlciBhY3Jvc3MgTU0gc3lzdGVtcyIsImluaXRpYXRvclR5cGUiOiJDT05TVU1FUiJ9LCJub3RlIjoidGhpcyBpcyBhIHNhbXBsZSBmb3IgUE9TVCAvcXVvdGVzIiwiYW1vdW50Ijp7ImFtb3VudCI6IjE1MCIsImN1cnJlbmN5IjoiVVNEIn0sImZlZXMiOnsiYW1vdW50IjoiMS41IiwiY3VycmVuY3kiOiJVU0QifSwiZXh0ZW5zaW9uTGlzdCI6W3sidmFsdWUiOiJ2YWx1ZTEiLCJrZXkiOiJrZXkxIn0seyJ2YWx1ZSI6InZhbHVlMiIsImtleSI6ImtleTIifSx7InZhbHVlIjoidmFsdWUzIiwia2V5Ijoia2V5MyJ9XSwiZ2VvQ29kZSI6eyJsYXRpdHVkZSI6IjU3LjMyMzg4OSIsImxvbmdpdHVkZSI6IjEyNS41MjAwMDEifSwiZXhwaXJhdGlvbiI6IjIwMTctMDUtMjRUMDg6NDA6MDAuMDAwLTA0OjAwIiwicGF5ZXIiOnsicGVyc29uYWxJbmZvIjp7ImNvbXBsZXhOYW1lIjp7ImZpcnN0TmFtZSI6IkJpbGwiLCJtaWRkbGVOYW1lIjoiQmVuIiwiTGFzdE5hbWUiOiJMZWUifSwiZGF0ZU9mQmlydGgiOiIxOTg2LTAyLTE0In0sInBhcnR5SWRJbmZvIjp7InBhcnR5SWRUeXBlIjoiTVNJU0ROIiwicGFydHlTdWJJZE9yVHlwZSI6IlJlZ2lzdGVyZWRDdXN0b21lciIsInBhcnR5SWRlbnRpZmllciI6IjE2MTM1NTUxMjEyIiwiZnNwSWQiOiIxMjM0In0sIm5hbWUiOiJCaWxsIExlZSJ9LCJxdW90ZUlkIjoiNTllMzMxZmEtMzQ1Zi00NTU0LWFhYzgtZmNkODgzM2Y3ZDUwIiwidHJhbnNhY3Rpb25JZCI6IjM2NjI5YTUxLTM5M2EtNGUzYy1iMzQ3LWMyY2I1N2UxZTFmYyJ9 +``` + +3. Validez la signature JWS par rapport à JWS Signing Input (le JWS Protected Header, JWS Payload) avec l'algorithme **RS256** (spécifié dans le JWS Protected Header), et la clé publique. Notez si la validation a réussi ou non. + +
    + +## Références + +1 [https://tools.ietf.org/html/rfc7515#section-1.1](https://tools.ietf.org/html/rfc7515#section-1.1) – JSON Web Signature (JWS) - Notational Conventions + +2 [https://tools.ietf.org/html/rfc7515](https://tools.ietf.org/html/rfc7515) – JSON Web Signature (JWS) + +3 [https://www.iana.org/assignments/jose/jose.xhtml#web-signature-encryption-header-parameters](https://www.iana.org/assignments/jose/jose.xhtml#web-signature-encryption-header-parameters) – Paramètres d’en-tête JSON Web Signature et Encryption + +4 [https://tools.ietf.org/html/rfc7159](https://tools.ietf.org/html/rfc7159) – Format d'échange de données JavaScript Object Notation (JSON) + +5 [https://tools.ietf.org/html/rfc7517](https://tools.ietf.org/html/rfc7517) – JSON Web Key (JWK) diff --git a/docs/fr/technical/api/license.md b/docs/fr/technical/api/license.md new file mode 100644 index 000000000..4bf2f2526 --- /dev/null +++ b/docs/fr/technical/api/license.md @@ -0,0 +1,27 @@ +# LICENSE + +This API specification is made available by **Ericsson**, **Huawei**, **Mahindra-Comviva**, **Telepin**, and the **Bill & Melinda Gates Foundation** under a **Creative Commons Attribution-NoDerivatives 4.0 International** License. In order to help maintain the integrity of the text of this document that reflects the underlying charitable goals of this project, we are circulating under a CC-BY license that prohibits the creation of derivative works based on this document. We ask that you do not create or distribute derivatives of this documentation. + +The Bill & Melinda Gates Foundation believes that an economy that includes everyone, benefits everyone. In support of this goal, we asked leading mobile wallet technology providers Ericsson, Huawei, Mahindra-Comviva and Telepin to work together to create a set of APIs for interoperability within the digital financial services infrastructure. Together with consultants from **Interledger** and **Modusbox**, the group worked to produce the APIs documented below. + +The underlying charitable goal for the API is to spur innovation and access to digital products and services that serve the financially underserved with a focus on interoperability, and strengthening and accelerating the availability of solutions that reflect the design principles of **L1P** as documented on www.leveloneproject.org. The contributors commit to making the relevant background technology which is provided to the API project necessary to implement the API in furtherance of the charitable goals available on a royalty-free basis. + +[**Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0)**](https://creativecommons.org/licenses/by-nd/4.0/) + +#### You are free to: +Share — copy and redistribute the material in any medium or format for any purpose, even commercially. The licensor cannot revoke these freedoms as long as you follow the license terms. +_____________________ + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. + +NoDerivatives — If you remix, transform, or build upon the material, you may not distribute the modified material. + +No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. +________________________________ + +#### Notices: + +You do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as publicity, privacy, or moral rights may limit how you use the material. \ No newline at end of file diff --git a/docs/fr/technical/api/settlement/README.md b/docs/fr/technical/api/settlement/README.md new file mode 100644 index 000000000..4fe520c99 --- /dev/null +++ b/docs/fr/technical/api/settlement/README.md @@ -0,0 +1,8 @@ +--- +showToc: false +--- +# Settlement API + + + + diff --git a/docs/fr/technical/api/thirdparty/README.md b/docs/fr/technical/api/thirdparty/README.md new file mode 100644 index 000000000..c4aa66058 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/README.md @@ -0,0 +1,41 @@ +# API Tierce Partie + +L’API Tierce Partie est une API destinée aux acteurs qui ne détiennent pas de fonds afin de leur permettre d’interagir via un hub Mojaloop centralisé. +Plus précisément, cette API permet aux Prestataires de Services d’Initiation de Paiement (PISP) d’agir en tant que mandataire lors de l’initiation +des paiements, tout en assurant une authentification forte des utilisateurs. + +## Termes + +Les termes suivants sont fréquemment utilisés dans la documentation de l’API Tierce Partie : + +| **Terme** | **Termes alternatifs et associés** | **Définition** | **Source** | +| --- | --- | --- | --- | +| **Prestataire de Services d’Initiation de Paiement** | PISP, Initiateur de Paiement Tiers (3PPI) | Entités réglementées telles que des banques de détail ou des tiers, permettant aux clients d'effectuer des paiements sans accéder à des comptes bancaires ou à des cartes | [PSD2](https://eur-lex.europa.eu/legal-content/FR/TXT/?uri=CELEX%3A32015L2366) | +| **FSP** | Fournisseur, Prestataire de Services Financiers (FSP), Prestataire de Services de Paiement, Prestataire de Services Financiers Numériques (DFSP) | L’entité qui fournit un service financier numérique à un utilisateur final (consommateur, entreprise ou gouvernement). Dans un système de paiement en boucle fermée, l’Opérateur du Système de Paiement remplit également ce rôle. Dans un système en boucle ouverte, les fournisseurs sont des banques ou des établissements non bancaires participant à ce système. | [UIT-T](https://www.itu.int/dms_pub/itu-t/opb/tut/T-TUT-ECOPO-2018-PDF-F.pdf) | +| **Utilisateur** | Utilisateur final | Un utilisateur final partagé entre un PISP et un DFSP. Utilisé principalement pour désigner un être humain, mais peut également représenter une machine ou une entreprise par exemple. | +| **Consentement** | Lien de compte | Représentation d’un accord entre le DFSP, le PISP et l’Utilisateur | | +| **Service d’authentification** | | Service opéré par le Hub Mojaloop, responsable de la vérification et conservation des consentements, ainsi que de la vérification des signatures des demandes de transaction | | + +## Définition de l’API + +L’API Tierce Partie est définie à travers les fichiers OpenAPI 3.0 suivants : + +- [API Tierce Partie – PISP](https://github.com/mojaloop/mojaloop-specification/blob/master/thirdparty-api/thirdparty-pisp-v1.0.yaml) +- [API Tierce Partie – DFSP](https://github.com/mojaloop/mojaloop-specification/blob/master/thirdparty-api/thirdparty-dfsp-v1.0.yaml) + +L’implémentation de ces API dépendra du rôle du participant. Les PISP doivent implémenter l’interface [API Tierce Partie – PISP](https://github.com/mojaloop/mojaloop-specification/blob/master/thirdparty-api/thirdparty-pisp-v1.0.yaml) +pour initier et gérer les opérations de Liaison de Compte et initier des Demandes de Transaction Tierce Partie. + +Les DFSP qui souhaitent supporter les opérations de Liaison de Compte, pouvoir répondre et vérifier les Demandes de Transaction Tierce Partie doivent +implémenter l’API [API Tierce Partie – DFSP](https://github.com/mojaloop/mojaloop-specification/blob/master/thirdparty-api/thirdparty-dfsp-v1.0.yaml). + +## Schémas de Transaction + +Les interactions et exemples de collaboration entre un DFSP et un PISP via l’API Tierce Partie sont disponibles dans les documents Schémas de Transaction suivants : + +1. [Liaison](./transaction-patterns-linking.md) décrit comment un lien de compte et un identifiant peuvent être établis entre un DFSP et un PISP. +2. [Transfert](./transaction-patterns-transfer.md) décrit comment un PISP peut initier un paiement depuis un compte DFSP à l’aide du lien de compte. + +## Modèles de Données + +Le [Document de Modèles de Données](./data-models.md) décrit en détail les modèles de données utilisés dans l’API Tierce Partie. diff --git a/docs/fr/technical/api/thirdparty/_sync_docs.sh b/docs/fr/technical/api/thirdparty/_sync_docs.sh new file mode 100644 index 000000000..fd92ad483 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/_sync_docs.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +## +# Synchronises the definition docs from their disparate locations into one place. +# +# The API Spec for the Third Party API is managed by the api-snippets project +## + +set -eu + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +GIT_URL="https://github.com/mojaloop/api-snippets.git" +BRANCH='master' +CLONE_DIR='/tmp/api-snippets' + +rm -rf ${CLONE_DIR} + +git clone -b ${BRANCH} ${GIT_URL} ${CLONE_DIR} + +# API definition, grab from mojaloop/pisp-project +cp ${CLONE_DIR}/thirdparty/openapi3/thirdparty-dfsp-api.yaml ${DIR}/thirdparty-dfsp-v1.0.yaml +cp ${CLONE_DIR}/thirdparty/openapi3/thirdparty-pisp-api.yaml ${DIR}/thirdparty-pisp-v1.0.yaml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/0-pre-linking.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/0-pre-linking.puml new file mode 100644 index 000000000..e3dfde0df --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/0-pre-linking.puml @@ -0,0 +1,49 @@ +@startuml + +' declaring skinparam +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title Liaison PISP : Pré-liaison + +box "Appareil mobile" + participant App +end box + +box "PISP" + participant PISP +end box + +box "Mojaloop" + participant Switch +end box + +autonumber 1 "PRE-#" +activate App +App -> PISP ++: Quels DFSP peuvent être liés ? + + +PISP -> Switch ++: ""GET /services/THIRD_PARTY_DFSP""\n""FSPIOP-Source: pispa""\n""FSPIOP-Destination: switch"" +Switch --> PISP: ""202 Accepted"" +deactivate PISP + +Switch -> PISP ++: ""PUT /services/THIRD_PARTY_DFSP""\n""FSPIOP-Source: switch""\n""FSPIOP-Destination: pispa""\n\ + ""{""\n\ + "" "serviceProviders": ["" \n\ + "" "dfspa", "dfspb""" \n\ + "" ]"" \n\ + ""}"" +PISP --> Switch: ""200 OK"" + +PISP --> App --: Nous avons dfspa et dfspb\n + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/0-pre-linking.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/0-pre-linking.svg new file mode 100644 index 000000000..80ba29f8a --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/0-pre-linking.svg @@ -0,0 +1,72 @@ + + Liaison PISP : Pré-liaison + + + Liaison PISP : Pré-liaison + + Appareil mobile + + PISP + + Mojaloop + + + + + + + + + App + + PISP + + Switch + + + + + + + PRE-1 + Quels DFSP peuvent être liés ? + + + PRE-2 + GET /services/THIRD_PARTY_DFSP + FSPIOP-Source: pispa + FSPIOP-Destination: switch + + + PRE-3 + 202 Accepted + + + PRE-4 + PUT /services/THIRD_PARTY_DFSP + FSPIOP-Source: switch + FSPIOP-Destination: pispa +   + { +    + "serviceProviders": [ +   +    + "dfspa", "dfspb + " +    + ] +   +   + } + + + PRE-5 + 200 OK + + + PRE-6 + Nous avons dfspa et dfspb +   + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/1-discovery.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/1-discovery.puml new file mode 100644 index 000000000..070d31ad8 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/1-discovery.puml @@ -0,0 +1,85 @@ +@startuml + +' declaring skinparam +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + + +title Liaison PISP : Découverte + +box "Appareil mobile" + participant App +end box + +box "PISP" + participant PISP +end box + +box "Mojaloop" + participant Switch +end box + +participant DFSP + +autonumber 1 "DISC-#" +activate PISP + +... + +note over App, DFSP + L'utilisateur est invité dans l'application PISP à saisir l'identifiant unique qu'il utilise auprès de son DFSP, et le type d'identifiant. Il peut s'agir d'un alias de compte, d'un MSISDN, d'une adresse e-mail, etc. +end note + +... + +PISP -> Switch ++: ""GET /accounts/username1234""\n\ + "" FSIOP-Source: pispa""\n\ + "" FSIOP-Destination: dfspa"" +Switch --> PISP: ""202 Accepted"" +deactivate PISP + +Switch -> DFSP ++: ""GET /accounts/username1234""\n\ + "" FSIOP-Source: pispa""\n\ + "" FSIOP-Destination: dfspa"" +DFSP --> Switch: ""202 Accepted"" +deactivate Switch + +DFSP -> Switch ++: ""PUT /accounts/username1234""\n\ + "" FSIOP-Source: dfspa""\n\ + "" FSIOP-Destination: pispa""\n\ + ""[""\n\ + "" { accountNickname: "Chequing Account", id: "dfspa.username.1234", currency: "ZAR" },""\n\ + "" { accountNickname: "Everyday Spend", id: "dfspa.username.5678", currency: "USD" }""\n\ + ""]"" +Switch --> DFSP: ""200 OK"" +deactivate DFSP + +Switch -> PISP ++: ""PUT /accounts/username1234""\n\ + "" FSIOP-Source: dfspa""\n\ + "" FSIOP-Destination: pispa""\n\ + ""[""\n\ + "" { accountNickname: "Chequing Account", id: "dfspa.username.1234", currency: "ZAR" },""\n\ + "" { accountNickname: "Everyday Spend", id: "dfspa.username.5678", currency: "USD" }""\n\ + ""]"" +PISP --> Switch: ""200 OK"" +deactivate Switch +deactivate PISP + +... + +note over App, DFSP + Le PISP peut maintenant présenter à l'utilisateur une liste de comptes possibles pour l'appariement. +end note + +... + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/1-discovery.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/1-discovery.svg new file mode 100644 index 000000000..0829997f5 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/1-discovery.svg @@ -0,0 +1,151 @@ + + Liaison PISP : Découverte + + + Liaison PISP : Découverte + + Appareil mobile + + PISP + + Mojaloop + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + App + + PISP + + Switch + + DFSP + + + + + + + + + + + + + + + L'utilisateur est invité dans l'application PISP à saisir l'identifiant unique qu'il utilise auprès de son DFSP, et le type d'identifiant. Il peut s'agir d'un alias de compte, d'un MSISDN, d'une adresse e-mail, etc. + + + DISC-1 + GET /accounts/username1234 +    + FSIOP-Source: pispa +    + FSIOP-Destination: dfspa + + + DISC-2 + 202 Accepted + + + DISC-3 + GET /accounts/username1234 +    + FSIOP-Source: pispa +    + FSIOP-Destination: dfspa + + + DISC-4 + 202 Accepted + + + DISC-5 + PUT /accounts/username1234 +    + FSIOP-Source: dfspa +    + FSIOP-Destination: pispa +    + [ +    + { accountNickname: "Chequing Account", id: "dfspa.username.1234", currency: "ZAR" }, +    + { accountNickname: "Everyday Spend", id: "dfspa.username.5678", currency: "USD" } +    + ] + + + DISC-6 + 200 OK + + + DISC-7 + PUT /accounts/username1234 +    + FSIOP-Source: dfspa +    + FSIOP-Destination: pispa +    + [ +    + { accountNickname: "Chequing Account", id: "dfspa.username.1234", currency: "ZAR" }, +    + { accountNickname: "Everyday Spend", id: "dfspa.username.5678", currency: "USD" } +    + ] + + + DISC-8 + 200 OK + + + Le PISP peut maintenant présenter à l'utilisateur une liste de comptes possibles pour l'appariement. + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/2-request-consent-otp.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/2-request-consent-otp.puml new file mode 100644 index 000000000..f65cfbe40 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/2-request-consent-otp.puml @@ -0,0 +1,119 @@ +@startuml + + +' declaring skinparam +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title Liaison PISP : Demande de consentement (OTP) + +participant "PISP" as PISP + +box "Mojaloop" + participant Switch +end box + +participant DFSP + +autonumber 1 "REQ-#" + +activate PISP + +... + +note over PISP, DFSP + L'utilisateur a initié une liaison de compte en choisissant le DFSP approprié depuis un écran de l'application PISP. +end note + +... + +PISP -> Switch ++: ""POST /consentRequests""\n\ + "" FSIOP-Source: pispa""\n\ + "" FSIOP-Destination: dfspa""\n\ +""{""\n\ + "" consentRequestId: "11111111-0000-0000-0000-000000000000",""\n\ + "" userId: "username1234",""\n\ + "" scopes: [ ""\n\ + "" { accountId: "dfsp.username.1234", ""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" { accountId: "dfsp.username.5678",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" ],""\n\ + "" authChannels: [ "Web", "OTP" ],""\n\ + "" callbackUri: "pisp-app://callback..."""\n\ + ""}"" +Switch --> PISP: ""202 Accepted"" +deactivate PISP + +Switch -> DFSP ++: ""POST /consentRequests""\n\ + "" FSIOP-Source: pispa""\n\ + "" FSIOP-Destination: dfspa""\n\ +""{""\n\ + "" consentRequestId: "11111111-0000-0000-0000-000000000000",""\n\ + "" userId: "username1234",""\n\ + "" scopes: [ ""\n\ + "" { accountId: "dfsp.username.1234",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" { accountId: "dfsp.username.5678",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" ],""\n\ + "" authChannels: [ "Web", "OTP" ],""\n\ + "" callbackUri: "pisp-app://callback..."""\n\ + ""}"" +DFSP --> Switch: ""202 Accepted"" +deactivate Switch + +DFSP -> DFSP: Vérification de la validité du consentRequest + + +DFSP -> Switch ++: ""PUT /consentRequests/11111111-0000-0000-0000-000000000000""\n\ + "" FSIOP-Source: dfspa""\n\ + "" FSIOP-Destination: pispa""\n\ +"" {""\n\ + "" authChannels: [ "OTP" ], ""\n\ + "" scopes: [ ""\n\ + "" { accountId: "dfsp.username.1234",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" { accountId: "dfsp.username.5678",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" ],""\n\ + "" callbackUri: "pisp-app://callback..."""\n\ + ""}"" +Switch --> DFSP: ""200 OK"" + +note over PISP, DFSP + Ici, le DFSP envoie un OTP directement à l'utilisateur (par ex. par SMS). +end note + +deactivate DFSP + +Switch -> PISP: ""PUT /consentRequests/11111111-0000-0000-0000-000000000000""\n\ + "" FSIOP-Source: dfspa""\n\ + "" FSIOP-Destination: pispa""\n\ +""{""\n\ + "" authChannels: [ "OTP" ], ""\n\ + "" scopes: [ ""\n\ + "" { accountId: "dfsp.username.1234",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" { accountId: "dfsp.username.5678",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" ],""\n\ + "" callbackUri: "pisp-app://callback..."""\n\ + ""}"" +PISP --> Switch: ""200 OK"" +deactivate Switch + +note over PISP, DFSP + À ce stade, le PISP sait que le canal d'authentification OTP est utilisé et que l'application PISP doit inviter l'utilisateur à saisir l'OTP. +end note + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/2-request-consent-otp.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/2-request-consent-otp.svg new file mode 100644 index 000000000..bdf84bebf --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/2-request-consent-otp.svg @@ -0,0 +1,203 @@ + + Liaison PISP : Demande de consentement (OTP) + + + Liaison PISP : Demande de consentement (OTP) + + Mojaloop + + + + + + + + + + + + + + + + + + + + + + + + + + + + PISP + + Switch + + DFSP + + + + + + + + + + + + + + L'utilisateur a initié une liaison de compte en choisissant le DFSP approprié depuis un écran de l'application PISP. + + + REQ-1 + POST /consentRequests +    + FSIOP-Source: pispa +    + FSIOP-Destination: dfspa + { +    + consentRequestId: "11111111-0000-0000-0000-000000000000", +    + userId: "username1234", +    + scopes: [ +    + { accountId: "dfsp.username.1234", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + { accountId: "dfsp.username.5678", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + ], +    + authChannels: [ "Web", "OTP" ], +    + callbackUri: "pisp-app://callback... + " +    + } + + + REQ-2 + 202 Accepted + + + REQ-3 + POST /consentRequests +    + FSIOP-Source: pispa +    + FSIOP-Destination: dfspa + { +    + consentRequestId: "11111111-0000-0000-0000-000000000000", +    + userId: "username1234", +    + scopes: [ +    + { accountId: "dfsp.username.1234", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + { accountId: "dfsp.username.5678", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + ], +    + authChannels: [ "Web", "OTP" ], +    + callbackUri: "pisp-app://callback... + " +    + } + + + REQ-4 + 202 Accepted + + + + + REQ-5 + Vérification de la validité du consentRequest + + + REQ-6 + PUT /consentRequests/11111111-0000-0000-0000-000000000000 +    + FSIOP-Source: dfspa +    + FSIOP-Destination: pispa + { +    + authChannels: [ "OTP" ], +    + scopes: [ +    + { accountId: "dfsp.username.1234", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + { accountId: "dfsp.username.5678", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + ], +    + callbackUri: "pisp-app://callback... + " +    + } + + + REQ-7 + 200 OK + + + Ici, le DFSP envoie un OTP directement à l'utilisateur (par ex. par SMS). + + + REQ-8 + PUT /consentRequests/11111111-0000-0000-0000-000000000000 +    + FSIOP-Source: dfspa +    + FSIOP-Destination: pispa + { +    + authChannels: [ "OTP" ], +    + scopes: [ +    + { accountId: "dfsp.username.1234", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + { accountId: "dfsp.username.5678", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + ], +    + callbackUri: "pisp-app://callback... + " +    + } + + + REQ-9 + 200 OK + + + À ce stade, le PISP sait que le canal d'authentification OTP est utilisé et que l'application PISP doit inviter l'utilisateur à saisir l'OTP. + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/2-request-consent-web.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/2-request-consent-web.puml new file mode 100644 index 000000000..8c6b158e3 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/2-request-consent-web.puml @@ -0,0 +1,118 @@ +@startuml + +' declaring skinparam +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + + +title Liaison PISP : Demande de consentement (Web) + +participant "PISP" as PISP + +box "Mojaloop" + participant Switch +end box + +participant DFSP + +autonumber 1 "REQ-#" + +activate PISP + +... + +note over PISP, DFSP + L'utilisateur a initié une liaison de compte en choisissant le DFSP approprié depuis un écran de l'application PISP. +end note + +... + +PISP -> Switch ++: ""POST /consentRequests""\n\ + "" FSIOP-Source: pispa""\n\ + "" FSIOP-Destination: dfspa""\n\ + "" {""\n\ + "" consentRequestId: "11111111-0000-0000-0000-000000000000",""\n\ + "" userId: "username1234", ""\n\ + "" scopes: [ ""\n\ + "" { accountId: "dfsp.username.1234", ""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" { accountId: "dfsp.username.5678",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" ],""\n\ + "" authChannels: [ "Web", "OTP" ],""\n\ + "" callbackUri: "pisp-app://callback..."""\n\ + ""}"" +Switch --> PISP: ""202 Accepted"" +deactivate PISP + +Switch -> DFSP ++: ""POST /consentRequests""\n\ + "" FSIOP-Source: pispa""\n\ + "" FSIOP-Destination: dfspa""\n\ + "" {""\n\ + "" consentRequestId: "11111111-0000-0000-0000-000000000000",""\n\ + "" userId: "username1234", ""\n\ + "" scopes: [ ""\n\ + "" { accountId: "dfsp.username.1234",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" { accountId: "dfsp.username.5678",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" ],""\n\ + "" authChannels: [ "Web", "OTP" ],""\n\ + "" callbackUri: "pisp-app://callback..."""\n\ + ""}"" +DFSP --> Switch: ""202 Accepted"" + +DFSP -> DFSP: Vérification de la validité du consentRequest +DFSP -> DFSP: Dans ce cas, le DFSP choisit le canal Web \n et ajoute l'URI de rappel du PISP à une liste autorisée +deactivate Switch + +DFSP -> Switch ++: ""PUT /consentRequests/11111111-0000-0000-0000-000000000000""\n\ + "" FSIOP-Source: dfspa""\n\ + "" FSIOP-Destination: pispa""\n\ + "" {""\n\ + "" scopes: [ ""\n\ + "" { accountId: "dfsp.username.1234",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" { accountId: "dfsp.username.5678",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" ],""\n\ + "" authChannels: [ "Web" ],""\n\ + "" callbackUri: "pisp-app://callback..."""\n\ + "" authUri: "dfspa.com/authorize?consentRequestId=11111111-0000-0000-0000-000000000000" ""\n\ + ""}"" +Switch --> DFSP: ""200 OK"" +deactivate DFSP + +Switch -> PISP ++: ""PUT /consentRequests/11111111-0000-0000-0000-000000000000""\n\ + "" FSIOP-Source: dfspa""\n\ + "" FSIOP-Destination: pispa""\n\ + "" {""\n\ + "" scopes: [ ""\n\ + "" { accountId: "dfsp.username.1234",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" { accountId: "dfsp.username.5678",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" ],""\n\ + "" authChannels: [ "Web" ],""\n\ + "" callbackUri: "pisp-app://callback..."""\n\ + "" authUri: "dfspa.com/authorize?consentRequestId=11111111-0000-0000-0000-000000000000" ""\n\ + ""}"" +PISP --> Switch: ""200 OK"" +deactivate Switch + +note over PISP, DFSP + À ce stade, le PISP sait que le canal d'authentification Web est utilisé et que l'application PISP doit rediriger l'utilisateur vers l'""authUri"" fourni. +end note + + + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/2-request-consent-web.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/2-request-consent-web.svg new file mode 100644 index 000000000..f31db2486 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/2-request-consent-web.svg @@ -0,0 +1,219 @@ + + Liaison PISP : Demande de consentement (Web) + + + Liaison PISP : Demande de consentement (Web) + + Mojaloop + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PISP + + Switch + + DFSP + + + + + + + + + + + + + + + L'utilisateur a initié une liaison de compte en choisissant le DFSP approprié depuis un écran de l'application PISP. + + + REQ-1 + POST /consentRequests +    + FSIOP-Source: pispa +    + FSIOP-Destination: dfspa +    + { +    + consentRequestId: "11111111-0000-0000-0000-000000000000", +    + userId: "username1234", +    + scopes: [ +    + { accountId: "dfsp.username.1234", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + { accountId: "dfsp.username.5678", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + ], +    + authChannels: [ "Web", "OTP" ], +    + callbackUri: "pisp-app://callback... + " +    + } + + + REQ-2 + 202 Accepted + + + REQ-3 + POST /consentRequests +    + FSIOP-Source: pispa +    + FSIOP-Destination: dfspa +    + { +    + consentRequestId: "11111111-0000-0000-0000-000000000000", +    + userId: "username1234", +    + scopes: [ +    + { accountId: "dfsp.username.1234", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + { accountId: "dfsp.username.5678", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + ], +    + authChannels: [ "Web", "OTP" ], +    + callbackUri: "pisp-app://callback... + " +    + } + + + REQ-4 + 202 Accepted + + + + + REQ-5 + Vérification de la validité du consentRequest + + + + + REQ-6 + Dans ce cas, le DFSP choisit le canal Web + et ajoute l'URI de rappel du PISP à une liste autorisée + + + REQ-7 + PUT /consentRequests/11111111-0000-0000-0000-000000000000 +    + FSIOP-Source: dfspa +    + FSIOP-Destination: pispa +    + { +    + scopes: [ +    + { accountId: "dfsp.username.1234", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + { accountId: "dfsp.username.5678", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + ], +    + authChannels: [ "Web" ], +    + callbackUri: "pisp-app://callback... + " +    + authUri: "dfspa.com/authorize?consentRequestId=11111111-0000-0000-0000-000000000000" +    + } + + + REQ-8 + 200 OK + + + REQ-9 + PUT /consentRequests/11111111-0000-0000-0000-000000000000 +    + FSIOP-Source: dfspa +    + FSIOP-Destination: pispa +    + { +    + scopes: [ +    + { accountId: "dfsp.username.1234", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + { accountId: "dfsp.username.5678", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + ], +    + authChannels: [ "Web" ], +    + callbackUri: "pisp-app://callback... + " +    + authUri: "dfspa.com/authorize?consentRequestId=11111111-0000-0000-0000-000000000000" +    + } + + + REQ-10 + 200 OK + + + À ce stade, le PISP sait que le canal d'authentification Web est utilisé et que l'application PISP doit rediriger l'utilisateur vers l' + authUri + fourni. + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/3-authentication-otp.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/3-authentication-otp.puml new file mode 100644 index 000000000..e49b425f8 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/3-authentication-otp.puml @@ -0,0 +1,62 @@ +@startuml + +' declaring skinparam +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title Liaison PISP : Authentification (OTP) + +participant "PISP" as PISP + +box "Mojaloop" + participant Switch +end box + +participant "DFSP" as DFSP + +autonumber 1 "AUTH-#" + +... + +note over PISP, DFSP + Ici, l'utilisateur saisit l'OTP qui lui a été envoyé directement par le DFSP dans l'application PISP. Il est utilisé comme secret pour prouver au DFSP que l'utilisateur fait confiance au PISP. +end note + +... + +PISP -> Switch ++: ""PATCH /consentRequests/11111111-0000-0000-0000-000000000000""\n\ + "" FSIOP-Source: pispa""\n\ + "" FSIOP-Destination: dfspa""\n\ +"" {""\n\ + "" authToken: "" ""\n\ + ""}"" +Switch --> PISP: ""202 Accepted"" +deactivate PISP + +Switch -> DFSP ++: ""PATCH /consentRequests/11111111-0000-0000-0000-000000000000""\n\ + "" FSIOP-Source: pispa""\n\ + "" FSIOP-Destination: dfspa""\n\ +"" {""\n\ + "" authToken: "" ""\n\ + ""}"" +DFSP --> Switch: ""202 Accepted"" +deactivate Switch + +DFSP -> DFSP: Vérification que l'OTP est correct. + +note over PISP, DFSP + À ce stade, le DFSP considère que l'utilisateur est son client et que l'utilisateur fait confiance au PISP. Le DFSP peut donc poursuivre en accordant le consentement. + + Note : le DFSP ne « répond » jamais directement à la demande de consentement. Il créera plutôt une ressource Consent lors de la phase d'octroi. +end note + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/3-authentication-otp.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/3-authentication-otp.svg new file mode 100644 index 000000000..d95990687 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/3-authentication-otp.svg @@ -0,0 +1,82 @@ + + Liaison PISP : Authentification (OTP) + + + Liaison PISP : Authentification (OTP) + + Mojaloop + + + + + + + + + + + + + + + + + + + PISP + + Switch + + DFSP + + + + + Ici, l'utilisateur saisit l'OTP qui lui a été envoyé directement par le DFSP dans l'application PISP. Il est utilisé comme secret pour prouver au DFSP que l'utilisateur fait confiance au PISP. + + + AUTH-1 + PATCH /consentRequests/11111111-0000-0000-0000-000000000000 +      + FSIOP-Source: pispa +      + FSIOP-Destination: dfspa + { +      + authToken: "<OTP>" +      + } + + + AUTH-2 + 202 Accepted + + + AUTH-3 + PATCH /consentRequests/11111111-0000-0000-0000-000000000000 +      + FSIOP-Source: pispa +      + FSIOP-Destination: dfspa + { +      + authToken: "<OTP>" +      + } + + + AUTH-4 + 202 Accepted + + + + + AUTH-5 + Vérification que l'OTP est correct. + + + À ce stade, le DFSP considère que l'utilisateur est son client et que l'utilisateur fait confiance au PISP. Le DFSP peut donc poursuivre en accordant le consentement. +   + Note : le DFSP ne « répond » jamais directement à la demande de consentement. Il créera plutôt une ressource Consent lors de la phase d'octroi. + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/3-authentication-third-party-fido.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/3-authentication-third-party-fido.puml new file mode 100644 index 000000000..ba9cd1f5c --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/3-authentication-third-party-fido.puml @@ -0,0 +1,45 @@ +@startuml + +' declaring skinparam +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title Liaison PISP : Authentification (enregistrement FIDO tiers) + +participant "PISP" as PISP + +box "Mojaloop" + participant Switch +end box + +participant "DFSP" as DFSP + +autonumber 1 "3P-FIDO-AUTH-#" + +... + +note over PISP, DFSP + Ici, l'utilisateur suit le processus d'authentification Web auprès de son DFSP. + Il en résulte une redirection vers le PISP avec un paramètre d'URL particulier indiquant au PISP d'attendre une notification concernant un identifiant. +end note + +... + +autonumber 1 "AUTH-#" + +note over PISP, DFSP + À ce stade, le DFSP considère que l'utilisateur est son client et que l'utilisateur fait confiance au PISP. Le DFSP peut donc poursuivre en accordant le consentement. + + Note : le DFSP ne « répond » jamais directement à la demande de consentement. Il créera plutôt une ressource Consent lors de la phase d'octroi. +end note + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/3-authentication-third-party-fido.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/3-authentication-third-party-fido.svg new file mode 100644 index 000000000..c46dc8c1c --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/3-authentication-third-party-fido.svg @@ -0,0 +1,39 @@ + + Liaison PISP : Authentification (enregistrement FIDO tiers) + + + Liaison PISP : Authentification (enregistrement FIDO tiers) + + Mojaloop + + + + + + + + + + + + + + + + + PISP + + Switch + + DFSP + + + Ici, l'utilisateur suit le processus d'authentification Web auprès de son DFSP. + Il en résulte une redirection vers le PISP avec un paramètre d'URL particulier indiquant au PISP d'attendre une notification concernant un identifiant. + + + À ce stade, le DFSP considère que l'utilisateur est son client et que l'utilisateur fait confiance au PISP. Le DFSP peut donc poursuivre en accordant le consentement. +   + Note : le DFSP ne « répond » jamais directement à la demande de consentement. Il créera plutôt une ressource Consent lors de la phase d'octroi. + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/3-authentication-web.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/3-authentication-web.puml new file mode 100644 index 000000000..6676205c6 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/3-authentication-web.puml @@ -0,0 +1,65 @@ +@startuml + +' declaring skinparam +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title Liaison PISP : Authentification (Web) + +participant "PISP" as PISP + +box "Mojaloop" + participant Switch +end box + +participant "DFSP" as DFSP + +autonumber 1 "WEB-AUTH-#" + +... + +note over PISP, DFSP + Ici, l'utilisateur suit le processus d'authentification Web auprès de son DFSP. + Il en résulte une redirection vers le PISP avec un paramètre d'URL particulier contenant un secret fourni par le DFSP. +end note + +... + +autonumber 1 "AUTH-#" + +PISP -> Switch ++: ""PATCH /consentRequests/11111111-0000-0000-0000-000000000000""\n\ + "" FSIOP-Source: pispa""\n\ + "" FSIOP-Destination: dfspa""\n\ +"" {""\n\ + "" authToken: "" ""\n\ + ""}"" +Switch --> PISP: ""202 Accepted"" +deactivate PISP + +Switch -> DFSP ++: ""PATCH /consentRequests/11111111-0000-0000-0000-000000000000""\n\ + "" FSIOP-Source: pispa""\n\ + "" FSIOP-Destination: dfspa""\n\ +"" {""\n\ + "" authToken: "" ""\n\ + ""}"" +DFSP --> Switch: ""202 Accepted"" +deactivate Switch + +DFSP -> DFSP: Vérification que le jeton d'authentification est correct. + +note over PISP, DFSP + À ce stade, le DFSP considère que l'utilisateur est son client et que l'utilisateur fait confiance au PISP. Le DFSP peut donc poursuivre en accordant le consentement. + + Note : le DFSP ne « répond » jamais directement à la demande de consentement. Il créera plutôt une ressource Consent lors de la phase d'octroi. +end note + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/3-authentication-web.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/3-authentication-web.svg new file mode 100644 index 000000000..6d5843e38 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/3-authentication-web.svg @@ -0,0 +1,83 @@ + + Liaison PISP : Authentification (Web) + + + Liaison PISP : Authentification (Web) + + Mojaloop + + + + + + + + + + + + + + + + + + + PISP + + Switch + + DFSP + + + + + Ici, l'utilisateur suit le processus d'authentification Web auprès de son DFSP. + Il en résulte une redirection vers le PISP avec un paramètre d'URL particulier contenant un secret fourni par le DFSP. + + + AUTH-1 + PATCH /consentRequests/11111111-0000-0000-0000-000000000000 +      + FSIOP-Source: pispa +      + FSIOP-Destination: dfspa + { +      + authToken: "<SECRET>" +      + } + + + AUTH-2 + 202 Accepted + + + AUTH-3 + PATCH /consentRequests/11111111-0000-0000-0000-000000000000 +      + FSIOP-Source: pispa +      + FSIOP-Destination: dfspa + { +      + authToken: "<SECRET>" +      + } + + + AUTH-4 + 202 Accepted + + + + + AUTH-5 + Vérification que le jeton d'authentification est correct. + + + À ce stade, le DFSP considère que l'utilisateur est son client et que l'utilisateur fait confiance au PISP. Le DFSP peut donc poursuivre en accordant le consentement. +   + Note : le DFSP ne « répond » jamais directement à la demande de consentement. Il créera plutôt une ressource Consent lors de la phase d'octroi. + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/4-grant-consent.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/4-grant-consent.puml new file mode 100644 index 000000000..8fd48380d --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/4-grant-consent.puml @@ -0,0 +1,64 @@ +@startuml + +' declaring skinparam +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +!pragma teoz true + +title Liaison PISP : Octroi du consentement + +participant "PISP" as PISP + +box "Mojaloop" + participant "Switch" as Switch +end box + +participant "DFSP" as DFSP + +autonumber 1 "GRANT-#" + +DFSP -> Switch ++: ""POST /consents""\n\ +"" FSIOP-Source: dfspa""\n\ +"" FSIOP-Destination: pispa""\n\ +"" {""\n\ + "" consentId: "22222222-0000-0000-0000-000000000000",""\n\ + "" consentRequestId: "11111111-0000-0000-0000-000000000000",""\n\ + "" status: "ISSUED",""\n\ + "" scopes: [ ""\n\ + "" { accountId: "dfsp.username.1234",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" { accountId: "dfsp.username.5678",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" ],""\n\ + ""}"" +Switch --> DFSP: ""202 Accepted"" +deactivate DFSP + +Switch -> PISP ++: ""POST /consents""\n\ +"" FSIOP-Source: dfspa""\n\ +"" FSIOP-Destination: pispa""\n\ +"" {""\n\ + "" consentId: "22222222-0000-0000-0000-000000000000",""\n\ + "" consentRequestId: "11111111-0000-0000-0000-000000000000",""\n\ + "" status: "ISSUED",""\n\ + "" scopes: [ ""\n\ + "" { accountId: "dfsp.username.1234",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" { accountId: "dfsp.username.5678",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" ],""\n\ + ""}"" + +PISP --> Switch: ""202 Accepted"" + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/4-grant-consent.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/4-grant-consent.svg new file mode 100644 index 000000000..a805ff7e0 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/4-grant-consent.svg @@ -0,0 +1,82 @@ + + Liaison PISP : Octroi du consentement + + + + Mojaloop + Liaison PISP : Octroi du consentement + + + + + + + PISP + + Switch + + DFSP + + + GRANT-1 + POST /consents + FSIOP-Source: dfspa + FSIOP-Destination: pispa + { +      + consentId: "22222222-0000-0000-0000-000000000000", +      + consentRequestId: "11111111-0000-0000-0000-000000000000", +      + status: "ISSUED", +      + scopes: [ +      + { accountId: "dfsp.username.1234", +      + actions: [ "ACCOUNTS_TRANSFER" ] }, +      + { accountId: "dfsp.username.5678", +      + actions: [ "ACCOUNTS_TRANSFER" ] }, +      + ], +      + } + + + GRANT-2 + 202 Accepted + + + GRANT-3 + POST /consents + FSIOP-Source: dfspa + FSIOP-Destination: pispa + { +      + consentId: "22222222-0000-0000-0000-000000000000", +      + consentRequestId: "11111111-0000-0000-0000-000000000000", +      + status: "ISSUED", +      + scopes: [ +      + { accountId: "dfsp.username.1234", +      + actions: [ "ACCOUNTS_TRANSFER" ] }, +      + { accountId: "dfsp.username.5678", +      + actions: [ "ACCOUNTS_TRANSFER" ] }, +      + ], +      + } + + + GRANT-4 + 202 Accepted + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/5a-credential-registration.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/5a-credential-registration.puml new file mode 100644 index 000000000..e8ed4fc39 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/5a-credential-registration.puml @@ -0,0 +1,219 @@ +@startuml + +' declaring skinparam +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +!pragma teoz true + +title Liaison PISP : Enregistrement des identifiants (vérification) + +participant "PISP" as PISP + +box "Mojaloop" + participant "Thirdparty-API-Adapter" as Switch + participant "Account Lookup Service" as ALS + participant "Auth Service" as Auth +end box + +participant "DFSP" as DFSP + +autonumber 0 "CRED-#" + +... + +note over PISP, DFSP + Le PISP utilise le flux d'enregistrement FIDO pour générer une nouvelle paire de clés et signer le défi, l'utilisateur effectuant une « action de déverrouillage » sur son appareil mobile. + + Le PISP utilise PublicKeyCredential comme fidoPayload pour l'identifiant, interprétable par le Auth Service et le DFSP. + Voir https://webauthn.guide/#authentication pour plus d'informations sur cet objet +end note + +... + +PISP -> Switch ++: ""PUT /consents/22222222-0000-0000-0000-000000000000""\n\ +"" FSIOP-Source: pispa""\n\ +"" FSPIOP-Destination: dfspa""\n\ +"" {""\n\ + "" consentRequestId: "11111111-0000-0000-0000-000000000000",""\n\ + "" status: "ISSUED",""\n\ + "" scopes: [""\n\ + "" {""\n\ + "" accountId: "dfsp.username.1234",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ],""\n\ + "" },""\n\ + "" {""\n\ + "" accountId: "dfsp.username.5678",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ],""\n\ + "" }""\n\ + "" ],""\n\ + "" credential: { ""\n\ + "" credentialType: "FIDO",""\n\ + "" status: "PENDING",""\n\ + "" fidoPayload: { ""\n\ + "" id: "45c-TkfkjQovQeAWmOy-RLBHEJ_e4jYzQYgD8VdbkePgM5d98BaAadadNYrknxgH0jQEON8zBydLgh1EqoC9DA", "" \n\ + "" response: { ""\n\ + "" "" authenticatorData: "SZYN5YgOjGh0NBcPZHZgW4/krrmihjLHmVzzuoMdl2MBAAAACA==",\n\ + "" "" clientDataJSON: "eyJ0eXBlIjoid2ViYXV0aG4...",\n\ + "" "" signature: "MEUCIDcJRBu5aOLJVc..."\n\ + "" } ""\n\ + "" } ""\n\ + "" }""\n\ +"" }"" +Switch --> PISP: ""202 Accepted"" +deactivate PISP + + +Switch -> DFSP ++: ""PUT /consents/22222222-0000-0000-0000-000000000000""\n\ +"" FSIOP-Source: pispa""\n\ +"" FSPIOP-Destination: dfspa""\n\ +"" {...}"" + +DFSP --> Switch: ""202 Accepted"" + + +rnote over DFSP + 1. Le DFSP vérifie le défi signé par rapport au défi dérivé des portées + + Si le DFSP choisit d'utiliser le Auth-Service hébergé par le hub : + 1. Enregistre le consentement auprès du Auth Service ""POST /consents"" + 2. Si le DFSP reçoit un `PUT /consents/{id}` et que le rappel contient + ""Consent.credential.status"" égal à ""VERIFIED"", pour chaque portée du + Consent, le DFSP crée un ""CredentialScope"" ; sinon, s'il reçoit + un rappel `PUT /consents/{id}/error`, il sait que le Consent est + invalide et peut propager l'erreur au PISP + +end note + + +DFSP -> Switch: ""POST /consents"" \n\ +"" FSIOP-Source: dfspa""\n\ +"" FSPIOP-Destination: central-auth""\n\ +"" {""\n\ + "" consentId: "22222222-0000-0000-0000-000000000000"""\n\ + "" consentRequestId: "11111111-0000-0000-0000-000000000000"""\n\ + "" status: "ISSUED",""\n\ + "" scopes: [""\n\ + "" {""\n\ + "" accountId: "dfsp.username.1234",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ],""\n\ + "" }""\n\ + "" },""\n\ + "" {""\n\ + "" accountId: "dfsp.username.5678",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ],""\n\ + "" }""\n\ + "" },""\n\ + "" ],""\n\ + "" credential: { ""\n\ + "" credentialType: "FIDO",""\n\ + "" status: "PENDING",""\n\ + "" fidoPayload: { ""\n\ + "" id: "45c-TkfkjQovQeAWmOy-RLBHEJ_e4jYzQYgD8VdbkePgM5d98BaAadadNYrknxgH0jQEON8zBydLgh1EqoC9DA", "" \n\ + "" response: { ""\n\ + "" "" authenticatorData: "SZYN5YgOjGh0NBcPZHZgW4/krrmihjLHmVzzuoMdl2MBAAAACA==",\n\ + "" "" clientDataJSON: "eyJ0eXBlIjoid2ViYXV0aG4...",\n\ + "" "" signature: "MEUCIDcJRBu5aOLJVc..."\n\ + "" } ""\n\ + "" } ""\n\ + "" }""\n\ +"" }"" + +Switch --> DFSP: "202 Accepted" + + +Switch -> Auth: ""POST /consents"" \n\ +"" FSIOP-Source: dfspa""\n\ +"" FSPIOP-Destination: central-auth""\n\ +"" {...}"" + +Auth --> Switch: "202 Accepted" + + +rnote over Auth + Le Auth Service vérifie la signature par rapport au défi +end note + +rnote over Auth + Le service d'authentification est désormais la source faisant autorité pour l'objet Consent. + + Il doit enregistrer le consentId auprès de l'ALS + - `Consent` — pour autoriser les appels `GET /consent/{ID}`, etc. Pointera vers le fspId du Auth Service responsable du Consent +end note + +Auth -> ALS: ""POST /participants/CONSENTS/22222222-0000-0000-0000-000000000000"" \n\ +"" FSPIOP-Source: central-auth""\n\ +"" {""\n\ +"" fspId: "central-auth",""\n\ +"" }"" +ALS --> Auth: ""202 Accepted"" + +rnote over ALS #LightGray + L'ALS enregistre une nouvelle entrée dans l'oracle Consents +end note + +ALS -> Auth: ""PUT /participants/CONSENTS/22222222-0000-0000-0000-000000000000"" \n\ +"" FSPIOP-Source: account-lookup-service""\n\ +"" FSPIOP-Destination: central-auth""\n\ +"" {""\n\ +"" fspId: "central-auth",""\n\ +"" }"" +Auth --> ALS: ""200 OK"" + +rnote over Auth #LightGray + Le service d'authentification informe maintenant le DFSP que l'identifiant est valide +end note + + +Auth -> Switch: ""PUT /consents/22222222-0000-0000-0000-000000000000"" \n\ +"" FSPIOP-Source: central-auth""\n\ +"" FSPIOP-Destination: dfspa""\n\ +"" {""\n\ + "" consentRequestId: "11111111-0000-0000-0000-000000000000"""\n\ + "" status: "ISSUED",""\n\ + "" scopes: [""\n\ + "" {""\n\ + "" accountId: "dfsp.username.1234",""\n\ + "" actions: [ "accounts.transfer", "accounts.getBalance" ],""\n\ + "" },""\n\ + "" {""\n\ + "" accountId: "dfsp.username.5678",""\n\ + "" actions: [ "accounts.transfer", "accounts.getBalance" ],""\n\ + "" },""\n\ + "" ],""\n\ + "" credential: { ""\n\ + "" credentialType: "FIDO",""\n\ + "" status: "VERIFIED",""\n\ + "" fidoPayload: { ""\n\ + "" id: "45c-TkfkjQovQeAWmOy-RLBHEJ_e4jYzQYgD8VdbkePgM5d98BaAadadNYrknxgH0jQEON8zBydLgh1EqoC9DA", "" \n\ + "" response: { ""\n\ + "" "" authenticatorData: "SZYN5YgOjGh0NBcPZHZgW4/krrmihjLHmVzzuoMdl2MBAAAACA==",\n\ + "" "" clientDataJSON: "eyJ0eXBlIjoid2ViYXV0aG4...",\n\ + "" "" signature: "MEUCIDcJRBu5aOLJVc..."\n\ + "" } ""\n\ + "" } ""\n\ + "" }""\n\ +"" }"" +Switch --> Auth: "200 OK" + +Switch -> DFSP: ""PUT /consents/22222222-0000-0000-0000-000000000000"" \n\ +"" FSPIOP-Source: central-auth""\n\ +"" FSPIOP-Destination: dfspa""\n\ +"" {...}"" + +DFSP --> Switch: "200 OK" + +rnote over DFSP + Le DFSP considère maintenant que le Consent enregistré par le PISP est valide. +end note + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/5a-credential-registration.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/5a-credential-registration.svg new file mode 100644 index 000000000..5bcc9b383 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/5a-credential-registration.svg @@ -0,0 +1,348 @@ + + Liaison PISP : Enregistrement des identifiants (vérification) + + + + Mojaloop + Liaison PISP : Enregistrement des identifiants (vérification) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PISP + + Thirdparty-API-Adapter + + Account Lookup Service + + Auth Service + + DFSP + + + Le PISP utilise le flux d'enregistrement FIDO pour générer une nouvelle paire de clés et signer le défi, l'utilisateur effectuant une « action de déverrouillage » sur son appareil mobile. +   + Le PISP utilise PublicKeyCredential comme fidoPayload pour l'identifiant, interprétable par le Auth Service et le DFSP. + Voir https://webauthn.guide/#authentication pour plus d'informations sur cet objet + + + CRED-0 + PUT /consents/22222222-0000-0000-0000-000000000000 + FSIOP-Source: pispa + FSPIOP-Destination: dfspa + { +      + consentRequestId: "11111111-0000-0000-0000-000000000000", +      + status: "ISSUED", +      + scopes: [ +      + { +      + accountId: "dfsp.username.1234", +      + actions: [ "ACCOUNTS_TRANSFER" ], +      + }, +      + { +      + accountId: "dfsp.username.5678", +      + actions: [ "ACCOUNTS_TRANSFER" ], +      + } +      + ], +      + credential: { +      + credentialType: "FIDO", +      + status: "PENDING", +      + fidoPayload: { +      + id: "45c-TkfkjQovQeAWmOy-RLBHEJ_e4jYzQYgD8VdbkePgM5d98BaAadadNYrknxgH0jQEON8zBydLgh1EqoC9DA", +   +      + response: { +      +          + authenticatorData: "SZYN5YgOjGh0NBcPZHZgW4/krrmihjLHmVzzuoMdl2MBAAAACA==", +      +          + clientDataJSON: "eyJ0eXBlIjoid2ViYXV0aG4...", +      +          + signature: "MEUCIDcJRBu5aOLJVc..." +      + } +      + } +      + } + } + + + CRED-1 + 202 Accepted + + + CRED-2 + PUT /consents/22222222-0000-0000-0000-000000000000 + FSIOP-Source: pispa + FSPIOP-Destination: dfspa + {...} + + + CRED-3 + 202 Accepted + + 1. Le DFSP vérifie le défi signé par rapport au défi dérivé des portées +   + Si le DFSP choisit d'utiliser le Auth-Service hébergé par le hub : + 1. Enregistre le consentement auprès du Auth Service + POST /consents + 2. Si le DFSP reçoit un `PUT /consents/{id}` et que le rappel contient +     + Consent.credential.status + égal à + VERIFIED + , pour chaque portée du + Consent, le DFSP crée un + CredentialScope + ; sinon, s'il reçoit + un rappel `PUT /consents/{id}/error`, il sait que le Consent est + invalide et peut propager l'erreur au PISP +   + + + CRED-4 + POST /consents +   + FSIOP-Source: dfspa + FSPIOP-Destination: central-auth + { +      + consentId: "22222222-0000-0000-0000-000000000000 + " +      + consentRequestId: "11111111-0000-0000-0000-000000000000 + " +      + status: "ISSUED", +      + scopes: [ +      + { +      + accountId: "dfsp.username.1234", +      + actions: [ "ACCOUNTS_TRANSFER" ], +      + } +      + }, +      + { +      + accountId: "dfsp.username.5678", +      + actions: [ "ACCOUNTS_TRANSFER" ], +      + } +      + }, +      + ], +      + credential: { +      + credentialType: "FIDO", +      + status: "PENDING", +      + fidoPayload: { +      + id: "45c-TkfkjQovQeAWmOy-RLBHEJ_e4jYzQYgD8VdbkePgM5d98BaAadadNYrknxgH0jQEON8zBydLgh1EqoC9DA", +   +      + response: { +      +          + authenticatorData: "SZYN5YgOjGh0NBcPZHZgW4/krrmihjLHmVzzuoMdl2MBAAAACA==", +      +          + clientDataJSON: "eyJ0eXBlIjoid2ViYXV0aG4...", +      +          + signature: "MEUCIDcJRBu5aOLJVc..." +      + } +      + } +      + } + } + + + CRED-5 + "202 Accepted" + + + CRED-6 + POST /consents +   + FSIOP-Source: dfspa + FSPIOP-Destination: central-auth + {...} + + + CRED-7 + "202 Accepted" + + Le Auth Service vérifie la signature par rapport au défi + + Le service d'authentification est désormais la source faisant autorité pour l'objet Consent. +   + Il doit enregistrer le consentId auprès de l'ALS + - `Consent` — pour autoriser les appels `GET /consent/{ID}`, etc. Pointera vers le fspId du Auth Service responsable du Consent + + + CRED-8 + POST /participants/CONSENTS/22222222-0000-0000-0000-000000000000 +   + FSPIOP-Source: central-auth + { + fspId: "central-auth", + } + + + CRED-9 + 202 Accepted + + L'ALS enregistre une nouvelle entrée dans l'oracle Consents + + + CRED-10 + PUT /participants/CONSENTS/22222222-0000-0000-0000-000000000000 +   + FSPIOP-Source: account-lookup-service + FSPIOP-Destination: central-auth + { + fspId: "central-auth", + } + + + CRED-11 + 200 OK + + Le service d'authentification informe maintenant le DFSP que l'identifiant est valide + + + CRED-12 + PUT /consents/22222222-0000-0000-0000-000000000000 +   + FSPIOP-Source: central-auth + FSPIOP-Destination: dfspa + { +      + consentRequestId: "11111111-0000-0000-0000-000000000000 + " +      + status: "ISSUED", +      + scopes: [ +      + { +      + accountId: "dfsp.username.1234", +      + actions: [ "accounts.transfer", "accounts.getBalance" ], +      + }, +      + { +      + accountId: "dfsp.username.5678", +      + actions: [ "accounts.transfer", "accounts.getBalance" ], +      + }, +      + ], +      + credential: { +      + credentialType: "FIDO", +      + status: "VERIFIED", +      + fidoPayload: { +      + id: "45c-TkfkjQovQeAWmOy-RLBHEJ_e4jYzQYgD8VdbkePgM5d98BaAadadNYrknxgH0jQEON8zBydLgh1EqoC9DA", +   +      + response: { +      +          + authenticatorData: "SZYN5YgOjGh0NBcPZHZgW4/krrmihjLHmVzzuoMdl2MBAAAACA==", +      +          + clientDataJSON: "eyJ0eXBlIjoid2ViYXV0aG4...", +      +          + signature: "MEUCIDcJRBu5aOLJVc..." +      + } +      + } +      + } + } + + + CRED-13 + "200 OK" + + + CRED-14 + PUT /consents/22222222-0000-0000-0000-000000000000 +   + FSPIOP-Source: central-auth + FSPIOP-Destination: dfspa + {...} + + + CRED-15 + "200 OK" + + Le DFSP considère maintenant que le Consent enregistré par le PISP est valide. + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/5b-finalize_consent.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/5b-finalize_consent.puml new file mode 100644 index 000000000..96c1f8451 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/5b-finalize_consent.puml @@ -0,0 +1,96 @@ +@startuml + +' declaring skinparam +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +!pragma teoz true + +title Liaison PISP : Enregistrement des identifiants (vérification) + +participant "PISP" as PISP + +box "Mojaloop" + participant "Switch" as Switch + participant "Account Lookup Service" as ALS +end box + +participant "DFSP" as DFSP + +autonumber 16 "CRED-#" + +... + + +rnote over DFSP + Le DFSP considère maintenant que le Consent enregistré par le PISP est valide, + et poursuit l'enregistrement auprès de l'ALS : + - `THIRD_PARTY_LINK` (facultatif — pour le routage des fonds vers un lien tiers) +end note + +loop pour chaque portée dans ""Consents.scopes"" + +DFSP -> ALS: ""POST /participants/THIRD_PARTY_LINK/dfsp.username.5678"" \n\ +"" FSIOP-Source: dfspa""\n\ +"" {""\n\ +"" fspId: "dfspa",""\n\ +"" }"" +ALS --> DFSP: ""202 Accepted"" + +rnote over ALS #LightGray + L'ALS enregistre une nouvelle entrée dans l'oracle THIRD_PARTY_LINK +end note + +ALS -> DFSP: ""PUT /participants/THIRD_PARTY_LINK/dfsp.username.5678"" \n\ +"" FSPIOP-Source: account-lookup-service""\n\ +"" FSPIOP-Destination: dfspa""\n\ +"" {""\n\ +"" fspId: "dfspa",""\n\ +"" }"" +DFSP --> ALS: ""200 OK"" +end + + +rnote over DFSP + Les identifiants étant vérifiés et enregistrés auprès du Auth Service, + le DFSP peut mettre à jour le PISP avec le statut final +end note + +DFSP -> Switch: ""PATCH /consents/22222222-0000-0000-0000-000000000000""\n\ +"" FSIOP-Source: dfspa""\n\ +"" FSPIOP-Destination: pispa""\n\ +"" Content-Type: application/merge-patch+json""\n\ +"" {""\n\ + "" credential: {""\n\ + "" **status: "VERIFIED", //this is new!**""\n\ + "" }""\n\ +"" }"" +DFSP --> Switch: ""200 OK"" + +Switch -> PISP ++: ""PATCH /consents/22222222-0000-0000-0000-000000000000""\n\ +"" FSIOP-Source: dfspa""\n\ +"" FSPIOP-Destination: pispa""\n\ +"" Content-Type: application/merge-patch+json""\n\ +"" {""\n\ + "" credential: {""\n\ + "" **status: "VERIFIED", //this is new!**""\n\ + "" }""\n\ +"" }"" +PISP --> Switch: ""200 OK"" + + +note over PISP, DFSP + Nous disposons maintenant d'un nouvel identifiant que le PISP peut utiliser pour initier des transactions, d'un identifiant enregistré, et cet identifiant est stocké dans le service d'authentification +end note + + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/5b-finalize_consent.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/5b-finalize_consent.svg new file mode 100644 index 000000000..a96a285a9 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/5b-finalize_consent.svg @@ -0,0 +1,115 @@ + + Liaison PISP : Enregistrement des identifiants (vérification) + + + + Mojaloop + Liaison PISP : Enregistrement des identifiants (vérification) + + + + + + + + + + + + + + + PISP + + Switch + + Account Lookup Service + + DFSP + + Le DFSP considère maintenant que le Consent enregistré par le PISP est valide, + et poursuit l'enregistrement auprès de l'ALS : + - `THIRD_PARTY_LINK` (facultatif — pour le routage des fonds vers un lien tiers) + + + loop + [pour chaque portée dans + Consents.scopes + ] + + + CRED-16 + POST /participants/THIRD_PARTY_LINK/dfsp.username.5678 +   + FSIOP-Source: dfspa + { + fspId: "dfspa", + } + + + CRED-17 + 202 Accepted + + L'ALS enregistre une nouvelle entrée dans l'oracle THIRD_PARTY_LINK + + + CRED-18 + PUT /participants/THIRD_PARTY_LINK/dfsp.username.5678 +   + FSPIOP-Source: account-lookup-service + FSPIOP-Destination: dfspa + { + fspId: "dfspa", + } + + + CRED-19 + 200 OK + + Les identifiants étant vérifiés et enregistrés auprès du Auth Service, + le DFSP peut mettre à jour le PISP avec le statut final + + + CRED-20 + PATCH /consents/22222222-0000-0000-0000-000000000000 + FSIOP-Source: dfspa + FSPIOP-Destination: pispa + Content-Type: application/merge-patch+json + { +      + credential: { +      +      + status: "VERIFIED", //this is new! +      + } + } + + + CRED-21 + 200 OK + + + CRED-22 + PATCH /consents/22222222-0000-0000-0000-000000000000 + FSIOP-Source: dfspa + FSPIOP-Destination: pispa + Content-Type: application/merge-patch+json + { +      + credential: { +      +      + status: "VERIFIED", //this is new! +      + } + } + + + CRED-23 + 200 OK + + + Nous disposons maintenant d'un nouvel identifiant que le PISP peut utiliser pour initier des transactions, d'un identifiant enregistré, et cet identifiant est stocké dans le service d'authentification + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/6a-unlinking-dfsp-hosted.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/6a-unlinking-dfsp-hosted.puml new file mode 100644 index 000000000..2e7db7fca --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/6a-unlinking-dfsp-hosted.puml @@ -0,0 +1,72 @@ +@startuml + +' declaring skinparam +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +!pragma teoz true + +title Liaison PISP : Dissociation + +participant "PISP" as PISP + +box "Mojaloop" + participant Switch +end box + +participant "DFSP" as DFSP + +autonumber 1 "UNLINK-A-#" + +activate PISP + +... + +note over PISP, DFSP + Dans ce scénario, il n'y a pas de service d'authentification hébergé par le hub. Le DFSP est l'autorité sur l'objet ""Consent"". +end note + +... + +PISP -> Switch ++: ""DELETE /consents/22222222-0000-0000-0000-000000000000""\n\ +"" FSIOP-Source: pispa""\n\ +"" FSIOP-Destination: dfspa"" +Switch --> PISP: ""202 Accepted"" +deactivate PISP + +Switch -> DFSP ++: ""DELETE /consents/22222222-0000-0000-0000-000000000000"" +DFSP --> Switch: ""202 Accepted"" +deactivate Switch + +DFSP -> DFSP: Marquer l'objet ""Consent"" comme « REVOKED » + +DFSP -> Switch ++: ""PATCH /consents/22222222-0000-0000-0000-000000000000""\n\ +"" FSIOP-Source: dfspa""\n\ +"" FSIOP-Destination: pispa""\n\ +""{ ""\n\ +"" status: "REVOKED",""\n\ +"" revokedAt: "2020-06-15T13:00:00.000"""\n\ +""}"" +Switch --> DFSP: ""200 OK"" +deactivate DFSP + +Switch -> PISP ++: ""PATCH /consents/22222222-0000-0000-0000-000000000000""\n\ +"" FSIOP-Source: dfspa""\n\ +"" FSIOP-Destination: pispa""\n\ +""{ ""\n\ +"" status: "REVOKED",""\n\ +"" revokedAt: "2020-06-15T13:00:00.000""\n\ +""}"" +PISP --> Switch: ""200 OK"" + + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/6a-unlinking-dfsp-hosted.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/6a-unlinking-dfsp-hosted.svg new file mode 100644 index 000000000..591be29b6 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/6a-unlinking-dfsp-hosted.svg @@ -0,0 +1,102 @@ + + Liaison PISP : Dissociation + + + + Mojaloop + Liaison PISP : Dissociation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PISP + + Switch + + DFSP + + + Dans ce scénario, il n'y a pas de service d'authentification hébergé par le hub. Le DFSP est l'autorité sur l'objet + Consent + . + + + UNLINK-A-1 + DELETE /consents/22222222-0000-0000-0000-000000000000 + FSIOP-Source: pispa + FSIOP-Destination: dfspa + + + UNLINK-A-2 + 202 Accepted + + + UNLINK-A-3 + DELETE /consents/22222222-0000-0000-0000-000000000000 + + + UNLINK-A-4 + 202 Accepted + + + + + UNLINK-A-5 + Marquer l'objet + Consent + comme « REVOKED » + + + UNLINK-A-6 + PATCH /consents/22222222-0000-0000-0000-000000000000 + FSIOP-Source: dfspa + FSIOP-Destination: pispa + { + status: "REVOKED", + revokedAt: "2020-06-15T13:00:00.000 + " + } + + + UNLINK-A-7 + 200 OK + + + UNLINK-A-8 + PATCH /consents/22222222-0000-0000-0000-000000000000 + FSIOP-Source: dfspa + FSIOP-Destination: pispa + { + status: "REVOKED", + revokedAt: "2020-06-15T13:00:00.000 + } + + + UNLINK-A-9 + 200 OK + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/6b-unlinking-hub-hosted.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/6b-unlinking-hub-hosted.puml new file mode 100644 index 000000000..319f377ec --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/6b-unlinking-hub-hosted.puml @@ -0,0 +1,105 @@ +@startuml + +' declaring skinparam +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +!pragma teoz true + +title Liaison PISP : Dissociation + +participant "PISP" as PISP + +box "Mojaloop" + participant Switch + participant "Account Lookup Service" as ALS + participant "Auth Service" as Auth +end box + +participant "DFSP" as DFSP + +autonumber 1 "UNLINK-B-#" + +activate PISP + +... + +note over PISP, DFSP + Dans ce scénario, il n'y a pas de service d'authentification hébergé par le hub. Le DFSP est l'autorité sur l'objet ""Consent"". +end note + +... + +PISP -> Switch ++: ""DELETE /consents/22222222-0000-0000-0000-000000000000""\n\ +"" FSIOP-Source: pispa""\n\ +"" FSIOP-Destination: dfspa"" +Switch --> PISP: ""202 Accepted"" +deactivate PISP + +Switch -> ALS: ""GET /participants/CONSENT/22222222-0000-0000-0000-000000000000"" +ALS --> Switch: ""200 OK""\n\ +"" { "fspId": "central-auth" }"" + +rnote over Switch #LightGray + Le hub a déterminé que « central-auth » est responsable du ""Consent"" 22222222-0000-0000-0000-000000000000 +end note + +Switch -> Auth ++: ""DELETE /consents/22222222-0000-0000-0000-000000000000"" +Auth --> Switch: ""202 Accepted"" +deactivate Switch + +Auth -> Auth: Marquer l'objet ""Consent"" comme « REVOKED » + +Auth -> Switch ++: ""PATCH /consents/22222222-0000-0000-0000-000000000000""\n\ +"" FSPIOP-Source: central-auth""\n\ +"" FSPIOP-Destination: pispa""\n\ +""{ ""\n\ +"" status: "REVOKED",""\n\ +"" revokedAt: "2020-06-15T13:00:00.000"""\n\ +""}"" +Switch --> Auth: ""200 OK"" +deactivate Auth + +Switch -> PISP ++: ""PATCH /consents/22222222-0000-0000-0000-000000000000""\n\ +"" FSPIOP-Source: central-auth""\n\ +"" FSPIOP-Destination: pispa""\n\ +""{ ""\n\ +"" status: "REVOKED",""\n\ +"" revokedAt: "2020-06-15T13:00:00.000"""\n\ +""}"" +PISP --> Switch: ""200 OK"" + + +rnote over Auth #LightGray + Le Auth Service doit également informer le DFSP du statut mis à jour +end note + +Auth -> Switch ++: ""PATCH /consents/22222222-0000-0000-0000-000000000000""\n\ +"" FSPIOP-Source: central-auth""\n\ +"" FSPIOP-Destination: dfspa""\n\ +""{ ""\n\ +"" status: "REVOKED",""\n\ +"" revokedAt: "2020-06-15T13:00:00.000"""\n\ +""}"" +Switch --> Auth: ""200 OK"" +deactivate Auth + +Switch -> DFSP ++: ""PATCH /consents/22222222-0000-0000-0000-000000000000""\n\ +"" FSPIOP-Source: central-auth""\n\ +"" FSPIOP-Destination: dfspa""\n\ +""{ ""\n\ +"" status: "REVOKED",""\n\ +"" revokedAt: "2020-06-15T13:00:00.000"""\n\ +""}"" +DFSP --> Switch: ""200 OK"" + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/6b-unlinking-hub-hosted.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/6b-unlinking-hub-hosted.svg new file mode 100644 index 000000000..46bcf01be --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/6b-unlinking-hub-hosted.svg @@ -0,0 +1,164 @@ + + Liaison PISP : Dissociation + + + + Mojaloop + Liaison PISP : Dissociation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PISP + + Switch + + Account Lookup Service + + Auth Service + + DFSP + + + Dans ce scénario, il n'y a pas de service d'authentification hébergé par le hub. Le DFSP est l'autorité sur l'objet + Consent + . + + + UNLINK-B-1 + DELETE /consents/22222222-0000-0000-0000-000000000000 + FSIOP-Source: pispa + FSIOP-Destination: dfspa + + + UNLINK-B-2 + 202 Accepted + + + UNLINK-B-3 + GET /participants/CONSENT/22222222-0000-0000-0000-000000000000 + + + UNLINK-B-4 + 200 OK + { "fspId": "central-auth" } + + Le hub a déterminé que « central-auth » est responsable du + Consent + 22222222-0000-0000-0000-000000000000 + + + UNLINK-B-5 + DELETE /consents/22222222-0000-0000-0000-000000000000 + + + UNLINK-B-6 + 202 Accepted + + + + + UNLINK-B-7 + Marquer l'objet + Consent + comme « REVOKED » + + + UNLINK-B-8 + PATCH /consents/22222222-0000-0000-0000-000000000000 + FSPIOP-Source: central-auth + FSPIOP-Destination: pispa + { + status: "REVOKED", + revokedAt: "2020-06-15T13:00:00.000 + " + } + + + UNLINK-B-9 + 200 OK + + + UNLINK-B-10 + PATCH /consents/22222222-0000-0000-0000-000000000000 + FSPIOP-Source: central-auth + FSPIOP-Destination: pispa + { + status: "REVOKED", + revokedAt: "2020-06-15T13:00:00.000 + " + } + + + UNLINK-B-11 + 200 OK + + Le Auth Service doit également informer le DFSP du statut mis à jour + + + UNLINK-B-12 + PATCH /consents/22222222-0000-0000-0000-000000000000 + FSPIOP-Source: central-auth + FSPIOP-Destination: dfspa + { + status: "REVOKED", + revokedAt: "2020-06-15T13:00:00.000 + " + } + + + UNLINK-B-13 + 200 OK + + + UNLINK-B-14 + PATCH /consents/22222222-0000-0000-0000-000000000000 + FSPIOP-Source: central-auth + FSPIOP-Destination: dfspa + { + status: "REVOKED", + revokedAt: "2020-06-15T13:00:00.000 + " + } + + + UNLINK-B-15 + 200 OK + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/1-discovery-error.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/1-discovery-error.puml new file mode 100644 index 000000000..d6a89f192 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/1-discovery-error.puml @@ -0,0 +1,79 @@ +@startuml + +' declaring skinparam +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title Liaison PISP : cas d'erreur de découverte + +box "PISP" + participant PISP +end box + +box "Mojaloop" + participant Switch +end box + +participant DFSP + +autonumber 1 "DISC-#" +activate PISP + +PISP -> Switch ++: ""GET /accounts/username1234""\n\ + "" FSIOP-Source: pispa""\n\ + "" FSIOP-Destination: dfspa"" +Switch --> PISP: ""202 Accepted"" +deactivate PISP + +Switch -> DFSP ++: ""GET /accounts/username1234""\n\ + "" FSIOP-Source: pispa""\n\ + "" FSIOP-Destination: dfspa"" +DFSP --> Switch: ""202 Accepted"" +deactivate Switch + +DFSP -> DFSP: Recherche d'un utilisateur pour **username1234** +DFSP -> DFSP: Aucun utilisateur trouvé + +DFSP -> Switch ++: ""PUT /accounts/username1234/error""\n\ + "" FSIOP-Source: dfspa""\n\ + "" FSIOP-Destination: pispa""\n\ + ""{""\n\ + "" errorInformation : { ""\n\ + "" errorCode: "6205", ""\n\ + "" errorDescription: "No accounts found" ""\n\ + "" } ""\n\ + ""}"" +Switch --> DFSP: ""200 OK"" +deactivate DFSP + +Switch -> PISP ++: ""PUT /accounts/username1234/error""\n\ + "" FSIOP-Source: dfspa""\n\ + "" FSIOP-Destination: pispa""\n\ + ""{""\n\ + "" errorInformation : { ""\n\ + "" errorCode: "6205", ""\n\ + "" errorDescription: "No accounts found" ""\n\ + "" } ""\n\ + ""}"" +PISP --> Switch: ""200 OK"" +deactivate Switch +deactivate PISP + +... + +note over Switch + Le PISP peut maintenant afficher un message d'erreur et l'utilisateur peut réessayer avec un autre nom d'utilisateur ou un autre DFSP. +end note + +... + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/1-discovery-error.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/1-discovery-error.svg new file mode 100644 index 000000000..748c4020d --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/1-discovery-error.svg @@ -0,0 +1,130 @@ + + Liaison PISP : cas d'erreur de découverte + + + Liaison PISP : cas d'erreur de découverte + + PISP + + Mojaloop + + + + + + + + + + + + + + + + + + + + + + PISP + + Switch + + DFSP + + + + + + + + DISC-1 + GET /accounts/username1234 +    + FSIOP-Source: pispa +    + FSIOP-Destination: dfspa + + + DISC-2 + 202 Accepted + + + DISC-3 + GET /accounts/username1234 +    + FSIOP-Source: pispa +    + FSIOP-Destination: dfspa + + + DISC-4 + 202 Accepted + + + + + DISC-5 + Recherche d'un utilisateur pour + username1234 + + + + + DISC-6 + Aucun utilisateur trouvé + + + DISC-7 + PUT /accounts/username1234/error +    + FSIOP-Source: dfspa +    + FSIOP-Destination: pispa +    + { +    + errorInformation : { +    + errorCode: "6205", +    + errorDescription: "No accounts found" +    + } +    + } + + + DISC-8 + 200 OK + + + DISC-9 + PUT /accounts/username1234/error +    + FSIOP-Source: dfspa +    + FSIOP-Destination: pispa +    + { +    + errorInformation : { +    + errorCode: "6205", +    + errorDescription: "No accounts found" +    + } +    + } + + + DISC-10 + 200 OK + + + Le PISP peut maintenant afficher un message d'erreur et l'utilisateur peut réessayer avec un autre nom d'utilisateur ou un autre DFSP. + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/2-request-consent-error.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/2-request-consent-error.puml new file mode 100644 index 000000000..ab12c0ff9 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/2-request-consent-error.puml @@ -0,0 +1,162 @@ +@startuml + +' declaring skinparam +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title **Liaison PISP : cas d'erreur consentRequest** + +participant "PISP" as PISP + +box "Mojaloop" + participant Switch +end box + +participant "DFSP" as DFSP + +== Portées demandées non prises en charge == + +autonumber 1 "REQ-#" +PISP -> Switch ++: ""POST /consentRequests""\n\ + "" FSIOP-Source: pispa""\n\ + "" FSIOP-Destination: dfspa""\n\ +""{""\n\ + "" consentRequestId: "11111111-0000-0000-0000-000000000000",""\n\ + "" userId: "username1234", ""\n\ + "" scopes: [ ""\n\ + "" { accountId: "dfsp.username.1234",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" { accountId: "dfsp.username.91011",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" ],""\n\ + "" authChannels: [ "WEB", "OTP" ],""\n\ + "" callbackUri: "pisp-app://callback..."""\n\ + ""}"" +Switch --> PISP: ""202 Accepted"" +deactivate PISP + +Switch -> DFSP ++: ""POST /consentRequests""\n\ + "" FSIOP-Source: pispa""\n\ + "" FSIOP-Destination: dfspa""\n\ +""{""\n\ + "" consentRequestId: "11111111-0000-0000-0000-000000000000",""\n\ + "" userId: "username1234",""\n\ + "" scopes: [ ""\n\ + "" { accountId: "dfsp.username.1234",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" { accountId: "dfsp.username.91011",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" ],""\n\ + "" authChannels: [ "WEB", "OTP" ],""\n\ + "" callbackUri: "pisp-app://callback..."""\n\ + ""}"" +DFSP --> Switch: ""202 Accepted"" +deactivate Switch + +autonumber 1 "DFSP-#" +DFSP -> DFSP: Le PISP a demandé des autorisations \npour accountId dfsp.username.91011 qui \n n'appartient pas à username1234 + +autonumber 5 "REQ-#" +DFSP -> Switch ++: ""PUT /consentRequests/11111111-0000-0000-0000-000000000000/error""\n\ + "" FSIOP-Source: dfspa""\n\ + "" FSIOP-Destination: pispa""\n\ + ""{""\n\ + "" errorInformation : { ""\n\ + "" errorCode: "6101", ""\n\ + "" errorDescription: "Unsupported scopes were requested" ""\n\ + "" } ""\n\ + ""}"" +Switch --> DFSP: ""200 OK"" +deactivate DFSP + +Switch -> PISP ++: ""PUT /consentRequests/11111111-0000-0000-0000-000000000000/error""\n\ + "" FSIOP-Source: dfspa""\n\ + "" FSIOP-Destination: pispa""\n\ + ""{""\n\ + "" errorInformation : { ""\n\ + "" errorCode: "6101", ""\n\ + "" errorDescription: "Unsupported scopes were requested" ""\n\ + "" } ""\n\ + ""}"" +PISP --> Switch: ""200 OK"" +deactivate Switch +deactivate PISP + +== URI de rappel non fiable == + +autonumber 1 "REQ-#" +PISP -> Switch ++: ""POST /consentRequests""\n\ + "" FSIOP-Source: pispa""\n\ + "" FSIOP-Destination: dfspa""\n\ +""{""\n\ + "" consentRequestId: "11111111-0000-0000-0000-000000000000",""\n\ + "" userId: "username1234", ""\n\ + "" scopes: [ ""\n\ + "" { **accountId: "dfsp.username.1234",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" { accountId: "dfsp.username.5678",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" ],""\n\ + "" authChannels: [ "WEB", "OTP" ],""\n\ + "" callbackUri: "http://phishing.com"""\n\ + ""}"" +Switch --> PISP: ""202 Accepted"" +deactivate PISP + +Switch -> DFSP ++: ""POST /consentRequests""\n\ + "" FSIOP-Source: pispa""\n\ + "" FSIOP-Destination: dfspa""\n\ +""{""\n\ + "" consentRequestId: "11111111-0000-0000-0000-000000000000",""\n\ + "" userId: "username1234",""\n\ + "" scopes: [ ""\n\ + "" { accountId: "dfsp.username.1234",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" { accountId: "dfsp.username.5678",""\n\ + "" actions: [ "ACCOUNTS_TRANSFER" ] },""\n\ + "" ],""\n\ + "" authChannels: [ "WEB", "OTP" ],""\n\ + "" callbackUri: "http://phishing.com"""\n\ + ""}"" +DFSP --> Switch: ""202 Accepted"" +deactivate Switch + +autonumber 1 "DFSP-#" +DFSP -> DFSP: Le callbackUri utilise le schéma http \nau lieu de https. Rejet du consentRequest + +autonumber 5 "REQ-#" +DFSP -> Switch ++: ""PUT /consentRequests/11111111-0000-0000-0000-000000000000/error""\n\ + "" FSIOP-Source: dfspa""\n\ + "" FSIOP-Destination: pispa""\n\ + ""{""\n\ + "" errorInformation : { ""\n\ + "" errorCode: "6204", ""\n\ + "" errorDescription: "Bad callbackUri" ""\n\ + "" } ""\n\ + ""}"" +Switch --> DFSP: ""200 OK"" +deactivate DFSP + +Switch -> PISP ++: ""PUT /consentRequests/11111111-0000-0000-0000-000000000000/error""\n\ + "" FSIOP-Source: dfspa""\n\ + "" FSIOP-Destination: pispa""\n\ + ""{""\n\ + "" errorInformation : { ""\n\ + "" errorCode: "6204", ""\n\ + "" errorDescription: "Bad callbackUri" ""\n\ + "" } ""\n\ + ""}"" +PISP --> Switch: ""200 OK"" +deactivate Switch +deactivate PISP + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/2-request-consent-error.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/2-request-consent-error.svg new file mode 100644 index 000000000..5069b7f1c --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/2-request-consent-error.svg @@ -0,0 +1,299 @@ + + **Liaison PISP : cas d'erreur consentRequest** + + + Liaison PISP : cas d'erreur consentRequest + + Mojaloop + + + + + + + + + + + + + PISP + + Switch + + DFSP + + + + + + + + + + + + + Portées demandées non prises en charge + + + REQ-1 + POST /consentRequests +    + FSIOP-Source: pispa +    + FSIOP-Destination: dfspa + { +    + consentRequestId: "11111111-0000-0000-0000-000000000000", +    + userId: "username1234", +    + scopes: [ +    + { accountId: "dfsp.username.1234", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + { accountId: "dfsp.username.91011", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + ], +    + authChannels: [ "WEB", "OTP" ], +    + callbackUri: "pisp-app://callback... + " +    + } + + + REQ-2 + 202 Accepted + + + REQ-3 + POST /consentRequests +    + FSIOP-Source: pispa +    + FSIOP-Destination: dfspa + { +    + consentRequestId: "11111111-0000-0000-0000-000000000000", +    + userId: "username1234", +    + scopes: [ +    + { accountId: "dfsp.username.1234", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + { accountId: "dfsp.username.91011", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + ], +    + authChannels: [ "WEB", "OTP" ], +    + callbackUri: "pisp-app://callback... + " +    + } + + + REQ-4 + 202 Accepted + + + + + DFSP-1 + Le PISP a demandé des autorisations + pour accountId dfsp.username.91011 qui + n'appartient pas à username1234 + + + REQ-5 + PUT /consentRequests/11111111-0000-0000-0000-000000000000/error +    + FSIOP-Source: dfspa +    + FSIOP-Destination: pispa +    + { +    + errorInformation : { +    + errorCode: "6101", +    + errorDescription: "Unsupported scopes were requested" +    + } +    + } + + + REQ-6 + 200 OK + + + REQ-7 + PUT /consentRequests/11111111-0000-0000-0000-000000000000/error +    + FSIOP-Source: dfspa +    + FSIOP-Destination: pispa +    + { +    + errorInformation : { +    + errorCode: "6101", +    + errorDescription: "Unsupported scopes were requested" +    + } +    + } + + + REQ-8 + 200 OK + + + + + URI de rappel non fiable + + + REQ-1 + POST /consentRequests +    + FSIOP-Source: pispa +    + FSIOP-Destination: dfspa + { +    + consentRequestId: "11111111-0000-0000-0000-000000000000", +    + userId: "username1234", +    + scopes: [ +    + { **accountId: "dfsp.username.1234", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + { accountId: "dfsp.username.5678", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + ], +    + authChannels: [ "WEB", "OTP" ], +    + callbackUri: "http://phishing.com + " +    + } + + + REQ-2 + 202 Accepted + + + REQ-3 + POST /consentRequests +    + FSIOP-Source: pispa +    + FSIOP-Destination: dfspa + { +    + consentRequestId: "11111111-0000-0000-0000-000000000000", +    + userId: "username1234", +    + scopes: [ +    + { accountId: "dfsp.username.1234", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + { accountId: "dfsp.username.5678", +    + actions: [ "ACCOUNTS_TRANSFER" ] }, +    + ], +    + authChannels: [ "WEB", "OTP" ], +    + callbackUri: "http://phishing.com + " +    + } + + + REQ-4 + 202 Accepted + + + + + DFSP-1 + Le callbackUri utilise le schéma http + au lieu de https. Rejet du consentRequest + + + REQ-5 + PUT /consentRequests/11111111-0000-0000-0000-000000000000/error +    + FSIOP-Source: dfspa +    + FSIOP-Destination: pispa +    + { +    + errorInformation : { +    + errorCode: "6204", +    + errorDescription: "Bad callbackUri" +    + } +    + } + + + REQ-6 + 200 OK + + + REQ-7 + PUT /consentRequests/11111111-0000-0000-0000-000000000000/error +    + FSIOP-Source: dfspa +    + FSIOP-Destination: pispa +    + { +    + errorInformation : { +    + errorCode: "6204", +    + errorDescription: "Bad callbackUri" +    + } +    + } + + + REQ-8 + 200 OK + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/3-authentication-otp-invalid.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/3-authentication-otp-invalid.puml new file mode 100644 index 000000000..dd1e8bbe6 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/3-authentication-otp-invalid.puml @@ -0,0 +1,85 @@ +@startuml + +' declaring skinparam +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title Liaison PISP : Authentification — authToken invalide + +participant "PISP" as PISP + +box "Mojaloop" + participant Switch +end box + +participant "DFSP" as DFSP + +autonumber 1 "AUTH-#" + +... + +note over PISP, DFSP + L'utilisateur saisit un OTP incorrect pour l'authentification. +end note + +... + +PISP -> Switch ++: ""PATCH /consentRequests/11111111-0000-0000-0000-000000000000""\n\ + "" FSIOP-Source: pispa""\n\ + "" FSIOP-Destination: dfspa""\n\ +"" {""\n\ + "" authToken: "" ""\n\ + ""}"" +Switch --> PISP: ""202 Accepted"" +deactivate PISP + +Switch -> DFSP ++: ""PATCH /consentRequests/11111111-0000-0000-0000-000000000000""\n\ + "" FSIOP-Source: pispa""\n\ + "" FSIOP-Destination: dfspa""\n\ +"" {""\n\ + "" authToken: "" ""\n\ + ""}"" +DFSP --> Switch: ""202 Accepted"" +deactivate Switch + +DFSP -> DFSP: L'OTP est incorrect. + +note over PISP, DFSP + Nous renvoyons une erreur indiquant que l'OTP est incorrect afin que le PISP puisse informer l'utilisateur. +end note + +DFSP -> Switch ++: ""PUT /consentRequests/11111111-0000-0000-0000-000000000000/error""\n\ + "" FSIOP-Source: dfspa""\n\ + "" FSIOP-Destination: pispa""\n\ + ""{""\n\ + "" errorInformation : { ""\n\ + "" errorCode: "6203", ""\n\ + "" errorDescription: "Invalid authentication token" ""\n\ + "" } ""\n\ + ""}"" +Switch --> DFSP: ""200 OK"" +deactivate DFSP + +Switch -> PISP ++: ""PUT /consentRequests/11111111-0000-0000-0000-000000000000/error""\n\ + "" FSIOP-Source: dfspa""\n\ + "" FSIOP-Destination: pispa""\n\ + ""{""\n\ + "" errorInformation : { ""\n\ + "" errorCode: "6203", ""\n\ + "" errorDescription: "Invalid authentication token" ""\n\ + "" } ""\n\ + ""}"" +PISP --> Switch: ""200 OK"" +deactivate Switch +deactivate PISP + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/3-authentication-otp-invalid.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/3-authentication-otp-invalid.svg new file mode 100644 index 000000000..ed2ec290a --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/3-authentication-otp-invalid.svg @@ -0,0 +1,132 @@ + + Liaison PISP : Authentification — authToken invalide + + + Liaison PISP : Authentification — authToken invalide + + Mojaloop + + + + + + + + + + + + + + + + + + + + + PISP + + Switch + + DFSP + + + + + + + L'utilisateur saisit un OTP incorrect pour l'authentification. + + + AUTH-1 + PATCH /consentRequests/11111111-0000-0000-0000-000000000000 +      + FSIOP-Source: pispa +      + FSIOP-Destination: dfspa + { +      + authToken: "<OTP>" +      + } + + + AUTH-2 + 202 Accepted + + + AUTH-3 + PATCH /consentRequests/11111111-0000-0000-0000-000000000000 +      + FSIOP-Source: pispa +      + FSIOP-Destination: dfspa + { +      + authToken: "<OTP>" +      + } + + + AUTH-4 + 202 Accepted + + + + + AUTH-5 + L'OTP est incorrect. + + + Nous renvoyons une erreur indiquant que l'OTP est incorrect afin que le PISP puisse informer l'utilisateur. + + + AUTH-6 + PUT /consentRequests/11111111-0000-0000-0000-000000000000/error +    + FSIOP-Source: dfspa +    + FSIOP-Destination: pispa +    + { +    + errorInformation : { +    + errorCode: "6203", +    + errorDescription: "Invalid authentication token" +    + } +    + } + + + AUTH-7 + 200 OK + + + AUTH-8 + PUT /consentRequests/11111111-0000-0000-0000-000000000000/error +    + FSIOP-Source: dfspa +    + FSIOP-Destination: pispa +    + { +    + errorInformation : { +    + errorCode: "6203", +    + errorDescription: "Invalid authentication token" +    + } +    + } + + + AUTH-9 + 200 OK + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/4-grant-consent-scope-error.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/4-grant-consent-scope-error.puml new file mode 100644 index 000000000..ce6a98f9d --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/4-grant-consent-scope-error.puml @@ -0,0 +1,82 @@ +@startuml + +' declaring skinparam +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + + +!pragma teoz true + +title Liaison PISP : Erreur de récupération des portées lors de l'octroi du consentement + +participant "PISP" as PISP + +box "Mojaloop" + participant "Thirdparty-API-Adapter" as Switch + participant "Account Lookup Service" as ALS + participant "Auth Service" as Auth +end box + +participant "DFSP" as DFSP + +autonumber 1 "GRANT-#" + +== Cas d'échec == + +PISP -> Switch ++: ""PATCH /consentRequests/11111111-0000-0000-0000-000000000000""\n\ + "" FSIOP-Source: pispa""\n\ + "" FSIOP-Destination: dfspa""\n\ +"" {""\n\ + "" authToken: "" ""\n\ + ""}"" +Switch --> PISP: ""202 Accepted"" +deactivate PISP + +Switch -> DFSP ++: ""PATCH /consentRequests/11111111-0000-0000-0000-000000000000""\n\ + "" FSIOP-Source: pispa""\n\ + "" FSIOP-Destination: dfspa""\n\ +"" {""\n\ + "" authToken: "" ""\n\ + ""}"" +DFSP --> Switch: ""202 Accepted"" +deactivate Switch + +DFSP -> DFSP: Vérification que l'OTP est correct. + +DFSP -> DFSP: Impossible de récupérer les portées stockées + +DFSP -> Switch ++: ""PUT /consentRequests/11111111-0000-0000-0000-000000000000/error""\n\ + "" FSIOP-Source: dfspa""\n\ + "" FSIOP-Destination: pispa""\n\ + ""{""\n\ + "" errorInformation : { ""\n\ + "" errorCode: "7207", ""\n\ + "" errorDescription: "FSP failed retrieve scopes for consent request" ""\n\ + "" } ""\n\ + ""}"" +Switch --> DFSP: ""200 OK"" +deactivate DFSP + +Switch -> PISP ++: ""PUT /consentRequests/11111111-0000-0000-0000-000000000000/error""\n\ + "" FSIOP-Source: dfspa""\n\ + "" FSIOP-Destination: pispa""\n\ + ""{""\n\ + "" errorInformation : { ""\n\ + "" errorCode: "7207", ""\n\ + "" errorDescription: "FSP failed retrieve scopes for consent request" ""\n\ + "" } ""\n\ + ""}"" +PISP --> Switch: ""200 OK"" +deactivate Switch +deactivate PISP + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/4-grant-consent-scope-error.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/4-grant-consent-scope-error.svg new file mode 100644 index 000000000..9c0d41083 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/linking/error_scenarios/4-grant-consent-scope-error.svg @@ -0,0 +1,127 @@ + + Liaison PISP : Erreur de récupération des portées lors de l'octroi du consentement + + + + Mojaloop + Liaison PISP : Erreur de récupération des portées lors de l'octroi du consentement + + + + + + + + + + + PISP + + Thirdparty-API-Adapter + + Account Lookup Service + + Auth Service + + DFSP + + + + + Cas d'échec + + + GRANT-1 + PATCH /consentRequests/11111111-0000-0000-0000-000000000000 +      + FSIOP-Source: pispa +      + FSIOP-Destination: dfspa + { +      + authToken: "<OTP>" +      + } + + + GRANT-2 + 202 Accepted + + + GRANT-3 + PATCH /consentRequests/11111111-0000-0000-0000-000000000000 +      + FSIOP-Source: pispa +      + FSIOP-Destination: dfspa + { +      + authToken: "<OTP>" +      + } + + + GRANT-4 + 202 Accepted + + + + + GRANT-5 + Vérification que l'OTP est correct. + + + + + GRANT-6 + Impossible de récupérer les portées stockées + + + GRANT-7 + PUT /consentRequests/11111111-0000-0000-0000-000000000000/error +    + FSIOP-Source: dfspa +    + FSIOP-Destination: pispa +    + { +    + errorInformation : { +    + errorCode: "7207", +    + errorDescription: "FSP failed retrieve scopes for consent request" +    + } +    + } + + + GRANT-8 + 200 OK + + + GRANT-9 + PUT /consentRequests/11111111-0000-0000-0000-000000000000/error +    + FSIOP-Source: dfspa +    + FSIOP-Destination: pispa +    + { +    + errorInformation : { +    + errorCode: "7207", +    + errorDescription: "FSP failed retrieve scopes for consent request" +    + } +    + } + + + GRANT-10 + 200 OK + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-1-discovery.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-1-discovery.puml new file mode 100644 index 000000000..e08c14139 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-1-discovery.puml @@ -0,0 +1,72 @@ +@startuml + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title Transfert : 1.1 Découverte + +box "PISP" +participant "Serveur PISP" as D1 +end box +box "Mojaloop" + participant Switch as S +end box +box "DFSP B" + participant "DFSP B\n(Bénéficiaire)" as D3 +end box + + +== Découverte (recherche) == +rnote right of D1 #LightGray +**""GET /parties/MSISDN/+4412345678""** +""FSPIOP-Source: pispa"" +end note +D1 -> S: ""GET /parties/MSISDN/+4412345678"" +S --> D1: ""202 Accepted"" + +... Flux de recherche ALS non représenté ici ... + +rnote over S #LightGray +**""GET /parties/MSISDN/+4412345678""** +""FSPIOP-Source: pispa"" +""FSPIOP-Destination: dfspb"" +end note +S -> D3: ""GET /parties/MSISDN/+4412345678"" +D3 --> S: ""202 Accepted"" + +rnote left of D3 #LightGray +**""PUT /parties/MSISDN/+4412345678""** +""FSPIOP-Source: dfspb"" +""FSPIOP-Destination: pispa"" +{ + partyIdType: "MSISDN", + partyIdentifier: "+4412345678", + party: { + partyIdInfo: { + partyIdType: "MSISDN", + partyIdentifier: "+4412345678", + fspId: 'dfspb", + }, + name: "Bhavesh S.", + } +} +end note +D3 -> S: ""PUT /parties/MSISDN/+4412345678"" +S --> D3: ""200 OK"" +S -> D1: ""PUT /parties/MSISDN/+4412345678"" +D1 --> S: ""200 OK"" + +... Le PISP confirme la partie bénéficiaire avec son utilisateur ... + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-1-discovery.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-1-discovery.svg new file mode 100644 index 000000000..70f9cb931 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-1-discovery.svg @@ -0,0 +1,89 @@ + + Transfert : 1.1 Découverte + + + Transfert : 1.1 Découverte + + PISP + + Mojaloop + + DFSP B + + + + + + + + + + + + + + + + + Serveur PISP + + Switch + + DFSP B + (Bénéficiaire) + + + + + Découverte (recherche) + + GET /parties/MSISDN/+4412345678 + FSPIOP-Source: pispa + + + GET /parties/MSISDN/+4412345678 + + + 202 Accepted + Flux de recherche ALS non représenté ici + + GET /parties/MSISDN/+4412345678 + FSPIOP-Source: pispa + FSPIOP-Destination: dfspb + + + GET /parties/MSISDN/+4412345678 + + + 202 Accepted + + PUT /parties/MSISDN/+4412345678 + FSPIOP-Source: dfspb + FSPIOP-Destination: pispa + { + partyIdType: "MSISDN", + partyIdentifier: "+4412345678", + party: { + partyIdInfo: { + partyIdType: "MSISDN", + partyIdentifier: "+4412345678", + fspId: 'dfspb", + }, + name: "Bhavesh S.", + } + } + + + PUT /parties/MSISDN/+4412345678 + + + 200 OK + + + PUT /parties/MSISDN/+4412345678 + + + 200 OK + Le PISP confirme la partie bénéficiaire avec son utilisateur + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-1-agreement.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-1-agreement.puml new file mode 100644 index 000000000..95cc3600c --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-1-agreement.puml @@ -0,0 +1,86 @@ +@startuml + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title Transfert : 1.2.1 Accord + +box "PISP" +participant "Serveur PISP" as D1 +end box +box "Mojaloop" + participant Switch as S +end box +box "DFSP A" + participant "DFSP A\n(Payeur)" as D2 +end box + + +== Phase d'accord == +rnote right of D1 #LightGray +**""POST /thirdpartyRequests/transactions""** +""FSPIOP-Source: pispa"" +""FSPIOP-Destination: dfspa"" +{ + "transactionRequestId": "00000000-0000-0000-0000-000000000000", + "payee": { + "partyIdInfo": { + "partyIdType": "MSISDN", + "partyIdentifier": "+4412345678", + "fspId": "dfspb" + } + }, + "payer": { + "partyIdType": "THIRD_PARTY_LINK", + "partyIdentifier": "qwerty-56789", + "fspId": "dfspa" + }, + "amountType": "SEND", + "amount": { + "amount": "100", + "currency": "USD" + }, + "transactionType": { + "scenario": "TRANSFER", + "initiator": "PAYER", + "initiatorType": "CONSUMER" + }, + "expiration": "2020-06-15T22:17:28.985-01:00" +} +end note +D1 -> S: ""POST /thirdpartyRequests/transactions"" +S --> D1: ""202 Accepted"" +S -> D2: ""POST /thirdpartyRequests/transactions"" +D2 --> S: ""202 Accepted"" +D2 -> D2: Recherche du consentement pour ce ""payeur"", vérification de l'existence et que le consentement \nest accordé avec des identifiants valides +D2 -> D2: Stockage d'une référence au ""consentId"" avec le ""transactionRequestId"" +D2 -> D2: Génération d'un transactionId unique pour cette demande de transaction :\n**""11111111-0000-0000-0000-000000000000""** + + +rnote left of D2 #LightGray +**""PUT /thirdpartyRequests/transactions""** +**"" /00000000-0000-0000-0000-000000000000""** +""FSPIOP-Source: dfspa"" +""FSPIOP-Destination: pispa"" +{ + "transactionRequestState": "RECEIVED" +} +end note +D2 -> S: ""PUT /thirdpartyRequests/transactions""\n"" /00000000-0000-0000-0000-000000000000"" +S --> D2: ""200 OK"" +S -> D1: ""PUT /thirdpartyRequests/transactions""\n"" /00000000-0000-0000-0000-000000000000"" +D1 --> S: ""200 OK"" + + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-1-agreement.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-1-agreement.svg new file mode 100644 index 000000000..a9c5a2a1e --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-1-agreement.svg @@ -0,0 +1,114 @@ + + Transfert : 1.2.1 Accord + + + Transfert : 1.2.1 Accord + + PISP + + Mojaloop + + DFSP A + + + + + Serveur PISP + + Switch + + DFSP A + (Payeur) + + + + + Phase d'accord + + POST /thirdpartyRequests/transactions + FSPIOP-Source: pispa + FSPIOP-Destination: dfspa + { + "transactionRequestId": "00000000-0000-0000-0000-000000000000", + "payee": { + "partyIdInfo": { + "partyIdType": "MSISDN", + "partyIdentifier": "+4412345678", + "fspId": "dfspb" + } + }, + "payer": { + "partyIdType": "THIRD_PARTY_LINK", + "partyIdentifier": "qwerty-56789", + "fspId": "dfspa" + }, + "amountType": "SEND", + "amount": { + "amount": "100", + "currency": "USD" + }, + "transactionType": { + "scenario": "TRANSFER", + "initiator": "PAYER", + "initiatorType": "CONSUMER" + }, + "expiration": "2020-06-15T22:17:28.985-01:00" + } + + + POST /thirdpartyRequests/transactions + + + 202 Accepted + + + POST /thirdpartyRequests/transactions + + + 202 Accepted + + + + + Recherche du consentement pour ce + payeur + , vérification de l'existence et que le consentement + est accordé avec des identifiants valides + + + + + Stockage d'une référence au + consentId + avec le + transactionRequestId + + + + + Génération d'un transactionId unique pour cette demande de transaction : + 11111111-0000-0000-0000-000000000000 + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000 + FSPIOP-Source: dfspa + FSPIOP-Destination: pispa + { + "transactionRequestState": "RECEIVED" + } + + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000 + + + 200 OK + + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000 + + + 200 OK + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-2-authorization.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-2-authorization.puml new file mode 100644 index 000000000..e87398bbb --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-2-authorization.puml @@ -0,0 +1,150 @@ +@startuml + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title Transfert : 1.2.2 Autorisation + + +box "PISP" +participant "Serveur PISP" as D1 +end box +box "Mojaloop" + participant Switch as S +end box +box "DFSP A" + participant "DFSP A\n(Payeur)" as D2 +end box +box "DFSP B" + participant "DFSP B\n(Bénéficiaire)" as D3 +end box + +rnote left of D2 #LightGray +**""POST /quotes""** +""FSPIOP-Source: dfspa"" +""FSPIOP-Destination: dfspb"" +{ + "quoteId": "22222222-0000-0000-0000-000000000000", + "transactionId": "11111111-0000-0000-0000-000000000000", + "transactionRequestId": "00000000-0000-0000-0000-000000000000", + "payee": { + "partyIdInfo": { + "partyIdType": "MSISDN", + "partyIdentifier": "+4412345678", + "fspId": "dfspb" + } + }, + "payer": { + "personalInfo": { + "complexName": { + "firstName": "Ayesha", + "lastName": "Takia" + } + }, + "partyIdInfo": { + "partyIdType": "MSISDN", + "partyIdentifier": "123456789", + "fspId": "dfspa" + }, + }, + "amountType": "SEND", + "amount": { + "amount": "100", + "currency": "USD" + }, + "transactionType": { + "scenario": "TRANSFER", + "initiator": "PAYER", + "initiatorType": "CONSUMER" + }, + "note": "quote note" +} +end note +D2 -> S: ""POST /quotes"" +S --> D2: ""202 Accepted"" +S -> D3: ""POST /quotes"" +D3 --> S: ""202 Accepted"" + +rnote left of D2 #LightGray +**""PUT /quotes/22222222-0000-0000-0000-000000000000""** +""FSPIOP-Source: dfspb"" +""FSPIOP-Destination: dfspa"" +{ + "transferAmount": { + "amount": "100", + "currency": "USD" + }, + "payeeReceiveAmount": { + "amount": "99", + "currency": "USD" + }, + "payeeFspFee": { + "amount": "1", + "currency": "USD" + }, + "expiration": "2020-06-15T12:00:00.000", + "ilpPacket": "...", + "condition": "...", +} +end note +D3 -> S: ""PUT /quotes/22222222-0000-0000-0000-000000000000"" +S --> D3: ""200 OK"" +S -> D2: ""PUT /quotes/22222222-0000-0000-0000-000000000000"" +D2 --> S: ""200 OK"" + +note left of D2 + Le DFSP A dispose du devis, il peut maintenant demander + l'autorisation au PISP +end note + +D2 -> D2: Génération d'un UUID pour la demande d'autorisation :\n""33333333-0000-0000-0000-000000000000"" +D2 -> D2: Dérivation du défi à partir de \n""PUT /quotes/{ID}"" + +rnote left of D2 #LightGray +**""POST /thirdpartyRequests/authorizations""** +""FSPIOP-Source: dfspa"" +""FSPIOP-Destination: pispa"" +{ + "authorizationRequestId": "33333333-0000-0000-0000-000000000000", + "transactionRequestId": "00000000-0000-0000-0000-000000000000", + "challenge": """", + "transferAmount": {"amount": "100", "currency": "USD"}, + "payeeReceiveAmount": {"amount": "99", "currency": "USD"}, + "fees": {"amount": "1", "currency": "USD"}, + "payer": { + "partyIdType": "THIRD_PARTY_LINK", + "partyIdentifier": "qwerty-56789", + "fspId": "dfspa" + }, + "payee": { + "partyIdInfo": { + "partyIdType": "MSISDN", + "partyIdentifier": "+4412345678", + "fspId": "dfspb" + } + }, + "transactionType": { + "scenario": "TRANSFER", + "initiator": "PAYER", + "initiatorType": "CONSUMER" + }, + "expiration": "2020-06-15T12:00:00.000", +} +end note +D2 -> S: ""POST /thirdpartyRequests/authorizations"" +S --> D2: ""202 Accepted"" +S -> D1: ""POST /thirdpartyRequests/authorizations"" +D1 --> S: ""202 Accepted"" + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-2-authorization.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-2-authorization.svg new file mode 100644 index 000000000..26820b6b7 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-2-authorization.svg @@ -0,0 +1,174 @@ + + Transfert : 1.2.2 Autorisation + + + Transfert : 1.2.2 Autorisation + + PISP + + Mojaloop + + DFSP A + + DFSP B + + + + + + Serveur PISP + + Switch + + DFSP A + (Payeur) + + DFSP B + (Bénéficiaire) + + POST /quotes + FSPIOP-Source: dfspa + FSPIOP-Destination: dfspb + { + "quoteId": "22222222-0000-0000-0000-000000000000", + "transactionId": "11111111-0000-0000-0000-000000000000", + "transactionRequestId": "00000000-0000-0000-0000-000000000000", + "payee": { + "partyIdInfo": { + "partyIdType": "MSISDN", + "partyIdentifier": "+4412345678", + "fspId": "dfspb" + } + }, + "payer": { + "personalInfo": { + "complexName": { + "firstName": "Ayesha", + "lastName": "Takia" + } + }, + "partyIdInfo": { + "partyIdType": "MSISDN", + "partyIdentifier": "123456789", + "fspId": "dfspa" + }, + }, + "amountType": "SEND", + "amount": { + "amount": "100", + "currency": "USD" + }, + "transactionType": { + "scenario": "TRANSFER", + "initiator": "PAYER", + "initiatorType": "CONSUMER" + }, + "note": "quote note" + } + + + POST /quotes + + + 202 Accepted + + + POST /quotes + + + 202 Accepted + + PUT /quotes/22222222-0000-0000-0000-000000000000 + FSPIOP-Source: dfspb + FSPIOP-Destination: dfspa + { + "transferAmount": { + "amount": "100", + "currency": "USD" + }, + "payeeReceiveAmount": { + "amount": "99", + "currency": "USD" + }, + "payeeFspFee": { + "amount": "1", + "currency": "USD" + }, + "expiration": "2020-06-15T12:00:00.000", + "ilpPacket": "...", + "condition": "...", + } + + + PUT /quotes/22222222-0000-0000-0000-000000000000 + + + 200 OK + + + PUT /quotes/22222222-0000-0000-0000-000000000000 + + + 200 OK + + + Le DFSP A dispose du devis, il peut maintenant demander + l'autorisation au PISP + + + + + Génération d'un UUID pour la demande d'autorisation : + 33333333-0000-0000-0000-000000000000 + + + + + Dérivation du défi à partir de + PUT /quotes/{ID} + + POST /thirdpartyRequests/authorizations + FSPIOP-Source: dfspa + FSPIOP-Destination: pispa + { + "authorizationRequestId": "33333333-0000-0000-0000-000000000000", + "transactionRequestId": "00000000-0000-0000-0000-000000000000", + "challenge": + <base64 encoded binary - the encoded challenge> + , + "transferAmount": {"amount": "100", "currency": "USD"}, + "payeeReceiveAmount": {"amount": "99", "currency": "USD"}, + "fees": {"amount": "1", "currency": "USD"}, + "payer": { + "partyIdType": "THIRD_PARTY_LINK", + "partyIdentifier": "qwerty-56789", + "fspId": "dfspa" + }, + "payee": { + "partyIdInfo": { + "partyIdType": "MSISDN", + "partyIdentifier": "+4412345678", + "fspId": "dfspb" + } + }, + "transactionType": { + "scenario": "TRANSFER", + "initiator": "PAYER", + "initiatorType": "CONSUMER" + }, + "expiration": "2020-06-15T12:00:00.000", + } + + + POST /thirdpartyRequests/authorizations + + + 202 Accepted + + + POST /thirdpartyRequests/authorizations + + + 202 Accepted + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-3-rejected-authorization.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-3-rejected-authorization.puml new file mode 100644 index 000000000..86cb06364 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-3-rejected-authorization.puml @@ -0,0 +1,76 @@ +@startuml + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title Transfert : 1.2.3 Autorisation refusée + +box "PISP" +participant "Serveur PISP" as D1 +end box +box "Mojaloop" + participant Switch as S +end box +box "DFSP A" + participant "DFSP A\n(Payeur)" as D2 +end box +== Phase d'accord == +note right of D1 + Le PISP recherche le ""transactionRequestId"" et + vérifie le devis avec l'utilisateur, + + + L'utilisateur refuse les conditions de la demande de transaction +end note + +rnote right of D1 #LightGray +**""PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000""** +""FSPIOP-Source: pispa"" +""FSPIOP-Destination: dfspa"" +{ + "responseType": "REJECTED" +} +end note +D1 -> S: ""PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000"" +S --> D1: ""200 OK"" +S -> D2: ""PUT /thirdpartyRequests/authorizations""\n""/33333333-0000-0000-0000-000000000000"" +D2 --> S: ""200 OK"" + +D2 -> D2: Recherche du ""transactionRequestId"" pour cet ""authorizationId"" + +note over D2 + L'utilisateur a refusé la demande de transaction. +end note + +rnote over D2 #LightGray +**""PATCH /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000""** +""FSPIOP-Source: dfspa"" +""FSPIOP-Destination: pispa"" +{ + "transactionRequestState": "REJECTED", + "transactionId": "11111111-0000-0000-0000-000000000000", +} +end note +D2 -> S: ""PATCH /thirdpartyRequests/transactions""\n"" /00000000-0000-0000-0000-000000000000"" +S --> D2: ""200 OK"" + +S -> D1: ""PATCH /thirdpartyRequests/transactions""\n"" /00000000-0000-0000-0000-000000000000"" +D1 --> S: ""200 OK"" + +note over D1 + Le PISP peut informer l'utilisateur que la transaction n'a pas eu lieu +end note + + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-3-rejected-authorization.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-3-rejected-authorization.svg new file mode 100644 index 000000000..c8f4d8412 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-3-rejected-authorization.svg @@ -0,0 +1,93 @@ + + Transfert : 1.2.3 Autorisation refusée + + + Transfert : 1.2.3 Autorisation refusée + + PISP + + Mojaloop + + DFSP A + + + + + Serveur PISP + + Switch + + DFSP A + (Payeur) + + + + + Phase d'accord + + + Le PISP recherche le + transactionRequestId + et + vérifie le devis avec l'utilisateur, +   +   + L'utilisateur refuse les conditions de la demande de transaction + + PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000 + FSPIOP-Source: pispa + FSPIOP-Destination: dfspa + { + "responseType": "REJECTED" + } + + + PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000 + + + 200 OK + + + PUT /thirdpartyRequests/authorizations + /33333333-0000-0000-0000-000000000000 + + + 200 OK + + + + + Recherche du + transactionRequestId + pour cet + authorizationId + + + L'utilisateur a refusé la demande de transaction. + + PATCH /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000 + FSPIOP-Source: dfspa + FSPIOP-Destination: pispa + { + "transactionRequestState": "REJECTED", + "transactionId": "11111111-0000-0000-0000-000000000000", + } + + + PATCH /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000 + + + 200 OK + + + PATCH /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000 + + + 200 OK + + + Le PISP peut informer l'utilisateur que la transaction n'a pas eu lieu + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-fido.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-fido.puml new file mode 100644 index 000000000..bfd850a0d --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-fido.puml @@ -0,0 +1,74 @@ +@startuml + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title Transfert : 1.2.3 Autorisation signée FIDO + +box "PISP" +participant "Serveur PISP" as D1 +end box +box "Mojaloop" + participant Switch as S +end box +box "DFSP A" + participant "DFSP A\n(Payeur)" as D2 +end box +== Phase d'accord == +note right of D1 + Le PISP recherche le ""transactionRequestId"" et + vérifie les conditions avec l'utilisateur. + + Si l'utilisateur accepte les conditions, le PISP + utilise l'API FIDO sur l'appareil de l'utilisateur pour signer + la chaîne **""challenge""** +end note + +rnote right of D1 #LightGray +**""PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000""** +""FSPIOP-Source: pispa"" +""FSPIOP-Destination: dfspa"" +{ + "responseType": "ACCEPTED" + "signedPayload": { + "signedPayloadType": "FIDO", + "fidoSignedPayload": { + "id": "string", + "rawId": "string - base64 encoded utf-8", + "response": { + "authenticatorData": "string - base64 encoded utf-8", + "clientDataJSON": "string - base64 encoded utf-8", + "signature": "string - base64 encoded utf-8", + "userHandle": "string - base64 encoded utf-8", + }, + "type": "public-key" + } + } +} +end note +D1 -> S: ""PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000"" +S --> D1: ""200 OK"" +S -> D2: ""PUT /thirdpartyRequests/authorizations""\n""/33333333-0000-0000-0000-000000000000"" +D2 --> S: ""200 OK"" + +D2 -> D2: Recherche du ""transactionRequestId"" pour cet ""authorizationId"" +D2 -> D2: Recherche du ""consentId"" pour ce ""transactionRequestId"" + +note over D2 + Le DFSP dispose du défi signé. + Il doit maintenant demander au Auth-Service de vérifier + le défi signé. +end note + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-fido.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-fido.svg new file mode 100644 index 000000000..96a961f1f --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-fido.svg @@ -0,0 +1,94 @@ + + Transfert : 1.2.3 Autorisation signée FIDO + + + Transfert : 1.2.3 Autorisation signée FIDO + + PISP + + Mojaloop + + DFSP A + + + + + Serveur PISP + + Switch + + DFSP A + (Payeur) + + + + + Phase d'accord + + + Le PISP recherche le + transactionRequestId + et + vérifie les conditions avec l'utilisateur. +   + Si l'utilisateur accepte les conditions, le PISP + utilise l'API FIDO sur l'appareil de l'utilisateur pour signer + la chaîne + challenge + + PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000 + FSPIOP-Source: pispa + FSPIOP-Destination: dfspa + { + "responseType": "ACCEPTED" + "signedPayload": { + "signedPayloadType": "FIDO", + "fidoSignedPayload": { + "id": "string", + "rawId": "string - base64 encoded utf-8", + "response": { + "authenticatorData": "string - base64 encoded utf-8", + "clientDataJSON": "string - base64 encoded utf-8", + "signature": "string - base64 encoded utf-8", + "userHandle": "string - base64 encoded utf-8", + }, + "type": "public-key" + } + } + } + + + PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000 + + + 200 OK + + + PUT /thirdpartyRequests/authorizations + /33333333-0000-0000-0000-000000000000 + + + 200 OK + + + + + Recherche du + transactionRequestId + pour cet + authorizationId + + + + + Recherche du + consentId + pour ce + transactionRequestId + + + Le DFSP dispose du défi signé. + Il doit maintenant demander au Auth-Service de vérifier + le défi signé. + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-generic.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-generic.puml new file mode 100644 index 000000000..5cbc94985 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-generic.puml @@ -0,0 +1,63 @@ +@startuml + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title Transfert : 1.2.3 Autorisation signée (générique) + +box "PISP" +participant "Serveur PISP" as D1 +end box +box "Mojaloop" + participant Switch as S +end box +box "DFSP A" + participant "DFSP A\n(Payeur)" as D2 +end box +== Phase d'accord == +note right of D1 + Le PISP recherche le ""transactionRequestId"" et + vérifie le devis avec l'utilisateur. + + Si l'utilisateur accepte les conditions, le PISP utilise + la clé privée du Credential pour signer le défi +end note + +rnote right of D1 #LightGray +**""PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000""** +""FSPIOP-Source: pispa"" +""FSPIOP-Destination: dfspa"" +{ + "responseType": "ACCEPTED" + "signedPayload": { + "signedPayloadType": "GENERIC", + "genericSignedPayload": "utf-8 base64 encoded signature" + } +} +end note +D1 -> S: ""PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000"" +S --> D1: ""200 OK"" +S -> D2: ""PUT /thirdpartyRequests/authorizations""\n""/33333333-0000-0000-0000-000000000000"" +D2 --> S: ""200 OK"" + +D2 -> D2: Recherche du ""transactionRequestId"" pour cet ""authorizationId"" +D2 -> D2: Recherche du ""consentId"" pour ce ""transactionRequestId"" + +note over D2 + Le DFSP dispose du défi signé. + Il doit maintenant demander au Auth-Service de vérifier + le défi signé. +end note + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-generic.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-generic.svg new file mode 100644 index 000000000..2f103fd83 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-generic.svg @@ -0,0 +1,82 @@ + + Transfert : 1.2.3 Autorisation signée (générique) + + + Transfert : 1.2.3 Autorisation signée (générique) + + PISP + + Mojaloop + + DFSP A + + + + + Serveur PISP + + Switch + + DFSP A + (Payeur) + + + + + Phase d'accord + + + Le PISP recherche le + transactionRequestId + et + vérifie le devis avec l'utilisateur. +   + Si l'utilisateur accepte les conditions, le PISP utilise + la clé privée du Credential pour signer le défi + + PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000 + FSPIOP-Source: pispa + FSPIOP-Destination: dfspa + { + "responseType": "ACCEPTED" + "signedPayload": { + "signedPayloadType": "GENERIC", + "genericSignedPayload": "utf-8 base64 encoded signature" + } + } + + + PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000 + + + 200 OK + + + PUT /thirdpartyRequests/authorizations + /33333333-0000-0000-0000-000000000000 + + + 200 OK + + + + + Recherche du + transactionRequestId + pour cet + authorizationId + + + + + Recherche du + consentId + pour ce + transactionRequestId + + + Le DFSP dispose du défi signé. + Il doit maintenant demander au Auth-Service de vérifier + le défi signé. + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-4-verify-authorization.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-4-verify-authorization.puml new file mode 100644 index 000000000..bbcda015e --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-4-verify-authorization.puml @@ -0,0 +1,82 @@ +@startuml + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title Transfert : 1.2.4 Vérifier l'autorisation + + +box "Mojaloop" + participant Switch as S + participant "Auth-Service" as AUTHS +end box +box "DFSP A" + participant "DFSP A\n(Payeur)" as D2 +end box + + +D2 -> D2: Génération d'un nouveau ""verificationRequestId"", et association \n avec le ""thirdpartyTransactionRequestId"" + +rnote left of D2 #LightGray +**""POST /thirdpartyRequests/verifications""** +""FSPIOP-Source: dfspa"" +""FSPIOP-Destination: central-auth"" +{ + "verificationRequestId": "44444444-0000-0000-0000-000000000000", + "challenge": """", + "consentId": "123", + "signedPayloadType": "FIDO", + "fidoValue": { + "id": "string", + "rawId": "string - base64 encoded utf-8", + "response": { + "authenticatorData": "string - base64 encoded utf-8", + "clientDataJSON": "string - base64 encoded utf-8", + "signature": "string - base64 encoded utf-8", + "userHandle": "string - base64 encoded utf-8", + }, + "type": "public-key" + } +} +end note +D2 -> S: ""POST /thirdpartyRequests/verifications"" +S --> D2: ""202 Accepted"" +S -> AUTHS: ""POST /thirdpartyRequests/verifications"" +AUTHS --> S: ""202 Accepted"" + +AUTHS -> AUTHS: Recherche de ce consentement à partir du consentId +AUTHS -> AUTHS: Vérification que accountAddress correspond au Consent +AUTHS -> AUTHS: Vérification que les octets signés correspondent à la \nclé publique stockée pour le consentement + +rnote right of AUTHS #LightGray +**""PUT /thirdpartyRequests/verifications/44444444-0000-0000-0000-000000000000""** +""FSPIOP-Source: central-auth"" +""FSPIOP-Destination: dfspa"" +{ + "authenticationResponse": "VERIFIED" +} +end note +AUTHS -> S: ""PUT /thirdpartyRequests/verifications""\n"" /44444444-0000-0000-0000-000000000000"" +S --> AUTHS: ""200 OK"" +S -> D2: ""PUT /thirdpartyRequests/verifications""\n"" /44444444-0000-0000-0000-000000000000"" +D2 --> S: ""200 OK"" + +note over D2 + Le DFSPA sait maintenant que l'utilisateur a signé cette transaction + et peut procéder à l'initiation du transfert +end note + + + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-4-verify-authorization.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-4-verify-authorization.svg new file mode 100644 index 000000000..6bcf6278a --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-2-4-verify-authorization.svg @@ -0,0 +1,106 @@ + + Transfert : 1.2.4 Vérifier l'autorisation + + + Transfert : 1.2.4 Vérifier l'autorisation + + Mojaloop + + DFSP A + + + + + Switch + + Auth-Service + + DFSP A + (Payeur) + + + + + Génération d'un nouveau + verificationRequestId + , et association + avec le + thirdpartyTransactionRequestId + + POST /thirdpartyRequests/verifications + FSPIOP-Source: dfspa + FSPIOP-Destination: central-auth + { + "verificationRequestId": "44444444-0000-0000-0000-000000000000", + "challenge": + <base64 encoded binary - the encoded challenge> + , + "consentId": "123", + "signedPayloadType": "FIDO", + "fidoValue": { + "id": "string", + "rawId": "string - base64 encoded utf-8", + "response": { + "authenticatorData": "string - base64 encoded utf-8", + "clientDataJSON": "string - base64 encoded utf-8", + "signature": "string - base64 encoded utf-8", + "userHandle": "string - base64 encoded utf-8", + }, + "type": "public-key" + } + } + + + POST /thirdpartyRequests/verifications + + + 202 Accepted + + + POST /thirdpartyRequests/verifications + + + 202 Accepted + + + + + Recherche de ce consentement à partir du consentId + + + + + Vérification que accountAddress correspond au Consent + + + + + Vérification que les octets signés correspondent à la + clé publique stockée pour le consentement + + PUT /thirdpartyRequests/verifications/44444444-0000-0000-0000-000000000000 + FSPIOP-Source: central-auth + FSPIOP-Destination: dfspa + { + "authenticationResponse": "VERIFIED" + } + + + PUT /thirdpartyRequests/verifications + /44444444-0000-0000-0000-000000000000 + + + 200 OK + + + PUT /thirdpartyRequests/verifications + /44444444-0000-0000-0000-000000000000 + + + 200 OK + + + Le DFSPA sait maintenant que l'utilisateur a signé cette transaction + et peut procéder à l'initiation du transfert + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-3-transfer.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-3-transfer.puml new file mode 100644 index 000000000..1f0000881 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-3-transfer.puml @@ -0,0 +1,178 @@ +@startuml + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +hide footbox + +title Transfert : 1.3 Transfert final + +box "PISP" +participant "Serveur PISP" as D1 +end box +box "Mojaloop" + participant Switch as S +end box +box "DFSP A" + participant "DFSP A\n(Payeur)" as D2 +end box +box "DFSP B" + participant "DFSP B\n(Bénéficiaire)" as D3 +end box +actor "<$actor>\nBénéficiaire" as CB + + + +== Phase de transfert == + +... Le DFSP A initie un transfert P2P Mojaloop classique ... + +D2 -> D2: Génération d'un nouveau ""transferId"", et association \n avec le ""transactionRequestId"" + +rnote over D2 #LightGray +**""POST /transfers""** +""FSPIOP-Source: dfspa"" +""FSPIOP-Destination: dfspb"" +{ + "transferId": "55555555-0000-0000-0000-000000000000", + "payerFsp": "dfspa", + "payeeFsp": "dfspb", + "amount": { + "amount": "100", + "currency": "USD" + }, + "expiration": "2020-06-15T13:00:00.000", + "ilpPacket": "...", + "condition": "...", +} +end note +D2 -> S: ""POST /transfers"" +S --> D2: ""202 Accepted"" + +rnote over S #LightGray +**""POST /transfers""** +""FSPIOP-Source: dfspa"" +""FSPIOP-Destination: dfspb"" +{ + "transferId": "55555555-0000-0000-0000-000000000000", + "payerFsp": "dfspa", + "payeeFsp": "dfspb", + "amount": { + "amount": "100", + "currency": "USD" + }, + "expiration": "2020-06-15T13:00:00.000", + "ilpPacket": "...", + "condition": "...", +} +end note +S -> D3: ""POST /transfers"" +D3 --> S: ""202 Accepted"" + +rnote left of D3 #LightGray +**""PUT /transfers/55555555-0000-0000-0000-000000000000""** +""FSPIOP-Source: dfspb"" +""FSPIOP-Destination: dfspa"" +{ + "fulfilment": "...", + "completedTimestamp": "2020-06-15T12:01:00.000", + "transferState": "COMMITTED" +} +end note +D3 -> S: ""PUT /transfers/55555555-0000-0000-0000-000000000000"" +S --> D3: ""200 OK"" +D3 -> CB: Vous avez reçu des fonds ! +S -> D2: ""PUT /transfers/55555555-0000-0000-0000-000000000000"" +D2 --> S: ""200 OK"" + + +D2 -> D2: Recherche du ""transactionRequestId"" à partir du ""transferId"" + +rnote over D2 #LightGray +**""PATCH /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000""** +""FSPIOP-Source: dfspa"" +""FSPIOP-Destination: pispa"" +{ + "transactionRequestState": "ACCEPTED", + "transactionState": "COMMITTED" +} +end note +D2 -> S: ""PATCH /thirdpartyRequests/transactions""\n"" /00000000-0000-0000-0000-000000000000"" +S --> D2: ""200 OK"" + +S -> D1: ""PATCH /thirdpartyRequests/transactions""\n"" /00000000-0000-0000-0000-000000000000"" +D1 --> S: ""200 OK"" + +note over D1 + Le PISP peut maintenant informer l'utilisateur que les + fonds ont été envoyés +end note + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-3-transfer.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-3-transfer.svg new file mode 100644 index 000000000..5f26680e0 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/1-3-transfer.svg @@ -0,0 +1,161 @@ + + Transfert : 1.3 Transfert final + + + Transfert : 1.3 Transfert final + + PISP + + Mojaloop + + DFSP A + + DFSP B + + + + + + + + + + + + + + + + + Serveur PISP + + Switch + + DFSP A + (Payeur) + + DFSP B + (Bénéficiaire) + + Bénéficiaire + + + + + + + Phase de transfert + Le DFSP A initie un transfert P2P Mojaloop classique + + + + + Génération d'un nouveau + transferId + , et association + avec le + transactionRequestId + + POST /transfers + FSPIOP-Source: dfspa + FSPIOP-Destination: dfspb + { + "transferId": "55555555-0000-0000-0000-000000000000", + "payerFsp": "dfspa", + "payeeFsp": "dfspb", + "amount": { + "amount": "100", + "currency": "USD" + }, + "expiration": "2020-06-15T13:00:00.000", + "ilpPacket": "...", + "condition": "...", + } + + + POST /transfers + + + 202 Accepted + + POST /transfers + FSPIOP-Source: dfspa + FSPIOP-Destination: dfspb + { + "transferId": "55555555-0000-0000-0000-000000000000", + "payerFsp": "dfspa", + "payeeFsp": "dfspb", + "amount": { + "amount": "100", + "currency": "USD" + }, + "expiration": "2020-06-15T13:00:00.000", + "ilpPacket": "...", + "condition": "...", + } + + + POST /transfers + + + 202 Accepted + + PUT /transfers/55555555-0000-0000-0000-000000000000 + FSPIOP-Source: dfspb + FSPIOP-Destination: dfspa + { + "fulfilment": "...", + "completedTimestamp": "2020-06-15T12:01:00.000", + "transferState": "COMMITTED" + } + + + PUT /transfers/55555555-0000-0000-0000-000000000000 + + + 200 OK + + + Vous avez reçu des fonds ! + + + PUT /transfers/55555555-0000-0000-0000-000000000000 + + + 200 OK + + + + + Recherche du + transactionRequestId + à partir du + transferId + + PATCH /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000 + FSPIOP-Source: dfspa + FSPIOP-Destination: pispa + { + "transactionRequestState": "ACCEPTED", + "transactionState": "COMMITTED" + } + + + PATCH /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000 + + + 200 OK + + + PATCH /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000 + + + 200 OK + + + Le PISP peut maintenant informer l'utilisateur que les + fonds ont été envoyés + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-2-1-bad-tx-request.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-2-1-bad-tx-request.puml new file mode 100644 index 000000000..ffab1aed2 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-2-1-bad-tx-request.puml @@ -0,0 +1,90 @@ +@startuml + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title Transfert : 3.2.1 Demande de transaction tiers invalide + + +box "PISP" +participant "Serveur PISP" as D1 +end box +box "Mojaloop" + participant Switch as S +end box +box "DFSP A" + participant "DFSP A\n(Payeur)" as D2 +end box + + +== Phase d'accord == +rnote right of D1 #LightGray +**""POST /thirdpartyRequests/transactions""** +""FSPIOP-Source: pispa"" +""FSPIOP-Destination: dfspa"" +{ + "transactionRequestId": "00000000-0000-0000-0000-000000000000", + "payee": { + "partyIdInfo": { + "partyIdType": "MSISDN", + "partyIdentifier": "+4412345678", + "fspId": "dfspb" + } + }, + "payer": { + "partyIdType": "THIRD_PARTY_LINK", + "partyIdentifier": "qwerty-56789", + "fspId": "dfspa" + }, + "amountType": "SEND", + "amount": { + "amount": "100", + "currency": "USD" + }, + "transactionType": { + "scenario": "TRANSFER", + "initiator": "PAYER", + "initiatorType": "CONSUMER" + }, + "expiration": "2020-06-15T22:17:28.985-01:00" +} +end note +D1 -> S: ""POST /thirdpartyRequests/transactions"" +S --> D1: ""202 Accepted"" +S -> D2: ""POST /thirdpartyRequests/transactions"" +D2 --> S: ""202 Accepted"" + +D2 -> D2: Le DFSP détecte un problème avec cette demande de transaction. + + +rnote left of D2 #LightGray +**""PUT /thirdpartyRequests/transactions""** +**"" /00000000-0000-0000-0000-000000000000/error""** +""FSPIOP-Source: dfspa"" +""FSPIOP-Destination: pispa"" +{ + "errorInformation": { + "errorCode": "6104", + "errorDescription": "Thirdparty request rejection", + "extensionList": [] + } +} +end note +D2 -> S: ""PUT /thirdpartyRequests/transactions""\n"" /00000000-0000-0000-0000-000000000000/error"" +S --> D2: ""200 OK"" +S -> D1: ""PUT /thirdpartyRequests/transactions""\n"" /00000000-0000-0000-0000-000000000000/error"" +D1 --> S: ""200 OK"" + + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-2-1-bad-tx-request.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-2-1-bad-tx-request.svg new file mode 100644 index 000000000..f0baefaf3 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-2-1-bad-tx-request.svg @@ -0,0 +1,101 @@ + + Transfert : 3.2.1 Demande de transaction tiers invalide + + + Transfert : 3.2.1 Demande de transaction tiers invalide + + PISP + + Mojaloop + + DFSP A + + + + + Serveur PISP + + Switch + + DFSP A + (Payeur) + + + + + Phase d'accord + + POST /thirdpartyRequests/transactions + FSPIOP-Source: pispa + FSPIOP-Destination: dfspa + { + "transactionRequestId": "00000000-0000-0000-0000-000000000000", + "payee": { + "partyIdInfo": { + "partyIdType": "MSISDN", + "partyIdentifier": "+4412345678", + "fspId": "dfspb" + } + }, + "payer": { + "partyIdType": "THIRD_PARTY_LINK", + "partyIdentifier": "qwerty-56789", + "fspId": "dfspa" + }, + "amountType": "SEND", + "amount": { + "amount": "100", + "currency": "USD" + }, + "transactionType": { + "scenario": "TRANSFER", + "initiator": "PAYER", + "initiatorType": "CONSUMER" + }, + "expiration": "2020-06-15T22:17:28.985-01:00" + } + + + POST /thirdpartyRequests/transactions + + + 202 Accepted + + + POST /thirdpartyRequests/transactions + + + 202 Accepted + + + + + Le DFSP détecte un problème avec cette demande de transaction. + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000/error + FSPIOP-Source: dfspa + FSPIOP-Destination: pispa + { + "errorInformation": { + "errorCode": "6104", + "errorDescription": "Thirdparty request rejection", + "extensionList": [] + } + } + + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000/error + + + 200 OK + + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000/error + + + 200 OK + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-3-1-bad-quote-request.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-3-1-bad-quote-request.puml new file mode 100644 index 000000000..66255721c --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-3-1-bad-quote-request.puml @@ -0,0 +1,140 @@ +@startuml + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title Transfert : 3.3.1 Demande de devis invalide + + +box "PISP" +participant "Serveur PISP" as D1 +end box +box "Mojaloop" + participant Switch as S +end box +box "DFSP A" + participant "DFSP A\n(Payeur)" as D2 +end box +box "DFSP B" + participant "DFSP B\n(Bénéficiaire)" as D3 +end box + +... Le PISP a initié une demande de transaction tiers avec ""POST /thirdpartyRequests/transactions""... + +D2 -> D2: Génération d'un transactionId unique pour cette demande de transaction :\n**""11111111-0000-0000-0000-000000000000""** + + +rnote left of D2 #LightGray +**""PUT /thirdpartyRequests/transactions""** +**"" /00000000-0000-0000-0000-000000000000""** +""FSPIOP-Source: dfspa"" +""FSPIOP-Destination: pispa"" +{ + "transactionId": "11111111-0000-0000-0000-000000000000", + "transactionRequestState": "RECEIVED" +} +end note +D2 -> S: ""PUT /thirdpartyRequests/transactions""\n"" /00000000-0000-0000-0000-000000000000"" +S --> D2: ""200 OK"" +S -> D1: ""PUT /thirdpartyRequests/transactions""\n"" /00000000-0000-0000-0000-000000000000"" +D1 --> S: ""200 OK"" + +rnote left of D2 #LightGray +**""POST /quotes""** +""FSPIOP-Source: dfspa"" +""FSPIOP-Destination: dfspb"" +{ + "quoteId": "22222222-0000-0000-0000-000000000000", + "transactionId": "11111111-0000-0000-0000-000000000000", + "transactionRequestId": "00000000-0000-0000-0000-000000000000", + "payee": { + "partyIdInfo": { + "partyIdType": "MSISDN", + "partyIdentifier": "+4412345678", + "fspId": "dfspb" + } + }, + "payer": { + "personalInfo": { + "complexName": { + "firstName": "Ayesha", + "lastName": "Takia" + } + }, + "partyIdInfo": { + "partyIdType": "THIRD_PARTY_LINK", + "partyIdentifier": "qwerty-56789", + "fspId": "dfspa" + }, + }, + "amountType": "SEND", + "amount": { + "amount": "100", + "currency": "USD" + }, + "transactionType": { + "scenario": "TRANSFER", + "initiator": "PAYER", + "initiatorType": "CONSUMER" + }, + "note": "quote note" +} +end note +D2 -> S: ""POST /quotes"" +S --> D2: ""202 Accepted"" +S -> D3: ""POST /quotes"" +D3 --> S: ""202 Accepted"" + +D3 -> D3: Le devis échoue pour une raison quelconque. + +rnote left of D3 #LightGray +**""PUT /quotes/22222222-0000-0000-0000-000000000000/error""** +""FSPIOP-Source: dfspb"" +""FSPIOP-Destination: dfspa"" +{ + "errorInformation": { + "errorCode": "XXXX", + "errorDescription": "XXXX", + "extensionList": [] + } +} +end note +D3 -> S: ""PUT /quotes/22222222-0000-0000-0000-000000000000/error"" +S --> D3: ""200 OK"" +S -> D2: ""PUT /quotes/22222222-0000-0000-0000-000000000000/error"" +D2 --> S: ""200 OK"" + +note left of D2 + Échec du devis, le DFSP doit informer le PISP +end note + +rnote left of D2 #LightGray +**""PUT /thirdpartyRequests/transactions""** +**"" /00000000-0000-0000-0000-000000000000/error""** +""FSPIOP-Source: dfspa"" +""FSPIOP-Destination: pispa"" +{ + "errorInformation": { + "errorCode": "6003", + "errorDescription": "Downstream Failure", + "extensionList": [] + } +} +end note +D2 -> S: ""PUT /thirdpartyRequests/transactions""\n"" /00000000-0000-0000-0000-000000000000/error"" +S --> D2: ""200 OK"" +S -> D1: ""PUT /thirdpartyRequests/transactions""\n"" /00000000-0000-0000-0000-000000000000/error"" +D1 --> S: ""200 OK"" + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-3-1-bad-quote-request.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-3-1-bad-quote-request.svg new file mode 100644 index 000000000..263cd491c --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-3-1-bad-quote-request.svg @@ -0,0 +1,177 @@ + + Transfert : 3.3.1 Demande de devis invalide + + + Transfert : 3.3.1 Demande de devis invalide + + PISP + + Mojaloop + + DFSP A + + DFSP B + + + + + + + + + + + + + + Serveur PISP + + Switch + + DFSP A + (Payeur) + + DFSP B + (Bénéficiaire) + Le PISP a initié une demande de transaction tiers avec + POST /thirdpartyRequests/transactions + + + + + Génération d'un transactionId unique pour cette demande de transaction : + 11111111-0000-0000-0000-000000000000 + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000 + FSPIOP-Source: dfspa + FSPIOP-Destination: pispa + { + "transactionId": "11111111-0000-0000-0000-000000000000", + "transactionRequestState": "RECEIVED" + } + + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000 + + + 200 OK + + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000 + + + 200 OK + + POST /quotes + FSPIOP-Source: dfspa + FSPIOP-Destination: dfspb + { + "quoteId": "22222222-0000-0000-0000-000000000000", + "transactionId": "11111111-0000-0000-0000-000000000000", + "transactionRequestId": "00000000-0000-0000-0000-000000000000", + "payee": { + "partyIdInfo": { + "partyIdType": "MSISDN", + "partyIdentifier": "+4412345678", + "fspId": "dfspb" + } + }, + "payer": { + "personalInfo": { + "complexName": { + "firstName": "Ayesha", + "lastName": "Takia" + } + }, + "partyIdInfo": { + "partyIdType": "THIRD_PARTY_LINK", + "partyIdentifier": "qwerty-56789", + "fspId": "dfspa" + }, + }, + "amountType": "SEND", + "amount": { + "amount": "100", + "currency": "USD" + }, + "transactionType": { + "scenario": "TRANSFER", + "initiator": "PAYER", + "initiatorType": "CONSUMER" + }, + "note": "quote note" + } + + + POST /quotes + + + 202 Accepted + + + POST /quotes + + + 202 Accepted + + + + + Le devis échoue pour une raison quelconque. + + PUT /quotes/22222222-0000-0000-0000-000000000000/error + FSPIOP-Source: dfspb + FSPIOP-Destination: dfspa + { + "errorInformation": { + "errorCode": "XXXX", + "errorDescription": "XXXX", + "extensionList": [] + } + } + + + PUT /quotes/22222222-0000-0000-0000-000000000000/error + + + 200 OK + + + PUT /quotes/22222222-0000-0000-0000-000000000000/error + + + 200 OK + + + Échec du devis, le DFSP doit informer le PISP + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000/error + FSPIOP-Source: dfspa + FSPIOP-Destination: pispa + { + "errorInformation": { + "errorCode": "6003", + "errorDescription": "Downstream Failure", + "extensionList": [] + } + } + + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000/error + + + 200 OK + + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000/error + + + 200 OK + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-3-2-bad-transfer-request.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-3-2-bad-transfer-request.puml new file mode 100644 index 000000000..b9913144c --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-3-2-bad-transfer-request.puml @@ -0,0 +1,122 @@ +@startuml + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title Transfert : 3.3.2 Demande de transfert invalide + + +box "PISP" +participant "Serveur PISP" as D1 +end box +box "Mojaloop" + participant Switch as S +end box +box "DFSP A" + participant "DFSP A\n(Payeur)" as D2 +end box +box "DFSP B" + participant "DFSP B\n(Bénéficiaire)" as D3 +end box + +... Le PISP a initié une demande de transaction tiers avec ""POST /thirdpartyRequests/transactions""... + +... Le DFSP A a reçu le devis et a demandé au PISP de vérifier... + +... Le DFSP A a reçu ""PUT /thirdpartyRequests/verifications depuis Auth-Service""... + +... Le DFSP A initie un transfert P2P Mojaloop classique ... + +D2 -> D2: Génération d'un nouveau ""transferId"", et association \n avec le ""transactionRequestId"" + +rnote over D2 #LightGray +**""POST /transfers""** +""FSPIOP-Source: dfspa"" +""FSPIOP-Destination: dfspb"" +{ + "transferId": "55555555-0000-0000-0000-000000000000", + "payerFsp": "dfspa", + "payeeFsp": "dfspb", + "amount": { + "amount": "100", + "currency": "USD" + }, + "expiration": "2020-06-15T13:00:00.000", + "ilpPacket": "...", + "condition": "...", +} +end note +D2 -> S: ""POST /transfers"" +S --> D2: ""202 Accepted"" + +rnote over S #LightGray +**""POST /transfers""** +""FSPIOP-Source: dfspa"" +""FSPIOP-Destination: dfspb"" +{ + "transferId": "55555555-0000-0000-0000-000000000000", + "payerFsp": "dfspa", + "payeeFsp": "dfspb", + "amount": { + "amount": "100", + "currency": "USD" + }, + "expiration": "2020-06-15T13:00:00.000", + "ilpPacket": "...", + "condition": "...", +} +end note +S -> D3: ""POST /transfers"" +D3 --> S: ""202 Accepted"" + +rnote left of D3 #LightGray +**""PUT /transfers/55555555-0000-0000-0000-000000000000/error""** +""FSPIOP-Source: dfspb"" +""FSPIOP-Destination: dfspa"" +{ + "errorInformation": { + "errorCode": "XXXX", + "errorDescription": "XXXX", + "extensionList": [] + } +} +end note +D3 -> S: ""PUT /transfers/55555555-0000-0000-0000-000000000000/error"" +S --> D3: ""200 OK"" +S -> D2: ""PUT /transfers/55555555-0000-0000-0000-000000000000/error"" +D2 --> S: ""200 OK"" + +note left of D2 + Échec du transfert, le DFSP doit informer le PISP +end note + +rnote left of D2 #LightGray +**""PUT /thirdpartyRequests/transactions""** +**"" /00000000-0000-0000-0000-000000000000/error""** +""FSPIOP-Source: dfspa"" +""FSPIOP-Destination: pispa"" +{ + "errorInformation": { + "errorCode": "6003", + "errorDescription": "Downstream failure", + "extensionList": [] + } +} +end note +D2 -> S: ""PUT /thirdpartyRequests/transactions""\n"" /00000000-0000-0000-0000-000000000000/error"" +S --> D2: ""200 OK"" +S -> D1: ""PUT /thirdpartyRequests/transactions""\n"" /00000000-0000-0000-0000-000000000000/error"" +D1 --> S: ""200 OK"" + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-3-2-bad-transfer-request.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-3-2-bad-transfer-request.svg new file mode 100644 index 000000000..8a98f4629 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-3-2-bad-transfer-request.svg @@ -0,0 +1,172 @@ + + Transfert : 3.3.2 Demande de transfert invalide + + + Transfert : 3.3.2 Demande de transfert invalide + + PISP + + Mojaloop + + DFSP A + + DFSP B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Serveur PISP + + Switch + + DFSP A + (Payeur) + + DFSP B + (Bénéficiaire) + Le PISP a initié une demande de transaction tiers avec + POST /thirdpartyRequests/transactions + Le DFSP A a reçu le devis et a demandé au PISP de vérifier + Le DFSP A a reçu + PUT /thirdpartyRequests/verifications depuis Auth-Service + Le DFSP A initie un transfert P2P Mojaloop classique + + + + + Génération d'un nouveau + transferId + , et association + avec le + transactionRequestId + + POST /transfers + FSPIOP-Source: dfspa + FSPIOP-Destination: dfspb + { + "transferId": "55555555-0000-0000-0000-000000000000", + "payerFsp": "dfspa", + "payeeFsp": "dfspb", + "amount": { + "amount": "100", + "currency": "USD" + }, + "expiration": "2020-06-15T13:00:00.000", + "ilpPacket": "...", + "condition": "...", + } + + + POST /transfers + + + 202 Accepted + + POST /transfers + FSPIOP-Source: dfspa + FSPIOP-Destination: dfspb + { + "transferId": "55555555-0000-0000-0000-000000000000", + "payerFsp": "dfspa", + "payeeFsp": "dfspb", + "amount": { + "amount": "100", + "currency": "USD" + }, + "expiration": "2020-06-15T13:00:00.000", + "ilpPacket": "...", + "condition": "...", + } + + + POST /transfers + + + 202 Accepted + + PUT /transfers/55555555-0000-0000-0000-000000000000/error + FSPIOP-Source: dfspb + FSPIOP-Destination: dfspa + { + "errorInformation": { + "errorCode": "XXXX", + "errorDescription": "XXXX", + "extensionList": [] + } + } + + + PUT /transfers/55555555-0000-0000-0000-000000000000/error + + + 200 OK + + + PUT /transfers/55555555-0000-0000-0000-000000000000/error + + + 200 OK + + + Échec du transfert, le DFSP doit informer le PISP + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000/error + FSPIOP-Source: dfspa + FSPIOP-Destination: pispa + { + "errorInformation": { + "errorCode": "6003", + "errorDescription": "Downstream failure", + "extensionList": [] + } + } + + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000/error + + + 200 OK + + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000/error + + + 200 OK + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-4-1-bad-signed-challenge-self-hosted.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-4-1-bad-signed-challenge-self-hosted.puml new file mode 100644 index 000000000..6d11169f3 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-4-1-bad-signed-challenge-self-hosted.puml @@ -0,0 +1,95 @@ +@startuml + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title Transfert : 3.4.1 Défi signé invalide — Auth-Service auto-hébergé + + +box "PISP" +participant "Serveur PISP" as D1 +end box +box "Mojaloop" + participant Switch as S +end box +box "DFSP A" + participant "DFSP A\n(Payeur)" as D2 +end box + +... Le PISP a initié une demande de transaction tiers avec ""POST /thirdpartyRequests/transactions""... + +... Le DFSP A a reçu le devis et a demandé au PISP de vérifier... + +note right of D1 + Le PISP recherche le ""transactionRequestId"" et + vérifie le devis avec l'utilisateur, + et utilise l'API FIDO pour signer + la chaîne **""challenge""** +end note + +rnote right of D1 #LightGray +**""PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000""** +""FSPIOP-Source: pispa"" +""FSPIOP-Destination: dfspa"" +{ + "responseType": "ACCEPTED" + "signedPayload": { + "signedPayloadType": "FIDO", + "fidoSignedPayload": { + "id": "string", + "rawId": "string - base64 encoded utf-8", + "response": { + "authenticatorData": "string - base64 encoded utf-8", + "clientDataJSON": "string - base64 encoded utf-8", + "signature": "string - base64 encoded utf-8", + "userHandle": "string - base64 encoded utf-8", + }, + "type": "public-key" + } + } +} +end note +D1 -> S: ""PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000"" +S --> D1: ""200 OK"" +S -> D2: ""PUT /thirdpartyRequests/authorizations""\n""/33333333-0000-0000-0000-000000000000"" +D2 --> S: ""200 OK"" + +D2 -> D2: Recherche du ""transactionRequestId"" pour cet ""authorizationId"" +D2 -> D2: Recherche du ""consentId"" pour ce ""transactionRequestId"" +D2 -> D2: Recherche de la ""publicKey"" pour ce ConsentId. Vérification de la signature du défi signé + +note over D2 + Le défi signé est invalide. La demande de transaction a échoué. +end note + + +rnote left of D2 #LightGray +**""PUT /thirdpartyRequests/transactions""** +**"" /00000000-0000-0000-0000-000000000000/error""** +""FSPIOP-Source: dfspa"" +""FSPIOP-Destination: pispa"" +{ + "errorInformation": { + "errorCode": "6201", + "errorDescription": "Invalid transaction signature", + "extensionList": [] + } +} +end note +D2 -> S: ""PUT /thirdpartyRequests/transactions""\n"" /00000000-0000-0000-0000-000000000000/error"" +S --> D2: ""200 OK"" +S -> D1: ""PUT /thirdpartyRequests/transactions""\n"" /00000000-0000-0000-0000-000000000000/error"" +D1 --> S: ""200 OK"" + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-4-1-bad-signed-challenge-self-hosted.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-4-1-bad-signed-challenge-self-hosted.svg new file mode 100644 index 000000000..8ffa39b79 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-4-1-bad-signed-challenge-self-hosted.svg @@ -0,0 +1,133 @@ + + Transfert : 3.4.1 Défi signé invalide — Auth-Service auto-hébergé + + + Transfert : 3.4.1 Défi signé invalide — Auth-Service auto-hébergé + + PISP + + Mojaloop + + DFSP A + + + + + + + + + + + + + + + + + Serveur PISP + + Switch + + DFSP A + (Payeur) + Le PISP a initié une demande de transaction tiers avec + POST /thirdpartyRequests/transactions + Le DFSP A a reçu le devis et a demandé au PISP de vérifier + + + Le PISP recherche le + transactionRequestId + et + vérifie le devis avec l'utilisateur, + et utilise l'API FIDO pour signer + la chaîne + challenge + + PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000 + FSPIOP-Source: pispa + FSPIOP-Destination: dfspa + { + "responseType": "ACCEPTED" + "signedPayload": { + "signedPayloadType": "FIDO", + "fidoSignedPayload": { + "id": "string", + "rawId": "string - base64 encoded utf-8", + "response": { + "authenticatorData": "string - base64 encoded utf-8", + "clientDataJSON": "string - base64 encoded utf-8", + "signature": "string - base64 encoded utf-8", + "userHandle": "string - base64 encoded utf-8", + }, + "type": "public-key" + } + } + } + + + PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000 + + + 200 OK + + + PUT /thirdpartyRequests/authorizations + /33333333-0000-0000-0000-000000000000 + + + 200 OK + + + + + Recherche du + transactionRequestId + pour cet + authorizationId + + + + + Recherche du + consentId + pour ce + transactionRequestId + + + + + Recherche de la + publicKey + pour ce ConsentId. Vérification de la signature du défi signé + + + Le défi signé est invalide. La demande de transaction a échoué. + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000/error + FSPIOP-Source: dfspa + FSPIOP-Destination: pispa + { + "errorInformation": { + "errorCode": "6201", + "errorDescription": "Invalid transaction signature", + "extensionList": [] + } + } + + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000/error + + + 200 OK + + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000/error + + + 200 OK + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-4-2-bad-signed-challenge-auth-service.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-4-2-bad-signed-challenge-auth-service.puml new file mode 100644 index 000000000..634c1c0de --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-4-2-bad-signed-challenge-auth-service.puml @@ -0,0 +1,149 @@ +@startuml + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title Transfert : 3.4.2 Défi signé invalide — Auth-Service hébergé par le hub + + +box "PISP" +participant "Serveur PISP" as D1 +end box +box "Mojaloop" + participant Switch as S + participant "Auth-Service" as AUTHS +end box +box "DFSP A" + participant "DFSP A\n(Payeur)" as D2 +end box + + +... Le PISP a initié une demande de transaction tiers avec ""POST /thirdpartyRequests/transactions""... + +... Le DFSP A a reçu le devis et a demandé au PISP de vérifier... + +note right of D1 + Le PISP recherche le ""transactionRequestId"" et + vérifie le devis avec l'utilisateur, + et utilise l'API FIDO pour signer + la chaîne **""challenge""** +end note + +rnote right of D1 #LightGray +**""PUT /thirdpartyRequests/authorizations""** +**"" /33333333-0000-0000-0000-000000000000""** +""FSPIOP-Source: pispa"" +""FSPIOP-Destination: dfspa"" +{ + "responseType": "ACCEPTED" + "signedPayload": { + "signedPayloadType": "FIDO", + "fidoSignedPayload": { + "id": "string", + "rawId": "string - base64 encoded utf-8", + "response": { + "authenticatorData": "string - base64 encoded utf-8", + "clientDataJSON": "string - base64 encoded utf-8", + "signature": "string - base64 encoded utf-8", + "userHandle": "string - base64 encoded utf-8", + }, + "type": "public-key" + } + } +} +end note +D1 -> S: ""PUT /thirdpartyRequests/authorizations""\n""/33333333-0000-0000-0000-000000000000"" +S --> D1: ""200 OK"" +S -> D2: ""PUT /thirdpartyRequests/authorizations""\n""/33333333-0000-0000-0000-000000000000"" +D2 --> S: ""200 OK"" + +D2 -> D2: Recherche du ""transactionRequestId"" pour cet ""authorizationId"" +D2 -> D2: Recherche du ""consentId"" pour ce ""transactionRequestId"" + + +D2 -> D2: Génération d'un nouveau ""verificationRequestId"", et association \n avec le ""thirdpartyTransactionRequestId"" + +rnote left of D2 #LightGray +**""POST /thirdpartyRequests/verifications""** +""FSPIOP-Source: dfspa"" +""FSPIOP-Destination: central-auth"" +{ + "verificationRequestId": "44444444-0000-0000-0000-000000000000", + "challenge": """", + "consentId": "123", + "signedPayloadType": "FIDO", + "fidoValue": { + "id": "string", + "rawId": "string - base64 encoded utf-8", + "response": { + "authenticatorData": "string - base64 encoded utf-8", + "clientDataJSON": "string - base64 encoded utf-8", + "signature": "string - base64 encoded utf-8", + "userHandle": "string - base64 encoded utf-8", + }, + "type": "public-key" + } +} +end note +D2 -> S: ""POST /thirdpartyRequests/verifications"" +S --> D2: ""202 Accepted"" +S -> AUTHS: ""POST /thirdpartyRequests/verifications"" +AUTHS --> S: ""202 Accepted"" + +AUTHS -> AUTHS: Recherche de ce consentement à partir du consentId +AUTHS -> AUTHS: Vérification que accountAddress correspond au Consent +AUTHS -> AUTHS: Vérification que les octets signés correspondent à la \nclé publique stockée pour le consentement + +rnote right of AUTHS #LightGray +**""PUT /thirdpartyRequests/verifications""** +**"" /44444444-0000-0000-0000-000000000000/error""** +""FSPIOP-Source: central-auth"" +""FSPIOP-Destination: dfspa"" +{ + "errorInformation": { + "errorCode": "6201", + "errorDescription": "Invalid transaction signature", + "extensionList": [] + } +} +end note +AUTHS -> S: ""PUT /thirdpartyRequests/verifications""\n"" /44444444-0000-0000-0000-000000000000/error"" +S --> AUTHS: ""200 OK"" +S -> D2: ""PUT /thirdpartyRequests/verifications""\n"" /44444444-0000-0000-0000-000000000000/error"" +D2 --> S: ""200 OK"" + +note over D2 + Le défi signé est invalide. La demande de transaction a échoué. +end note + + +rnote left of D2 #LightGray +**""PUT /thirdpartyRequests/transactions""** +**"" /00000000-0000-0000-0000-000000000000/error""** +""FSPIOP-Source: dfspa"" +""FSPIOP-Destination: pispa"" +{ + "errorInformation": { + "errorCode": "6201", + "errorDescription": "Invalid transaction signature", + "extensionList": [] + } +} +end note +D2 -> S: ""PUT /thirdpartyRequests/transactions""\n"" /00000000-0000-0000-0000-000000000000/error"" +S --> D2: ""200 OK"" +S -> D1: ""PUT /thirdpartyRequests/transactions""\n"" /00000000-0000-0000-0000-000000000000/error"" +D1 --> S: ""200 OK"" + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-4-2-bad-signed-challenge-auth-service.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-4-2-bad-signed-challenge-auth-service.svg new file mode 100644 index 000000000..abcc60bc0 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-4-2-bad-signed-challenge-auth-service.svg @@ -0,0 +1,221 @@ + + Transfert : 3.4.2 Défi signé invalide — Auth-Service hébergé par le hub + + + Transfert : 3.4.2 Défi signé invalide — Auth-Service hébergé par le hub + + PISP + + Mojaloop + + DFSP A + + + + + + + + + + + + + + + + + + + + + + Serveur PISP + + Switch + + Auth-Service + + DFSP A + (Payeur) + Le PISP a initié une demande de transaction tiers avec + POST /thirdpartyRequests/transactions + Le DFSP A a reçu le devis et a demandé au PISP de vérifier + + + Le PISP recherche le + transactionRequestId + et + vérifie le devis avec l'utilisateur, + et utilise l'API FIDO pour signer + la chaîne + challenge + + PUT /thirdpartyRequests/authorizations + /33333333-0000-0000-0000-000000000000 + FSPIOP-Source: pispa + FSPIOP-Destination: dfspa + { + "responseType": "ACCEPTED" + "signedPayload": { + "signedPayloadType": "FIDO", + "fidoSignedPayload": { + "id": "string", + "rawId": "string - base64 encoded utf-8", + "response": { + "authenticatorData": "string - base64 encoded utf-8", + "clientDataJSON": "string - base64 encoded utf-8", + "signature": "string - base64 encoded utf-8", + "userHandle": "string - base64 encoded utf-8", + }, + "type": "public-key" + } + } + } + + + PUT /thirdpartyRequests/authorizations + /33333333-0000-0000-0000-000000000000 + + + 200 OK + + + PUT /thirdpartyRequests/authorizations + /33333333-0000-0000-0000-000000000000 + + + 200 OK + + + + + Recherche du + transactionRequestId + pour cet + authorizationId + + + + + Recherche du + consentId + pour ce + transactionRequestId + + + + + Génération d'un nouveau + verificationRequestId + , et association + avec le + thirdpartyTransactionRequestId + + POST /thirdpartyRequests/verifications + FSPIOP-Source: dfspa + FSPIOP-Destination: central-auth + { + "verificationRequestId": "44444444-0000-0000-0000-000000000000", + "challenge": + <base64 encoded binary - the encoded challenge> + , + "consentId": "123", + "signedPayloadType": "FIDO", + "fidoValue": { + "id": "string", + "rawId": "string - base64 encoded utf-8", + "response": { + "authenticatorData": "string - base64 encoded utf-8", + "clientDataJSON": "string - base64 encoded utf-8", + "signature": "string - base64 encoded utf-8", + "userHandle": "string - base64 encoded utf-8", + }, + "type": "public-key" + } + } + + + POST /thirdpartyRequests/verifications + + + 202 Accepted + + + POST /thirdpartyRequests/verifications + + + 202 Accepted + + + + + Recherche de ce consentement à partir du consentId + + + + + Vérification que accountAddress correspond au Consent + + + + + Vérification que les octets signés correspondent à la + clé publique stockée pour le consentement + + PUT /thirdpartyRequests/verifications + /44444444-0000-0000-0000-000000000000/error + FSPIOP-Source: central-auth + FSPIOP-Destination: dfspa + { + "errorInformation": { + "errorCode": "6201", + "errorDescription": "Invalid transaction signature", + "extensionList": [] + } + } + + + PUT /thirdpartyRequests/verifications + /44444444-0000-0000-0000-000000000000/error + + + 200 OK + + + PUT /thirdpartyRequests/verifications + /44444444-0000-0000-0000-000000000000/error + + + 200 OK + + + Le défi signé est invalide. La demande de transaction a échoué. + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000/error + FSPIOP-Source: dfspa + FSPIOP-Destination: pispa + { + "errorInformation": { + "errorCode": "6201", + "errorDescription": "Invalid transaction signature", + "extensionList": [] + } + } + + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000/error + + + 200 OK + + + PUT /thirdpartyRequests/transactions + /00000000-0000-0000-0000-000000000000/error + + + 200 OK + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-6-tpr-timeout.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-6-tpr-timeout.puml new file mode 100644 index 000000000..1c4813fe9 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-6-tpr-timeout.puml @@ -0,0 +1,77 @@ +@startuml + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title Transfert : 3. Expiration de la demande de transaction tiers + +box "PISP" +participant "Serveur PISP" as D1 +end box +box "Mojaloop" + participant Switch as S +end box +box "DFSP A" + participant "DFSP A\n(Payeur)" as D2 +end box + + +rnote right of D1 #LightGray +**""POST /thirdpartyRequests/transactions""** +""FSPIOP-Source: pispa"" +""FSPIOP-Destination: dfspa"" +{ + "transactionRequestId": "00000000-0000-0000-0000-000000000000", + "payee": { + "partyIdInfo": { + "partyIdType": "MSISDN", + "partyIdentifier": "+4412345678", + "fspId": "dfspb" + } + }, + "payer": { + "partyIdType": "THIRD_PARTY_LINK", + "partyIdentifier": "qwerty-56789", + "fspId": "dfspa" + }, + "amountType": "SEND", + "amount": { + "amount": "100", + "currency": "USD" + }, + "transactionType": { + "scenario": "TRANSFER", + "initiator": "PAYER", + "initiatorType": "CONSUMER" + }, + "expiration": "2020-06-15T22:17:28.985-01:00" +} +end note +D1 -> S: ""POST /thirdpartyRequests/transactions"" +S --> D1: ""202 Accepted"" +S -> D2: ""POST /thirdpartyRequests/transactions"" +D2 --> S: ""202 Accepted"" + + +... Le DFSP ne répond pas pour une raison quelconque... + + +D1 -> D1: Expiration de la demande de transaction tiers atteinte + +note over D1 + Le PISP informe son utilisateur que la transaction a échoué. + +end note + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-6-tpr-timeout.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-6-tpr-timeout.svg new file mode 100644 index 000000000..f9b6ef19b --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/3-6-tpr-timeout.svg @@ -0,0 +1,81 @@ + + Transfert : 3. Expiration de la demande de transaction tiers + + + Transfert : 3. Expiration de la demande de transaction tiers + + PISP + + Mojaloop + + DFSP A + + + + + + + + + + + Serveur PISP + + Switch + + DFSP A + (Payeur) + + POST /thirdpartyRequests/transactions + FSPIOP-Source: pispa + FSPIOP-Destination: dfspa + { + "transactionRequestId": "00000000-0000-0000-0000-000000000000", + "payee": { + "partyIdInfo": { + "partyIdType": "MSISDN", + "partyIdentifier": "+4412345678", + "fspId": "dfspb" + } + }, + "payer": { + "partyIdType": "THIRD_PARTY_LINK", + "partyIdentifier": "qwerty-56789", + "fspId": "dfspa" + }, + "amountType": "SEND", + "amount": { + "amount": "100", + "currency": "USD" + }, + "transactionType": { + "scenario": "TRANSFER", + "initiator": "PAYER", + "initiatorType": "CONSUMER" + }, + "expiration": "2020-06-15T22:17:28.985-01:00" + } + + + POST /thirdpartyRequests/transactions + + + 202 Accepted + + + POST /thirdpartyRequests/transactions + + + 202 Accepted + Le DFSP ne répond pas pour une raison quelconque + + + + + Expiration de la demande de transaction tiers atteinte + + + Le PISP informe son utilisateur que la transaction a échoué. +   + + diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/get_transaction_request.puml b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/get_transaction_request.puml new file mode 100644 index 000000000..042816135 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/get_transaction_request.puml @@ -0,0 +1,67 @@ +@startuml + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +hide footbox + +title PISP — Obtenir la demande de transaction (GetTransactionRequest) + +box "PISP" +participant "Serveur PISP" as D1 +end box +box "Mojaloop" + participant Switch as S +end box +box "DFSP A" + participant "DFSP A\n(Payeur)" as D2 +end box + +autonumber 1 "GTR-#" + +note over S + En supposant une demande de transaction tiers précédemment créée avec l'id : ""00000000-0000-0000-0000-000000000000"" + +end note + + + +rnote right of D1 #LightGray +**""GET /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000""** +""FSPIOP-Source: pispa"" +""FSPIOP-Destination: dfspa"" +end note + +D1 -> S: ""GET /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000"" +S --> D1: ""202 Accepted"" + +S -> D2: ""GET /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000"" +D2 --> S: ""202 Accepted"" + +D2 -> D2: Le DFSP recherche la demande de transaction tiers déjà créée +D2 -> D2: Le DFSP vérifie que le FSPIOP-Source (pisp)\nest le même que l'émetteur d'origine du \n""POST /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000"" + +rnote left of D2 #LightGray +**""PUT /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000""** +""FSPIOP-Source: dfspa"" +""FSPIOP-Destination: pispa"" +{ + "transactionRequestState": "ACCEPTED", +} +end note +D2 -> S: ""PUT /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000"" +S --> D2: ""200 OK"" + +S -> D1: ""PUT /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000"" +D1 --> S: ""200 OK"" + +@enduml diff --git a/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/get_transaction_request.svg b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/get_transaction_request.svg new file mode 100644 index 000000000..78f19c739 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/assets/diagrams/transfer/get_transaction_request.svg @@ -0,0 +1,85 @@ + + PISP — Obtenir la demande de transaction (GetTransactionRequest) + + + PISP — Obtenir la demande de transaction (GetTransactionRequest) + + PISP + + Mojaloop + + DFSP A + + + + + Serveur PISP + + Switch + + DFSP A + (Payeur) + + + En supposant une demande de transaction tiers précédemment créée avec l'id : + 00000000-0000-0000-0000-000000000000 +   + + GET /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000 + FSPIOP-Source: pispa + FSPIOP-Destination: dfspa + + + GTR-1 + GET /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000 + + + GTR-2 + 202 Accepted + + + GTR-3 + GET /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000 + + + GTR-4 + 202 Accepted + + + + + GTR-5 + Le DFSP recherche la demande de transaction tiers déjà créée + + + + + GTR-6 + Le DFSP vérifie que le FSPIOP-Source (pisp) + est le même que l'émetteur d'origine du + POST /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000 + + PUT /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000 + FSPIOP-Source: dfspa + FSPIOP-Destination: pispa + { + "transactionRequestState": "ACCEPTED", + } + + + GTR-7 + PUT /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000 + + + GTR-8 + 200 OK + + + GTR-9 + PUT /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000 + + + GTR-10 + 200 OK + + diff --git a/docs/fr/technical/api/thirdparty/data-models.md b/docs/fr/technical/api/thirdparty/data-models.md new file mode 100644 index 000000000..28ef928c3 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/data-models.md @@ -0,0 +1,219 @@ +# Modèles de Données + +API Tierce Partie + +### Table des Matières + +1. [Préface](#Preface) + 1.1 [Conventions Utilisées dans ce Document](#ConventionsUsedinThisDocument) + 1.2 [Informations sur la Version du Document](#DocumentVersionInformation) + 1.3 [Références](#References) +2. [Introduction](#Introduction) + 2.1 [Spécification de l’API Tierce Partie](#ThirdPartyAPISpecification) +3. [Éléments de l’API Tierce Partie](#ThirdPartyAPIElements) + 3.1 [Ressources](#Resources) + 3.2 [Modèles de Données](#DataModels) + 3.3 [Codes d’Erreur](#ErrorCodes) +# 1. Préface +Cette section contient des informations sur l'utilisation de ce document. + +## 1.1 Conventions Utilisées dans ce Document + +Les conventions suivantes sont utilisées dans ce document pour identifier les types d’informations spécifiés. + +|Type d’Information|Convention|Exemple| +|---|---|---| +|**Éléments de l’API, tels que les ressources**|Gras|**/authorization**| +|**Variables**|Italique entre crochets|_{ID}_| +|**Termes du glossaire**|Italique à la première occurrence ; défini dans _Glossaire_|Le but de l'API est de permettre des transactions financières interopérables entre un _Payer_ (un payeur de fonds électroniques dans une transaction de paiement) situé dans un _FSP_ (une entité qui fournit un service financier numérique à un utilisateur final) et un _Payee_ (un bénéficiaire de fonds électroniques dans une transaction de paiement) situé dans un autre FSP.| +|**Documents de la bibliothèque**|Italique|Les informations utilisateur ne doivent généralement pas être utilisées par les déploiements de l’API ; les mesures de sécurité détaillées dans _Signature API et Chiffrement API_ doivent être utilisées à la place.| + +## 1.2 Informations sur la Version du Document + +| Version | Date | Description des Changements | +| --- | --- | --- | +| **1.0** | 2021-10-03 | Version initiale + +## 1.3 Références + +Les références suivantes sont utilisées dans cette spécification : + +| Référence | Description | Version | Lien | +| --- | --- | --- | --- | +| Ref. 1 | Open API pour l’interopérabilité de FSP | `1.1` | [Définition API v1.1](https://github.com/mojaloop/mojaloop-specification/blob/master/fspiop-api/documents/v1.1-document-set/API%20Definition%20v1.1.md)| + + +# 2. Introduction + +Ce document spécifie le modèle de données utilisé par l’API Tierce Partie Mojaloop ("l’API"). + +## 2.1 Spécification de l’API Tierce Partie + +La spécification de l’API Tierce Partie Mojaloop comprend les documents suivants : + +- [Modèles de Données](./data-models.md) +- [Schémas de Transaction - Liaison](./transaction-patterns-linking.md) +- [Schémas de Transaction - Transfert](./transaction-patterns-transfer.md) +- [Définition Open API Tierce Partie - DFSP](./thirdparty-dfsp-v1.0.yaml) +- [Définition Open API Tierce Partie - PISP](./thirdparty-dfsp-v1.0.yaml) + + +# 3. Éléments de l’API Tierce Partie + +Cette section décrit le contenu de l’API qui sera utilisé par les PISP et DFSP. + +Le contenu de l’API se divise en deux sections : + +1. [Schémas de Transaction - Liaison](./transaction-patterns-linking.md) décrit le processus de liaison des comptes clients et fournit un mécanisme d'autorisation générale pour permettre aux PISP d’effectuer des opérations sur ces comptes +2. [Schémas de Transaction - Transfert](./transaction-patterns-transfer.md) décrit le transfert de fonds à l’instigation d’un PISP. + +L’API est utilisée par les différents types de participants suivants : + 1. PISP + 2. DFSP offrant à leurs clients des services leur permettant d'accéder à leur compte via un ou plusieurs PISP + 3. Auth-Services + 4. Le switch Mojaloop + +Chaque ressource dans la définition de l’API est accompagnée d’une définition du (des) type(s) de participant pouvant y accéder. + +## 3.1 Ressources + +L’API contient les ressources suivantes : + +### 3.1.1 **/accounts** + +La ressource **/accounts** est utilisée pour demander des informations à un DFSP concernant les comptes qu'il détient pour un identifiant donné. L'identifiant est une valeur fournie par l'utilisateur qu’il utilise pour accéder à son compte chez le DFSP, tel qu’un numéro de téléphone, une adresse e-mail ou tout autre identifiant précédemment fourni par le DFSP. + +Le DFSP retourne un ensemble d'informations sur les comptes qu'il est prêt à divulguer au PISP. +Le PISP peut ensuite afficher les noms des comptes à l'utilisateur et permettre à l’utilisateur de sélectionner les comptes qu’il souhaite lier via le PISP. + +La ressource **/accounts** prend en charge les points de terminaison décrits ci-dessous. + +#### 3.1.1.1 Requêtes + +Cette section décrit les services qu’un PISP peut demander sur la ressource /accounts. + +##### 3.1.1.1.1 **GET /accounts/**_{ID}_ + +Utilisé par : PISP + +La requête HTTP **GET /accounts/**_{ID}_ est utilisée pour rechercher des informations sur les comptes de l’utilisateur demandé, défini par un identifiant *{ID}*, où *{ID}* est un identifiant qu’un utilisateur utilise pour accéder à son compte chez le DFSP, tel qu’un numéro de téléphone, une adresse e-mail ou tout autre identifiant précédemment fourni par le DFSP. + +Informations sur le callback et le modèle de données pour **GET /accounts/**_{ID}_ : +- Callback - **PUT /accounts/**_{ID}_ +- Callback d’erreur - **PUT /accounts/**_{ID}_**/error** +- Modèle de Données – corps vide + +#### 3.1.1.2 Callbacks + +Les réponses pour la ressource **/accounts** sont les suivantes : + +##### 3.1.1.2.1 **PUT /accounts/**_{ID}_ + +Utilisé par : DFSP + +La réponse **PUT /accounts/**_{ID}_ est utilisée pour informer le demandeur du résultat d'une demande d’informations de comptes. L’identifiant ID donné dans l’appel correspond à la valeur donnée dans la demande d’origine (voir la section 3.1.1.1.1 ci-dessus.) + +Le contenu des données du message est donné ci-dessous. + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| accountList | 1 | AccountList | Informations sur les comptes que le DFSP associe à l’identifiant envoyé par le PISP. | + +##### 3.1.1.2.2 **PUT /accounts/**_{ID}_**/error** + +Utilisé par : DFSP + +La réponse **PUT /accounts/**_{ID}_**/error** est utilisée pour informer le demandeur qu’une demande de liste de comptes a généré une erreur. L’identifiant ID donné dans l’appel correspond aux valeurs données dans la demande d’origine (voir la section 3.1.1.1.1 ci-dessus.) + +Le contenu de données du message est donné ci-dessous. + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| errorInformation | 1 | ErrorInformation | Informations décrivant l’erreur et le code erreur. | + +### 3.1.2 **/consentRequests** + +La ressource **/consentRequests** est utilisée par un PISP pour initier le processus de liaison avec un compte DFSP au nom d’un utilisateur. Le PISP contacte le DFSP et envoie une liste des autorisations qu’il souhaite obtenir et les comptes pour lesquels il souhaite l'autorisation. + +#### 3.1.2.1 Requêtes + +Cette section décrit les services pouvant être demandés par un client sur la ressource API **/consentRequests**. + +##### 3.1.2.1.1 **GET /consentRequests/**_{ID}_ + +Utilisé par : PISP + +La requête HTTP **GET /consentRequests/**_{ID}_ est utilisée pour obtenir des informations sur un consentement précédemment demandé. Le *{ID}* dans l’URI doit contenir le consentRequestId qui a été attribué à la demande par le PISP lors de la création de la demande. + +Informations de callback et modèle de données pour **GET /consentRequests/**_{ID}_ : +- Callback – **PUT /consentRequests/**_{ID}_ +- Callback d’erreur – **PUT /consentRequests/**_{ID}_**/error** +- Modèle de Données – corps vide + +##### 3.1.2.1.2 **POST /consentRequests** + +Utilisé par : PISP + +La requête HTTP **POST /consentRequests** est utilisée pour demander à un DFSP d’accorder l’accès à un ou plusieurs comptes appartenant à un client du DFSP pour le PISP qui envoie la demande. + +Callback et modèle de données pour **POST /consentRequests** : +- Callback : **PUT /consentRequests/**_{ID}_ +- Callback d’erreur : **PUT /consentRequests/**_{ID}_**/error** +- Modèle de données – voir ci-dessous + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| consentRequestId | 1 | CorrelationId | ID commun entre le PISP et le DFSP payeur pour l’objet de demande de consentement. L’ID doit être réutilisé pour les renvois de la même demande. Un nouvel ID doit être généré pour chaque nouvelle demande. | +| userId | 1 | String(1..128) | L'identifiant utilisé dans **GET /accounts/**_{ID}_. Utilisé par le DFSP pour mettre en corrélation une recherche de compte avec une `consentRequest` | +| scopes | 1..256 | Scope | Une ou plusieurs demandes d’accès à un compte particulier. Dans chaque cas, l’adresse du compte et les types d’accès requis sont donnés. | +| authChannels | 1..256 | ConsentRequestChannelType | Une collection des types d’authentification que le DFSP peut utiliser pour vérifier que son client a effectivement demandé l’accès pour le PISP aux comptes demandés. | +| callbackUri | 1 | Uri | L’URI de redirection où l’utilisateur sera redirigé après vérification via le canal d’autorisation WEB. Ce champ est obligatoire car le PISP ne sait pas à l’avance quel AuthChannel le DSFP utilisera pour authentifier son utilisateur. | + +#### 3.1.2.2 Callbacks + +Cette section décrit les callbacks utilisés par le serveur sous la ressource /consentRequests. + +##### 3.1.2.2.1 **PUT /consentRequests/**_{ID}_ + +Utilisé par : DFSP + +Un DFSP utilise ce callback pour (1) informer le PISP que la demande de consentement a été acceptée, et +(2) communiquer au PISP le `authChannel` qu’il doit utiliser pour authentifier son utilisateur. + +Lorsque le PISP demande une série d’autorisations à un DFSP pour le compte d’un client du DFSP, il se peut que tous les droits ne soient pas accordés par le DFSP. Inversement, le processus d’autorisation hors bande peut aboutir à l’octroi de privilèges supplémentaires au PISP par le possesseur du compte. La ressource **PUT /consentRequests/**_{ID}_ retourne l’état courant des droits relatifs à une demande d’autorisation en particulier. Le modèle de données pour cet appel est le suivant : + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| scopes | 1..256 | Scope | Une ou plusieurs demandes d’accès à un compte particulier. Dans chaque cas, l’adresse et les types d’accès demandés sont renseignés. | +| authChannels | 1 | ConsentRequestChannelType | Une liste d’un élément, que le DFSP utilise pour informer le PISP du canal d’autorisation choisi. | +| callbackUri | 0..1 | Uri | L’URI de rappel où l’utilisateur sera redirigé après la vérification via le canal WEB. | +| authUri | 0..1 | Uri | L’URI que le PISP doit appeler pour terminer la procédure s’il faut la compléter. | + + +##### 3.1.2.2.2 **PATCH /consentRequests/**_{ID}_ + +Utilisé par : PISP + +Après que l’utilisateur a complété une autorisation hors bande avec le DFSP, le PISP recevra +un jeton qu’il pourra utiliser pour prouver au DFSP que l’utilisateur fait confiance à ce PISP. + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| authToken | 1 | BinaryString |Le jeton donné au PISP par le DFSP dans le cadre du processus d’authentification hors bande | + +#### 3.1.2.3 Callbacks d’Erreur + +Cette section décrit les callbacks d’erreur utilisés par le serveur sous la ressource +**/consentRequests**. + +##### 3.1.2.3.1 **PUT /consentRequests/**_{ID}_**/error** + +Utilisé par : DFSP + +Si le serveur ne peut pas compléter la demande de consentement, ou si une erreur de traitement hors bande ou une autre erreur se produit, le callback d’erreur **PUT /consentRequests/**_{ID}_**/error** est utilisé. Le *{ID}* dans l’URI doit contenir *{ID}* utilisé dans la requête **GET /consentRequests/**_{ID}_ +ou la requête **POST /consentRequests**. Le modèle de données pour cette ressource est : + +| Nom | Cardinalité | Type | Description | +| --- | --- | --- | --- | +| errorInformation | 1 | ErrorInformation | Informations décrivant l’erreur et le code erreur. | + diff --git a/docs/fr/technical/api/thirdparty/thirdparty-dfsp-v1.0.yaml b/docs/fr/technical/api/thirdparty/thirdparty-dfsp-v1.0.yaml new file mode 100644 index 000000000..327d244dd --- /dev/null +++ b/docs/fr/technical/api/thirdparty/thirdparty-dfsp-v1.0.yaml @@ -0,0 +1,2625 @@ +openapi: 3.0.2 +info: + title: Mojaloop Third Party API (DFSP) + version: '1.0' + description: | + A Mojaloop API for DFSPs supporting Third Party functions. + DFSPs who want to enable Payment Initiation Service Providers (PISPs) to perform actions on behalf of a DFSP's user should implement this API. + PISPs should implement the accompanying API - Mojaloop Third Party API (PISP) instead. + license: + name: Open API for FSP Interoperability (FSPIOP) (Implementation Friendly Version) + url: 'https://github.com/mojaloop/mojaloop-specification/blob/master/LICENSE.md' +servers: + - url: / +paths: + '/accounts/{ID}': + parameters: + - name: ID + in: path + required: true + schema: + type: string + description: The identifier value. + - $ref: '#/paths/~1consents/parameters/0' + - $ref: '#/paths/~1consents/parameters/1' + - $ref: '#/paths/~1consents/parameters/2' + - $ref: '#/paths/~1consents/parameters/3' + - $ref: '#/paths/~1consents/parameters/4' + - $ref: '#/paths/~1consents/parameters/5' + - $ref: '#/paths/~1consents/parameters/6' + - $ref: '#/paths/~1consents/parameters/7' + - $ref: '#/paths/~1consents/parameters/8' + get: + operationId: GetAccountsByUserId + summary: GetAccountsByUserId + description: | + The HTTP request `GET /accounts/{ID}` is used to retrieve the list of potential accounts available for linking. + tags: + - accounts + - sampled + parameters: + - $ref: '#/paths/~1consents/post/parameters/0' + responses: + '202': + $ref: '#/paths/~1consents/post/responses/202' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + put: + description: | + The HTTP request `PUT /accounts/{ID}` is used to return the list of potential accounts available for linking + operationId: UpdateAccountsByUserId + summary: UpdateAccountsByUserId + tags: + - accounts + - sampled + parameters: + - $ref: '#/paths/~1consents/post/parameters/1' + requestBody: + required: true + content: + application/json: + schema: + title: AccountsIDPutResponse + type: object + description: 'The object sent in a `PUT /accounts/{ID}` request.' + properties: + accountList: + description: Information about the accounts that the DFSP associates with the identifier sent by the PISP + type: array + items: + title: Account + type: object + description: Data model for the complex type Account. + properties: + accountNickname: + title: Name + type: string + pattern: '^(?!\s*$)[\w .,''-]{1,128}$' + description: |- + The API data type Name is a JSON String, restricted by a regular expression to avoid characters which are generally not used in a name. + + Regular Expression - The regular expression for restricting the Name type is "^(?!\s*$)[\w .,'-]{1,128}$". The restriction does not allow a string consisting of whitespace only, all Unicode characters are allowed, as well as the period (.) (apostrophe (‘), dash (-), comma (,) and space characters ( ). + + **Note:** In some programming languages, Unicode support must be specifically enabled. For example, if Java is used, the flag UNICODE_CHARACTER_CLASS must be enabled to allow Unicode characters. + address: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/scopes/items/properties/address' + currency: + title: Currency + description: 'The currency codes defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html) as three-letter alphabetic codes are used as the standard naming representation for currencies.' + type: string + minLength: 3 + maxLength: 3 + enum: + - AED + - AFN + - ALL + - AMD + - ANG + - AOA + - ARS + - AUD + - AWG + - AZN + - BAM + - BBD + - BDT + - BGN + - BHD + - BIF + - BMD + - BND + - BOB + - BRL + - BSD + - BTN + - BWP + - BYN + - BZD + - CAD + - CDF + - CHF + - CLP + - CNY + - COP + - CRC + - CUC + - CUP + - CVE + - CZK + - DJF + - DKK + - DOP + - DZD + - EGP + - ERN + - ETB + - EUR + - FJD + - FKP + - GBP + - GEL + - GGP + - GHS + - GIP + - GMD + - GNF + - GTQ + - GYD + - HKD + - HNL + - HRK + - HTG + - HUF + - IDR + - ILS + - IMP + - INR + - IQD + - IRR + - ISK + - JEP + - JMD + - JOD + - JPY + - KES + - KGS + - KHR + - KMF + - KPW + - KRW + - KWD + - KYD + - KZT + - LAK + - LBP + - LKR + - LRD + - LSL + - LYD + - MAD + - MDL + - MGA + - MKD + - MMK + - MNT + - MOP + - MRO + - MUR + - MVR + - MWK + - MXN + - MYR + - MZN + - NAD + - NGN + - NIO + - NOK + - NPR + - NZD + - OMR + - PAB + - PEN + - PGK + - PHP + - PKR + - PLN + - PYG + - QAR + - RON + - RSD + - RUB + - RWF + - SAR + - SBD + - SCR + - SDG + - SEK + - SGD + - SHP + - SLL + - SOS + - SPL + - SRD + - STD + - SVC + - SYP + - SZL + - THB + - TJS + - TMT + - TND + - TOP + - TRY + - TTD + - TVD + - TWD + - TZS + - UAH + - UGX + - USD + - UYU + - UZS + - VEF + - VND + - VUV + - WST + - XAF + - XCD + - XDR + - XOF + - XPF + - XTS + - XXX + - YER + - ZAR + - ZMW + - ZWD + required: + - accountNickname + - id + - currency + required: + - accounts + example: + - accountNickname: dfspa.user.nickname1 + id: dfspa.username.1234 + currency: ZAR + - accountNickname: dfspa.user.nickname2 + id: dfspa.username.5678 + currency: USD + responses: + '200': + description: OK + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + '/accounts/{ID}/error': + parameters: + - $ref: '#/paths/~1accounts~1%7BID%7D/parameters/0' + - $ref: '#/paths/~1consents/parameters/0' + - $ref: '#/paths/~1consents/parameters/1' + - $ref: '#/paths/~1consents/parameters/2' + - $ref: '#/paths/~1consents/parameters/3' + - $ref: '#/paths/~1consents/parameters/4' + - $ref: '#/paths/~1consents/parameters/5' + - $ref: '#/paths/~1consents/parameters/6' + - $ref: '#/paths/~1consents/parameters/7' + - $ref: '#/paths/~1consents/parameters/8' + put: + description: | + The HTTP request `PUT /accounts/{ID}/error` is used to return error information + operationId: UpdateAccountsByUserIdError + summary: UpdateAccountsByUserIdError + tags: + - accounts + - sampled + parameters: + - $ref: '#/paths/~1consents/post/parameters/1' + requestBody: + description: Details of the error returned. + required: true + content: + application/json: + schema: + title: ErrorInformationObject + type: object + description: Data model for the complex type object that contains ErrorInformation. + properties: + errorInformation: + title: ErrorInformation + type: object + description: Data model for the complex type ErrorInformation. + properties: + errorCode: + title: ErrorCode + type: string + pattern: '^[1-9]\d{3}$' + description: 'The API data type ErrorCode is a JSON String of four characters, consisting of digits only. Negative numbers are not allowed. A leading zero is not allowed. Each error code in the API is a four-digit number, for example, 1234, where the first number (1 in the example) represents the high-level error category, the second number (2 in the example) represents the low-level error category, and the last two numbers (34 in the example) represent the specific error.' + example: '5100' + errorDescription: + title: ErrorDescription + type: string + minLength: 1 + maxLength: 128 + description: Error description string. + extensionList: + $ref: '#/paths/~1thirdpartyRequests~1authorizations/post/requestBody/content/application~1json/schema/properties/extensionList' + required: + - errorCode + - errorDescription + required: + - errorInformation + responses: + '200': + $ref: '#/paths/~1accounts~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + /consentRequests: + parameters: + - $ref: '#/paths/~1consents/parameters/0' + - $ref: '#/paths/~1consents/parameters/1' + - $ref: '#/paths/~1consents/parameters/2' + - $ref: '#/paths/~1consents/parameters/3' + - $ref: '#/paths/~1consents/parameters/4' + - $ref: '#/paths/~1consents/parameters/5' + - $ref: '#/paths/~1consents/parameters/6' + - $ref: '#/paths/~1consents/parameters/7' + - $ref: '#/paths/~1consents/parameters/8' + post: + tags: + - consentRequests + - sampled + operationId: CreateConsentRequest + summary: CreateConsentRequest + description: | + The HTTP request **POST /consentRequests** is used to request a DFSP to grant access to one or more + accounts owned by a customer of the DFSP for the PISP who sends the request. + parameters: + - $ref: '#/paths/~1consents/post/parameters/0' + - $ref: '#/paths/~1consents/post/parameters/1' + requestBody: + description: The consentRequest to create + required: true + content: + application/json: + schema: + title: ConsentRequestsPostRequest + type: object + description: The object sent in a `POST /consentRequests` request. + properties: + consentRequestId: + title: CorrelationId + type: string + pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$' + description: 'Identifier that correlates all messages of the same sequence. The API data type UUID (Universally Unique Identifier) is a JSON String in canonical format, conforming to [RFC 4122](https://tools.ietf.org/html/rfc4122), that is restricted by a regular expression for interoperability reasons. A UUID is always 36 characters long, 32 hexadecimal symbols and 4 dashes (‘-‘).' + example: b51ec534-ee48-4575-b6a9-ead2955b8069 + userId: + type: string + description: 'The identifier used in the **GET /accounts/**_{ID}_. Used by the DFSP to correlate an account lookup to a `consentRequest`' + minLength: 1 + maxLength: 128 + scopes: + type: array + minLength: 1 + maxLength: 256 + items: + title: Scope + type: object + description: Scope + Account Identifier mapping for a Consent. + properties: + address: + title: AccountAddress + type: string + description: | + An address which can be used to identify the account. + pattern: '^([0-9A-Za-z_~\-\.]+[0-9A-Za-z_~\-])$' + minLength: 1 + maxLength: 1023 + actions: + type: array + minItems: 1 + maxItems: 32 + items: + title: ScopeAction + type: string + enum: + - ACCOUNTS_GET_BALANCE + - ACCOUNTS_TRANSFER + - ACCOUNTS_STATEMENT + description: | + The permissions allowed on a given account by a DFSP as defined in + a consent object + - ACCOUNTS_GET_BALANCE: PISP can request a balance for the linked account + - ACCOUNTS_TRANSFER: PISP can request a transfer of funds from the linked account in the DFSP + - ACCOUNTS_STATEMENT: PISP can request a statement of individual transactions on a user’s account + required: + - address + - actions + authChannels: + type: array + minLength: 1 + maxLength: 256 + items: + title: ConsentRequestChannelType + type: string + enum: + - WEB + - OTP + description: | + The auth channel being used for the consentRequest. + - "WEB" - The Web auth channel. + - "OTP" - The OTP auth channel. + callbackUri: + title: Uri + type: string + pattern: '^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?' + minLength: 1 + maxLength: 512 + description: | + The API data type Uri is a JSON string in a canonical format that is restricted by a regular expression for interoperability reasons. + required: + - consentRequestId + - userId + - scopes + - authChannels + - callbackUri + responses: + '202': + $ref: '#/paths/~1consents/post/responses/202' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + '/consentRequests/{ID}': + parameters: + - $ref: '#/paths/~1accounts~1%7BID%7D/parameters/0' + - $ref: '#/paths/~1consents/parameters/0' + - $ref: '#/paths/~1consents/parameters/1' + - $ref: '#/paths/~1consents/parameters/2' + - $ref: '#/paths/~1consents/parameters/3' + - $ref: '#/paths/~1consents/parameters/4' + - $ref: '#/paths/~1consents/parameters/5' + - $ref: '#/paths/~1consents/parameters/6' + - $ref: '#/paths/~1consents/parameters/7' + - $ref: '#/paths/~1consents/parameters/8' + get: + operationId: GetConsentRequestsById + summary: GetConsentRequestsById + description: | + The HTTP request `GET /consentRequests/{ID}` is used to get information about a previously + requested consent. The *{ID}* in the URI should contain the consentRequestId that was assigned to the + request by the PISP when the PISP originated the request. + tags: + - consentRequests + - sampled + parameters: + - $ref: '#/paths/~1consents/post/parameters/0' + responses: + '202': + $ref: '#/paths/~1consents/post/responses/202' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + put: + tags: + - consentRequests + - sampled + operationId: UpdateConsentRequest + summary: UpdateConsentRequest + description: | + A DFSP uses this callback to (1) inform the PISP that the consentRequest has been accepted, + and (2) communicate to the PISP which `authChannel` it should use to authenticate their user + with. + + When a PISP requests a series of permissions from a DFSP on behalf of a DFSP’s customer, not all + the permissions requested may be granted by the DFSP. Conversely, the out-of-band authorization + process may result in additional privileges being granted by the account holder to the PISP. The + **PUT /consentRequests/**_{ID}_ resource returns the current state of the permissions relating to a + particular authorization request. + parameters: + - $ref: '#/paths/~1consents/post/parameters/1' + requestBody: + required: true + content: + application/json: + schema: + oneOf: + - title: ConsentRequestsIDPutResponseWeb + type: object + description: | + The object sent in a `PUT /consentRequests/{ID}` request. + + Schema used in the request consent phase of the account linking web flow, + the result is the PISP being instructed on a specific URL where this + supposed user should be redirected. This URL should be a place where + the user can prove their identity (e.g., by logging in). + properties: + scopes: + type: array + minLength: 1 + maxLength: 256 + items: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/scopes/items' + authChannels: + type: array + minLength: 1 + maxLength: 1 + items: + title: ConsentRequestChannelTypeWeb + type: string + enum: + - WEB + description: | + The web auth channel being used for PUT consentRequest/{ID} request. + callbackUri: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/callbackUri' + authUri: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/callbackUri' + required: + - scopes + - authChannels + - callbackUri + - authUri + additionalProperties: false + - title: ConsentRequestsIDPutResponseOTP + type: object + description: | + The object sent in a `PUT /consentRequests/{ID}` request. + + Schema used in the request consent phase of the account linking OTP/SMS flow. + properties: + scopes: + type: array + minLength: 1 + maxLength: 256 + items: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/scopes/items' + authChannels: + type: array + minLength: 1 + maxLength: 1 + items: + title: ConsentRequestChannelTypeOTP + type: string + enum: + - OTP + description: | + The OTP auth channel being used for PUT consentRequest/{ID} request. + callbackUri: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/callbackUri' + required: + - scopes + - authChannels + additionalProperties: false + responses: + '202': + $ref: '#/paths/~1consents/post/responses/202' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + patch: + tags: + - consentRequests + - sampled + operationId: PatchConsentRequest + summary: PatchConsentRequest + description: | + After the user completes an out-of-band authorization with the DFSP, the PISP will receive a token which they can use to prove to the DFSP that the user trusts this PISP. + parameters: + - $ref: '#/paths/~1consents/post/parameters/0' + - $ref: '#/paths/~1consents/post/parameters/1' + requestBody: + required: true + content: + application/json: + schema: + title: ConsentRequestsIDPatchRequest + type: object + description: 'The object sent in a `PATCH /consentRequests/{ID}` request.' + properties: + authToken: + type: string + pattern: '^[A-Za-z0-9-_]+[=]{0,2}$' + description: 'The API data type BinaryString is a JSON String. The string is a base64url encoding of a string of raw bytes, where padding (character ‘=’) is added at the end of the data if needed to ensure that the string is a multiple of 4 characters. The length restriction indicates the allowed number of characters.' + required: + - authToken + responses: + '202': + $ref: '#/paths/~1consents/post/responses/202' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + '/consentRequests/{ID}/error': + parameters: + - $ref: '#/paths/~1accounts~1%7BID%7D/parameters/0' + - $ref: '#/paths/~1consents/parameters/0' + - $ref: '#/paths/~1consents/parameters/1' + - $ref: '#/paths/~1consents/parameters/2' + - $ref: '#/paths/~1consents/parameters/3' + - $ref: '#/paths/~1consents/parameters/4' + - $ref: '#/paths/~1consents/parameters/5' + - $ref: '#/paths/~1consents/parameters/6' + - $ref: '#/paths/~1consents/parameters/7' + - $ref: '#/paths/~1consents/parameters/8' + put: + tags: + - consentRequests + operationId: NotifyErrorConsentRequests + summary: NotifyErrorConsentRequests + description: | + DFSP responds to the PISP if something went wrong with validating an OTP or secret. + parameters: + - $ref: '#/paths/~1consents/post/parameters/1' + requestBody: + description: Error information returned. + required: true + content: + application/json: + schema: + $ref: '#/paths/~1accounts~1%7BID%7D~1error/put/requestBody/content/application~1json/schema' + responses: + '200': + $ref: '#/paths/~1accounts~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + /consents: + parameters: + - name: Content-Type + in: header + schema: + type: string + required: true + description: The `Content-Type` header indicates the specific version of the API used to send the payload body. + - name: Date + in: header + schema: + type: string + required: true + description: The `Date` header field indicates the date when the request was sent. + - name: X-Forwarded-For + in: header + schema: + type: string + required: false + description: |- + The `X-Forwarded-For` header field is an unofficially accepted standard used for informational purposes of the originating client IP address, as a request might pass multiple proxies, firewalls, and so on. Multiple `X-Forwarded-For` values should be expected and supported by implementers of the API. + + **Note:** An alternative to `X-Forwarded-For` is defined in [RFC 7239](https://tools.ietf.org/html/rfc7239). However, to this point RFC 7239 is less-used and supported than `X-Forwarded-For`. + - name: FSPIOP-Source + in: header + schema: + type: string + required: true + description: The `FSPIOP-Source` header field is a non-HTTP standard field used by the API for identifying the sender of the HTTP request. The field should be set by the original sender of the request. Required for routing and signature verification (see header field `FSPIOP-Signature`). + - name: FSPIOP-Destination + in: header + schema: + type: string + required: false + description: 'The `FSPIOP-Destination` header field is a non-HTTP standard field used by the API for HTTP header based routing of requests and responses to the destination. The field must be set by the original sender of the request if the destination is known (valid for all services except GET /parties) so that any entities between the client and the server do not need to parse the payload for routing purposes. If the destination is not known (valid for service GET /parties), the field should be left empty.' + - name: FSPIOP-Encryption + in: header + schema: + type: string + required: false + description: The `FSPIOP-Encryption` header field is a non-HTTP standard field used by the API for applying end-to-end encryption of the request. + - name: FSPIOP-Signature + in: header + schema: + type: string + required: false + description: The `FSPIOP-Signature` header field is a non-HTTP standard field used by the API for applying an end-to-end request signature. + - name: FSPIOP-URI + in: header + schema: + type: string + required: false + description: 'The `FSPIOP-URI` header field is a non-HTTP standard field used by the API for signature verification, should contain the service URI. Required if signature verification is used, for more information, see [the API Signature document](https://github.com/mojaloop/docs/tree/master/Specification%20Document%20Set).' + - name: FSPIOP-HTTP-Method + in: header + schema: + type: string + required: false + description: 'The `FSPIOP-HTTP-Method` header field is a non-HTTP standard field used by the API for signature verification, should contain the service HTTP method. Required if signature verification is used, for more information, see [the API Signature document](https://github.com/mojaloop/docs/tree/master/Specification%20Document%20Set).' + post: + tags: + - consents + - sampled + operationId: PostConsents + summary: PostConsents + description: | + The **POST /consents** request is used to request the creation of a consent for interactions between a PISP and the DFSP who owns the account which a PISP’s customer wants to allow the PISP access to. + parameters: + - name: Accept + in: header + required: true + schema: + type: string + description: The `Accept` header field indicates the version of the API the client would like the server to use. + - name: Content-Length + in: header + required: false + schema: + type: integer + description: |- + The `Content-Length` header field indicates the anticipated size of the payload body. Only sent if there is a body. + + **Note:** The API supports a maximum size of 5242880 bytes (5 Megabytes). + requestBody: + required: true + content: + application/json: + schema: + oneOf: + - title: ConsentPostRequestAUTH + type: object + description: | + The object sent in a `POST /consents` request to the Auth-Service + by a DFSP to store registered Consent and credential + properties: + consentId: + allOf: + - $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/consentRequestId' + description: | + Common ID between the PISP and FSP for the Consent object + determined by the DFSP who creates the Consent. + scopes: + minLength: 1 + maxLength: 256 + type: array + items: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/scopes/items' + credential: + allOf: + - $ref: '#/paths/~1consents~1%7BID%7D/put/requestBody/content/application~1json/schema/oneOf/0/properties/credential' + status: + title: ConsentStatus + type: string + enum: + - ISSUED + - REVOKED + description: |- + Allowed values for the enumeration ConsentStatus + - ISSUED - The consent has been issued by the DFSP + - REVOKED - The consent has been revoked + required: + - consentId + - scopes + - credential + - status + additionalProperties: false + - title: ConsentPostRequestPISP + type: object + description: | + The provisional Consent object sent by the DFSP in `POST /consents`. + properties: + consentId: + allOf: + - $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/consentRequestId' + description: | + Common ID between the PISP and the Payer DFSP for the consent object. The ID + should be reused for resends of the same consent. A new ID should be generated + for each new consent. + consentRequestId: + allOf: + - $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/consentRequestId' + description: | + The ID given to the original consent request on which this consent is based. + scopes: + type: array + minLength: 1 + maxLength: 256 + items: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/scopes/items' + status: + $ref: '#/paths/~1consents/post/requestBody/content/application~1json/schema/oneOf/0/properties/status' + required: + - consentId + - consentRequestId + - scopes + - status + responses: + '202': + description: Accepted + '400': + description: Bad Request + content: + application/json: + schema: + title: ErrorInformationResponse + type: object + description: Data model for the complex type object that contains an optional element ErrorInformation used along with 4xx and 5xx responses. + properties: + errorInformation: + $ref: '#/paths/~1accounts~1%7BID%7D~1error/put/requestBody/content/application~1json/schema/properties/errorInformation' + headers: + Content-Length: + required: false + schema: + type: integer + description: |- + The `Content-Length` header field indicates the anticipated size of the payload body. Only sent if there is a body. + + **Note:** The API supports a maximum size of 5242880 bytes (5 Megabytes). + Content-Type: + schema: + type: string + required: true + description: The `Content-Type` header indicates the specific version of the API used to send the payload body. + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/paths/~1consents/post/responses/400/content/application~1json/schema' + headers: + Content-Length: + $ref: '#/paths/~1consents/post/responses/400/headers/Content-Length' + Content-Type: + $ref: '#/paths/~1consents/post/responses/400/headers/Content-Type' + '403': + description: Forbidden + content: + application/json: + schema: + $ref: '#/paths/~1consents/post/responses/400/content/application~1json/schema' + headers: + Content-Length: + $ref: '#/paths/~1consents/post/responses/400/headers/Content-Length' + Content-Type: + $ref: '#/paths/~1consents/post/responses/400/headers/Content-Type' + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/paths/~1consents/post/responses/400/content/application~1json/schema' + headers: + Content-Length: + $ref: '#/paths/~1consents/post/responses/400/headers/Content-Length' + Content-Type: + $ref: '#/paths/~1consents/post/responses/400/headers/Content-Type' + '405': + description: Method Not Allowed + content: + application/json: + schema: + $ref: '#/paths/~1consents/post/responses/400/content/application~1json/schema' + headers: + Content-Length: + $ref: '#/paths/~1consents/post/responses/400/headers/Content-Length' + Content-Type: + $ref: '#/paths/~1consents/post/responses/400/headers/Content-Type' + '406': + description: Not Acceptable + content: + application/json: + schema: + $ref: '#/paths/~1consents/post/responses/400/content/application~1json/schema' + headers: + Content-Length: + $ref: '#/paths/~1consents/post/responses/400/headers/Content-Length' + Content-Type: + $ref: '#/paths/~1consents/post/responses/400/headers/Content-Type' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/paths/~1consents/post/responses/400/content/application~1json/schema' + headers: + Content-Length: + $ref: '#/paths/~1consents/post/responses/400/headers/Content-Length' + Content-Type: + $ref: '#/paths/~1consents/post/responses/400/headers/Content-Type' + '503': + description: Service Unavailable + content: + application/json: + schema: + $ref: '#/paths/~1consents/post/responses/400/content/application~1json/schema' + headers: + Content-Length: + $ref: '#/paths/~1consents/post/responses/400/headers/Content-Length' + Content-Type: + $ref: '#/paths/~1consents/post/responses/400/headers/Content-Type' + '/consents/{ID}': + parameters: + - $ref: '#/paths/~1accounts~1%7BID%7D/parameters/0' + - $ref: '#/paths/~1consents/parameters/0' + - $ref: '#/paths/~1consents/parameters/1' + - $ref: '#/paths/~1consents/parameters/2' + - $ref: '#/paths/~1consents/parameters/3' + - $ref: '#/paths/~1consents/parameters/4' + - $ref: '#/paths/~1consents/parameters/5' + - $ref: '#/paths/~1consents/parameters/6' + - $ref: '#/paths/~1consents/parameters/7' + - $ref: '#/paths/~1consents/parameters/8' + get: + description: | + The **GET /consents/**_{ID}_ resource allows a party to enquire after the status of a consent. The *{ID}* used in the URI of the request should be the consent request ID which was used to identify the consent when it was created. + tags: + - consents + operationId: GetConsent + summary: GetConsent + parameters: + - $ref: '#/paths/~1consents/post/parameters/0' + responses: + '202': + $ref: '#/paths/~1consents/post/responses/202' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + patch: + description: | + The HTTP request `PATCH /consents/{ID}` is used + + - In account linking in the Credential Registration phase. Used by a DFSP + to notify a PISP a credential has been verified and registered with an + Auth service. + + - In account unlinking by a hub hosted auth service and by DFSPs + in non-hub hosted scenarios to notify participants of a consent being revoked. + + Called by a `auth-service` to notify a PISP and DFSP of consent status in hub hosted scenario. + Called by a `DFSP` to notify a PISP of consent status in non-hub hosted scenario. + tags: + - consents + - sampled + operationId: PatchConsentByID + summary: PatchConsentByID + requestBody: + required: true + content: + application/json: + schema: + oneOf: + - title: ConsentsIDPatchResponseVerified + description: | + PATCH /consents/{ID} request object. + + Sent by the DFSP to the PISP when a consent is verified. + Used in the "Register Credential" part of the Account linking flow. + type: object + properties: + credential: + type: object + properties: + status: + title: CredentialStatus + type: string + enum: + - VERIFIED + description: | + The status of the Credential. + - "VERIFIED" - The Credential is valid and verified. + required: + - status + required: + - credential + - title: ConsentsIDPatchResponseRevoked + description: | + PATCH /consents/{ID} request object. + + Sent to both the PISP and DFSP when a consent is revoked. + Used in the "Unlinking" part of the Account Unlinking flow. + type: object + properties: + status: + title: ConsentStatus + type: string + enum: + - REVOKED + description: |- + Allowed values for the enumeration ConsentStatus + - REVOKED - The consent has been revoked + revokedAt: + $ref: '#/paths/~1thirdpartyRequests~1transactions~1%7BID%7D/patch/requestBody/content/application~1json/schema/properties/completedTimestamp' + required: + - status + - revokedAt + parameters: + - $ref: '#/paths/~1consents/post/parameters/0' + - $ref: '#/paths/~1consents/post/parameters/1' + responses: + '200': + $ref: '#/paths/~1accounts~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + put: + description: | + The HTTP request `PUT /consents/{ID}` is used by the PISP and Auth Service. + + - Called by a `PISP` to after signing a challenge. Sent to an DFSP for verification. + - Called by a `auth-service` to notify a DFSP that a credential has been verified and registered. + tags: + - consents + - sampled + operationId: PutConsentByID + summary: PutConsentByID + requestBody: + required: true + content: + application/json: + schema: + oneOf: + - title: ConsentsIDPutResponseSigned + type: object + description: | + The HTTP request `PUT /consents/{ID}` is used by the PISP to update a Consent with a signed challenge and register a credential. + Called by a `PISP` to after signing a challenge. Sent to a DFSP for verification. + properties: + scopes: + type: array + items: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/scopes/items' + status: + title: ConsentStatus + type: string + enum: + - ISSUED + description: |- + Allowed values for the enumeration ConsentStatus + - ISSUED - The consent has been issued by the DFSP + credential: + title: SignedCredential + type: object + description: | + A credential used to allow a user to prove their identity and access + to an account with a DFSP. + + SignedCredential is a special formatting of the credential to allow us to be + more explicit about the `status` field - it should only ever be PENDING when + updating a credential. + properties: + credentialType: + title: CredentialType + type: string + enum: + - FIDO + - GENERIC + description: | + The type of the Credential. + - "FIDO" - A FIDO public/private keypair + - "GENERIC" - A Generic public/private keypair + status: + title: CredentialStatus + type: string + enum: + - PENDING + description: | + The status of the Credential. + - "PENDING" - The credential has been created, but has not been verified + genericPayload: + title: GenericCredential + type: object + description: | + A publicKey + signature of a challenge for a generic public/private keypair + properties: + publicKey: + $ref: '#/paths/~1consentRequests~1%7BID%7D/patch/requestBody/content/application~1json/schema/properties/authToken' + signature: + $ref: '#/paths/~1consentRequests~1%7BID%7D/patch/requestBody/content/application~1json/schema/properties/authToken' + required: + - publicKey + - signature + additionalProperties: false + fidoPayload: + $ref: '#/paths/~1consents~1%7BID%7D/put/requestBody/content/application~1json/schema/oneOf/1/properties/credential/properties/payload' + required: + - credentialType + - status + additionalProperties: false + required: + - scopes + - credential + additionalProperties: false + - title: ConsentsIDPutResponseVerified + type: object + description: | + The HTTP request `PUT /consents/{ID}` is used by the DFSP or Auth-Service to update a Consent object once it has been Verified. + Called by a `auth-service` to notify a DFSP that a credential has been verified and registered. + properties: + scopes: + type: array + items: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/scopes/items' + status: + $ref: '#/paths/~1consents~1%7BID%7D/put/requestBody/content/application~1json/schema/oneOf/0/properties/status' + credential: + title: VerifiedCredential + type: object + description: | + A credential used to allow a user to prove their identity and access + to an account with a DFSP. + + VerifiedCredential is a special formatting of the credential to allow us to be + more explicit about the `status` field - it should only ever be VERIFIED when + updating a credential. + properties: + credentialType: + $ref: '#/paths/~1consents~1%7BID%7D/put/requestBody/content/application~1json/schema/oneOf/0/properties/credential/properties/credentialType' + status: + type: string + enum: + - VERIFIED + description: 'The Credential is valid, and ready to be used by the PISP.' + payload: + title: FIDOPublicKeyCredentialAttestation + type: object + description: | + A data model representing a FIDO Attestation result. Derived from + [`PublicKeyCredential` Interface](https://w3c.github.io/webauthn/#iface-pkcredential). + + The `PublicKeyCredential` interface represents the below fields with + a Type of Javascript [ArrayBuffer](https://heycam.github.io/webidl/#idl-ArrayBuffer). + For this API, we represent ArrayBuffers as base64 encoded utf-8 strings. + properties: + id: + type: string + description: | + credential id: identifier of pair of keys, base64 encoded + https://w3c.github.io/webauthn/#ref-for-dom-credential-id + minLength: 59 + maxLength: 118 + rawId: + type: string + description: | + raw credential id: identifier of pair of keys, base64 encoded + minLength: 59 + maxLength: 118 + response: + type: object + description: | + AuthenticatorAttestationResponse + properties: + clientDataJSON: + type: string + description: | + JSON string with client data + minLength: 121 + maxLength: 512 + attestationObject: + type: string + description: | + CBOR.encoded attestation object + minLength: 306 + maxLength: 2048 + required: + - clientDataJSON + - attestationObject + additionalProperties: false + type: + type: string + description: 'response type, we need only the type of public-key' + enum: + - public-key + required: + - id + - response + - type + additionalProperties: false + required: + - credentialType + - status + - payload + additionalProperties: false + required: + - scopes + - credential + additionalProperties: false + parameters: + - $ref: '#/paths/~1consents/post/parameters/1' + responses: + '200': + $ref: '#/paths/~1accounts~1%7BID%7D/put/responses/200' + '202': + $ref: '#/paths/~1consents/post/responses/202' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + delete: + description: | + Used by PISP, DFSP + + The **DELETE /consents/**_{ID}_ request is used to request the revocation of a previously agreed consent. + For tracing and auditing purposes, the switch should be sure not to delete the consent physically; + instead, information relating to the consent should be marked as deleted and requests relating to the + consent should not be honoured. + operationId: DeleteConsentByID + parameters: + - $ref: '#/paths/~1consents/post/parameters/0' + tags: + - consents + responses: + '202': + $ref: '#/paths/~1consents/post/responses/202' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + '/consents/{ID}/error': + parameters: + - $ref: '#/paths/~1accounts~1%7BID%7D/parameters/0' + - $ref: '#/paths/~1consents/parameters/0' + - $ref: '#/paths/~1consents/parameters/1' + - $ref: '#/paths/~1consents/parameters/2' + - $ref: '#/paths/~1consents/parameters/3' + - $ref: '#/paths/~1consents/parameters/4' + - $ref: '#/paths/~1consents/parameters/5' + - $ref: '#/paths/~1consents/parameters/6' + - $ref: '#/paths/~1consents/parameters/7' + - $ref: '#/paths/~1consents/parameters/8' + put: + tags: + - consents + operationId: NotifyErrorConsents + summary: NotifyErrorConsents + description: | + DFSP responds to the PISP if something went wrong with validating or storing consent. + parameters: + - $ref: '#/paths/~1consents/post/parameters/1' + requestBody: + description: Error information returned. + required: true + content: + application/json: + schema: + $ref: '#/paths/~1accounts~1%7BID%7D~1error/put/requestBody/content/application~1json/schema' + responses: + '200': + $ref: '#/paths/~1accounts~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + /thirdpartyRequests/authorizations: + parameters: + - $ref: '#/paths/~1consents/parameters/0' + - $ref: '#/paths/~1consents/parameters/1' + - $ref: '#/paths/~1consents/parameters/2' + - $ref: '#/paths/~1consents/parameters/3' + - $ref: '#/paths/~1consents/parameters/4' + - $ref: '#/paths/~1consents/parameters/5' + - $ref: '#/paths/~1consents/parameters/6' + - $ref: '#/paths/~1consents/parameters/7' + - $ref: '#/paths/~1consents/parameters/8' + post: + description: | + The HTTP request **POST /thirdpartyRequests/authorizations** is used to request the validation by a customer for the transfer described in the request. + operationId: PostThirdpartyRequestsAuthorizations + summary: PostThirdpartyRequestsAuthorizations + tags: + - authorizations + parameters: + - $ref: '#/paths/~1consents/post/parameters/0' + - $ref: '#/paths/~1consents/post/parameters/1' + requestBody: + description: Authorization request details + required: true + content: + application/json: + schema: + title: ThirdpartyRequestsAuthorizationsPostRequest + description: POST /thirdpartyRequests/authorizations request object. + type: object + properties: + authorizationRequestId: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/consentRequestId' + transactionRequestId: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/consentRequestId' + challenge: + type: string + description: The challenge that the PISP's client is to sign + transferAmount: + allOf: + - $ref: '#/paths/~1thirdpartyRequests~1transactions/post/requestBody/content/application~1json/schema/properties/amount/allOf/0' + description: The amount that will be debited from the sending customer’s account as a consequence of the transaction. + payeeReceiveAmount: + allOf: + - $ref: '#/paths/~1thirdpartyRequests~1transactions/post/requestBody/content/application~1json/schema/properties/amount/allOf/0' + description: The amount that will be credited to the receiving customer’s account as a consequence of the transaction. + fees: + allOf: + - $ref: '#/paths/~1thirdpartyRequests~1transactions/post/requestBody/content/application~1json/schema/properties/amount/allOf/0' + description: The amount of fees that the paying customer will be charged as part of the transaction. + payer: + allOf: + - $ref: '#/paths/~1thirdpartyRequests~1transactions/post/requestBody/content/application~1json/schema/properties/payer/allOf/0' + description: 'Information about the Payer type, id, sub-type/id, FSP Id in the proposed financial transaction.' + payee: + allOf: + - $ref: '#/paths/~1thirdpartyRequests~1transactions/post/requestBody/content/application~1json/schema/properties/payee/allOf/0' + description: Information about the Payee in the proposed financial transaction. + transactionType: + title: TransactionType + type: object + description: Data model for the complex type TransactionType. + properties: + scenario: + title: TransactionScenario + type: string + enum: + - DEPOSIT + - WITHDRAWAL + - TRANSFER + - PAYMENT + - REFUND + description: |- + Below are the allowed values for the enumeration. + - DEPOSIT - Used for performing a Cash-In (deposit) transaction. In a normal scenario, electronic funds are transferred from a Business account to a Consumer account, and physical cash is given from the Consumer to the Business User. + - WITHDRAWAL - Used for performing a Cash-Out (withdrawal) transaction. In a normal scenario, electronic funds are transferred from a Consumer’s account to a Business account, and physical cash is given from the Business User to the Consumer. + - TRANSFER - Used for performing a P2P (Peer to Peer, or Consumer to Consumer) transaction. + - PAYMENT - Usually used for performing a transaction from a Consumer to a Merchant or Organization, but could also be for a B2B (Business to Business) payment. The transaction could be online for a purchase in an Internet store, in a physical store where both the Consumer and Business User are present, a bill payment, a donation, and so on. + - REFUND - Used for performing a refund of transaction. + example: DEPOSIT + subScenario: + title: TransactionSubScenario + type: string + pattern: '^[A-Z_]{1,32}$' + description: 'Possible sub-scenario, defined locally within the scheme (UndefinedEnum Type).' + example: LOCALLY_DEFINED_SUBSCENARIO + initiator: + title: TransactionInitiator + type: string + enum: + - PAYER + - PAYEE + description: |- + Below are the allowed values for the enumeration. + - PAYER - Sender of funds is initiating the transaction. The account to send from is either owned by the Payer or is connected to the Payer in some way. + - PAYEE - Recipient of the funds is initiating the transaction by sending a transaction request. The Payer must approve the transaction, either automatically by a pre-generated OTP or by pre-approval of the Payee, or by manually approving in his or her own Device. + example: PAYEE + initiatorType: + title: TransactionInitiatorType + type: string + enum: + - CONSUMER + - AGENT + - BUSINESS + - DEVICE + description: |- + Below are the allowed values for the enumeration. + - CONSUMER - Consumer is the initiator of the transaction. + - AGENT - Agent is the initiator of the transaction. + - BUSINESS - Business is the initiator of the transaction. + - DEVICE - Device is the initiator of the transaction. + example: CONSUMER + refundInfo: + title: Refund + type: object + description: Data model for the complex type Refund. + properties: + originalTransactionId: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/consentRequestId' + refundReason: + title: RefundReason + type: string + minLength: 1 + maxLength: 128 + description: Reason for the refund. + example: Free text indicating reason for the refund. + required: + - originalTransactionId + balanceOfPayments: + title: BalanceOfPayments + type: string + pattern: '^[1-9]\d{2}$' + description: '(BopCode) The API data type [BopCode](https://www.imf.org/external/np/sta/bopcode/) is a JSON String of 3 characters, consisting of digits only. Negative numbers are not allowed. A leading zero is not allowed.' + example: '123' + required: + - scenario + - initiator + - initiatorType + expiration: + allOf: + - $ref: '#/paths/~1thirdpartyRequests~1transactions~1%7BID%7D/patch/requestBody/content/application~1json/schema/properties/completedTimestamp' + description: 'The time by which the transfer must be completed, set by the payee DFSP.' + extensionList: + title: ExtensionList + type: object + description: 'Data model for the complex type ExtensionList. An optional list of extensions, specific to deployment.' + properties: + extension: + type: array + items: + title: Extension + type: object + description: Data model for the complex type Extension. + properties: + key: + title: ExtensionKey + type: string + minLength: 1 + maxLength: 32 + description: Extension key. + value: + title: ExtensionValue + type: string + minLength: 1 + maxLength: 128 + description: Extension value. + required: + - key + - value + minItems: 1 + maxItems: 16 + description: Number of Extension elements. + required: + - extension + required: + - authorizationRequestId + - transactionRequestId + - challenge + - transferAmount + - payeeReceiveAmount + - fees + - payer + - payee + - transactionType + - expiration + additionalProperties: false + responses: + '202': + $ref: '#/paths/~1consents/post/responses/202' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + '/thirdpartyRequests/authorizations/{ID}': + parameters: + - $ref: '#/paths/~1accounts~1%7BID%7D/parameters/0' + - $ref: '#/paths/~1consents/parameters/0' + - $ref: '#/paths/~1consents/parameters/1' + - $ref: '#/paths/~1consents/parameters/2' + - $ref: '#/paths/~1consents/parameters/3' + - $ref: '#/paths/~1consents/parameters/4' + - $ref: '#/paths/~1consents/parameters/5' + - $ref: '#/paths/~1consents/parameters/6' + - $ref: '#/paths/~1consents/parameters/7' + - $ref: '#/paths/~1consents/parameters/8' + get: + description: | + The HTTP request **GET /thirdpartyRequests/authorizations/**_{ID}_ is used to get information relating + to a previously issued authorization request. The *{ID}* in the request should match the + `authorizationRequestId` which was given when the authorization request was created. + operationId: GetThirdpartyRequestsAuthorizationsById + summary: GetThirdpartyRequestsAuthorizationsById + tags: + - authorizations + parameters: + - $ref: '#/paths/~1consents/post/parameters/0' + responses: + '202': + $ref: '#/paths/~1consents/post/responses/202' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + put: + description: | + After receiving the **POST /thirdpartyRequests/authorizations**, the PISP will present the details of the + transaction to their user, and request that the client sign the `challenge` field using the credential + they previously registered. + + The signed challenge will be sent back by the PISP in **PUT /thirdpartyRequests/authorizations/**_{ID}_: + operationId: PutThirdpartyRequestsAuthorizationsById + summary: PutThirdpartyRequestsAuthorizationsById + tags: + - authorizations + parameters: + - $ref: '#/paths/~1consents/post/parameters/1' + requestBody: + description: Signed authorization object + required: true + content: + application/json: + schema: + oneOf: + - title: ThirdpartyRequestsAuthorizationsIDPutResponseGeneric + type: object + description: 'The object sent in the PUT /thirdpartyRequests/authorizations/{ID} callback.' + properties: + responseType: + title: AuthorizationResponseType + description: | + The customer rejected the terms of the transfer. + type: string + enum: + - REJECTED + required: + - responseType + - title: ThirdpartyRequestsAuthorizationsIDPutResponseFIDO + type: object + description: 'The object sent in the PUT /thirdpartyRequests/authorizations/{ID} callback.' + properties: + responseType: + title: AuthorizationResponseType + description: | + The customer accepted the terms of the transfer + type: string + enum: + - ACCEPTED + signedPayload: + type: object + properties: + signedPayloadType: + $ref: '#/paths/~1thirdpartyRequests~1verifications/post/requestBody/content/application~1json/schema/oneOf/0/properties/signedPayloadType' + fidoSignedPayload: + $ref: '#/paths/~1thirdpartyRequests~1verifications/post/requestBody/content/application~1json/schema/oneOf/0/properties/fidoSignedPayload' + required: + - signedPayloadType + - fidoSignedPayload + additionalProperties: false + required: + - responseType + - signedPayload + additionalProperties: false + - title: ThirdpartyRequestsAuthorizationsIDPutResponseGeneric + type: object + description: 'The object sent in the PUT /thirdpartyRequests/authorizations/{ID} callback.' + properties: + responseType: + $ref: '#/paths/~1thirdpartyRequests~1authorizations~1%7BID%7D/put/requestBody/content/application~1json/schema/oneOf/1/properties/responseType' + signedPayload: + type: object + properties: + signedPayloadType: + $ref: '#/paths/~1thirdpartyRequests~1verifications/post/requestBody/content/application~1json/schema/oneOf/1/properties/signedPayloadType' + genericSignedPayload: + $ref: '#/paths/~1consentRequests~1%7BID%7D/patch/requestBody/content/application~1json/schema/properties/authToken' + required: + - signedPayloadType + - genericSignedPayload + additionalProperties: false + required: + - responseType + - signedPayload + additionalProperties: false + responses: + '200': + $ref: '#/paths/~1accounts~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + '/thirdpartyRequests/authorizations/{ID}/error': + parameters: + - $ref: '#/paths/~1accounts~1%7BID%7D/parameters/0' + - $ref: '#/paths/~1consents/parameters/0' + - $ref: '#/paths/~1consents/parameters/1' + - $ref: '#/paths/~1consents/parameters/2' + - $ref: '#/paths/~1consents/parameters/3' + - $ref: '#/paths/~1consents/parameters/4' + - $ref: '#/paths/~1consents/parameters/5' + - $ref: '#/paths/~1consents/parameters/6' + - $ref: '#/paths/~1consents/parameters/7' + - $ref: '#/paths/~1consents/parameters/8' + put: + tags: + - thirdpartyRequests + - sampled + operationId: PutThirdpartyRequestsAuthorizationsByIdAndError + summary: PutThirdpartyRequestsAuthorizationsByIdAndError + description: | + The HTTP request `PUT /thirdpartyRequests/authorizations/{ID}/error` is used by the DFSP or PISP to inform + the other party that something went wrong with a Thirdparty Transaction Authorization Request. + + The PISP may use this to tell the DFSP that the Thirdparty Transaction Authorization Request is invalid or doesn't + match a `transactionRequestId`. + + The DFSP may use this to tell the PISP that the signed challenge returned in `PUT /thirdpartyRequest/authorizations/{ID}` + was invalid. + parameters: + - $ref: '#/paths/~1consents/post/parameters/1' + requestBody: + description: Error information returned. + required: true + content: + application/json: + schema: + $ref: '#/paths/~1accounts~1%7BID%7D~1error/put/requestBody/content/application~1json/schema' + responses: + '200': + $ref: '#/paths/~1accounts~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + /thirdpartyRequests/transactions: + parameters: + - $ref: '#/paths/~1consents/parameters/0' + - $ref: '#/paths/~1consents/parameters/1' + - $ref: '#/paths/~1consents/parameters/2' + - $ref: '#/paths/~1consents/parameters/3' + - $ref: '#/paths/~1consents/parameters/4' + - $ref: '#/paths/~1consents/parameters/5' + - $ref: '#/paths/~1consents/parameters/6' + - $ref: '#/paths/~1consents/parameters/7' + - $ref: '#/paths/~1consents/parameters/8' + post: + operationId: ThirdpartyRequestsTransactionsPost + summary: ThirdpartyRequestsTransactionsPost + description: The HTTP request POST `/thirdpartyRequests/transactions` is used by a PISP to initiate a 3rd party Transaction request with a DFSP + tags: + - thirdpartyRequests + parameters: + - $ref: '#/paths/~1consents/post/parameters/0' + - $ref: '#/paths/~1consents/post/parameters/1' + requestBody: + description: Transaction request to be created. + required: true + content: + application/json: + schema: + title: ThirdpartyRequestsTransactionsPostRequest + type: object + description: The object sent in the POST /thirdpartyRequests/transactions request. + properties: + transactionRequestId: + allOf: + - $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/consentRequestId' + description: | + Common ID between the PISP and the Payer DFSP for the transaction request object. The ID should be reused for resends of the same transaction request. A new ID should be generated for each new transaction request. + payee: + allOf: + - title: Party + type: object + description: Data model for the complex type Party. + properties: + partyIdInfo: + $ref: '#/paths/~1thirdpartyRequests~1transactions/post/requestBody/content/application~1json/schema/properties/payer/allOf/0' + merchantClassificationCode: + title: MerchantClassificationCode + type: string + pattern: '^[\d]{1,4}$' + description: 'A limited set of pre-defined numbers. This list would be a limited set of numbers identifying a set of popular merchant types like School Fees, Pubs and Restaurants, Groceries, etc.' + name: + title: PartyName + type: string + minLength: 1 + maxLength: 128 + description: Name of the Party. Could be a real name or a nickname. + personalInfo: + title: PartyPersonalInfo + type: object + description: Data model for the complex type PartyPersonalInfo. + properties: + complexName: + title: PartyComplexName + type: object + description: Data model for the complex type PartyComplexName. + properties: + firstName: + title: FirstName + type: string + minLength: 1 + maxLength: 128 + pattern: '^(?!\s*$)[\p{L}\p{gc=Mark}\p{digit}\p{gc=Connector_Punctuation}\p{Join_Control} .,''''-]{1,128}$' + description: First name of the Party (Name Type). + example: Henrik + middleName: + title: MiddleName + type: string + minLength: 1 + maxLength: 128 + pattern: '^(?!\s*$)[\p{L}\p{gc=Mark}\p{digit}\p{gc=Connector_Punctuation}\p{Join_Control} .,''''-]{1,128}$' + description: Middle name of the Party (Name Type). + example: Johannes + lastName: + title: LastName + type: string + minLength: 1 + maxLength: 128 + pattern: '^(?!\s*$)[\p{L}\p{gc=Mark}\p{digit}\p{gc=Connector_Punctuation}\p{Join_Control} .,''''-]{1,128}$' + description: Last name of the Party (Name Type). + example: Karlsson + dateOfBirth: + title: DateofBirth (type Date) + type: string + pattern: '^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)$' + description: Date of Birth of the Party. + example: '1966-06-16' + required: + - partyIdInfo + description: Information about the Payee in the proposed financial transaction. + payer: + allOf: + - title: PartyIdInfo + type: object + description: Data model for the complex type PartyIdInfo. + properties: + partyIdType: + title: PartyIdType + type: string + enum: + - MSISDN + - EMAIL + - PERSONAL_ID + - BUSINESS + - DEVICE + - ACCOUNT_ID + - IBAN + - ALIAS + - CONSENT + - THIRD_PARTY_LINK + description: | + Below are the allowed values for the enumeration. + - MSISDN - An MSISDN (Mobile Station International Subscriber Directory + Number, that is, the phone number) is used as reference to a participant. + The MSISDN identifier should be in international format according to the + [ITU-T E.164 standard](https://www.itu.int/rec/T-REC-E.164/en). + Optionally, the MSISDN may be prefixed by a single plus sign, indicating the + international prefix. + - EMAIL - An email is used as reference to a + participant. The format of the email should be according to the informational + [RFC 3696](https://tools.ietf.org/html/rfc3696). + - PERSONAL_ID - A personal identifier is used as reference to a participant. + Examples of personal identification are passport number, birth certificate + number, and national registration number. The identifier number is added in + the PartyIdentifier element. The personal identifier type is added in the + PartySubIdOrType element. + - BUSINESS - A specific Business (for example, an organization or a company) + is used as reference to a participant. The BUSINESS identifier can be in any + format. To make a transaction connected to a specific username or bill number + in a Business, the PartySubIdOrType element should be used. + - DEVICE - A specific device (for example, a POS or ATM) ID connected to a + specific business or organization is used as reference to a Party. + For referencing a specific device under a specific business or organization, + use the PartySubIdOrType element. + - ACCOUNT_ID - A bank account number or FSP account ID should be used as + reference to a participant. The ACCOUNT_ID identifier can be in any format, + as formats can greatly differ depending on country and FSP. + - IBAN - A bank account number or FSP account ID is used as reference to a + participant. The IBAN identifier can consist of up to 34 alphanumeric + characters and should be entered without whitespace. + - ALIAS An alias is used as reference to a participant. The alias should be + created in the FSP as an alternative reference to an account owner. + Another example of an alias is a username in the FSP system. + The ALIAS identifier can be in any format. It is also possible to use the + PartySubIdOrType element for identifying an account under an Alias defined + by the PartyIdentifier. + - CONSENT - A Consent represents an agreement between a PISP, a Customer and + a DFSP which allows the PISP permission to perform actions on behalf of the + customer. A Consent has an authoritative source: either the DFSP who issued + the Consent, or an Auth Service which administers the Consent. + - THIRD_PARTY_LINK - A Third Party Link represents an agreement between a PISP, + a DFSP, and a specific Customer's account at the DFSP. The content of the link + is created by the DFSP at the time when it gives permission to the PISP for + specific access to a given account. + example: PERSONAL_ID + partyIdentifier: + title: PartyIdentifier + type: string + minLength: 1 + maxLength: 128 + description: Identifier of the Party. + example: '16135551212' + partySubIdOrType: + title: PartySubIdOrType + type: string + minLength: 1 + maxLength: 128 + description: 'Either a sub-identifier of a PartyIdentifier, or a sub-type of the PartyIdType, normally a PersonalIdentifierType.' + fspId: + title: FspId + type: string + minLength: 1 + maxLength: 32 + description: FSP identifier. + extensionList: + $ref: '#/paths/~1thirdpartyRequests~1authorizations/post/requestBody/content/application~1json/schema/properties/extensionList' + required: + - partyIdType + - partyIdentifier + description: Information about the Payer in the proposed financial transaction. + amountType: + allOf: + - title: AmountType + type: string + enum: + - SEND + - RECEIVE + description: |- + Below are the allowed values for the enumeration AmountType. + - SEND - Amount the Payer would like to send, that is, the amount that should be withdrawn from the Payer account including any fees. + - RECEIVE - Amount the Payer would like the Payee to receive, that is, the amount that should be sent to the receiver exclusive of any fees. + example: RECEIVE + description: 'SEND for sendAmount, RECEIVE for receiveAmount.' + amount: + allOf: + - title: Money + type: object + description: Data model for the complex type Money. + properties: + currency: + $ref: '#/paths/~1accounts~1%7BID%7D/put/requestBody/content/application~1json/schema/properties/accountList/items/properties/currency' + amount: + title: Amount + type: string + pattern: '^([0]|([1-9][0-9]{0,17}))([.][0-9]{0,3}[1-9])?$' + description: 'The API data type Amount is a JSON String in a canonical format that is restricted by a regular expression for interoperability reasons. This pattern does not allow any trailing zeroes at all, but allows an amount without a minor currency unit. It also only allows four digits in the minor currency unit; a negative value is not allowed. Using more than 18 digits in the major currency unit is not allowed.' + example: '123.45' + required: + - currency + - amount + description: Requested amount to be transferred from the Payer to Payee. + transactionType: + allOf: + - $ref: '#/paths/~1thirdpartyRequests~1authorizations/post/requestBody/content/application~1json/schema/properties/transactionType' + description: Type of transaction. + note: + type: string + minLength: 1 + maxLength: 256 + description: A memo that will be attached to the transaction. + expiration: + type: string + description: | + Date and time until when the transaction request is valid. It can be set to get a quick failure in case the peer FSP takes too long to respond. + example: '2016-05-24T08:38:08.699-04:00' + required: + - transactionRequestId + - payee + - payer + - amountType + - amount + - transactionType + - expiration + responses: + '202': + $ref: '#/paths/~1consents/post/responses/202' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + '/thirdpartyRequests/transactions/{ID}': + parameters: + - $ref: '#/paths/~1accounts~1%7BID%7D/parameters/0' + - $ref: '#/paths/~1consents/parameters/0' + - $ref: '#/paths/~1consents/parameters/1' + - $ref: '#/paths/~1consents/parameters/2' + - $ref: '#/paths/~1consents/parameters/3' + - $ref: '#/paths/~1consents/parameters/4' + - $ref: '#/paths/~1consents/parameters/5' + - $ref: '#/paths/~1consents/parameters/6' + - $ref: '#/paths/~1consents/parameters/7' + - $ref: '#/paths/~1consents/parameters/8' + get: + tags: + - thirdpartyRequests + - sampled + operationId: GetThirdpartyTransactionRequests + summary: GetThirdpartyTransactionRequests + description: | + The HTTP request `GET /thirdpartyRequests/transactions/{ID}` is used to request the + retrieval of a third party transaction request. + parameters: + - $ref: '#/paths/~1consents/post/parameters/0' + responses: + '202': + $ref: '#/paths/~1consents/post/responses/202' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + put: + tags: + - thirdpartyRequests + - sampled + operationId: UpdateThirdPartyTransactionRequests + summary: UpdateThirdPartyTransactionRequests + description: | + The HTTP request `PUT /thirdpartyRequests/transactions/{ID}` is used by the DFSP to inform the client about + the status of a previously requested thirdparty transaction request. + + Switch(Thirdparty API Adapter) -> PISP + parameters: + - $ref: '#/paths/~1consents/post/parameters/1' + requestBody: + required: true + content: + application/json: + schema: + title: ThirdpartyRequestsTransactionsIDPutResponse + type: object + description: 'The object sent in the PUT /thirdPartyRequests/transactions/{ID} request.' + properties: + transactionRequestState: + title: TransactionRequestState + type: string + enum: + - RECEIVED + - PENDING + - ACCEPTED + - REJECTED + description: |- + Below are the allowed values for the enumeration. + - RECEIVED - Payer FSP has received the transaction from the Payee FSP. + - PENDING - Payer FSP has sent the transaction request to the Payer. + - ACCEPTED - Payer has approved the transaction. + - REJECTED - Payer has rejected the transaction. + example: RECEIVED + required: + - transactionRequestState + example: + transactionRequestState: RECEIVED + responses: + '200': + $ref: '#/paths/~1accounts~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + patch: + operationId: NotifyThirdpartyTransactionRequests + summary: NotifyThirdpartyTransactionRequests + description: | + The HTTP request `PATCH /thirdpartyRequests/transactions/{ID}` is used to + notify a thirdparty of the outcome of a transaction request. + + Switch(Thirdparty API Adapter) -> PISP + tags: + - thirdpartyRequests + parameters: + - $ref: '#/paths/~1consents/post/parameters/0' + - $ref: '#/paths/~1consents/post/parameters/1' + requestBody: + required: true + content: + application/json: + schema: + title: ThirdpartyRequestsTransactionsIDPatchResponse + type: object + description: 'The object sent in the PATCH /thirdpartyRequests/transactions/{ID} callback.' + properties: + completedTimestamp: + title: DateTime + type: string + pattern: '^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:(\.\d{3}))(?:Z|[+-][01]\d:[0-5]\d)$' + description: 'The API data type DateTime is a JSON String in a lexical format that is restricted by a regular expression for interoperability reasons. The format is according to [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html), expressed in a combined date, time and time zone format. A more readable version of the format is yyyy-MM-ddTHH:mm:ss.SSS[-HH:MM]. Examples are "2016-05-24T08:38:08.699-04:00", "2016-05-24T08:38:08.699Z" (where Z indicates Zulu time zone, same as UTC).' + example: '2016-05-24T08:38:08.699-04:00' + transactionRequestState: + $ref: '#/paths/~1thirdpartyRequests~1transactions~1%7BID%7D/put/requestBody/content/application~1json/schema/properties/transactionRequestState' + transactionState: + title: TransactionState + type: string + enum: + - RECEIVED + - PENDING + - COMPLETED + - REJECTED + description: |- + Below are the allowed values for the enumeration. + - RECEIVED - Payee FSP has received the transaction from the Payer FSP. + - PENDING - Payee FSP has validated the transaction. + - COMPLETED - Payee FSP has successfully performed the transaction. + - REJECTED - Payee FSP has failed to perform the transaction. + example: RECEIVED + required: + - transactionRequestState + - transactionState + example: + transactionRequestState: ACCEPTED + transactionState: COMMITTED + responses: + '200': + $ref: '#/paths/~1accounts~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + '/thirdpartyRequests/transactions/{ID}/error': + parameters: + - $ref: '#/paths/~1accounts~1%7BID%7D/parameters/0' + - $ref: '#/paths/~1consents/parameters/0' + - $ref: '#/paths/~1consents/parameters/1' + - $ref: '#/paths/~1consents/parameters/2' + - $ref: '#/paths/~1consents/parameters/3' + - $ref: '#/paths/~1consents/parameters/4' + - $ref: '#/paths/~1consents/parameters/5' + - $ref: '#/paths/~1consents/parameters/6' + - $ref: '#/paths/~1consents/parameters/7' + - $ref: '#/paths/~1consents/parameters/8' + put: + tags: + - thirdpartyRequests + - sampled + operationId: ThirdpartyTransactionRequestsError + summary: ThirdpartyTransactionRequestsError + description: | + If the server is unable to find the transaction request, or another processing error occurs, + the error callback `PUT /thirdpartyRequests/transactions/{ID}/error` is used. + The `{ID}` in the URI should contain the `transactionRequestId` that was used for the creation of + the thirdparty transaction request. + parameters: + - $ref: '#/paths/~1consents/post/parameters/1' + requestBody: + description: Error information returned. + required: true + content: + application/json: + schema: + $ref: '#/paths/~1accounts~1%7BID%7D~1error/put/requestBody/content/application~1json/schema' + responses: + '200': + $ref: '#/paths/~1accounts~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + /thirdpartyRequests/verifications: + parameters: + - $ref: '#/paths/~1consents/parameters/0' + - $ref: '#/paths/~1consents/parameters/1' + - $ref: '#/paths/~1consents/parameters/2' + - $ref: '#/paths/~1consents/parameters/3' + - $ref: '#/paths/~1consents/parameters/4' + - $ref: '#/paths/~1consents/parameters/5' + - $ref: '#/paths/~1consents/parameters/6' + - $ref: '#/paths/~1consents/parameters/7' + - $ref: '#/paths/~1consents/parameters/8' + post: + tags: + - thirdpartyRequests + - sampled + operationId: PostThirdpartyRequestsVerifications + summary: PostThirdpartyRequestsVerifications + description: | + The HTTP request `POST /thirdpartyRequests/verifications` is used by the DFSP to verify a third party authorization. + parameters: + - $ref: '#/paths/~1consents/post/parameters/0' + - $ref: '#/paths/~1consents/post/parameters/1' + requestBody: + description: The thirdparty authorization details to verify + required: true + content: + application/json: + schema: + oneOf: + - title: ThirdpartyRequestsVerificationsPostRequestFIDO + type: object + description: The object sent in the POST /thirdpartyRequests/verifications request. + properties: + verificationRequestId: + allOf: + - $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/consentRequestId' + challenge: + type: string + description: Base64 encoded bytes - The challenge generated by the DFSP. + consentId: + allOf: + - $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/consentRequestId' + description: | + The id of the stored consent object that contains the credential with which to verify + the signed challenge against. + signedPayloadType: + title: SignedPayloadTypeFIDO + type: string + enum: + - FIDO + description: Describes a challenge that has been signed with FIDO Attestation flows + fidoSignedPayload: + title: FIDOPublicKeyCredentialAssertion + type: object + description: | + An object sent in a `PUT /thirdpartyRequests/authorization/{ID}` request. + based mostly on: https://webauthn.guide/#authentication + AuthenticatorAssertionResponse + properties: + id: + type: string + description: | + credential id: identifier of pair of keys, base64 encoded + https://w3c.github.io/webauthn/#ref-for-dom-credential-id + minLength: 59 + maxLength: 118 + rawId: + type: string + description: | + raw credential id: identifier of pair of keys, base64 encoded. + minLength: 59 + maxLength: 118 + response: + type: object + description: | + AuthenticatorAssertionResponse + properties: + authenticatorData: + type: string + description: | + Authenticator data object. + minLength: 49 + maxLength: 256 + clientDataJSON: + type: string + description: | + JSON string with client data. + minLength: 121 + maxLength: 512 + signature: + type: string + description: | + The signature generated by the private key associated with this credential. + minLength: 59 + maxLength: 256 + userHandle: + type: string + description: | + This field is optionally provided by the authenticator, and + represents the user.id that was supplied during registration. + minLength: 1 + maxLength: 88 + required: + - authenticatorData + - clientDataJSON + - signature + additionalProperties: false + type: + type: string + description: 'response type, we need only the type of public-key' + enum: + - public-key + required: + - id + - rawId + - response + - type + additionalProperties: false + required: + - verificationRequestId + - challenge + - consentId + - signedPayloadType + - fidoSignedPayload + - title: ThirdpartyRequestsVerificationsPostRequestGeneric + type: object + description: The object sent in the POST /thirdpartyRequests/verifications request. + properties: + verificationRequestId: + allOf: + - $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/consentRequestId' + challenge: + type: string + description: Base64 encoded bytes - The challenge generated by the DFSP. + consentId: + allOf: + - $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/consentRequestId' + description: | + The id of the stored consent object that contains the credential with which to verify + the signed challenge against. + signedPayloadType: + title: SignedPayloadTypeGeneric + type: string + enum: + - GENERIC + description: Describes a challenge that has been signed with a private key + genericSignedPayload: + $ref: '#/paths/~1consentRequests~1%7BID%7D/patch/requestBody/content/application~1json/schema/properties/authToken' + required: + - verificationRequestId + - challenge + - consentId + - signedPayloadType + - genericSignedPayload + responses: + '202': + $ref: '#/paths/~1consents/post/responses/202' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + '/thirdpartyRequests/verifications/{ID}': + parameters: + - $ref: '#/paths/~1accounts~1%7BID%7D/parameters/0' + - $ref: '#/paths/~1consents/parameters/0' + - $ref: '#/paths/~1consents/parameters/1' + - $ref: '#/paths/~1consents/parameters/2' + - $ref: '#/paths/~1consents/parameters/3' + - $ref: '#/paths/~1consents/parameters/4' + - $ref: '#/paths/~1consents/parameters/5' + - $ref: '#/paths/~1consents/parameters/6' + - $ref: '#/paths/~1consents/parameters/7' + - $ref: '#/paths/~1consents/parameters/8' + get: + tags: + - thirdpartyRequests + - sampled + operationId: GetThirdpartyRequestsVerificationsById + summary: GetThirdpartyRequestsVerificationsById + description: | + The HTTP request `/thirdpartyRequests/verifications/{ID}` is used to get + information regarding a previously created or requested authorization. The *{ID}* + in the URI should contain the verification request ID + parameters: + - $ref: '#/paths/~1consents/post/parameters/0' + responses: + '202': + $ref: '#/paths/~1consents/post/responses/202' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + put: + tags: + - thirdpartyRequests + - sampled + operationId: PutThirdpartyRequestsVerificationsById + summary: PutThirdpartyRequestsVerificationsById + description: | + The HTTP request `PUT /thirdpartyRequests/verifications/{ID}` is used by the Auth-Service to inform + the DFSP of a successful result in validating the verification of a Thirdparty Transaction Request. + + If the validation fails, The Auth-Service MUST use `PUT /thirdpartyRequests/verifications/{ID}/error` + instead. + parameters: + - $ref: '#/paths/~1consents/post/parameters/1' + requestBody: + description: The result of validating the Thirdparty Transaction Request + required: true + content: + application/json: + schema: + title: ThirdpartyRequestsVerificationsIDPutResponse + type: object + description: 'The object sent in the PUT /thirdpartyRequests/verifications/{ID} request.' + properties: + authenticationResponse: + type: string + enum: + - VERIFIED + description: The verification passed + required: + - authenticationResponse + example: + authenticationResponse: VERIFIED + responses: + '200': + $ref: '#/paths/~1accounts~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' + '/thirdpartyRequests/verifications/{ID}/error': + parameters: + - $ref: '#/paths/~1accounts~1%7BID%7D/parameters/0' + - $ref: '#/paths/~1consents/parameters/0' + - $ref: '#/paths/~1consents/parameters/1' + - $ref: '#/paths/~1consents/parameters/2' + - $ref: '#/paths/~1consents/parameters/3' + - $ref: '#/paths/~1consents/parameters/4' + - $ref: '#/paths/~1consents/parameters/5' + - $ref: '#/paths/~1consents/parameters/6' + - $ref: '#/paths/~1consents/parameters/7' + - $ref: '#/paths/~1consents/parameters/8' + put: + tags: + - thirdpartyRequests + - sampled + operationId: PutThirdpartyRequestsVerificationsByIdAndError + summary: PutThirdpartyRequestsVerificationsByIdAndError + description: | + The HTTP request `PUT /thirdpartyRequests/verifications/{ID}/error` is used by the Auth-Service to inform + the DFSP of a failure in validating or looking up the verification of a Thirdparty Transaction Request. + parameters: + - $ref: '#/paths/~1consents/post/parameters/1' + requestBody: + description: Error information returned. + required: true + content: + application/json: + schema: + $ref: '#/paths/~1accounts~1%7BID%7D~1error/put/requestBody/content/application~1json/schema' + responses: + '200': + $ref: '#/paths/~1accounts~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1consents/post/responses/400' + '401': + $ref: '#/paths/~1consents/post/responses/401' + '403': + $ref: '#/paths/~1consents/post/responses/403' + '404': + $ref: '#/paths/~1consents/post/responses/404' + '405': + $ref: '#/paths/~1consents/post/responses/405' + '406': + $ref: '#/paths/~1consents/post/responses/406' + '501': + $ref: '#/paths/~1consents/post/responses/501' + '503': + $ref: '#/paths/~1consents/post/responses/503' diff --git a/docs/fr/technical/api/thirdparty/thirdparty-pisp-v1.0.yaml b/docs/fr/technical/api/thirdparty/thirdparty-pisp-v1.0.yaml new file mode 100644 index 000000000..cb9f52f27 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/thirdparty-pisp-v1.0.yaml @@ -0,0 +1,2830 @@ +openapi: 3.0.1 +info: + title: Mojaloop Third Party API (PISP) + version: '1.0' + description: | + A Mojaloop API for Payment Initiation Service Providers (PISPs) to perform Third Party functions on DFSPs' User's accounts. + DFSPs who want to enable Payment Initiation Service Providers (PISPs) should implement the accompanying API - Mojaloop Third Party API (DFSP) instead. + license: + name: Open API for FSP Interoperability (FSPIOP) (Implementation Friendly Version) + url: 'https://github.com/mojaloop/mojaloop-specification/blob/master/LICENSE.md' +servers: + - url: / +paths: + '/accounts/{ID}': + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/1' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/2' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/3' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/4' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/5' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/6' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/7' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/8' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/9' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/10' + get: + operationId: GetAccountsByUserId + summary: GetAccountsByUserId + description: | + The HTTP request `GET /accounts/{ID}` is used to retrieve the list of potential accounts available for linking. + tags: + - accounts + - sampled + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/parameters/0' + responses: + '202': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/202' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + put: + description: | + The HTTP request `PUT /accounts/{ID}` is used to return the list of potential accounts available for linking + operationId: UpdateAccountsByUserId + summary: UpdateAccountsByUserId + tags: + - accounts + - sampled + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + requestBody: + required: true + content: + application/json: + schema: + title: AccountsIDPutResponse + type: object + description: 'The object sent in a `PUT /accounts/{ID}` request.' + properties: + accountList: + description: Information about the accounts that the DFSP associates with the identifier sent by the PISP + type: array + items: + title: Account + type: object + description: Data model for the complex type Account. + properties: + accountNickname: + title: Name + type: string + pattern: '^(?!\s*$)[\w .,''-]{1,128}$' + description: |- + The API data type Name is a JSON String, restricted by a regular expression to avoid characters which are generally not used in a name. + + Regular Expression - The regular expression for restricting the Name type is "^(?!\s*$)[\w .,'-]{1,128}$". The restriction does not allow a string consisting of whitespace only, all Unicode characters are allowed, as well as the period (.) (apostrophe (‘), dash (-), comma (,) and space characters ( ). + + **Note:** In some programming languages, Unicode support must be specifically enabled. For example, if Java is used, the flag UNICODE_CHARACTER_CLASS must be enabled to allow Unicode characters. + address: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/scopes/items/properties/address' + currency: + title: Currency + description: 'The currency codes defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html) as three-letter alphabetic codes are used as the standard naming representation for currencies.' + type: string + minLength: 3 + maxLength: 3 + enum: + - AED + - AFN + - ALL + - AMD + - ANG + - AOA + - ARS + - AUD + - AWG + - AZN + - BAM + - BBD + - BDT + - BGN + - BHD + - BIF + - BMD + - BND + - BOB + - BRL + - BSD + - BTN + - BWP + - BYN + - BZD + - CAD + - CDF + - CHF + - CLP + - CNY + - COP + - CRC + - CUC + - CUP + - CVE + - CZK + - DJF + - DKK + - DOP + - DZD + - EGP + - ERN + - ETB + - EUR + - FJD + - FKP + - GBP + - GEL + - GGP + - GHS + - GIP + - GMD + - GNF + - GTQ + - GYD + - HKD + - HNL + - HRK + - HTG + - HUF + - IDR + - ILS + - IMP + - INR + - IQD + - IRR + - ISK + - JEP + - JMD + - JOD + - JPY + - KES + - KGS + - KHR + - KMF + - KPW + - KRW + - KWD + - KYD + - KZT + - LAK + - LBP + - LKR + - LRD + - LSL + - LYD + - MAD + - MDL + - MGA + - MKD + - MMK + - MNT + - MOP + - MRO + - MUR + - MVR + - MWK + - MXN + - MYR + - MZN + - NAD + - NGN + - NIO + - NOK + - NPR + - NZD + - OMR + - PAB + - PEN + - PGK + - PHP + - PKR + - PLN + - PYG + - QAR + - RON + - RSD + - RUB + - RWF + - SAR + - SBD + - SCR + - SDG + - SEK + - SGD + - SHP + - SLL + - SOS + - SPL + - SRD + - STD + - SVC + - SYP + - SZL + - THB + - TJS + - TMT + - TND + - TOP + - TRY + - TTD + - TVD + - TWD + - TZS + - UAH + - UGX + - USD + - UYU + - UZS + - VEF + - VND + - VUV + - WST + - XAF + - XCD + - XDR + - XOF + - XPF + - XTS + - XXX + - YER + - ZAR + - ZMW + - ZWD + required: + - accountNickname + - id + - currency + required: + - accounts + example: + - accountNickname: dfspa.user.nickname1 + id: dfspa.username.1234 + currency: ZAR + - accountNickname: dfspa.user.nickname2 + id: dfspa.username.5678 + currency: USD + responses: + '200': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + '/accounts/{ID}/error': + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/1' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/2' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/3' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/4' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/5' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/6' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/7' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/8' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/9' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/10' + put: + description: | + The HTTP request `PUT /accounts/{ID}/error` is used to return error information + operationId: UpdateAccountsByUserIdError + summary: UpdateAccountsByUserIdError + tags: + - accounts + - sampled + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + requestBody: + description: Details of the error returned. + required: true + content: + application/json: + schema: + title: ErrorInformationObject + type: object + description: Data model for the complex type object that contains ErrorInformation. + properties: + errorInformation: + title: ErrorInformation + type: object + description: Data model for the complex type ErrorInformation. + properties: + errorCode: + title: ErrorCode + type: string + pattern: '^[1-9]\d{3}$' + description: 'The API data type ErrorCode is a JSON String of four characters, consisting of digits only. Negative numbers are not allowed. A leading zero is not allowed. Each error code in the API is a four-digit number, for example, 1234, where the first number (1 in the example) represents the high-level error category, the second number (2 in the example) represents the low-level error category, and the last two numbers (34 in the example) represent the specific error.' + example: '5100' + errorDescription: + title: ErrorDescription + type: string + minLength: 1 + maxLength: 128 + description: Error description string. + extensionList: + $ref: '#/paths/~1thirdpartyRequests~1authorizations/post/requestBody/content/application~1json/schema/properties/extensionList' + required: + - errorCode + - errorDescription + required: + - errorInformation + responses: + '200': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + /consentRequests: + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/2' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/3' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/4' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/5' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/6' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/7' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/8' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/9' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/10' + post: + tags: + - consentRequests + - sampled + operationId: CreateConsentRequest + summary: CreateConsentRequest + description: | + The HTTP request **POST /consentRequests** is used to request a DFSP to grant access to one or more + accounts owned by a customer of the DFSP for the PISP who sends the request. + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/parameters/0' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + requestBody: + description: The consentRequest to create + required: true + content: + application/json: + schema: + title: ConsentRequestsPostRequest + type: object + description: The object sent in a `POST /consentRequests` request. + properties: + consentRequestId: + title: CorrelationId + type: string + pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$' + description: 'Identifier that correlates all messages of the same sequence. The API data type UUID (Universally Unique Identifier) is a JSON String in canonical format, conforming to [RFC 4122](https://tools.ietf.org/html/rfc4122), that is restricted by a regular expression for interoperability reasons. A UUID is always 36 characters long, 32 hexadecimal symbols and 4 dashes (‘-‘).' + example: b51ec534-ee48-4575-b6a9-ead2955b8069 + userId: + type: string + description: 'The identifier used in the **GET /accounts/**_{ID}_. Used by the DFSP to correlate an account lookup to a `consentRequest`' + minLength: 1 + maxLength: 128 + scopes: + type: array + minLength: 1 + maxLength: 256 + items: + title: Scope + type: object + description: Scope + Account Identifier mapping for a Consent. + properties: + address: + title: AccountAddress + type: string + description: | + An address which can be used to identify the account. + pattern: '^([0-9A-Za-z_~\-\.]+[0-9A-Za-z_~\-])$' + minLength: 1 + maxLength: 1023 + actions: + type: array + minItems: 1 + maxItems: 32 + items: + title: ScopeAction + type: string + enum: + - ACCOUNTS_GET_BALANCE + - ACCOUNTS_TRANSFER + - ACCOUNTS_STATEMENT + description: | + The permissions allowed on a given account by a DFSP as defined in + a consent object + - ACCOUNTS_GET_BALANCE: PISP can request a balance for the linked account + - ACCOUNTS_TRANSFER: PISP can request a transfer of funds from the linked account in the DFSP + - ACCOUNTS_STATEMENT: PISP can request a statement of individual transactions on a user’s account + required: + - address + - actions + authChannels: + type: array + minLength: 1 + maxLength: 256 + items: + title: ConsentRequestChannelType + type: string + enum: + - WEB + - OTP + description: | + The auth channel being used for the consentRequest. + - "WEB" - The Web auth channel. + - "OTP" - The OTP auth channel. + callbackUri: + title: Uri + type: string + pattern: '^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?' + minLength: 1 + maxLength: 512 + description: | + The API data type Uri is a JSON string in a canonical format that is restricted by a regular expression for interoperability reasons. + required: + - consentRequestId + - userId + - scopes + - authChannels + - callbackUri + responses: + '202': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/202' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + '/consentRequests/{ID}': + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/1' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/2' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/3' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/4' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/5' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/6' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/7' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/8' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/9' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/10' + get: + operationId: GetConsentRequestsById + summary: GetConsentRequestsById + description: | + The HTTP request `GET /consentRequests/{ID}` is used to get information about a previously + requested consent. The *{ID}* in the URI should contain the consentRequestId that was assigned to the + request by the PISP when the PISP originated the request. + tags: + - consentRequests + - sampled + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/parameters/0' + responses: + '202': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/202' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + put: + tags: + - consentRequests + - sampled + operationId: UpdateConsentRequest + summary: UpdateConsentRequest + description: | + A DFSP uses this callback to (1) inform the PISP that the consentRequest has been accepted, + and (2) communicate to the PISP which `authChannel` it should use to authenticate their user + with. + + When a PISP requests a series of permissions from a DFSP on behalf of a DFSP’s customer, not all + the permissions requested may be granted by the DFSP. Conversely, the out-of-band authorization + process may result in additional privileges being granted by the account holder to the PISP. The + **PUT /consentRequests/**_{ID}_ resource returns the current state of the permissions relating to a + particular authorization request. + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + requestBody: + required: true + content: + application/json: + schema: + oneOf: + - title: ConsentRequestsIDPutResponseWeb + type: object + description: | + The object sent in a `PUT /consentRequests/{ID}` request. + + Schema used in the request consent phase of the account linking web flow, + the result is the PISP being instructed on a specific URL where this + supposed user should be redirected. This URL should be a place where + the user can prove their identity (e.g., by logging in). + properties: + scopes: + type: array + minLength: 1 + maxLength: 256 + items: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/scopes/items' + authChannels: + type: array + minLength: 1 + maxLength: 1 + items: + title: ConsentRequestChannelTypeWeb + type: string + enum: + - WEB + description: | + The web auth channel being used for PUT consentRequest/{ID} request. + callbackUri: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/callbackUri' + authUri: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/callbackUri' + required: + - scopes + - authChannels + - callbackUri + - authUri + additionalProperties: false + - title: ConsentRequestsIDPutResponseOTP + type: object + description: | + The object sent in a `PUT /consentRequests/{ID}` request. + + Schema used in the request consent phase of the account linking OTP/SMS flow. + properties: + scopes: + type: array + minLength: 1 + maxLength: 256 + items: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/scopes/items' + authChannels: + type: array + minLength: 1 + maxLength: 1 + items: + title: ConsentRequestChannelTypeOTP + type: string + enum: + - OTP + description: | + The OTP auth channel being used for PUT consentRequest/{ID} request. + callbackUri: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/callbackUri' + required: + - scopes + - authChannels + additionalProperties: false + responses: + '202': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/202' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + patch: + tags: + - consentRequests + - sampled + operationId: PatchConsentRequest + summary: PatchConsentRequest + description: | + After the user completes an out-of-band authorization with the DFSP, the PISP will receive a token which they can use to prove to the DFSP that the user trusts this PISP. + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/parameters/0' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + requestBody: + required: true + content: + application/json: + schema: + title: ConsentRequestsIDPatchRequest + type: object + description: 'The object sent in a `PATCH /consentRequests/{ID}` request.' + properties: + authToken: + type: string + pattern: '^[A-Za-z0-9-_]+[=]{0,2}$' + description: 'The API data type BinaryString is a JSON String. The string is a base64url encoding of a string of raw bytes, where padding (character ‘=’) is added at the end of the data if needed to ensure that the string is a multiple of 4 characters. The length restriction indicates the allowed number of characters.' + required: + - authToken + responses: + '202': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/202' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + '/consentRequests/{ID}/error': + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/1' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/2' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/3' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/4' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/5' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/6' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/7' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/8' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/9' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/10' + put: + tags: + - consentRequests + operationId: NotifyErrorConsentRequests + summary: NotifyErrorConsentRequests + description: | + DFSP responds to the PISP if something went wrong with validating an OTP or secret. + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + requestBody: + description: Error information returned. + required: true + content: + application/json: + schema: + $ref: '#/paths/~1accounts~1%7BID%7D~1error/put/requestBody/content/application~1json/schema' + responses: + '200': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + /consents: + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/2' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/3' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/4' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/5' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/6' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/7' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/8' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/9' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/10' + post: + tags: + - consents + - sampled + operationId: PostConsents + summary: PostConsents + description: | + The **POST /consents** request is used to request the creation of a consent for interactions between a PISP and the DFSP who owns the account which a PISP’s customer wants to allow the PISP access to. + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/parameters/0' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + requestBody: + required: true + content: + application/json: + schema: + oneOf: + - title: ConsentPostRequestAUTH + type: object + description: | + The object sent in a `POST /consents` request to the Auth-Service + by a DFSP to store registered Consent and credential + properties: + consentId: + allOf: + - $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/consentRequestId' + description: | + Common ID between the PISP and FSP for the Consent object + determined by the DFSP who creates the Consent. + scopes: + minLength: 1 + maxLength: 256 + type: array + items: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/scopes/items' + credential: + allOf: + - $ref: '#/paths/~1consents~1%7BID%7D/put/requestBody/content/application~1json/schema/oneOf/0/properties/credential' + status: + title: ConsentStatus + type: string + enum: + - ISSUED + - REVOKED + description: |- + Allowed values for the enumeration ConsentStatus + - ISSUED - The consent has been issued by the DFSP + - REVOKED - The consent has been revoked + required: + - consentId + - scopes + - credential + - status + additionalProperties: false + - title: ConsentPostRequestPISP + type: object + description: | + The provisional Consent object sent by the DFSP in `POST /consents`. + properties: + consentId: + allOf: + - $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/consentRequestId' + description: | + Common ID between the PISP and the Payer DFSP for the consent object. The ID + should be reused for resends of the same consent. A new ID should be generated + for each new consent. + consentRequestId: + allOf: + - $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/consentRequestId' + description: | + The ID given to the original consent request on which this consent is based. + scopes: + type: array + minLength: 1 + maxLength: 256 + items: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/scopes/items' + status: + $ref: '#/paths/~1consents/post/requestBody/content/application~1json/schema/oneOf/0/properties/status' + required: + - consentId + - consentRequestId + - scopes + - status + responses: + '202': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/202' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + '/consents/{ID}': + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/1' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/2' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/3' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/4' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/5' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/6' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/7' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/8' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/9' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/10' + get: + description: | + The **GET /consents/**_{ID}_ resource allows a party to enquire after the status of a consent. The *{ID}* used in the URI of the request should be the consent request ID which was used to identify the consent when it was created. + tags: + - consents + operationId: GetConsent + summary: GetConsent + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/parameters/0' + responses: + '202': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/202' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + patch: + description: | + The HTTP request `PATCH /consents/{ID}` is used + + - In account linking in the Credential Registration phase. Used by a DFSP + to notify a PISP a credential has been verified and registered with an + Auth service. + + - In account unlinking by a hub hosted auth service and by DFSPs + in non-hub hosted scenarios to notify participants of a consent being revoked. + + Called by a `auth-service` to notify a PISP and DFSP of consent status in hub hosted scenario. + Called by a `DFSP` to notify a PISP of consent status in non-hub hosted scenario. + tags: + - consents + - sampled + operationId: PatchConsentByID + summary: PatchConsentByID + requestBody: + required: true + content: + application/json: + schema: + oneOf: + - title: ConsentsIDPatchResponseVerified + description: | + PATCH /consents/{ID} request object. + + Sent by the DFSP to the PISP when a consent is verified. + Used in the "Register Credential" part of the Account linking flow. + type: object + properties: + credential: + type: object + properties: + status: + title: CredentialStatus + type: string + enum: + - VERIFIED + description: | + The status of the Credential. + - "VERIFIED" - The Credential is valid and verified. + required: + - status + required: + - credential + - title: ConsentsIDPatchResponseRevoked + description: | + PATCH /consents/{ID} request object. + + Sent to both the PISP and DFSP when a consent is revoked. + Used in the "Unlinking" part of the Account Unlinking flow. + type: object + properties: + status: + title: ConsentStatus + type: string + enum: + - REVOKED + description: |- + Allowed values for the enumeration ConsentStatus + - REVOKED - The consent has been revoked + revokedAt: + $ref: '#/paths/~1thirdpartyRequests~1transactions~1%7BID%7D/patch/requestBody/content/application~1json/schema/properties/completedTimestamp' + required: + - status + - revokedAt + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/parameters/0' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + responses: + '200': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + put: + description: | + The HTTP request `PUT /consents/{ID}` is used by the PISP and Auth Service. + + - Called by a `PISP` to after signing a challenge. Sent to an DFSP for verification. + - Called by a `auth-service` to notify a DFSP that a credential has been verified and registered. + tags: + - consents + - sampled + operationId: PutConsentByID + summary: PutConsentByID + requestBody: + required: true + content: + application/json: + schema: + oneOf: + - title: ConsentsIDPutResponseSigned + type: object + description: | + The HTTP request `PUT /consents/{ID}` is used by the PISP to update a Consent with a signed challenge and register a credential. + Called by a `PISP` to after signing a challenge. Sent to a DFSP for verification. + properties: + scopes: + type: array + items: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/scopes/items' + status: + title: ConsentStatus + type: string + enum: + - ISSUED + description: |- + Allowed values for the enumeration ConsentStatus + - ISSUED - The consent has been issued by the DFSP + credential: + title: SignedCredential + type: object + description: | + A credential used to allow a user to prove their identity and access + to an account with a DFSP. + + SignedCredential is a special formatting of the credential to allow us to be + more explicit about the `status` field - it should only ever be PENDING when + updating a credential. + properties: + credentialType: + title: CredentialType + type: string + enum: + - FIDO + - GENERIC + description: | + The type of the Credential. + - "FIDO" - A FIDO public/private keypair + - "GENERIC" - A Generic public/private keypair + status: + title: CredentialStatus + type: string + enum: + - PENDING + description: | + The status of the Credential. + - "PENDING" - The credential has been created, but has not been verified + genericPayload: + title: GenericCredential + type: object + description: | + A publicKey + signature of a challenge for a generic public/private keypair + properties: + publicKey: + $ref: '#/paths/~1consentRequests~1%7BID%7D/patch/requestBody/content/application~1json/schema/properties/authToken' + signature: + $ref: '#/paths/~1consentRequests~1%7BID%7D/patch/requestBody/content/application~1json/schema/properties/authToken' + required: + - publicKey + - signature + additionalProperties: false + fidoPayload: + $ref: '#/paths/~1consents~1%7BID%7D/put/requestBody/content/application~1json/schema/oneOf/1/properties/credential/properties/payload' + required: + - credentialType + - status + additionalProperties: false + required: + - scopes + - credential + additionalProperties: false + - title: ConsentsIDPutResponseVerified + type: object + description: | + The HTTP request `PUT /consents/{ID}` is used by the DFSP or Auth-Service to update a Consent object once it has been Verified. + Called by a `auth-service` to notify a DFSP that a credential has been verified and registered. + properties: + scopes: + type: array + items: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/scopes/items' + status: + $ref: '#/paths/~1consents~1%7BID%7D/put/requestBody/content/application~1json/schema/oneOf/0/properties/status' + credential: + title: VerifiedCredential + type: object + description: | + A credential used to allow a user to prove their identity and access + to an account with a DFSP. + + VerifiedCredential is a special formatting of the credential to allow us to be + more explicit about the `status` field - it should only ever be VERIFIED when + updating a credential. + properties: + credentialType: + $ref: '#/paths/~1consents~1%7BID%7D/put/requestBody/content/application~1json/schema/oneOf/0/properties/credential/properties/credentialType' + status: + type: string + enum: + - VERIFIED + description: 'The Credential is valid, and ready to be used by the PISP.' + payload: + title: FIDOPublicKeyCredentialAttestation + type: object + description: | + A data model representing a FIDO Attestation result. Derived from + [`PublicKeyCredential` Interface](https://w3c.github.io/webauthn/#iface-pkcredential). + + The `PublicKeyCredential` interface represents the below fields with + a Type of Javascript [ArrayBuffer](https://heycam.github.io/webidl/#idl-ArrayBuffer). + For this API, we represent ArrayBuffers as base64 encoded utf-8 strings. + properties: + id: + type: string + description: | + credential id: identifier of pair of keys, base64 encoded + https://w3c.github.io/webauthn/#ref-for-dom-credential-id + minLength: 59 + maxLength: 118 + rawId: + type: string + description: | + raw credential id: identifier of pair of keys, base64 encoded + minLength: 59 + maxLength: 118 + response: + type: object + description: | + AuthenticatorAttestationResponse + properties: + clientDataJSON: + type: string + description: | + JSON string with client data + minLength: 121 + maxLength: 512 + attestationObject: + type: string + description: | + CBOR.encoded attestation object + minLength: 306 + maxLength: 2048 + required: + - clientDataJSON + - attestationObject + additionalProperties: false + type: + type: string + description: 'response type, we need only the type of public-key' + enum: + - public-key + required: + - id + - response + - type + additionalProperties: false + required: + - credentialType + - status + - payload + additionalProperties: false + required: + - scopes + - credential + additionalProperties: false + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + responses: + '200': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/responses/200' + '202': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/202' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + delete: + description: | + Used by PISP, DFSP + + The **DELETE /consents/**_{ID}_ request is used to request the revocation of a previously agreed consent. + For tracing and auditing purposes, the switch should be sure not to delete the consent physically; + instead, information relating to the consent should be marked as deleted and requests relating to the + consent should not be honoured. + operationId: DeleteConsentByID + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/parameters/0' + tags: + - consents + responses: + '202': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/202' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + '/consents/{ID}/error': + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/1' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/2' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/3' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/4' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/5' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/6' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/7' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/8' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/9' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/10' + put: + tags: + - consents + operationId: NotifyErrorConsents + summary: NotifyErrorConsents + description: | + DFSP responds to the PISP if something went wrong with validating or storing consent. + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + requestBody: + description: Error information returned. + required: true + content: + application/json: + schema: + $ref: '#/paths/~1accounts~1%7BID%7D~1error/put/requestBody/content/application~1json/schema' + responses: + '200': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + /thirdpartyRequests/authorizations: + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/2' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/3' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/4' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/5' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/6' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/7' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/8' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/9' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/10' + post: + description: | + The HTTP request **POST /thirdpartyRequests/authorizations** is used to request the validation by a customer for the transfer described in the request. + operationId: PostThirdpartyRequestsAuthorizations + summary: PostThirdpartyRequestsAuthorizations + tags: + - authorizations + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/parameters/0' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + requestBody: + description: Authorization request details + required: true + content: + application/json: + schema: + title: ThirdpartyRequestsAuthorizationsPostRequest + description: POST /thirdpartyRequests/authorizations request object. + type: object + properties: + authorizationRequestId: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/consentRequestId' + transactionRequestId: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/consentRequestId' + challenge: + type: string + description: The challenge that the PISP's client is to sign + transferAmount: + allOf: + - $ref: '#/paths/~1thirdpartyRequests~1transactions/post/requestBody/content/application~1json/schema/properties/amount/allOf/0' + description: The amount that will be debited from the sending customer’s account as a consequence of the transaction. + payeeReceiveAmount: + allOf: + - $ref: '#/paths/~1thirdpartyRequests~1transactions/post/requestBody/content/application~1json/schema/properties/amount/allOf/0' + description: The amount that will be credited to the receiving customer’s account as a consequence of the transaction. + fees: + allOf: + - $ref: '#/paths/~1thirdpartyRequests~1transactions/post/requestBody/content/application~1json/schema/properties/amount/allOf/0' + description: The amount of fees that the paying customer will be charged as part of the transaction. + payer: + allOf: + - $ref: '#/paths/~1thirdpartyRequests~1transactions/post/requestBody/content/application~1json/schema/properties/payer/allOf/0' + description: 'Information about the Payer type, id, sub-type/id, FSP Id in the proposed financial transaction.' + payee: + allOf: + - $ref: '#/paths/~1thirdpartyRequests~1transactions/post/requestBody/content/application~1json/schema/properties/payee/allOf/0' + description: Information about the Payee in the proposed financial transaction. + transactionType: + title: TransactionType + type: object + description: Data model for the complex type TransactionType. + properties: + scenario: + title: TransactionScenario + type: string + enum: + - DEPOSIT + - WITHDRAWAL + - TRANSFER + - PAYMENT + - REFUND + description: |- + Below are the allowed values for the enumeration. + - DEPOSIT - Used for performing a Cash-In (deposit) transaction. In a normal scenario, electronic funds are transferred from a Business account to a Consumer account, and physical cash is given from the Consumer to the Business User. + - WITHDRAWAL - Used for performing a Cash-Out (withdrawal) transaction. In a normal scenario, electronic funds are transferred from a Consumer’s account to a Business account, and physical cash is given from the Business User to the Consumer. + - TRANSFER - Used for performing a P2P (Peer to Peer, or Consumer to Consumer) transaction. + - PAYMENT - Usually used for performing a transaction from a Consumer to a Merchant or Organization, but could also be for a B2B (Business to Business) payment. The transaction could be online for a purchase in an Internet store, in a physical store where both the Consumer and Business User are present, a bill payment, a donation, and so on. + - REFUND - Used for performing a refund of transaction. + example: DEPOSIT + subScenario: + title: TransactionSubScenario + type: string + pattern: '^[A-Z_]{1,32}$' + description: 'Possible sub-scenario, defined locally within the scheme (UndefinedEnum Type).' + example: LOCALLY_DEFINED_SUBSCENARIO + initiator: + title: TransactionInitiator + type: string + enum: + - PAYER + - PAYEE + description: |- + Below are the allowed values for the enumeration. + - PAYER - Sender of funds is initiating the transaction. The account to send from is either owned by the Payer or is connected to the Payer in some way. + - PAYEE - Recipient of the funds is initiating the transaction by sending a transaction request. The Payer must approve the transaction, either automatically by a pre-generated OTP or by pre-approval of the Payee, or by manually approving in his or her own Device. + example: PAYEE + initiatorType: + title: TransactionInitiatorType + type: string + enum: + - CONSUMER + - AGENT + - BUSINESS + - DEVICE + description: |- + Below are the allowed values for the enumeration. + - CONSUMER - Consumer is the initiator of the transaction. + - AGENT - Agent is the initiator of the transaction. + - BUSINESS - Business is the initiator of the transaction. + - DEVICE - Device is the initiator of the transaction. + example: CONSUMER + refundInfo: + title: Refund + type: object + description: Data model for the complex type Refund. + properties: + originalTransactionId: + $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/consentRequestId' + refundReason: + title: RefundReason + type: string + minLength: 1 + maxLength: 128 + description: Reason for the refund. + example: Free text indicating reason for the refund. + required: + - originalTransactionId + balanceOfPayments: + title: BalanceOfPayments + type: string + pattern: '^[1-9]\d{2}$' + description: '(BopCode) The API data type [BopCode](https://www.imf.org/external/np/sta/bopcode/) is a JSON String of 3 characters, consisting of digits only. Negative numbers are not allowed. A leading zero is not allowed.' + example: '123' + required: + - scenario + - initiator + - initiatorType + expiration: + allOf: + - $ref: '#/paths/~1thirdpartyRequests~1transactions~1%7BID%7D/patch/requestBody/content/application~1json/schema/properties/completedTimestamp' + description: 'The time by which the transfer must be completed, set by the payee DFSP.' + extensionList: + title: ExtensionList + type: object + description: 'Data model for the complex type ExtensionList. An optional list of extensions, specific to deployment.' + properties: + extension: + type: array + items: + title: Extension + type: object + description: Data model for the complex type Extension. + properties: + key: + title: ExtensionKey + type: string + minLength: 1 + maxLength: 32 + description: Extension key. + value: + title: ExtensionValue + type: string + minLength: 1 + maxLength: 128 + description: Extension value. + required: + - key + - value + minItems: 1 + maxItems: 16 + description: Number of Extension elements. + required: + - extension + required: + - authorizationRequestId + - transactionRequestId + - challenge + - transferAmount + - payeeReceiveAmount + - fees + - payer + - payee + - transactionType + - expiration + additionalProperties: false + responses: + '202': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/202' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + '/thirdpartyRequests/authorizations/{ID}': + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/1' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/2' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/3' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/4' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/5' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/6' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/7' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/8' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/9' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/10' + get: + description: | + The HTTP request **GET /thirdpartyRequests/authorizations/**_{ID}_ is used to get information relating + to a previously issued authorization request. The *{ID}* in the request should match the + `authorizationRequestId` which was given when the authorization request was created. + operationId: GetThirdpartyRequestsAuthorizationsById + summary: GetThirdpartyRequestsAuthorizationsById + tags: + - authorizations + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/parameters/0' + responses: + '202': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/202' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + put: + description: | + After receiving the **POST /thirdpartyRequests/authorizations**, the PISP will present the details of the + transaction to their user, and request that the client sign the `challenge` field using the credential + they previously registered. + + The signed challenge will be sent back by the PISP in **PUT /thirdpartyRequests/authorizations/**_{ID}_: + operationId: PutThirdpartyRequestsAuthorizationsById + summary: PutThirdpartyRequestsAuthorizationsById + tags: + - authorizations + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + requestBody: + description: Signed authorization object + required: true + content: + application/json: + schema: + oneOf: + - title: ThirdpartyRequestsAuthorizationsIDPutResponseGeneric + type: object + description: 'The object sent in the PUT /thirdpartyRequests/authorizations/{ID} callback.' + properties: + responseType: + title: AuthorizationResponseType + description: | + The customer rejected the terms of the transfer. + type: string + enum: + - REJECTED + required: + - responseType + - title: ThirdpartyRequestsAuthorizationsIDPutResponseFIDO + type: object + description: 'The object sent in the PUT /thirdpartyRequests/authorizations/{ID} callback.' + properties: + responseType: + title: AuthorizationResponseType + description: | + The customer accepted the terms of the transfer + type: string + enum: + - ACCEPTED + signedPayload: + type: object + properties: + signedPayloadType: + title: SignedPayloadTypeFIDO + type: string + enum: + - FIDO + description: Describes a challenge that has been signed with FIDO Attestation flows + fidoSignedPayload: + title: FIDOPublicKeyCredentialAssertion + type: object + description: | + An object sent in a `PUT /thirdpartyRequests/authorization/{ID}` request. + based mostly on: https://webauthn.guide/#authentication + AuthenticatorAssertionResponse + properties: + id: + type: string + description: | + credential id: identifier of pair of keys, base64 encoded + https://w3c.github.io/webauthn/#ref-for-dom-credential-id + minLength: 59 + maxLength: 118 + rawId: + type: string + description: | + raw credential id: identifier of pair of keys, base64 encoded. + minLength: 59 + maxLength: 118 + response: + type: object + description: | + AuthenticatorAssertionResponse + properties: + authenticatorData: + type: string + description: | + Authenticator data object. + minLength: 49 + maxLength: 256 + clientDataJSON: + type: string + description: | + JSON string with client data. + minLength: 121 + maxLength: 512 + signature: + type: string + description: | + The signature generated by the private key associated with this credential. + minLength: 59 + maxLength: 256 + userHandle: + type: string + description: | + This field is optionally provided by the authenticator, and + represents the user.id that was supplied during registration. + minLength: 1 + maxLength: 88 + required: + - authenticatorData + - clientDataJSON + - signature + additionalProperties: false + type: + type: string + description: 'response type, we need only the type of public-key' + enum: + - public-key + required: + - id + - rawId + - response + - type + additionalProperties: false + required: + - signedPayloadType + - fidoSignedPayload + additionalProperties: false + required: + - responseType + - signedPayload + additionalProperties: false + - title: ThirdpartyRequestsAuthorizationsIDPutResponseGeneric + type: object + description: 'The object sent in the PUT /thirdpartyRequests/authorizations/{ID} callback.' + properties: + responseType: + $ref: '#/paths/~1thirdpartyRequests~1authorizations~1%7BID%7D/put/requestBody/content/application~1json/schema/oneOf/1/properties/responseType' + signedPayload: + type: object + properties: + signedPayloadType: + title: SignedPayloadTypeGeneric + type: string + enum: + - GENERIC + description: Describes a challenge that has been signed with a private key + genericSignedPayload: + $ref: '#/paths/~1consentRequests~1%7BID%7D/patch/requestBody/content/application~1json/schema/properties/authToken' + required: + - signedPayloadType + - genericSignedPayload + additionalProperties: false + required: + - responseType + - signedPayload + additionalProperties: false + responses: + '200': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + '/thirdpartyRequests/authorizations/{ID}/error': + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/1' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/2' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/3' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/4' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/5' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/6' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/7' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/8' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/9' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/10' + put: + tags: + - thirdpartyRequests + - sampled + operationId: PutThirdpartyRequestsAuthorizationsByIdAndError + summary: PutThirdpartyRequestsAuthorizationsByIdAndError + description: | + The HTTP request `PUT /thirdpartyRequests/authorizations/{ID}/error` is used by the DFSP or PISP to inform + the other party that something went wrong with a Thirdparty Transaction Authorization Request. + + The PISP may use this to tell the DFSP that the Thirdparty Transaction Authorization Request is invalid or doesn't + match a `transactionRequestId`. + + The DFSP may use this to tell the PISP that the signed challenge returned in `PUT /thirdpartyRequest/authorizations/{ID}` + was invalid. + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + requestBody: + description: Error information returned. + required: true + content: + application/json: + schema: + $ref: '#/paths/~1accounts~1%7BID%7D~1error/put/requestBody/content/application~1json/schema' + responses: + '200': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + /thirdpartyRequests/transactions: + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/2' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/3' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/4' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/5' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/6' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/7' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/8' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/9' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/10' + post: + operationId: ThirdpartyRequestsTransactionsPost + summary: ThirdpartyRequestsTransactionsPost + description: The HTTP request POST `/thirdpartyRequests/transactions` is used by a PISP to initiate a 3rd party Transaction request with a DFSP + tags: + - thirdpartyRequests + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/parameters/0' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + requestBody: + description: Transaction request to be created. + required: true + content: + application/json: + schema: + title: ThirdpartyRequestsTransactionsPostRequest + type: object + description: The object sent in the POST /thirdpartyRequests/transactions request. + properties: + transactionRequestId: + allOf: + - $ref: '#/paths/~1consentRequests/post/requestBody/content/application~1json/schema/properties/consentRequestId' + description: | + Common ID between the PISP and the Payer DFSP for the transaction request object. The ID should be reused for resends of the same transaction request. A new ID should be generated for each new transaction request. + payee: + allOf: + - title: Party + type: object + description: Data model for the complex type Party. + properties: + partyIdInfo: + $ref: '#/paths/~1thirdpartyRequests~1transactions/post/requestBody/content/application~1json/schema/properties/payer/allOf/0' + merchantClassificationCode: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/requestBody/content/application~1json/schema/properties/party/properties/merchantClassificationCode' + name: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/requestBody/content/application~1json/schema/properties/party/properties/name' + personalInfo: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/requestBody/content/application~1json/schema/properties/party/properties/personalInfo' + required: + - partyIdInfo + description: Information about the Payee in the proposed financial transaction. + payer: + allOf: + - title: PartyIdInfo + type: object + description: Data model for the complex type PartyIdInfo. + properties: + partyIdType: + title: PartyIdType + type: string + enum: + - MSISDN + - EMAIL + - PERSONAL_ID + - BUSINESS + - DEVICE + - ACCOUNT_ID + - IBAN + - ALIAS + - CONSENT + - THIRD_PARTY_LINK + description: | + Below are the allowed values for the enumeration. + - MSISDN - An MSISDN (Mobile Station International Subscriber Directory + Number, that is, the phone number) is used as reference to a participant. + The MSISDN identifier should be in international format according to the + [ITU-T E.164 standard](https://www.itu.int/rec/T-REC-E.164/en). + Optionally, the MSISDN may be prefixed by a single plus sign, indicating the + international prefix. + - EMAIL - An email is used as reference to a + participant. The format of the email should be according to the informational + [RFC 3696](https://tools.ietf.org/html/rfc3696). + - PERSONAL_ID - A personal identifier is used as reference to a participant. + Examples of personal identification are passport number, birth certificate + number, and national registration number. The identifier number is added in + the PartyIdentifier element. The personal identifier type is added in the + PartySubIdOrType element. + - BUSINESS - A specific Business (for example, an organization or a company) + is used as reference to a participant. The BUSINESS identifier can be in any + format. To make a transaction connected to a specific username or bill number + in a Business, the PartySubIdOrType element should be used. + - DEVICE - A specific device (for example, a POS or ATM) ID connected to a + specific business or organization is used as reference to a Party. + For referencing a specific device under a specific business or organization, + use the PartySubIdOrType element. + - ACCOUNT_ID - A bank account number or FSP account ID should be used as + reference to a participant. The ACCOUNT_ID identifier can be in any format, + as formats can greatly differ depending on country and FSP. + - IBAN - A bank account number or FSP account ID is used as reference to a + participant. The IBAN identifier can consist of up to 34 alphanumeric + characters and should be entered without whitespace. + - ALIAS An alias is used as reference to a participant. The alias should be + created in the FSP as an alternative reference to an account owner. + Another example of an alias is a username in the FSP system. + The ALIAS identifier can be in any format. It is also possible to use the + PartySubIdOrType element for identifying an account under an Alias defined + by the PartyIdentifier. + - CONSENT - A Consent represents an agreement between a PISP, a Customer and + a DFSP which allows the PISP permission to perform actions on behalf of the + customer. A Consent has an authoritative source: either the DFSP who issued + the Consent, or an Auth Service which administers the Consent. + - THIRD_PARTY_LINK - A Third Party Link represents an agreement between a PISP, + a DFSP, and a specific Customer's account at the DFSP. The content of the link + is created by the DFSP at the time when it gives permission to the PISP for + specific access to a given account. + example: PERSONAL_ID + partyIdentifier: + title: PartyIdentifier + type: string + minLength: 1 + maxLength: 128 + description: Identifier of the Party. + example: '16135551212' + partySubIdOrType: + title: PartySubIdOrType + type: string + minLength: 1 + maxLength: 128 + description: 'Either a sub-identifier of a PartyIdentifier, or a sub-type of the PartyIdType, normally a PersonalIdentifierType.' + fspId: + $ref: '#/paths/~1services~1%7BServiceType%7D/put/requestBody/content/application~1json/schema/properties/providers/items' + extensionList: + $ref: '#/paths/~1thirdpartyRequests~1authorizations/post/requestBody/content/application~1json/schema/properties/extensionList' + required: + - partyIdType + - partyIdentifier + description: Information about the Payer in the proposed financial transaction. + amountType: + allOf: + - title: AmountType + type: string + enum: + - SEND + - RECEIVE + description: |- + Below are the allowed values for the enumeration AmountType. + - SEND - Amount the Payer would like to send, that is, the amount that should be withdrawn from the Payer account including any fees. + - RECEIVE - Amount the Payer would like the Payee to receive, that is, the amount that should be sent to the receiver exclusive of any fees. + example: RECEIVE + description: 'SEND for sendAmount, RECEIVE for receiveAmount.' + amount: + allOf: + - title: Money + type: object + description: Data model for the complex type Money. + properties: + currency: + $ref: '#/paths/~1accounts~1%7BID%7D/put/requestBody/content/application~1json/schema/properties/accountList/items/properties/currency' + amount: + title: Amount + type: string + pattern: '^([0]|([1-9][0-9]{0,17}))([.][0-9]{0,3}[1-9])?$' + description: 'The API data type Amount is a JSON String in a canonical format that is restricted by a regular expression for interoperability reasons. This pattern does not allow any trailing zeroes at all, but allows an amount without a minor currency unit. It also only allows four digits in the minor currency unit; a negative value is not allowed. Using more than 18 digits in the major currency unit is not allowed.' + example: '123.45' + required: + - currency + - amount + description: Requested amount to be transferred from the Payer to Payee. + transactionType: + allOf: + - $ref: '#/paths/~1thirdpartyRequests~1authorizations/post/requestBody/content/application~1json/schema/properties/transactionType' + description: Type of transaction. + note: + type: string + minLength: 1 + maxLength: 256 + description: A memo that will be attached to the transaction. + expiration: + type: string + description: | + Date and time until when the transaction request is valid. It can be set to get a quick failure in case the peer FSP takes too long to respond. + example: '2016-05-24T08:38:08.699-04:00' + required: + - transactionRequestId + - payee + - payer + - amountType + - amount + - transactionType + - expiration + responses: + '202': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/202' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + '/thirdpartyRequests/transactions/{ID}': + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/1' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/2' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/3' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/4' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/5' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/6' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/7' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/8' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/9' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/10' + get: + tags: + - thirdpartyRequests + - sampled + operationId: GetThirdpartyTransactionRequests + summary: GetThirdpartyTransactionRequests + description: | + The HTTP request `GET /thirdpartyRequests/transactions/{ID}` is used to request the + retrieval of a third party transaction request. + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/parameters/0' + responses: + '202': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/202' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + put: + tags: + - thirdpartyRequests + - sampled + operationId: UpdateThirdPartyTransactionRequests + summary: UpdateThirdPartyTransactionRequests + description: | + The HTTP request `PUT /thirdpartyRequests/transactions/{ID}` is used by the DFSP to inform the client about + the status of a previously requested thirdparty transaction request. + + Switch(Thirdparty API Adapter) -> PISP + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + requestBody: + required: true + content: + application/json: + schema: + title: ThirdpartyRequestsTransactionsIDPutResponse + type: object + description: 'The object sent in the PUT /thirdPartyRequests/transactions/{ID} request.' + properties: + transactionRequestState: + title: TransactionRequestState + type: string + enum: + - RECEIVED + - PENDING + - ACCEPTED + - REJECTED + description: |- + Below are the allowed values for the enumeration. + - RECEIVED - Payer FSP has received the transaction from the Payee FSP. + - PENDING - Payer FSP has sent the transaction request to the Payer. + - ACCEPTED - Payer has approved the transaction. + - REJECTED - Payer has rejected the transaction. + example: RECEIVED + required: + - transactionRequestState + example: + transactionRequestState: RECEIVED + responses: + '200': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + patch: + operationId: NotifyThirdpartyTransactionRequests + summary: NotifyThirdpartyTransactionRequests + description: | + The HTTP request `PATCH /thirdpartyRequests/transactions/{ID}` is used to + notify a thirdparty of the outcome of a transaction request. + + Switch(Thirdparty API Adapter) -> PISP + tags: + - thirdpartyRequests + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/parameters/0' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + requestBody: + required: true + content: + application/json: + schema: + title: ThirdpartyRequestsTransactionsIDPatchResponse + type: object + description: 'The object sent in the PATCH /thirdpartyRequests/transactions/{ID} callback.' + properties: + completedTimestamp: + title: DateTime + type: string + pattern: '^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:(\.\d{3}))(?:Z|[+-][01]\d:[0-5]\d)$' + description: 'The API data type DateTime is a JSON String in a lexical format that is restricted by a regular expression for interoperability reasons. The format is according to [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html), expressed in a combined date, time and time zone format. A more readable version of the format is yyyy-MM-ddTHH:mm:ss.SSS[-HH:MM]. Examples are "2016-05-24T08:38:08.699-04:00", "2016-05-24T08:38:08.699Z" (where Z indicates Zulu time zone, same as UTC).' + example: '2016-05-24T08:38:08.699-04:00' + transactionRequestState: + $ref: '#/paths/~1thirdpartyRequests~1transactions~1%7BID%7D/put/requestBody/content/application~1json/schema/properties/transactionRequestState' + transactionState: + title: TransactionState + type: string + enum: + - RECEIVED + - PENDING + - COMPLETED + - REJECTED + description: |- + Below are the allowed values for the enumeration. + - RECEIVED - Payee FSP has received the transaction from the Payer FSP. + - PENDING - Payee FSP has validated the transaction. + - COMPLETED - Payee FSP has successfully performed the transaction. + - REJECTED - Payee FSP has failed to perform the transaction. + example: RECEIVED + required: + - transactionRequestState + - transactionState + example: + transactionRequestState: ACCEPTED + transactionState: COMMITTED + responses: + '200': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + '/thirdpartyRequests/transactions/{ID}/error': + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/1' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/2' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/3' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/4' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/5' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/6' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/7' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/8' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/9' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/10' + put: + tags: + - thirdpartyRequests + - sampled + operationId: ThirdpartyTransactionRequestsError + summary: ThirdpartyTransactionRequestsError + description: | + If the server is unable to find the transaction request, or another processing error occurs, + the error callback `PUT /thirdpartyRequests/transactions/{ID}/error` is used. + The `{ID}` in the URI should contain the `transactionRequestId` that was used for the creation of + the thirdparty transaction request. + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + requestBody: + description: Error information returned. + required: true + content: + application/json: + schema: + $ref: '#/paths/~1accounts~1%7BID%7D~1error/put/requestBody/content/application~1json/schema' + responses: + '200': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + '/parties/{Type}/{ID}': + parameters: + - name: Type + in: path + required: true + schema: + type: string + description: 'The type of the party identifier. For example, `MSISDN`, `PERSONAL_ID`.' + - name: ID + in: path + required: true + schema: + type: string + description: The identifier value. + - name: Content-Type + in: header + schema: + type: string + required: true + description: The `Content-Type` header indicates the specific version of the API used to send the payload body. + - name: Date + in: header + schema: + type: string + required: true + description: The `Date` header field indicates the date when the request was sent. + - name: X-Forwarded-For + in: header + schema: + type: string + required: false + description: |- + The `X-Forwarded-For` header field is an unofficially accepted standard used for informational purposes of the originating client IP address, as a request might pass multiple proxies, firewalls, and so on. Multiple `X-Forwarded-For` values should be expected and supported by implementers of the API. + + **Note:** An alternative to `X-Forwarded-For` is defined in [RFC 7239](https://tools.ietf.org/html/rfc7239). However, to this point RFC 7239 is less-used and supported than `X-Forwarded-For`. + - name: FSPIOP-Source + in: header + schema: + type: string + required: true + description: The `FSPIOP-Source` header field is a non-HTTP standard field used by the API for identifying the sender of the HTTP request. The field should be set by the original sender of the request. Required for routing and signature verification (see header field `FSPIOP-Signature`). + - name: FSPIOP-Destination + in: header + schema: + type: string + required: false + description: 'The `FSPIOP-Destination` header field is a non-HTTP standard field used by the API for HTTP header based routing of requests and responses to the destination. The field must be set by the original sender of the request if the destination is known (valid for all services except GET /parties) so that any entities between the client and the server do not need to parse the payload for routing purposes. If the destination is not known (valid for service GET /parties), the field should be left empty.' + - name: FSPIOP-Encryption + in: header + schema: + type: string + required: false + description: The `FSPIOP-Encryption` header field is a non-HTTP standard field used by the API for applying end-to-end encryption of the request. + - name: FSPIOP-Signature + in: header + schema: + type: string + required: false + description: The `FSPIOP-Signature` header field is a non-HTTP standard field used by the API for applying an end-to-end request signature. + - name: FSPIOP-URI + in: header + schema: + type: string + required: false + description: 'The `FSPIOP-URI` header field is a non-HTTP standard field used by the API for signature verification, should contain the service URI. Required if signature verification is used, for more information, see [the API Signature document](https://github.com/mojaloop/docs/tree/master/Specification%20Document%20Set).' + - name: FSPIOP-HTTP-Method + in: header + schema: + type: string + required: false + description: 'The `FSPIOP-HTTP-Method` header field is a non-HTTP standard field used by the API for signature verification, should contain the service HTTP method. Required if signature verification is used, for more information, see [the API Signature document](https://github.com/mojaloop/docs/tree/master/Specification%20Document%20Set).' + get: + description: 'The HTTP request `GET /parties/{Type}/{ID}` (or `GET /parties/{Type}/{ID}/{SubId}`) is used to look up information regarding the requested Party, defined by `{Type}`, `{ID}` and optionally `{SubId}` (for example, `GET /parties/MSISDN/123456789`, or `GET /parties/BUSINESS/shoecompany/employee1`).' + summary: Look up party information + tags: + - parties + operationId: PartiesByTypeAndID + parameters: + - name: Accept + in: header + required: true + schema: + type: string + description: The `Accept` header field indicates the version of the API the client would like the server to use. + responses: + '202': + description: Accepted + '400': + description: Bad Request + content: + application/json: + schema: + title: ErrorInformationResponse + type: object + description: Data model for the complex type object that contains an optional element ErrorInformation used along with 4xx and 5xx responses. + properties: + errorInformation: + $ref: '#/paths/~1accounts~1%7BID%7D~1error/put/requestBody/content/application~1json/schema/properties/errorInformation' + headers: + Content-Length: + required: false + schema: + type: integer + description: |- + The `Content-Length` header field indicates the anticipated size of the payload body. Only sent if there is a body. + + **Note:** The API supports a maximum size of 5242880 bytes (5 Megabytes). + Content-Type: + schema: + type: string + required: true + description: The `Content-Type` header indicates the specific version of the API used to send the payload body. + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/content/application~1json/schema' + headers: + Content-Length: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/headers/Content-Length' + Content-Type: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/headers/Content-Type' + '403': + description: Forbidden + content: + application/json: + schema: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/content/application~1json/schema' + headers: + Content-Length: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/headers/Content-Length' + Content-Type: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/headers/Content-Type' + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/content/application~1json/schema' + headers: + Content-Length: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/headers/Content-Length' + Content-Type: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/headers/Content-Type' + '405': + description: Method Not Allowed + content: + application/json: + schema: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/content/application~1json/schema' + headers: + Content-Length: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/headers/Content-Length' + Content-Type: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/headers/Content-Type' + '406': + description: Not Acceptable + content: + application/json: + schema: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/content/application~1json/schema' + headers: + Content-Length: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/headers/Content-Length' + Content-Type: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/headers/Content-Type' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/content/application~1json/schema' + headers: + Content-Length: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/headers/Content-Length' + Content-Type: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/headers/Content-Type' + '503': + description: Service Unavailable + content: + application/json: + schema: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/content/application~1json/schema' + headers: + Content-Length: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/headers/Content-Length' + Content-Type: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400/headers/Content-Type' + put: + description: 'The callback `PUT /parties/{Type}/{ID}` (or `PUT /parties/{Type}/{ID}/{SubId}`) is used to inform the client of a successful result of the Party information lookup.' + summary: Return party information + tags: + - parties + operationId: PartiesByTypeAndID2 + parameters: + - name: Content-Length + in: header + required: false + schema: + type: integer + description: |- + The `Content-Length` header field indicates the anticipated size of the payload body. Only sent if there is a body. + + **Note:** The API supports a maximum size of 5242880 bytes (5 Megabytes). + requestBody: + description: Party information returned. + required: true + content: + application/json: + schema: + title: PartiesTypeIDPutResponse + type: object + description: 'The object sent in the PUT /parties/{Type}/{ID} callback.' + properties: + party: + title: Party + type: object + description: Data model for the complex type Party. + properties: + partyIdInfo: + title: PartyIdInfo + type: object + description: Data model for the complex type PartyIdInfo. An ExtensionList element has been added to this reqeust in version v1.1 + properties: + partyIdType: + title: PartyIdType + type: string + enum: + - MSISDN + - EMAIL + - PERSONAL_ID + - BUSINESS + - DEVICE + - ACCOUNT_ID + - IBAN + - ALIAS + description: |- + Below are the allowed values for the enumeration. + - MSISDN - An MSISDN (Mobile Station International Subscriber Directory Number, that is, the phone number) is used as reference to a participant. The MSISDN identifier should be in international format according to the [ITU-T E.164 standard](https://www.itu.int/rec/T-REC-E.164/en). Optionally, the MSISDN may be prefixed by a single plus sign, indicating the international prefix. + - EMAIL - An email is used as reference to a participant. The format of the email should be according to the informational [RFC 3696](https://tools.ietf.org/html/rfc3696). + - PERSONAL_ID - A personal identifier is used as reference to a participant. Examples of personal identification are passport number, birth certificate number, and national registration number. The identifier number is added in the PartyIdentifier element. The personal identifier type is added in the PartySubIdOrType element. + - BUSINESS - A specific Business (for example, an organization or a company) is used as reference to a participant. The BUSINESS identifier can be in any format. To make a transaction connected to a specific username or bill number in a Business, the PartySubIdOrType element should be used. + - DEVICE - A specific device (for example, a POS or ATM) ID connected to a specific business or organization is used as reference to a Party. For referencing a specific device under a specific business or organization, use the PartySubIdOrType element. + - ACCOUNT_ID - A bank account number or FSP account ID should be used as reference to a participant. The ACCOUNT_ID identifier can be in any format, as formats can greatly differ depending on country and FSP. + - IBAN - A bank account number or FSP account ID is used as reference to a participant. The IBAN identifier can consist of up to 34 alphanumeric characters and should be entered without whitespace. + - ALIAS An alias is used as reference to a participant. The alias should be created in the FSP as an alternative reference to an account owner. Another example of an alias is a username in the FSP system. The ALIAS identifier can be in any format. It is also possible to use the PartySubIdOrType element for identifying an account under an Alias defined by the PartyIdentifier. + partyIdentifier: + $ref: '#/paths/~1thirdpartyRequests~1transactions/post/requestBody/content/application~1json/schema/properties/payer/allOf/0/properties/partyIdentifier' + partySubIdOrType: + $ref: '#/paths/~1thirdpartyRequests~1transactions/post/requestBody/content/application~1json/schema/properties/payer/allOf/0/properties/partySubIdOrType' + fspId: + $ref: '#/paths/~1services~1%7BServiceType%7D/put/requestBody/content/application~1json/schema/properties/providers/items' + extensionList: + $ref: '#/paths/~1thirdpartyRequests~1authorizations/post/requestBody/content/application~1json/schema/properties/extensionList' + required: + - partyIdType + - partyIdentifier + merchantClassificationCode: + title: MerchantClassificationCode + type: string + pattern: '^[\d]{1,4}$' + description: 'A limited set of pre-defined numbers. This list would be a limited set of numbers identifying a set of popular merchant types like School Fees, Pubs and Restaurants, Groceries, etc.' + name: + title: PartyName + type: string + minLength: 1 + maxLength: 128 + description: Name of the Party. Could be a real name or a nickname. + personalInfo: + title: PartyPersonalInfo + type: object + description: Data model for the complex type PartyPersonalInfo. + properties: + complexName: + title: PartyComplexName + type: object + description: Data model for the complex type PartyComplexName. + properties: + firstName: + title: FirstName + type: string + minLength: 1 + maxLength: 128 + pattern: '^(?!\s*$)[\p{L}\p{gc=Mark}\p{digit}\p{gc=Connector_Punctuation}\p{Join_Control} .,''''-]{1,128}$' + description: First name of the Party (Name Type). + example: Henrik + middleName: + title: MiddleName + type: string + minLength: 1 + maxLength: 128 + pattern: '^(?!\s*$)[\p{L}\p{gc=Mark}\p{digit}\p{gc=Connector_Punctuation}\p{Join_Control} .,''''-]{1,128}$' + description: Middle name of the Party (Name Type). + example: Johannes + lastName: + title: LastName + type: string + minLength: 1 + maxLength: 128 + pattern: '^(?!\s*$)[\p{L}\p{gc=Mark}\p{digit}\p{gc=Connector_Punctuation}\p{Join_Control} .,''''-]{1,128}$' + description: Last name of the Party (Name Type). + example: Karlsson + dateOfBirth: + title: DateofBirth (type Date) + type: string + pattern: '^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)$' + description: Date of Birth of the Party. + example: '1966-06-16' + required: + - partyIdInfo + required: + - party + responses: + '200': + description: OK + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + '/parties/{Type}/{ID}/error': + put: + description: 'If the server is unable to find Party information of the provided identity, or another processing error occurred, the error callback `PUT /parties/{Type}/{ID}/error` (or `PUT /parties/{Type}/{ID}/{SubI}/error`) is used.' + summary: Return party information error + tags: + - parties + operationId: PartiesErrorByTypeAndID + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/0' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/1' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/2' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/3' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/4' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/5' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/6' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/7' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/8' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/9' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/10' + requestBody: + description: Details of the error returned. + required: true + content: + application/json: + schema: + $ref: '#/paths/~1accounts~1%7BID%7D~1error/put/requestBody/content/application~1json/schema' + responses: + '200': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + '/parties/{Type}/{ID}/{SubId}': + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/0' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/1' + - name: SubId + in: path + required: true + schema: + type: string + description: 'A sub-identifier of the party identifier, or a sub-type of the party identifier''s type. For example, `PASSPORT`, `DRIVING_LICENSE`.' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/2' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/3' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/4' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/5' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/6' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/7' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/8' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/9' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/10' + get: + description: 'The HTTP request `GET /parties/{Type}/{ID}` (or `GET /parties/{Type}/{ID}/{SubId}`) is used to look up information regarding the requested Party, defined by `{Type}`, `{ID}` and optionally `{SubId}` (for example, `GET /parties/MSISDN/123456789`, or `GET /parties/BUSINESS/shoecompany/employee1`).' + summary: Look up party information + tags: + - parties + operationId: PartiesSubIdByTypeAndID + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/parameters/0' + responses: + '202': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/202' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + put: + description: 'The callback `PUT /parties/{Type}/{ID}` (or `PUT /parties/{Type}/{ID}/{SubId}`) is used to inform the client of a successful result of the Party information lookup.' + summary: Return party information + tags: + - parties + operationId: PartiesSubIdByTypeAndIDPut + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + requestBody: + description: Party information returned. + required: true + content: + application/json: + schema: + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/requestBody/content/application~1json/schema' + responses: + '200': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + '/parties/{Type}/{ID}/{SubId}/error': + put: + description: 'If the server is unable to find Party information of the provided identity, or another processing error occurred, the error callback `PUT /parties/{Type}/{ID}/error` (or `PUT /parties/{Type}/{ID}/{SubId}/error`) is used.' + summary: Return party information error + tags: + - parties + operationId: PartiesSubIdErrorByTypeAndID + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/0' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/1' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D~1%7BSubId%7D/parameters/2' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/2' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/3' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/4' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/5' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/6' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/7' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/8' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/9' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/10' + requestBody: + description: Details of the error returned. + required: true + content: + application/json: + schema: + $ref: '#/paths/~1accounts~1%7BID%7D~1error/put/requestBody/content/application~1json/schema' + responses: + '200': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + '/services/{ServiceType}': + parameters: + - name: ServiceType + in: path + required: true + schema: + type: string + description: 'The type of the service identifier. For example, `THIRD_PARTY_DFSP`' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/2' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/3' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/4' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/5' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/6' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/7' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/8' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/9' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/10' + get: + operationId: GetServicesByServiceType + summary: GetServicesByServiceType + description: | + The HTTP request `GET /services/{ServiceType}` is used to retrieve the list of participants + that support a specified service. + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/parameters/0' + tags: + - services + - sampled + responses: + '202': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/202' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + put: + description: | + The HTTP request `PUT /services/{ServiceType}` is used to return list of participants + that support a specified service. + operationId: PutServicesByServiceType + summary: PutServicesByServiceType + tags: + - services + - sampled + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + requestBody: + required: true + content: + application/json: + schema: + title: ServicesServiceTypePutResponse + type: object + description: 'The object sent in a `PUT /services/{ServiceType}` request.' + properties: + providers: + type: array + minLength: 0 + maxLength: 256 + items: + title: FspId + type: string + minLength: 1 + maxLength: 32 + description: FSP identifier. + required: + - providers + responses: + '200': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' + '/services/{ServiceType}/error': + parameters: + - $ref: '#/paths/~1services~1%7BServiceType%7D/parameters/0' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/2' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/3' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/4' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/5' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/6' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/7' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/8' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/9' + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/parameters/10' + put: + description: | + The HTTP request `PUT /services/{ServiceType}/error` is used to return error information + operationId: PutServicesByServiceTypeAndError + summary: PutServicesByServiceTypeAndError + tags: + - services + - sampled + parameters: + - $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/parameters/0' + requestBody: + description: Details of the error returned. + required: true + content: + application/json: + schema: + $ref: '#/paths/~1accounts~1%7BID%7D~1error/put/requestBody/content/application~1json/schema' + responses: + '200': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/put/responses/200' + '400': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/400' + '401': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/401' + '403': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/403' + '404': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/404' + '405': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/405' + '406': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/406' + '501': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/501' + '503': + $ref: '#/paths/~1parties~1%7BType%7D~1%7BID%7D/get/responses/503' diff --git a/docs/fr/technical/api/thirdparty/transaction-patterns-linking.md b/docs/fr/technical/api/thirdparty/transaction-patterns-linking.md new file mode 100644 index 000000000..a5dd21a70 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/transaction-patterns-linking.md @@ -0,0 +1,312 @@ +--- +footerCopyright: Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0) | Ericsson, Huawei, Mahindra-Comviva, Telepin, and the Bill & Melinda Gates Foundation +--- + +# Modèles de Transactions - Liaison + +API Tiers de Mojaloop + +### Table des Matières + +1. [Préface](#Preface) + 1.1 [Conventions utilisées dans ce document](#ConventionsUsedinThisDocument) + 1.2 [Informations sur la version du document](#DocumentVersionInformation) + 1.3 [Références](#References) +2. [Introduction](#Introduction) + 2.1 [Spécification de l'API Tiers](#ThirdPartyAPISpecification) +3. [Liaison](#Linking) + 3.1 [Pré-liaison](#Pre-linking) + 3.2 [Découverte](#Discovery) + 3.3 [Demande de consentement](#Requestconsent) + 3.4 [Authentification](#Authentication) + 3.5 [Octroi du consentement](#Grantconsent) + 3.6 [Enregistrement de l'identifiant](#Credentialregistration) +4. [Déliaison](#Unlinking) + 4.1 [Déliaison sans service d'authentification hébergé par le Switch](#UnlinkingwithoutaSwitchHostedAuthService) + 4.2 [Déliaison avec service d'authentification hébergé par le Switch](#UnlinkingwithaSwitchHostedAuthService) +5. [Scénarios d'Erreur](#ErrorScenarios) + 5.1 [Découverte](#Discovery-1) + 5.2 [Erreurs sur les demandes de consentement](#BadconsentRequests) + 5.3 [Authentification](#Authentication-1) + 5.4 [Octroi du consentement](#Grantconsent-1) + +# 1. Préface + +Cette section contient des informations sur la façon d'utiliser ce document. + +## 1.1. Conventions utilisées dans ce document + +Les conventions suivantes sont utilisées dans ce document pour identifier les informations spécifiées. + +|Type d'information|Convention|Exemple| +|---|---|---| +|**Éléments de l'API, tels que les ressources**|Gras|**/authorization**| +|**Variables**|Italique entre crochets|_{ID}_| +|**Termes du glossaire**|Italique à la première occurrence ; défini dans _Glossaire_|Le but de l'API est de permettre des transactions financières interopérables entre un _Payeur_ (une personne qui paie dans une transaction) localisé dans un _FSP_ (une entité qui fournit un service financier numérique à un utilisateur final) et un _Bénéficiaire_ (une personne qui reçoit des fonds) localisé dans un autre FSP.| +|**Documents de la bibliothèque**|Italique|Les informations sur l'utilisateur ne doivent généralement pas être utilisées par les déploiements de l'API ; les mesures de sécurité détaillées dans _Signature API et Chiffrement API_ doivent être utilisées à la place.| + +## 1.2. Informations sur la version du document + +| Version | Date | Description de la modification | +| --- | --- | --- | +| **1.0** | 2021-10-03 | Version initiale + +## 1.3. Références + +Les références suivantes sont utilisées dans cette spécification : + +| Référence | Description | Version | Lien | +| --- | --- | --- | --- | +| Réf. 1 | API Ouvert pour l'Interopérabilité FSP | `1.1` | [Définition de l'API v1.1](https://github.com/mojaloop/mojaloop-specification/blob/master/fspiop-api/documents/v1.1-document-set/API%20Definition%20v1.1.md)| + + +# 2. Introduction + +Ce document présente les modèles de transaction supportés par l’API Tiers relatifs à l’établissement d’une relation entre un Utilisateur, un DFSP et un PISP. + +Le style architectural et la conception de cette API sont basés sur la [Section 3](https://github.com/mojaloop/mojaloop-specification/blob/master/fspiop-api/documents/v1.1-document-set/API%20Definition%20v1.1.md#3-api-definition) de la Réf. 1 ci-dessus. + +## 2.1 Spécification de l'API Tiers + +La spécification de l'API Tiers Mojaloop inclut les documents suivants : + +- [Modèles de données](./data-models.md) +- [Modèles de transactions - Liaison](./transaction-patterns-linking.md) +- [Modèles de transactions - Transfert](./transaction-patterns-transfer.md) +- [Définition d'API Open Tier - DFSP](./thirdparty-dfsp-v1.0.yaml) +- [Définition d'API Open Tier - PISP](./thirdparty-dfsp-v1.0.yaml) + + +# 3. Liaison + +L'objectif du processus de liaison est d'expliquer comment les utilisateurs établissent la confiance entre les trois parties intéressées : + +1. Utilisateur +2. DFSP où l'utilisateur détient un compte +3. PISP sur lequel l'utilisateur veut compter pour initier les paiements + +La liaison est divisée en plusieurs phases distinctes : + +1. **Pré-liaison** + Dans cette phase, un PISP demande quels DFSP sont disponibles pour être liés. +2. **Demande de consentement** + Dans cette phase, un PISP tente d’établir la confiance entre les 3 parties. +3. **Authentification** + Dans cette phase, l'utilisateur prouve son identité à son DFSP. +4. **Octroi du consentement** + Dans cette phase, un PISP prouve au DFSP que l'utilisateur et le PISP ont établi la confiance, et ainsi, le DFSP confirme que la confiance mutuelle existe entre les 3 parties. +5. **Enregistrement de l'identifiant** + Dans cette phase, un utilisateur crée l'identifiant qu'il utilisera pour consentir à des transferts futurs du DFSP initiés par le PISP. + +## 3.1 Pré-liaison + +Dans cette phase, un serveur PISP doit connaître les DFSP disponibles pour être liés. Ceci est *peu probable* d’être fait à la demande (par exemple, quand un utilisateur clique sur "lier" dans l’application mobile du PISP), et plus probablement réalisé périodiquement et mis en cache par le serveur PISP. La raison est que de nouveaux DFSP ne rejoignent généralement pas le réseau Mojaloop très fréquemment, donc appeler ceci plusieurs fois dans la même journée donnerait probablement les mêmes résultats. Nous recommandons que le PISP fasse cette requête une fois par jour pour maintenir la liste des DFSPs à jour. + +L'objectif final de cette phase est que le serveur PISP dispose d'une liste finale de DFSPs disponibles ainsi que de toutes les métadonnées utiles nécessaires pour débuter le processus de liaison. + +Le PISP peut afficher cette liste de DFSPs à l'utilisateur, et l'utilisateur peut sélectionner le DFSP avec lequel il détient un compte à lier. + +![Pré-liaison](./assets/diagrams/linking/0-pre-linking.svg) + +## 3.2 Découverte + +Dans cette phase, on demande à l'utilisateur de sélectionner le type et la valeur de l'identifiant qu'il utilise avec le DFSP avec lequel il souhaite se lier. Cela peut être un nom d'utilisateur, un MSISDN (numéro de téléphone), ou une adresse e-mail. + +Le résultat de cette phase est une liste de comptes potentiels disponibles pour la liaison. L'utilisateur choisira ensuite un ou plusieurs de ces comptes sources et le PISP les fournira au DFSP lors de la demande de consentement. + +Le DFSP PEUT renvoyer un « accountNickname » au PISP dans la liste des comptes. Cette liste sera affichée à l'utilisateur dans l’application PISP pour qu’il sélectionne quels comptes il souhaite lier. Un DFSP pourrait masquer une partie du surnom selon ses exigences pour afficher les informations sur le compte sans authentifier l’utilisateur. + +**REMARQUE :** Lors de l’utilisation du canal d’authentification Web, il est possible que les choix faits (c’est à dire, les comptes à lier) soient remplacés par l'utilisateur dans une vue web. L’utilisateur peut donc décider, pendant la phase d’Authentification, de lier un compte différent de celui d’origine. Cela est parfaitement acceptable et doit être attendu de temps à autre. + +![Découverte](./assets/diagrams/linking/1-discovery.svg) + +## 3.3 Demande de consentement + +Dans cette phase, un PISP demande à un DFSP spécifique de démarrer le processus d’établissement du consentement entre trois parties : + +1. Le PISP +2. Le DFSP spécifié +3. Un utilisateur présumé client du DFSP ci-dessus + +La demande de consentement du PISP doit inclure plusieurs éléments importants : + +- Les canaux d’authentification acceptables pour l’utilisateur +- Les périmètres nécessaires dans le cadre du consentement (ici, presque toujours, seulement la possibilité de voir le solde d’un compte spécifique et d’envoyer des fonds depuis un compte). + +Certaines informations dépendent du canal d’authentification utilisé (Web ou OTP). Si le canal Web est utilisé, les informations supplémentaires suivantes sont requises : + +- Un URI de rappel vers lequel l’utilisateur peut être redirigé avec toute information supplémentaire. + +Le résultat de cette phase dépend du canal d’authentification utilisé : + +### 3.3.1 Web + +Dans le canal d’authentification Web, le résultat est que le PISP reçoit une URL spécifique où cet utilisateur devrait être redirigé. Cette URL doit être un endroit où l’utilisateur peut prouver son identité (par exemple, via une connexion classique). + +![Demande de consentement](./assets/diagrams/linking/2-request-consent-web.svg) + +### 3.3.2 OTP / SMS + +Dans le canal d’authentification OTP, le DFSP envoie un message OTP « hors bande » à son utilisateur (par exemple, par SMS ou e-mail). Le PISP demande à l'utilisateur ce code OTP, et l'inclut dans le champ « authToken » lors du rappel **PATCH /consentRequests/**_{ID}_. + +![Demande de consentement](./assets/diagrams/linking/2-request-consent-otp.svg) + +## 3.4 Authentification + +Dans la phase d’authentification, il est attendu de l’utilisateur qu’il prouve son identité auprès du DFSP. Une fois cela fait, le DFSP fournira à l’utilisateur un certain type de secret (par exemple, un OTP ou un token d’accès). Ce secret sera alors transmis au PISP afin que celui-ci puisse démontrer une chaîne de confiance : + +- Le DFSP fait confiance à l'utilisateur +- Le DFSP donne un secret à l'utilisateur +- L'utilisateur fait confiance au PISP +- L'utilisateur transmet le secret reçu du DFSP au PISP +- Le PISP donne le secret au DFSP +- Le DFSP vérifie que le secret est correct + +Cette chaîne aboutit à la conclusion suivante : le DFSP peut faire confiance au PISP pour agir pour le compte de l’utilisateur, et une confiance mutuelle existe entre les trois parties. + +Le processus d’établissement de cette chaîne de confiance dépend du canal d’authentification utilisé : + +### 3.4.1 Web + +Dans le canal Web, le PISP utilise le champ `authUri` renvoyé lors du rappel **PUT /consentRequests/**_{ID}_ pour rediriger l’utilisateur vers le site web du DFSP où il pourra prouver son identité (probablement via un identifiant et mot de passe classique). + +**Remarque:** Notez qu’à ce stade, l’utilisateur peut modifier ses choix de comptes à lier. Le résultat sera visible plus tard lors de la phase d'octroi du consentement, dans laquelle le DFSP fournira les bonnes valeurs au PISP dans le champ `scopes`. + +![Authentification (Web)](./assets/diagrams/linking/3-authentication-web.svg) + +### 3.4.2 OTP + +Lors de l’utilisation du canal OTP, le DFSP enverra à l’utilisateur un mot de passe à usage unique via un canal préétabli (comme un SMS). Le PISP doit alors demander à l’utilisateur ce mot de passe à usage unique et le renvoyer au DFSP via l’appel API **PATCH /consentRequests/**_{ID}_. + +![Authentification (OTP)](./assets/diagrams/linking/3-authentication-otp.svg) + +## 3.5 Octroi du consentement + +Maintenant que la confiance mutuelle a été établie entre les trois parties, le DFSP est capable de créer un enregistrement de ce fait en créant une nouvelle ressource Consent. Cette ressource enregistrera toutes les informations pertinentes sur la relation entre les trois parties, et contiendra éventuellement des informations supplémentaires sur la manière dont l’utilisateur pourra prouver son consentement pour chaque transfert futur. + +Cette phase consiste exclusivement à ce que le DFSP demande à ce qu’un nouveau consentement soit créé. + +![Octroi du consentement](./assets/diagrams/linking/4-grant-consent.svg) + +## 3.6 Enregistrement de l'identifiant + +Une fois la ressource de consentement créée, le PISP tentera d’établir avec le DFSP l'identifiant qui devra être utilisé pour vérifier que l'utilisateur donne son consentement pour chaque transfert futur. + +Cela se fera en stockant un identifiant FIDO (par exemple, une clé publique) sur le service Auth à l'intérieur de la ressource de consentement. Lors des futurs transferts, il sera demandé que ces transferts soient signés numériquement par le credential FIDO (ici la clé privée) pour être considérés comme valides. + +Cet enregistrement d’identifiant est composé de trois phases : (1) dériver le challenge, (2) enregistrer l’identifiant, et (3) finaliser le consentement. + +### 3.6.1 Dérivation du challenge + +Le PISP doit dériver le challenge qui sera utilisé comme entrée dans l’étape d'enregistrement de clé FIDO. Ce challenge ne doit pas pouvoir être deviné à l’avance par le PISP. + +1. _Soit `consentId` la valeur de `body.consentId` dans la requête **POST /consents**_ +2. _Soit `scopes` la valeur de `body.scopes` dans la requête **POST /consents**_ + +3. Le PISP doit construire l'objet JSON `rawChallenge` +``` +{ + "consentId": , + "scopes": +} +``` + +4. Ensuite, le PISP doit convertir cet objet JSON en une chaîne au format Canonical JSON RFC-8785 ([RFC-8785 Canonical JSON format](https://tools.ietf.org/html/rfc8785)) + +5. Enfin, le PISP doit calculer un hash SHA-256 de la chaîne JSON canonique, c'est-à-dire : `SHA256(CJSON(rawChallenge))` + +La sortie de cet algorithme, `challenge`, sera utilisée comme défi lors du [flux d'enregistrement FIDO](https://webauthn.guide/#registration) + +### 3.6.2 Enregistrement de l'identifiant + +Une fois le challenge dérivé, le PISP générera un nouvel identifiant sur le dispositif, signera numériquement le challenge, et fournira des informations supplémentaires sur l'identifiant dans la ressource Consent : + +1. L’objet `PublicKeyCredential` — qui contient l’ID de la clé et une [AuthenticatorAttestationResponse](https://w3c.github.io/webauthn/#iface-authenticatorattestationresponse) contenant la clé publique +2. Un champ `credentialType` à la valeur `FIDO` +3. Un champ `status` avec la valeur `PENDING` + +> **Remarque :** Objets génériques Credential +> Bien que nous soyons concentrés d’abord sur FIDO, il est possible que certains PISP souhaitent offrir des services aux utilisateurs via d’autres canaux, par ex. USSD ou SMS. L’API supporte donc aussi un type `GENERIC`, par exemple : +>``` +> CredentialTypeGeneric { +> credentialType: 'GENERIC' +> status: 'PENDING', +> payload: { +> publicKey: base64(...), +> signature: base64(...), +> } +> } +>``` + +Le DFSP reçoit l’appel **PUT /consents/**_{ID}_ du PISP, et valide éventuellement l'objet Credential inclus dans la requête. Le DFSP demande ensuite au service Auth de créer l’objet `Consent` et de valider l’identifiant. + +Si le DFSP reçoit un rappel **PUT /consents/**_{ID}_ du service Auth, avec un `credential.status` à `VERIFIED`, il sait que l’identifiant est valide selon le service Auth. + +Sinon, s’il reçoit un rappel **PUT /consents/**_{ID}_**/error**, il sait que quelque chose a mal tourné lors de l’enregistrement du consentement et l'identifiant associé, et peut informer le PISP en conséquence. + +Le service Auth est ensuite responsable d'appeler **POST /participants/CONSENTS/**_{ID}_. +Cet appel associera le `consentId` au `participantId` du service Auth et permettra de retrouver plus tard le service Auth correspondant. + +![Enregistrement de l’identifiant : Enregistrement](./assets/diagrams/linking/5a-credential-registration.svg) + +### 3.6.3 Finalisation du consentement + +Une fois que le DFSP est sûr que l’identifiant est valide, il appelle **POST /participants/THIRD_PARTY_LINK/**_{ID}_ pour chaque compte dans la liste `Consent.scopes`. Cette entrée représente le lien entre le compte du PISP et celui du DFSP, que le PISP pourra utiliser pour spécifier la _source des fonds_ lors de la demande de transaction. + +Enfin, le DFSP appelle **PUT /consent/**_{ID}_ avec l'objet Consent finalisé reçu du service Auth. + +![Enregistrement de l'identifiant : Finalisation](./assets/diagrams/linking/5b-finalize_consent.svg) + + +# 4. Déliaison + +À un moment donné, il est possible qu’un utilisateur, un PISP ou un DFSP décide que la relation de confiance précédemment établie ne doit plus exister. Par exemple, un scénario courant peut être la perte du téléphone par un utilisateur, qui utilise l’interface du DFSP pour supprimer le lien entre le dispositif perdu, le PISP et le DFSP. + +Pour rendre cela possible, il suffit de fournir un moyen à un membre du réseau de supprimer la ressource de consentement et de notifier les autres parties de cette suppression. + +Nous devons gérer 2 scénarios avec une requête **DELETE /consents/**_{ID}_ : +1. Un service Auth hébergé par le DFSP, où aucun détail du consentement n’est stocké dans le Switch ; +2. Un service Auth hébergé par le Switch, où ce service est considéré comme la source autoritaire pour l’objet `Consent`. + +## 4.1 Déliaison sans service d'authentification hébergé par le Switch + +Dans ce cas, le Switch transmet la requête **DELETE /consents/22222222-0000-0000-0000-000000000000** au DFSP dans l’en-tête `FSPIOP-Destination`. + +![Déliaison — DFSP hébergé](./assets/diagrams/linking/6a-unlinking-dfsp-hosted.svg) + +Dans le cas où la déliaison est demandée depuis le côté DFSP, celui-ci peut simplement appeler **PATCH /consents/22222222-0000-0000-0000-000000000000** pour informer le PISP d’une mise à jour sur l’objet `Consent`. + +## 4.2 Déliaison avec service d'authentification hébergé par le Switch + +Dans cette instance, le PISP adresse toujours son appel **DELETE /consents/22222222-0000-0000-0000-000000000000** au DFSP via l’en-tête `FSPIOP-Destination`. + +En interne, le Switch recherchera la source autoritaire de l’objet `Consent` via l’appel ALS, **GET /participants/CONSENT/**_{ID}_. S’il est déterminé qu’un service Auth hébergé par le Switch « possède » ce consentement, l’appel HTTP **DELETE /consents/**_{ID}_ sera redirigé vers le service Auth. + +![Déliaison — Switch hébergé](./assets/diagrams/linking/6b-unlinking-hub-hosted.svg) + +# 5.Scénarios d’erreur + +## 5.1 Découverte + +Quand le DFSP ne trouve pas d'utilisateur pour l'identifiant dans **GET /accounts/**_{ID}_, +le DFSP répond avec le code d’erreur `6205` via **PUT /accounts/**_{ID}_**/error**. + +![Erreur — Comptes](./assets/diagrams/linking/error_scenarios/1-discovery-error.svg) + +## 5.2 Erreurs sur les demandes de consentement + +Lorsque le DFSP reçoit la requête **POST /consentRequests** du PISP, les erreurs suivantes peuvent survenir : + +1. Le DFSP ne supporte pas les périmètres (scopes) spécifiés : `6101`. Par exemple, le `userId` spécifié ne correspond pas aux comptes mentionnés, ou le champ `scope.actions` contient des permissions que ce DFSP ne supporte pas. +2. Le PISP a envoyé un mauvais callbackUri : `6204`. Par exemple, le schéma de callbackUri pourrait être http, ce que le DFSP pourrait choisir de ne pas accepter. +3. Tout autre contrôle ou validation côté DFSP échoue : `6104`. Par exemple, le compte de l’utilisateur pourrait être inactif ou suspendu. + +Dans ce cas, le DFSP doit informer le PISP de l’échec en envoyant un rappel **PUT /consentRequests/**_{ID}_**/error** au PISP. + +![Erreur — consentRequests](./assets/diagrams/linking/error_scenarios/2-request-consent-error.svg) + +## 5.3 Authentification + +Lorsqu'un PISP envoie un **PATCH /consentRequests/**_{ID}_ au DFSP, il est possible que le `authToken` soit expiré ou invalide : + +![Authentification — OTP invalide](./assets/diagrams/linking/error_scenarios/3-authentication-otp-invalid.svg) diff --git a/docs/fr/technical/api/thirdparty/transaction-patterns-transfer.md b/docs/fr/technical/api/thirdparty/transaction-patterns-transfer.md new file mode 100644 index 000000000..46198e632 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/transaction-patterns-transfer.md @@ -0,0 +1,361 @@ +# Modèles de transaction - Transfert + +API Tiers de Mojaloop + +### Table des matières + +1. [Préface](#Preface) + 1.1 [Conventions utilisées dans ce document](#ConventionsUsedinThisDocument) + 1.2 [Informations sur la version du document](#DocumentVersionInformation) + 1.3 [Références](#References) +2. [Introduction](#Introduction) + 2.1 [Spécification de l'API Tiers](#ThirdPartyAPISpecification) +3. [Transferts](#Transfers) + 3.1 [Découverte](#Discovery) + 3.2 [Accord](#Agreement) + 3.3 [Transfert](#Transfer) +4. [Demande de statut de TransactionRequest](#RequestTransactionRequestStatus) +5. [Conditions d’erreur](#ErrorConditions) + 5.1 [Recherche de Bénéficiaire Incorrecte](#badpayeelookup) + 5.2 [Mauvaise demande de transaction tierce](#badtptr) + 5.3 [Échec API FSPIOP aval](#downstreamapifailure) + 5.4 [Challenge signé invalide](#invalidsignedchallenge) + 5.5 [Expiration de la demande de transaction tierce](#thirdpartytransactionrequesttimeout) +6. [Annexe](#Appendix) + 6.1 [Dérivation du challenge](#DerivingtheChallenge) + +# 1. Préface + +Cette section contient des informations sur l'utilisation de ce document. + +## 1.1. Conventions utilisées dans ce document + +Les conventions suivantes sont utilisées dans ce document pour identifier les types d'informations spécifiés. + +|Type d’information|Convention|Exemple| +|---|---|---| +|**Éléments de l’API, comme les ressources**|Gras|**/authorization**| +|**Variables**|Italique avec chevrons|_{ID}_| +|**Termes de glossaire**|Italique à la première occurrence ; défini dans le _Glossaire_|Le but de l'API est de permettre les transactions financières interopérables entre un _Payeur_ (un payeur de fonds électroniques dans une transaction de paiement) situé dans un _FSP_ (une entité qui fournit un service financier numérique à un utilisateur final) et un _Bénéficiaire_ (un destinataire de fonds électroniques dans une transaction de paiement) situé dans un autre FSP.| +|**Documents de bibliothèque**|Italique|Les informations utilisateur ne devraient, en général, pas être utilisées par les déploiements d'API ; les mesures de sécurité détaillées dans _Signature API et Chiffrement API_ devraient être utilisées à la place.| + +## 1.2. Informations sur la version du document + +| Version | Date | Description du changement | +| --- | --- | --- | +| **1.0** | 2021-10-03 | Version initiale + +## 1.3. Références + +Les références suivantes sont utilisées dans cette spécification : + +| Référence | Description | Version | Lien | +| --- | --- | --- | --- | +| Réf. 1 | Open API pour l'interopérabilité FSP | `1.1` | [Définition d’API v1.1](https://github.com/mojaloop/mojaloop-specification/blob/master/fspiop-api/documents/v1.1-document-set/API%20Definition%20v1.1.md)| + + +# 2. Introduction + +Ce document présente les modèles de transaction pris en charge par l'API Tiers en lien +avec l'initiation d'une demande de transaction (Transaction Request) provenant d’un PISP. + +La conception de l’API et le style architectural de cette API sont basés sur la [Section 3](https://github.com/mojaloop/mojaloop-specification/blob/master/fspiop-api/documents/v1.1-document-set/API%20Definition%20v1.1.md#3-api-definition) de la Réf. 1 ci-dessus. + +## 2.1 Spécification de l'API Tiers + +La spécification de l’API Tiers Mojaloop inclut les documents suivants: + +- [Modèles de données](./data-models.md) +- [Modèles de transaction - Liaison](./transaction-patterns-linking.md) +- [Modèles de transaction - Transfert](./transaction-patterns-transfer.md) +- [Définition Open API Tiers – DFSP](./thirdparty-dfsp-v1.0.yaml) +- [Définition Open API Tiers – PISP](./thirdparty-dfsp-v1.0.yaml) + + +# 3. Transferts + +Les transferts sont divisés en sections séparées : +1. **Découverte** : Le PISP recherche le bénéficiaire auquel envoyer des fonds + +2. **Accord** : Le PISP confirme le bénéficiaire, et recherche les conditions de la transaction. Si l'Utilisateur accepte les conditions de la transaction, il signe la transaction avec l'identifiant établi lors du flux d’API de liaison + +3. **Transfert** : Le DFSP du payeur initie la transaction et informe le PISP du résultat de celle-ci. + +## 3.1 Découverte + +Dans cette phase, un utilisateur saisit l'identifiant de l'utilisateur à qui il souhaite envoyer des fonds. Le PISP exécute un appel **GET /parties/**_{Type}/{ID}_** (ou **GET /parties/**_{Type}/{ID}/{SubId}_) et attend un rappel (callback) du switch Mojaloop. [Section 6.3](https://github.com/mojaloop/mojaloop-specification/blob/master/fspiop-api/documents/v1.1-document-set/API%20Definition%20v1.1.md#63-api-resource-parties) +de la Réf. 1 décrit la ressource **/parties** en détail. + +Si la demande **GET /parties/**_{Type}/{ID}_ réussit, le PISP recevra un rappel **PUT /parties** du switch Mojaloop. Le PISP confirme alors le bénéficiaire avec son utilisateur. + +Si le PISP reçoit un rappel **PUT /parties/**_{Type}/{ID}_**/error** (ou **PUT /parties/**_{Type}/{ID}/{SubId}_**/error**), il doit afficher l’erreur pertinente à l'utilisateur. + + +![Discovery](./assets/diagrams/transfer/1-1-discovery.svg) + +## 3.2 Accord + +### 3.2.1 Demande de transaction tierce + +Après avoir confirmé les détails du bénéficiaire avec son utilisateur, le PISP demande à l'utilisateur de saisir le `montant` à envoyer au bénéficiaire, et s’il souhaite que le bénéficiaire _reçoive_ ce montant, ou qu'il souhaite _envoyer_ ce montant (champ `amountType`). + +Si l'utilisateur a associé plus d'un compte avec l'application PISP, le PISP peut lui demander de choisir un compte source pour le virement. Une fois la source de fonds confirmée, le PISP peut déterminer : +1. le `FSPIOP-Destination` comme le DFSP avec lequel le compte de l'utilisateur est associé +2. Le champ `payer` du corps de la requête **POST /thirdpartyRequests/transactions**. `partyIdType` est `THIRD_PARTY_LINK`, `fspId` est le fspId du DFSP qui a émis la liaison, et `partyIdentifier` est l’`accountId` spécifié dans le corps **POST /consents#scopes**. + +> Voir [Accorder consentement](./transaction-patterns-linking.md#Grantconsent) pour plus d’informations. + +Le PISP génère ensuite un `transactionRequestId` aléatoire de type UUID (voir [RFC 4122 UUID](https://tools.ietf.org/html/rfc4122)). + +![1-2-1-agreement](./assets/diagrams/transfer/1-2-1-agreement.svg) + +Lors de la réception de l'appel **POST /thirdpartyRequests/transactions** du PISP, le DFSP effectue certaines validations telles que : +1. Déterminer que l'identifiant `payer` existe, et a bien été émis par ce DFSP au PISP spécifié dans `FSPIOP-Source`. +2. Confirmer que le `Consentement` identifié par `payer` existe et est valide. +3. Confirmer que le compte de l'utilisateur est actif et a suffisamment de fonds pour effectuer la transaction. +4. Toute autre validation que le DFSP souhaite effectuer. + +Si cette validation réussit, le DFSP génère un `transactionId` unique pour la demande, et appelle **PUT /thirdpartyRequests/transactions/**_{ID}_ avec ce `transactionId` et l’état `transactionRequestState` à `RECEIVED`. + +Cet appel informe le PISP que la demande de transaction tierce a été acceptée, et l'informe du `transactionId` final à suivre ultérieurement. + +Si la validation échoue, le DFSP doit envoyer un appel **PUT /thirdpartyRequests/transactions/**_{ID}_**/error** au PISP, contenant un message d’erreur expliquant l’échec. Voir [Codes erreurs](./data-models.md#errorcodes) pour plus d’informations. + +### 3.2.2 Demande d’autorisation tierce + +Le DFSP payeur (c’est-à-dire, l’institution envoyant des fonds à la demande du PISP) peut alors émettre une demande de devis (**POST /quotes**) au DFSP bénéficiaire (l’institution recevant les fonds). Après réception du rappel **PUT /quotes/**_{ID}_ du DFSP bénéficiaire, le DFSP payeur doit confirmer les détails de la transaction auprès du PISP. + +Il utilise l’appel d’API **POST /thirdpartyRequests/authorizations**. Le corps de la requête contient les champs suivants : + +- `transactionRequestId` – l'identifiant original de **POST /thirdpartyRequests/transactions**. Utilisé par le PISP pour corréler une demande d’autorisation à une demande de transaction tierce. +- `authorizationRequestId` – un UUID aléatoire généré par le DFSP pour identifier cette demande d’autorisation tierce +- `challenge` – le challenge est une `BinaryString` qui sera signée par la clé privée sur l'appareil de l'utilisateur. Bien qu'il puisse s'agir d'une chaîne aléatoire, il est recommandé qu’elle soit dérivée à partir de quelque chose de _significatif_ pour les acteurs de la transaction, qui ne puisse être prédit à l’avance par le PISP. Voir [Section 4.1](#DerivingtheChallenge) pour un exemple de dérivation du challenge. +- `transactionType` – le champ `transactionType` de la demande initiale **POST /thirdpartyRequests/transactions** + +![1-2-2-authorization](./assets/diagrams/transfer/1-2-2-authorization.svg) + +### 3.2.3 Autorisation signée + +Une fois la requête **POST /thirdpartyRequests/authorizations** reçue du DFSP Payeur, le PISP présente les conditions de la transaction à l'utilisateur, et lui demande s'il souhaite la poursuivre. + +Les résultats de la demande d'autorisation sont retournés au DFSP via **PUT /thirdpartyRequests/authorizations/**_{ID}_, où +_{ID}_ est le `authorizationRequestId`. + +Si l’utilisateur rejette la transaction, le payload envoyé dans **PUT /thirdpartyRequests/authorizations/**_{ID}_ est : + +```json +{ + "responseType": "REJECTED" +} +``` + +![1-2-3-rejected-authorization](./assets/diagrams/transfer/1-2-3-rejected-authorization.svg) + +Si l’utilisateur accepte la transaction, le payload dépend du `credentialType` du `Consent.credential` : + +1. Si `FIDO`, le PISP demande à l’utilisateur de compléter le flux [FIDO Assertion](https://webauthn.guide/#authentication) pour signer le challenge. + Le `signedPayload.fidoSignedPayload` est le `FIDOPublicKeyCredentialAssertion` renvoyé suite au processus FIDO. Voir [3.2.3.1 Signature du challenge FIDO](#SigningTheChallengeFIDO) + +2. Si `GENERIC`, la clé privée créée lors du [processus d’enregistrement du credential](../linking/README.md#162-registering-the-credential) + est utilisée pour signer le challenge. Voir [3.2.3.2 Signature du challenge avec un credential GENERIC](#SigningTheChallengeGeneric) + +#### 3.2.3.1 Signature du challenge FIDO + +Pour un `credentialType` FIDO, le PISP demande à l’utilisateur de compléter le flux [FIDO Assertion](https://webauthn.guide/#authentication) pour signer le challenge. Le champ `signedPayload.value` est le [`PublicKeyCredential`](https://w3c.github.io/webauthn/#publickeycredential) renvoyé du processus FIDO Assertion, où les `ArrayBuffer` sont encodés en chaînes base64 utf-8. Le `PublicKeyCredential` est la réponse aussi bien pour l’attestation que pour l’assertion FIDO, nous définissons l’interface suivante : `FIDOPublicKeyCredentialAssertion` : + + +```json +FIDOPublicKeyCredentialAssertion { + "id": "string", + "rawId": "string - base64 encodé utf-8", + "response": { + "authenticatorData": "string - base64 encodé utf-8", + "clientDataJSON": "string - base64 encodé utf-8", + "signature": "string - base64 encodé utf-8", + "userHandle": "string - base64 encodé utf-8" + }, + "type": "public-key" +} +``` + +Le payload final du **PUT /thirdpartyRequests/authorizations/**_{ID}_ sera ainsi : + +```json +{ + "responseType": "ACCEPTED", + "signedPayload": { + "signedPayloadType": "FIDO", + "fidoSignedPayload": FIDOPublicKeyCredentialAssertion + } +} +``` + +![1-2-3-signed-authorization-fido](./assets/diagrams/transfer/1-2-3-signed-authorization-fido.svg) + +#### 3.2.3.2 Signature du challenge avec un credential GENERIC + +Pour un credential `GENERIC`, le PISP effectue les étapes suivantes : + +1. Étant donné les entrées : + - `challenge` (`authorizationRequest.challenge`) sous forme de chaîne base64 encodée utf-8 + - `privatekey` (stockée par le PISP lors de la création du credential), chaîne base64 encodée utf-8 + - SHA256() est une fonction de hachage à sens unique, voir [RFC6234](https://datatracker.ietf.org/doc/html/rfc6234) + - sign(data, key) est une fonction de signature prenant des données et une clé privée pour produire une signature +2. _Soit `challengeHash` le résultat de la fonction SHA256() appliquée au `challenge`_ +3. _Soit `signature` le résultat de la fonction sign() appliquée à `challengeHash` et `privateKey`_ + +La réponse du PISP au DFSP utilise alors cette _signature_ comme champ `signedPayload.genericSignedPayload` : + + +Le payload final du **PUT /thirdpartyRequests/authorizations/**_{ID}_ est alors : + +```json +{ + "responseType": "ACCEPTED", + "signedPayload": { + "signedPayloadType": "GENERIC", + "genericSignedPayload": "signature encodée utf-8 base64" + } +} +``` + +![1-2-3-signed-authorization-generic](./assets/diagrams/transfer/1-2-3-signed-authorization-generic.svg) + +### 3.2.4 Validation de l’autorisation + +> __Note :__ Si le DFSP utilise un service d’autorisation auto-hébergé, cette étape peut être sautée. + +Le DFSP doit maintenant vérifier que le challenge a bien été signé, et par la clé privée correspondant à la clé publique attachée à l'objet `Consent`. + +Le DFSP utilise l'appel d’API **POST /thirdpartyRequests/verifications**, dont le corps est composé de : + +- `verificationRequestId` – Un UUID créé par le DFSP pour identifier cette vérification. +- `challenge` – Le même challenge envoyé au PISP dans [3.2.2 Demande d’autorisation tierce](#ThirdpartyAuthorizationRequest) +- `consentId` – L’identifiant du Consent qui contient la clé publique credential à utiliser pour vérifier cette transaction. +- `signedPayloadType` – Le type de SignedPayload, selon le type d’identifiant enregistré par le PISP +- `fidoValue` ou `genericValue` – Le champ correspondant du corps de la requête **PUT /thirdpartyRequests/authorizations** du PISP. +Le DFSP doit rechercher le `consentId` d’après les détails du `payer` de la `ThirdpartyTransactionRequest`. + +![1-2-4-verify-authorization](./assets/diagrams/transfer/1-2-4-verify-authorization.svg) + +## 3.3 Transfert + +Après validation du challenge signé, le DFSP peut lancer une transaction Mojaloop standard via l’API FSPIOP. + +Après avoir reçu l’appel **PUT /transfers/**_{ID}_ du switch, le DFSP recherche le ThirdpartyTransactionRequestId du transfert donné puis envoie un appel **PATCH /thirdpartyRequests/transactions/**_{ID}_ au PISP. + +Une fois ce rappel reçu, le PISP sait que le transfert est réussi et peut en informer son utilisateur. + +![1-3-transfer](./assets/diagrams/transfer/1-3-transfer.svg) + +# 4. Demander le statut de la TransactionRequest + +Un PISP peut effectuer un **GET /thirdpartyRequests/transactions/**_{ID}_ pour obtenir le statut d’une demande de transaction. + +![PISPTransferSimpleAPI](./assets/diagrams/transfer/get_transaction_request.svg) + +1. Le PISP effectue un **GET /thirdpartyRequests/transactions/**_{ID}_ +1. Le switch valide la demande et répond par `202 Accepted` +1. Le switch recherche l’endpoint pour `dfspa` pour la transférer à DFSP A +1. DFSPA valide la demande et répond avec `202 Accepted` +1. Le DFSP recherche la demande de transaction via son `transactionRequestId` + - Si elle est introuvable, il appelle **PUT /thirdpartyRequests/transactions/**_{ID}_**/error** vers le switch, avec un message d’erreur pertinent + +1. Le DFSP vérifie que l'entête `FSPIOP-Source` correspond à celui d’origine du **POST /thirdpartyRequests/transactions** + - Sinon il appelle **PUT /thirdpartyRequests/transactions/**_{ID}_**/error** vers le switch, avec un message d'erreur pertinent + +1. Le DFSP appelle **PUT /thirdpartyRequests/transactions/**_{ID}_ avec le corps suivant : + ``` + { + transactionRequestState: TransactionRequestState + } + ``` + + Où `transactionId` est l’identifiant de transaction généré par le DFSP, et `TransactionRequestState` est `RECEIVED`, `PENDING`, `ACCEPTED`, `REJECTED`, comme défini dans [7.5.10 TransactionRequestState](https://github.com/mojaloop/mojaloop-specification/blob/master/fspiop-api/documents/v1.1-document-set/API%20Definition%20v1.1.md#7510-transactionrequeststate) de la Définition d’API + + +1. Le switch valide la demande et répond avec `200 OK` +1. Le switch recherche l’endpoint pour `pispa` et transmet au PISP +1. Le PISP valide la demande et répond avec `200 OK` + +# 5. Conditions d’erreur + +Après que le PISP a initié la demande de transaction tierce via **POST /thirdpartyRequests/transactions**, le DFSP doit envoyer soit un **PUT /thirdpartyRequests/transactions/**_{ID}_**/error** soit un rappel **PATCH /thirdpartyRequests/transactions/**_{ID}_ pour informer le PISP du statut final. + +- **PATCH /thirdpartyRequests/transactions/**_{ID}_ est utilisé pour informer le PISP du statut final. Il peut s’agir soit d’un rejet par l’utilisateur, soit d’une approbation ayant abouti à un transfert réussi. +- **PUT /thirdpartyRequests/transactions/**_{ID}_**/error** informe le PISP en cas d’échec de la demande. +- Si le PISP ne reçoit aucun de ces rappels avant l’expiration `expiration` spécifiée dans la requête **POST /thirdpartyRequests/transactions**, il peut considérer la demande comme échouée et en informer son utilisateur. + + +## 5.1 Recherche de bénéficiaire infructueuse + +Quand le PISP effectue une recherche de bénéficiaire (**GET /parties/**_{Type}/{ID}_), il peut recevoir le rappel **PUT /parties/**_{Type}/{ID}_**/error**. + +Voir [6.3.4 Parties Error Callbacks](https://docs.mojaloop.io/mojaloop-specification/documents/API%20Definition%20v1.0.html#634-error-callbacks) de la Définition d’API FSPIOP pour plus d’informations sur ce rappel d’erreur. + +Dans ce cas, le PISP peut vouloir afficher un message d’erreur à l’utilisateur, en l’invitant à essayer avec un autre identifiant ou plus tard. + +## 5.2 Mauvaise demande de transaction tierce + +Quand le DFSP reçoit le **POST /thirdpartyRequests/transactions** du PISP, les erreurs suivantes peuvent se produire : +1. Le `payer.partyIdType` ou `payer.partyIdentifier` est invalide ou pas lié à un **Consent** valide connu du DFSP +2. Le compte utilisateur identifié par `payer.partyIdentifier` n'a pas assez de fonds +3. La devise précisée dans `amount.currency` n’est pas prise en charge par le compte de l’utilisateur +4. `payee.partyIdInfo.fspId` n’est pas défini — il s’agit d’une propriété optionnelle, mais le fspId bénéficiaire sera requis pour adresser correctement la demande de devis +5. Tout autre contrôle ou vérification côté DFSP échoue + +Dans ce cas, le DFSP doit informer le PISP de l’échec en envoyant un rappel **PUT /thirdpartyRequests/transactions/**_{ID}_**/error**. + +![3-2-1-bad-tx-request](./assets/diagrams/transfer/3-2-1-bad-tx-request.svg) + +Le PISP peut alors informer son utilisateur de l’échec, et proposer de relancer une demande s’il le souhaite. + +## 5.3 Échec API FSPIOP aval + +Le DFSP peut ne pas vouloir, ou ne pas être en mesure, d’exposer des détails sur les échecs API FSPIOP aval au PISP. + +Par exemple, avant d’émettre un **POST /thirdpartyRequests/authorizations** au PISP, si le **POST /quotes** avec le FSP bénéficiaire échoue, le DFSP envoie un rappel **PUT /thirdpartyRequests/transactions/**_{ID}_**/error** au PISP. + +![3-3-1-bad-quote-request](./assets/diagrams/transfer/3-3-1-bad-quote-request.svg) + +Un autre exemple : si la requête **POST /transfers** échoue : + +![3-3-2-bad-transfer-request](./assets/diagrams/transfer/3-3-2-bad-transfer-request.svg) + + +## 5.4 Challenge signé invalide + +Après réception d’un **POST /thirdpartyRequests/authorizations** du DFSP, le PISP demande à l'utilisateur de signer le `challenge` via l’identifiant enregistré lors du flux de liaison de comptes. + +Le challenge signé est retourné au DFSP via **PUT /thirdpartyRequest/authorizations/**_{ID}_. + +Le DFSP : +1. Valide lui-même le challenge signé +2. Ou interroge le Auth-Service via **thirdpartyRequests/verifications** pour vérifier la signature contre la clé publique enregistrée dans le Consent. + +Si le challenge signé est invalide, le DFSP appelle alors **PUT /thirdpartyRequests/transactions/**_{ID}_**/error** vers le PISP. + +### Cas 1 : DFSP se charge de vérifier le challenge + +![3-4-1-bad-signed-challenge-self-hosted](./assets/diagrams/transfer/3-4-1-bad-signed-challenge-self-hosted.svg) + +### Cas 2 : DFSP utilise le Auth-Service hébergé par le hub pour vérifier le challenge signé contre le credential enregistré. + +![3-4-2-bad-signed-challenge-auth-service](./assets/diagrams/transfer/3-4-2-bad-signed-challenge-auth-service.svg) + +## 5.5 Expiration de la demande de transaction tierce + +Si le PISP ne reçoit aucun des rappels ci-dessus avant la date d’expiration `expiration` définie dans **POST /thirdpartyRequests/transactions**, il peut considérer la demande comme échouée et en informer immédiatement l'utilisateur. + + +![3-6-tpr-timeout](./assets/diagrams/transfer/3-6-tpr-timeout.svg) + +# 6. Annexe + +## 6.1 Dérivation du challenge + +1. _Soit `quote` la valeur du corps de la réponse du **PUT /quotes/**_{ID}_ _ +2. _La fonction `CJSON()` est l’implémentation du JSON Canonical vers une chaîne, conforme à [RFC-8785 - Canonical JSON format](https://tools.ietf.org/html/rfc8785)_ +3. _La fonction `SHA256()` est la fonction de hachage SHA-256, conforme à [RFC-6234](https://tools.ietf.org/html/rfc6234)_ +4. Le DFSP doit générer la valeur `jsonString` en appliquant `CJSON(quote)` +5. Le `challenge` est la valeur de `SHA256(jsonString)` \ No newline at end of file diff --git a/docs/fr/technical/api/thirdparty/transaction-patterns.md b/docs/fr/technical/api/thirdparty/transaction-patterns.md new file mode 100644 index 000000000..04c3beaa2 --- /dev/null +++ b/docs/fr/technical/api/thirdparty/transaction-patterns.md @@ -0,0 +1,6 @@ +## Modèles de Transactions + +Les interactions et exemples illustrant comment un DFSP et un PISP interagissent via l’API Tierce Partie se trouvent dans les documents suivants sur les modèles de transaction : + +1. [Liaison](./transaction-patterns-linking.md) décrit comment un lien de compte et des identifiants peuvent être établis entre un DFSP et un PISP +2. [Transfert](./transaction-patterns-transfer.md) décrit comment un PISP peut initier un paiement à partir du compte d’un DFSP en utilisant le lien de compte \ No newline at end of file diff --git a/docs/fr/technical/business-operations-framework/Microfrontend-JAMStack.md b/docs/fr/technical/business-operations-framework/Microfrontend-JAMStack.md new file mode 100644 index 000000000..9d30416e2 --- /dev/null +++ b/docs/fr/technical/business-operations-framework/Microfrontend-JAMStack.md @@ -0,0 +1,266 @@ +# Micro-frontend - conception JAMStack +## Vue d'ensemble +L'objectif de la conception micro-frontend - JAMStack est de créer un framework qui : + +- facilite la collaboration de la communauté (en permettant le développement indépendant de composants) +- rend les extensions ou personnalisations faciles +- permet aux membres de la communauté de contribuer en retour à l'OSS sans forker l'ensemble du code source + +### Micro-frontends +Le framework utilise des micro-frontends comme moyen de découpler les parties de l'UI pour permettre des bases de code maintenables, des équipes autonomes, des publications indépendantes et des mises à niveau progressives de parties de l'UI. + +### JAMStack +L'implémentation [JAMStack](https://jamstack.org/) réduit le rôle du serveur web à la distribution de fichiers de balisage statiques, en maintenant la fonctionnalité dans JavaScript (qui s'exécute dans le navigateur client) et dans l'API backend. +:::warning JAMStack signifie : + **J** - JavaScript + **A** - APIs + **M** - Static markup (balisage statique) + ::: +Cette implémentation de stack est considérée comme une bonne pratique car elle : +- est beaucoup plus simple à sécuriser +- offre une bonne expérience client grâce à des temps de réponse web rapides +- est peu coûteuse à héberger + +De plus, les éléments suivants ont également été conçus et font normalement partie d'une implémentation JAMStack : +- déploiement sur un réseau de distribution de contenu (CDN) +- déploiements atomiques +- utilise des micro-frontends chargés dynamiquement, de sorte que la mise à jour vers la dernière version est automatique + +## Pile technologique + +1. **React** +Le framework est basé sur la bibliothèque React. +C'est la bibliothèque Single Page Application (SPA) la plus populaire en usage, et de plus ce choix nous permet de capitaliser sur d'autres efforts communautaires facilitant une conversion facile vers cette bibliothèque. +Elle peut être améliorée en utilisant des bibliothèques de conteneurs d'état (Redux, Flux, MobX), mais il n'y a aucune restriction sur une utilisation spécifique. +Les micro-frontends sont livrés avec des stores Redux préconfigurés et isolés. + +2. **Webpack 5** +Webpack 5 est actuellement le seul bundler JavaScript qui supporte la séparation de build à distance. Cela se fait en utilisant le Module Federation Plugin. +Il permet une composition au moment de l'exécution pour offrir une expérience utilisateur fluide et entièrement transparente, résultant en une Single Page Application traditionnelle. +Il y a des avantages supplémentaires par rapport aux autres technologies, résultant tous en une empreinte réduite et une meilleure expérience globale pour les utilisateurs. +Webpack 5 implémentera l'intégration host/child micro-frontends au moment de l'exécution. + +3. **CI/CD et déploiements atomiques** (par exemple, Github Actions) +Chaque implémentation du Business Operations Framework devra implémenter sa propre solution de déploiement atomique. +Le projet Business Operations standard utilisera Github Actions pour exécuter le pipeline d'intégration continue, exécuter les tests pertinents, construire le micro-frontend individuel et déployer les fichiers statiques résultants sur un CDN et/ou créer une image Docker. +Chaque micro-frontend est publié en complète autonomie : l'application composée peut utiliser les versions mises à jour de chaque micro-frontend individuel automatiquement, sans nécessiter de coordination supplémentaire. + +4. **Fonctionnement sur un CDN** +Les micro-frontends peuvent fonctionner sur un CDN. Les builds individuels sont composés uniquement de fichiers statiques (HTML, CSS, JavaScript) et peuvent être déployés dans différents emplacements / différentes URLs. +Tant qu'ils sont disponibles via une connexion sécurisée (HTTPS), les micro-frontends peuvent être servis depuis n'importe quel emplacement et également depuis différents CDN. + +5. **Fonctionnement dans Kubernetes** +Les micro-frontends peuvent fonctionner dans un environnement Kubernetes. Deux approches peuvent être adoptées ici : + - Les micro-frontends individuels et l'application shell sont conteneurisés (par exemple avec Docker) puis hébergés dans Kubernetes. +L'hôte et les applications enfants peuvent être déployés sur le même cluster ou sur des clusters différents tant qu'ils sont accessibles publiquement. + - Déployer un CDN privé dans le cluster Kubernetes et héberger les fichiers de balisage statiques sur le CDN. +Divers CDN compatibles avec Kubernetes sont disponibles. + +## Construction Webpack + +L'hôte et les applications enfants incluent des scripts pour construire les artefacts de distribution. La construction peut être effectuée sur la machine hôte du développeur, dans le CI et dans Docker. + +## Chargement des micro-frontends + +L'hôte est responsable du chargement des applications enfants au moment de l'exécution. Il recueille des informations sur les enfants disponibles au moment de l'exécution, soit depuis une API soit depuis un registre. + +L'hôte inclut un moteur interne responsable du chargement uniquement des enfants nécessaires lorsqu'ils doivent être affichés. + +Les micro-frontends individuels ne seront pas chargés lorsque ce n'est pas nécessaire (par exemple, lorsqu'une page spécifique n'est pas accédée par l'utilisateur). + +**Diagramme de séquence de haut niveau illustrant comment les microservices sont chargés** +![Diagramme de séquence de haut niveau illustrant comment les microservices sont chargés](../../../.vuepress/public/microfrontendloading.png) + +### Référentiel de micro-frontends +Afin de fournir une autorité centralisée responsable du contrôle des micro-frontends individuels répondant aux exigences nécessaires, il est suggéré de construire une solution qui fonctionne comme un registre. + +Le registre servirait les objectifs suivants : + +1. permettre à la communauté d'enregistrer les micro-frontends et de spécifier certains détails +2. exposer une API utilisée par l'hôte pour récupérer des informations sur les micro-frontends disponibles +3. fournir des informations sur les versions des micro-frontends disponibles + +Le registre n'existe pas encore, et il n'est pas judicieux de le créer pour le moment. + +## Déploiements + +Le diagramme de vue d'ensemble suivant montre le déploiement des micro-frontends sur un CDN. +::: tip REMARQUE +Le déploiement de l'API de contexte délimité n'est pas couvert dans ce diagramme. +::: +![Diagramme de vue d'ensemble montrant le déploiement](../../../.vuepress/public/BizOps-Framework-Micro-frontend-deploy.png) + +Les micro-frontends utilisent des déploiements atomiques et aucun build complet n'est jamais requis. + +Chaque micro-frontend individuel se déploie indépendamment des autres. + +### Intégration Continue / Livraison Continue (CI/CD) + +Chaque micro-frontend a sa propre configuration CI/CD ; il n'est pas nécessaire de partager la même configuration ou d'utiliser le même outil CI. + +Le CI/CD peut être configuré pour supporter plusieurs environnements, par exemple DEV, QA, PROD. + +Voici un exemple de fichier montrant un flux de travail git action. + +```yml +# This is a basic workflow to help you get started with Actions + +name: CI + +# Controls when the action will run. Triggers the workflow on push or pull request +# events but only for the master branch +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + build: + # The type of runner that the job will run on + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [16.x] + + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + + # Runs a single command using the runners shell + - name: Use NodeJS ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - name: Cache node modules + uses: actions/cache@v2 + env: + cache-name: cache-node-modules + with: + # npm cache files are stored in `~/.npm` on Linux/macOS + path: '**/node_modules' + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + - run: yarn install --frozen-lockfile + - run: yarn lint + - run: yarn test + - run: yarn build +# - name: Slack Notification +# uses: rtCamp/action-slack-notify@v2.0.2 +# env: +# SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} +``` + +### CDN + +L'application SPA résultante est servie par un CDN ou plusieurs CDN. Les micro-frontends individuels peuvent résider dans différents CDN. + +### Kubernetes + +L'application SPA résultante peut fonctionner et être servie dans un ou plusieurs environnements Kubernetes. + +### Application hôte + +L'application hôte est livrée avec une configuration préconfigurée prête à l'emploi. Elle ne nécessite aucune configuration particulière différente d'un SPA traditionnel, autre que la configuration du Module Federation de Webpack 5. +Elle agira comme l'orchestrateur, chargeant les micro-frontends distants et leur fournissant des fonctionnalités à l'échelle de l'application, par exemple l'authentification, le RBAC, le routage côté client. + +Il n'y a pratiquement aucune limite à la façon dont l'hôte peut croître et être étendu. +Il est cependant suggéré de centraliser toutes les communications hôte-enfant et les composants partagés dans une bibliothèque externe afin que l'hôte et les enfants aient la même connaissance et que l'intégration ne se brise pas. + +### Versionnement des micro-frontends +​L'approche suggérée est de construire un registre où les applications individuelles sont enregistrées. Le registre permettrait de définir une configuration sur chaque application et de suivre toutes les versions disponibles. +​ +Le registre exposerait ensuite une API consommée par l'hôte, fournissant des informations sur les micro-frontends disponibles, les versions et les emplacements des artefacts. +​ +Le registre serait administré par un opérateur de confiance via une interface utilisateur ; il serait de la responsabilité de l'opérateur de confiance de décider quelle version de chaque application individuelle serait rendue publique et disponible pour l'hôte à charger. +Il permettrait également de tester facilement des versions et de les annuler si nécessaire, tout cela sans avoir besoin de reconstruire et de redéployer les applications. +​ +::: tip REMARQUE +Les artefacts de build JS créés par Webpack n'incluent pas la version dans le nom du fichier. Il pourrait être nécessaire de mettre à jour le build afin de différencier les versions. Une approche plus simple qui ne nécessite pas de mettre à jour la configuration de build serait d'héberger les versions sur différentes URLs. +::: +​ +### Mise à niveau de l'hôte +​L'hôte est assez bien isolé et la seule chose nécessaire pour faire un versionnement correct est d'utiliser la commande intégrée `yarn version`. Elle créera un nouveau tag git et incrémentera la version de `package.json` selon la façon dont la commande est utilisée (CLI interactif). +​ +### Mise à niveau des remotes +​Les remotes sont isolés et la seule chose nécessaire pour faire un versionnement correct est d'utiliser la commande intégrée `yarn version`. Elle créera un nouveau tag git et incrémentera la version de `package.json` selon la façon dont la commande est utilisée (CLI interactif). + +### Composition Menu / Application +​L'hôte est configuré pour construire dynamiquement la structure _Menu_ et _Pages_ (avec react-router). Actuellement, le(s) composant(s) _Menu_ est importé de la bibliothèque `@modusbox/react-components`. +​ +Il n'est pas strictement nécessaire d'utiliser de tels composants et l'hôte / les remotes pourraient utiliser des composants personnalisés, à condition qu'ils permettent la composition dynamique et supportent le routage. +​​ +## Motivation des micro-frontends en détail + +​La construction d'interfaces utilisateur évolutives et distribuées est complexe ; la complexité logique, la configuration des tests, les coûts de build et de déploiement augmentent avec le temps. ​Les décisions architecturales prises dans la phase initiale peuvent générer une complexité inutile et fortement affecter les coûts de développement dans les étapes ultérieures.​ De plus, un seul projet ne s'adapte pas bien aux équipes distribuées travaillant en collaboration sur la même base de code.​ Passer à une configuration micro-frontend peut résoudre tous les problèmes ci-dessus ; elle s'adapte bien, les déploiements atomiques ne nécessitent pas de build complet, et les équipes indépendantes peuvent utiliser différentes bases de code.​​ + +### Ce qui définit un micro-frontend + +​Les règles principales qui peuvent définir une configuration micro-frontend peuvent être résumées comme suit :​ + +**Responsabilité unique** +Frontières définies et fermées +Orchestration centralisée​ +Responsabilité unique +​Chaque application micro-frontend ne devrait fournir que des fonctionnalités métier spécifiques. Une application micro-frontend n'a pas besoin de connaître d'autres aspects de l'activité et peut évoluer indépendamment.​ + +**Frontières définies et fermées** +​Chaque micro-frontend devrait être isolé, posséder ses propres données, et la communication directe entre micro-frontends ne devrait pas être possible.​ + +**Orchestration centralisée** +​Chaque micro-frontend devrait être chargé, géré et contrôlé par un hôte. Les fonctionnalités à l'échelle de l'application sont fournies par l'hôte (authentification, routage, etc.).​​ + +### Types de configurations de micro-frontends + +​Il existe plusieurs façons d'implémenter des micro-frontends, pour en citer quelques-unes :​ +- Composition par Iframe +- Composition à l'exécution +- Composition par fédération de modules (framework unique)​ + +**Composition par Iframe** +​La composition par Iframe est probablement la façon la plus ancienne et la plus facile d'implémenter des micro-frontends, grâce à l'ancien support HTML pour les iframes et l'isolation de contexte native qu'elle offre. La communication entre l'hôte et les micro-frontends est généralement difficile à réaliser et ne s'adapte pas bien au web moderne.​ + +**Composition à l'exécution** +​La composition à l'exécution est l'idée de charger dynamiquement des scripts JS situés sur des URLs http/https et de composer le résultat localement. ​Bien qu'elle vous permette théoriquement d'utiliser des technologies indépendantes pour chaque micro-frontend, elle est également très difficile à maintenir en raison des différences entre les frameworks utilisés dans les micro-frontends.​​ + +**Composition SPA** +​La fédération de modules est une technologie implémentée dans Webpack 5 qui vous permet de charger dynamiquement des modules distants au moment de l'exécution. Combinée avec un framework d'application unique (par exemple React), elle permet aux applications construites d'être divisées en plusieurs micro-frontends sans sacrifier les avantages qu'un SPA offre. Elle présente également l'avantage de tailles de build plus petites.​​ + +### La configuration choisie + +Nous avons choisi d'utiliser la composition SPA avec Webpack 5 et React. Il vaut la peine de mentionner qu'afin de construire un SPA avec plusieurs micro-frontends, un contrat spécifique et rigoureux entre l'hôte et les frontends doit être implémenté et respecté.​ Dorénavant nous ferons référence aux micro-frontends dans la forme technique utilisée par Webpack 5 : les remotes. ​Le contrat est défini par les règles suivantes :​ + +- L'hôte récupère la liste des remotes dynamiquement et de manière asynchrone +- L'hôte est responsable du chargement des remotes +- L'hôte partage un certain contexte avec les remotes (routage, authentification) +- Les remotes ont des noms uniques +- Les remotes sont déployés sur différentes URLs +- Les remotes n'utilisent pas de règles CSS globales +- Les remotes s'exportent eux-mêmes comme défini par les règles de fédération de modules +- Les remotes partagent la même version de React (et de certaines bibliothèques)​ + +Lorsque ces règles sont respectées, il n'y a pratiquement aucune limite à la façon dont le SPA peut croître.​ La plupart des dépendances de base utilisées dans chaque frontend sont fournies par l'hôte. Cela facilite leur mise à niveau. ​Chaque application est construite indépendamment des autres ; le pipeline CI/CD reste rapide, les déploiements atomiques ne nécessitent pas de configurations complexes et chaque remote est publié à son propre rythme sans avoir besoin de modifier l'hôte de quelque façon que ce soit.​ + +### Exemple en direct hébergé sur un CDN + +Consultez l'exemple en direct suivant : [https://microfrontend-shell-boilerplate.vercel.app/](https://microfrontend-shell-boilerplate.vercel.app/) + +## Dépôts Git + +Voici une liste de dépôts Git qui font partie de cette implémentation : + + - [Micro frontend-shell-boilerplate](https://github.com/mojaloop/microfrontend-shell-boilerplate) + - [Micro frontend-boilerplate](https://github.com/mojaloop/microfrontend-boilerplate) + - [Micro frontend-utils](https://github.com/modusintegration/microfrontend-utils) +Bibliothèque partagée avec l'application shell et le micro-frontend. + - [Reporting-Hub BizOps Role Assignment Micro-frontend](https://github.com/mojaloop/reporting-hub-bop-role-ui) + - [Reporting-Hub BizOps Transaction Tracing Micro-frontend](https://github.com/mojaloop/reporting-hub-bop-trx-ui) + diff --git a/docs/fr/technical/business-operations-framework/README.md b/docs/fr/technical/business-operations-framework/README.md new file mode 100644 index 000000000..ac56762f9 --- /dev/null +++ b/docs/fr/technical/business-operations-framework/README.md @@ -0,0 +1,58 @@ +# Introduction + +Rejoignez la collaboration pour construire un ensemble de processus métier fondamentaux permettant un **"démarrage rapide"**, faciles à personnaliser, à contribuer en open source et conformes aux meilleures pratiques. + +Le Business Operations Framework vise à aider les opérateurs de Hub à construire et déployer des portails de processus métier qui soutiennent leurs processus métier tels que définis dans la [documentation métier Mojaloop](https://docs.mojaloop.io/mojaloop-business-docs/). Le Business Operations Framework soutient la collaboration communautaire dans la création d'une expérience utilisateur (UX) pour un opérateur de Hub Mojaloop qui comprend des API robustes, suit les meilleures pratiques et est sécurisé par conception. L'objectif est de soutenir davantage l'adoption et d'améliorer la valeur prête à l'emploi de la solution Mojaloop. + +L'interface utilisateur (UI) résultante n'est pas destinée à être exhaustive, mais à démontrer une expérience web exemplaire qui est facile à étendre et à personnaliser. Il est donc important que le contrôle d'accès basé sur les rôles (RBAC), l'interfaçage avec les systèmes standard de gestion des identités et des accès (IAM), le contrôle de sécurité au niveau API, les micro-frontends et les flux de travail de validation maker-checker soient pris en charge. L'architecture UX suit un bundle pré-compilé avec un modèle API de support pouvant être déployé sur un réseau de distribution de contenu (CDN). + +Ce document fournit une conception plus détaillée, incluant les aspects de sécurité, les technologies utilisées et les modèles d'architecture. + +Le framework : +1. Implémente une intégration/implémentation RBAC et IAM conforme aux meilleures pratiques. +2. Comprend un plan de déploiement pour intégrer la solution RBAC et IAM dans Mojaloop. +3. Comprend un plan de déploiement pour le portail UI afin qu'il puisse être déployé dans un réseau CDN. +4. Utilise des micro-frontends construits à partir de différents dépôts pour découpler les efforts communautaires et faciliter les extensions et personnalisations. +5. Fournit une piste d'audit de toutes les activités effectuées. + +Trois niveaux ou degrés de contrôle sont nécessaires lors de la configuration d'une sécurité conforme aux meilleures pratiques : +1. Accès quotidien aux interfaces utilisateur IAM où les utilisateurs sont créés, suspendus et leurs rôles assignés. +2. Mappages des rôles aux permissions, qui peuvent être modifiés via une demande de changement de configuration. +3. Restrictions sur l'accès à l'API en fonction des permissions disponibles pour un sujet (un utilisateur ou un client API) à travers leurs rôles. + +## Effort communautaire – liste des tâches à faire +La première livraison de ce framework comprend une tranche verticale mince pour démontrer l'implémentation fonctionnelle de bout en bout du framework. Bien que cette fonction livrée en premier serve un objectif important, ce n'est pas l'objectif final de ce projet. L'objectif est de fournir un framework auquel d'autres efforts communautaires pourront contribuer. Voici la liste actuelle des tâches d'API de support de processus backend/micro-frontends qui sont destinés à être ajoutés à ce framework par les efforts d'implémentation de la communauté Mojaloop : + +|Catégorie|Description|Effort communautaire contributeur| +| --- | --- | --- | +|**Configuration de la plateforme**|Processus pour configurer la plateforme afin qu'elle applique le schéma et les règles du schéma.| - | +|**Gestion de la plateforme**|Contrôles de gestion opérationnelle technique pour la plateforme.| Actuellement réalisé avec Kibana Application Performance Monitoring (APM) et Elasticsearch. Aucun plan actuel de migration vers le framework. | +|**Gestion de la liquidité**|Support de processus pour la gestion de la liquidité.|Financial Portal V2 - pas encore intégré au framework.| +|**Gestion du cycle de vie des participants
    (vue Hub)**|Gérer l'intégration et les transitions d'état des participants.|Financial Portal V2 - pas encore intégré au framework.| +|**Gestion du cycle de vie des participants
    (vue DFSP)**|Permettre aux DFSP de gérer leur statut et leur interaction avec le Hub.| - | +|**Gestion du règlement**|Interface de gestion pour le règlement.|Rapports de réconciliation DFSP - les rapports Myanmar MFI Digitization (MMD) sont en cours d'intégration dans le framework (accessibles via une API).
    Règlement net différé multilatéral - Financial Portal V2 pas encore disponible dans le framework.| +|**Gestion des transferts et transactions**| Vue des opérations métier de toutes les transactions au niveau du hub. | Financial Portal V2 - en cours de conversion dans le framework avec des améliorations. Activation du traçage d'un transfert de bout en bout. | +|**Gestion des accords (cotations)**| - | - | +|**Gestion de la recherche et découverte de compte**| - | - | +|**Gestion des paiements initiés par des tiers**| - | - | +|**Gestion des frais (interchange et facturation)**| - | - | +|**Rapports et analytique**| - | - | + +## Architecture de référence +Le groupe de travail sur l'architecture de référence a - à travers un processus collaboratif - conçu l'architecture de la version future/suivante de Mojaloop. Le Business Operations Framework est conçu pour fonctionner sur la version actuelle de Mojaloop (core v1.0). Le Business Operations Framework doit cependant être compatible avec l'architecture de référence et, dans la mesure du possible, faciliter le passage vers la conception de l'architecture de référence. + +Les éléments suivants du projet Business Operations Framework contribuent directement à la construction d'une architecture de référence : +1. **Contexte délimité de sécurité** +L'implémentation RBAC de ce groupe de travail a utilisé certaines idées de conception et séparations définies dans le contexte délimité de sécurité de l'architecture de référence. Elle n'a pas implémenté les interfaces nécessaires pour être considérée comme une implémentation de contexte délimité de sécurité. +2. **Contexte délimité de reporting** +Une partie du contexte délimité de reporting est construite dans ce groupe de travail. + +La division du frontend en micro-frontends pouvant être construits, testés et publiés indépendamment ; donnant aux équipes qui créent des solutions dans chaque contexte délimité la capacité de construire indépendamment des fonctionnalités API et l'UI correspondante. Les personnalisations et extensions de chaque contexte délimité sont également facilement supportées avec cette conception. + +Voici une vue d'ensemble de la façon dont les API opérationnelles, les API d'expérience et les micro-frontends peuvent être combinés dans les parties qui forment le Business Operations Framework. + +![Diagramme de vue d'ensemble de l'architecture compatible avec l'architecture de référence](../../../.vuepress/public/BizOps-Framework-BizOps-Framework.png) + + +## IaC 4.xx +La prochaine version du projet "Infrastructure as Code" prévoit d'utiliser un ensemble d'outils différent de ceux actuellement utilisés dans la communauté Mojaloop ; c'est-à-dire que WSO2 avec son Identity Server en tant que Key Manager (IS-KM) et les implémentations HAproxy seront remplacés par Keycloak et les outils Ambassador - Envoy. Cette conception est compatible avec la prochaine version IaC. diff --git a/docs/fr/technical/business-operations-framework/ReportDeveloperGuide.md b/docs/fr/technical/business-operations-framework/ReportDeveloperGuide.md new file mode 100644 index 000000000..c98602ac3 --- /dev/null +++ b/docs/fr/technical/business-operations-framework/ReportDeveloperGuide.md @@ -0,0 +1,319 @@ +# Guide du développeur de rapports +Ceci est un guide du développeur pour la construction et le déploiement de rapports pour le service REST de reporting qui fait partie du déploiement au niveau du Hub. + +## Architecture +![Diagramme d'architecture du service de reporting](../../../.vuepress/public/RestReportingArchitecture.drawio.png) +[Voici](https://github.com/mojaloop/reporting) le dépôt de l'opérateur du service de reporting. +L'opérateur du service de reporting a été conçu pour être accessible soit par un opérateur de hub, soit par un opérateur DFSP. +L'accès au rapport est contrôlé via l'intégration RBAC qui fait partie du business operations framework. Ory Oathkeeper protège le point de terminaison API de reporting, et Keto est vérifié par l'opérateur du service de reporting pour une autorisation de rapport plus précise. +Les données du rapport sont interrogées depuis la base de données SQL de reporting qui est actuellement une synchronisation unidirectionnelle de la base de données du central ledger. +Chaque rapport est installé sur le système en tant que ressource personnalisée Kubernetes qui est un fichier .yaml d'un format particulier appliqué au cluster Kubernetes. [Voici](https://github.com/mojaloop/reporting-k8s-templates) le dépôt des templates de rapports open source. La définition de ressource personnalisée pour un rapport est définie [ici](https://github.com/mojaloop/reporting-k8s-templates/blob/master/crds/reporting-crd.yaml), qui décrit le format de la ressource personnalisée. + +## RBAC +L'accès aux rapports est contrôlé via le RBAC lorsque le service est déployé via la configuration IaC standard. +Cela signifie que pour accéder à un rapport, un utilisateur devra avoir l'autorisation correcte assignée. Cela est réalisé grâce à l'assignation de rôles à l'utilisateur et à l'assignation de l'accès aux participants. + +La première vérification d'autorisation est effectuée par Ory Oathkeeper qui dispose d'une règle qui lie la permission +``` +reportingApi +``` +à l'accès au point de terminaison API du service de reporting. + +La vérification d'autorisation suivante est effectuée par l'opérateur du service de reporting. La permission d'accéder au rapport particulier est vérifiée. La permission qui est vérifiée est définie dans la ressource personnalisée. Cette permission est optionnelle et utilisera sinon le nom (metadata) du rapport tel que défini dans la ressource personnalisée. +### Exiger la permission DFSP +Si le rapport est destiné à un participant ou DFSP particulier, il est important d'utiliser le paramètre 'dfspId'. Ce paramètre vérifie d'abord l'autorisation du participant avant d'exécuter et de produire le rapport. +C.-à-d. +``` yaml + params: + - name: dfspId + required: true +``` +### Exécuter le rapport +Vous devrez d'abord vous connecter. La façon la plus simple de le faire est de se connecter au Financial Portal. Cela crée les tokens de cookies d'autorisation et d'authentification que le rapport utilise ensuite. +Voici un exemple d'accès au rapport directement après la connexion. +``` +https://bofportal.YourEnvironment.YourDomain.com/proxy/reports/MyReportPath?ReportParamter=25 +``` + +### Formats de sortie du rapport +Le rapport prend en charge plusieurs formats de sortie. Pour basculer entre ceux-ci, utilisez le paramètre format dans la requête Rest. +1. Fichier Excel +``` +&format=xlsx +``` +2. Valeurs séparées par des virgules +``` +&format=csv +``` +3. Format classe JSON +``` +&format=json +``` +4. Format navigateur HTML (c'est le format de sortie par défaut) +``` +&format=html +``` + +## Ressource personnalisée Kubernetes +Tous les aspects d'un rapport sont contrôlés via le fichier de ressource personnalisée mojaloopreport. La définition de ce fichier est la suivante. + +### Définition de ressource personnalisée +``` yml +kind: CustomResourceDefinition +apiVersion: apiextensions.k8s.io/v1 +metadata: + name: mojaloopreports.mojaloop.io +spec: + group: mojaloop.io + scope: Namespaced + names: + plural: mojaloopreports + singular: mojaloopreport + shortNames: + - mlreport + kind: MojaloopReport + listKind: MojaloopReportList + versions: + - name: v1 + served: true + storage: true + schema: + openAPIV3Schema: + description: MojaloopReport is the Schema for MojaloopReport API + type: object + properties: + apiVersion: + description: >- + APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the + latest internal value, and may reject unrecognized values. More + info: + https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: >- + Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the + client submits requests to. Cannot be updated. In CamelCase. + More info: + https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: MojaloopReport.spec describes the desired state of my resource + type: object + required: + - endpoint + - queries + - template + properties: + permission: + description: Permission to be needed to access this report. This is optional. If unspecified, the name of the resource will be considered as permission. + type: string + endpoint: + description: Reporting endpoint + type: object + required: + - path + properties: + path: + description: Report URL path + type: string + params: + description: Report query params + type: array + items: + description: Query param + type: object + required: + - name + properties: + name: + description: Query param name + type: string + required: + description: Make query param required + type: boolean + default: + description: Default query param value + type: string + queries: + description: The list of queries used in ejs reporting template + type: array + items: + description: permission ID. + type: object + required: + - name + - query + properties: + name: + description: Variable name that the query result will be assigned to + type: string + query: + description: SQL query + type: string + template: + description: ejs reporting template + type: string + + status: + description: The status of this MojaloopReport resource, set by the operator. + type: object + properties: + state: + description: The state of the report. + type: string + additionalPrinterColumns: + - name: endpoint + type: string + description: Reporting endpoint + jsonPath: .spec.endpoint.path + conversion: + strategy: None +``` +Des exemples de rapports conformes à cette ressource personnalisée peuvent être trouvés [ici](https://github.com/mojaloop/reporting-k8s-templates/tree/master/templates). +Veuillez noter que ces fichiers Yaml contiennent également des **directives helm** dans ces fichiers, indiquées par les doubles accolades. +``` +{{ some helm directive / function }} +``` +Si vous avez l'intention d'appliquer manuellement ces fichiers à Kubernetes, celles-ci devront être supprimées ou remplacées. + +### Kubectl +Vous pouvez utiliser la commande suivante pour appliquer une ressource personnalisée de rapport à une instance Kubernetes. + ``` + kubectl apply -f resources/examples/participant_list.yaml + ``` + +Examinons quelques détails de la ressource personnalisée. + +### Contrôler la façon dont le rapport est appelé +La première partie de spec: du rapport définit comment le rapport est appelé. +C.-à-d. +``` yaml +spec: + permission: report-dfsp-settlement-detail + endpoint: + path: /dfspSettlementDetail + params: + - name: settlementId + required: true + - name: fspid + required: true +``` +- **permission** c'est ici que le tag de permission RBAC pour ce rapport est défini +- **path** c'est le chemin du point de terminaison pour ce rapport +- **params** ici les paramètres du rapport sont définis et il est précisé s'ils sont des paramètres requis ou non. + +### Contrôler la source des données du rapport +``` yaml +queries: + - name: dfspInfo + query: | + SELECT participantId, name FROM participant WHERE name = :fspid AND name != 'Hub' + - name: report + query: | + SELECT + pCPayer.participantId as payerFspid, +``` +Dans la section queries, n'importe quel nombre de requêtes peut être défini, qui sont exécutées contre la base de données de reporting et chargées dans des classes json nommées. +Les paramètres d'entrée peuvent être utilisés dans les requêtes en utilisant un deux-points devant le nom du paramètre. Par exemple : +``` +:paramname +``` +### Contrôler l'apparence des rapports +La partie template du fichier de ressource personnalisée contient un script EJS utilisé pour produire le rapport. +Ces scripts ressemblent à du HTML avec du style, mais contiennent du code dans des blocs de script +``` ejs +<% ejs script %> +``` +Les scripts EJS sont assez polyvalents et peuvent être utilisés pour modifier un texte de nom, ou définir des fonctions de formatage, ou des boucles qui itèrent à travers les données. + +## Construire votre environnement de développement +*(Installation de ce service localement pour faciliter le développement.)* +Actuellement, la seule façon de valider la conception du rapport est d'appliquer le rapport au cluster Kubernetes sur lequel le service de reporting s'exécute. Le service de reporting validera initialement le rapport, puis activera le point de terminaison. Le rapport peut être exécuté et vérifié pour voir s'il répond à ses exigences. + +Ce document fournit des instructions pour déployer ce service localement, afin qu'un développeur puisse tester ses conceptions avant d'installer le rapport dans un environnement. +Étant donné que le service de reporting suit le modèle d'opérateur K8S, nous devons déployer un mini cluster Kubernetes sur notre machine et déployer le service de reporting avec certains services dépendants. + +### Prérequis +- Assurez-vous d'avoir les logiciels suivants installés + - git + - docker + - minikube + - kubectl + - helm + - mysql-client + +### Installer K8S +- Démarrez le cluster K8S minikube avec la commande suivante + ``` + minikube start --driver=docker --kubernetes-version=v1.21.5 + ``` + +### Cloner le dépôt +- Télécharger le dépôt + ``` + git clone https://github.com/mojaloop/reporting.git + cd reporting + ``` + +### Déployer le chart helm +- Installer le chart helm en utilisant les commandes suivantes + ``` + helm dep up ./resources/test-integration/ + helm install test1 ./resources/test-integration/ --set reporting-legacy-api.image.tag=v11.0.0 + ``` +- Attendre que tous les services soient opérationnels + Vous pouvez surveiller l'état des pods ou utiliser les commandes suivantes pour attendre que les services soient prêts + ``` + kubectl -n default rollout status deployment test1-reporting-legacy-api + kubectl -n default rollout status statefulset mysql + ``` + +### Restaurer la sauvegarde de la base de données mysql +- Transférer le port du service mysql + ``` + kubectl port-forward -n default service/mysql 3306:3306 + ``` +- Insérer des données d'exemple dans la base de données. Vous pouvez modifier le nom de la base de données et le nom du fichier dans la commande suivante selon vos besoins. + ``` + mysql -h127.0.0.1 -P3306 -uuser -ppassword default < ./resources/examples/participants_db_dump.sql + ``` + +### Charger le template de rapport +- Ajouter la ressource personnalisée en utilisant la commande suivante + ``` + kubectl apply -f resources/examples/participant_list.yaml + ``` + +### Obtenir le rapport +- Transférer le port du service de reporting + ``` + kubectl port-forward -n default service/test1-reporting-legacy-api 8080:80 + ``` +- Obtenir le rapport en ouvrant l'URL suivante dans le navigateur + ``` + http://localhost/participant-list + ``` + +### Nettoyage +- Nettoyage + ``` + kubectl delete -f resources/examples/participant_list.yaml + helm uninstall test1 + minikube stop + ``` + +## Déploiement dans un environnement de production +Il existe plusieurs façons de déployer une ressource personnalisée de rapport dans un environnement. La méthode qui a été choisie et intégrée à l'offre IaC implique l'utilisation d'un chart helm. (Cela s'aligne bien avec les autres composants Mojaloop.) + +L'IaC permet à la fois un déploiement public et privé de rapports. Le processus est identique, à l'exception que le dépôt est privé et réside dans le contrôle de source de l'organisation. +À un niveau élevé, le processus se déroule comme suit : +1. Créer une branche et valider les modifications dans le dépôt depuis lequel le rapport est déployé. +2. Créer une pull request et fusionner les modifications dans la branche master du dépôt. +3. Créer une nouvelle version dans le dépôt. (Selon la configuration, cela déclenche généralement un mécanisme CICD qui construit et publie le package helm.) +4. Mettre à jour l'IaC pour déployer la nouvelle version helm pour les rapports. +5. Exécuter le pipeline approprié pour effectuer le déploiement. + diff --git a/docs/fr/technical/business-operations-framework/ReportingBC.md b/docs/fr/technical/business-operations-framework/ReportingBC.md new file mode 100644 index 000000000..17ebd8196 --- /dev/null +++ b/docs/fr/technical/business-operations-framework/ReportingBC.md @@ -0,0 +1,498 @@ +# Implémentation du contexte délimité de reporting +L'un des objectifs de ce projet de groupe de travail est de fournir la capacité de tracer un transfert de bout en bout. Afin de répondre à cet objectif, une partie du contexte délimité de reporting (BC) doit être construite en accord avec l'architecture de référence. + +## Vue d'ensemble de la conception +Voici la conception architecturale globale. +![Diagramme de vue d'ensemble de l'architecture du contexte délimité de reporting](../../../.vuepress/public/Reporting-&-Auditing-Overview.png) + +Dans Mojaloop, tous les services principaux envoient déjà des événements à Kafka sur un topic (appelé 'topic-event'). + +Il existe deux bases de données de reporting fondamentales : +1. **Base de données de reporting** +La base de données de reporting est une base de données relationnelle qui suit l'état le plus récent des objets Mojaloop et les rend disponibles via une interface de requête efficace. \ +\ +Dans l'implémentation de cet effort de groupe de travail, un réplica dédié de la base de données du central ledger sera utilisé pour le reporting. Cela ne correspond pas tout à fait au modèle architectural, car une base de données appartenant au contexte délimité de reporting ne devrait pas avoir de dépendances externes. Une base de données réplica du central ledger dépend du schéma du central ledger et a donc une dépendance externe. +::: warning Dette technique +Cela devrait être reconnu comme une **dette technique** qui doit être remboursée à mesure que davantage de l'architecture de référence est construite. +::: +Deux approches peuvent être adoptées lors du remboursement de cette dette technique : + - Changer l'appel de réplica en une fonction de **synchronisation de données unidirectionnelle**, ce qui découplerait les schémas des deux bases de données. + - Reconstruire une nouvelle **base de données relationnelle** conçue, mise à jour en fonction des topics Kafka souscrits. + +La meilleure approche dépendra de l'état de la version actuelle de Mojaloop au moment où cette dette sera remboursée. \ +\ +2. **Magasin de données d'événements** +Le magasin de données d'événements est une capture des détails des événements pouvant fournir une vue de reporting plus détaillée de ce qui s'est passé. + +**Limitations de l'effort du magasin d'événements dans ce groupe de travail** +Cette conception sera implémentée sur la version actuelle de Mojaloop. + +Actuellement, seules les données nécessaires pour fournir un traçage de bout en bout d'un transfert seront collectées et rendues disponibles via l'API de reporting. Des extensions à cette offre peuvent facilement être ajoutées en étendant le processeur d'événements pour traiter de nouveaux messages de cas d'utilisation et les stocker dans MongoDB, puis en configurant la requête de ressource GraphQL générique pour interroger les nouveaux magasins de données de manière appropriée. + +## Alignement avec l'architecture de référence +Bien que le contexte délimité se réfère au reporting et à l'audit, ce projet ne commence qu'à aborder la partie reporting de cette définition. La conception actuelle est indépendante des autres contextes délimités, ce qui est en accord avec l'architecture de référence. +(Il n'y a pas de séparation complète car la conception actuelle utilise une base de données réplica comme base de données de reporting. La dette technique et les prochaines étapes pour résoudre cela sont décrites ci-dessus.) + +Il est important de considérer comment ce contexte délimité changera à mesure que davantage de la conception de l'architecture de référence est implémentée. + +Les contextes délimités - lors de l'implémentation de l'architecture de référence - cesseront de stocker des données dans les bases de données du central ledger. + +Trois approches peuvent être adoptées pour accommoder ce changement. La façon dont l'architecture de référence est construite déterminera la meilleure approche : +1. Modifier la fonctionnalité de synchronisation pour accommoder le nouveau magasin de données du contexte délimité. +2. Étendre le processeur de messages d'événements pour capturer les informations requises dans la base de données de reporting. +3. Appeler les nouvelles API de contexte délimité définies, pour récupérer les données requises. + +## Cas d'utilisation pour soutenir le traçage d'un transfert + +Afin de tracer efficacement un transfert de bout en bout, quatre cas d'utilisation ont été définis. + +### Cas d'utilisation 1 : Vue du tableau de bord + +**En tant que** spécialiste des opérations métier d'un opérateur de Hub, +**je veux** un résumé de tableau de bord de haut niveau des transferts passant par le hub, dérivé d'une plage de date-heure, +**afin de** surveiller de manière proactive l'état de santé de l'écosystème. + +:::::: col-wrapper +| Données retournées | +| --- | +| Nombre de transferts | +| Montant total des transferts par devise | +| Nombre de transferts par code d'erreur | +| Nombre de transferts par DFSP payeur | +| Nombre de transferts par DFSP bénéficiaire | +| Montant des transferts par devise par DFSP payeur | +| Montant des transferts par devise par DFSP bénéficiaire | +::::::::: + +### Cas d'utilisation 2 : Vue de la liste des transferts + +**En tant que** spécialiste des opérations métier d'un opérateur de Hub, +**je veux** voir une liste de transferts pouvant être filtrée sur un ou plusieurs des critères suivants : +- Toujours requis (doit être fourni dans chaque appel) + - Plage de date-heure + +- Filtres optionnels + - Un DFSP bénéficiaire spécifique + - Un type d'ID bénéficiaire spécifique + - Un bénéficiaire spécifique + - Un DFSP payeur spécifique + - Un type d'ID payeur spécifique + - Un payeur spécifique + - État du transfert + - Devise + +- Filtres souhaitables (pas une exigence stricte, mais devraient être fournis si la conception le permet) + - Un code d'erreur spécifique + - Fenêtre de règlement + - ID de lot de règlement : L'identifiant unique du lot de règlement dans lequel le transfert a été réglé. Si le transfert n'a pas encore été réglé, il est vide. + - Chaîne de recherche sur les messages + +**afin de** surveiller de manière proactive l'état de santé de l'écosystème en ayant une vue plus détaillée des données de transfert passant par le hub. + +:::::: col-wrapper +| Données retournées | | +| --- | --- | +| ID de transfert | L'identifiant unique du transfert | +| État du transfert | Indique si le transfert a réussi, est en attente ou si une erreur s'est produite | +| Type de transfert | (Par exemple : P2P) | +| Devise | La devise du transfert | +| Montant | Le montant du transfert | +| DFSP payeur | | +| Type d'ID payeur | | +| Payeur | | +| DFSP bénéficiaire | | +| Type d'ID bénéficiaire | | +| Bénéficiaire | | +| ID de lot de règlement | L'identifiant unique du lot de règlement dans lequel le transfert a été réglé.
    Si le transfert n'a pas encore été réglé, il est vide. | +| Date de soumission | La date et l'heure auxquelles le transfert a été initié. | +::::::::: + +### Cas d'utilisation 3 : Vue du détail du transfert + +**En tant que** spécialiste des opérations métier d'un opérateur de Hub, +**je veux** tracer un transfert spécifique depuis son ID de transfert, +**afin de** pouvoir identifier : + +- La chronologie et l'état actuel du transfert +- Toute information d'erreur associée à ce transfert +- Les informations de cotation associées et la chronologie pour ce transfert +- Le statut du processus de règlement associé et les identifiants + +:::::: col-wrapper +| Données retournées | | +| --- | --- | +| ID de transfert | L'identifiant unique du transfert | +| État du transfert | Indique si le transfert a réussi, est en attente ou si une erreur s'est produite | +| Type de transfert | (Par exemple : P2P) | +| Devise | La devise du transfert | +| Montant | Le montant du transfert | +| ID de lot de règlement | L'identifiant unique du lot de règlement dans lequel le transfert a été réglé.
    Si le transfert n'a pas encore été réglé, il est vide. | +| Payeur | | +| Détails du payeur | L'identifiant unique du payeur (généralement un MSISDN, c'est-à-dire un numéro de mobile) | +| DFSP payeur | | +| DFSP bénéficiaire | | +| Bénéficiaire | | +| Détails du bénéficiaire | L'identifiant unique du bénéficiaire (généralement un MSISDN, c'est-à-dire un numéro de mobile) | +| État du transfert | Indique si le transfert a réussi, est en attente ou si une erreur s'est produite | +| Date de soumission | La date et l'heure auxquelles le transfert a été initié | +::::::::: + +### Cas d'utilisation 4 : Vue des messages du transfert + +**En tant que** spécialiste des opérations métier d'un opérateur de Hub, +**je veux** voir les messages détaillés depuis son ID de transfert, +**afin de** pouvoir enquêter sur tout problème inattendu associé à ce transfert. + +:::::: col-wrapper +| Données retournées | | +| --- | --- | +| ID de transfert du schéma | | +| TransferID | | +| QuoteID | | +| ID de transfert domestique | | +| Informations sur le payeur et le bénéficiaire | Type d'ID, Valeur d'ID, Nom d'affichage, Prénom, Deuxième prénom,
    Nom, Date de naissance, Code de classification du marchand,
    ID FSP, Liste d'extensions | +| Réponse de recherche de partie | | +| Demande de cotation | | +| Réponse de cotation | | +| Préparation du transfert | | +| Exécution du transfert | | +| Message(s) d'erreur | | +::::::::: + +## Flux de travail métier +Voici un flux de travail métier qui décrit comment les cas d'utilisation sont appelés. +![Flux de travail métier](../../../.vuepress/public/BusinessFlowView.png) + +## Outils choisis +### Magasin de données d'événements : MongoDB +La base de données MongoDB a été choisie parce que : + - MongoDB est actuellement utilisé et déployé dans Mojaloop, et est un outil open-source accepté qui dispose optionnellement d'entreprises standard pouvant fournir un support d'entreprise si nécessaire. + - MongoDB répondra à nos exigences pour ce projet. + - D'autres outils ont été considérés mais se sont avérés ne pas répondre à toutes les exigences d'un outil OSS dans Mojaloop. + +### API : GraphQL +En plus de l'API de reporting existante, une API GraphQL sera également déployée. Cette nouvelle API aura la fonctionnalité supplémentaire de pouvoir accéder à la base de données de reporting des événements comme données supplémentaires ou données de requête autonomes. + +L'implémentation de l'API GraphQL a été ajoutée pour ces raisons : + - Une implémentation de modélisation RBAC plus naturelle + - Plus facile de mélanger des données provenant de différentes sources en une seule ressource + - L'implémentation de la solution de reporting existante a abouti à des instructions SQL très complexes nécessitant des connaissances spécialisées pour être construites et maintenues. La division des données en une ressource plus naturelle et une instruction SQL subséquente simplifie à la fois l'instruction SQL et l'utilisation de cette ressource. + - Dans l'équipe, nous avions un expert GraphQL qui connaissait la meilleure bibliothèque et les meilleurs outils à utiliser. + - Une implémentation générique a été construite afin qu'aucune connaissance spéciale de GraphQL ne soit requise pour étendre la fonctionnalité. + +**Avantages supplémentaires de l'utilisation de GraphQL** + - Ressources/permissions RBAC associées réutilisables entre les rapports + - Les requêtes complexes sont plus simples à construire car les ressources sont modélisées + - Mélange de sources de données dans une seule requête (par exemple MySQL avec MongoDB) + - Pas besoin de récupérations imbriquées + - Pas besoin de récupérations multiples + - Pas besoin de version d'API. L'API supporte naturellement la compatibilité ascendante entre les versions. + - API auto-documentée + +**Introduction d'une nouvelle technologie** +L'introduction d'une nouvelle technologie dans la communauté comporte certains risques et une exigence d'apprendre et de maintenir une nouvelle technologie. Une tentative de réduire l'impact de ceci a été faite en implémentant l'API selon une approche générique ou de template, minimisant les exigences de connaissance GraphQL pour l'implémentation. Un exemple de requête GraphQL a également été fourni. + +L'implémentation GraphQL actuelle est conviviale pour les développeurs. + +**Implémentation REST de reporting** +Il existe une implémentation d'API REST de reporting qui a été donnée à la communauté Mojaloop. Il est possible de déployer cette fonctionnalité parallèlement à l'implémentation de l'API GraphQL si cela devient nécessaire. + +### API GraphQL - implémentation de ressource générique expliquée +Au cœur de l'implémentation de ce contexte délimité se trouve une implémentation générique qui relie un magasin de données de reporting et une requête à une ressource de données GraphQL ayant sa propre autorisation RBAC. C'est-à-dire qu'une nouvelle ressource personnalisée peut être ajoutée à cette API en effectuant les opérations suivantes : + +1. Définir le type de magasin de données +2. Définir la requête +3. Définir les noms et champs de ressource GraphQL +4. Définir la permission utilisateur liée à cette ressource + +### Exemples de requêtes GraphQL + +**Interroger les transferts filtrés sur un DFSP payeur spécifique** +```GraphQL +query GetTransfers { + transfers(filter: { + payer: "payerfsp" + }) { + transferId + createdAt + payee { + name + } + } +} +``` + +**Interroger un résumé des transferts** +```GraphQL +query TransferSumary2021Q1 { + transferSummary( + filter: { + currency: "USD" + startDate: "2021-01-01" + endDate: "2021-03-31" + }) { + count + payer + } +} +``` + + +## Construction du magasin de données d'événements +L'objectif du magasin de données d'événements est de fournir un stockage persistant des événements d'intérêt qui sont facilement et efficacement trouvés et interrogés pour le reporting. + +Pour réaliser cela avec un minimum de changements structurels par rapport au message original, il a été décidé de traiter le message en catégories et de stocker ces catégories en tant que métadonnées supplémentaires dans le message, qui peuvent être interrogées ultérieurement. Les messages qui ne correspondent pas à ces catégories ne sont pas stockés et sont donc filtrés. + +Voici un exemple des métadonnées ajoutées au message JSON : + +```json{7-12} +{ + "event": { + "id" : {}, + "content" : {}, + "type" : {}, + "metadata" : {} + }, + "metadata" : { + "reporting" : { + "transactionId" : "...", + "quoteId": "...", + "eventType" : "Quote" + } + } +} +``` +Où `"eventType"` peut être l'un des suivants : +:::::: col-wrapper +::: col-third +::: + +::: col-third +| eventType | +| ------- | +|Quote | +|Transfer | +|Settlement | +::: +::::::::: + +Le processeur de flux d'événements s'abonnera au topic Kafka `'topic-event'`. Cette file de messages contient tous les messages d'événements. Un degré significatif de filtrage est donc nécessaire. + +:::tip REMARQUE +Le code qui implémente cette fonctionnalité a été structuré de manière à ce que ces filtres puissent être facilement modifiés ou étendus. +Les messages souscrits et classifiés sont représentés dans des fichiers 'const' afin qu'ils puissent facilement être ajoutés ou modifiés sans connaissance détaillée du code. +::: + +### Stocker uniquement les messages 'audit' + +Seuls les messages Kafka de type `'audit'` seront considérés pour la sauvegarde, c'est-à-dire uniquement si : +:::::: col-wrapper +::: col-third +::: +::: col-third +| metadata.event.type | +| ---- | +| audit | +::: +::::::::: + +## Messages 'Transfer' qui sont stockés +**ml-api-adapter** + +:::::: col-wrapper +| metadata.trace.service | +| ---- | +| ml_transfer_prepare | +| ml_transfer_fulfil | +| ml_transfer_abort | +| ml_transfer_getById | +| ml_notification_event | +::::::::: + +## Messages 'Quote' qui sont stockés +**quoting-service** +:::::: col-wrapper +::: col-third +| metadata.trace.service | +| ---- | +| qs_quote_handleQuoteRequest | +| qs_quote_forwardQuoteRequest | +| qs_quote_forwardQuoteRequestResend | +| qs_quote_handleQuoteUpdate | +| qs_quote_forwardQuoteUpdate | +| qs_quote_forwardQuoteUpdateResend | +| qs_quote_handleQuoteError | +| qs_quote_forwardQuoteGet | +| qs_quote_sendErrorCallback | +::: + +::: col-third +| metadata.trace.service | +| ---- | +| qs_bulkquote_forwardBulkQuoteRequest | +| qs_quote_forwardBulkQuoteUpdate | +| qs_quote_forwardBulkQuoteGet | +| qs_quote_forwardBulkQuoteError | +| qs_bulkQuote_sendErrorCallback | +::: + +::: col-third +| metadata.trace.service | +| ---- | +| QuotesErrorByIDPut | +| QuotesByIdGet | +| QuotesByIdPut | +| QuotesPost | +| BulkQuotesErrorByIdPut | +| BulkQuotesByIdGet | +| BulkQuotesByIdPut | +| BulkQuotesPost | +::: +::::::::: + +## Messages 'Settlement' qui sont stockés +**central-settlement** +:::::: col-wrapper +::: col-third +| metadata.trace.service | +| ---- | +| cs_process_transfer_settlement_window | +| cs_close_settlement_window | +| ... | +::: + +::: col-third +| metadata.trace.service | +| ---- | +| getSettlementWindowsByParams | +| getSettlementWindowById | +| updateSettlementById | +| getSettlementById | +| createSettlement | +| closeSettlementWindow | +| ... | +::: +::::::::: + +## Messages qui restent actuellement non classifiés et sont filtrés +**account-lookup-service (pas dans PI - inclus comme référence)** +:::::: col-wrapper +::: col-third +| metadata.trace.service | +| ---- | +| ParticipantsErrorByIDPut | +| ParticipantsByIDPut | +| ParticipantsErrorByTypeAndIDPut | +| ParticipantsErrorBySubIdTypeAndIDPut | +| ParticipantsSubIdByTypeAndIDGet | +| ParticipantsSubIdByTypeAndIDPut | +| ParticipantsSubIdByTypeAndIDPost | +| ParticipantsSubIdByTypeAndIDDelete | +| ParticipantsByTypeAndIDGet | +| ParticipantsByTypeAndIDPut | +| ParticipantsByIDAndTypePost | +| ParticipantsByTypeAndIDDelete | +| ParticipantsPost | +| PartiesByTypeAndIDGet | +| PartiesByTypeAndIDPut | +| PartiesErrorByTypeAndIDPut | +| PartiesBySubIdTypeAndIDGet | +| PartiesSubIdByTypeAndIDPut | +| PartiesErrorBySubIdTypeAndIDPut | +::: + +::: col-third +| metadata.trace.service | +| ---- | +| OraclesGet | +| OraclesPost | +| OraclesByIdPut | +| OraclesByIdDelete | +::: + +::: col-third +| metadata.trace.service | +| ---- | +| postParticipants | +| getPartiesByTypeAndID | +| ... | +::: +::::::::: + +**transaction-requests-service (pas dans PI - inclus comme référence)** +:::::: col-wrapper +::: col-third +| metadata.trace.service | +| ----- | +| TransactionRequestsErrorByID | +| TransactionRequestsByID | +| TransactionRequestsByIDPut | +| TransactionRequests | +| AuthorizationsIDResponse | +| AuthorizationsIDPutResponse | +| AuthorizationsErrorByID | +::: + +::: col-third +| metadata.trace.service | +| ----- | +| forwardAuthorizationMessage | +| forwardAuthorizationError | +| ... | +::: +::::::::: + +### Outils utiles + +#### Explorateur Kafka +Le logiciel ['kowl'](https://github.com/cloudhut/kowl) de cloudhut est un outil utile pour explorer tous les messages Kafka dans un cluster Mojaloop. Nous pouvons le déployer dans le même namespace que les services de base Mojaloop. + +Le fichier de valeurs personnalisées pour le déploiement OSS peut être trouvé dans ce [dépôt](https://github.com/mojaloop/deploy-config/tree/deploy/PI15.2/mojaloop/kowl-kafka-ui). +(Il s'agit d'un dépôt privé, vous pourriez avoir besoin d'une permission pour accéder à ce lien.) + +**Étapes d'installation** +``` +helm repo add cloudhut https://raw.githubusercontent.com/cloudhut/charts/master/archives +helm repo update +helm install kowl cloudhut/kowl -f values-moja2-kowl-values.yaml +``` +**Interface web** +Ouvrez l'URL configurée dans la section `ingress` du fichier `values`. + +**Personnalisation supplémentaire** +Pour des informations sur la façon d'ajouter des personnalisations supplémentaires, consultez la [configuration de référence](https://github.com/cloudhut/kowl/blob/master/docs/config/kowl.yaml) fournie par cloudhut. + +#### Chemin doré TTK +Les cas de test du chemin doré TTK ont été conçus pour explorer tous les résultats de test possibles lors de l'envoi de transferts. C'est donc un outil important qui peut être utilisé pour tester que la fonctionnalité couvre toutes les éventualités. C'est-à-dire que nous pouvons utiliser le TTK intégré pour exécuter différents cas de test tels que le chemin heureux P2P, les scénarios négatifs, les cas d'utilisation liés au règlement, etc. + +## Service de traitement des événements + +Le service de traitement des événements est responsable de l'abonnement aux topics Kafka et du filtrage des événements par type d'événement. Le type d'événement se décompose ensuite en plusieurs parties selon le service à partir duquel les événements ont été produits. Les événements filtrés seront ensuite traités en fonction du contexte de la structure de l'événement, et des métadonnées de reporting seront créées. + +Exemple : + +```json +{ + "event": { + "id" : {}, + "content" : {}, + "type" : {}, + "metadata" : {} + }, + "metadata" : { + "reporting" : { + "transactionId" : "...", + "quoteId": "...", + "eventType" : "Quote" + } + } +} +``` + +| eventType | Origine de l'événement | +| ------- | ------- | +|Quote | quoting-service | +|Transfer | ml-api-adapter | +|Settlement | central-settlement | + +Le service de traitement des événements s'abonne au flux d'événements Kafka pour construire un magasin lié aux événements de transfert qui peut être interrogé via l'API opérationnelle. Cela est en accord avec l'architecture de référence. diff --git a/docs/fr/technical/business-operations-framework/SecurityBC.md b/docs/fr/technical/business-operations-framework/SecurityBC.md new file mode 100644 index 000000000..a334ea128 --- /dev/null +++ b/docs/fr/technical/business-operations-framework/SecurityBC.md @@ -0,0 +1,778 @@ +# Implémentation de l'API opérationnelle RBAC + +## Introduction à l'implémentation de l'API opérationnelle RBAC + +Les objectifs de cette implémentation sont de fournir une solution RBAC pour soutenir les opérations du hub et les fonctions associées. Ce guide présente la conception à haut niveau et explique la logique ayant mené à cette conception. + +La conception de la sécurité : +1. implémente le contrôle d'accès basé sur les rôles (RBAC) à la version actuelle de Mojaloop, +1. est compatible lorsque possible avec l'architecture de référence et donc avec les futures versions de Mojaloop, +1. est compatible avec les futurs déploiements Infrastructure-as-Code (IaC), +1. fournit une journalisation des activités qui peut être utilisée lors d'un audit. + +## Détails de l'implémentation RBAC +1. Les utilisateurs se voient attribuer un ou plusieurs rôles. Un utilisateur peut se voir attribuer plusieurs rôles, sous réserve de règles définies. +1. Les rôles se voient attribuer des permissions. +1. Le Proxy d'Identité et d'Accès (Ory Oathkeeper) applique l'accès aux endpoints en fonction des permissions. +1. L'API backend peut, en option, vérifier les permissions via l'API Keto. +1. Des ensembles de permissions mutuellement exclusives peuvent être définis dans le système pour appliquer la séparation des tâches. + +## Application du principe Maker-Checker +Deux approches peuvent être utilisées pour appliquer un flux de validation maker-checker. +1. Appliquer via les rôles et les permissions mutuellement exclusives, à travers les politiques de sécurité. C.-à-d. les makers ne peuvent pas aussi être checkers. +1. Appliquer dans la couche applicative via des règles de sécurité. C.-à-d. les makers ne peuvent pas non plus être checkers dans le même processus de validation. Cela est souvent mis en œuvre dans la couche application lors de l’attribution des makers/checkers comme défini dans un flux de processus, et en imposant qu’un checker ne puisse pas être la même personne que le maker dans le processus de validation. Le code qui applique cela existera dans chaque contexte borné. + +::: tip Responsabilité RBAC +Pour supporter cette fonctionnalité, le système RBAC doit fournir : +1. l’identifiant utilisateur à ce contexte borné, +1. un moyen de vérifier l’autorisation si nécessaire. +::: + +### Fourniture de l'identifiant utilisateur +La configuration actuelle fournit l’identifiant de l’utilisateur dans l’en-tête des appels API. +Ory Oathkeeper est configuré pour utiliser un "mutateur" d’en-tête. Ce mutateur transformera la requête, permettant de passer les informations d’identification à l’application en amont via les en-têtes. Par exemple, les backends d’API recevront l’en-tête suivant dans les requêtes HTTP : +``` +X-User: wso2-uuid +``` + +Il est à noter que les "id_token" JWT sont également facilement supportés en modifiant la configuration du mutateur Ory Oathkeeper. Le mutateur "id_token" prend les informations d'authentification (par exemple le subject) et les transforme en un JSON Web Token signé, et plus spécifiquement en un ID Token OpenID Connect. Les backends d’API peuvent vérifier ce token en allant chercher la clé publique depuis le point de terminaison /.well-known/jwks.json fourni par l’API Ory Oathkeeper. + +### Vérification de l’autorisation +Toutes les informations d’autorisation sont stockées dans Ory Keto. Ory Keto dispose d’une API standard qui peut être appelée pour vérifier une autorisation. +C'est-à-dire : *« Ce jeton d’identifiant utilisateur a-t-il cette permission ? »* + +## Outils / standards choisis +Voici une liste d’outils standards sélectionnés pour implémenter ce design. +1. **Ory Oathkeeper** +Utilisé comme Proxy d’Identité et d’Accès (IAP) qui vérifiera l’authentification et l’autorisation avant de donner accès aux endpoints fonctionnels, c’est-à-dire qu’il sera utilisé pour appliquer le contrôle d’accès. +2. **Ory Keto** +Vérifie l’autorisation via les correspondances sujet-rôle et rôle-permission. Utilise une structure flexible objet, relation et sujet, inspirée de Google, pouvant modéliser divers schémas d’autorisation, y compris RBAC. +3. **Ory Kratos** +Utilisé pour créer et gérer l’objet d’autorisation (cookie). +4. **OpenID Connect** +C’est le standard retenu pour interagir avec un système de gestion d’identité. Ce standard est largement supporté et compatible avec tous les outils utilisés actuellement dans la communauté Mojaloop, à savoir, WSO2 Identity Server (IS), Keycloak et Ory Kratos. + +## Vue d’ensemble de l’architecture +Voici une vue d’ensemble de haut niveau de l’implémentation de l'API opérationnelle RBAC sur la version actuelle de Mojaloop. + +![Diagramme d'architecture générale de l'implémentation du contexte de sécurité](../../../.vuepress/public/BizOps-Framework-IaC-3.xx-&-Mojaloop-13.xx.png) + +Voici un tableau des services et de leur rôle respectif. +| Service | Propriétaire | Implémente | +| --- | --- | --- | +|**WSO2 IS KM**|Utilisateurs| 1. Redirection de la connexion utilisateur et UI qui crée le cookie
    2. Flux d’autorisation standard OpenID Connect (OIDC) | +|**Ory Keto**|1. Mappage rôles-utilisateurs
    2. Mappage participants-utilisateurs| 1. Vérification d’autorisation RBAC via Ory Oathkeeper
    2. Vérification d’autorisation RBAC via appel API opérationnelle| +|**Ory Oathkeeper**|Permissions liées à l’accès API | Passerelle API pour les APIs opérationnelles, avec contrôles d’authentification et d’autorisation| +|**Ory Kratos**|Aucune|Cookie d'authentification| +|**API opérationnelle BC**|Permissions liées aux appels API opérationnels|Fonctions API opérationnelles| +|**Shim**| Aucune | Redirection pour configurer OIDC| +|**Rôle Opérateur**| Aucune | Mettre à jour Keto pour refléter les changements de mapping rôle-permission réalisés dans le fichier ressource des rôles| +|**Fichier de ressources rôle Kubernetes**| Rôles et assignations de rôles-permissions| Modifications contrôlées par du contrôle de version (par exemple GitHub ou GitLab).| +|**API des Rôles**|Aucune|1. Contrôle API rôle-utilisateur
    (liste des utilisateurs, liste des rôles, liste des rôles attribués aux utilisateurs, ajouter un rôle à un utilisateur, enlever un rôle à un utilisateur)
    2. Contrôle API participant-utilisateur
    (liste des utilisateurs, liste des participants, liste des participants attribués à un utilisateur, ajout/suppression de participant à un utilisateur)| + +## Alignement avec l’architecture de référence +Comparons cette implémentation RBAC à celle définie dans l’architecture de référence, appelée "bounded context sécurité". Cette conception diffère de l’architecture de référence par sa fonction, son but et son approche, mais elle en adopte certaines idées quand cela est approprié. Le but de cette RBAC est d'ajouter une couche de sécurité sur les APIs opérationnelles des contextes bornés. L’architecture de référence du "Security Bounded Context" a été conçue pour répondre aux exigences de performance des fonctions transactionnelles critiques de Mojaloop. +Voici les principales différences : +1. Les fonctions d’autorisation sont centralisées dans cette RBAC. L’architecture de référence prévoit une autorisation distribuée, implémentée indépendamment dans chaque contexte borné. Ce niveau de complexité supplémentaire est inutile dans le cas des APIs opérationnelles. +1. L’architecture de référence demande des interfaces vers d’autres contextes bornés pour initier l’autorisation distribuée. Elles n’ont pas été construites car aucun composant n’existe pour les consommer. +1. L’architecture de référence exige que le contexte de sécurité génère ses propres tokens de sécurité. Cette RBAC utilise ceux générés par l’IAM. +1. L’architecture de référence exige que les permissions soient distribuées via les JWT à chaque contexte borné. Cela pourrait être paramétré dans l'outillage actuel, mais ne l’a pas été car cela peut être considéré comme une faille potentielle, et ce n’était pas nécessaire pour cette implémentation RBAC. + +Certains principes du contexte de sécurité de référence ont été repris : +1. Chaque contexte borné possède son propre jeu de permissions ou privilèges. +1. L’implémentation RBAC possède toutes les associations privilèges/utilisateurs. +1. Les permissions de rôles utilisateurs sont structurées pour être facilement distribuées dans un cluster Kubernetes. + +## Alignement avec IaC 4.xxx +Voici un schéma illustrant à quoi ressemblerait l’architecture si l’API opérationnelle RBAC était implémentée dans la future version IaC (IaC 4.xxx) utilisant Keycloak et Ambassador / Envoy entre autres évolutions. + +![Diagramme d'architecture générale de l'implémentation du contexte de sécurité](../../../.vuepress/public/BizOps-Framework-IaC-4.xx-&-Mojaloop-13.xx.png) + +## Caractérisation des performances de l’implémentation RBAC +Une caractérisation des performances du POC RBAC a été réalisée pour évaluer la surcharge de la couche de sécurité RBAC. +::: tip En résumé : +Le RBAC ajoute une surcharge de 10ms à chaque vérification d’autorisation API. +Si un appel API requiert une vérification d’autorisation supplémentaire via API, la surcharge est alors de 20ms. + +Dans nos tests, cela se traduit typiquement par : +1. moins de 5% pour des vérifications d’autorisation simples (Ory Oathkeeper & Ory Keto) +1. moins de 10% pour des vérifications doubles (Ory Oathkeeper & Ory Keto + un appel Keto additionnel) +::: + +**Détails de la mise en place des tests** +Sur la même infrastructure de test, des appels chronométrés identiques ont été effectués sur la même API backend, directement et via RBAC. +Voici les résultats des appels aux APIs Role avec et sans RBAC et aux APIs POST Transfers avec et sans RBAC. L’API Role a une seule vérification d’autorisation réalisée via Ory Oathkeeper qui appelle Ory Keto. L’API Transfer (GraphQL) ajoute une vérification RBAC additionnelle. + +**Statistiques des requêtes** + +|Méthode| Nom| # Requêtes| # Échecs| Moyenne (ms)| Min (ms)| Max (ms)| Taille Moy| (octets) RPS| Echecs/s| +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +|GET| Role API| 321| 0| 248| 221| 499| 604| 9.0| 0.0| +|GET| Role API RBAC| 320| 0| 262| 232| 418| 604| 8.9| 0.0| +|POST| Transfers API| 318| 0| 229| 184| 373| 4873| 8.9| 0.0| +|POST| Transfers API RBAC| 314| 0| 240| 194| 406| 4873| 8.8| 0.0| +| | **Total**| **1273**| **0**| **245**| **184**| **499**| **2723**| **35.5**| **0.0**| + +**Statistiques des Temps de Réponse** + +|Méthode| Nom| 50%ile (ms)| 60%ile (ms)| 70%ile (ms)| 80%ile (ms)| 90%ile (ms)| 95%ile (ms)| 99%ile (ms)| 100%ile (ms)| +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +|GET| Role API| 240| 240| 240| 250| 270| 290| 400| 500| +|GET| Role API RBAC| 250| 260| 260| 270| 290| 320| 410| 420| +|POST| Transfers API| 220| 220| 240| 250| 290| 330| 360| 370| +|POST| Transfers API RBAC| 230| 240| 250| 280| 310| 330| 400| 410| +| |**Total**| **240**| **250**| **250**| **260**| **290**| **320**| **400**| **500**| + +## Connexion à l'interface utilisateur (UI) +Ce diagramme de séquence illustre les événements lors d’une tentative d’accès à une API backend depuis un navigateur : +- Si le navigateur est déjà connecté, la requête est transférée. +- Sinon, un classique flux d’authentification OIDC démarre avec une redirection. + +![Diagramme de séquence illustrant la connexion d'un navigateur](../../../.vuepress/public/frontend.png) + +## Consultation des données via le micro-frontend API opérationnelle BC +Le diagramme suivant détaille les interactions lorsque : +- le bearer token est valide ou non, +- l’autorisation réussit ou échoue. + +Le micro-frontend est représenté comme un client. + +![Diagramme de séquence illustrant une vérification d'autorisation sur un appel client API](../../../.vuepress/public/client.png) + +Dans certains cas, il peut être nécessaire d'effectuer une vérification d’autorisation supplémentaire côté API opérationnelle. Le diagramme suivant décrit cette situation. + +À noter que toutes les APIs opérationnelles ne requièrent pas ce niveau d’autorisation, et qu’Ory Oathkeeper peut ou non être impliqué dans ces cas. + +![Diagramme de séquence illustrant une vérification d'autorisation sur un appel client API](../../../.vuepress/public/clientgraphql.png) + +## Application de la Séparation des Tâches +Cette implémentation RBAC permet d’appliquer la séparation des tâches via des ensembles de permissions mutuellement exclusives. Cela renforce la sécurité mais peut accroitre la complexité pour l’administrateur et l’utilisateur final. Appliquer des permissions mutuellement exclusives permet d’en réduire la complexité. + +Un exemple pourrait être un utilisateur qui peut accéder au portail finance et réaliser des opérations sensibles (ajout/retrait de fonds). Cet utilisateur doit alors être exclu des fonctions d’audit. + +### Modélisation de l’exclusion +Cette implémentation modélise ce besoin comme un ensemble d’exclusions permission-permission appliqué globalement. Ces exclusions sont définies entre deux ensembles de permissions qui sont mutuellement exclusifs—ce qui est intuitif et facile à maintenir. + +*Justification* +Il y a trois façons de modéliser une exclusion : +1. Exclusions de type permission-permission +1. Exclusions de type rôle-utilisateur/rôle-utilisateur +1. Exclusions de type rôle-utilisateur/permission + +La méthode la plus propre pour répondre à la séparation des tâches consiste à définir une exclusion par paire de permission, au niveau global. Les autres solutions risquent d’être contournées par la création d'un rôle inclusif supplémentaire. + +### Rôles synthétiques versus multiples rôles utilisateur +Cette implémentation RBAC n’utilise pas de rôles synthétiques, mais laisse l’affectation de multiples rôles fonctionnels à chaque utilisateur. + +*Justification* +Deux méthodes sont possibles pour modéliser RBAC & exclusions : +1. Construire dynamiquement un rôle synthétique pour chaque utilisateur, à partir des règles définies sur leurs rôles actuels, leurs permissions et exclusions. +1. Définir des rôles associés aux fonctions utilisateurs ; chaque utilisateur doit alors recevoir plusieurs rôles. Les permissions des rôles changent peu. + +La seconde méthode est privilégiée car elle est plus simple à comprendre, maintenir et supporter. Identifier la cause d’une perte de droits dans un rôle synthétique suite à l'application de plusieurs rôles et de règles devient complexe. Cette complexité est évitée en optant pour la deuxième solution. + +### Affectation de multiples rôles utilisateur et vérification dynamique des exclusions +Permettre à l’administrateur d’attribuer plusieurs rôles par utilisateur est flexible et réduit le nombre de rôles dans l’organisation, mais rend possible la violation de permissions mutuellement exclusives lors de telles affectations. Les contrôles doivent donc être dynamiques. + +Ils s’effectuent à plusieurs endroits : +1. Lors de l’attribution d’un rôle à un utilisateur +1. Lors de l’application d’une nouvelle définition ressource rôle-permission, ou d’une nouvelle politique de sécurité impliquant des changements étendus dans la structure des rôles et permissions. +::: warning Extension future : +S’il existe un risque de violation, alors chaque consultation de permission devrait également vérifier les violations d’exclusions. Pour l’instant ce n’est pas fait, on considère que les points précédents sont bien appliqués pour éviter le problème. +Ce contrôle additionnel est recommandé pour de futures évolutions, afin que nulle violation de la séparation des tâches ne puisse être réalisée. +::: + +::: tip Remarque : +La gestion de changement et les tests sur des environnements inférieurs ne détectent pas forcément ces violations. Il faut que le contrôle des accès utilisateurs soit strictement identique entre environnements pour pouvoir tester efficacement ces violations, ce qui est rarement le cas. +::: + +**Relation Keto** +Introduction d'une relation reliant deux permissions qui ne peuvent pas coexister. +``` +“permission:X excludes permission:Y#allowed” +``` + +**Définition Custom Resource Exclusion de Permission** +Des ressources customisées d’exclusion de permission sont consommées par le contrôleur de rôles-permissions, qui les transmet à Keto. Chaque ressource contient deux ensembles de permissions, et avoir une permission d’un ensemble exclut celles de l’autre. Cela permet d’exprimer de nombreux scénarios flexibles, y compris le cas simple d’exclusion bi-directionnelle. + +**Vérification API d’un changement opérateur rôle-permission** +Le contrôleur ressource rôle-permission met à disposition une API permettant de pré-vérifier qu’une mise à jour sera acceptable. Cette API prend la modification proposée, et renvoie si un conflit d’exclusions serait introduit. Elle est exploitable par l’UI Administrateur et les outils CI/CD. + +**Application effective du changement opérateur rôle-permission** +Lorsqu’une ressource est modifiée, l’opérateur verrouille temporairement la modification des attributions de rôles, effectue la même vérification, et si la modification ne passe pas, elle est rejetée et la situation actuelle conservée ; le problème est remonté dans l’API Kubernetes pour instrumentation/alerte. + +**Vérification de conflit à l'attribution d’un rôle utilisateur** +Lorsqu’un utilisateur reçoit un nouveau rôle, le système vérifie que cela ne provoque pas de conflit d’exclusions. Si c’est le cas, l’opération est rejetée avec une erreur. + +## Attribution des rôles et de la participation aux utilisateurs +Cette fonctionnalité est implémentée dans le service API des Rôles. Le diagramme ci-dessous décrit comment les rôles et les accès participatifs sont interrogés et modifiés via cette API. +![Diagramme de séquence illustrant l'attribution des rôles et participation utilisateur](../../../.vuepress/public/userroles.png) + +### API des Rôles +Le tableau suivant fait la synthèse des ressources de l’API des Rôles. + +|Catégorie|Méthode|Endpoint| Description|Codes d'erreur| +| --- | --- | --- | --- | --- | +|**SANTÉ**| | | | | +| | GET | /health | Retourne l’état actuel de l’API | 400, 401, 403, 404, 405, 406, 501, 503 | +| | GET | /metrics | Retourne les métriques de l’API | 400, 401, 403, 404, 405, 406, 501, 503| +|**PARTICIPANTS**| | | | | +| | GET | /participants | Retourne la liste des IDs de participants | 400, 401, 403, 404, 405, 406, 501, 503| +|**RÔLES**| | | | | +| | GET | /roles | Retourne la liste des IDs de rôles |400, 401, 403, 404, 405, 406, 501, 503 | +|**UTILISATEURS**| | | | | +| | GET | /users | Retourne la liste des IDs utilisateurs | 400, 401, 403, 404, 405, 406, 501, 503| +| | GET | /users/{ID} | Retourne les infos d’un utilisateur|400, 401, 403, 404, 405, 406, 501, 503 | +| | GET | /users/{ID}/participants | Liste les participants attribués à un utilisateur |400, 401, 403, 404, 405, 406, 501, 503| +| | PATCH | /users/{ID}/participants | Assigne un participant à un utilisateur | 400, 401, 403, 404, 405, 406, 501, 503| +| | GET | /users/{ID}/roles | Liste des rôles attribués à un utilisateur|400, 401, 403, 404, 405, 406, 501, 503 | +| | PATCH | /users/{ID}/roles | Assigne un rôle à un utilisateur|400, 401, 403, 404, 405, 406, 501, 503 | + +La spécification détaillée de l’API est disponible [ici](https://docs.mojaloop.io/role-assignment-service/). +Le dépôt GitHub du service est disponible [ici](https://github.com/mojaloop/role-assignment-service). + +## Attribution des permissions aux rôles & ensembles mutuellement exclusifs +L’attribution des permissions aux rôles est stockée dans un fichier `.yml` appelé fichier ressource de rôle (`roleresource.yml`). +Les accès et modifications sur ces fichiers sont gérés via un gestionnaire de versionnage hébergé (ex : GitHub, GitLab). Cela assure un historique complet et des points de contrôle manuels/automatiques configurables. +Ces fichiers sont mappés comme des Custom Resource definitions (CRDs) Kubernetes, auxquels un opérateur rôle-permission s’abonne. Les changements déclenchent la mise à jour d’Ory Keto. Un même rôle peut être représenté par plusieurs fichiers au besoin. + +Il existe deux types de fichiers de ressource : un pour les attributions rôle-permission, l’autre pour les permissions mutuellement exclusives. + +Exemple d’un fichier rôle-permission : +```yml +apiVersion: "mojaloop.io/v1" +kind: MojaloopRole +metadata: + name: nom-arbitraire-ici +spec: + # doit correspondre à la valeur utilisée dans Keto + role: IdentifiantRole + permissions: + - permission_01 + - permission_02 + - permission_03 + - permission_04 +``` +Le diagramme suivant illustre comment Ory Keto est mis à jour. + +![Diagramme de séquence illustrant l'attribution des rôles et participation utilisateur](../../../.vuepress/public/rolepermissions.png) + +## Détail d’implémentation Ory Keto +Dans ce design, Ory Keto est l’outil qui détermine si un jeton de connexion possède la bonne autorisation pour accéder à une partie du système (enforçant ainsi le RBAC). Trois volets sont gérés : +1. L'attribution des rôles aux utilisateurs. +Gérée/maintenue par le module API des Rôles, qui sollicite Keto à chaque changement. +2. L'attribution des accès participants à un utilisateur. +Référant aux rapports d'accès DFSP qui ne doivent être délivrés que pour les participants configurés. +Géré également via l’API des Rôles et Keto. +3. L’attribution des permissions/privilèges aux rôles. +Contrôlée via les modifications du fichier `roleresource.yml` sur GitHub. L’opérateur rôle-permission surveille ces fichiers et met à jour Keto. + +### Ajouter des rôles et des participations aux utilisateurs dans Keto +La liste des utilisateurs (personnes et comptes de service) vient du serveur d’identités WSO2 ; celle des participants, d’une API existante. Un identifiant permanent et durable doit être utilisé pour les appels Keto. + +Les rôles sont hardcodés, chacun avec un identifiant court, lisible et modifiable, et un nom. L’interface doit afficher les deux. + +Deux espaces de nom Keto sont utilisés : role et participant. Les tuples Keto sont : +``` +role:ROLEID#member@USERID et participant:PARTICIPANTID#member@USERID +``` +(selon la notation [Keto/Zanzibar](https://www.ory.sh/keto/docs/concepts/relation-tuples)) + +La réutilisation de "member" pour la relation ne pose pas problème, chaque relation étant spécifique à l’espace de nom. Un autre terme peut être utilisé si préféré. + +Pour récupérer les rôles/participants d’un utilisateur : utiliser [l’API Query Relation Tuples](https://www.ory.sh/keto/docs/reference/rest-api#query-relation-tuples), en passant namespace, relation et subject. La réponse inclura les tuples et un next-page-token si besoin. + +Pour ajouter/supprimer un rôle ou participant pour un utilisateur : utiliser [create](https://www.ory.sh/keto/docs/reference/rest-api#create-a-relation-tuple) et [delete](https://www.ory.sh/keto/docs/reference/rest-api#delete-a-relation-tuple) ; chaque appel traite un seul tuple. Toute erreur non-HTTP 4xx doit être retentée plusieurs fois. + +Exemple d’appel Keto pour ajouter un rôle à un utilisateur : +::: tip Exemple : Attribuer un rôle à un utilisateur via Ory Keto +PATCH /relation-tuples HTTP/1.1 +Content-Type: application/json +Accept: application/json +::: + +```json +[ + { + "action": "insert", + "relation_tuple": { + "namespace": "role", + "object": "RoleIdentifier", + "relation": "member", + "subject": "userIdentifier" + } + } +] +``` +Succès = HTTP 204 sans contenu. + +::: tip REMARQUE +Le champ `"relation"` utilise `"member"`. +On utilise `PATCH` plutôt que `PUT` pour supporter les créations/suppressions en lot. +::: + +### Attribution des permissions/privilèges à un rôle dans Keto +Ceci se fait via un opérateur Kubernetes dédié à un CRD. L’opérateur peut être implémenté en Python (`kopf`), Go, Node ou autre. +Il doit garder en mémoire l’ensemble des ressources qu’il gère, regroupées par rôle. L’indexation de Kopf est idéale pour ceci. + +Lorsqu’une ressource de rôle change, la liste complète des permissions de ce rôle (tous fichiers confondus) est recalculée, et une requête Patch via [Multiple Relation Tuples API](https://www.ory.sh/keto/docs/reference/rest-api#patch-multiple-relation-tuples) appliquée (actions insert et delete). Cette étape évite de supprimer une permission si elle existerait via un autre fichier pour le même rôle. + +Les tuples Keto pour cela : +``` +permission:PERMISSIONID#granted@role:ROLEID#member +``` + +Opérations détaillées lors du changement de ressource : +1. Récupérer permissions actuelles du rôle via [Query Relation Tuples API](https://www.ory.sh/keto/docs/reference/rest-api/#query-relation-tuples). +2. Calculer le diff à partir des index stockés. +3. Appliquer le patch. +4. En cas de problème, lever une exception pour forcer une re-synchro. + +Exemple d’appel Keto pour assigner une permission à un rôle : +::: tip Exemple : Attribuer une permission/privilège à un rôle +PATCH /relation-tuples HTTP/1.1 +Content-Type: application/json +Accept: application/json +::: + +```json +[ + { + "action": "insert", + "relation_tuple": { + "namespace": "permission", + "object": "permissionIdentifier", + "relation": "granted", + "subject": "role:x#member" + } + } +] +``` +Succès = HTTP 204 sans contenu. + +::: tip REMARQUE +Le champ `"relation"` utilise `"granted"`. +On utilise `PATCH` plutôt que `PUT` pour les lots. +::: + +### Ajout de permissions mutuellement exclusives dans Keto +Les ensembles de permissions mutuellement exclusives sont aussi modélisés dans Keto via la relation "excludes". +La relation qui relie deux permissions qui ne doivent pas coexister s’écrit : +``` +“permission:X excludes permission:Y#allowed” +``` + +::: tip REMARQUE +On utilise `"excludes"` pour désigner les exclusions de permissions. +::: + +### Appel standard à l’API Keto pour vérifier l’autorisation +Les vérifications d’autorisation peuvent être gérées via la passerelle API, et si besoin, par chaque contexte borné. + +Exemple de requête Keto pour vérifier si un utilisateur détient une permission : +::: tip Exemple : Vérification d’une autorisation via Ory Keto +POST /check HTTP/1.1 +Content-Type: application/json +Accept: application/json +::: +```json +{ + "namespace": "permission", + "object": "PermissionIdentifier", + "relation": "granted", + "subject": "UserIdentifier" +} +``` +Réponse : +```json +{ +"allowed": true/false +} +``` +::: tip Remarque : +Les permissions exclues n’ont pas à être vérifiées explicitement par appel Keto, puisque le système s’assure que des attributions conflictuelles ne peuvent exister. +::: + +## Ory Oathkeeper – détail d’implémentation +### Configuration de Ory Oathkeeper pour BizOps + +[ORY Oathkeeper](https://www.ory.sh/oathkeeper/docs/next/) autorise les requêtes HTTP entrantes. Il peut agir comme Policy Enforcement Point dans une architecture cloud, c'est-à-dire un reverse proxy devant l’API ou le serveur web qui rejette les accès non autorisés et transfère les accès valides au backend. Si un autre API Gateway est utilisé (Kong, Nginx, Envoy, AWS API Gateway…), Ory Oathkeeper peut servir de Policy Decision Point. + +Le chart Helm Ory Oathkeeper est décrit [ici](https://k8s.ory.sh/helm/oathkeeper.html) et défini [là](https://github.com/ory/k8s/tree/master/helm/charts/oathkeeper). Le référentiel Helm est documenté [ici](https://k8s.ory.sh/helm/). La configuration de référence est [là](https://www.ory.sh/oathkeeper/docs/reference/configuration). Toutes les valeurs peuvent être surchargées par des variables d’environnement. + +Le chart Helm déploie deux composants principaux : Ory Oathkeeper (stateless, config-driven, reload à chaud) et Ory Oathkeeper Maester (contrôleur du CRD Rule, qui compose toutes les rules en un unique fichier pour Oathkeeper, généralement dans un ConfigMap). + +Ory Oathkeeper expose deux ports/services : un pour l’API, un pour le Proxy. À terme, l’API sera utilisée (décisions d’accès via l’API Gateway de prochaine génération - voir [Access Control Decision API](https://www.ory.sh/oathkeeper/docs/reference/api/#access-control-decision-api)), mais à court terme, c’est le Proxy, exposé via Ingress, qui est utilisé. Les URLs externes sont pointées sur Oathkeeper Proxy, qui proxy et applique les règles d’accès sur les services internes. + +Ory Oathkeeper est configuré pour générer/signature un JWT contenant des "claims" que les services internes peuvent vérifier en accédant à un endpoint JWKS public qu’il publie (voir [listes-cryptographic-keys](https://www.ory.sh/oathkeeper/docs/reference/api/#lists-cryptographic-keys)). Ce modèle permet un régime de zero trust basique : seuls les tokens générés par Oathkeeper, respectant les règles d’accès, permettent d’accéder aux services. + +### Débogage +Les réponses/logs d’Oathkeeper sont généralement informatifs. Vérifiez les logs lors d’une requête problématique. Oathkeeper log aussi des checks de santé, etc. + +Quelques actions de débogage : +- Rendre la règle de correspondance beaucoup plus permissive pour localiser un problème d’accès. +- Vérifier que chaque URL interne pointe bien vers le bon service (tester en curl depuis le cluster). +- Examiner les logs du fournisseur d’identité (IdP). +- S’assurer que le domaine et le port pour l’introspection et l’endpoint token externe sont identiques (Keycloak est très sensible à ça). +- Pointer une règle Oathkeeper vers [https://httpbin.org/anything](https://httpbin.org/anything) pour visualiser tous les headers/requêtes effectivement reçus par le backend. + +### Éléments nécessaires en plus du Helm chart +- un secret JWKS, +- des valeurs Helm annotées. + +#### Secret JWKS +Un secret doit exister avec la clé `mutator.id_token.jwks.json` et une valeur JWKS compatible. Voyager la doc [ici](https://www.ory.sh/oathkeeper/docs/configure-deploy#cryptographic-keys) pour générer, il inclura la partie publique+privée. + +##### Rotation du secret JWKS + +Procédure suggérée : +0. Notez l’heure. +1. Ajoutez une nouvelle paire publique/privée JWKS (vue en première dans le tableau JWKS), supprimez toutes les autres sauf les deux premières. Oathkeeper utilise toujours la première clé. +2. Attendre la propagation du secret côté cluster/pod (~2 minutes max). +3. Si l’ancien secret doit être supprimé (sur suspicion de compromission), le retirer maintenant. + +#### Valeurs Helm annotées + +Plusieurs endroits nécessiteront remplacement par les bonnes URLs/valeurs spécifiques au déploiement (cf. commentaires plus bas). + +Si besoin de TLS direct à Oathkeeper, voir la doc sur `tls`, les secrets, volumes, etc. +Prometheus écoute par défaut sur `:9000/metrics`. + +```yaml + +oathkeeper: + config: + log: + level: trace + access_rules: + matching_strategy: regexp + authenticators: + cookie_session: + enabled: true + config: + check_session_url: http://kratos-public/sessions/whoami + preserve_path: true + extra_from: "@this" + subject_from: "identity.id" + only: + - ory_kratos_session + oauth2_introspection: + enabled: true + config: + introspection_url: https://whatever/the/wso2/url/is/oauth2/introspect + introspection_request_headers: + authorization: "Basic SOME WORKING AUTH HERE" + cache: + enabled: false + ttl: "60s" + authorizers: + remote_json: + enabled: true + config: + remote: http://internal-keto-url-here/check + mutators: + id_token: + enabled: true + config: + issuer_url: http://whatever-oathkeeper-internal-is-api:4456/ + errors: + fallback: + - json + handlers: + json: + enabled: true + config: + verbose: true + redirect: + enabled: true + config: + to: https://whatever-external-main-url-is/ + when: + error: + - unauthorized + - forbidden + request: + header: + accept: + - text/html +secret: + manage: false + name: oathkeeper-jwks +deployment: + extraEnv: + - name: MUTATORS_ID_TOKEN_CONFIG_JWKS_URL + value: file:///etc/secrets/mutator.id_token.jwks.json +``` + +### Règles + +Une ressource Rule doit être créée en Kubernetes pour chaque "match" backend (regex URL + méthodes HTTP) protégé par une permission. Exemple : + +```yaml +apiVersion: oathkeeper.ory.sh/v1alpha1 +kind: Rule +metadata: + name: nom-unique +spec: + version: v0.36.0-beta.4 + upstream: + url: http://url-interne-backend/ + match: + url: https://example.<[^/]*>/<.*> + methods: + - GET + authenticators: + - handler: oauth2_introspection + - handler: cookie_session + authorizer: + handler: remote_json + config: + payload: | + { + "namespace": "permission", + "object": "IDENTIFIANT_PERMISSION_ICI", + "relation": "granted", + "subject_id": "{{ print .Subject }}" + } + mutators: + - handler: id_token +``` + +### Oathkeeper avec Kratos comme authentificateur cookie +(voir doc Ory [ici](https://www.ory.sh/oathkeeper/docs/next/pipeline/authn)) +```yaml +authenticators: + cookie_session: + enabled: true + config: + check_session_url: http://kratos-public/sessions/whoami + preserve_path: true + extra_from: "@this" + subject_from: "identity.id" + only: + - ory_kratos_session +``` + +### Oathkeeper avec WSO2 ISKM pour introspection token +(voir doc Ory [ici](https://www.ory.sh/oathkeeper/docs/next/pipeline/authn)) +```yaml +oauth2_introspection: + enabled: true + config: + introspection_url: https://whatever/the/wso2/url/is/oauth2/introspect + introspection_request_headers: + authorization: "Basic SOME WORKING AUTH HERE" + cache: + enabled: false + ttl: "60s" +``` + +### Oathkeeper avec Keto comme authorizer +(voir doc Ory [ici](https://www.ory.sh/oathkeeper/docs/next/pipeline/authz)) +```yaml +authorizers: + remote_json: + enabled: true + config: + remote: http://internal-keto-url-here/check +``` + +## Ory Kratos – détail d’implémentation + +Ory Kratos est le composant de la suite Ory qui gère tous les flux d’authentification. +Il est très configurable et peut se connecter à divers systèmes/flux. Voir [la doc Kratos](https://www.ory.sh/kratos/docs/next/). +Dans ce projet, seuls connexion/déconnexion utilisateur sont mis en œuvre. +À noter, Kratos propose aussi : +- **Connexion/inscription self-service** : comptes utilisateurs via mail/mdp, SSO, passwordless, etc. +- **MFA/2FA** : support TOTP (ex : Google Authenticator) +- **Vérification de compte** : email, téléphone, adresse physique +- **Récupération de compte** : "mot de passe oublié", codes de secours, etc. +- **Gestion du profil** : changer mot de passe, email, données personnelles, réseaux sociaux, etc. +- **APIs admin** : importer, modifier, supprimer des identités. +Ces aspects peuvent devenir importants dans de futures versions IaC. + +### Détails du déploiement +Le chart Helm Kratos est décrit [ici](https://k8s.ory.sh/helm/kratos.html) et [là](https://github.com/ory/k8s/tree/master/helm/charts/kratos). Contrairement à Oathkeeper, il n'a pas de Maester CRD. Il a besoin d’une base de données (MySQL, PostgreSQL, CockroachDB, etc.). + +En plus de la base, Kratos requiert une interface utilisateur (webapp) qui affiche le déroulement courant à l’utilisateur et gère la communication backend. Ici, l’UI est minimaliste et sert uniquement d’intermédiaire pour une redirection OIDC immédiate. Elle est open source (voir [ce dépôt](https://github.com/modusbox/kratos-ui-oidcer) et l’image docker [ici](https://github.com/modusbox/kratos-ui-oidcer/pkgs/container/oidcer)), et appelée 'Shim' dans la doc ci-dessus. + +Pour faciliter l’hébergement, Kratos + UI doivent être montés sur des chemins différents sur le même domaine que l’UI principale. Alternativement, on peut utiliser des cookies cross-domain. Ce document part du principe d’une même base domaine. + +### Connexion à l’UI principale +Un client OIDC (supportant 'authorization code grant') doit être créé côté IdP, configuré pour rediriger vers n’importe quelle URL de l’UI principale (ou directement vers `/kratos/self-service/methods/oidc/callback/idp` si le wildcard n’est pas supporté). Le segment final `idp` doit être aligné avec l’id défini dans la conf. Ce client sera utilisé dans les valeurs Helm. + +Pour fonctionner parfaitement avec Kratos, l’UI principale doit : +1. Faire un appel cookies-inclus à `/kratos/sessions/whoami` ([doc](https://www.ory.sh/kratos/docs/reference/api/#operation/toSession)), qui retourne 200 avec les metadata utilisateur si connecté, sinon 401. +2. Si non connecté, rediriger ou proposer un lien vers `/kratos/self-service/registration/browser`. (Notez : `registration` désigne ici l’inscription Kratos, qui, si l’utilisateur existe déjà, redirige automatiquement vers le flow login.) +3. Pour la déconnexion, l’UI doit pointer vers `/kratos/self-service/browser/flows/logout`. + +### Valeurs Helm annotées +Ce qui suit suppose le nom de déploiement Helm `kratos`, le service exposé sous `/kratos/` et l’UI sous `/auth/` sur le même domaine. + +```yaml +deployment: + extraVolumes: + - name: extra-config + configMap: + name: kratos-extra-config + extraVolumeMounts: + - name: extra-config + mountPath: /etc/config2 + readOnly: true +kratos: + identitySchemas: + "identity.schema.json": | + { + "$id": "http://A_REMPLACER_PAR_UN_DOMAINE_SIGNIFICATIF/schema/user", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Un utilisateur", + "type": "object", + "properties": { + "traits": { + "type": "object", + "properties": { + "email": { + "title": "E-Mail", + "type": "string", + "format": "email" + }, + "subject": { + "title": "Subject", + "type": "string" + }, + "name": { + "title": "Nom", + "type": "string" + } + } + } + } + } + config: + identity: + default_schema_url: file:///etc/config/identity.schema.json + courier: + smtp: + connection_uri: smtp://unused/ + dsn: LA_CONNEXION_BASE_DE_DONNEES_ICI + hashers: + argon2: + parallelism: 1 + iterations: 3 + memory: 17000 + salt_length: 16 + key_length: 32 + log: + level: trace + selfservice: + flows: + registration: + ui_url: /auth/ + after: + oidc: + hooks: + - hook: session + logout: + after: + default_browser_return_url: https://idp.logout.url.here/logout/path?redirect_uri=https%3A%2F%2Fsomewhere.example.com%2F + methods: + oidc: + enabled: true + config: + providers: + - id: idp + provider: generic + client_id: A_DEFINIR + client_secret: A_DEFINIR + mapper_url: file:///etc/config2/oidc.jsonnet + issuer_url: https://url.idp.oidc/ + scope: + - openid + password: + enabled: false + default_browser_return_url: "https://somewhere.example.com/" + serve: + public: + base_url: "https://somewhere.example.com/kratos" + autoMigrate: true +``` + +### ConfigMap JSonnet +Dans les valeurs Helm, une ConfigMap supplémentaire `kratos-extra-config` doit contenir le fichier JSonnet suivant pour transformer les claims reçus de l’IdP dans le modèle attendu par Kratos : + +```javascript +local claims = std.extVar('claims'); + +{ + identity: { + traits: { + email: claims.email, + name: claims.name, + subject: claims.sub + }, + }, +} +``` + +Les claims mail et subject ne devraient jamais changer ; certains IdP peuvent présenter le nom différemment, dans ce cas adapter le JSonnet. Les clés dans `traits` sont libres (mais attention pour `subject` à la compatibilité avec la config). + +### Déploiement & Service de l’UI +Exemple pour exposer le service UI, supposé sur `/auth/` : + +```yaml +--- +apiVersion: v1 +kind: Service +metadata: + name: kratos-ui + labels: + app: kratos-ui +spec: + ports: + - name: http + port: 80 + targetPort: http + selector: + app: kratos-ui + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: kratos-ui + labels: + app: kratos-ui +spec: + replicas: 1 + selector: + matchLabels: + app: kratos-ui + template: + metadata: + labels: + app: kratos-ui + spec: + containers: + - name: kratos-ui + image: ghcr.io/modusbox/oidcer:latest + env: + - name: ROCKET_PORT + value: "80" + - name: ROCKET_REGISTRATION_ENDPOINT + value: http://kratos-public/self-service/registration/flows + ports: + - name: http + containerPort: 80 + readinessProbe: + httpGet: + path: /healthz + port: 80 +``` + +### Liens de référence Ory +- **Sessions de connexion** : [docs ici](https://www.ory.sh/kratos/docs/guides/login-session) +- **Cookies de session** : [docs ici](https://www.ory.sh/kratos/docs/guides/configuring-cookies) +- **CORS avec Kratos** : [docs ici](https://www.ory.sh/kratos/docs/guides/setting-up-cors) +- **Intégration Kratos - Oathkeeper (OIDC)** : [docs ici](https://www.ory.sh/kratos/docs/guides/zero-trust-iap-proxy-identity-access-proxy) +- **Intégration Kratos - WSO2 OIDC** : [docs ici](https://www.ory.sh/kratos/docs/guides/sign-in-with-github-google-facebook-linkedin) + diff --git a/docs/fr/technical/business-operations-framework/SettlementBC.md b/docs/fr/technical/business-operations-framework/SettlementBC.md new file mode 100644 index 000000000..01188b2b5 --- /dev/null +++ b/docs/fr/technical/business-operations-framework/SettlementBC.md @@ -0,0 +1,197 @@ +# Mise en œuvre opérationnelle du règlement + +## Introduction + +L'objectif de cette conception est de fournir une solution reliant les fonctions des processus métier aux opérations essentielles de règlement sur le switch. + +Cette conception est un exemple d’implémentation d’un règlement Mojaloop pour un cas d’utilisation spécifique et n’est pas destinée à être exhaustive ni à couvrir tous les scénarios. Ce guide présente la conception à haut niveau et explique la logique adoptée pour un cas d’utilisation choisi. +Bien qu’une version de cette conception soit construite et opérationnelle, tout ce qui est décrit dans ce document n’a pas forcément été réalisé. +Il s’agit d’un exemple de conception d’implémentation du règlement. L’intérêt de cette conception et de ce document est donc : +- d'être utilisé comme démonstration ; +- de servir de version initiale pour aider à ‘démarrer rapidement’ ; +- d’être une base à améliorer avant adoption ; +- de servir de point de départ pour approfondir des concepts abordés ici qui pourraient être traités dans un autre design. + +## Opérations principales de règlement + +Il s’agit des fonctionnalités de règlement actuellement fournies par le composant central de Mojaloop, [Central-Settlement](https://github.com/mojaloop/central-settlement). Des informations détaillées sont disponibles dans la [Documentation technique Mojaloop](https://github.com/mojaloop/documentation/tree/master/legacy/mojaloop-technical-overview/central-settlements). + +Les opérations de règlement de base offrent les capacités suivantes : + +- Créer un rapport de matrice de règlement à partir d’une liste de fenêtres de règlement (Settlement-Windows) +- Traiter les accusés de réception de règlement pour un rapport de matrice de règlement existant +- Gérer les fenêtres de règlement (création, fermeture, etc) +- Interroger les rapports de matrice de règlement, les fenêtres de règlement, etc. + +La définition OpenAPI est disponible dans le [dépôt Mojaloop-Specification](https://github.com/mojaloop/mojaloop-specification/tree/master/settlement-api). + +## Architecture de haut niveau + +![Architecture de haut niveau du règlement](../../../.vuepress/public/BizOps-Framework-Settlements.png) + +### Couche d’expérience (Experience layer) + +La couche d'expérience du règlement est une API sans état qui expose les données à consommer par le public concerné. Sa fonction principale actuelle est d'ajouter les informations utilisateurs récupérées dans l’API, informations injectées dans les en-têtes de requête par le proxy ORY Oathkeeper. Cette fonction devrait s’élargir au fil du développement du produit. + +### Couche de processus (Process layer) + +Les API de processus permettent de combiner des données et d’orchestrer plusieurs APIs système pour un objectif métier donné. L’API central-settlement et central-ledger du Mojaloop sont consommées par cette API de processus. + +L’API “Settlement Process” doit respecter les [standards de nommage Mojaloop](https://docs.google.com/document/d/1AZbX0UjraytFty0IWOHpyR6z35bh0-MCFG1vGKId_5M/edit?usp=sharing), et donc porter le nom suivant : `settlement-process-svc`. + +## Processus métier de règlement à haut niveau + +C’est un processus qui s’appuie sur les opérations de règlement de base pour orchestrer les capacités suivantes : + +1. **Clôture d’une fenêtre de règlement** +La fenêtre de règlement courante peut être clôturée manuellement du moment où des transferts lui sont associés. L’opérateur du hub sélectionne la fenêtre ouverte et choisit ensuite de la clôturer. +1. **Initiation du règlement** +L’initiation du règlement sert à l’opérateur du hub pour créer un lot de règlement qui pilote le processus de règlement. +Pour initier le processus, l’opérateur choisit : + - un ensemble de fenêtres de règlement ; + - et éventuellement une devise de règlement ou un modèle de règlement (si une devise est sélectionnée, elle définit le modèle applicable). +Les grands livres de position des participants en crédit net sont ajustés lors de l’initiation. +**Note :** Il est important de créer l’objet de lot de règlement selon la manière dont le règlement doit être finalisé. +1. Un **rapport d’initiation de règlement** est généré, servant à communiquer à la banque de règlement les besoins du règlement. +1. **Finalisation du règlement et rééquilibrage du compte de règlement** +Ce processus intervient après l’exécution des changements de règlement par la banque. À cette étape : + - le processus est terminé et un rapport de finalisation a été reçu de la banque ; + - les grands livres de position des participants débiteurs nets sont ajustés ; + - les grands livres de règlement sont ajustés pour tous les participants afin de correspondre au montant transféré ; + - les grands livres de règlement sont comparés aux soldes réels des comptes et ajustés pour s’aligner. + +### Fonction de rééquilibrage — non optimale +Il est à noter que la fonction de rééquilibrage définie ci-dessus n’est pas l’approche recommandée ou optimale. +Elle a été choisie pour répondre à des exigences réglementaires et aux limites des mécanismes disponibles pour réaliser le règlement entre participants, c’est-à-dire conçue pour fonctionner avec les solutions financières existantes. Le rééquilibrage présente plusieurs inconvénients et devrait être évité si possible. +Ces inconvénients sont : +1. Un rééquilibrage hors séquence donne des résultats incorrects, ce qui nécessite un processus métier et une gestion dédiée. +1. La réconciliation du compte Mojaloop Settlement et de celui à la banque est difficile et complexe, car le rééquilibrage ne reflète pas directement l’activité du compte en banque : les montants des transferts dépendent du moment où le rééquilibrage est effectué et de la génération des rapports et relevés. + +**Solutions recommandées** +Il existe de nombreuses autres approches suivant les meilleures pratiques. Merci de consulter un expert de la communauté Mojaloop pour les explorer. Si vos contraintes sont similaires et qu’il est impossible de créer un nouveau mécanisme, un ajustement mineur peut améliorer cette solution. +Remplacer le rééquilibrage par l’import d’un extrait de compte bancaire d’opérations supprimerait les problèmes de timing et de rapprochement mentionnés plus haut. + +## Schéma de séquence détaillé +![Processus de règlement détaillé](../../../.vuepress/public/settlementProcessAPI.svg) + +Certains processus du schéma méritent d’être détaillés. + +### Détermination du modèle de règlement + +Il faut d’abord déterminer les devises impliquées puis la liste appropriée de modèles de règlement. Un règlement est créé pour chaque modèle retenu. + +### Validation des données de finalisation du règlement + +Les données présentées au cours de la finalisation du règlement exigent de nombreuses validations. +Certaines contrôlent l’intégrité des données : un échec stoppe le processus. D’autres, non bloquantes, génèrent des avertissements pour l’opérateur. +La poursuite du processus n’est possible que lorsque l’opérateur a accepté les avertissements, leurs effets et a choisi les options d’application du processus. +C’est pourquoi la validation des données est une étape nécessaire, à consulter lors de toute acceptation ou poursuite du processus. + +### Cas d’utilisation pour la finalisation du règlement +**Scénarios de validation** + +| Description de la validation | Comportement attendu | +|------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------| +| L’ID de règlement sélectionné ne correspond pas à celui du rapport | Finalisation annulée avec erreur | +| La somme des transferts dans le rapport est non nulle | Finalisation annulée avec erreur | +| Le montant du transfert ne correspond pas au montant net de règlement | Finalisation annulée avec erreur | +| Solde non modifié à hauteur du montant du transfert | Continuer --> Ajuster le solde du compte de règlement | +| Le solde fourni dans le rapport n’est pas positif | Continuer --> Solde de règlement à zéro ; NCD=0 ; désactivation du compte POSITION participant | +| Comptes du règlement absents du rapport | Finalisation annulée avec erreur | +| Comptes du rapport absents du règlement | Finalisation annulée avec erreur | +| Les identifiants participant ne correspondent pas (ID, nom, compte) | Finalisation annulée avec erreur | +| Le type de compte doit être POSITION | Finalisation annulée avec erreur | +| Nouveau solde invalide pour la devise | Finalisation annulée avec erreur | +| Montant du transfert invalide pour la devise | Finalisation annulée avec erreur | +| L’ID du compte n’existe pas dans le switch | Finalisation annulée avec erreur | +| Tentative de finaliser un règlement annulé | Finalisation annulée avec erreur | +| Erreur lors de l’ajustement d’un participant | Continuer avec les autres ; notifier l’utilisateur de l’erreur | +| Erreur lors du passage à l’état PS_TRANSFERS_RECORDED | Continuer avec les autres ; notifier l’utilisateur de l’erreur | +| Erreur lors du passage à l’état PS_TRANSFERS_RESERVED | Continuer avec les autres ; notifier l’utilisateur de l’erreur | +| Erreur lors du passage à l’état PS_TRANSFERS_COMMITTED | Continuer avec les autres ; notifier l’utilisateur de l’erreur | +| Erreurs lors du règlement des comptes | Continuer avec les autres ; notifier l’utilisateur de l’erreur | +| Erreur lors de la mise à jour du NDC | Continuer avec les autres ; notifier l’utilisateur de l’erreur | +| Erreur lors du traitement des fonds entrants/sortants | Continuer avec les autres ; notifier l’utilisateur de l’erreur | +| Solde inchangé après traitement des fonds entrants/sortants | Continuer avec les autres ; notifier l’utilisateur de l’erreur | +| Solde final incorrect après traitement des fonds entrants/sortants | Continuer avec les autres ; notifier l’utilisateur de l’erreur | +| Échec de l’enregistrement de l’état du compte participant au règlement | Continuer avec les autres ; notifier l’utilisateur de l’erreur | + +### Informations d’audit dans la version Mojaloop actuelle + +L’opération réalisée est enregistrée dans le champ “settlement reason”, donc consultable dans les rapports d’audit. +De plus, l’utilisateur et les références sont capturés dans les listes d’extension — consultables elles aussi dans les rapports d’audit. + +### RBAC + +Pour exploiter au mieux le contrôle RBAC, les quatre processus ci-dessus seront implémentés comme combinaisons distinctes de point de terminaison API et méthode HTTP. Cela autorise des permissions dédiées à chaque processus. + +## Prise en charge du multi-devises + +L’exécution des règlements multi-devises dépend de deux facteurs : +1. Comment les modèles de règlement sont conçus ? + Les modèles peuvent être liés à une devise ou non, et s’appliquer à toutes les devises. +1. Comment les règlements sont initiés ? + L’initiation du règlement peut se faire avec ou sans devise ou modèle spécifié. + +Comme il est difficile de séparer un règlement une fois initié, il est préférable de décider à l’avance du mode d’application du règlement et de concevoir le système en conséquence. + +--- +**REMARQUE** +Si vous exécutez un modèle net différé multilatéral à devise unique et utilisez des devises test pour vos tests réguliers, il est préférable de créer les règlements des devises de test séparément de la devise réelle. Idéalement, il ne faut pas avoir à sélectionner la devise ou un modèle lors de l’initiation du règlement. +Cela s’obtient en créant des modèles séparés : un pour chaque monnaie test, un pour la monnaie réelle. +Par défaut, l’initiation sur transactions multi-devises génère des règlements séparés. (La fonction de détermination des modèles les trouvera tous.) +___ + +## Cas d’erreur +### Initiation du règlement + +**Schéma de séquence détaillé de l’initiation** + +![Processus d’initiation du règlement avec erreurs](../../../.vuepress/public/settlementProcessInitiationErrors.svg) + +**Codes d’erreur à l’initiation du règlement** + +| Description de l’erreur | Code erreur | Code HTTP | Catégorie | +|-----------------------------------------------------------------------|------------|------------------|---------------------------------------------| +| ID de règlement introuvable | 3100 | 400 | Erreur validation requête | +| Devise non valide | 3100 | 400 | Erreur validation requête | +| Modèle de règlement introuvable | 3100 | 400 | Erreur validation requête | +| Impossible de créer le règlement | 2000 | 500 | Erreur interne serveur | +| Impossible de mettre à jour l’état du règlement | 2000 | 500 | Erreur interne serveur | +| Erreur technique lors des communications avec les services Mojaloop | 1000 | 500 | Erreur technique | + +### Finalisation du règlement + +**Schéma de séquence détaillé de la finalisation** + +![Processus d’initiation du règlement avec erreurs](../../../.vuepress/public/settlementProcessFinaliseErrors.svg) + +**Codes erreurs de validation à la finalisation** + +| Description de l’erreur | Code erreur | Code HTTP | Catégorie | +|-----------------------------------------------------------------------|------------|------------------|---------------------------------------------| +| ID de règlement introuvable | 3100 | 400 | Erreur validation requête | +| IDs de participants introuvables | 3000 | 400 | Erreur validation requête | +| IDs de compte participants introuvables | 3000 | 400 | Erreur validation requête | +| Erreur technique lors des communications avec les services Mojaloop | 1000 | 500 | Erreur technique | +| ID de règlement sélectionné ne correspondant pas au rapport | 3100 | 500 | Erreur validation processus | +| IDs participants du rapport ne correspondent pas au règlement | 3000 | 500 | Erreur validation processus | +| Comptes du rapport ne correspondent pas au règlement | 3000 | 500 | Erreur validation processus | +| Somme des transferts non nulle dans le rapport | 3100 | 500 | Erreur validation processus | +| Montant transfert ≠ montant net de règlement | 3100 | 500 | Erreur validation processus | +| Nouveau solde non valide pour la devise | 3100 | 500 | Erreur validation processus | +| Montant de transfert non valide pour la devise | 3100 | 500 | Erreur validation processus | +| Règlement à l’état ABORTED ou invalide | 3100 | 500 | Erreur validation processus | +| Montant de transfert non valide pour la devise | 3100 | 500 | Erreur validation processus | + +**Codes d’erreur de confirmation à la finalisation** + +| Description de l’erreur | Code erreur | Code HTTP | Catégorie | +|-----------------------------------------------------------------------|------------|------------------|---------------------------------------------| +| ID de finalisation introuvable | 3100 | 400 | Erreur validation requête | +| ID de règlement introuvable | 3100 | 400 | Erreur validation requête | +| Erreur technique lors des communications avec les services Mojaloop | 1000 | 500 | Erreur technique | +| Erreur traitement des fonds entrants/sortants | 2001 | 500 | Erreur interne serveur | +| Impossible de mettre à jour l’état du règlement | 2001 | 500 | Erreur interne serveur | +| Soldes non concordants après règlement | 2001 | 500 | Erreur interne serveur | +| Soldes non concordants après rééquilibrage | 2001 | 500 | Erreur interne serveur | diff --git a/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-fulfil-2.1.0.plantuml b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-fulfil-2.1.0.plantuml new file mode 100644 index 000000000..a97f68652 --- /dev/null +++ b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-fulfil-2.1.0.plantuml @@ -0,0 +1,171 @@ +/' + License + -------------- + Copyright © 2020 Mojaloop Foundation + The Mojaloop files are made available by the Mojaloop Foundation under the Apache License, Version 2.0 + (the "License") and you may not use these files except in compliance with the [License](http://www.apache.org/licenses/LICENSE-2.0). + You may obtain a copy of the License at [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the [License](http://www.apache.org/licenses/LICENSE-2.0). + + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Steven Oderayi + -------------- + '/ + + +@startuml fx-fulfil-request +title 2.1.0. Le FXP envoie une demande d’exécution réussie (fulfil success) de conversion FX + +autonumber + +actor "DFSP1\nPayeur" as DFSP1 +control "FXP1\nFXP" as FXP1 +boundary "Adaptateur ML API" as MLAPI +control "Gestionnaire d’événements de notification ML API" as NOTIFY_HANDLER +boundary "API du service central" as CSAPI +collections "topic-transfer-fulfil" as TOPIC_FULFIL +control "Gestionnaire d’événements Fulfil" as FULF_HANDLER +collections "topic-\nsettlement-model" as TOPIC_SETMODEL +control "Gestionnaire du modèle\nde règlement" as SETMODEL_HANDLER +collections "topic-\ntransfer-position" as TOPIC_TRANSFER_POSITION +control "Gestionnaire Position" as POS_HANDLER +collections "topic-\nnotification" as TOPIC_NOTIFICATIONS + +box "Fournisseurs de services financiers" #lightGray + participant DFSP1 + participant FXP1 +end box + +box "Service adaptateur ML API" #LightBlue + participant MLAPI + participant NOTIFY_HANDLER +end box + +box "Service central" #LightYellow + participant CSAPI + participant TOPIC_FULFIL + participant FULF_HANDLER + participant TOPIC_SETMODEL + participant SETMODEL_HANDLER + participant TOPIC_TRANSFER_POSITION + participant POS_HANDLER + participant TOPIC_NOTIFICATIONS +end box + +activate NOTIFY_HANDLER +activate FULF_HANDLER +activate SETMODEL_HANDLER +activate POS_HANDLER +group FXP1 envoie une demande d’exécution réussie de conversion FX + FXP1 <-> FXP1: Récupérer la chaîne d’exécution (fulfilment) générée lors du\nprocessus de cotation FX ou la régénérer à partir du\n**secret local** et du **paquet ILP** + note right of FXP1 #yellow + En-têtes - transferHeaders: { + Content-Length: , + Content-Type: , + Date: , + X-Forwarded-For: , + FSPIOP-Source: , + FSPIOP-Destination: , + FSPIOP-Encryption: , + FSPIOP-Signature: , + FSPIOP-URI: , + FSPIOP-HTTP-Method: + } + + Charge utile - transferMessage: + { + "conversionState": "" + "fulfilment": , + "completedTimestamp": , + "extensionList": { + "extension": [ + { + "key": , + "value": + } + ] + } + } + end note + FXP1 ->> MLAPI: PUT - /fxTransfers/ + activate MLAPI + MLAPI -> MLAPI: Validation de schéma\n + break Échec de la validation de schéma + MLAPI -->> FXP1: Réponse HTTP - 400 (Bad Request) + end + MLAPI -> MLAPI: Valider la requête entrante \n(p. ex. le transfert n’a pas expiré, completedTimestamp n’est pas dans le futur)\nCodes d’erreur : 2001, 3100 + note right of MLAPI #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + type: fulfil, + action: fx_commit, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + MLAPI -> TOPIC_FULFIL: Router et publier l’événement Fulfil pour le bénéficiaire\nCode d’erreur : 2001 + activate TOPIC_FULFIL + TOPIC_FULFIL <-> TOPIC_FULFIL: Vérifier que l’événement est répliqué selon la configuration (ACKS=all)\nCode d’erreur : 2001 + TOPIC_FULFIL --> MLAPI: Répondre que les accusés de réplication ont été reçus + deactivate TOPIC_FULFIL + MLAPI -->> FXP1: Réponse HTTP - 200 (OK) + deactivate MLAPI + TOPIC_FULFIL <- FULF_HANDLER: Consommer le message + ref over TOPIC_FULFIL, TOPIC_TRANSFER_POSITION: Consommation du gestionnaire Fulfil (succès) {[[https://github.com/mojaloop/documentation/tree/master/mojaloop-technical-overview/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.1.svg 2.1.1]]} \n + FULF_HANDLER -> TOPIC_SETMODEL: Produire un message + FULF_HANDLER -> TOPIC_TRANSFER_POSITION: Produire un message + ||| + TOPIC_SETMODEL <- SETMODEL_HANDLER: Consommer le message + ref over TOPIC_SETMODEL, SETMODEL_HANDLER: Consommation du gestionnaire de modèle de règlement (succès)\n + ||| + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consommer le message + ref over TOPIC_TRANSFER_POSITION, TOPIC_NOTIFICATIONS: Consommation du gestionnaire Position (succès)\n + POS_HANDLER -> TOPIC_NOTIFICATIONS: Produire un message + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consommer le message + opt action == 'fx_commit' + ||| + ref over DFSP1, TOPIC_NOTIFICATIONS: Envoi de notification au participant (payeur)\n + NOTIFY_HANDLER -> DFSP1: Envoyer la notification de rappel (callback) + end + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consommer le message + opt action == 'fx_commit' + ||| + ref over FXP1, TOPIC_NOTIFICATIONS: Envoi de notification au participant (FXP)\n + NOTIFY_HANDLER -> FXP1: Envoyer la notification de rappel (callback) + end + ||| +end +deactivate POS_HANDLER +deactivate FULF_HANDLER +deactivate NOTIFY_HANDLER +@enduml diff --git a/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-fulfil-2.1.0.svg b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-fulfil-2.1.0.svg new file mode 100644 index 000000000..4a31c85ba --- /dev/null +++ b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-fulfil-2.1.0.svg @@ -0,0 +1,322 @@ + + 2.1.0. Le FXP envoie une demande d’exécution réussie (fulfil success) de conversion FX + + + 2.1.0. Le FXP envoie une demande d’exécution réussie (fulfil success) de conversion FX + + Fournisseurs de services financiers + + Service adaptateur ML API + + Service central + + + + + + + + + + + + + + + + + + + + + + + DFSP1 + Payeur + + + DFSP1 + Payeur + + + FXP1 + FXP + + + FXP1 + FXP + + + Adaptateur ML API + + + Adaptateur ML API + + + Gestionnaire d’événements de notification ML API + + + Gestionnaire d’événements de notification ML API + + + API du service central + + + API du service central + + + + + topic-transfer-fulfil + + + topic-transfer-fulfil + Gestionnaire d’événements Fulfil + + + Gestionnaire d’événements Fulfil + + + + + topic- + settlement-model + + + topic- + settlement-model + Gestionnaire du modèle + de règlement + + + Gestionnaire du modèle + de règlement + + + + + topic- + transfer-position + + + topic- + transfer-position + Gestionnaire Position + + + Gestionnaire Position + + + + + topic- + notification + + + topic- + notification + + + + + + + + + FXP1 envoie une demande d’exécution réussie de conversion FX + + + + + + 1 + Récupérer la chaîne d’exécution (fulfilment) générée lors du + processus de cotation FX ou la régénérer à partir du + secret local + et du + paquet ILP + + + En-têtes - transferHeaders: { + Content-Length: <Content-Length>, + Content-Type: <Content-Type>, + Date: <Date>, + X-Forwarded-For: <X-Forwarded-For>, + FSPIOP-Source: <FSPIOP-Source>, + FSPIOP-Destination: <FSPIOP-Destination>, + FSPIOP-Encryption: <FSPIOP-Encryption>, + FSPIOP-Signature: <FSPIOP-Signature>, + FSPIOP-URI: <FSPIOP-URI>, + FSPIOP-HTTP-Method: <FSPIOP-HTTP-Method> + } +   + Charge utile - transferMessage: + { + "conversionState": "<transferState>" + "fulfilment": <IlpFulfilment>, + "completedTimestamp": <DateTime>, + "extensionList": { + "extension": [ + { + "key": <string>, + "value": <string> + } + ] + } + } + + + + 2 + PUT - /fxTransfers/<ID> + + + + + 3 + Validation de schéma +   + + + break + [Échec de la validation de schéma] + + + + 4 + Réponse HTTP - 400 (Bad Request) + + + + + 5 + Valider la requête entrante + (p. ex. le transfert n’a pas expiré, completedTimestamp n’est pas dans le futur) + Codes d’erreur : + 2001, 3100 + + + Message : + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + type: fulfil, + action: fx_commit, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 6 + Router et publier l’événement Fulfil pour le bénéficiaire + Code d’erreur : + 2001 + + + + + + 7 + Vérifier que l’événement est répliqué selon la configuration (ACKS=all) + Code d’erreur : + 2001 + + + 8 + Répondre que les accusés de réplication ont été reçus + + + + 9 + Réponse HTTP - 200 (OK) + + + 10 + Consommer le message + + + ref + Consommation du gestionnaire Fulfil (succès) { + 2.1.1 + } +   + + + 11 + Produire un message + + + 12 + Produire un message + + + 13 + Consommer le message + + + ref + Consommation du gestionnaire de modèle de règlement (succès) +   + + + 14 + Consommer le message + + + ref + Consommation du gestionnaire Position (succès) +   + + + 15 + Produire un message + + + 16 + Consommer le message + + + opt + [action == 'fx_commit'] + + + ref + Envoi de notification au participant (payeur) +   + + + 17 + Envoyer la notification de rappel (callback) + + + 18 + Consommer le message + + + opt + [action == 'fx_commit'] + + + ref + Envoi de notification au participant (FXP) +   + + + 19 + Envoyer la notification de rappel (callback) + + diff --git a/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-prepare-1.1.0.plantuml b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-prepare-1.1.0.plantuml new file mode 100644 index 000000000..69836a480 --- /dev/null +++ b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-prepare-1.1.0.plantuml @@ -0,0 +1,183 @@ +/'***** + License + -------------- + Copyright © 2020 Mojaloop Foundation + The Mojaloop files are made available by the Mojaloop Foundation under the Apache License, Version 2.0 + (the "License") and you may not use these files except in compliance with the [License](http://www.apache.org/licenses/LICENSE-2.0). + You may obtain a copy of the License at [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the [License](http://www.apache.org/licenses/LICENSE-2.0). + + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Steven Oderayi + -------------- + ******'/ + +@startuml PayerFSP-fx-conversion-prepare-request + +!$payerCurrency = "" +!$payeeCurrency = "" +!$dfsp1Id = "" +!$fxpID = "" +!$payerMSISDN = "" +!$payeeMSISDN = "" +!$payeeReceiveAmount = "" +!$payerSendAmount = "" +!$payeeFee = "" +!$targetAmount = "" +!$fxpChargesSource = "" +!$fxpChargesTarget = "" +!$fxpSourceAmount = "" +!$fxpTargetAmount = "" +!$conversionRequestId = "" +!$conversionId = "" +!$homeTransactionId = "" +!$quoteId = "" +!$transactionId = "" +!$quotePayerExpiration = "" +!$quotePayeeExpiration = "" +!$commitRequestId = "" +!$determiningTransferId = "" +!$transferId = "" +!$fxCondition = "" +!$condition = "" + +title 1.1.0. DFSP1 envoie une demande de préparation de conversion FX à FXP1 + +autonumber + +actor "DFSP1\nPayeur" as DFSP1 +control "FXP1\nFXP" as FXP1 +boundary "Adaptateur ML API" as MLAPI +control "Gestionnaire d’événements de notification ML API" as NOTIFY_HANDLER +boundary "API du service central" as CSAPI +collections "topic-transfer-prepare" as TOPIC_TRANSFER_PREPARE +control "Gestionnaire d’événements Prepare" as PREP_HANDLER +collections "topic-transfer-position" as TOPIC_TRANSFER_POSITION +control "Gestionnaire d’événements Position" as POS_HANDLER +collections "Notification-Topic" as TOPIC_NOTIFICATIONS + +box "Fournisseurs de services financiers" #lightGray + participant DFSP1 + participant FXP1 +end box + +box "Service adaptateur ML API" #LightBlue + participant MLAPI + participant NOTIFY_HANDLER +end box + +box "Service central" #LightYellow + participant CSAPI + participant TOPIC_TRANSFER_PREPARE + participant PREP_HANDLER + participant TOPIC_TRANSFER_POSITION + participant POS_HANDLER + participant TOPIC_NOTIFICATIONS +end box + +activate NOTIFY_HANDLER +activate PREP_HANDLER +activate POS_HANDLER +group DFSP1 envoie une demande de conversion FX à FXP1 + note right of DFSP1 #yellow + En-têtes - transferHeaders: { + Content-Length: , + Content-Type: , + Date: , + X-Forwarded-For: , + FSPIOP-Source: , + FSPIOP-Destination: , + FSPIOP-Encryption: , + FSPIOP-Signature: , + FSPIOP-URI: , + FSPIOP-HTTP-Method: + } + + Charge utile : + { + "commitRequestId": "$commitRequestId", + "determiningTransferId": "$determiningTransferId", + "initiatingFsp": "$dfsp1Id", + "counterPartyFsp": "$fxpID", + "amountType": "SEND", + "sourceAmount": { + "currency": "$payerCurrency", + "amount": "$fxpSourceAmount" + }, + "targetAmount": { + "currency": "$payeeCurrency", + "amount": "$fxpTargetAmount" + }, + "condition": "$fxCondition" + } + end note + DFSP1 ->> MLAPI: POST - /fxTransfers + activate MLAPI + MLAPI -->> DFSP1: Réponse HTTP - 202 (Accepted) + alt Erreur de validation du schéma + MLAPI-->>DFSP1: Réponse HTTP - 400 (Bad Request) + end + note right of MLAPI #yellow + Message : + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + type: prepare, + action: fx_prepare, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + MLAPI -> TOPIC_TRANSFER_PREPARE: Router et publier l’événement FX Prepare pour le payeur + activate TOPIC_TRANSFER_PREPARE + TOPIC_TRANSFER_PREPARE <-> TOPIC_TRANSFER_PREPARE: Vérifier que l’événement est répliqué selon la configuration (ACKS=all)\nCode d’erreur : 2003 + TOPIC_TRANSFER_PREPARE --> MLAPI: Les accusés de réplication ont été reçus + deactivate TOPIC_TRANSFER_PREPARE + alt Erreur lors de la publication de l’événement + MLAPI-->>DFSP1: Réponse HTTP - 500 (Internal Server Error)\n**Code d’erreur :** 2003 + end + deactivate MLAPI + ||| + TOPIC_TRANSFER_PREPARE <- PREP_HANDLER: Consommer le message + ref over TOPIC_TRANSFER_PREPARE, PREP_HANDLER, TOPIC_TRANSFER_POSITION : Consommation du gestionnaire Prepare\n + PREP_HANDLER -> TOPIC_TRANSFER_POSITION: Produire un message + ||| + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consommer le message + ref over TOPIC_TRANSFER_POSITION, POS_HANDLER : Consommation du gestionnaire Position\n + POS_HANDLER -> TOPIC_NOTIFICATIONS: Produire un message + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consommer le message + ref over FXP1, TOPIC_NOTIFICATIONS : Envoi de notification au participant (FXP)\n + NOTIFY_HANDLER -> FXP1: Envoyer la notification de rappel (callback) + ||| +end +deactivate POS_HANDLER +deactivate PREP_HANDLER +deactivate NOTIFY_HANDLER +@enduml diff --git a/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-prepare-1.1.0.svg b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-prepare-1.1.0.svg new file mode 100644 index 000000000..38d3e04ea --- /dev/null +++ b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-prepare-1.1.0.svg @@ -0,0 +1,246 @@ + + 1.1.0. DFSP1 envoie une demande de préparation de conversion FX à FXP1 + + + 1.1.0. DFSP1 envoie une demande de préparation de conversion FX à FXP1 + + Fournisseurs de services financiers + + Service adaptateur ML API + + Service central + + + + + + + + + + + + + + + + + + + DFSP1 + Payeur + + + DFSP1 + Payeur + + + FXP1 + FXP + + + FXP1 + FXP + + + Adaptateur ML API + + + Adaptateur ML API + + + Gestionnaire d’événements de notification ML API + + + Gestionnaire d’événements de notification ML API + + + API du service central + + + API du service central + + + + + topic-transfer-prepare + + + topic-transfer-prepare + Gestionnaire d’événements Prepare + + + Gestionnaire d’événements Prepare + + + + + topic-transfer-position + + + topic-transfer-position + Gestionnaire d’événements Position + + + Gestionnaire d’événements Position + + + + + Notification-Topic + + + Notification-Topic + + + + + + + + DFSP1 envoie une demande de conversion FX à FXP1 + + + En-têtes - transferHeaders: { + Content-Length: <Content-Length>, + Content-Type: <Content-Type>, + Date: <Date>, + X-Forwarded-For: <X-Forwarded-For>, + FSPIOP-Source: <FSPIOP-Source>, + FSPIOP-Destination: <FSPIOP-Destination>, + FSPIOP-Encryption: <FSPIOP-Encryption>, + FSPIOP-Signature: <FSPIOP-Signature>, + FSPIOP-URI: <FSPIOP-URI>, + FSPIOP-HTTP-Method: <FSPIOP-HTTP-Method> + } +   + Charge utile : + { + "commitRequestId": "<UUID>", + "determiningTransferId": "<UUID>", + "initiatingFsp": "<DFSP1>", + "counterPartyFsp": "<fxpId>", + "amountType": "SEND", + "sourceAmount": { + "currency": "<ISO currency code>", + "amount": "<number>" + }, + "targetAmount": { + "currency": "<ISO currency code>", + "amount": "<number>" + }, + "condition": "<ILP condition>" + } + + + + 1 + POST - /fxTransfers + + + + 2 + Réponse HTTP - 202 (Accepted) + + + alt + [Erreur de validation du schéma] + + + + 3 + Réponse HTTP - 400 (Bad Request) + + + Message : + { + id: <transferMessage.commitRequestId> + from: <transferMessage.initiatingFsp>, + to: <transferMessage.counterPartyFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <UUID>, + type: prepare, + action: fx_prepare, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 4 + Router et publier l’événement FX Prepare pour le payeur + + + + + + 5 + Vérifier que l’événement est répliqué selon la configuration (ACKS=all) + Code d’erreur : + 2003 + + + 6 + Les accusés de réplication ont été reçus + + + alt + [Erreur lors de la publication de l’événement] + + + + 7 + Réponse HTTP - 500 (Internal Server Error) + Code d’erreur : + 2003 + + + 8 + Consommer le message + + + ref + Consommation du gestionnaire Prepare +   + + + 9 + Produire un message + + + 10 + Consommer le message + + + ref + Consommation du gestionnaire Position +   + + + 11 + Produire un message + + + 12 + Consommer le message + + + ref + Envoi de notification au participant (FXP) +   + + + 13 + Envoyer la notification de rappel (callback) + + diff --git a/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-prepare-1.1.1.a.plantuml b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-prepare-1.1.1.a.plantuml new file mode 100644 index 000000000..67f65c239 --- /dev/null +++ b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-prepare-1.1.1.a.plantuml @@ -0,0 +1,269 @@ +/'***** + License + -------------- + Copyright © 2020 Mojaloop Foundation + The Mojaloop files are made available by the Mojaloop Foundation under the Apache License, Version 2.0 + (the "License") and you may not use these files except in compliance with the [License](http://www.apache.org/licenses/LICENSE-2.0). + You may obtain a copy of the License at [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the [License](http://www.apache.org/licenses/LICENSE-2.0). + + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Steven Oderayi + -------------- + ******'/ + +@startuml prepare-handler-consume +title 1.1.1.a. Consommation du gestionnaire Prepare FX (message unique) + +autonumber + +collections "topic-transfer-prepare" as TOPIC_TRANSFER_PREPARE +control "Gestionnaire d’événements Prepare" as PREP_HANDLER +collections "topic-transfer-position" as TOPIC_TRANSFER_POSITION +collections "Notification-Topic" as TOPIC_NOTIFICATIONS +entity "DAO Position" as POS_DAO +entity "DAO Participant" as PARTICIPANT_DAO +database "Stockage central" as DB + +box "Service central" #LightYellow + participant TOPIC_TRANSFER_PREPARE + participant PREP_HANDLER + participant TOPIC_TRANSFER_POSITION + participant TOPIC_NOTIFICATIONS + participant POS_DAO + participant PARTICIPANT_DAO + participant DB +end box + +activate PREP_HANDLER +group Consommation du gestionnaire Prepare + note left of PREP_HANDLER #lightgrey + L’événement est automatiquement répliqué + vers le topic des événements (topic-events) + end note + + TOPIC_TRANSFER_PREPARE <- PREP_HANDLER: Consommer le message d’événement Prepare + activate TOPIC_TRANSFER_PREPARE + deactivate TOPIC_TRANSFER_PREPARE + + break + group Filtrer l’événement + PREP_HANDLER <-> PREP_HANDLER: Filtrer l’événement - Règles : type == 'prepare' && action == 'fx_prepare'\nCodes d’erreur : 2001 + end + end + + group Valider le transfert Prepare + PREP_HANDLER <-> PREP_HANDLER: Validation de schéma du message entrant + PREP_HANDLER <-> PREP_HANDLER: Vérifier la signature du message (à confirmer dans une exigence ultérieure) + note right of PREP_HANDLER #lightgrey + Les étapes de validation ci-dessus sont déjà traitées par + le ML-Adapter pour l’implémentation open source. + Elles pourront devoir être ajoutées ultérieurement pour des adaptateurs personnalisés. + end note + + group Contrôle des doublons + ||| + PREP_HANDLER -> DB: Demander le contrôle des doublons + ref over PREP_HANDLER, DB: Demande de contrôle des doublons\n + DB --> PREP_HANDLER: Retour { hasDuplicateId: Boolean, hasDuplicateHash: Boolean } + end + + alt hasDuplicateId == TRUE + group Traiter la duplication + alt hasDuplicateId == TRUE && hasDuplicateHash == FALSE + note right of PREP_HANDLER #lightgrey + Valider le transfert Prepare (échec) - Requête modifiée + end note + else hasDuplicateId == TRUE && hasDuplicateHash == TRUE + break + PREP_HANDLER -> DB: stateRecord = await getFxTransferById(commitRequestId) + activate DB + hnote over DB #lightyellow + fxTransferStateChange + end note + DB --> PREP_HANDLER: Retour stateRecord + deactivate DB + alt [COMMITTED, ABORTED].includes(stateRecord.transferStateEnumeration) + ||| + + PREP_HANDLER -> TOPIC_NOTIFICATIONS: Produire un message [functionality = TRANSFER, action = PREPAPE_DUPLICATE] + else + note right of PREP_HANDLER #lightgrey + Ignorer - renvoi en cours + end note + end + end + end + end + else hasDuplicateId == FALSE + group Valider la requête Prepare + group Valider le payeur + PREP_HANDLER -> PREP_HANDLER: Valider que l’en-tête FSPIOP-Source correspond à initiatingFsp + PREP_HANDLER -> PREP_HANDLER: Valider l’échelle et la précision de payload.sourceAmount et payload.targetAmount + PREP_HANDLER -> PARTICIPANT_DAO: Demander les détails du participant payeur (s’il existe) + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Demander les détails du participant + hnote over DB #lightyellow + participant + participantCurrency + end note + activate DB + PARTICIPANT_DAO <-- DB: Retour des détails du participant s’ils existent + deactivate DB + PARTICIPANT_DAO --> PREP_HANDLER: Retour des détails du participant s’ils existent + deactivate PARTICIPANT_DAO + PREP_HANDLER <-> PREP_HANDLER: Valider que le participant payeur est actif + PREP_HANDLER <-> PREP_HANDLER: Valider le compte de position du participant payeur pour la devise source [existe, actif] + end + group Valider le bénéficiaire + PREP_HANDLER -> PARTICIPANT_DAO: Demander les détails du participant bénéficiaire (s’il existe) + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Demander les détails du participant + hnote over DB #lightyellow + participant + participantCurrency + end note + activate DB + PARTICIPANT_DAO <-- DB: Retour des détails du participant s’ils existent + deactivate DB + PARTICIPANT_DAO --> PREP_HANDLER: Retour des détails du participant s’ils existent + deactivate PARTICIPANT_DAO + PREP_HANDLER <-> PREP_HANDLER: Valider que le participant bénéficiaire est actif + PREP_HANDLER <-> PREP_HANDLER: Valider le compte de position du participant bénéficiaire pour la devise cible [existe, actif] + end + group Valider la condition et l’expiration + PREP_HANDLER <-> PREP_HANDLER: Valider la condition cryptographique + PREP_HANDLER <-> PREP_HANDLER: Valider l’expiration [payload.expiration est une date ISO valide et non passée] + end + group Valider des FSP distincts (si ENABLE_ON_US_TRANSFER == false) + PREP_HANDLER <-> PREP_HANDLER: Valider que les FSP payeur et bénéficiaire sont différents + end + alt Valider le transfert Prepare (succès) + group Persister l’état du transfert (avec transferState='RECEIVED-PREPARE') + PREP_HANDLER -> DB: Demander la persistance du transfert\nCodes d’erreur : 2003 + activate DB + hnote over DB #lightyellow + fxTransfer + fxTransferParticipant + fxTransferStateChange + fxTransferExtension + end note + DB --> PREP_HANDLER: Retour succès + deactivate DB + end + else Valider le transfert Prepare (échec) + group Persister l’état du transfert (avec transferState='INVALID') (introduction d’un nouveau statut INVALID pour marquer ces entrées) + PREP_HANDLER -> DB: Demander la persistance du transfert\n(lorsque la validation payeur/bénéficiaire/condition crypto échoue)\nCodes d’erreur : 2003 + activate DB + hnote over DB #lightyellow + fxTransfer + fxTransferParticipant + fxTransferStateChange + fxTransferExtension + fxTransferError + end note + DB --> PREP_HANDLER: Retour succès + deactivate DB + end + end + end + end + end + + alt Valider le transfert Prepare (succès) + group Hydrater le message Prepare du transfert + PREP_HANDLER -> PARTICIPANT_DAO: Obtenir participant et devise pour le transfert FX (avec 'payload.determiningTransferId') + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Demander participant et devise + hnote over DB #lightyellow + participant + participantCurrency + end note + activate DB + PARTICIPANT_DAO <-- DB: Retour participant et devise + deactivate DB + PARTICIPANT_DAO --> PREP_HANDLER: Retour participant et devise + deactivate PARTICIPANT_DAO + + end + note right of PREP_HANDLER #yellow + Message : + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: position, + action: fx_prepare, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + PREP_HANDLER -> TOPIC_TRANSFER_POSITION: Router et publier l’événement Position pour le payeur\nCodes d’erreur : 2003 + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + else Valider le transfert Prepare (échec) + note right of PREP_HANDLER #yellow + Message : + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": + "errorDescription": "", + "extensionList": + } + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: fx_prepare, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + PREP_HANDLER -> TOPIC_NOTIFICATIONS: Publier l’événement de notification (échec) pour le payeur\nCodes d’erreur : 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end +end +deactivate PREP_HANDLER +@enduml diff --git a/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-prepare-1.1.1.a.svg b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-prepare-1.1.1.a.svg new file mode 100644 index 000000000..69422eae7 --- /dev/null +++ b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-prepare-1.1.1.a.svg @@ -0,0 +1,467 @@ + + 1.1.1.a. Consommation du gestionnaire Prepare FX (message unique) + + + 1.1.1.a. Consommation du gestionnaire Prepare FX (message unique) + + Service central + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + topic-transfer-prepare + + + topic-transfer-prepare + Gestionnaire d’événements Prepare + + + Gestionnaire d’événements Prepare + + + + + topic-transfer-position + + + topic-transfer-position + + + Notification-Topic + + + Notification-Topic + DAO Position + + + DAO Position + + + DAO Participant + + + DAO Participant + + + Stockage central + + + Stockage central + + + + + + + + + + + + + + + + + + Consommation du gestionnaire Prepare + + + L’événement est automatiquement répliqué + vers le topic des événements (topic-events) + + + 1 + Consommer le message d’événement Prepare + + + break + + + Filtrer l’événement + + + + + + 2 + Filtrer l’événement - Règles : type == 'prepare' && action == 'fx_prepare' + Codes d’erreur : + 2001 + + + Valider le transfert Prepare + + + + + + 3 + Validation de schéma du message entrant + + + + + + 4 + Vérifier la signature du message (à confirmer dans une exigence ultérieure) + + + Les étapes de validation ci-dessus sont déjà traitées par + le ML-Adapter pour l’implémentation open source. + Elles pourront devoir être ajoutées ultérieurement pour des adaptateurs personnalisés. + + + Contrôle des doublons + + + 5 + Demander le contrôle des doublons + + + ref + Demande de contrôle des doublons +   + + + 6 + Retour { hasDuplicateId: Boolean, hasDuplicateHash: Boolean } + + + alt + [hasDuplicateId == TRUE] + + + Traiter la duplication + + + alt + [hasDuplicateId == TRUE && hasDuplicateHash == FALSE] + + + Valider le transfert Prepare (échec) - Requête modifiée + + [hasDuplicateId == TRUE && hasDuplicateHash == TRUE] + + + break + + + 7 + stateRecord = await getFxTransferById(commitRequestId) + + fxTransferStateChange + + + 8 + Retour stateRecord + + + alt + [[COMMITTED, ABORTED].includes(stateRecord.transferStateEnumeration)] + + + 9 + Produire un message [functionality = TRANSFER, action = PREPAPE_DUPLICATE] + + + + Ignorer - renvoi en cours + + [hasDuplicateId == FALSE] + + + Valider la requête Prepare + + + Valider le payeur + + + + + 10 + Valider que l’en-tête FSPIOP-Source correspond à initiatingFsp + + + + + 11 + Valider l’échelle et la précision de payload.sourceAmount et payload.targetAmount + + + 12 + Demander les détails du participant payeur (s’il existe) + + + 13 + Demander les détails du participant + + participant + participantCurrency + + + 14 + Retour des détails du participant s’ils existent + + + 15 + Retour des détails du participant s’ils existent + + + + + + 16 + Valider que le participant payeur est actif + + + + + + 17 + Valider le compte de position du participant payeur pour la devise source [existe, actif] + + + Valider le bénéficiaire + + + 18 + Demander les détails du participant bénéficiaire (s’il existe) + + + 19 + Demander les détails du participant + + participant + participantCurrency + + + 20 + Retour des détails du participant s’ils existent + + + 21 + Retour des détails du participant s’ils existent + + + + + + 22 + Valider que le participant bénéficiaire est actif + + + + + + 23 + Valider le compte de position du participant bénéficiaire pour la devise cible [existe, actif] + + + Valider la condition et l’expiration + + + + + + 24 + Valider la condition cryptographique + + + + + + 25 + Valider l’expiration [payload.expiration est une date ISO valide et non passée] + + + Valider des FSP distincts (si ENABLE_ON_US_TRANSFER == false) + + + + + + 26 + Valider que les FSP payeur et bénéficiaire sont différents + + + alt + [Valider le transfert Prepare (succès)] + + + Persister l’état du transfert (avec transferState='RECEIVED-PREPARE') + + + 27 + Demander la persistance du transfert + Codes d’erreur : + 2003 + + fxTransfer + fxTransferParticipant + fxTransferStateChange + fxTransferExtension + + + 28 + Retour succès + + [Valider le transfert Prepare (échec)] + + + Persister l’état du transfert (avec transferState='INVALID') (introduction d’un nouveau statut INVALID pour marquer ces entrées) + + + 29 + Demander la persistance du transfert + (lorsque la validation payeur/bénéficiaire/condition crypto échoue) + Codes d’erreur : + 2003 + + fxTransfer + fxTransferParticipant + fxTransferStateChange + fxTransferExtension + fxTransferError + + + 30 + Retour succès + + + alt + [Valider le transfert Prepare (succès)] + + + Hydrater le message Prepare du transfert + + + 31 + Obtenir participant et devise pour le transfert FX (avec 'payload.determiningTransferId') + + + 32 + Demander participant et devise + + participant + participantCurrency + + + 33 + Retour participant et devise + + + 34 + Retour participant et devise + + + Message : + { + id: <transferMessage.commitRequestId> + from: <transferMessage.initiatingFsp>, + to: <transferMessage.counterPartyFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <hydratedTransferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: position, + action: fx_prepare, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 35 + Router et publier l’événement Position pour le payeur + Codes d’erreur : + 2003 + + [Valider le transfert Prepare (échec)] + + + Message : + { + id: <transferMessage.commitRequestId> + from: <ledgerName>, + to: <transferMessage.initiatingFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": <codes possibles : [2003, 3100, 3105, 3106, 3202, 3203, 3300, 3301]> + "errorDescription": "<voir la section 35.1.3 pour la description>", + "extensionList": <transferMessage.extensionList> + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: fx_prepare, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 36 + Publier l’événement de notification (échec) pour le payeur + Codes d’erreur : + 2003 + + diff --git a/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-prepare-1.1.2.a.plantuml b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-prepare-1.1.2.a.plantuml new file mode 100644 index 000000000..93905870d --- /dev/null +++ b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-prepare-1.1.2.a.plantuml @@ -0,0 +1,309 @@ +/'***** + License + -------------- + Copyright © 2020 Mojaloop Foundation + The Mojaloop files are made available by the Mojaloop Foundation under the Apache License, Version 2.0 + (the "License") and you may not use these files except in compliance with the [License](http://www.apache.org/licenses/LICENSE-2.0). + You may obtain a copy of the License at [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the [License](http://www.apache.org/licenses/LICENSE-2.0). + + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Steven Oderayi + -------------- + ******'/ + +@startuml position-handler-consume +title 1.1.2.a. Consommation du gestionnaire Position (message unique) + +autonumber + +collections "topic-transfer-position" as TOPIC_TRANSFER_POSITION +control "Gestionnaire d’événements Position" as POS_HANDLER +entity "DAO Position" as POS_DAO +entity "DAO Règlement" as SETTLEMENT_DAO +collections "Notification-Topic" as TOPIC_NOTIFICATIONS +entity "DAO Participant" as PARTICIPANT_DAO +database "Stockage central" as DB + +box "Service central" #LightYellow + participant TOPIC_TRANSFER_POSITION + participant POS_HANDLER + participant TOPIC_NOTIFICATIONS + participant POS_DAO + participant PARTICIPANT_DAO + participant SETTLEMENT_DAO + participant DB +end box + +activate POS_HANDLER +group Consommation du gestionnaire Position + note left of POS_HANDLER #lightgrey + L’événement est automatiquement répliqué + vers le topic des événements (topic-events) + end note + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consommer le message d’événement Position pour le payeur + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + + break + group Valider l’événement + POS_HANDLER <-> POS_HANDLER: Valider l’événement - Règle : type == 'position' && action == 'fx_prepare' + POS_HANDLER -> POS_HANDLER: Valider que 'payload.commitRequestId' ou 'message.value.content.uriParams.id' n’est pas vide\n**Code d’erreur :** 2003 + end + end + + alt Calculer et valider la position la plus récente (succès) + group Calculer la position et persister le changement + POS_HANDLER -> SETTLEMENT_DAO: Demander les modèles de règlement actifs + activate SETTLEMENT_DAO + SETTLEMENT_DAO -> DB: Récupérer les modèles de règlement actifs + activate DB + hnote over DB #lightyellow + settlementModel + end note + DB --> SETTLEMENT_DAO: Retour des modèles de règlement actifs + deactivate DB + SETTLEMENT_DAO --> POS_HANDLER: Retour des modèles de règlement actifs + deactivate SETTLEMENT_DAO + POS_HANDLER -> POS_HANDLER: Sélectionner la devise correspondante ou le modèle de règlement par défaut pour le type de compte grand livre POSITION\n**Code d’erreur :** 6000 + + POS_HANDLER -> PARTICIPANT_DAO: Demander le compte de position du participant payeur par nom et devise + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Récupérer le compte de position du participant payeur par nom et devise + activate DB + hnote over DB #lightyellow + participant + participantCurrency + end note + DB --> PARTICIPANT_DAO: Retour du compte de position du participant payeur par nom et devise + deactivate DB + PARTICIPANT_DAO --> POS_HANDLER: Retour du compte de position du participant payeur par nom et devise + deactivate PARTICIPANT_DAO + + POS_HANDLER -> DB: Récupérer l’état du transfert en base via 'commitRequestId' + activate DB + hnote over DB #lightyellow + fxTransferStateChange + end note + DB --> POS_HANDLER: Récupérer l’état du transfert en base + deactivate DB + DB --> POS_HANDLER: Retour de l’état du transfert + + POS_HANDLER -> PARTICIPANT_DAO: Demander les plafonds de position pour le participant payeur + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Demander les plafonds de position pour le participant payeur + activate DB + hnote over DB #lightyellow + participant + participantLimit + end note + DB --> PARTICIPANT_DAO: Retour des plafonds de position + deactivate DB + deactivate DB + PARTICIPANT_DAO --> POS_HANDLER: Retour des plafonds de position + deactivate PARTICIPANT_DAO + + alt Valider l’état du transfert (transferState='RECEIVED_PREPARE') + POS_HANDLER <-> POS_HANDLER: Mettre à jour l’état du transfert vers RESERVED + POS_HANDLER <-> POS_HANDLER: Calculer la position la plus récente pour la préparation + POS_HANDLER <-> POS_HANDLER: Valider la position la plus récente calculée (lpos) par rapport au plafond de débit net (netcap) - Règle : lpos < netcap + + POS_HANDLER -> POS_DAO: Demander la position du participant payeur pour la devise du transfert et la devise de règlement + activate POS_DAO + POS_DAO -> DB: Récupérer la position du participant payeur pour la devise du transfert et la devise de règlement + hnote over DB #lightyellow + participantPosiiton + end note + activate DB + deactivate DB + POS_DAO --> POS_HANDLER: Retour de la position du participant payeur pour la devise du transfert et la devise de règlement + deactivate POS_DAO + + POS_HANDLER <-> POS_HANDLER: Mettre à jour la position du participant (augmenter la position réservée du montant du transfert) + POS_HANDLER -> DB: Persister la position du participant payeur en base + activate DB + hnote over DB #lightyellow + participantPosition + end note + DB -> POS_HANDLER: Retour succès + deactivate DB + + POS_HANDLER -> PARTICIPANT_DAO: Demander la limite du participant payeur par devise + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Récupérer la limite du participant payeur par devise + activate DB + hnote over DB #lightyellow + participant + participantCurrency + participantLimit + end note + DB --> PARTICIPANT_DAO: Retour de la limite du participant payeur par devise + deactivate DB + PARTICIPANT_DAO --> POS_HANDLER: Retour de la limite du participant payeur par devise + deactivate PARTICIPANT_DAO + + POS_HANDLER <-> POS_HANDLER: Calculer la position disponible la plus récente selon la limite et la couverture de liquidité du payeur + + alt Valider les plafonds de position (succès) + POS_HANDLER <-> POS_HANDLER: Mettre à jour l’état du transfert vers RESERVED + POS_HANDLER -> DB: Mettre à jour la position du participant + activate DB + hnote over DB #lightyellow + participantPosition + end note + deactivate DB + + POS_HANDLER -> DB: Persister le changement d’état du transfert (RESERVED) en base + activate DB + hnote over DB #lightyellow + fxTransferStateChange + end note + deactivate DB + + POS_HANDLER -> DB: Insérer l’enregistrement de changement de position du participant + activate DB + hnote over DB #lightyellow + participantPositionChange + end note + deactivate DB + else Valider les plafonds de position (échec) + POS_HANDLER -> DB: Persister le changement d’état du transfert (ABORTED_REJECTED) en base, **Codes d’erreur :** 4001, 4200 + activate DB + hnote over DB #lightyellow + fxTransferStateChange + end note + deactivate DB + end + else transferState !='RECEIVED_PREPARE' + POS_HANDLER <-> POS_HANDLER: Mettre à jour l’état du transfert vers ABORTED_REJECTED + POS_HANDLER -> DB: Persister l’état de transfert abandonné + activate DB + hnote over DB #lightyellow + fxTransferStateChange + end note + deactivate DB + end + + alt L’état du transfert est RESERVED + note right of POS_HANDLER #yellow + Message : + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: transfer, + action: prepare, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + POS_HANDLER -> TOPIC_NOTIFICATIONS: Publier l’événement de notification vers le FXP + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + else + note right of POS_HANDLER #yellow + Message : + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": , + "errorDescription": "", + "extensionList": + } + } + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: prepare, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + POS_HANDLER -> TOPIC_NOTIFICATIONS: Publier l’événement de notification (échec) pour le payeur. **Code d’erreur :** 2001 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end + + end + else Calculer et valider la position la plus récente (échec) + note right of POS_HANDLER #yellow + Message : + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": , + "errorDescription": "", + "extensionList": + } + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: prepare, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + POS_HANDLER -> TOPIC_NOTIFICATIONS: Publier l’événement de notification (échec) pour le payeur **Codes d’erreur :** 4001, 4200 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + deactivate POS_HANDLER + end +end +deactivate POS_HANDLER +@enduml diff --git a/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-prepare-1.1.2.a.svg b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-prepare-1.1.2.a.svg new file mode 100644 index 000000000..9ef1053a0 --- /dev/null +++ b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-prepare-1.1.2.a.svg @@ -0,0 +1,478 @@ + + 1.1.2.a. Consommation du gestionnaire Position (message unique) + + + 1.1.2.a. Consommation du gestionnaire Position (message unique) + + Service central + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + topic-transfer-position + + + topic-transfer-position + Gestionnaire d’événements Position + + + Gestionnaire d’événements Position + + + + + Notification-Topic + + + Notification-Topic + DAO Position + + + DAO Position + + + DAO Participant + + + DAO Participant + + + DAO Règlement + + + DAO Règlement + + + Stockage central + + + Stockage central + + + + + + + + + + + + + + + + + + + + + + + + + + + Consommation du gestionnaire Position + + + L’événement est automatiquement répliqué + vers le topic des événements (topic-events) + + + 1 + Consommer le message d’événement Position pour le payeur + + + break + + + Valider l’événement + + + + + + 2 + Valider l’événement - Règle : type == 'position' && action == 'fx_prepare' + + + + + 3 + Valider que 'payload.commitRequestId' ou 'message.value.content.uriParams.id' n’est pas vide + Code d’erreur : + 2003 + + + alt + [Calculer et valider la position la plus récente (succès)] + + + Calculer la position et persister le changement + + + 4 + Demander les modèles de règlement actifs + + + 5 + Récupérer les modèles de règlement actifs + + settlementModel + + + 6 + Retour des modèles de règlement actifs + + + 7 + Retour des modèles de règlement actifs + + + + + 8 + Sélectionner la devise correspondante ou le modèle de règlement par défaut pour le type de compte grand livre POSITION + Code d’erreur : + 6000 + + + 9 + Demander le compte de position du participant payeur par nom et devise + + + 10 + Récupérer le compte de position du participant payeur par nom et devise + + participant + participantCurrency + + + 11 + Retour du compte de position du participant payeur par nom et devise + + + 12 + Retour du compte de position du participant payeur par nom et devise + + + 13 + Récupérer l’état du transfert en base via 'commitRequestId' + + fxTransferStateChange + + + 14 + Récupérer l’état du transfert en base + + + 15 + Retour de l’état du transfert + + + 16 + Demander les plafonds de position pour le participant payeur + + + 17 + Demander les plafonds de position pour le participant payeur + + participant + participantLimit + + + 18 + Retour des plafonds de position + + + 19 + Retour des plafonds de position + + + alt + [Valider l’état du transfert (transferState='RECEIVED_PREPARE')] + + + + + + 20 + Mettre à jour l’état du transfert vers RESERVED + + + + + + 21 + Calculer la position la plus récente pour la préparation + + + + + + 22 + Valider la position la plus récente calculée (lpos) par rapport au plafond de débit net (netcap) - Règle : lpos < netcap + + + 23 + Demander la position du participant payeur pour la devise du transfert et la devise de règlement + + + 24 + Récupérer la position du participant payeur pour la devise du transfert et la devise de règlement + + participantPosiiton + + + 25 + Retour de la position du participant payeur pour la devise du transfert et la devise de règlement + + + + + + 26 + Mettre à jour la position du participant (augmenter la position réservée du montant du transfert) + + + 27 + Persister la position du participant payeur en base + + participantPosition + + + 28 + Retour succès + + + 29 + Demander la limite du participant payeur par devise + + + 30 + Récupérer la limite du participant payeur par devise + + participant + participantCurrency + participantLimit + + + 31 + Retour de la limite du participant payeur par devise + + + 32 + Retour de la limite du participant payeur par devise + + + + + + 33 + Calculer la position disponible la plus récente selon la limite et la couverture de liquidité du payeur + + + alt + [Valider les plafonds de position (succès)] + + + + + + 34 + Mettre à jour l’état du transfert vers RESERVED + + + 35 + Mettre à jour la position du participant + + participantPosition + + + 36 + Persister le changement d’état du transfert (RESERVED) en base + + fxTransferStateChange + + + 37 + Insérer l’enregistrement de changement de position du participant + + participantPositionChange + + [Valider les plafonds de position (échec)] + + + 38 + Persister le changement d’état du transfert (ABORTED_REJECTED) en base, + Codes d’erreur : + 4001, 4200 + + fxTransferStateChange + + [transferState !='RECEIVED_PREPARE'] + + + + + + 39 + Mettre à jour l’état du transfert vers ABORTED_REJECTED + + + 40 + Persister l’état de transfert abandonné + + fxTransferStateChange + + + alt + [L’état du transfert est RESERVED] + + + Message : + { + id: <transferMessage.commitRequestId> + from: <transferMessage.initiatingFsp>, + to: <transferMessage.counterPartyFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: transfer, + action: prepare, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 41 + Publier l’événement de notification vers le FXP + + + + Message : + { + id: <transferMessage.commitRequestId> + from: <switch>, + to: <transferMessage.initiatingFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": <code d’erreur>, + "errorDescription": "<description de l’erreur>", + "extensionList": <transferMessage.extensionList> + } + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: prepare, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 42 + Publier l’événement de notification (échec) pour le payeur. + Code d’erreur : + 2001 + + [Calculer et valider la position la plus récente (échec)] + + + Message : + { + id: <transferMessage.transferId> + from: <ledgerName>, + to: <transferMessage.payerFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": <code d’erreur>, + "errorDescription": "<description de l’erreur>", + "extensionList": <transferMessage.extensionList> + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: prepare, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 43 + Publier l’événement de notification (échec) pour le payeur + Codes d’erreur : + 4001, 4200 + + diff --git a/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-reject-2.2.0.a.plantuml b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-reject-2.2.0.a.plantuml new file mode 100644 index 000000000..4942eb30f --- /dev/null +++ b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-reject-2.2.0.a.plantuml @@ -0,0 +1,164 @@ +/'***** + License + -------------- + Copyright © 2020 Mojaloop Foundation + The Mojaloop files are made available by the Mojaloop Foundation under the Apache License, Version 2.0 + (the "License") and you may not use these files except in compliance with the [License](http://www.apache.org/licenses/LICENSE-2.0). + You may obtain a copy of the License at [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the [License](http://www.apache.org/licenses/LICENSE-2.0). + + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Steven Oderayi + -------------- +******'/ + +@startuml fx-conversion-abort-request + +title 2.2.0.a. FXP1 envoie un appel PUT sur le point de terminaison /error pour une demande de conversion FX + +autonumber + +actor "DFSP1\nPayeur" as DFSP1 +control "FXP1\nFXP" as FXP1 +boundary "Adaptateur ML API" as MLAPI +control "Gestionnaire d’événements de notification ML API" as NOTIFY_HANDLER +boundary "API du service central" as CSAPI +collections "transfer-fulfil-topic" as TOPIC_FULFIL +control "Gestionnaire d’événements Fulfil" as FULF_HANDLER +collections "topic-transfer-position" as TOPIC_TRANSFER_POSITION +control "Gestionnaire d’événements Position" as POS_HANDLER +collections "Notification-Topic" as TOPIC_NOTIFICATIONS + +box "Fournisseurs de services financiers" #lightGray + participant DFSP1 + participant FXP1 +end box + +box "Service adaptateur ML API" #LightBlue + participant MLAPI + participant NOTIFY_HANDLER +end box + +box "Service central" #LightYellow + participant CSAPI + participant TOPIC_FULFIL + participant FULF_HANDLER + participant TOPIC_TRANSFER_POSITION + participant POS_HANDLER + participant TOPIC_NOTIFICATIONS +end box + +activate NOTIFY_HANDLER +activate FULF_HANDLER +activate POS_HANDLER +group FXP1 signale une erreur pour la demande de conversion FX + FXP1 <-> FXP1: Lors du traitement d’une requête entrante\nPOST /fxTransfers, une erreur de\ntraitement s’est produite et un rappel d’erreur (Error callback) est effectué + note right of FXP1 #yellow + En-têtes - transferHeaders: { + Content-Length: , + Content-Type: , + Date: , + X-Forwarded-For: , + FSPIOP-Source: , + FSPIOP-Destination: , + FSPIOP-Encryption: , + FSPIOP-Signature: , + FSPIOP-URI: , + FSPIOP-HTTP-Method: + } + + Charge utile - errorMessage: + { + errorInformation + { + "errorCode": , + "errorDescription": + "extensionList": { + "extension": [ + { + "key": , + "value": + } + ] + } + } + } + end note + FXP1 ->> MLAPI: PUT - /fxTransfers//error + activate MLAPI + MLAPI -> MLAPI: Validation de schéma + alt Échec de la validation de schéma + MLAPI -> FXP1: Réponse HTTP - 400 (Bad Request) + end + MLAPI -> MLAPI: Valider le message entrant (p. ex. le code d’erreur est valide)\n**Codes d’erreur :** 3100 + note right of MLAPI #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + type: fulfil, + action: fx_abort, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + MLAPI -> TOPIC_FULFIL: Router et publier l’événement Abort/Reject pour le FXP\nCode d’erreur : 2001 + activate TOPIC_FULFIL + TOPIC_FULFIL <-> TOPIC_FULFIL: Vérifier que l’événement est répliqué selon la configuration (ACKS=all)\nCode d’erreur : 2001 + TOPIC_FULFIL --> MLAPI: Répondre que les accusés de réplication ont été reçus + deactivate TOPIC_FULFIL + MLAPI -->> FXP1: Réponse HTTP - 200 (OK) + deactivate MLAPI + TOPIC_FULFIL <- FULF_HANDLER: Consommer le message + ref over TOPIC_FULFIL, TOPIC_TRANSFER_POSITION: Consommation du gestionnaire Fulfil (Reject/Abort)\n + FULF_HANDLER -> TOPIC_TRANSFER_POSITION: Produire un message + ||| + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consommer le message + ref over TOPIC_TRANSFER_POSITION, TOPIC_NOTIFICATIONS: Consommation du gestionnaire Position (Abort)\n + POS_HANDLER -> TOPIC_NOTIFICATIONS: Produire un message + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consommer le message + opt action == 'fx_abort' + ||| + ref over DFSP1, TOPIC_NOTIFICATIONS: Envoi de notification au participant (payeur)\n + NOTIFY_HANDLER -> DFSP1: Envoyer la notification de rappel (callback) + end + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consommer le message + opt action == 'fx_abort' + ||| + ref over FXP1, TOPIC_NOTIFICATIONS: Envoi de notification au participant (FXP)\n + NOTIFY_HANDLER -> FXP1: Envoyer la notification de rappel (callback) + end + ||| +end +deactivate POS_HANDLER +deactivate FULF_HANDLER +deactivate NOTIFY_HANDLER +@enduml diff --git a/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-reject-2.2.0.a.svg b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-reject-2.2.0.a.svg new file mode 100644 index 000000000..d46b7b728 --- /dev/null +++ b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-fx-reject-2.2.0.a.svg @@ -0,0 +1,280 @@ + + 2.2.0.a. FXP1 envoie un appel PUT sur le point de terminaison /error pour une demande de conversion FX + + + 2.2.0.a. FXP1 envoie un appel PUT sur le point de terminaison /error pour une demande de conversion FX + + Fournisseurs de services financiers + + Service adaptateur ML API + + Service central + + + + + + + + + + + + + + + + + + + + DFSP1 + Payeur + + + DFSP1 + Payeur + + + FXP1 + FXP + + + FXP1 + FXP + + + Adaptateur ML API + + + Adaptateur ML API + + + Gestionnaire d’événements de notification ML API + + + Gestionnaire d’événements de notification ML API + + + API du service central + + + API du service central + + + + + transfer-fulfil-topic + + + transfer-fulfil-topic + Gestionnaire d’événements Fulfil + + + Gestionnaire d’événements Fulfil + + + + + topic-transfer-position + + + topic-transfer-position + Gestionnaire d’événements Position + + + Gestionnaire d’événements Position + + + + + Notification-Topic + + + Notification-Topic + + + + + + + + FXP1 signale une erreur pour la demande de conversion FX + + + + + + 1 + Lors du traitement d’une requête entrante + POST /fxTransfers, une erreur de + traitement s’est produite et un rappel d’erreur (Error callback) est effectué + + + En-têtes - transferHeaders: { + Content-Length: <Content-Length>, + Content-Type: <Content-Type>, + Date: <Date>, + X-Forwarded-For: <X-Forwarded-For>, + FSPIOP-Source: <FSPIOP-Source>, + FSPIOP-Destination: <FSPIOP-Destination>, + FSPIOP-Encryption: <FSPIOP-Encryption>, + FSPIOP-Signature: <FSPIOP-Signature>, + FSPIOP-URI: <FSPIOP-URI>, + FSPIOP-HTTP-Method: <FSPIOP-HTTP-Method> + } +   + Charge utile - errorMessage: + { + errorInformation + { + "errorCode": <errorCode>, + "errorDescription": <errorDescription> + "extensionList": { + "extension": [ + { + "key": <string>, + "value": <string> + } + ] + } + } + } + + + + 2 + PUT - /fxTransfers/<ID>/error + + + + + 3 + Validation de schéma + + + alt + [Échec de la validation de schéma] + + + 4 + Réponse HTTP - 400 (Bad Request) + + + + + 5 + Valider le message entrant (p. ex. le code d’erreur est valide) + Codes d’erreur : + 3100 + + + Message : + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <errorMessage> + }, + metadata: { + event: { + id: <uuid>, + type: fulfil, + action: fx_abort, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 6 + Router et publier l’événement Abort/Reject pour le FXP + Code d’erreur : + 2001 + + + + + + 7 + Vérifier que l’événement est répliqué selon la configuration (ACKS=all) + Code d’erreur : + 2001 + + + 8 + Répondre que les accusés de réplication ont été reçus + + + + 9 + Réponse HTTP - 200 (OK) + + + 10 + Consommer le message + + + ref + Consommation du gestionnaire Fulfil (Reject/Abort) +   + + + 11 + Produire un message + + + 12 + Consommer le message + + + ref + Consommation du gestionnaire Position (Abort) +   + + + 13 + Produire un message + + + 14 + Consommer le message + + + opt + [action == 'fx_abort'] + + + ref + Envoi de notification au participant (payeur) +   + + + 15 + Envoyer la notification de rappel (callback) + + + 16 + Consommer le message + + + opt + [action == 'fx_abort'] + + + ref + Envoi de notification au participant (FXP) +   + + + 17 + Envoyer la notification de rappel (callback) + + diff --git a/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-prepare-1.1.4.a-v2.0.plantuml b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-prepare-1.1.4.a-v2.0.plantuml new file mode 100644 index 000000000..12707c6b1 --- /dev/null +++ b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-prepare-1.1.4.a-v2.0.plantuml @@ -0,0 +1,99 @@ +/'***** + License + -------------- + Copyright © 2020 Mojaloop Foundation + The Mojaloop files are made available by the Mojaloop Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Mojaloop Foundation for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + + * Steven Oderayi + -------------- + ******'/ + +@startuml send-notification-to-participant-single-message-v2_0 +title 1.1.4.a. Envoi de notification au participant (Payeur / Bénéficiaire / FXP) (message unique) v2.0 + +autonumber + +actor "DFSP payeur\nParticipant" as PAYER_DFSP +actor "DFSP bénéficiaire / FXP\nParticipant" as PAYEE_DFSP_OR_FXP +control "Gestionnaire d’événements de notification ML API" as NOTIFY_HANDLER +boundary "API du service central" as CSAPI +collections "Notification-Topic" as TOPIC_NOTIFICATIONS +entity "DAO Participant" as PARTICIPANT_DAO +database "Stockage central" as DB + +box "Fournisseur de services financiers (payeur)" #lightGray + participant PAYER_DFSP +end box + +box "Service adaptateur ML API" #LightBlue + participant NOTIFY_HANDLER +end box + +box "Service central" #LightYellow + participant TOPIC_NOTIFICATIONS + participant CSAPI + participant PARTICIPANT_DAO + participant DB +end box + +box "Fournisseur de services financiers (bénéficiaire ou FXP)" #lightGray + participant PAYEE_DFSP_OR_FXP +end box + +activate NOTIFY_HANDLER +group Envoi de notification aux participants + note left of NOTIFY_HANDLER #lightgray + L’événement est automatiquement répliqué + vers le topic des événements (topic-events) + end note + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consommer l’événement de notification + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + + note right of NOTIFY_HANDLER #lightgray + Les détails du point de terminaison sont mis en cache ; à l’expiration du cache, + les détails sont récupérés à nouveau + end note + NOTIFY_HANDLER -> CSAPI: Demander les détails du point de terminaison pour le participant - GET - /participants/{{fsp}}/endpoints\nCode d’erreur : 2003 + + activate CSAPI + CSAPI -> PARTICIPANT_DAO: Récupérer les détails du point de terminaison pour le participant\nCode d’erreur : 2003 + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Récupérer les détails du point de terminaison pour le participant + activate DB + hnote over DB #lightyellow + participantEndpoint + end note + DB -> PARTICIPANT_DAO: Détails du point de terminaison récupérés pour le participant + deactivate DB + PARTICIPANT_DAO --> CSAPI: Retour des détails du point de terminaison pour le participant + deactivate PARTICIPANT_DAO + CSAPI --> NOTIFY_HANDLER: Retour des détails du point de terminaison pour le participant\nCodes d’erreur : 3202, 3203 + deactivate CSAPI + NOTIFY_HANDLER -> PAYER_DFSP: Notification avec le résultat prepare/fulfil ou l’erreur vers\nle DFSP payeur sur le point de terminaison indiqué - PUT \nCode d’erreur : 1001 + NOTIFY_HANDLER <-- PAYER_DFSP: HTTP 200 OK + alt event.action === 'reserve' + alt event.status === 'success' + NOTIFY_HANDLER -> PAYEE_DFSP_OR_FXP: Notification du résultat d’exécution réussi (engagé) vers le DFSP bénéficiaire / FXP sur le point de terminaison indiqué - PATCH \nCode d’erreur : 1001 + ||| + NOTIFY_HANDLER <-- PAYEE_DFSP_OR_FXP: HTTP 200 OK + end + end +end +deactivate NOTIFY_HANDLER +@enduml diff --git a/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-prepare-1.1.4.a-v2.0.svg b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-prepare-1.1.4.a-v2.0.svg new file mode 100644 index 000000000..7c038e501 --- /dev/null +++ b/docs/fr/technical/central-fx-transfers/assets/diagrams/sequence/seq-prepare-1.1.4.a-v2.0.svg @@ -0,0 +1,157 @@ + + 1.1.4.a. Envoi de notification au participant (Payeur / Bénéficiaire / FXP) (message unique) v2.0 + + + 1.1.4.a. Envoi de notification au participant (Payeur / Bénéficiaire / FXP) (message unique) v2.0 + + Fournisseur de services financiers (payeur) + + Service adaptateur ML API + + Service central + + Fournisseur de services financiers (bénéficiaire ou FXP) + + + + + + + + + + + + + + + + DFSP payeur + Participant + + + DFSP payeur + Participant + + + Gestionnaire d’événements de notification ML API + + + Gestionnaire d’événements de notification ML API + + + + + Notification-Topic + + + Notification-Topic + API du service central + + + API du service central + + + DAO Participant + + + DAO Participant + + + Stockage central + + + Stockage central + + + DFSP bénéficiaire / FXP + Participant + + + DFSP bénéficiaire / FXP + Participant + + + + + + + + + + Envoi de notification aux participants + + + L’événement est automatiquement répliqué + vers le topic des événements (topic-events) + + + 1 + Consommer l’événement de notification + + + Les détails du point de terminaison sont mis en cache ; à l’expiration du cache, + les détails sont récupérés à nouveau + + + 2 + Demander les détails du point de terminaison pour le participant - GET - /participants/{{fsp}}/endpoints + Code d’erreur : + 2003 + + + 3 + Récupérer les détails du point de terminaison pour le participant + Code d’erreur : + 2003 + + + 4 + Récupérer les détails du point de terminaison pour le participant + + participantEndpoint + + + 5 + Détails du point de terminaison récupérés pour le participant + + + 6 + Retour des détails du point de terminaison pour le participant + + + 7 + Retour des détails du point de terminaison pour le participant + Codes d’erreur : + 3202, 3203 + + + 8 + Notification avec le résultat prepare/fulfil ou l’erreur vers + le DFSP payeur sur le point de terminaison indiqué - PUT + Code d’erreur : + 1001 + + + 9 + HTTP 200 OK + + + alt + [event.action === 'reserve'] + + + alt + [event.status === 'success'] + + + 10 + Notification du résultat d’exécution réussi (engagé) vers le DFSP bénéficiaire / FXP sur le point de terminaison indiqué - PATCH + Code d’erreur : + 1001 + + + 11 + HTTP 200 OK + + diff --git a/docs/fr/technical/central-fx-transfers/transfers/1.1.0-fx-prepare-transfer-request.md b/docs/fr/technical/central-fx-transfers/transfers/1.1.0-fx-prepare-transfer-request.md new file mode 100644 index 000000000..0ace66041 --- /dev/null +++ b/docs/fr/technical/central-fx-transfers/transfers/1.1.0-fx-prepare-transfer-request.md @@ -0,0 +1,13 @@ +# Demande de préparation de transfert FX + +Diagramme de conception de séquence pour le processus de demande de préparation de transfert FX. + +## Références dans le diagramme de séquence + +* [Consommation par le gestionnaire Prepare FX (1.1.1.a)](1.1.1.a-fx-prepare-handler-consume.md) +* [Consommation par le gestionnaire Position FX (1.1.2.a)](1.1.2.a-fx-position-handler-consume.md) +* [Envoi de notification au participant (1.1.4.a)](1.1.4.a-send-notification-to-participant-v2.0.md) + +## Diagramme de séquence + +![seq-fx-prepare-1.1.0.svg](../assets/diagrams/sequence/seq-fx-prepare-1.1.0.svg) diff --git a/docs/fr/technical/central-fx-transfers/transfers/1.1.1.a-fx-prepare-handler-consume.md b/docs/fr/technical/central-fx-transfers/transfers/1.1.1.a-fx-prepare-handler-consume.md new file mode 100644 index 000000000..f0d365a9d --- /dev/null +++ b/docs/fr/technical/central-fx-transfers/transfers/1.1.1.a-fx-prepare-handler-consume.md @@ -0,0 +1,7 @@ +# Consommation par le gestionnaire Prepare FX + +Diagramme de conception de séquence pour le processus de consommation par le gestionnaire Prepare FX. + +## Diagramme de séquence + +![seq-fx-prepare-1.1.1.a.svg](../assets/diagrams/sequence/seq-fx-prepare-1.1.1.a.svg) diff --git a/docs/fr/technical/central-fx-transfers/transfers/1.1.2.a-fx-position-handler-consume.md b/docs/fr/technical/central-fx-transfers/transfers/1.1.2.a-fx-position-handler-consume.md new file mode 100644 index 000000000..c52c30b2f --- /dev/null +++ b/docs/fr/technical/central-fx-transfers/transfers/1.1.2.a-fx-position-handler-consume.md @@ -0,0 +1,7 @@ +# Consommation par le gestionnaire Position FX + +Diagramme de conception de séquence pour le processus de consommation par le gestionnaire Position FX. + +## Diagramme de séquence + +![seq-fx-prepare-1.1.2.a.svg](../assets/diagrams/sequence/seq-fx-prepare-1.1.2.a.svg) diff --git a/docs/fr/technical/central-fx-transfers/transfers/1.1.4.a-send-notification-to-participant-v2.0.md b/docs/fr/technical/central-fx-transfers/transfers/1.1.4.a-send-notification-to-participant-v2.0.md new file mode 100644 index 000000000..c85fb3c4f --- /dev/null +++ b/docs/fr/technical/central-fx-transfers/transfers/1.1.4.a-send-notification-to-participant-v2.0.md @@ -0,0 +1,7 @@ +# Envoi de notification au participant v2.0 + +Diagramme de conception de séquence pour la demande d’envoi de notification au participant. + +## Diagramme de séquence + +![seq-prepare-1.1.4.a-v2.0.svg](../assets/diagrams/sequence/seq-prepare-1.1.4.a-v2.0.svg) diff --git a/docs/fr/technical/central-fx-transfers/transfers/2.1.0-fx-fulfil-transfer-request.md b/docs/fr/technical/central-fx-transfers/transfers/2.1.0-fx-fulfil-transfer-request.md new file mode 100644 index 000000000..ccb34fed7 --- /dev/null +++ b/docs/fr/technical/central-fx-transfers/transfers/2.1.0-fx-fulfil-transfer-request.md @@ -0,0 +1,13 @@ +# Demande d’exécution de transfert réussie (fulfil) + +Diagramme de conception de séquence pour la demande d’exécution de transfert en succès. + +## Références dans le diagramme de séquence + + +* [Envoi de notification au participant (1.1.4.a)](1.1.4.a-send-notification-to-participant-v2.0.md) + +## Diagramme de séquence + +![seq-fx-fulfil-2.1.0.svg](../assets/diagrams/sequence/seq-fx-fulfil-2.1.0.svg) diff --git a/docs/fr/technical/central-fx-transfers/transfers/2.2.0-fx-fulfil-reject-transfer.md b/docs/fr/technical/central-fx-transfers/transfers/2.2.0-fx-fulfil-reject-transfer.md new file mode 100644 index 000000000..92bbd1630 --- /dev/null +++ b/docs/fr/technical/central-fx-transfers/transfers/2.2.0-fx-fulfil-reject-transfer.md @@ -0,0 +1,7 @@ +# Le FXP envoie une demande d’abandon d’exécution (fulfil abort) pour un transfert FX + +Diagramme de conception de séquence pour le processus de rejet d’exécution de transfert FX (fulfil reject). + +## Diagramme de séquence + +![seq-fx-reject-2.2.0.a.svg](../assets/diagrams/sequence/seq-fx-reject-2.2.0.a.svg) diff --git a/docs/fr/technical/central-fx-transfers/transfers/README.md b/docs/fr/technical/central-fx-transfers/transfers/README.md new file mode 100644 index 000000000..66ecb788b --- /dev/null +++ b/docs/fr/technical/central-fx-transfers/transfers/README.md @@ -0,0 +1,8 @@ +# Opérations de transfert FX Mojaloop + +Processus opérationnels essentiels pour activer les transferts FX : + +- Processus de préparation FX (Prepare) +- Processus d’exécution FX (Fulfil) +- Processus de notifications +- Processus de rejet / abandon FX (Reject/Abort) diff --git a/docs/fr/technical/faqs.md b/docs/fr/technical/faqs.md new file mode 100644 index 000000000..41926c5e6 --- /dev/null +++ b/docs/fr/technical/faqs.md @@ -0,0 +1,156 @@ +# Foire Aux Questions + +Ce document contient certaines des questions techniques fréquemment posées par la communauté. + +## 1. Qu'est-ce qui est supporté ? + +Actuellement, les composants du Central Ledger sont pris en charge par l'équipe. Les composants DFSP sont obsolètes, ce qui rend l'installation de l'environnement de bout en bout et la configuration complète difficile. + +### 2. Pouvons-nous nous connecter directement à Pathfinder dans un environnement de développement ? + +Pour les environnements locaux et de test, nous recommandons d'utiliser plutôt le service 'mock-pathfinder'. Pathfinder est un service payant à l'utilisation. + +Accédez au dépôt https://github.com/mojaloop/mock-pathfinder pour télécharger et installer mock-pathfinder. Exécutez la commande `npm install` dans le dossier mock-pathfinder pour installer les dépendances, puis mettez à jour `Database_URI` dans `mock-pathfinder/src/lib/config.js`. + +### 3. Dois-je enregistrer un DFSP via l'URL http://central-directory/commands/register ou dois-je mettre à jour la configuration dans default.json ? + +Vous devez vous enregistrer en utilisant l'API fournie, en utilisant Postman ou curl. Le client utilise le code LevelOne. Il est nécessaire d'implémenter la version actuelle de Mojaloop avec les scripts Postman actuels. + +### 4. Le pod pi3-kafka-0 est toujours en état CrashLoopBackOff ? + +- Plus d'informations concernant la question : + + Lorsque j'ai essayé d'obtenir les logs du conteneur centralledger-handler-admin-transfer, j'obtiens l'erreur suivante : + `Error from server (BadRequest): container "centralledger-handler-admin-transfer" in pod "pi3-centralledger-handler-admin-transfer-6787b6dc8d-x68q9" is waiting to start: PodInitializing` + Et le statut du pod pi3-kafka-0 reste sur CrashLoopBackOff. + J'utilise un VPS sous Ubuntu 16.04 avec 12 Go de RAM, 2 vCores, 2,4 GHz, 50 Go d'espace disque chez OVH pour le déploiement. + +L'augmentation de la RAM à 24 Go et du CPU à 4 a résolu les problèmes. Il semble que ce soit un timeout de Zookeeper dû à l'épuisement des ressources disponibles, ce qui entraîne l'arrêt des services. + +### 5. Pourquoi ai-je une erreur lorsque je tente de créer un nouveau DFSP via Admin ? + +Assurez-vous d'utiliser les scripts Postman les plus récents disponibles sur le dépôt https://github.com/mojaloop/mock-pathfinder. + +### 6. Puis-je répartir les composants Mojaloop sur différentes machines physiques et VM ? + +Vous devriez pouvoir configurer Mojaloop sur différentes VM ou machines physiques. La répartition dépend entièrement de vos besoins et sera spécifique à votre implémentation. Nous utilisons Kubernetes pour l'orchestration des conteneurs. Cela permet de planifier les déploiements via le runtime Kubernetes sur des machines spécifiques si nécessaire, et de demander des ressources spécifiques si besoin. Les Helm charts du dépôt Helm peuvent servir de ligne directrice sur la meilleure manière d'allouer et de regrouper les composants dans votre déploiement. Naturellement, vous devrez mettre à jour les configurations pour compléter votre implémentation personnalisée. + +### 7. Peut-on s’attendre à ce que tous les endpoints définis dans la documentation API soient implémentés dans Mojaloop ? + +L'API de la spécification Mojaloop pour les transferts et l'implémentation Mojaloop Open Source Switch sont des flux indépendants, bien que l'implémentation repose évidemment sur la spécification. En fonction des cas d'utilisation prioritaires, les endpoints nécessaires sont implémentés. Si certains endpoints ne sont pas prioritaires, il se peut qu'ils ne soient pas disponibles. Cependant, l'objectif est de prendre en charge tous les endpoints spécifiés, même si cela prendra du temps. Nous avons quelques-uns de ces endpoints dans le dépôt ‘postman’ de l’organisation Github mojaloop. + +### 8. Mojaloop stocke-t-il les informations de quote/statut du FSP initiateur de paiement ? + +Pour le moment, l’implémentation Switch open source Mojaloop ne stocke *pas* les informations liées aux Quotes. C’est au payeur et au bénéficiaire impliqués dans le processus de stocker les informations pertinentes. + +### 9. Mojaloop gère-t-il la validation des workflows ? + +Pas pour le moment, mais cela pourrait arriver à l’avenir. Concernant la corrélation des requêtes associées à un transfert spécifique, vous pouvez consulter l’endpoint ‘transaction’ dans la spécification pour plus d’informations. De plus, il y a un travail en cours concernant la spécification afin de rendre cette corrélation plus simple et directe, c’est-à-dire pour faire correspondre les requêtes de quote et de transfert relevant d’une seule transaction. + +### 10. Comment enregistrer un nouveau participant dans Mojaloop ? + +Il n'y a pas de méthode POST sur la ressource /parties, comme spécifié dans la section 6.1.1 de la définition de l’API. Veuillez vous référer à la section 6.2.2.3 : `POST /participants//` dans la définition de l’API. + +"_La requête HTTP `POST /participants//` (ou `POST /participants///`) est utilisée pour créer des informations sur le serveur concernant l'identité fournie, définie par ``, ``, et éventuellement `` (par exemple : POST_ + _/participants/MSISDN/123456789 ou POST /participants/BUSINESS/shoecompany/employee1). Voir Section 5.1.6.11 pour plus d’informations sur l’adressage d’un Participant._" + +### 11. Le participant représente-t-il un compte client dans une banque ? + +Pour plus d'informations, consultez ce document (section 3..2) : https://github.com/mojaloop/mojaloop-specification/blob/develop/Generic%20Transaction%20Patterns.pdf. + +"_Dans l’API, un Participant est identique à un FSP qui participe à un schéma d’interopérabilité. L'objectif principal de la ressource logique Participants API est de permettre aux FSPs de savoir dans quel autre FSP se trouve une contrepartie impliquée dans une transaction financière interopérable. Il existe également des services permettant aux FSPs de fournir des informations à un système commun._" + +En résumé, un participant est tout FSP participant au schéma (généralement pas un client). Pour la recherche de comptes, un service d’annuaire tel que *Pathfinder* peut être utilisé, qui fournit la recherche utilisateur et le mapping. Si un tel service n'est pas fourni, une alternative est proposée dans la spécification, où le Switch héberge un Account Lookup Service (ALS) auquel les participants doivent enregistrer les parties. J'ai déjà abordé ce point. À noter que le Switch ne stocke pas les détails, uniquement la correspondance entre un ID et un FSP, puis les appels pour résoudre le participant sont envoyés à ce FSP. + +https://github.com/mojaloop/mojaloop-specification CORE RELATED (Mojaloop): + +Ce dépôt contient l’ensemble des documents de spécification de l’API ouverte pour l'interopérabilité FSP - mojaloop/mojaloop-specification. + +### 12. Comment enregistrer un bénéficiaire _de confiance_ pour un payeur, afin d’éviter l’OTP ? + +Pour éviter l’OTP, la demande initiale sur /transactionRequests du bénéficiaire peut être approuvée de manière programmatique (ou manuelle) sans recourir à l’endpoint /authorizations (qui est utilisé pour l’approbation OTP). En effet, c’est au FSP de gérer cela, le Switch ne le fait pas. Ceci est brièvement évoqué dans la section 6.4 de la spécification. + +### 13. 404 lors de l’accès ou du chargement du fichier kubernetes-dashboard.yaml ? + +Depuis le dépôt officiel Github Kubernetes dans le README.md, le lien le plus récent à utiliser est : "https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml". Vérifiez toujours les liens tiers avant de les utiliser. Les applications open source évoluent constamment. + +### 14. Lors de l'installation de nginx-ingress pour le load-balancing et l’accès externe - Erreur : no available release name found ? + +Merci de consulter la documentation traitant d’un problème similaire. En résumé - il s'agit très probablement d'un problème RBAC. Consultez la documentation pour mettre en place Tiller avec RBAC. https://docs.helm.sh/using_helm/#role-based-access-control détaille ce point. Voir l’issue enregistrée : helm/helm#3839. + +### 15. Erreur "ImportError: librdkafka.so.1: cannot open shared object file: No such file or directory" lors du lancement de `npm start`. + +Une solution a été trouvée ici : https://github.com/confluentinc/confluent-kafka-python/issues/65#issuecomment-269964346 +GitHub +ImportError: librdkafka.so.1: cannot open shared object file: No such file or directory · Issue #65 · confluentinc/confluent-kafka-python +Ubuntu 14 ici, pip==7.1.2, setuptools==18.3.2, virtualenv==13.1.2. Pour commencer, je souhaite compiler la dernière version stable (semble être 0.9.2) de librdkafka dans /opt/librdkafka. curl https://codeload.github.com/ede... + +Voici les étapes pour recompiler librdkafka : + +git clone https://github.com/edenhill/librdkafka && cd librdkafka && git checkout `` + +cd librdkafka && ./configure && make && make install && ldconfig + +Après cela, je peux importer sans spécifier LD_LIBRARY_PATH. +GitHub +edenhill/librdkafka +La bibliothèque Apache Kafka C/C++. Contribuez au développement de edenhill/librdkafka sur GitHub. + +### 16. Peut-on utiliser mojaloop comme logiciel open source de portefeuille mobile ou mojaloop ne fait que l’interopérabilité ? + +Nous pouvons utiliser mojaloop pour l’interopérabilité afin de prendre en charge les portefeuilles mobiles et autres transferts d'argent. Ce n’est pas un logiciel pour un DFSP (il existe d’autres projets open source pour cela, comme Finserv etc.). Mojaloop est principalement destiné à un Hub/Switch et à une API que le DFSP doit implémenter. Mais ce n’est pas fait pour gérer des portefeuilles mobiles en tant que tel. + +### 17. Décrivez les entreprises qui aident à déployer & supporter mojaloop ? + +Mojaloop est un logiciel et une spécification open source. + +### 18. Pouvez-vous dire quelque chose sur mojaloop & la sécurité ? + +La spécification est assez standard et dispose de bonnes normes de sécurité. Mais celles-ci doivent être mises en œuvre par les adopteurs et les déployeurs. En plus de cela, les mesures de sécurité doivent être complétées par d’autres mesures de sécurité opérationnelle et de déploiement. De plus, les prochains mois seront axés sur la sécurité dans la communauté open source. + +### 19. Quels sont les avantages d'utiliser mojaloop comme plateforme d’interopérabilité ? + +Avantages : Actuellement, par exemple, un utilisateur Airtel mobile money peut seulement transférer vers un autre utilisateur Airtel mobile money. Avec ce système, il/elle peut transférer vers tout fournisseur de services financiers, tel qu'un autre fournisseur de mobile money ou tout autre compte bancaire ou commerçant connecté au Hub, quelle que soit leur implémentation. Ils doivent simplement être connectés au même Switch. De plus, il est conçu pour fonctionner sur des téléphones basiques afin que tout le monde puisse l’utiliser. + +### 20. Quels sont les principaux défis pour les entreprises utilisant mojaloop ? + +Pour l’instant, les principaux défis concernent les attentes. Les attentes des adopteurs de mojaloop et ce qu'est réellement mojaloop. Beaucoup d’adopteurs ont une compréhension différente de ce qu’est mojaloop et de ses capacités. S'ils ont la bonne compréhension, de nombreux défis actuels sont atténués. +Oui, le journal d’audit (forensic logging) est également une mesure de sécurité à des fins d’audit, qui garantit qu’il existe des traces vérifiables des actions et que toute action notable est enregistrée et sécurisée après un chiffrement à plusieurs niveaux. + +### 21. Le forensic logging/l’audit dans mojaloop est-il lié à la sécurisation de la plateforme d’interopérabilité ? + +Cela garantit également que tous les services exécutent toujours le code qu'ils sont censés exécuter, et que tout comportement anormal/indésirable est arrêté dès le démarrage. Pour le reporting et les auditeurs, cela permet de suivre les actions via un audit-log. + +### 22. Comment les fournisseurs de services financiers se connectent-ils à mojaloop ? + +Il existe un schéma architectural qui donne une bonne vue de l’intégration entre les différentes entités. https://github.com/mojaloop/docs/blob/master/Diagrams/ArchitectureDiagrams/Arch-Flows.svg. + +### 23. Existe-t-il un convertisseur/connecteur open source ISO8583-OpenAPI ? + +Je ne pense pas qu’il existe actuellement une intégration générique ISO8583 `<-> Mojaloop. Nous travaillons sur certaines intégrations « canal de paiement traditionnel » vers Mojaloop (POS et GAB) que nous espérons présenter lors de la prochaine conférence. Celles-ci pourraient constituer la base d'une intégration ISO8583 à ajouter à la pile OSS, mais gardez à l'esprit que ces intégrations seront très spécifiques à l'usage. + +### 24. Comment connaître les endpoints à configurer dans Postman pour tester le déploiement ? + +Sur le dashboard Kubernetes, sélectionnez le bon NAMESPACE. Allez dans les Ingresses. Selon la façon dont vous avez déployé les Helm charts, cherchez 'moja-centralledger-service'. Cliquez sur éditer et trouvez la balise ``. Cela contiendra le endpoint pour ce service. + +### 25. Pourquoi n’y a-t-il pas de possibilité d’annulation (reversal) sur Mojaloop ? + +*L’irrévocabilité* est un principe fondamental du programme Level One et ne pas autoriser d’annulations (reversals) est essentiel pour cela. Voici la section de la définition API qui en parle : + +_*6.7.1.2 Irrévocabilité des transactions*_ +_L’API est conçue pour prendre en charge uniquement des transactions financières irrévocables ; cela signifie qu’une transaction financière ne peut pas être modifiée, annulée ou inversée après sa création. Cela vise à simplifier et à réduire les coûts pour les FSP utilisant l’API. Une grande partie des coûts d’exploitation des systèmes financiers classiques est due aux annulations de transactions._ +_Dès qu’un FSP payeur envoie une transaction financière à un FSP bénéficiaire (c’est-à-dire via POST /transfers avec la transaction de bout en bout), la transaction est irrévocable du point de vue du FSP payeur. La transaction peut encore être rejetée par le FSP bénéficiaire, mais le FSP payeur ne peut plus la rejeter ou la modifier. Une exception à cela serait si l’expiration du transfert survient avant la réponse du FSP bénéficiaire (voir les sections 6.7.1.3 et 6.7.1.5 pour plus d’informations). Une fois la transaction acceptée par le FSP bénéficiaire, elle est irrévocable pour toutes les parties._ + +Cependant, *les remboursements* sont un cas d’utilisation supporté par l’API. + +### 26. Erreur lors de l'installation de microk8s : "MountVolume.SetUp failed" ? + +Cela semblerait être un problème d’espace, bien que plus de 100GiB de stockage EBS aient été alloués. +Le problème s’est résolu de lui-même après 45 minutes. L’implémentation initiale du projet mojaloop peut prendre du temps à se stabiliser. + +### 27. Pourquoi ai-je cette erreur lors de la création d’un participant : "Hub reconciliation account for the specified currency does not exist" ? + +Vous devez créer les comptes Hub correspondants (HUB_MULTILATERAL_SETTLEMENT et HUB_RECONCILIATION) pour la devise spécifiée avant de configurer les participants. +Dans cette collection Postman, vous pouvez trouver les requêtes nécessaires dans le dossier "Hub Account" : https://github.com/mojaloop/postman/blob/master/OSS-New-Deployment-FSP-Setup.postman_collection.json + +Trouvez aussi les environnements associés dans le dépôt Postman : https://github.com/mojaloop/postman diff --git a/docs/fr/technical/reference-architecture/boundedContexts/accountLookupAndDiscovery/assets/ML2RA_bc_accLookDiscvry_Apr22-b400.png b/docs/fr/technical/reference-architecture/boundedContexts/accountLookupAndDiscovery/assets/ML2RA_bc_accLookDiscvry_Apr22-b400.png new file mode 100644 index 000000000..818a34706 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/accountLookupAndDiscovery/assets/ML2RA_bc_accLookDiscvry_Apr22-b400.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/accountLookupAndDiscovery/assets/aldGetParticipant_20210825.png b/docs/fr/technical/reference-architecture/boundedContexts/accountLookupAndDiscovery/assets/aldGetParticipant_20210825.png new file mode 100644 index 000000000..21d61c305 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/accountLookupAndDiscovery/assets/aldGetParticipant_20210825.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/accountLookupAndDiscovery/assets/aldGetParty_20210825.png b/docs/fr/technical/reference-architecture/boundedContexts/accountLookupAndDiscovery/assets/aldGetParty_20210825.png new file mode 100644 index 000000000..175ca5e37 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/accountLookupAndDiscovery/assets/aldGetParty_20210825.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/accountLookupAndDiscovery/assets/aldPartyParticipantAssoc_20220919.png b/docs/fr/technical/reference-architecture/boundedContexts/accountLookupAndDiscovery/assets/aldPartyParticipantAssoc_20220919.png new file mode 100644 index 000000000..edfac583f Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/accountLookupAndDiscovery/assets/aldPartyParticipantAssoc_20220919.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/accountLookupAndDiscovery/assets/aldPartyParticipantDisassoc_20220919.png b/docs/fr/technical/reference-architecture/boundedContexts/accountLookupAndDiscovery/assets/aldPartyParticipantDisassoc_20220919.png new file mode 100644 index 000000000..ccb1b42a2 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/accountLookupAndDiscovery/assets/aldPartyParticipantDisassoc_20220919.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/accountLookupAndDiscovery/index.md b/docs/fr/technical/reference-architecture/boundedContexts/accountLookupAndDiscovery/index.md new file mode 100644 index 000000000..87e63a7e0 --- /dev/null +++ b/docs/fr/technical/reference-architecture/boundedContexts/accountLookupAndDiscovery/index.md @@ -0,0 +1,70 @@ +# BC de Recherche et Découverte de Comptes + +Le BC de Recherche et Découverte de Comptes est responsable de la localisation et de l’association des participants et des parties avec les transactions initiées par une partie ou un participant. + +## Termes + +Les termes suivants sont utilisés dans ce BC, aussi appelé domaine. + +| Terme | Description | +|---|---| +| **Participant** | Fournisseur de Services Financiers (FSF) | +| **Party (Partie)** | Client du FSF | + +## Vue Fonctionnelle + +![Cas d’Utilisation - Vue Fonctionnelle](./assets/ML2RA_bc_accLookDiscvry_Apr22-b400.png) +>Diagramme fonctionnel du BC : Vue d’ensemble de la Recherche et Découverte de Comptes + +## Cas d’Utilisation + +#### Association Partie/Participant + +#### Description + +Lorsqu’un Participant DFSP demande à associer un identifiant de Partie donné à un Participant (lui-même). + +***Remarque :*** *Les vérifications et validations KYC (« Know Your Customer » – Connaître votre client) ne sont pas couvertes ici et relèvent de processus extérieurs aux appels d’API Mojaloop. Ces vérifications doivent être prises en charge par le Schéma pour garantir la validité des demandes d’association (ou de dissociation).* + +#### Diagramme de Flux + +![Cas d’Utilisation - Association Partie/Participant](./assets/aldPartyParticipantAssoc_20220919.png) +>Diagramme de flux UC : Association Partie/Participant + +### Dissociation Partie/Participant + +#### Description + +Dans ce cas, un Participant DFSP demande à supprimer l’association existante entre un identifiant de Partie et un Participant (lui-même). + +#### Diagramme de Flux + +![Cas d’Utilisation - Dissociation Partie/Participant](./assets/aldPartyParticipantDisassoc_20220919.png) +>Diagramme de flux UC : Dissociation Partie/Participant + +### Obtenir un Participant + +#### Description + +Lorsqu’un Participant DFSP demande des informations d’association de Participant sur la base d’un identifiant de Partie, ce cas d’utilisation est utilisé par le switch pour valider la demande et fournir les données d’association demandées au DFSP requérant. + +#### Diagramme de Flux + +![Cas d’Utilisation - Obtenir un Participant](./assets/aldGetParticipant_20210825.png) +>Diagramme de flux UC : Obtenir un Participant + +### Obtenir une Partie + +#### Description + +Lorsqu’un Participant DFSP interroge un autre Participant DFSP pour obtenir les détails d’une Partie gérée par ce dernier, ce cas d’utilisation permet de valider la demande et de fournir les données de la Partie demandées au DFSP requérant. + +#### Diagramme de Flux + +![Cas d’Utilisation - Obtenir une Partie](./assets/aldGetParty_20210825.png) +>Diagramme de flux UC : Obtenir une Partie + + + + +[^1]: Interfaces Communes : [Liste d’interfaces communes Mojaloop](../../commonInterfaces.md) diff --git a/docs/fr/technical/reference-architecture/boundedContexts/accountsAndBalances/assets/ML2RA_A&B-bcAccBal-FunctionalOverview_Mar22-c.png b/docs/fr/technical/reference-architecture/boundedContexts/accountsAndBalances/assets/ML2RA_A&B-bcAccBal-FunctionalOverview_Mar22-c.png new file mode 100644 index 000000000..4da5a26b9 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/accountsAndBalances/assets/ML2RA_A&B-bcAccBal-FunctionalOverview_Mar22-c.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/accountsAndBalances/index.md b/docs/fr/technical/reference-architecture/boundedContexts/accountsAndBalances/index.md new file mode 100644 index 000000000..77720cd62 --- /dev/null +++ b/docs/fr/technical/reference-architecture/boundedContexts/accountsAndBalances/index.md @@ -0,0 +1,121 @@ +# BC Comptes et Soldes + +Le BC Comptes et Soldes agit comme le « grand livre central » du système. Il interagit principalement avec le BC Règlements, le BC Cycle de Vie des Participants et les BCs Transferts. Il s’agit d’un sous-système dirigé, ce qui signifie qu’il constitue une dépendance pour les BCs qui l’utilisent comme « registre financier » pour la comptabilité. + +**Remarque :** + +Le BC Comptes et Soldes contient une quantité limitée de logique afin de garantir que **(a)** les bonnes relations sont créées et maintenues entre les entités lorsqu’un BC externe crée, met à jour, consulte ou ferme des comptes et **(b)** que les limites de comptes appropriées sont appliquées (c’est-à-dire définies et non dépassées) lorsqu’un BC externe tente de créer des écritures comptables, et **(c)** qu’on évite les doublons d’écritures grâce à l’utilisation d’*identifiants uniques universels (UUID)* pour les identifiants d’écritures. + +## Termes + +Termes ayant une signification spécifique et communément acceptée dans le contexte délimité où ils sont utilisés. + +| Terme | Description | +|---------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **Compte** | Désigne un compte du Grand Livre, un enregistrement dans un système comptable qui enregistre les écritures au débit ou au crédit représentant une opération financière. | +| **Écriture** | Enregistrements comptables de crédit/débit sur un Compte. | +| **Solde** | Montant disponible dans un compte, une fois pris en compte les débits et crédits. | + +## Vue fonctionnelle – Comptes et Soldes + +![Aperçu fonctionnel – Comptes et Soldes](./assets/ML2RA_A&B-bcAccBal-FunctionalOverview_Mar22-c.png) +>Diagramme fonctionnel BC : Vue d’ensemble des Comptes & Soldes + +## Cas d’utilisation + +### Création de Compte + +#### Description + +Le flux défini par ce cas d’utilisation permet au Switch de créer de nouveaux comptes participants/de transfert/de règlement dans le Grand Livre du Système. (La création de comptes Participants intervient à la fois depuis le BC Cycle de Vie des Participants et le BC Règlements. Des exemples issus des deux sont fournis dans les diagrammes de flux ci-dessous.) + +De plus, ce flux permet de spécifier des limites de crédit/débit pour les Écritures, et garantit que le Compte est unique dans le Grand Livre du Système. + +#### Diagramme de flux + +Création de compte depuis le [BC Cycle de Vie des Participants](../participantLifecycleManagement/index.md) + + + +![Cas d’utilisation – BC PLCM](../participantLifecycleManagement/assets/ML2RA_PLM-ucAddParticipantAccountInit_Apr22-a_P1-1429.png) +![Cas d’utilisation – Approbation de création Compte Participant (P2)](../participantLifecycleManagement/assets/ML2RA_PLM-ucAddParticipantAccountAppro_Apr22-a_P2-1429.png) +>Diagramme de flux UC : Ajout de comptes participants + +Création de compte depuis le [BC Règlements](../settlements/index.md) + +![Cas d’utilisation – BC Règlements](../settlements/assets/ML2RA_SET-ucBootStrapSettleModViaConfig_Mar22-b.png) +>Diagramme de flux UC : Initialisation via configuration d’un modèle de règlement + +### Fermeture de Compte + +#### Description + +Fermer un compte participant dans le Grand Livre du Système et empêcher l’impact de nouvelles écritures comptables sur celui-ci.
    (À déterminer : possible vidage automatique des soldes CR de collatéral vers un autre compte ?) + +### Consultation de Compte + +#### Description + +Consulter le statut et le solde d’un compte participant. + +#### Diagramme de flux + +Demande des limites de liquidité CR/DR depuis le [BC Cycle de Vie des Participants](../participantLifecycleManagement/index.md) + + + +![Cas d’utilisation – BC PLCM](../participantLifecycleManagement/assets/ML2RA_PLM-ucLiquidityCoverQuery_Apr22-a_1429.png) +>Diagramme de flux UC : Demande de couverture de liquidité + +### Consultation des écritures + +#### Description + +Consulter les écritures comptables (débit/crédit) d’un Compte. + +### Insertion d’une écriture + +#### Description + +Saisir une écriture comptable de participant dans le Grand Livre en spécifiant les comptes débiteurs et créditeurs (Il existe trois façons d’effectuer ces saisies ; voir les diagrammes de flux ci-dessous pour chacune.) +Répondre avec le nouveau solde du compte. + +#### Diagramme de flux + +Insertion d’une écriture depuis le [BC Transferts](../transfers/index.md) + +![Cas d’utilisation – BC Transferts](../transfers/assets/ML2RA_Trf_ucPerformTrfUniMode_Mar22a.png) +>Diagramme de flux UC : Effectuer un transfert (mode universel) + +Insertion d’une écriture depuis le [BC Règlements](../settlements/index.md) en utilisant le modèle `Règlement Net Différé (DNS)` + +![Cas d’utilisation – BC Règlements](../settlements/assets/ML2RA_SET-ucDeferNetSettle_Mar22-a-P1-2.png) +>Diagramme de flux UC : Règlement Net Différé – 19/10/2021 + +Insertion d’une écriture depuis le [BC Règlements](../settlements/index.md) en utilisant le modèle `Règlement Brut Immédiat (IGS)` + +![Cas d’utilisation – BC Règlements](../settlements/assets/ML2RA_SET-ucInstantGrossSettle_Mar22-a.png) +>Diagramme de flux UC : Règlement Brut Immédiat + +## Modèle Canonique + +- Compte + - accountId + - ledgerAccountType + - ledgerAccountState + - debitLimit + - creditLimit + - debitBalance + - creditBalance +- Écriture + - journalEntryId + - debitAccountId + - creditAccountId + - journalEntryType + - transferAmount + - transferTimestamp + + + + +[^1]: Interfaces Communes : [Liste d’interfaces communes Mojaloop](../../commonInterfaces.md) diff --git a/docs/fr/technical/reference-architecture/boundedContexts/auditing/assets/ML2RA_Audit_bcFunctionalOverview_Mar22_1450.png b/docs/fr/technical/reference-architecture/boundedContexts/auditing/assets/ML2RA_Audit_bcFunctionalOverview_Mar22_1450.png new file mode 100644 index 000000000..8e5c8c2d9 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/auditing/assets/ML2RA_Audit_bcFunctionalOverview_Mar22_1450.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/auditing/assets/ML2RA_Audit_ucAuditingBCStartup_Mar22_1450.png b/docs/fr/technical/reference-architecture/boundedContexts/auditing/assets/ML2RA_Audit_ucAuditingBCStartup_Mar22_1450.png new file mode 100644 index 000000000..c2392091e Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/auditing/assets/ML2RA_Audit_ucAuditingBCStartup_Mar22_1450.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/auditing/assets/ML2RA_Audit_ucEventBasedAudit_Mar22_1450.png b/docs/fr/technical/reference-architecture/boundedContexts/auditing/assets/ML2RA_Audit_ucEventBasedAudit_Mar22_1450.png new file mode 100644 index 000000000..67bb2b3b0 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/auditing/assets/ML2RA_Audit_ucEventBasedAudit_Mar22_1450.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/auditing/assets/ML2RA_Audit_ucSyncRPCAudit_Mar22_1450.png b/docs/fr/technical/reference-architecture/boundedContexts/auditing/assets/ML2RA_Audit_ucSyncRPCAudit_Mar22_1450.png new file mode 100644 index 000000000..6ec6a7dd0 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/auditing/assets/ML2RA_Audit_ucSyncRPCAudit_Mar22_1450.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/auditing/index.md b/docs/fr/technical/reference-architecture/boundedContexts/auditing/index.md new file mode 100644 index 000000000..b8103adea --- /dev/null +++ b/docs/fr/technical/reference-architecture/boundedContexts/auditing/index.md @@ -0,0 +1,67 @@ +# BC Auditing + +Le BC Auditing est responsable du maintien d’un enregistrement immuable de toutes les transactions qui ont lieu sur le Switch. Son architecture est composée de cinq principaux composants : + +* Service Centralisé de Journalisation Médico-légale +* Services +* Stockage Immuable +* Système de Gestion des Clés (KMS) +* Module Fournisseur Cryptographique (CPM)[^1] + +Les utilisateurs autorisés peuvent interroger le BC Auditing via une API d’Opérations exposée à cet effet, afin d’obtenir des détails sur les événements auditables. + +## Termes + +Termes ayant une signification spécifique et communément admise dans le Contexte Borné où ils sont utilisés. + +| Terme | Description | +|---|---| +| **KMS** | Système de Gestion des Clés (Key Management System) – Fournit des services de chiffrement/déchiffrement et d’Autorité de Certification à l’environnement du Switch (émission, signature et vérification via le BC Sécurité). | +| **CPM** | Module Fournisseur Cryptographique – Gère les techniques et méthodologies cryptographiques employées par le Switch, afin de garantir des services de chiffrement et de déchiffrement de bout en bout pour toutes les données stockées ou transmises. | + +## Vue Fonctionnelle + +![Cas d’Utilisation – Vue Fonctionnelle du Système d’Audit](./assets/ML2RA_Audit_bcFunctionalOverview_Mar22_1450.png) +> Diagramme Fonctionnel du BC : Vue d’ensemble du Système d’Audit + +## Cas d’Utilisation + +### Démarrage du BC Auditing + +#### Description + +Le cas d’utilisation « Démarrage du BC Auditing » est déclenché lors du démarrage (à intervalles réguliers ou sur évènement) et récupère l’ensemble des clés publiques utilisées par les différents BCs Participants du Switch depuis le BC Sécurité fournissant les services de gestion des clés (KMS) pour tous les BCs Participants du Switch. + +#### Diagramme de déroulement + +![Cas d’Utilisation – Démarrage du BC Auditing](./assets/ML2RA_Audit_ucAuditingBCStartup_Mar22_1450.png) +> Diagramme de Workflow du Cas d’Utilisation : Démarrage du BC Auditing + +### Audit Sync/RPC + +#### Description + +Le cas d’utilisation « Audit Sync/RPC » est activé lors d’un événement digne d’audit déclenché pendant une transaction notée par un BC participant. Le BC participant notifie alors le BC Auditing via un appel RPC synchronisé. L’entrée d’audit est signée localement par le BC émetteur. Dès réception, le BC Auditing effectue une série de procédures comprenant une opération avec le KMS via le BC Sécurité, puis persiste l’enregistrement dans un stockage à ajout-seul (Append-only Store). + +#### Diagramme de déroulement + +![Cas d’Utilisation – Audit Sync/RPC](./assets/ML2RA_Audit_ucSyncRPCAudit_Mar22_1450.png) +> Diagramme de Workflow du Cas d’Utilisation : Audit Sync/RPC + +### Audit Basé sur les Événements + +#### Description + +Le cas d’utilisation « Audit Basé sur les Événements » est déclenché lorsqu’un BC participant dispose d’une capacité d’audit locale, détecte un événement digne d’audit, crée un événement d’audit signé localement, qu’il publie puis envoie (individuellement ou en lot) au BC Auditing. L’événement est validé via une procédure avec le BC Sécurité, puis stocké dans le dépôt à ajout-seul. + +#### Diagramme de déroulement + +![Cas d’Utilisation – Audit Basé sur les Événements](./assets/ML2RA_Audit_ucEventBasedAudit_Mar22_1450.png) +> Diagramme de Workflow du Cas d’Utilisation : Audit Basé sur les Événements + + +## Notes + +[^1]: « Cryptographique » fait référence à l’ensemble des techniques et méthodologies algorithmiques employées par les systèmes pour empêcher des systèmes ou des personnes non autorisées d’accéder, d’identifier ou d’utiliser des données stockées. Pour en savoir plus, veuillez consulter l’article Wikipédia dédié : [Cryptographie, Wikipedia – l’encyclopédie libre](https://fr.wikipedia.org/wiki/Cryptographie) + +[^2]: Interfaces communes : [Liste des Interfaces Communes Mojaloop](../../refarch/commonInterfaces.md) diff --git a/docs/fr/technical/reference-architecture/boundedContexts/commonInterfaces/index.md b/docs/fr/technical/reference-architecture/boundedContexts/commonInterfaces/index.md new file mode 100644 index 000000000..44155eef7 --- /dev/null +++ b/docs/fr/technical/reference-architecture/boundedContexts/commonInterfaces/index.md @@ -0,0 +1,151 @@ +# Liste des Interfaces Communes + +La Liste des Interfaces Communes recense l’ensemble des interfaces utilisées actuellement dans l’Architecture de Référence Mojaloop 2.0. Les interfaces communes sont partagées par plusieurs Bounded Contexts, d’où leur nom. + +Chaque interface commune listée comprend les informations suivantes : le nom de l’événement source ou du point de terminaison (endpoint), le style de communication, le Bounded Context émetteur/fournisseur, une description de la fonction de l’interface, ainsi qu’une liste des Bounded Contexts qui l’utilisent. + +## Interfaces Communes + +| Nom de l'événement OU endpoint | Style de com. | BC éditeur/fournisseur | Description | BC API Interop FSP | BC Admin/Opérations | BC Gestion Cycle de Vie Participant | BC Transferts | BC Comptes & Soldes | BC Règlements | BC Recherche de Comptes | BC Accords / Devis | Paiements Init 3e Partie | BC Notifications & Alertes | BC Planification | BC Audit | BC Sécu - authZ | BC Sécu - authN | BC Sécu - auditing | BC Sécu - logging | BC Sécu - crypto | +|------------------------------------------------------|---------------|-------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------|---------------------|------------------------------------|---------------|---------------------|---------------|------------------------|--------------------|-------------------------|----------------------------|-------------------|---------|-------------------|-------------------|--------------------|--------------------|-------------------| +| TransferCommittedFulfiled | Événement | BC Transferts | Événement indiquant que le transfert a été validé et que l’étape finale « Transfer Committed » a été traitée par le BC Transferts | x | | x | | | | | | | | | | | | | | | +| LiquidityThresholdExceeded | gRPC | BC Transferts | Événement déclenché lorsqu’un seuil de liquidité d’un participant est dépassé et qu’une action doit être prise | | | X | | | | | | | | | | | | | | | +| TransferPrepared | Événement | BC Transferts | Événement signalant que l’étape de préparation d’un transfert a été traitée par le BC Transferts | x | | | | | | | | | | | | | | | | | +| TransferQueryResponse | Événement | BC Transferts | Événement contenant la réponse à la suite d’un événement TransferQueryReceived | x | | | | | | | | | | | | | | | | | +| TransferRejectRequestProcessed | Événement | BC Transferts | Événement confirmant le traitement d’une demande de rejet de transfert par le BC Transferts | x | | | | | | | | | | | | | | | | | +| TransferPrepareRequestTimedout | Événement | BC Transferts | Événement de délai dépassé lors de la préparation d’un transfert | x | | | | | | | | | | | | | | | | | +| TransferFulfilComitRequestTimedout | Événement | BC Transferts | Événement de délai dépassé lors d’un transfert en état « préparé final » (en attente de complétion ou rejet) | x | | | | | | | | | | | | | | | | | +| TransferPrepareDuplicateCheckFailed | Événement | BC Transferts | Échec d’une validation de doublon lors du traitement de l’événement TransferPrepareAccountAllocated | x | | | | | | | | | | | | | | | | | +| TransferPrepareLiquidityCheckFailed | Événement | BC Transferts | Échec d’une validation de liquidité lors du traitement de l’événement TransferPrepareAccountAllocated | x | | | | | | | | | | | | | | | | | +| TransferPrepareInvalidPayerCheckFailed | Événement | BC Transferts | Échec de validation du Participant payeur lors du traitement de TransferPrepareAccountAllocated | x | | | | | | | | | | | | | | | | | +| TransferPrepareInvalidPayeeCheckFailed | Événement | BC Transferts | Échec de validation du Participant bénéficiaire lors du traitement de TransferPrepareAccountAllocated | x | | | | | | | | | | | | | | | | | +| TransferPrepareAccountsAllocated | Événement | BC Règlements | Demande Transfer Prepare enrichie des comptes applicables pour la validation/allocation de liquidité | | | | x | | | | | | | | | | | | | | +| /random-number-gen | Événement | BC Sécurité - crypto | Générateur de nombre aléatoire. Sert (1) à générer un id (2) un secret (3) un challenge FIDO | x | x | | | | | | | | | | | x | x | | | x | +| /hash-gen | HTTP/Rest | BC Sécurité - crypto | Génération de hash. Sert à hacher des nombres aléatoires et des informations utilisateur. Utilisé pour l’authentification de base et la vérification de signature.| x | x | | | | | | | | | | | x | x | | | x | +| /signature-gen | HTTP/Rest | BC Sécurité - crypto | Génération de signature. Utilisée pour signer les enregistrements d’audit pour l’immutabilité | | | | | | | | | | | | x | x | x | x | x | | +| /signature-ver | HTTP/Rest | BC Sécurité - crypto | Vérification de signature. Utilisée pour l’authentification/autorisation FIDO et la validation de l’audit au retrait | x | x | | | | | | | | | | x | x | x | x | x | | +| /encrypt | HTTP/Rest | BC Sécurité - crypto | Chiffrement générique | | | | | | | | | | | | x | | | x | x | x | +| /decrypt | HTTP/Rest | BC Sécurité - crypto | Déchiffrement générique | | | | | | | | | | | | x | | | x | x | x | +| /pin-translation | HTTP/Rest | BC Sécurité - crypto | Traduction de bloc PIN bancaire d’une zone de chiffrement à une autre. Utilisable pour des transactions ATM ou POS interbancaires | | | | | | | | | | | | | | | | | x | +| /fido-register | HTTP/Rest | BC Sécurité - crypto | Fonction crypto composite. Stocke la clé publique ECC de l’authentificateur avec les infos utilisateur | x | x | | | | | | | | | | | | | | | | +| /fido-authenticate | HTTP/Rest | BC Sécurité - crypto | Authentifier une signature FIDO | x | x | | | | | | | | | | | | | | | | +| /fido-authorize | HTTP/Rest | BC Sécurité - crypto | Autoriser une transaction FIDO après action (pression bouton, empreinte, etc) | x | x | | | | | | | | | | | | | | | | +| /kms-key-definition | HTTP/Rest | BC Sécurité - crypto | Définition des clés cryptographiques (usage, durée, label) | | | | | | | | | | | | | | | | | x | +| /kms-aes-key-gen | HTTP/Rest | BC Sécurité - crypto | Génération de clé cryptographique pour chiffrement symétrique | | | | | | | | | | | | | | | | | x | +| /kms-ecc-key-gen | HTTP/Rest | BC Sécurité - crypto | Génération de paires de clés elliptiques (ECC) | | | | | | | | | | | | | | | | | x | +| /crypto-adapter-set | HTTP/Rest | BC Sécurité - crypto | Définir le fournisseur / adapteur cryptographique (AWS, Azure, HSM, librairies locales...) | | | | | | | | | | | | | | | | | x | +| /iam-token-verifty | HTTP/Rest | BC Sécurité - crypto | Vérification basique de token d’authentification. Appel composite à l’adapteur AIM | x | x | | x | | | | | | | | | | | | | x | +| /kms-pem-gen | HTTP/Rest | BC Sécurité - crypto | Génère des clés PKI pour l’authentification client et fonctions CLI | x | x | | | | | | | | | | | | | | | x | +| /ssl-terminate | HTTP/Rest | BC Sécurité - crypto | Terminaison SSL | | | | | | | | | | | | | | | | | x | +| /kms-load-key | HTTP/Rest | BC Sécurité - crypto | Chargement des clés cryptographiques dans le magasin de clés | | | | | | | | | | | | | | | | | x | +| /app-authorize | HTTP/Rest | BC Sécurité - authZ | Appelle AuthZ BC pour vérifier le token d’autorisation et IAM pour vérifier les rôles | x | x | | | | | | | | | | | x | | | | x | +| /app-fido-authorize | HTTP/Rest | BC Sécurité - authZ | Appelle Crypto BC pour autoriser la transaction | x | x | | | | | | | | | | | | | | | x | +| /app-pem-auth | HTTP/Rest | BC Sécurité - authZ | Authentifie via clé PKI la connexion aux APIs et autorise via profil IAM (id+role) | | | | | | | | | | | | | | x | | | x | +| /app-basic-auth | HTTP/Rest | BC Sécurité - authN | Appelle AuthZ BC pour vérifier id et secret. Retourne un token d’autorisation | x | x | | | | | | | | | | | | x | | | x | +| CreateScheduleReminder | gRPC | BC Planification | Crée un rappel planifié et lance un événement ou une callback API une fois le rappel écoulé | | | | x | | | | | | | | | | | | | | +| DeleteScheduleReminder | gRPC | BC Planification | Signale qu’un rappel planifié a expiré | | | | x | | | | | | | | | | | | | | +| POST /config/schemas/ | HTTP/Rest | BC Configuration Plateforme | (upsert) Publie les premiers ou nouveaux schémas de configuration d’un BC au démarrage – inclut le numéro de version | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | +| GET /config/schemas/ | HTTP/Rest | BC Configuration Plateforme | Récupère le schéma et la configuration courante de tous les bounded contexts | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | +| GET /config/schemas/:boundedContextId | HTTP/Rest | BC Configuration Plateforme | Récupère le schéma et la configuration d’un bounded context spécifique | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | +| ConfigurationValuesChanged | Événement | BC Configuration Plateforme | Événement envoyé lors de la modification d’une configuration – inclut au moins l’ID du bounded context ainsi que les clés modifiées | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | +| POST /config/schemas/:boundedContextId | HTTP/Rest | BC Configuration Plateforme | Publie les nouveaux schémas de configuration d’un BC au démarrage – inclut le numéro de version | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | +| POST /config/secrets/ | HTTP/Rest | BC Configuration Plateforme | (upsert) Publie la liste des clés secrètes dont a besoin un BC pour fonctionner – envoie au démarrage – inclut le numéro de version | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | +| GET /config/secrets/ | HTTP/Rest | BC Configuration Plateforme | Récupère la liste des clés secrètes dont chaque BC a besoin pour fonctionner – pour tous les bounded contexts | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | +| GET /config/secrets/:boundedContextId | HTTP/Rest | BC Configuration Plateforme | Récupère la liste des clés secrètes pour un bounded context spécifique | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | +| GET /config/secrets/:boundedContextId/values | HTTP/Rest | BC Configuration Plateforme | Appel réalisable uniquement par le BC propriétaire (signature vérifiée) — retourne les secrets et leurs clés pour ce bounded context | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | +| SecretsValuesChanged | Événement | BC Configuration Plateforme | Événement envoyé lors de la modification d’un secret – inclut au moins l’ID du bounded context ainsi que les clés modifiées | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | +| UpdateParticipantAccountThreshold | gRPC | BC Gestion Cycle de Vie Participant | Met à jour les seuils des comptes spécifiés | | | | | X | | | | | | | | | | | | | +| GetParticipantsTransfersData | gRPC | BC Gestion Cycle de Vie Participant | Service de requête pour récupérer les infos Participants pour les transferts (validations...) | | | | x | | | | | | | | | | | | | | +| GetParticipantCallbackInfo | gRPC | BC Gestion Cycle de Vie Participant | API pour récupérer les infos Participant pour les callbacks. Par ex, API FSPIOP qui utilise cela pour produire un événement NotifyRequested | x | | | | | | | | | | | | | | | | | +| GetParticipantQuoteData | gRPC | BC Gestion Cycle de Vie Participant | Service pour obtenir les données Participant pour la gestion des devis | | | | | x | | | | | | | | | | | | | +| CreateParticipant | HTTP/Rest | BC Gestion Cycle de Vie Participant | Demande pour créer un nouveau participant via une charge utile contenant tous les détails pertinents | | X | | | | | | | | | | | | | | | | +| GetPendingParticipants | HTTP/Rest | BC Gestion Cycle de Vie Participant | Récupère tous les participants dans l’état « PEND-APPROVAL », donc pas encore approuvés ou rejetés | | X | | | | | | | | | | | | | | | | +| ApproveParticipant | HTTP/Rest | BC Gestion Cycle de Vie Participant | Approuve ou rejette un participant en attente d’approbation | | X | | | | | | | | | | | | | | | | +| CreateParticipantAccountsWithLimits | gRPC | BC Gestion Cycle de Vie Participant | Notifie la création du participant puis la création des comptes avec plafonds | | | | | X | | | | | | | | | | | | | +| ParticipantCreated | Événement | BC Gestion Cycle de Vie Participant | Notifie la création du participant et des comptes/limites associés | | | X | | | | | | | | | | | | | | | +| ManageFunds | HTTP/Rest | BC Gestion Cycle de Vie Participant | Demande de retrait ou dépôt de fonds | | X | | | | | | | | | | | | | | | | +| GetPendingManageFunds | HTTP/Rest | BC Gestion Cycle de Vie Participant | Récupère toutes les demandes de gestion de fonds en attente d’approbation | | X | | | | | | | | | | | | | | | | +| ApproveManageFunds | HTTP/Rest | BC Gestion Cycle de Vie Participant | Approuve ou rejette une demande de dépôt ou de retrait | | X | | | | | | | | | | | | | | | | +| ManageFundsCreditDebitPairInstruction | gRPC | BC Gestion Cycle de Vie Participant | Met à jour la comptabilité avec les opérations de crédit et de débit associées | | | | | X | | | | | | | | | | | | | +| ReserveLiquidityCover | HTTP/Rest | BC Gestion Cycle de Vie Participant | Demande de réserve d’un montant de liquidité (valeur ou %) | | X | | | | | | | | | | | | | | | | +| GetPendingLiquidityCoverReservations | HTTP/Rest | BC Gestion Cycle de Vie Participant | Récupère les demandes de couverture de liquidité en attente d’approbation | | X | | | | | | | | | | | | | | | | +| ApproveLiquidityCoverReservation | HTTP/Rest | BC Gestion Cycle de Vie Participant | Approuve ou rejette une demande de couverture de liquidité | | X | | | | | | | | | | | | | | | | +| UpdateParticipantState | HTTP/Rest | BC Gestion Cycle de Vie Participant | Demande de changement d’état pour un participant donné | | X | | | | | | | | | | | | | | | | +| GetPendingStateUpdates | HTTP/Rest | BC Gestion Cycle de Vie Participant | Récupère les participants dont la demande de changement d’état est en attente | | X | | | | | | | | | | | | | | | | +| ApproveParticipantStateUpdate | HTTP/Rest | BC Gestion Cycle de Vie Participant | Approuve ou rejette un changement d’état de participant | | X | | | | | | | | | | | | | | | | +| ParticipantStateUpdated | gRPC | BC Gestion Cycle de Vie Participant | Notifie les BC du changement d’état d’un participant | | | X | X | | | X | | | | | X | X | X | X | X | | +| ParticipantLiquidityThresholdExceeded | Événement | BC Gestion Cycle de Vie Participant | Notification qu’un seuil de liquidité est dépassé pour un participant donné | | | | | | | | | | X | | | | | | | | +| AddParticipantAccount | HTTP/Rest | BC Gestion Cycle de Vie Participant | Demande de création de compte pour un participant donné | | X | | | | | | | | | | | | | | | | +| GetPendingParticipantsAccounts | HTTP/Rest | BC Gestion Cycle de Vie Participant | Récupère les participants et comptes en attente de création | | X | | | | | | | | | | | | | | | | +| ApproveParticipantAccount | HTTP/Rest | BC Gestion Cycle de Vie Participant | Approuve ou rejette une demande de création de compte participant | | X | | | | | | | | | | | | | | | | +| CreateParticipantAccountWithLimits | gRPC | BC Gestion Cycle de Vie Participant | Crée les comptes correspondants dans le BC Comptes & Soldes | | | | | X | | | | | | | | | | | | | +| ParticipantAccountAdded | Événement | BC Gestion Cycle de Vie Participant | Notifie la création d’un compte participant | | | X | | | | | | | | | | | | | | | +| UpdateAccountStatus | HTTP/Rest | BC Gestion Cycle de Vie Participant | Demande d’activation/désactivation d’un compte participant | | X | | | | | | | | | | | | | | | | +| GetPendingAccountsWithStatusUpdates | HTTP/Rest | BC Gestion Cycle de Vie Participant | Récupère les comptes en attente d’activation ou désactivation | | X | | | | | | | | | | | | | | | | +| ApproveAccountStatusUpdate | HTTP/Rest | BC Gestion Cycle de Vie Participant | Approuve ou rejette une demande d’activation/désactivation de compte | | X | | | | | | | | | | | | | | | | +| Enabled/DisabledParticipantAccount | gRPC | BC Gestion Cycle de Vie Participant | Active/désactive le compte selon les infos reçues | | | | | X | | | | | | | | | | | | | +| ParticipantAccountEnabled | Événement | BC Gestion Cycle de Vie Participant | Signale qu’un compte participant a été activé | | | X | | | | | | | | | | | | | | | +| ParticipantAccountDisabled | Événement | BC Gestion Cycle de Vie Participant | Signale qu’un compte participant a été désactivé | | | X | | | | | | | | | | | | | | | +| UpdateAccountLimit | HTTP/Rest | BC Gestion Cycle de Vie Participant | Demande de modif des plafonds d’un compte participant | | X | | | | | | | | | | | | | | | | +| GetPendingAccountsWithLimitUpdates | HTTP/Rest | BC Gestion Cycle de Vie Participant | Récupère les comptes avec des modifs de plafond en attente | | X | | | | | | | | | | | | | | | | +| ApproveAccountLimitUpdate | HTTP/Rest | BC Gestion Cycle de Vie Participant | Approuve ou rejette une demande de modification de plafond de compte | | X | | | | | | | | | | | | | | | | +| UpdateParticipantAccountLimit | gRPC | BC Gestion Cycle de Vie Participant | Met à jour les plafonds d’un compte participant donné | | | | | X | | | | | | | | | | | | | +| ParticipantAccountLimitUpdated | Événement | BC Gestion Cycle de Vie Participant | Notifie la création ou la mise à jour du plafond d’un compte participant | | | X | | | | | | | | | | | | | | | +| UpdateAccountThreshold | HTTP/Rest | BC Gestion Cycle de Vie Participant | Demande de modif du seuil d’un compte participant | | X | | | | | | | | | | | | | | | | +| GetPendingAccountsWithThresholdUpdates | HTTP/Rest | BC Gestion Cycle de Vie Participant | Récupère les comptes avec un seuil en cours de modification | | X | | | | | | | | | | | | | | | | +| ApproveAccountThresholdUpdate | HTTP/Rest | BC Gestion Cycle de Vie Participant | Approuve ou rejette une demande de modification de seuil de compte | | X | | | | | | | | | | | | | | | | +| ParticipantAccountThresholdUpdated | Événement | BC Gestion Cycle de Vie Participant | Notifie la modification du seuil d’un compte | | | X | | | | | | | | | | | | | | | +| UpdateEndpoints | HTTP/Rest | BC Gestion Cycle de Vie Participant | Demande de modification des endpoints d’un participant | | X | | | | | | | | | | | | | | | | +| GetPendingEndpointUpdates | HTTP/Rest | BC Gestion Cycle de Vie Participant | Récupère les demandes d’update d’endpoint en attente | | X | | | | | | | | | | | | | | | | +| ApproveEndpointsUpdate | HTTP/Rest | BC Gestion Cycle de Vie Participant | Approuve ou rejette une demande de modification d’endpoint participant | | X | | | | | | | | | | | | | | | | +| ParticipantEndpointsUpdated | Événement | BC Gestion Cycle de Vie Participant | Notifie la modification des endpoints d’un participant | | | X | X | X | X | X | X | X | | | | | | | | | +| GetParticipantInfo | gRPC | BC Gestion Cycle de Vie Participant | Récupère toutes les infos relatives à un participant | X | | | | | | X | X | X | | | | | | | | | +| GetParticipantInfo | HTTP/Rest | BC Gestion Cycle de Vie Participant | Récupère toutes les infos relatives à un participant | | X | | | | | | | | | | | | | | | | +| GetLiquidityCoverCurrentState | HTTP/Rest | BC Gestion Cycle de Vie Participant | Récupère l’état courant de la couverture de liquidité | | X | | | | | | | | | | | | | | | | +| NotifyReport | Événement | BC Notifications & Alertes | Événement de rapport de notification, précisant si la notification a abouti (et réponse de destination) ou a échoué (raison à l’appui) | | | | x | | | | | | | | | | | | | | +| /log-read-build-log | HTTP/Rest | BC Logging | Consommateur de logs. Fournit un endpoint pour écrire dans le topic de log d’application. Construction de logs | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | +| /read-log | HTTP/Rest | BC Logging | Lis les logs. Peut faire appel à Crypto BC pour déchiffrer / vérifier une signature | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | +| NotifyRequested | Événement | BC API Interop FSP | Événement demandant la notification d’une requête ou callback FSPIOP à acheminer vers un participant | | | | x | | | | | | | | | | | | | | +| TransferPrepareRequested | Événement | BC API Interop FSP | Événement de demande de préparation de transfert | | | x | | | | | | | | | | | | | | | +| TransferPrepareCallbackReport | Événement | BC API Interop FSP | Rapport de callback Transfer Prepare envoyé au participant bénéficiaire | | | | x | | | | | | | | | | | | | | +| TransferFulfilCommittedRequested | Événement | BC API Interop FSP | Événement indiquant que la validation (commit) est traitée côté bénéficiaire | | | | x | | | | | | | | | | | | | | +| TransferFulfilCommittedCallbackReport | Événement | BC API Interop FSP | Rapport de callback Fulfil Commit pour les participants payeur/bénéficiaire | | | | x | | | | | | | | | | | | | | +| TransferQueryReceived | Événement | BC API Interop FSP | Événement contenant les infos d’une requête de transfert | | | | x | | | | | | | | | | | | | | +| TransferQueryResponseCallbackReport | Événement | BC API Interop FSP | Rapport de callback de réponse à une requête de transfert | | | | x | | | | | | | | | | | | | | +| TransferRejectRequested | Événement | BC API Interop FSP | Événement de rejet de transfert émis par le participant bénéficiaire | | | | x | | | | | | | | | | | | | | +| TransferRejectRequestProcessedCallbackReport | Événement | BC API Interop FSP | Rapport de callback suite à un rejet de transfert | | | | x | | | | | | | | | | | | | | +| TransferPrepareRequestTimedoutCallbackReport | Événement | BC API Interop FSP | Rapport de callback de délai dépassé lors d’un transfert (étape prepare) | | | | x | | | | | | | | | | | | | | +| TransferFulfilCommitRequestTimedoutCallbackReport | Événement | BC API Interop FSP | Rapport de callback de délai dépassé lors d’un transfert (étape commit) | | | | x | | | | | | | | | | | | | | +| TransferPrepareDuplicateCheckFailedCallbackReport | Événement | BC API Interop FSP | Rapport de callback d’échec de la vérif de doublon lors d’un prepare | | | | x | | | | | | | | | | | | | | +| TransferPrepareLiquidityCheckFailedCallbackReport | Événement | BC API Interop FSP | Rapport de callback d’échec liquité lors d’un prepare | | | | x | | | | | | | | | | | | | | +| TransferPrepareInvalidPayerCheckFailedCallbackReport | Événement | BC API Interop FSP | Rapport de callback échec validation payeur lors d’un prepare | | | | x | | | | | | | | | | | | | | +| TransferPrepareInvalidPayeeCheckFailedCallbackReport | Événement | BC API Interop FSP | Rapport de callback échec validation bénéficiaire lors d’un prepare | | | | x | | | | | | | | | | | | | | +| QuoteRequestReceived | Événement | BC API Interop FSP | Événement contenant une demande de devis d’un participant payeur | | | | | | | | x | | | | | | | | | | +| QuoteReceivedCallbackReport | Événement | BC API Interop FSP | Rapport de callback pour une demande de devis vers un participant bénéficiaire | | | | | | | | x | | | | | | | | | | +| QuoteResponseReceived | Événement | BC API Interop FSP | Événement contenant la réponse d’un bénéficiaire à une demande de devis | | | | | | | | x | | | | | | | | | | +| QuoteAcceptedCallbackReport | Événement | BC API Interop FSP | Rapport de callback pour une réponse de devis acceptée, côté payeur | | | | | | | | x | | | | | | | | | | +| InvalidQuoteRequestCallbackReport | Événement | BC API Interop FSP | Rapport de callback pour un échec de devis côté payeur | | | | | | | | x | | | | | | | | | | +| InvalidFSPInQuoteRequestCallbackReport | Événement | BC API Interop FSP | Rapport de callback pour un FSP invalide dans une demande devis côté payeur | | | | | | | | x | | | | | | | | | | +| RuleViolatedInQuoteRequestCallbackReport | Événement | BC API Interop FSP | Rapport de callback règle violée dans une demande devis | | | | | | | | x | | | | | | | | | | +| RuleViolatedInQuoteResponseCallbackReport | Événement | BC API Interop FSP | Rapport de callback règle violée dans une réponse devis | | | | | | | | x | | | | | | | | | | +| /app-fido-register | HTTP/Rest | BC API Interop FSP | Appelle Crypto BC pour enregistrer un utilisateur | x | x | | | | | | | | | | | | | | | x | +| /audit-log-write | Événement | BC Audit | Écrit des entrées d’audit dans le topic Kafka correspondant. Consommateur appelle Crypto BC pour chiffrer/signer les logs | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | +| /audit-read-build-audit-log | HTTP/Rest | BC Audit | Consommateur d’audit. Fournit un endpoint pour écrire dans le topic d’audit. Construction des logs | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | +| /read-audit-log | HTTP/Rest | BC Audit | Lecture des logs d’audit. Appelle Crypto BC pour déchiffrer/vérifier la signature | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | +| QuoteRequestAccepted | Événement | BC Accords/Devis | Événement signalant le traitement d’une demande de devis dans BC Transferts | x | | | | | | | | | | | | | | | | | +| QuoteResponseAccepted | Événement | BC Accords/Devis | Événement signalant le traitement d’une réponse de devis dans BC Transferts | x | | | | | | | | | | | | | | | | | +| InvalidQuoteRequest | Événement | BC Accords/Devis | Événement signalant l’échec de validation d’une demande de devis lors du traitement de QuoteReuestReceived | x | | | | | | | | | | | | | | | | | +| InvalidFSPInQuoteRequest | Événement | BC Accords/Devis | Événement pour FSP invalide dans une demande de devis | x | | | | | | | | | | | | | | | | | +| RuleViolatedInQuoteRequest | Événement | BC Accords/Devis | Événement pour règle violée dans une demande de devis | x | | | | | | | | | | | | | | | | | +| RuleViolatedInQuoteResponse | Événement | BC Accords/Devis | Événement pour règle violée dans une réponse de devis | x | | | | | | | | | | | | | | | | | +| /app-register | HTTP/Rest | BC Admin/Opérations | Appelle Crypto BC pour obtenir id et secret | x | x | | | | | | | | | | | | x | | | x | +| GetLiquidityCoverHistory | HTTP/Rest | BC Admin/Opérations | Récupère l’historique de position de compte | | X | | | | | | | | | | | | | | | | +| GetReservations | HTTP/Rest | BC Admin/Opérations | Récupère les réservations | | X | | | | | | | | | | | | | | | | +| GetCurrentLiquidityPosition | gRPC | BC Comptes & Soldes | Récupère la position liquidité de référence pour valider la réservation de couverture | | | X | | | | | | | | | | | | | | | +| RecordLiquidityReservationEntries | gRPC | BC Comptes & Soldes | Enregistre les positions pour les couvertures de liquidité | | | X | | | | | | | | | | | | | | | +| RequestAccountsPositions | gRPC | BC Comptes & Soldes | Récupère les positions de compte pour un participant donné | | | X | | | | | | | | | | | | | | | +| RequestAccountPositionHistory | gRPC | BC Comptes & Soldes | Récupère l’historique des positions d’un participant | | | X | | | | | | | | | | | | | | | +| RequestReservationAccounts | gRPC | BC Comptes & Soldes | Récupère les comptes liés aux réservations | | | X | | | | | | | | | | | | | | | +| ProcessTransferPrepare | gRPC | BC Comptes & Soldes | Traite une demande Transfer Prepare (débite liquidité payeur, crédite la position via réserve de fonds) | | | | x | | | | | | | | | | | | | | +| ProcessTransferFulfil | gRPC | BC Comptes & Soldes | Traite une demande Transfer Fulfil (débite la réserve payeur, crédite la liquidité du bénéficiaire) | | | | x | | | | | | | | | | | | | | +| /log-write | Événement | | Écrit des entrées de log dans Kafka. Consommateur peut faire appel à Crypto BC pour chiffrer et/ou signer les logs | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | diff --git a/docs/fr/technical/reference-architecture/boundedContexts/commonTermsConventions/index.md b/docs/fr/technical/reference-architecture/boundedContexts/commonTermsConventions/index.md new file mode 100644 index 000000000..434b5903e --- /dev/null +++ b/docs/fr/technical/reference-architecture/boundedContexts/commonTermsConventions/index.md @@ -0,0 +1,19 @@ +# Termes et conventions communs utilisés + +L’équipe de l’Architecture de Référence a utilisé des termes et conventions communs tout au long de la conception et la documentation du modèle d’Architecture de Référence Mojaloop 2.0.

    Merci d’utiliser cette liste pour vous familiariser avec des termes qui pourraient vous sembler inconnus ou oubliés. La liste contient également des références à des articles et documents tiers disponibles dans la section “Pour aller plus loin” de ce document. + +| **Convention/Terme** | **Description** | +| :------------------- | :-------------- | +| **Acteurs** | Participant humain ou système externe à un Cas d’Utilisation. Tous les Cas d’Utilisation sont initiés par des Acteurs. | +| **BC** | Bounded Context : Un Contexte Borné est un composant du Design-Driven Development et contient généralement un ou plusieurs sous-domaines. Les Contextes Bornés sont des entités de l’Espace Solution, et contiennent une solution unique applicable à un ou plusieurs sous-domaines.

    (*Pour plus d’informations, voir : [Vue d’ensemble de l’Architecture inspirée du DDD](../../introduction/#ddd-inspired-architecture-overview) dans l’aperçu de l’Espace Solution, ou notre section [Pour aller plus loin : Articles et Documents de Référence](../../furtherReading/#reference-articles-and-documents)*)| +| **UC** | Cas d’Utilisation: Liste d’actions ou d’étapes décrivant les interactions entre un Acteur (humain ou système externe) et un système pour atteindre un objectif particulier. Un exemple dans Mojaloop serait : “Effectuer un transfert avec confirmation du bénéficiaire”.

    (*Pour plus d’informations, voir l’article Wikipédia “Use Case” cité dans la section [Pour aller plus loin : Articles et Documents de Référence](../../furtherReading/#reference-articles-and-documents) de ce document*)| +| **Sync** | Communications synchrones, unidirectionnelles ou bidirectionnelles, faisant partie du processus initial. Représentées par une ligne pleine dans les schémas de Cas d’Utilisation. Utilisées généralement pour les Messages devant impérativement figurer dans le workflow d’un UC pour assurer son exécution correcte. Exemple : une requête du BC Transferts vers le BC Gestion du Cycle de Vie des Participants pour obtenir des données Participant non présentes en cache lors d’une demande de transfert. | +| **Async** | Communications asynchrones, unidirectionnelles ou bidirectionnelles, ne faisant pas partie du processus initial. Signalées par une ligne pointillée dans les schémas UC. Utilisées principalement pour les Événements qui signalent qu’une action a eu lieu : c’est immuable et ne changera pas, comme les rapports de rappel (callback). | +| **POST** | Utilisé pour créer de nouvelles ressources. Plus précisément, pour créer des ressources subordonnées à une autre (ex. ressource “parent”). En créant une nouvelle ressource, on fait un POST sur le parent, le service l’associe au parent, lui attribue un identifiant (URI de la nouvelle ressource), etc. En cas de succès, le système renvoie un en-tête Location avec le lien de la ressource créée (HTTP 201).

    (*Pour plus d’informations, voir la référence “Restful API Tutor” dans la section [Pour aller plus loin : Articles et Documents de Référence](../../furtherReading/#reference-articles-and-documents) de ce document*)| +| **GET** | Utilisé pour lire (ou récupérer) la représentation d’une ressource. En cas de succès “normal”, GET retourne une représentation XML ou JSON et le code de réponse HTTP 200 (OK). En cas d’erreur, renvoie généralement un 404 (NOT FOUND) ou un 400 (BAD REQUEST).

    (*Pour plus d’informations, voir la référence “Restful API Tutor” dans la section [Pour aller plus loin : Articles et Documents de Référence](../../furtherReading/#reference-articles-and-documents) de ce document*)| +| **PUT** | Utilisé pour mettre à jour une ressource connue, en soumettant à son URI une nouvelle version complète via la requête. Dans certains cas, PUT peut également servir à créer de nouvelles ressources, mais en raison de la complexité, il est recommandé de privilégier POST pour cela.

    (*Pour plus d’informations, voir la référence “Restful API Tutor” dans la section [Pour aller plus loin : Articles et Documents de Référence](../../furtherReading/#reference-articles-and-documents) de ce document*)| +| **200 (OK)** | Code HTTP indiquant “Succès”. La requête a abouti. L’information retournée dépend généralement de la méthode HTTP employée : pour POST, la réponse décrit le résultat ; pour GET, la ressource demandée ; pour PUT, une réponse similaire à POST.

    (*Pour plus d’informations, voir la référence “Restful API Tutor” dans la section [Pour aller plus loin : Articles et Documents de Référence](../../furtherReading/#reference-articles-and-documents) de ce document*)| +| **201 (Created)** | Code HTTP indiquant “Créé” ou “satisfait”. La ressource demandée a été créée, consultable via l’URI renvoyée dans la réponse. Si la ressource ne peut être créée immédiatement, le serveur retourne un 202 (Accepted).

    (*Pour plus d’informations, voir la référence “Restful API Tutor” dans la section [Pour aller plus loin : Articles et Documents de Référence](../../furtherReading/#reference-articles-and-documents) de ce document*)| +| **202 (Accepted)** | Code HTTP indiquant que la requête a été acceptée pour traitement, mais n’est pas terminée. Elle peut ou non être traitée selon l’état du système. L’opération étant asynchrone, il n’y a pas de renvoi de code de statut selon l’issue de l’opération. La réponse doit donner un état du système, éventuellement un lien vers une plateforme de suivi ou une estimation du moment d’exécution.

    (*Pour plus d’informations, voir la référence “Restful API Tutor” dans la section [Pour aller plus loin : Articles et Documents de Référence](../../furtherReading/#reference-articles-and-documents) de ce document*)| +| **OHS** | Open Host Service : Documentation des méthodes à utiliser pour intégrer des systèmes aval (“downstream”) à une plateforme amont existante sans la modifier. Apporte généralement le support de multiples types de clients, sans se focaliser sur aucun : c’est au système aval de comprendre la documentation publiée par l’amont. OHS et PL sont couramment associés par les plateformes amont.

    Actuellement utilisé dans les entités suivantes : API externe FSPIOP, API externe ISO, Notifications & Alertes BC, API externe PISP ML, API externe PISP ISO, Scheduling BC, Transfers & Transactions BC, Quoting BC, Accounts & Balances BC, Settlements BC, Participant Lifecycle Management, Account Lookup & Discovery BC.

    (*Pour plus d’informations, voir la référence “Strategic Domain-Driven Design” dans la section [Pour aller plus loin : Articles et Documents de Référence](../../furtherReading/#reference-articles-and-documents) de ce document*)| +| **PL** | Published Language : Proche parent de l’Open Host Service et souvent utilisé conjointement. PL utilise un langage documenté, par exemple XML, pour les opérations basiques d’E/S du système cible. Aucun environnement ou bibliothèque spécifique n’est requis, tant que le langage publié est respecté. Le Published Language n’est pas exclusif aux web services : on peut par exemple déposer un fichier dans un dossier, déclenchant ainsi une opération qui le stocke à un emplacement pré-défini.

    Actuellement utilisé dans les entités suivantes : API externe FSPIOP ; API externe ISO.

    (*Pour plus d’informations, voir la référence “Strategic Domain-Driven Design” dans la section [Pour aller plus loin : Articles et Documents de Référence](../../furtherReading/#reference-articles-and-documents) de ce document*))| diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/0-0-0-notifications.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/0-0-0-notifications.jpg new file mode 100644 index 000000000..887629575 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/0-0-0-notifications.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/0-0-functional-overview.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/0-0-functional-overview.jpg new file mode 100644 index 000000000..e48567cd4 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/0-0-functional-overview.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/0-1-party-participant-associate.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/0-1-party-participant-associate.jpg new file mode 100644 index 000000000..a2568a5ac Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/0-1-party-participant-associate.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/0-2-party-participant-disassociate.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/0-2-party-participant-disassociate.jpg new file mode 100644 index 000000000..061048844 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/0-2-party-participant-disassociate.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/0-3-get-participant.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/0-3-get-participant.jpg new file mode 100644 index 000000000..4bc8cc587 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/0-3-get-participant.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/0-4-get-party.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/0-4-get-party.jpg new file mode 100644 index 000000000..55fcff12a Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/0-4-get-party.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/1-1-calculate-quote-happy-path.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/1-1-calculate-quote-happy-path.jpg new file mode 100644 index 000000000..4914c1d68 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/1-1-calculate-quote-happy-path.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/1-2-get-quote-happy-path.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/1-2-get-quote-happy-path.jpg new file mode 100644 index 000000000..b5c5b3316 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/1-2-get-quote-happy-path.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/1-3-calculate-quote-invalid-quote-request.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/1-3-calculate-quote-invalid-quote-request.jpg new file mode 100644 index 000000000..cfb317673 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/1-3-calculate-quote-invalid-quote-request.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/1-4-calculate-quote-invalid-fsps.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/1-4-calculate-quote-invalid-fsps.jpg new file mode 100644 index 000000000..5b67c0f66 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/1-4-calculate-quote-invalid-fsps.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/1-5-calculate-quote-invalid-scheme-rules-request.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/1-5-calculate-quote-invalid-scheme-rules-request.jpg new file mode 100644 index 000000000..d581b8c66 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/1-5-calculate-quote-invalid-scheme-rules-request.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/1-6-calculate-quote-invalid-scheme-rules-response.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/1-6-calculate-quote-invalid-scheme-rules-response.jpg new file mode 100644 index 000000000..a9c4f9a77 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/1-6-calculate-quote-invalid-scheme-rules-response.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-1-perform-transfer-universal-mode.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-1-perform-transfer-universal-mode.jpg new file mode 100644 index 000000000..3b467d937 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-1-perform-transfer-universal-mode.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-10-perform-transfer-duplicate-none-matching.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-10-perform-transfer-duplicate-none-matching.jpg new file mode 100644 index 000000000..29c57e3e6 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-10-perform-transfer-duplicate-none-matching.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-11-perform-transfer-payer-insuficiant-liquidity.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-11-perform-transfer-payer-insuficiant-liquidity.jpg new file mode 100644 index 000000000..26163264b Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-11-perform-transfer-payer-insuficiant-liquidity.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-12-perform-transfer-prepare-rejected.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-12-perform-transfer-prepare-rejected.jpg new file mode 100644 index 000000000..4183a0928 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-12-perform-transfer-prepare-rejected.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-13-perform-transfer-prepare-validation-failure-invalid-payer-participant.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-13-perform-transfer-prepare-validation-failure-invalid-payer-participant.jpg new file mode 100644 index 000000000..b53949758 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-13-perform-transfer-prepare-validation-failure-invalid-payer-participant.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-14-perform-transfer-prepare-validation-failure-invalid-payee-participant.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-14-perform-transfer-prepare-validation-failure-invalid-payee-participant.jpg new file mode 100644 index 000000000..13a4f7c4a Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-14-perform-transfer-prepare-validation-failure-invalid-payee-participant.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-2-perform-transfer-payee-confirmation.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-2-perform-transfer-payee-confirmation.jpg new file mode 100644 index 000000000..245172f56 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-2-perform-transfer-payee-confirmation.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-3-query-get-transfer.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-3-query-get-transfer.jpg new file mode 100644 index 000000000..27f9b5405 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-3-query-get-transfer.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-4-perform-transfer-duplicate-post.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-4-perform-transfer-duplicate-post.jpg new file mode 100644 index 000000000..ef3cfc3dc Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-4-perform-transfer-duplicate-post.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-5-perform-transfer-duplicate-post-ignor.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-5-perform-transfer-duplicate-post-ignor.jpg new file mode 100644 index 000000000..a7a8cdabd Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-5-perform-transfer-duplicate-post-ignor.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-6-perform-transfer-payeefsp-rejects-transfer.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-6-perform-transfer-payeefsp-rejects-transfer.jpg new file mode 100644 index 000000000..f08f8c2fc Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-6-perform-transfer-payeefsp-rejects-transfer.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-7-perform-transfer-timeout-prepare.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-7-perform-transfer-timeout-prepare.jpg new file mode 100644 index 000000000..f21f280b7 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-7-perform-transfer-timeout-prepare.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-8-perform-transfer-timeout-pre-committed.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-8-perform-transfer-timeout-pre-committed.jpg new file mode 100644 index 000000000..118dbdb1f Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-8-perform-transfer-timeout-pre-committed.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-9-perform-transfer-timeout-post-commit.jpg b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-9-perform-transfer-timeout-post-commit.jpg new file mode 100644 index 000000000..1f88fa39b Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/assets/2-9-perform-transfer-timeout-post-commit.jpg differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/index.md b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/index.md new file mode 100644 index 000000000..2e85030ca --- /dev/null +++ b/docs/fr/technical/reference-architecture/boundedContexts/fspInteropApi/index.md @@ -0,0 +1,377 @@ +# BC de l'API d'Interopérabilité FSP + +Le Contexte Borné de l'API d'Interopérabilité FSP (FSP Interoperability API Bounded Context) permet l'accès aux opérations internes et aux ressources que l'écosystème Mojaloop met à la disposition d'un Participant donné. Ce Contexte Borné est responsable de fournir à un Participant des interfaces lui permettant d'exécuter des actions sur Mojaloop. Il est également responsable de la communication vers le Participant concernant différentes notifications et messages système que ce dernier doit recevoir. + +## Vue Fonctionnelle + +L'API FSP IOP interagit avec de nombreux autres contextes bornés, une vue simplifiée est donc présentée ici. Pour une lecture approfondie sur les événements, connexions que l'API FSP IOP fournit ou consomme, veuillez consulter les Interfaces Communes Mojaloop [^1]. Les contextes bornés intégrés avec l'API FSP IOP sont : + +- Contexte borné de Recherche et Découverte de Compte [^14] +- Contexte borné des Notifications et Alertes [^27] +- Contexte borné de Gestion du Cycle de Vie du Participant [^26] +- Contexte borné de Devis/Accords [^19] +- Contexte borné des Transferts [^22] +- Contexte borné de Règlement [^21] + +![Cas d'Usage - Vue Fonctionnelle de l'API d'Interopérabilité FSP](./assets/0-0-functional-overview.jpg) + +> Vue Fonctionnelle de l'API d'Interopérabilité FSP + +## Termes + +Termes ayant une signification spécifique et reconnue dans le contexte borné où ils sont utilisés. + +| Terme | Description | +| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **(D)FSP** | Fournisseur de Services Financiers (Digitaux) | +| **Participant** | Fournisseur de Services Financiers (FSP) enregistré dans l'écosystème Mojaloop, pouvant ainsi effectuer des transactions avec d'autres Participants | +| **FSP IOP API** | Interface API d'Interopérabilité des FSP, qui donne accès aux fonctions de l'écosystème Mojaloop | +| **Payeur** | Le payeur des fonds électroniques dans une transaction de paiement | +| **FSP du Payeur** | Fournisseur de Services Financiers du payeur | +| **Bénéficiaire** | Le destinataire des fonds électroniques dans une transaction de paiement | +| **FSP du Bénéficiaire** | Fournisseur de Services Financiers du bénéficiaire | + +## Cas d'Utilisation + +### Remarque + +Les définitions des cas d'utilisation stipulées dans la Spécification Open API pour FSP Interoperability [^2] n'ont pas été modifiées. L'Architecture de Référence a été conçue pour ne changer que l'orchestration interne des services Mojaloop et des Contextes Bornés. + +### BC Notifications - Envoi de Notification + +#### Description + +Les notifications concernent TOUS les cas d'utilisation ci-dessous en réponse à des demandes reçues sous différentes formes. Pendant que l'API FSP IOP traite une demande, elle peut devoir envoyer une requête au DFSP demandeur ou à d'autres DFSP concernés. L'API FSP IOP interrogera alors le Contexte Borné de Gestion du Cycle de Vie du Participant [^26] pour obtenir l'URI de rappel du participant destinataire. L'API FSP IOP enverra ensuite la notification au Contexte Borné Notifications et Alertes [^27]. + +#### Schéma de Flux + +![Cas d'Usage - BC Notifications - Envoi de Notification](./assets/0-0-0-notifications.jpg) + +> + +## BC Recherche et Découverte de Compte + +### Association d'une Partie/Participant + +#### Description + +Associer un ou plusieurs Participants et/ou parties avec la requête POST Participant [^5] (POST /participants/{Type}/{ID}). L'API FSP IOP envoie la requête au BC de Recherche et Découverte de Compte [^14] qui la traite et répond par un évènement de succès. L'API FSP IOP envoie ensuite une réponse de notification PUT Participant [^15] (PUT /participants/{Type}/{ID}). + +#### Schéma de Flux + +![Cas d'Usage - BC Recherche et Découverte de Compte - Association d'une Partie/Participant](./assets/0-1-party-participant-associate.jpg) + +> + +### Dissociation d'une Partie/Participant + +#### Description + +Dissocier un ou plusieurs Participants ou parties à l'aide de la requête DELETE Participant [^6] (DELETE /participants/{Type}/{ID}). L'API FSP IOP envoie la requête au BC de Recherche et Découverte de Compte [^14] pour dissocier la partie. Le succès est renvoyé à l'API FSP IOP qui notifie l'appelant avec une réponse de notification PUT Participant [^15] (PUT /participants/{Type}/{ID}). + +#### Schéma de Flux + +![Cas d'Usage - BC Recherche et Découverte de Compte - Dissociation d'une Partie/Participant](./assets/0-2-party-participant-disassociate.jpg) + +> + +### Obtenir un Participant + +#### Description + +Récupérer les informations d'un participant grâce à la requête GET Participant [^7] (GET /participants/{Type}/{ID}) qui envoie l'ID et la structure. L'API FSP IOP envoie la requête au BC de Recherche et Découverte de Compte [^14] pour vérifier si le participant existe. L'API FSP IOP répond alors au demandeur avec une réponse PUT Participant [^15] (PUT /participants/{Type}/{ID}). + +#### Schéma de Flux + +![Cas d'Usage - BC Recherche et Découverte de Compte - Obtenir un Participant](./assets/0-3-get-participant.jpg) + +> + +### Obtenir une Partie + +#### Description + +Récupérer les informations d'une partie via l'ID avec la requête GET Party [^8] (GET /parties/{Type}/{ID}). L'API FSP IOP envoie une requête au BC de Recherche et Découverte de Compte [^14] pour déterminer le FSP cible pour le transfert de la requête GET. Le FSP cible répond avec une requête PUT parties. L'information est ensuite envoyée au BC pour être mise en cache avant que la réponse PUT Party [^17] (PUT /parties/{Type}/{ID}) ne soit renvoyée à l'émetteur de la requête GET. + +#### Schéma de Flux + +![Cas d'Usage - BC Recherche et Découverte de Compte - Obtenir une Partie](./assets/0-4-get-party.jpg) + +> + +## BC Devis (Quoting) + +### Calculer un Devis - Parcours Nominal + +#### Description + +Lorsqu'un devis est envoyé via un POST Quote [^3] (POST /quotes), l'API FSP IOP transmet la demande au BC Quoting/Agreement [^19] pour validation. L'API FSP IOP transmet ensuite le POST Quote au FSP bénéficiaire, qui répond à son tour avec une réponse PUT Quote [^18] (PUT /quotes/{ID}) avec les informations mises à jour. L'API FSP IOP envoie le devis accepté au BC Quoting/Agreement [^19] pour l'enregistrement, puis envoie la requête PUT quote au FSP payeur et considère le devis réussi. + +#### Schéma de Flux + +![Cas d'Usage - BC Devis - Calculer un Devis - Parcours Nominal](./assets/1-1-calculate-quote-happy-path.jpg) + +> + +### Obtenir un Devis - Parcours Nominal + +#### Description + +Permet à un FSP de récupérer les détails d'un devis existant. La requête GET Quote [^4] (GET /quotes/{ID}) est envoyée à l'API FSP IOP qui interroge le BC Quoting/Agreement [^19] pour les devis existants. Une fois le devis récupéré, les informations sont renvoyées au FSP demandeur via une réponse PUT Quote [^18] (PUT /quotes/{ID}). + +#### Schéma de Flux + +![Cas d'Usage - BC Devis - Obtenir un Devis - Parcours Nominal](./assets/1-2-get-quote-happy-path.jpg) + +> + +### Calculer un Devis - Demande de Devis Invalide + +#### Description + +Lorsqu'une requête POST Quote [^3] (POST /quotes) est reçue, l'API FSP IOP l'envoie au BC Quoting/Agreement [^19] pour traitement. Si le devis échoue à la validation, le BC Quoting/Agreement retourne une erreur, notifiée au FSP demandeur via PUT Quote Error [^20] (PUT /quotes/{ID}/error). + +#### Schéma de Flux + +![Cas d'Usage - BC Devis - Calculer un Devis - Demande de Devis Invalide](./assets/1-3-calculate-quote-invalid-quote-request.jpg) + +> + +### Calculer un Devis - Participants FSP Invalides + +#### Description + +Si une requête POST Quote [^3] (POST /quotes) est envoyée et que le BC Quoting/Agreement [^19] ne peut valider les deux FSP, une réponse d'erreur est envoyée à l'API FSP IOP qui la notifie au FSP demandeur via PUT Quote Error [^20] (PUT /quotes/{ID}/error). + +#### Schéma de Flux + +![Cas d'Usage - BC Devis - Calculer un Devis - Participants FSP Invalides](./assets/1-4-calculate-quote-invalid-fsps.jpg) + +> + +### Calculer un Devis - Règles de Schéma Invalides détectées dans la Requête + +#### Description + +Quand le FSP Payeur envoie une requête POST Quote [^3] (POST /quotes), l'API FSP IOP l'envoie au BC Quoting/Agreement [^19]. Si le devis n'est pas conforme aux règles du schéma, une erreur est renvoyée à l'API FSP IOP qui la notifie au FSP Payeur via PUT Quote Error [^20] (PUT /quotes/{ID}/error). + +#### Schéma de Flux + +![Cas d'Usage - BC Devis - Calculer un Devis - Règles de Schéma Invalides détectées dans la Requête](./assets/1-5-calculate-quote-invalid-scheme-rules-request.jpg) + +> + +### Calculer un Devis - Règles de Schéma Invalides détectées dans la Réponse + +#### Description + +Lorsque le FSP Payeur envoie une requête POST Quote [^3] (POST /quotes), l'API FSP IOP l'envoie au BC Quoting/Agreement [^19]. Si la réponse du FSP bénéficiaire (PUT Quote [^18]) échoue aux validations de schéma, une erreur est envoyée à l'API FSP IOP, qui notifie les deux FSP via PUT Quote Error [^20] (PUT /quotes/{ID}/error). + +#### Schéma de Flux + +![Cas d'Usage - BC Devis - Calculer un Devis - Règles de Schéma Invalides détectées dans la Réponse](./assets/1-6-calculate-quote-invalid-scheme-rules-response.jpg) + +> BC Devis - Calculer un Devis - Règles de Schéma Invalides détectées dans la Réponse + +## BC des Transferts + +### Réaliser un Transfert (Mode Universel) + +#### Description + +Le FSP Payeur envoie une requête POST Transfers [^9] (POST /transfers) à l'API FSP IOP. Celle-ci envoie ensuite un évènement au BC des Règlements [^21]. L'API FSP IOP attend un évènement du BC des Transferts [^22] signalant que le transfert a été préparé, pour envoyer une requête POST au FSP Bénéficiaire. Celui-ci répond avec une requête PUT Transfers [^23] (PUT /transfers/{ID}) (transferState = committed) à l'API FSP IOP qui finalise l'exécution. Le PUT transfer est ensuite envoyé au FSP Payeur. + +#### Schéma de Flux + +![Cas d'Usage - BC Transferts - Réaliser un Transfert (Mode Universel)](./assets/2-1-perform-transfer-universal-mode.jpg) + +> + +### Réaliser un Transfert avec Confirmation du Bénéficiaire + +#### Description + +Le FSP Payeur envoie une requête POST Transfers [^9] (POST /transfers) à l'API FSP IOP. Celle-ci envoie un évènement au BC des Règlements [^21]. L'API FSP IOP attend l'évènement du BC des Transferts [^22], puis émet un POST vers le FSP Bénéficiaire. Celui-ci répond avec un PUT Transfers [^23] (PUT /transfers/{ID}) (transferState = reserved). Le PUT transfer est ensuite envoyé au FSP Payeur. Le FSP Bénéficiaire reçoit alors un PATCH Transfers [^24] (PATCH /transfers/{ID}) pour notifier le changement d'état. + +#### Schéma de Flux + +![Cas d'Usage - BC Transferts - Réaliser un Transfert avec Confirmation du Bénéficiaire](./assets/2-2-perform-transfer-payee-confirmation.jpg) + +> + +### Requête Get Transfer + +#### Description + +Obtention des infos sur un transfert selon l'ID utilisé dans GET Transfer [^11] (GET /transfers/{ID}), puis réception du PUT Transfers [^23] (PUT /transfers/{ID}) pour obtenir les informations pertinentes. + +#### Schéma de Flux + +![Cas d'Usage - BC Transferts - Requête Get Transfer](./assets/2-3-query-get-transfer.jpg) + +> + +### Réaliser un Transfert - Post Doublon (Nouvel Envoi) + +#### Description + +Une requête POST Transfers [^9] (POST /transfers) a déjà été traitée, un rapport de statut est retourné au FSP Payeur via PUT Transfers [^23] (PUT /transfers/{ID}). + +#### Schéma de Flux + +![Cas d'Usage - BC Transferts - Réaliser un Transfert - Post Doublon (Nouvel Envoi)](./assets/2-4-perform-transfer-duplicate-post.jpg) + +> BC Transferts - Réaliser un Transfert - Post Doublon (Nouvel Envoi) + +### Réaliser un Transfert - Post Doublon (Ignoré) + +#### Description + +Une requête POST Transfers [^9] (POST /transfers) a déjà été traitée mais aucune réponse n'est nécessaire ou attendue. + +#### Schéma de Flux + +![Cas d'Usage - BC Transferts - Réaliser un Transfert - Post Doublon (Ignoré)](./assets/2-5-perform-transfer-duplicate-post-ignor.jpg) + +> + +### Réaliser un Transfert - DFSP Bénéficiaire Rejette le Transfert + +#### Description + +Le FSP Payeur envoie une requête POST Transfers [^9] (POST /transfers) à l'API FSP IOP. Celle-ci prépare le transfert puis envoie la requête POST au FSP Bénéficiaire. Celui-ci rejette le transfert via une requête PUT Transfer Error [^25] (PUT /transfers/{ID}/error). L'API FSP IOP notifie alors le BC des Transferts [^22] que le transfert est rejeté et envoie une requête PUT Transfer Error [^25] (PUT /transfers/{ID}/error) au FSP Payeur. + +#### Schéma de Flux + +![Cas d'Usage - BC Transferts - Réaliser un Transfert - DFSP Bénéficiaire Rejette le Transfert](./assets/2-6-perform-transfer-payeefsp-rejects-transfer.jpg) + +> + +### Réaliser un Transfert - Timeout (Préparation) + +#### Description + +Une requête POST Transfers [^9] (POST /transfers) est rejetée car le transfert expire [^13] lors de la préparation des fonds. L'API FSP IOP envoie une requête PUT Transfer Error [^25] (PUT /transfers/{ID}/error) au FSP Payeur pour signaler l'erreur. + +#### Schéma de Flux + +![Cas d'Usage - BC Transferts - Réaliser un Transfert - Timeout (Préparation)](./assets/2-7-perform-transfer-timeout-prepare.jpg) + +> + +### Réaliser un Transfert - Timeout (Pré-Engagé) + +#### Description + +Le FSP Payeur envoie une requête POST Transfers [^9] (POST /transfers) à l'API FSP IOP, qui envoie un évènement au BC des Règlements [^21]. L'API FSP IOP attend un évènement du BC des Transferts [^22] indiquant la préparation du transfert avant de le transmettre au FSP Bénéficiaire. Celui-ci répond avec PUT Transfers [^23] (PUT /transfers/{ID}) (transferState = committed). Si le transfert expire [^13] pendant/avant l'engagement des fonds, les deux FSP sont alors notifiés de l'échec via PUT Transfer Error [^25] (PUT /transfers/{ID}/error). + +#### Schéma de Flux + +![Cas d'Usage - BC Transferts - Réaliser un Transfert - Timeout (Pré-Engagé)](./assets/2-8-perform-transfer-timeout-pre-committed.jpg) + +> + +### Réaliser un Transfert - Timeout (Post-Engagé) + +#### Description + +Le FSP Payeur envoie une requête POST Transfers [^9] (POST /transfers) à l'API FSP IOP. Celle-ci envoie un évènement au BC des Règlements [^21]. L'API FSP IOP attend la préparation depuis le BC des Transferts [^22], puis transmet le POST au FSP Bénéficiaire qui répond par PUT Transfers [^23] (disant que le transfert est engagé – transferState = committed). Après validation, le transfert expire [^13]; le transfert est alors considéré rejeté. + +#### Schéma de Flux + +![Cas d'Usage - BC Transferts - Réaliser un Transfert - Timeout (Post-Engagé)](./assets/2-9-perform-transfer-timeout-post-commit.jpg) + +> + +### Réaliser un Transfert - Post Doublon (Aucun correspondant) + +#### Description + +Une requête POST Transfers [^9] (POST /transfers) déjà traitée ; un rapport d'état est retourné au FSP Payeur via une requête PUT Transfer Error [^25] (PUT /transfers/{ID}/error). + +#### Schéma de Flux + +![Cas d'Usage - Ex. À REMPLACER](./assets/2-10-perform-transfer-duplicate-none-matching.jpg) + +> + +### Réaliser un Transfert - Liquidité Insuffisante du FSP Payeur + +#### Description + +Le FSP Payeur envoie une requête POST Transfers [^9] (POST /transfers) à l'API FSP IOP. Celle-ci émet un évènement au BC des Règlements [^21]. Après avoir reçu l'indication de préparation depuis le BC des Transferts [^22], un échec de contrôle de liquidité est détecté pour le FSP Payeur. L'API FSP OIP envoie alors une requête PUT Transfer Error [^25] au FSP Payeur. + +#### Schéma de Flux + +![Cas d'Usage - BC Transferts - Liquidité Insuffisante du FSP Payeur](./assets/2-11-perform-transfer-payer-insuficiant-liquidity.jpg) + +> + +### Réaliser un Transfert - Préparation Rejetée + +#### Description + +Le FSP Payeur envoie une requête POST Transfers [^9] (POST /transfers) à l'API FSP IOP. Celle-ci prépare le transfert puis envoie le POST au FSP Bénéficiaire. Celui-ci décline le transfert avec une requête PUT Transfer Error [^25] (PUT /transfers/{ID}/error). L'API FSP IOP notifie alors le BC Transferts [^22] que le transfert a été rejeté et envoie une requête PUT Transfer Error [^25] (PUT /transfers/{ID}/error) au FSP Payeur. + +#### Schéma de Flux + +![Cas d'Usage - BC Transferts - Préparation Rejetée](./assets/2-12-perform-transfer-prepare-rejected.jpg) + +> + +### Réaliser un Transfert - Échec de Validation à la Préparation (Participant Payeur Invalide) + +#### Description + +Le FSP Payeur envoie une requête POST Transfers [^9] (POST /transfers) à l'API FSP IOP. Le BC Transferts [^22] signale à l'API FSP IOP que le FSP Payeur est invalide. Selon le motif, l'API FSP IOP enverra une requête PUT Transfer Error [^25] (PUT /transfers/{ID}/error) au FSP Payeur. + +#### Schéma de Flux + +![Cas d'Usage - BC Transferts - Échec de Validation à la Préparation (Participant Payeur Invalide)](./assets/2-13-perform-transfer-prepare-validation-failure-invalid-payer-participant.jpg) + +> + +### Réaliser un Transfert - Échec de Validation à la Préparation (Participant Bénéficiaire Invalide) + +#### Description + +Le FSP Payeur envoie une requête POST Transfers [^9] (POST /transfers) à l'API FSP IOP. Le BC Transferts [^22] signale à l'API FSP IOP que le FSP Bénéficiaire est invalide. L'API FSP IOP enverra une requête PUT Transfer Error [^25] (PUT /transfers/{ID}/error) au FSP Payeur pour l'informer de l'échec. + +#### Schéma de Flux + +![Cas d'Usage - BC Transferts - Échec de Validation à la Préparation (Participant Bénéficiaire Invalide)](./assets/2-14-perform-transfer-prepare-validation-failure-invalid-payee-participant.jpg) + +> + +## Notes + +### Validation de la structure sur les événements internes + +De nombreux cas d'utilisation stipulent que la structure et la sémantique de la requête doivent être validées lors de la réception d'un événement provenant d'un contexte borné interne. Cela ne se produit pas à chaque requête, mais est une exigence à respecter lors de la construction de l'architecture de référence. Cela signifie qu'en interne, tous les événements et ressources disponibles doivent être standardisés et vérifiés. + +[^1]: [Liste des Interfaces Communes Mojaloop](../../commonInterfaces.md) +[^2]: [Documentation Open API pour la Spécification d'Interopérabilité FSP](https://docs.mojaloop.io/mojaloop-specification/) +[^3]: [Post Quote - Définition](https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#6532-post-quotes) +[^4]: [Get Quote - Définition](https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#6531-get-quotesid) +[^5]: [Post Participant - Définition](https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#6233-post-participantstypeid) +[^6]: [Delete Participant - Définition](https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#6234-delete-participantstypeid) +[^7]: [Get Participant - Définition](https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#6231-get-participantstypeid) +[^8]: [Get Parties - Définition](https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#6331-get-partiestypeid) +[^9]: [Post Transfers - Définition](https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#6732-post-transfers) +[^10]: [Commit Notification - Définition](https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#6726-commit-notification) +[^11]: [Get Transfers - Définition](https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#6731-get-transfersid) +[^12]: [Transaction Irrevocability - Définition](https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.#6722-transaction-irrevocability) +[^13]: [Transfers Timeout and Expiry - Définition](https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#6724-timeout-and-expiry) +[^14]: [Contexte borné de Recherche et Découverte de Compte](../accountLookupAndDiscovery/index.md) +[^15]: [Put Participant - Définition](https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#6242-put-participantsid) +[^17]: [Put Party- Définition](https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#6341-put-partiestypeid) +[^18]: [Put Quote - Définition](https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#6541-put-quotesid) +[^19]: [Contexte borné Devis/Accord](../quotingAgreement/index.md) +[^20]: [Put Quote Error - Définition](https://docs.mojmojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#6551-put-quotesiderror) +[^21]: [Contexte borné Règlements](../settlements/index.md) +[^22]: [Contexte borné Transferts](../transfers/index.md) +[^23]: [Put Transfers - Définition](https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#6741-put-transfersid) +[^24]: [Patch Transfers - Définition](https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#6733-patch-transfersid) +[^25]: [Put Transfers Error - Définition](https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#6751-put-transfersiderror) +[^26]: [Contexte borné Gestion du Cycle de Vie du Participant](../participantLifecycleManagement/index.md) +[^27]: [Contexte borné Notifications et Alertes](../notificationsAndAlerts/index.md) diff --git a/docs/fr/technical/reference-architecture/boundedContexts/index.md b/docs/fr/technical/reference-architecture/boundedContexts/index.md new file mode 100644 index 000000000..f2adb3565 --- /dev/null +++ b/docs/fr/technical/reference-architecture/boundedContexts/index.md @@ -0,0 +1,23 @@ +# Contexte Borné + +Dans cette section, nous examinons en détail chacun des Contextes Bornés identifiés, en indiquant leur objectif (description), les sous-domaines couverts, les cas d’utilisation que chaque Contexte Borné traite, ainsi que des remarques de conclusion le cas échéant. + + \ No newline at end of file diff --git a/docs/fr/technical/reference-architecture/boundedContexts/logging/assets/ML2RA_Logging_ucEventBasedLogging_Apr22-b-1450.png b/docs/fr/technical/reference-architecture/boundedContexts/logging/assets/ML2RA_Logging_ucEventBasedLogging_Apr22-b-1450.png new file mode 100644 index 000000000..577e56490 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/logging/assets/ML2RA_Logging_ucEventBasedLogging_Apr22-b-1450.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/logging/index.md b/docs/fr/technical/reference-architecture/boundedContexts/logging/index.md new file mode 100644 index 000000000..c30e303d7 --- /dev/null +++ b/docs/fr/technical/reference-architecture/boundedContexts/logging/index.md @@ -0,0 +1,20 @@ +# BC Journalisation (Logging) + +Le Contexte Borné de Journalisation (Logging BC) est utilisé pour stocker des informations techniques afin de faciliter le débogage, la recherche de pannes et la résolution des problèmes. Les journaux (logs) sont récupérés depuis n'importe quel autre Contexte Borné [^1] et stockés afin de pouvoir être interrogés ou utilisés pour des rapports. Les informations de journalisation sont considérées comme des « données techniques » ; toute éventuelle perte de ces informations ne devrait avoir pour conséquence que la perte de capacité technique à comprendre le comportement du système. Toutes les activités système sont journalisées et conservées, afin de permettre au Contexte Borné d’Audit [^2] d’effectuer des requêtes sur ces données de log. + +Les Contextes Bornés doivent publier les événements dans un format défini et en utilisant le mécanisme disponible fourni par le BC Journalisation. La structure inclut implicitement une couche d’abstraction appliquée à l’événement reçu par le BC Journalisation, qui est alors utilisée pour persister les données de log. + +## Cas d’Utilisation + +### Journalisation Basée sur les Événements + +#### Diagramme de flux + +![Cas d’Utilisation – Journalisation Basée sur les Événements](./assets/ML2RA_Logging_ucEventBasedLogging_Apr22-b-1450.png) +>Diagramme de Workflow UC : Journalisation basée sur les événements + + +## Notes + +[^1] : [Liste des Interfaces Communes Mojaloop](../../refarch/commonInterfaces.md) +[^2] : [Contexte Borné Auditing](../auditing/index.md) diff --git a/docs/fr/technical/reference-architecture/boundedContexts/notificationsAndAlerts/assets/alertNotification.png b/docs/fr/technical/reference-architecture/boundedContexts/notificationsAndAlerts/assets/alertNotification.png new file mode 100644 index 000000000..607842c5a Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/notificationsAndAlerts/assets/alertNotification.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/notificationsAndAlerts/assets/alertRegistration.png b/docs/fr/technical/reference-architecture/boundedContexts/notificationsAndAlerts/assets/alertRegistration.png new file mode 100644 index 000000000..754ec79dc Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/notificationsAndAlerts/assets/alertRegistration.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/notificationsAndAlerts/assets/sendAsyncNotificationWithDeliveryReport.png b/docs/fr/technical/reference-architecture/boundedContexts/notificationsAndAlerts/assets/sendAsyncNotificationWithDeliveryReport.png new file mode 100644 index 000000000..b858925b7 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/notificationsAndAlerts/assets/sendAsyncNotificationWithDeliveryReport.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/notificationsAndAlerts/assets/sendSyncNotificationWithDeliveryReport.png b/docs/fr/technical/reference-architecture/boundedContexts/notificationsAndAlerts/assets/sendSyncNotificationWithDeliveryReport.png new file mode 100644 index 000000000..b188e7f71 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/notificationsAndAlerts/assets/sendSyncNotificationWithDeliveryReport.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/notificationsAndAlerts/index.md b/docs/fr/technical/reference-architecture/boundedContexts/notificationsAndAlerts/index.md new file mode 100644 index 000000000..2815cf513 --- /dev/null +++ b/docs/fr/technical/reference-architecture/boundedContexts/notificationsAndAlerts/index.md @@ -0,0 +1,62 @@ +# BC Notifications et Alertes + +Le BC Notifications et Alertes agit comme le moteur de notification de la plateforme Mojaloop. Il fournit des capacités complémentaires pour les callbacks FSPIOP fiables en veillant à ce que des rapports de livraison soient disponibles, à des fins de compensation et d’audit. De même, ces capacités peuvent être utilisées pour envoyer des alertes de manière fiable à des sous-systèmes internes ou à des consommateurs externes. + +La fiabilité est assurée par plusieurs mécanismes : + +- Chaque commande de Notification contient : + - toutes les informations nécessaires (en-têtes, payload, transport, etc.) requises par le BC pour effectuer la livraison + - une configuration de reprise et de livraison précisant comment le BC Notifications doit gérer les échecs de livraison +- Les rapports de Notification ou d’Alerte sont conservés et peuvent être interrogés. + +## Termes + +Termes ayant une signification spécifique et communément admise dans le Contexte Borné où ils sont utilisés. + +| Terme | Description | +|---|---| +| **Notification** | Notification sortante envoyée par le BC Notifications et Alertes, généralement vers une destination externe, contenant des en-têtes contextuels et des charges utiles. Un exemple en est les callbacks FSPIOP dans le cadre de la spécification d’API Mojaloop. | +| **Alerte** | Similaire à une notification, mais une alerte sert généralement à informer des sous-systèmes internes (c.-à-d. d’autres BC) ou un opérateur de hub d’un « événement canonique » observé. Un exemple serait qu'un FSP a dépassé sa liquidité disponible. | +| **Rapport de Livraison** | Rapport produit par le BC Notifications et Alertes contenant des informations de livraison relatives à une Notification ou une Alerte spécifique, telles que le statut de livraison, la réponse reçue par la destination, le nombre de tentatives, ainsi que les informations sur les échecs. Ce rapport peut être généré sous la forme d’un événement du domaine, et/ou une réponse synchrone à une requête API. | +| **Événement Canonique** | Désigne tout événement de domaine produit par un Contexte Borné. | + +## Cas d'Utilisation + +### Envoi de notifications asynchrones avec rapport de livraison + +#### Diagramme de flux + +![Cas d’utilisation - Envoi de notifications asynchrones avec rapport de livraison](./assets/sendAsyncNotificationWithDeliveryReport.png) + +### Envoi de notifications synchrones avec rapport de livraison + +#### Diagramme de flux + +![Cas d’utilisation - Envoi de notifications synchrones avec rapport de livraison](./assets/sendSyncNotificationWithDeliveryReport.png) + + + +### Enregistrement d’alerte + +#### Description + +Les opérateurs du hub ou les sous-systèmes pourront appeler l’API d’enregistrement d’alerte pour s’abonner à des alertes de notification spécifiques. L’opération AlertRegister inclura : + +- Message/Événement de domaine à surveiller +- Informations de point de terminaison / transport pour la livraison de la notification +- Modèle pour l’alerte qui sera utilisé pour générer la notification réelle + +#### Diagramme de flux + +![Cas d’utilisation - Envoi de notifications synchrones avec rapport de livraison](./assets/alertRegistration.png) + +### Notifications d’alerte + +#### Diagramme de flux + +![Cas d’utilisation - Envoi de notifications synchrones avec rapport de livraison](./assets/alertNotification.png) + + + diff --git a/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-bcOverviewFlowDiagram_Apr22-a_1429.png b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-bcOverviewFlowDiagram_Apr22-a_1429.png new file mode 100644 index 000000000..c16848a1b Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-bcOverviewFlowDiagram_Apr22-a_1429.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucAddParticipantAccountAppro_Apr22-a_P2-1429.png b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucAddParticipantAccountAppro_Apr22-a_P2-1429.png new file mode 100644 index 000000000..adbfe0d98 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucAddParticipantAccountAppro_Apr22-a_P2-1429.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucAddParticipantAccountInit_Apr22-a_P1-1429.png b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucAddParticipantAccountInit_Apr22-a_P1-1429.png new file mode 100644 index 000000000..ec745aaa8 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucAddParticipantAccountInit_Apr22-a_P1-1429.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucCreateParticipantAppro_Apr22-a_P2-1429.png b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucCreateParticipantAppro_Apr22-a_P2-1429.png new file mode 100644 index 000000000..b4abeaf4f Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucCreateParticipantAppro_Apr22-a_P2-1429.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucCreateParticipantInit_Apr22-a_P1-1429.png b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucCreateParticipantInit_Apr22-a_P1-1429.png new file mode 100644 index 000000000..177241a98 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucCreateParticipantInit_Apr22-a_P1-1429.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucGetParticipant_Apr22-a_1429.png b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucGetParticipant_Apr22-a_1429.png new file mode 100644 index 000000000..eea3ac385 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucGetParticipant_Apr22-a_1429.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucLiquidityCoverQuery_Apr22-a_1429.png b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucLiquidityCoverQuery_Apr22-a_1429.png new file mode 100644 index 000000000..bc50ae969 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucLiquidityCoverQuery_Apr22-a_1429.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucLiquidityCoverReserveAppro_Apr22-a_P2-1429.png b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucLiquidityCoverReserveAppro_Apr22-a_P2-1429.png new file mode 100644 index 000000000..109050536 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucLiquidityCoverReserveAppro_Apr22-a_P2-1429.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucLiquidityCoverReserveInit_Apr22-a_P1-1429.png b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucLiquidityCoverReserveInit_Apr22-a_P1-1429.png new file mode 100644 index 000000000..bd4f49e56 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucLiquidityCoverReserveInit_Apr22-a_P1-1429.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucLiquidityLimit&ThresholdReset_Apr22-a_1429.png b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucLiquidityLimit&ThresholdReset_Apr22-a_1429.png new file mode 100644 index 000000000..3bcd8009c Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucLiquidityLimit&ThresholdReset_Apr22-a_1429.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucLiquidityLimitedExceeded_Apr22-a_1429.png b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucLiquidityLimitedExceeded_Apr22-a_1429.png new file mode 100644 index 000000000..d3b2129d3 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucLiquidityLimitedExceeded_Apr22-a_1429.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucLiquidityThresholdExceeded_Apr22-a_1429.png b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucLiquidityThresholdExceeded_Apr22-a_1429.png new file mode 100644 index 000000000..a833e5ae6 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucLiquidityThresholdExceeded_Apr22-a_1429.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucManageFundsAppro_Apr22-a_P2-1429.png b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucManageFundsAppro_Apr22-a_P2-1429.png new file mode 100644 index 000000000..4d429dc37 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucManageFundsAppro_Apr22-a_P2-1429.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucManageFundsInit_Apr22-a_P1-1429.png b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucManageFundsInit_Apr22-a_P1-1429.png new file mode 100644 index 000000000..fcde920b2 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucManageFundsInit_Apr22-a_P1-1429.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucUpdateEndpointAppro_Apr22-a_P2-1429.png b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucUpdateEndpointAppro_Apr22-a_P2-1429.png new file mode 100644 index 000000000..26d13ab31 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucUpdateEndpointAppro_Apr22-a_P2-1429.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucUpdateEndpointsInit_Apr22-a_P1-1429.png b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucUpdateEndpointsInit_Apr22-a_P1-1429.png new file mode 100644 index 000000000..b9e206363 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucUpdateEndpointsInit_Apr22-a_P1-1429.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucUpdateParticipantStatusAppro_Apr22-a_P2-1429.png b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucUpdateParticipantStatusAppro_Apr22-a_P2-1429.png new file mode 100644 index 000000000..54033e161 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucUpdateParticipantStatusAppro_Apr22-a_P2-1429.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucUpdateParticipantStatusInit_Apr22-a_P1-1429.png b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucUpdateParticipantStatusInit_Apr22-a_P1-1429.png new file mode 100644 index 000000000..be01060f0 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/assets/ML2RA_PLM-ucUpdateParticipantStatusInit_Apr22-a_P1-1429.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/index.md b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/index.md new file mode 100644 index 000000000..12821b0e6 --- /dev/null +++ b/docs/fr/technical/reference-architecture/boundedContexts/participantLifecycleManagement/index.md @@ -0,0 +1,192 @@ +# BC Gestion du Cycle de Vie des Participants + +Le Contexte Borné Gestion du Cycle de Vie des Participants (Participant Lifecycle Management) traite de tout ce qui concerne la gestion d’un Participant dans l’environnement Mojaloop. Lorsqu’on définit ce Contexte Borné, certains concepts clés doivent être identifiés clairement. + +#### Processus Maker-Checker +Le processus Maker-Checker établit une vérification à 6 yeux, garantissant qu’aucune action d’écriture n’a lieu sans être validée par une personne disposant des autorisations adéquates. Ces autorisations sont définies par le Contexte Borné Gestion du Cycle de Vie des Participants, mais elles restent configurables et attribuables selon les règles du schéma. Il est recommandé que les utilisateurs/rôles titulaires des droits de "Maker" ne reçoivent pas ceux de "Checker", et que les droits de "Checker" soient attribués à des personnes différentes. Il reste possible d’attribuer les deux responsabilités au même utilisateur/rôle, mais cela annule alors la sécurité prévue par la séparation des rôles qui est au cœur du processus maker-checker. + +#### États du Participant +La gestion des états du participant permet aux opérateurs administrateurs de contrôler les permissions d’un participant donné selon son état. Lors de la phase de configuration de la plateforme, le Contexte Borné attend que les états soient définis et paramétrés avec des rôles et/ou permissions. Un état peut ensuite être attribué à un participant via le processus de gestion du statut du participant. + +## Termes + +Termes ayant une signification précise et communément acceptée dans le Contexte Borné où ils sont utilisés. + +| Terme | Description | +| ------------- | ------------ | +| **Participant** | Fournisseur de Services Financiers (FSP) qui s’inscrit sur l’écosystème Mojaloop et peut ainsi effectuer des transactions avec d’autres Participants. | +| **Maker** | Représentant responsable de la création de structures de données via l’envoi de requêtes. | +| **Checker** | Représentant responsable de l’approbation et de l’acceptation des données ayant été demandées pour création. | + +## Vue Fonctionnelle + +Veuillez consulter la page des interfaces communes pour comprendre comment ces interactions ont lieu. [^1] + +![Cas d’Utilisation - Exemple À REMPLACER](./assets/ML2RA_PLM-bcOverviewFlowDiagram_Apr22-a_1429.png) +>Diagramme de workflow BC : Vue Fonctionnelle + +## Cas d’Utilisation + +### Création de Participant (Inscription en une seule étape) + +#### Description + +Ce flux permet au BC d’employer un processus afin de créer un Participant dans l’écosystème Mojaloop — cela nécessite généralement toutes les informations relatives au participant ainsi qu’aux comptes initiaux nécessaires. + +#### Diagramme de flux + +![Cas d’Utilisation - Création de Participant Initiale](./assets/ML2RA_PLM-ucCreateParticipantInit_Apr22-a_P1-1429.png) +![Cas d’Utilisation - Création de Participant - Approbation](./assets/ML2RA_PLM-ucCreateParticipantAppro_Apr22-a_P2-1429.png) +>Workflow UC : Création de Participant + +### Gestion des Fonds + +#### Description + +Ce flux permet au BC de mettre en œuvre un processus pour permettre les retraits ou dépôts de fonds sur le(s) compte(s) du Participant. + +#### Diagramme de flux + +![Cas d’Utilisation - Gestion des Fonds - Initial](./assets/ML2RA_PLM-ucManageFundsInit_Apr22-a_P1-1429.png) +![Cas d’Utilisation - Gestion des Fonds - Approbation](./assets/ML2RA_PLM-ucManageFundsAppro_Apr22-a_P2-1429.png) +>Workflow UC : Gestion des Fonds + +### Mise à Jour des Points de Terminaison + +#### Description + +Ce flux permet au BC de mettre à jour l’endpoint (adresse réseau) d’un participant donné. Une fois la demande approuvée, l’endpoint sera contacté (keep-alive) pour garantir la connectivité. + +#### Diagramme de flux + +![Cas d’Utilisation - Mise à jour de l’Endpoint - Initial](./assets/ML2RA_PLM-ucUpdateEndpointsInit_Apr22-a_P1-1429.png) +![Cas d’Utilisation - Mise à jour de l’Endpoint - Approbation](./assets/ML2RA_PLM-ucUpdateEndpointAppro_Apr22-a_P2-1429.png) +>Workflow UC : Mise à jour des Endpoints + +### Mise à Jour du Statut du Participant + +#### Description + +Ce flux permet au BC de mettre en place un processus par lequel on change le statut d’un participant pour lui appliquer de nouveaux rôles ou règles de schéma. + +#### Diagramme de flux + +![Cas d’Utilisation - Mise à Jour du Statut - Initial](./assets/ML2RA_PLM-ucUpdateParticipantStatusInit_Apr22-a_P1-1429.png) +![Cas d’Utilisation - Mise à Jour du Statut - Approbation](./assets/ML2RA_PLM-ucUpdateParticipantStatusAppro_Apr22-a_P2-1429.png) +>Workflow UC : Mise à jour du statut du Participant + +### Consultation d’un Participant + +#### Description + +Ce flux permet au BC de mettre en œuvre un processus pour obtenir des informations concernant un participant donné. + +#### Diagramme de flux + +![Cas d’Utilisation - Consultation de Participant](./assets/ML2RA_PLM-ucGetParticipant_Apr22-a_1429.png) +>Workflow UC : Consultation de Participant + +### Ajout de Comptes Participant + +#### Description + +Ce flux permet au BC de contrôler divers aspects des comptes d’un Participant, notamment : création, activation/désactivation, mise à jour des plafonds et seuils d’alerte d’un compte. + +- Ajouter un Compte Participant +- Mettre à Jour le Statut d’un Compte Participant (Activation/Désactivation) +- Mettre à Jour les Limites de Liquidité et Seuils d’Alerte + +#### Diagramme de flux + + + +![Cas d’Utilisation - Ajout de Compte Participant - Initial](./assets/ML2RA_PLM-ucAddParticipantAccountInit_Apr22-a_P1-1429.png) +![Cas d’Utilisation - Ajout de Compte Participant - Approbation](./assets/ML2RA_PLM-ucAddParticipantAccountAppro_Apr22-a_P2-1429.png) +>Workflow UC : Ajout de Comptes Participants + +### Réserve de Couverture de Liquidité + +#### Description + +Ce flux permet au BC de réserver une couverture de liquidité pour un Participant et de notifier le BC Comptes et Soldes de la mise à jour. + +#### Diagramme de flux + +![Cas d’Utilisation - Réserve de Couverture de Liquidité - Initial](./assets/ML2RA_PLM-ucLiquidityCoverReserveInit_Apr22-a_P1-1429.png) +![Cas d’Utilisation - Réserve de Couverture de Liquidité - Approbation](./assets/ML2RA_PLM-ucLiquidityCoverReserveAppro_Apr22-a_P2-1429.png) +>Workflow UC : Réserve de Couverture de Liquidité + +### Dépassement du Seuil de Liquidité + +#### Description + +Ce flux permet au BC de notifier le participant lorsqu’un seuil de liquidité prédéfini est atteint et qu’une action peut être requise. + +#### Diagramme de flux + +![Cas d’Utilisation - Dépassement de Seuil de Liquidité](./assets/ML2RA_PLM-ucLiquidityThresholdExceeded_Apr22-a_1429.png) +>Workflow UC : Dépassement du Seuil de Liquidité + +### Dépassement de la Limite de Liquidité + +#### Description + +Ce flux permet au BC de notifier le participant lorsqu’il atteint la limite de liquidité prédéfinie pour un compte. + +#### Diagramme de flux + +![Cas d’Utilisation - Dépassement de Limite de Liquidité](./assets/ML2RA_PLM-ucLiquidityLimitedExceeded_Apr22-a_1429.png) +>Workflow UC : Dépassement de la Limite de Liquidité + +### Réinitialisation des Seuils et Limites de Liquidité + +#### Description + +Ce flux permet au BC de réinitialiser les contrôles de notification de limite ou seuil de liquidité lorsque des transferts réussis ont été exécutés et que la position du compte du participant est devenue positive. + +#### Diagramme de flux + +![Cas d’Utilisation - Réinitialisation des Seuils/Limites de Liquidité](./assets/ML2RA_PLM-ucLiquidityLimit&ThresholdReset_Apr22-a_1429.png) +>Workflow UC : Réinitialisation des Seuils et Limites de Liquidité + +### Requête de Couverture de Liquidité + +#### Description + +Ce flux permet au BC d’interroger la liquidité courante d’un compte participant, ainsi que d’effectuer d’autres opérations de lecture associées à la liquidité du participant. + +#### Diagramme de flux + + + +![Cas d’Utilisation - Requête de Couverture de Liquidité](./assets/ML2RA_PLM-ucLiquidityCoverQuery_Apr22-a_1429.png) +>Workflow UC : Requêtes de Couverture de Liquidité + +## Modèle Canonique + +- Participant + - id + - participantAlias + - endpointURL + - state + - Comptes[] + - accountID + - ledgerAccountType + - accountCurrency + - isActive + - warningThreshold + - limit + - type + - value + +## Commentaires de Conclusion + +**Comptes Participants :** Les Participants ne peuvent avoir qu’un seul compte par devise autorisée. +**Cas d’Utilisation - Update Position :** A été remplacé par le cas d’utilisation Gestion des Fonds. +**Opérations Maker/Checker :** Le nombre de tentatives de reprise (retry) n’a aucun effet sur la manière dont nous traitons/retraitons les demandes. + + + +## Notes + +[^1]: Interfaces communes : [Liste des interfaces communes Mojaloop](../../boundedContexts/commonInterfaces.md) diff --git a/docs/fr/technical/reference-architecture/boundedContexts/platformMonitoring/assets/useCaseExample.png b/docs/fr/technical/reference-architecture/boundedContexts/platformMonitoring/assets/useCaseExample.png new file mode 100644 index 000000000..fd9ae7373 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/platformMonitoring/assets/useCaseExample.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/platformMonitoring/index.md b/docs/fr/technical/reference-architecture/boundedContexts/platformMonitoring/index.md new file mode 100644 index 000000000..1fa059c56 --- /dev/null +++ b/docs/fr/technical/reference-architecture/boundedContexts/platformMonitoring/index.md @@ -0,0 +1,23 @@ +# {name} BC + +{overview} + +## Terms + +Terms with specific and commonly accepted meaning within the Bounded Context in which they are used. + +| Term | Description | +|---|---| +| Term1 | Description1 | + +## Use Cases + +### Perform Transfer (universal mode) + +![Use Case - Example REPLACE ME](./assets/useCaseExample.png) +> example image - replace + + +## Notes + +[^1]: Common Interfaces: [Mojaloop Common Interface List](../../commonInterfaces.md) diff --git a/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaCalculateQuoteHappyPath_20210825.png b/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaCalculateQuoteHappyPath_20210825.png new file mode 100644 index 000000000..ce5c78a4d Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaCalculateQuoteHappyPath_20210825.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaCalculateQuoteInvalidFSPs_20210825.png b/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaCalculateQuoteInvalidFSPs_20210825.png new file mode 100644 index 000000000..80bbd8d7a Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaCalculateQuoteInvalidFSPs_20210825.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaCalculateQuoteInvalidQuoteRequest_20210825.png b/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaCalculateQuoteInvalidQuoteRequest_20210825.png new file mode 100644 index 000000000..5cb2262e8 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaCalculateQuoteInvalidQuoteRequest_20210825.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaCalculateQuoteInvalidSchemeRulesRequest_20210825.png b/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaCalculateQuoteInvalidSchemeRulesRequest_20210825.png new file mode 100644 index 000000000..b98cbc26e Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaCalculateQuoteInvalidSchemeRulesRequest_20210825.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaCalculateQuoteInvalidSchemeRulesResponse_20210825.png b/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaCalculateQuoteInvalidSchemeRulesResponse_20210825.png new file mode 100644 index 000000000..a023e3df6 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaCalculateQuoteInvalidSchemeRulesResponse_20210825.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaFunctionalOverview_20210825.png b/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaFunctionalOverview_20210825.png new file mode 100644 index 000000000..72ac92834 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaFunctionalOverview_20210825.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaGetQuoteHappyPath.png b/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaGetQuoteHappyPath.png new file mode 100644 index 000000000..5c67aa42b Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaGetQuoteHappyPath.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaTransfersVelocityRuleEval-Trigger_20210825.png b/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaTransfersVelocityRuleEval-Trigger_20210825.png new file mode 100644 index 000000000..f4386a449 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/assets/qtaTransfersVelocityRuleEval-Trigger_20210825.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/index.md b/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/index.md new file mode 100644 index 000000000..ac15b6338 --- /dev/null +++ b/docs/fr/technical/reference-architecture/boundedContexts/quotingAgreement/index.md @@ -0,0 +1,120 @@ +# BC Cotation/Accords + +Le Contexte Borné de Cotation et Accords fournit aux Participants des devis pour effectuer des transferts, et enregistre les réponses d’acceptation ou de rejet des participants. + +## Termes + +Les termes suivants sont utilisés dans ce BC, également appelé domaine. + +| Terme | Description | +|---|---| +| **(D)FSP** | Fournisseur de Services Financiers (Digital) | +| **Participant** | Fournisseur de Services Financiers | + +## Vue Fonctionnelle + +![Cas d’Utilisation - Vue Fonctionnelle](./assets/qtaFunctionalOverview_20210825.png) + +## Cas d’Utilisation + +### Calculer le Devis - Parcours Nominal + +#### Description + +Ce processus collecte une série de données pertinentes sur le Participant, y compris les indicateurs de statut, calcule le coût du transfert (y compris les frais), et le fournit au(x) Participant(s). Il permet également d’enregistrer les demandes & réponses des Participants (par exemple, acceptation ou rejet du devis). + +#### Diagramme de flux + +![Cas d’Utilisation - Calcul du Devis - Parcours Nominal](./assets/qtaCalculateQuoteHappyPath_20210825.png) + +### Obtenir un Devis - Parcours Nominal + +#### Description + +Processus pour obtenir et délivrer les détails d’un devis existant au(x) Participant(s) sur demande. + +#### Diagramme de flux + +![Cas d’Utilisation - Exemple À REMPLACER](./assets/qtaGetQuoteHappyPath.png) + +### Calculer le Devis - Demande de Devis Invalide + +#### Description + +Processus permettant au système d’invalider des demandes de devis en surveillant et répondant à des événements de demande invalides, FSP invalides, ou demandes dupliquées. + +#### Diagramme de flux + +![Cas d’Utilisation - Calcul du Devis - Demande de Devis Invalide](./assets/qtaCalculateQuoteInvalidQuoteRequest_20210825.png) + +### Calculer le Devis - FSP Invalides + +#### Description + +Processus permettant au système d’invalider des demandes de devis FSP lorsque les informations du FSP ne correspondent pas au devis d’origine pour un ou les deux Participants. + +#### Diagramme de flux + +![Cas d’Utilisation - Calcul du Devis - FSP Invalides](./assets/qtaCalculateQuoteInvalidFSPs_20210825.png) + +### Calculer le Devis - Règles du Schéma Invalides Détectées dans la Demande + +#### Description + +Processus permettant au système d’invalider une demande de devis lorsqu’une ou plusieurs règles du schéma sont violées par un ou plusieurs participants, par exemple lorsque la limite de période du devis est atteinte. + +#### Diagramme de flux + +![Cas d’Utilisation - Calcul du Devis - Règles du Schéma Invalides dans la Demande](./assets/qtaCalculateQuoteInvalidSchemeRulesRequest_20210825.png) + +### Calculer le Devis - Règles du Schéma Invalides Détectées dans la Réponse + +#### Description + +Processus permettant au système d’invalider les réponses de devis dans le cas où des règles du schéma sont violées par un ou plusieurs participants, par exemple lorsque des conditions invalides sont détectées. + +#### Diagramme de flux + +![Cas d’Utilisation - Calcul du Devis - Règles du Schéma Invalides dans la Réponse](./assets/qtaCalculateQuoteInvalidSchemeRulesResponse_20210825.png) + +## Modèle Canonique de Devis + +Le modèle canonique stocke les informations suivantes des devis dans le BC Cotations & Accords : + +- Identifiant du devis +- Identifiant de la transaction +- Participants + - payerId + - payeeId +- Payeur + - Participant + - participantId + - roleType (ex. payeur) + - Montant demandé (montant initial) + - Valeur (nombre) + - Devise (code de devise ISO) + - Montant à envoyer (incluant frais, etc.) + - Valeur (nombre) + - Devise (code de devise ISO) +- Destinataire(s) (un ou plusieurs : tous doivent être ajoutés au « Montant à envoyer ») + - '#' + - Participant + - participantId + - roleType (identifier pourquoi ce « payee » reçoit ce montant, ex : frais, bénéficiaire, etc.) + - motif (reason) + - Montant à recevoir + - valeur (nombre) + - devise (code de devise ISO) +- Extensions + +## Commentaires finaux + +- Aucune anomalie majeure constatée dans le BC ou la conception de l’Architecture de Référence. +- Besoin de mieux comprendre/clarifier le modèle « GET » via « POST » : + - Un événement « GET » doit-il être un simple « GET » Restful, ou le système doit-il prendre en charge le « GET » à partir de posts dupliqués ? + - Devons-nous servir des requêtes « GET » incluant des détails FSP à une date ultérieure ? + + + + +[^1]: Interfaces Communes : [Liste des interfaces communes Mojaloop](../../commonInterfaces.md) diff --git a/docs/fr/technical/reference-architecture/boundedContexts/reporting/assets/ML2RA_Rpts_eventBasedReporting_Apr22-b.png b/docs/fr/technical/reference-architecture/boundedContexts/reporting/assets/ML2RA_Rpts_eventBasedReporting_Apr22-b.png new file mode 100644 index 000000000..db2b6246a Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/reporting/assets/ML2RA_Rpts_eventBasedReporting_Apr22-b.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/reporting/assets/ML2RA_Rpts_functionalOverview_Apr22-b.png b/docs/fr/technical/reference-architecture/boundedContexts/reporting/assets/ML2RA_Rpts_functionalOverview_Apr22-b.png new file mode 100644 index 000000000..723f9b87e Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/reporting/assets/ML2RA_Rpts_functionalOverview_Apr22-b.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/reporting/assets/ML2RA_Rpts_pullReporting_Apr22-b.png b/docs/fr/technical/reference-architecture/boundedContexts/reporting/assets/ML2RA_Rpts_pullReporting_Apr22-b.png new file mode 100644 index 000000000..5223a2137 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/reporting/assets/ML2RA_Rpts_pullReporting_Apr22-b.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/reporting/assets/ML2RA_Rpts_pushReporting_Apr22-b.png b/docs/fr/technical/reference-architecture/boundedContexts/reporting/assets/ML2RA_Rpts_pushReporting_Apr22-b.png new file mode 100644 index 000000000..13a7d81ae Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/reporting/assets/ML2RA_Rpts_pushReporting_Apr22-b.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/reporting/assets/ML2RA_Rpts_reportDashboardConsumption_Apr22-b.png b/docs/fr/technical/reference-architecture/boundedContexts/reporting/assets/ML2RA_Rpts_reportDashboardConsumption_Apr22-b.png new file mode 100644 index 000000000..98d2ece29 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/reporting/assets/ML2RA_Rpts_reportDashboardConsumption_Apr22-b.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/reporting/index.md b/docs/fr/technical/reference-architecture/boundedContexts/reporting/index.md new file mode 100644 index 000000000..d2b3b506a --- /dev/null +++ b/docs/fr/technical/reference-architecture/boundedContexts/reporting/index.md @@ -0,0 +1,101 @@ +# BC Reporting + +## Vue d'ensemble + +### Stratégie & Règles + +La stratégie de reporting pour cette architecture de référence est de décrire les mécanismes génériques par lesquels les données des BC clients peuvent être persistées et maintenues à jour dans un Data Store de Reporting, de sorte que les utilisateurs et les systèmes puissent ensuite consommer ces données directement du Data Store de Reporting, ou à travers tout outil de reporting et/ou de tableau de bord connecté à ce Data Store de Reporting. + +- Ce Data Store de Reporting doit être accessible en écriture uniquement du point de vue du switch, et en lecture seule par les composants externes. +- Les modèles de données du Data Store de Reporting peuvent différer des modèles de données opérationnels internes utilisés par le switch ; si pertinent, pour des raisons de performance ou autres, plusieurs modèles pour les mêmes données peuvent être rendus disponibles dans le Data Store de Reporting – à l’instar de plusieurs projections ou vues. +- Un Composant de Reporting du BC Client, fourni par le switch, traduira les événements internes et les modèles de données internes vers les modèles du data store externe – Ce composant peut être remplacé, ou il peut même en exister plusieurs pour un même BC client. +- Un tel composant doit exister dans le BC Reporting pour tout BC Client dont les données sont rendues disponibles dans le Data Store de Reporting. +- Tout envoi ou récupération directe de données depuis le BC Client source, ou ses data stores internes, vers le Data Store de Reporting constitue une violation du principe de découplage et affectera négativement la maintenabilité du système par effet de couplage fort. + +### Stratégies de reporting : + +- Basé sur les événements – Méthode préférée – Sur le BC Reporting, un composant (gestionnaire d'événements) écoute les événements pertinents depuis son BC associé et transforme ces événements en entrées dans le data store de reporting – il peut y avoir plusieurs de ces composants par BC client, toutefois chacun doit être le seul responsable pour écrire un sous-ensemble des données de reporting. +- Push – Le BC client appelle l’API du Composant de Reporting correspondant afin d’envoyer les données ; cette API transforme et persiste les données dans le data store de reporting ([^1] avec le BC source, c’est-à-dire, il doit y avoir une API par BC source). +- Pull – Sur le BC Reporting, un Composant de Reporting pour BC client (piloté par minuterie) appelle une API sur le BC source pour récupérer ses données, qui sont ensuite persistées dans le data store de reporting ([^1] avec le BC source). + +**Pour les BC critiques en performance, il faut toujours privilégier la stratégie de reporting piloté par les événements.** + +### Règles minimales à respecter : + +- Seul le Data Store de Reporting doit être utilisé pour le reporting et les tableaux de bord. Les systèmes externes ne sont pas autorisés à accéder directement aux data stores internes des Contextes Bornés. L’accès opérationnel pour les systèmes externes sera disponible via les API opérationnelles ou [Interop APIs](/refarch/boundedContexts/fspInteropApi/). +- Les données sources internes des BC clients ne peuvent pas être « transmises » directement au Data Store de Reporting : il doit y avoir une traduction entre la structure de données source et la structure de données de reporting, même s’il n’y a pas de différence de structure. L’objectif est d’éviter toute dépendance de la structure de données source sur le côté reporting. + +### À faire + +- Décider quels rapports initiaux et tableaux de bord doivent être inclus dans la fonctionnalité de reporting de base. +- Choisir des outils open source de reporting et de tableau de bord pour fournir cette fonctionnalité de base. +- Reporting de conformité/assurance – définir certains de ces rapports de base (KYC, AML) +- Discuter de la “Surveillance des processus (et SLA)” et décider si cela peut être fait au-dessus de la couche de reporting (la définition des chiffres critiques, SLI & SLO, se fait par la configuration de la plateforme) +- Ajouter un lien vers l’API opérationnelle BC dans la section des règles ci-dessus. + +## Termes + +Termes ayant une signification spécifique et communément acceptée dans le Contexte Borné dans lequel ils sont utilisés. + +| Terme | Description | +|-------------------------------|-------------| +| **BC Client** | Contexte Borné source (ou propriétaire) des données persistées dans le Data Store de Reporting | +| **Data Store de Reporting** | Data store(s) externe(s) (il peut y en avoir plusieurs) où les données de reporting produites par les Composants de Reporting des BC Clients sont stockées et maintenues à jour | +| **Composant de Reporting du BC Client** | Ce composant, qui peut prendre la forme d’un service, est responsable de la traduction du modèle interne vers le(s) modèle(s) externe(s) stocké(s) dans le Data Store de Reporting | +| **Outil de reporting ou de tableau de bord** | Outils externes qui utilisent les données du Data Store de Reporting comme source pour produire des rapports, des tableaux de bord ou toute autre tâche liée au reporting | + +## Vue Fonctionnelle + +![Diagramme d’ensemble fonctionnel du reporting](./assets/ML2RA_Rpts_functionalOverview_Apr22-b.png) +> Diagramme des fonctions BC : Vue fonctionnelle + +## Cas d’Utilisation + +### Reporting basé sur les événements (méthode préférée) + +#### Description + +Stratégie pour alimenter le Data Store de Reporting en ayant un Composant de Reporting du BC Client à l’écoute des événements internes et persistant les données de reporting correspondantes. + +#### Diagramme de flux + +![Diagramme UC reporting événementiel](./assets/ML2RA_Rpts_eventBasedReporting_Apr22-b.png) +> Diagramme du workflow UC : Reporting basé sur les événements (méthode préférée) + +### Reporting basé sur le pull + +#### Description + +Stratégie pour alimenter le Data Store de Reporting en faisant en sorte que le Composant de Reporting du BC Client aille chercher les données auprès de l’API du BC Client. + +#### Diagramme de flux + +![Diagramme UC reporting par extraction](./assets/ML2RA_Rpts_pullReporting_Apr22-b.png) +> Diagramme du workflow UC : Reporting par pull + +### Reporting basé sur le push + +#### Description + +Stratégie pour alimenter le Data Store de Reporting en ayant le BC client qui envoie à l’API du Composant de Reporting du BC Client les données à reporter, puis ce composant traduit et persiste ces données. + +#### Diagramme de flux + +![Diagramme UC reporting par envoi](./assets/ML2RA_Rpts_pushReporting_Apr22-b.png) +> Diagramme du workflow UC : Reporting par push + +### Consommation des rapports et tableaux de bord par l’utilisateur + +#### Description + +Exemple de la manière dont un utilisateur peut consommer rapports et tableaux de bord. + +#### Diagramme de flux + +![Diagramme de consommation de rapports / dashboard utilisateur](./assets/ML2RA_Rpts_reportDashboardConsumption_Apr22-b.png) +> Diagramme du workflow UC : Consommation utilisateur – reporting & dashboard + + +## Notes + +[^1] : Interfaces Communes : [Liste des Interfaces Communes Mojaloop](../../refarch/commonInterfaces.md) diff --git a/docs/fr/technical/reference-architecture/boundedContexts/scheduling/assets/schedulingCreateReminder_20211021.png b/docs/fr/technical/reference-architecture/boundedContexts/scheduling/assets/schedulingCreateReminder_20211021.png new file mode 100644 index 000000000..6db98ef15 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/scheduling/assets/schedulingCreateReminder_20211021.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/scheduling/assets/schedulingDeleteRecurringReminder_20211021.png b/docs/fr/technical/reference-architecture/boundedContexts/scheduling/assets/schedulingDeleteRecurringReminder_20211021.png new file mode 100644 index 000000000..43a900f75 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/scheduling/assets/schedulingDeleteRecurringReminder_20211021.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/scheduling/assets/schedulingReminderTriggered_20211021.png b/docs/fr/technical/reference-architecture/boundedContexts/scheduling/assets/schedulingReminderTriggered_20211021.png new file mode 100644 index 000000000..00de4e46d Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/scheduling/assets/schedulingReminderTriggered_20211021.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/scheduling/assets/useCaseExample.png b/docs/fr/technical/reference-architecture/boundedContexts/scheduling/assets/useCaseExample.png new file mode 100644 index 000000000..fd9ae7373 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/scheduling/assets/useCaseExample.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/scheduling/index.md b/docs/fr/technical/reference-architecture/boundedContexts/scheduling/index.md new file mode 100644 index 000000000..1cec20c22 --- /dev/null +++ b/docs/fr/technical/reference-architecture/boundedContexts/scheduling/index.md @@ -0,0 +1,131 @@ +# BC de Planification (Scheduling BC) + +De nombreux processus et événements dans les différents BCs de la plateforme Mojaloop Switch nécessitent une fonctionnalité permettant de déclencher des actions à des moments précis ou selon un calendrier défini. Afin de prendre en charge ce besoin de manière centralisée et d’éviter d’implémenter cette fonctionnalité dans chaque BC, un seul BC dédié à la planification sera introduit et mis en œuvre sur la plateforme Switch. + +Pour planifier un processus ou un événement, un BC Client soumet une demande au Scheduling BC pour créer un rappel destiné à être déclenché à un horaire précis ou selon une récurrence. Le Scheduling BC maintient un registre de tous les rappels reçus et, lorsque le moment fixé arrive, il envoie une notification du rappel au BC Client concerné. + +De plus, le Scheduling BC fournit aussi des services permettant aux BC Clients et aux administrateurs du Switch de gérer les rappels enregistrés dans le Scheduling BC. + +## Termes + +Le(s) terme(s) suivant(s) sont utilisés dans ce BC : + +| Terme | Description | +|---|---| +| **BC Client** | Tout autre BC utilisant les services du Scheduling BC | + +## Cas d’Utilisation + + +L’état des cas d’utilisation (UC) pour le Scheduling BC est le suivant : + +| UCs Disponibles | | | UCs Prévu(e)s | | +| --- | :-- | --- | --- | :-- | +| **Cas d’Utilisation** | **Description** | | **Cas d’Utilisation** | **Description** | +| **Créer un rappel** | Le BC Client demande la création d’un rappel | | **Requête rappel du client** | Le BC Client interroge ses propres rappels | +| **Supprimer un rappel** | Le BC Client demande la suppression d’un rappel | | **Requête rappel de l’admin** | L’administrateur de la plateforme interroge tous les rappels | +| **Déclenchement du rappel** | Le Scheduling BC déclenche le rappel lorsque le moment est venu | | | +| **Mettre à jour un rappel** | *Non fourni. Solution recommandée : supprimer puis recréer un rappel* | | | | | + + +### Créer un rappel + +#### Description +Ce flux permet au Switch de traiter les demandes autorisées des BC Clients pour créer des rappels. + +#### Diagramme de flux + +![Créer un rappel](./assets/schedulingCreateReminder_20211021.png) +> +### Rappel déclenché + +#### Description +Ce flux permet au Switch de traiter les rappels envoyés du Scheduling BC à un BC Client pour déclencher une tâche, ou simplement comme rappel. + +#### Diagramme de flux + +![Rappel déclenché](./assets/schedulingReminderTriggered_20211021.png) +> +### Suppression d’un rappel (récurrent) + +#### Description +Ce flux permet au Switch de gérer la suppression d’un rappel par un BC Client autorisé. Si le Scheduling BC ne parvient pas à traiter l’instruction, il envoie un message d’alerte au BC Notifications. + +#### Diagramme de flux + +![Suppression d’un rappel récurrent](./assets/schedulingDeleteRecurringReminder_20211021.png) +> + + +## Notes + +#### Créer un rappel – Données requises + +La demande de création de rappel doit comporter les données suivantes : + +| Donnée | Description | +| --- | ---- | +| **Identifiant** | nom/id | +| **Définition Cron** | récurrence ?, intervalle ? | +| **Transport de déclenchement** | Callback HTTP/Événement ; URL de Callback ou sujet d’événement | +| **Payload spécial** | opaque pour le Scheduling BC | +| **Conditions de reprise** | nouvelle tentative, replanification, abandon, annulation | +| **Alertes** | notification, journalisation en cas d’exception | +| **Actions** | registre des processus BC automatisables/planifiables | + +#### Scheduling BC – Exigences + +Le Scheduling BC doit répondre aux exigences suivantes : + +* Les rappels ne doivent être déclenchés qu’une seule fois + +* Le BC doit conserver l’historique des rappels déclenchés + +* Le BC doit garder l’historique des opérations de Création/Lecture/Suppression + + * Les mises à jour seront réalisées via les actions Suppression/Création, comme indiqué dans la section [UC disponibles](#use-cases) + +* Prise en charge de lots de tâches + +* Offrir plusieurs options d’interface (gRPC, REST, HTTP, etc.) + +* Les rappels doivent être déclenchés par un callback HTTP, pas par appel gRPC, ni vers un sujet spécifique + +* Ne pas prendre en charge le traitement de logique externe au Scheduling BC lui-même + +* Utiliser exclusivement les timestamps UTC basés sur Linux pour éviter les problèmes de synchronisation + +***Remarque :*** *Le système sous-jacent est supposé conserver une mesure du temps exacte.* + +#### Scheduling BC – Exigences en suspens + +Les exigences d’accès pour le Scheduling BC restent à définir. + +#### Scheduling BC – Exceptions + +* Instructions malformées + * Date/heure invalide, y compris dans le passé + * BC ou commande invalide +* Échec d’exécution (identifié via le callback) +* Autorité insuffisante du BC Client pour réaliser l’opération C/S/S (CRD) +* Échec du traitement/déclenchement du rappel + +#### Questions + +Certaines questions sont apparues lors des sessions d’architecture de référence. Jugées utiles pour le plus grand nombre, elles sont incluses ci-dessous : + +* Après que la tâche planifiée a été lancée, le Scheduling BC reste-t-il responsable du suivi de sa progression ? + + * Réponse : Non. Lorsque le rappel est dû, il est communiqué au BC Client selon la méthode prévue, et la responsabilité du rappel est alors transférée au BC Client. + +* Est-ce le BC Client ou la personne qui a planifié le rappel qui est noté comme « Utilisateur » par le Scheduling BC ? En d’autres termes, quelle ID est inscrite dans l’audit trail ? + + * Réponse : Cela doit être déterminé par le BC Client, selon l’action qu’il entreprend à la réception du rappel. \ No newline at end of file diff --git a/docs/fr/technical/reference-architecture/boundedContexts/security/assets/ML2RA_SecAuth-ucAuthModel_Apr22_1829.png b/docs/fr/technical/reference-architecture/boundedContexts/security/assets/ML2RA_SecAuth-ucAuthModel_Apr22_1829.png new file mode 100644 index 000000000..8c67da4bb Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/security/assets/ML2RA_SecAuth-ucAuthModel_Apr22_1829.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/security/assets/ML2RA_SecAuth-ucBcBootstrap-OncePerNewVer_Apr22_1829.png b/docs/fr/technical/reference-architecture/boundedContexts/security/assets/ML2RA_SecAuth-ucBcBootstrap-OncePerNewVer_Apr22_1829.png new file mode 100644 index 000000000..3bf4c83db Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/security/assets/ML2RA_SecAuth-ucBcBootstrap-OncePerNewVer_Apr22_1829.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/security/assets/ML2RA_SecAuth-ucBcStartup_Apr22_1829.png b/docs/fr/technical/reference-architecture/boundedContexts/security/assets/ML2RA_SecAuth-ucBcStartup_Apr22_1829.png new file mode 100644 index 000000000..f268daee4 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/security/assets/ML2RA_SecAuth-ucBcStartup_Apr22_1829.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/security/assets/ML2RA_SecAuth-ucExampleApiQueryCall_Apr22_1829.png b/docs/fr/technical/reference-architecture/boundedContexts/security/assets/ML2RA_SecAuth-ucExampleApiQueryCall_Apr22_1829.png new file mode 100644 index 000000000..b67ea6e1a Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/security/assets/ML2RA_SecAuth-ucExampleApiQueryCall_Apr22_1829.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/security/assets/ML2RA_SecAuth-ucRolePriviledgeAssoc_Apr22_1829.png b/docs/fr/technical/reference-architecture/boundedContexts/security/assets/ML2RA_SecAuth-ucRolePriviledgeAssoc_Apr22_1829.png new file mode 100644 index 000000000..798b8681b Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/security/assets/ML2RA_SecAuth-ucRolePriviledgeAssoc_Apr22_1829.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/security/assets/ML2RA_SecAuth-ucUserOpsLogin(AuthN)_Apr22_1829.png b/docs/fr/technical/reference-architecture/boundedContexts/security/assets/ML2RA_SecAuth-ucUserOpsLogin(AuthN)_Apr22_1829.png new file mode 100644 index 000000000..807c85f63 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/security/assets/ML2RA_SecAuth-ucUserOpsLogin(AuthN)_Apr22_1829.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/security/index.md b/docs/fr/technical/reference-architecture/boundedContexts/security/index.md new file mode 100644 index 000000000..bd7e7f9f3 --- /dev/null +++ b/docs/fr/technical/reference-architecture/boundedContexts/security/index.md @@ -0,0 +1,93 @@ +# BC Sécurité + +## Vue d'ensemble + +Le protocole est basé sur le modèle requête-réponse, utilisant le protocole sécurisé Hypertext Transfer Protocol Secure (HTTPS). Tous les services utilisent les méthodes HTTP POST et GET. Les corps des requêtes et des réponses sont encodés en texte formaté JSON. + +## Termes + +Termes ayant une signification spécifique et communément acceptée dans le Contexte Borné Sécurité. + +| Module | Description | +|---|---| +| **Fournisseurs Crypto** | Adaptateur qui fournit les services cryptographiques et les services de gestion de clés (KMS) | +| **IAM** | Gestion des Identités et des Accès (Identity and Access Management). Adaptateur qui fournit les services de gestion des utilisateurs, menus, profils, rôles et permissions. | +| **AuthN** | Module d’authentification. Nécessite un identifiant utilisateur et un mot de passe, et retourne un jeton JWT. | +| **AuthZ** | Module d’autorisation. Nécessite un JWT et un certificat (clé publique). Vérifie les ROLES du JWT et la signature. | +| **JWT** | JSON Web Token. Renvoyé après une authentification utilisateur réussie. Contient les détails de l’utilisateur, les ROLES et la signature. | +| **KMS** | Système de Gestion de Clés (Key Management System). Gère le cycle de vie des clés cryptographiques (définition, création et retrait). Fait partie du sous-système Crypto. | + +## Cas d’Utilisation + +### Connexion Utilisateur / Opérateur du BC (AuthN) + +#### Description + +La fonction de connexion requiert que l’identifiant utilisateur et une clé secrète soient transmis dans le corps http. La réponse contient un jeton JWT signé. La signature est générée par le sous-système Crypto. La connexion est réalisée par les services d’autorisation ou l’IAM. + +#### Diagramme de flux + +![Cas d’Utilisation - Connexion Utilisateur / Opérateur du BC (AuthN)](./assets/ML2RA_SecAuth-ucUserOpsLogin(AuthN)_Apr22_1829.png) +> Diagramme de workflow CU : Connexion Utilisateur / Opérateur du BC (AuthN) + +### Modèle d’Autorisation du BC (AuthZ) + +#### Description + +IAM fournit l'association des utilisateurs/groupes, rôles et privilèges. Chaque BC dispose également d’une liste de rôles correspondants. Lorsqu’une fonction API ou un microservice est appelé, la signature du JWT est vérifiée à l’aide de la clé publique et le rôle renseigné dans le JWT est comparé au rôle associé au BC. Si la vérification de la signature et celle du rôle sont réussies, la fonction API ou le microservice est exécuté. + +#### Diagramme de flux + +![Cas d’Utilisation - Modèle d’Autorisation du BC (AuthZ)](./assets/ML2RA_SecAuth-ucAuthModel_Apr22_1829.png) +> Diagramme de workflow CU : Modèle d’Autorisation du BC (AuthZ) + +### Bootstrap du BC + +#### Description + +Au démarrage ("bootstrap"), le BC envoie la liste des privilèges possibles. Cette opération est effectuée une fois à chaque déploiement d’une nouvelle version. + +#### Diagramme de flux + +![Cas d’Utilisation - Bootstrap du BC](./assets/ML2RA_SecAuth-ucBcBootstrap-OncePerNewVer_Apr22_1829.png) +> Diagramme de workflow CU : Bootstrap du BC + +### Démarrage du BC + +#### Description + +Au lancement, le BC demande les clés publiques de l’émetteur d’authentification auprès des sous-systèmes Crypto / KMS du BC Sécurité ainsi que la liste des rôles/privilèges auprès du sous-système IAM du BC Sécurité. Une fonction locale de vérification de signature via une librairie cryptographique vérifie la signature JWT et les rôles dans le JWT sont comparés à la liste locale de rôles obtenue du service central d’autorisation. + +##### Diagramme de flux + +![Cas d’Utilisation - Démarrage du BC](./assets/ML2RA_SecAuth-ucBcStartup_Apr22_1829.png) +> Diagramme de workflow CU : Démarrage du BC + +### Association Rôle / Privilège + +#### Description + +Les rôles sont associés à un certain nombre de privilèges. + +#### Diagramme de flux + +![Cas d’Utilisation - Démarrage du BC](./assets/ML2RA_SecAuth-ucRolePriviledgeAssoc_Apr22_1829.png) +> Diagramme de workflow CU : Association Rôle / Privilège + +### Exemple de Requête / Appel + +#### Description + +L’autorisation client doit être réalisée à l’aide d’un jeton d’accès (access token). Un client doit d’abord demander au service d’autorisation de générer un jeton d’accès pour l’utilisateur qui souhaite accéder à l’interface. Cet utilisateur est authentifié dans le service d’autorisation. Le jeton d’accès généré est ensuite utilisé pour l’autorisation sur l’interface. +Pour utiliser le jeton d’accès, le client doit positionner l’entête HTTP Authorization à Bearer [access_token] sur chaque requête adressée à l’interface. + +#### Diagramme de flux + +![Cas d’Utilisation - Exemple de Requête API/ Appel](./assets/ML2RA_SecAuth-ucExampleApiQueryCall_Apr22_1829.png) +> Diagramme de workflow CU : Exemple de Requête API / Appel + + + \ No newline at end of file diff --git a/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/ML2RA_SET-ucBootStrapSettleModViaConfig_Mar22-b.png b/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/ML2RA_SET-ucBootStrapSettleModViaConfig_Mar22-b.png new file mode 100644 index 000000000..9b04df7c1 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/ML2RA_SET-ucBootStrapSettleModViaConfig_Mar22-b.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/ML2RA_SET-ucDeferNetSettle_Mar22-a-P1-2.png b/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/ML2RA_SET-ucDeferNetSettle_Mar22-a-P1-2.png new file mode 100644 index 000000000..8c8b1977f Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/ML2RA_SET-ucDeferNetSettle_Mar22-a-P1-2.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/ML2RA_SET-ucInstantGrossSettle_Mar22-a.png b/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/ML2RA_SET-ucInstantGrossSettle_Mar22-a.png new file mode 100644 index 000000000..911db5bfe Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/ML2RA_SET-ucInstantGrossSettle_Mar22-a.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/settleAbortSettle_20210827.png b/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/settleAbortSettle_20210827.png new file mode 100644 index 000000000..5016294ea Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/settleAbortSettle_20210827.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/settleCreateSettleAccountsNewPart_20210827.png b/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/settleCreateSettleAccountsNewPart_20210827.png new file mode 100644 index 000000000..8c27bfe78 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/settleCreateSettleAccountsNewPart_20210827.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/settleCreateUpdateModel_20210827.png b/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/settleCreateUpdateModel_20210827.png new file mode 100644 index 000000000..054b6a2f2 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/settleCreateUpdateModel_20210827.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/settleFunctionalOverview_20210826.png b/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/settleFunctionalOverview_20210826.png new file mode 100644 index 000000000..153e4c753 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/settlements/assets/settleFunctionalOverview_20210826.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/settlements/index.md b/docs/fr/technical/reference-architecture/boundedContexts/settlements/index.md new file mode 100644 index 000000000..5c0b20903 --- /dev/null +++ b/docs/fr/technical/reference-architecture/boundedContexts/settlements/index.md @@ -0,0 +1,87 @@ +# BC Règlements (Settlements BC) + +Le BC Règlements est essentiel pour le règlement des transferts des Participants, en utilisant soit la méthode de Règlement Net Différé (DNS), soit celle de Règlement Brut Immédiat (IGS). Il est responsable de la création des fenêtres de règlement, de l’identification et du déploiement de la méthode de règlement requise (DNS/IGS), du règlement, de la clôture et de la mise à jour des lots, ainsi que de l’enregistrement de tous les dépôts et retraits sur les comptes appropriés dans le BC Comptes et Soldes. + +## Termes + +Les termes suivants sont utilisés dans ce BC, aussi appelé domaine. + +| Terme | Description | +| ------------- | ------------ | +| **DNS** | Règlement Net Différé (Deferred Net Settlement) | +| **IGS/RTGS** | Règlement Brut Immédiat/Règlement Brut en Temps Réel (Immediate Gross Settlement/Real-Time Gross Settlement) | +| **Opérateur** | Personne ou système émettant des instructions/demandes | +| **Participant** | FSP/PISP ou client FSP | +| **Compte** | Compte général de registre (Cr/Dr) | + +## Vue Fonctionnelle + +![Cas d’Utilisation - Vue Fonctionnelle](./assets/settleFunctionalOverview_20210826.png) +> + +## Cas d’Utilisation + +### Règlement Net Différé (DNS) + +#### Description +Méthode permettant de différer les paiements afin de procéder au règlement sur plusieurs lots selon un calendrier prédéfini. Ceci est utile pour les environnements impliquant plusieurs Participants à une transaction nécessitant une approche de règlement du solde à payer. + +#### Diagramme de flux + +![Cas d’Utilisation - Règlement Net Différé (DNS)](./assets/ML2RA_SET-ucDeferNetSettle_Mar22-a-P1-2.png) +>Diagramme du parcours UC : Règlement Net Différé - 19/10/2021 + +### Règlement Brut Immédiat (IGS) + +#### Description +Méthode permettant le règlement immédiat des lots. Ceci est utile pour les environnements PME où des paiements rapides sont souvent souhaités afin de maximiser la liquidité. IGS est également connu sous le nom de Règlement Brut en Temps Réel (RTGS). + +#### Diagramme de flux + +![Cas d’Utilisation - Règlement Brut Immédiat (IGS)](./assets/ML2RA_SET-ucInstantGrossSettle_Mar22-a.png) +>Diagramme du parcours UC : Règlement Brut Immédiat + +### Annulation du Règlement + +#### Description +Méthode permettant au BC Règlements d’annuler un règlement si nécessaire, en inversant les comptes de règlement des Participants, en mettant à jour le statut du règlement pour les fenêtres de règlement et en mettant à jour l’état du règlement. + +#### Diagramme de flux + +![Cas d’Utilisation - Annulation du Règlement](./assets/settleAbortSettle_20210827.png) +> + +### Création/Mise à jour du modèle de règlement (DNS/IGS) + +#### Description +Méthode permettant au BC Règlements de créer ou mettre à jour la méthode de règlement pour un lot de règlement, en fonction du type de compte Participant. Utile dans les cas où des méthodes de règlement mixtes sont nécessaires. + +#### Diagramme de flux + +![Cas d’Utilisation - Création/Mise à jour du modèle de règlement (DNS/IGS)](./assets/settleCreateUpdateModel_20210827.png) +> + +### Initialisation du modèle de règlement via configuration + +#### Description +Méthode configurant la méthode de règlement (DNS/IGS) sur la base de la configuration de démarrage du système. Utile dans les cas où tous les modèles de règlement sont identiques, par exemple, tous en DNS ou tous en IGS. + +#### Diagramme de flux + +![Cas d’Utilisation - Initialisation du modèle de règlement via configuration](./assets/ML2RA_SET-ucBootStrapSettleModViaConfig_Mar22-b.png) +>Diagramme du parcours UC : Initialisation du modèle de règlement via configuration + +### Création de comptes liés au règlement pour les nouveaux Participants + +#### Description +Le système crée des comptes de règlement pour les nouveaux Participants afin de permettre la gestion des transferts de fonds par le Switch. Cela permet au Switch d'assurer la gestion de bout en bout de tous les transferts, quel que soit le mode de règlement utilisé. + +#### Diagramme de flux + +![Cas d’Utilisation - Création de comptes liés au règlement pour les nouveaux Participants](./assets/settleCreateSettleAccountsNewPart_20210827.png) +> + + + + +[^1]: Interfaces communes : [Liste des Interfaces Communes Mojaloop](../../commonInterfaces.md) diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucCredentialRegError_Mar22-a_P1&2.png b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucCredentialRegError_Mar22-a_P1&2.png new file mode 100644 index 000000000..94ef957ff Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucCredentialRegError_Mar22-a_P1&2.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucDfspRejectsOtpAuthTokenFromPisp_Mar22-a_P1&2.png b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucDfspRejectsOtpAuthTokenFromPisp_Mar22-a_P1&2.png new file mode 100644 index 000000000..f45af2d12 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucDfspRejectsOtpAuthTokenFromPisp_Mar22-a_P1&2.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucLinkAccnts-AccntDiscoveryFail_Mar22-a.png b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucLinkAccnts-AccntDiscoveryFail_Mar22-a.png new file mode 100644 index 000000000..f40d264f8 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucLinkAccnts-AccntDiscoveryFail_Mar22-a.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucLinkAccnts-DfspRejectConsentReq_Mar22-a.png b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucLinkAccnts-DfspRejectConsentReq_Mar22-a.png new file mode 100644 index 000000000..6aa565e7d Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucLinkAccnts-DfspRejectConsentReq_Mar22-a.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucPispGetDfspAccList&Id_Feb22-a.png b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucPispGetDfspAccList&Id_Feb22-a.png new file mode 100644 index 000000000..5e3b6a184 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucPispGetDfspAccList&Id_Feb22-a.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucUnlinkAccnts-ConsentNotFound_Mar22a.png b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucUnlinkAccnts-ConsentNotFound_Mar22a.png new file mode 100644 index 000000000..90da29fc6 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucUnlinkAccnts-ConsentNotFound_Mar22a.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucUnlinkAccntsDownstrmFail_Mar22-a_P1&2.png b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucUnlinkAccntsDownstrmFail_Mar22-a_P1&2.png new file mode 100644 index 000000000..dad5d2724 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL-ucUnlinkAccntsDownstrmFail_Mar22-a_P1&2.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL_ucDfspIssueConsent_Feb22a_P1&2.png b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL_ucDfspIssueConsent_Feb22a_P1&2.png new file mode 100644 index 000000000..1cd3f6cfa Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL_ucDfspIssueConsent_Feb22a_P1&2.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL_ucPispConsentRequest_Feb22a.png b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL_ucPispConsentRequest_Feb22a.png new file mode 100644 index 000000000..841a8b8c7 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL_ucPispConsentRequest_Feb22a.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL_ucPispGetSupportedDFSPs_Feb22a.png b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL_ucPispGetSupportedDFSPs_Feb22a.png new file mode 100644 index 000000000..de4844fc8 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL_ucPispGetSupportedDFSPs_Feb22a.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL_ucUnlinkAccounts-HubHostAuth_Feb22-a_P1&2.png b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL_ucUnlinkAccounts-HubHostAuth_Feb22-a_P1&2.png new file mode 100644 index 000000000..7ab02a922 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaL_ucUnlinkAccounts-HubHostAuth_Feb22-a_P1&2.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucPayToPisp-PispAsPayee_Mar22-b_P1-2.png b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucPayToPisp-PispAsPayee_Mar22-b_P1-2.png new file mode 100644 index 000000000..fcb9eb8ca Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucPayToPisp-PispAsPayee_Mar22-b_P1-2.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucPispBulkTransactReq_Mar22-a_P1-4.png b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucPispBulkTransactReq_Mar22-a_P1-4.png new file mode 100644 index 000000000..fc5c3934c Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucPispBulkTransactReq_Mar22-a_P1-4.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucThirdPartyInitTransactReq_Mar22-a_P1P2P3bP4.png b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucThirdPartyInitTransactReq_Mar22-a_P1P2P3bP4.png new file mode 100644 index 000000000..48601bc8c Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucThirdPartyInitTransactReq_Mar22-a_P1P2P3bP4.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucTransactReqFail-AuthInvalid_Mar22-a-P1-3.png b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucTransactReqFail-AuthInvalid_Mar22-a-P1-3.png new file mode 100644 index 000000000..c426cf207 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucTransactReqFail-AuthInvalid_Mar22-a-P1-3.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucTransactReqFail-BadPartyLookup_Mar22-b.png b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucTransactReqFail-BadPartyLookup_Mar22-b.png new file mode 100644 index 000000000..4900cf6d5 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucTransactReqFail-BadPartyLookup_Mar22-b.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucTransactReqFail-BadTransactReq_Mar22-b.png b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucTransactReqFail-BadTransactReq_Mar22-b.png new file mode 100644 index 000000000..817f487b9 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucTransactReqFail-BadTransactReq_Mar22-b.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucTransactReqFail-DownStreamFspiopFail_Mar22-b-P1-2.png b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucTransactReqFail-DownStreamFspiopFail_Mar22-b-P1-2.png new file mode 100644 index 000000000..8d26fbfad Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucTransactReqFail-DownStreamFspiopFail_Mar22-b-P1-2.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucTransactReqFail-dfspTimeout_Mar22-a-P1-3.png b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucTransactReqFail-dfspTimeout_Mar22-a-P1-3.png new file mode 100644 index 000000000..5890e84aa Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucTransactReqFail-dfspTimeout_Mar22-a-P1-3.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucTransactReqFail-rejectedByUser_Mar22-a-P1-3.png b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucTransactReqFail-rejectedByUser_Mar22-a-P1-3.png new file mode 100644 index 000000000..de4c47de3 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/assets/ML2RA_3PaT-ucTransactReqFail-rejectedByUser_Mar22-a-P1-3.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/index.md b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/index.md new file mode 100644 index 000000000..a9be1834b --- /dev/null +++ b/docs/fr/technical/reference-architecture/boundedContexts/thirdPartyApi/index.md @@ -0,0 +1,262 @@ +# BC API Tiers Partie + +Le BC (Bounded Context) API Tiers Partie a été implémenté avec l’architecture de référence Mojaloop 2.0 afin de permettre aux opérateurs PISP tiers (généralement des applications) d’interagir avec la plateforme. Veuillez noter que, sauf indication contraire, toutes les références aux BC concernent les différents composants ou contextes délimités (Bounded Contexts, BCs) de Mojaloop. + +## Termes + +Les termes communs suivants sont utilisés dans ce BC : + +| Terme | Description | +| ---------- | ------------ | +| **PISP** | Prestataire de Service d’Initiation de Paiement (par exemple PayPal, ApplePay, GooglePay, etc.) | +| **DFSP** | Prestataire de Services Financiers Numériques (par exemple Banque, Opérateur de Mobile Money) | +| **Utilisateur** | Client DFSP/PISP (selon indication) | + +## Cas d’Usage + +**Remarque :** Nos cas d’usage couvrent deux scénarios spécifiques : + +| Scénarios | Description | +| ----------- | -------------------------- | +| [Liaison](#linking-scenarios) | Activités d’administration PISP | +| [Transfert](#transfer-scenarios) | Activités d’initiation de transfert PISP | + +## Scénarios de Liaison + +### Récupération par le PISP des DFSPs supportés + +#### Description + +Ce flux permet au Switch de gérer les demandes des utilisateurs PISP autorisés pour obtenir la liste des titulaires de comptes DFSP supportés par le système. + +#### Schéma de Flux + +![Cas d’usage - PISP Gets supported DFSPs](./assets/ML2RA_3PaL_ucPispGetSupportedDFSPs_Feb22a.png) +>Schéma de flux UC : PISP récupère les DFSPs supportés + +### Récupération par le PISP de la liste des comptes pour un DFSP + Identifiant + +#### Description + +Ce flux permet au Switch de gérer les cas où des utilisateurs PISP autorisés souhaitent rechercher le détail de leurs comptes titulaires DFSP à l’aide de leur identifiant titulaire DFSP. Généralement, l’identifiant est intégré dans une application ou un processus d’origine PISP. + +#### Schéma de Flux + +![Cas d’usage - PISP Gets list of accounts for a DFSP + Identifier](./assets/ML2RA_3PaL-ucPispGetDfspAccList&Id_Feb22-a.png) +>Schéma de flux UC : PISP récupère la liste de comptes pour un DFSP + identifiant + +### Demande de Consentement PISP + +#### Description + +Ce flux permet au Switch de gérer les cas où un utilisateur PISP autorisé notifie son titulaire de compte DFSP de son intention de lier un ou plusieurs de ses comptes à un PISP via une demande de consentement. Cette demande est traitée par un processus [Émission de Consentement](#dfsp-issue-consent) hors bande, suite à la réception de la réponse à une demande de confirmation d’autorisation. Ce processus établit une relation de confiance entre l’utilisateur PISP, le PISP, et le titulaire du compte DFSP. Le Switch met à jour les détails des comptes participants en conséquence. + +#### Schéma de Flux + +![Cas d’usage - PISP Consent Request](./assets/ML2RA_3PaL_ucPispConsentRequest_Feb22a.png) +>Schéma de flux UC : Demande de consentement PISP + +### Émission de Consentement DFSP + +#### Description + +Ce flux permet au Switch de gérer les cas où un titulaire de compte DFSP répond à une demande de consentement reçue d’un utilisateur PISP autorisé et authentifié. Le titulaire de compte DFSP émet une demande via le Switch pour que l’utilisateur PISP crée un justificatif d'identité sur son appareil. Une fois le justificatif reçu et vérifié par le titulaire DFSP, le Switch et le compte titulaire DFSP sont mis à jour avec le justificatif utilisateur PISP et les comptes liés, et l’utilisateur PISP est notifié que ses comptes ont été liés avec succès à son profil PISP. + +***Remarque :*** *L’émission de Consentement fait suite à une demande de liaison initiée par un utilisateur PISP et suit le flux décrit dans la section [Demande de Consentement PISP](#pisp-consent-request) ci-dessus.* + +#### Schéma de Flux + +![Cas d’usage - DFSP Issue Consent](./assets/ML2RA_3PaL_ucDfspIssueConsent_Feb22a_P1&2.png) +>Schéma de flux UC : Émission de Consentement DFSP + +### Dissociation de comptes : Authentification hébergée par le Hub + +#### Description + +Ce flux permet au Switch de gérer une demande formulée par un PISP ou un titulaire de compte DFSP autorisé pour révoquer le consentement qui lie un compte DFSP à un profil PISP. Le Switch procède à la dissociation dans le service de recherche de compte, notifie le titulaire DFSP (qui retire la liaison dans son système), et le PISP Hôte qui envoie une notification de complétion à l’utilisateur. + +#### Schéma de Flux + +![Cas d’usage - Dissocier des comptes - Authentification Hub](./assets/ML2RA_3PaL_ucUnlinkAccounts-HubHostAuth_Feb22-a_P1&2.png) +>Schéma de flux UC : Dissocier des comptes - Auth Hub + +### Liaison de Comptes - Échec de Découverte de Compte + +#### Description + +Ce flux permet au Switch de gérer les cas où un utilisateur PISP autorisé essaie de lier un compte DFSP à son profil PISP avec une paire DFSP/Identifiant invalide. Le DFSP signale une erreur au Switch, qui notifie le PISP approprié et l’utilisateur reçoit un message pour réessayer avec une autre paire DFSP/Identifiant. + +#### Schéma de Flux + +![Cas d’usage - Liaison de comptes - Échec découverte compte](./assets/ML2RA_3PaL-ucLinkAccnts-AccntDiscoveryFail_Mar22-a.png) +>Schéma de flux UC : Échec de découverte de compte + +### Liaison de Comptes - DFSP Rejette la Demande de Consentement + +#### Description + +Ce flux permet au Switch de gérer les cas où un utilisateur PISP autorisé demande la liaison de comptes à son profil PISP, mais où le DFSP refuse le consentement pour une raison quelconque (ex. : le compte sélectionné ne supporte pas la liaison). Le DFSP signale l’erreur et le Switch notifie le PISP concerné ; l’utilisateur PISP reçoit un message (in-app ou autre) l’invitant à réessayer. + +#### Schéma de Flux + +![Cas d’usage - Liaison de comptes - DFSP Rejette Demande de Consentement](./assets/ML2RA_3PaL-ucLinkAccnts-DfspRejectConsentReq_Mar22-a.png) +>Schéma de flux UC : Rejet DFSP + +### Erreur d’Enregistrement de Justificatif + +#### Description + +Ce flux permet au Switch de gérer les cas où un titulaire de compte DFSP soumet au PISP une demande pour qu'un utilisateur crée un justificatif embarqué sur appareil pour confirmer une demande de consentement, mais le justificatif transmis comporte une signature ou des métadonnées invalides. Le DFSP signale l’erreur, qui est communiquée au PISP, informant ainsi l’utilisateur PISP du rejet du justificatif de consentement. + +#### Schéma de Flux + +![Cas d’usage - Erreur d’enregistrement de justificatif](./assets/ML2RA_3PaL-ucCredentialRegError_Mar22-a_P1&2.png) +>Schéma de flux UC : Erreur enregistrement justificatif + +### Dissociation de comptes - Consentement Introuvable + +#### Description + +Ce flux permet au Switch de gérer les cas où un utilisateur PISP autorisé se voit demander de confirmer une demande de consentement (émise via le PISP ou le DFSP) pour dissocier un compte DFSP de son profil PISP. Le Switch soumet la demande au Consent Oracle pour vérification de l’ID du détenteur du consentement. Si l’ID ne peut pas être confirmé, la demande échoue. L’utilisateur PISP est informé via le DFSP ou le PISP que le compte à dissocier n’a pas été trouvé. + +#### Schéma de Flux + +![Cas d’usage - Dissociation - Consentement introuvable](./assets/ML2RA_3PaL-ucUnlinkAccnts-ConsentNotFound_Mar22a.png) +>Schéma de flux UC : Consentement introuvable + +### DFSP Rejette OTP/Tokène d’authentification du PISP + +#### Description + +Ce flux permet au Switch de gérer les cas où un utilisateur PISP, autorisé, souhaite lier un ou plusieurs comptes DFSP à son profil PISP. La demande est transmise au DFSP qui génère un OTP/flux d’authentification web pour l’utilisateur. Si la réponse (tokène) est altérée ou expirée, le DFSP signale l’erreur au Switch, qui informe l’utilisateur PISP de l’échec de la demande de liaison. + +#### Schéma de Flux + +![Cas d’usage - DFSP rejette OTP/Tokène du PISP](./assets/ML2RA_3PaL-ucDfspRejectsOtpAuthTokenFromPisp_Mar22-a_P1&2.png) +>Schéma de flux UC : DFSP rejette OTP/tokène PISP + +### Dissociation de comptes - Échec en aval + +#### Description + +Ce flux permet au Switch de gérer les cas où la confirmation de consentement pour dissocier un compte DFSP échoue l'étape d’authentification/autorisation du Switch (ex. : erreur API FSPIOP en aval). L’erreur est notifiée au DFSP, qui décide de la suite à donner. L’utilisateur PISP est informé via le PISP que la demande de dissociation a échoué. + +#### Schéma de Flux + +![Cas d’usage - Dissociation - Échec en aval](./assets/ML2RA_3PaL-ucUnlinkAccntsDownstrmFail_Mar22-a_P1&2.png) +>Schéma de flux UC : Dissociation - échec en aval + +## Scénarios de Transfert + +***Remarque :*** *Pour alléger la description du flux, le lecteur doit noter que l’API Tiers Partie et le BC Paiements Initiés par des Tiers collaborent pour maintenir les informations sur les participants – l’interaction n’est pas toujours précisée ici, mais se fait ainsi : lorsque le BC API Tiers Partie met à jour l’état d’une transaction et qu’une information participant n’est pas en cache, le BC Paiements Initiés par Tiers la sollicite auprès du BC Gestion Cycle de Vie Participant et la transmet au BC API Tiers Partie pour inclusion dans les données présentées aux DFSP/PISP.* + +### Demande de Transaction Initiée par Tiers + +#### Description + +Ce flux permet au Switch d’autoriser les utilisateurs/applications PISP autorisés à émettre une demande à un DFSP pour effectuer une transaction au nom d’un titulaire de compte (généralement l’utilisateur PISP/app), en faveur d’un ou de plusieurs bénéficiaires tiers. La transaction est soumise à confirmation DFSP auprès du titulaire, et conclue dès la réception de la confirmation. Le Switch, selon les instructions DFSP, gère et met à jour les comptes concernés. + +Quelques exemples d’application de l’initiation de paiement par un tiers : + + - Paiements pair-à-pair (ex. : GPay en Inde) + - Paiement en ligne simplifié pour améliorer l’UX (ex. : PayPal) + - Logiciels de gestion de paie + +#### Schéma de Flux + +![Cas d’usage - Demande transaction initiée par tiers](./assets/ML2RA_3PaT-ucThirdPartyInitTransactReq_Mar22-a_P1P2P3bP4.png) +>Schéma de flux UC : Demande de transaction initiée par tiers + +### Demande de Transactions Groupées PISP + +#### Description + +Ce flux permet au Switch d’autoriser les utilisateurs/applications PISP à émettre une demande à un DFSP pour effectuer plusieurs transactions groupées au nom d’un titulaire, typiquement l’utilisateur PISP/app, en faveur d’un groupe de bénéficiaires tiers. La transaction est confirmée auprès du titulaire via le DFSP puis exécutée. Le Switch gère et met à jour tous les comptes selon les instructions DFSP. + +#### Schéma de Flux + +![Cas d’usage - Remplacer par exemple](./assets/ML2RA_3PaT-ucThirdPartyInitTransactReq_Mar22-a_P1P2P3bP4.png) +>Schéma de flux UC : Demande de transactions groupées PISP + +### Paiement vers un PISP – PISP Bénéficiaire + +#### Description + +Ce flux permet au Switch d’autoriser les utilisateurs DFSP à initier et exécuter des paiements au profit de PISP en tant que bénéficiaires via le Switch. Le flux prend en charge les paiements mono ou multidestinataires PISP. + +#### Schéma de Flux + +![Cas d’usage - Paiement vers un PISP – PISP bénéficiaire](./assets/ML2RA_3PaT-ucPayToPisp-PispAsPayee_Mar22-b_P1-2.png) +>Schéma de flux UC : Paiement vers un PISP – bénéficiaire + +### Échec de la Demande de Transaction Tiers – Recherche de Partie Invalide + +#### Description + +Ce flux permet au Switch de gérer les cas où un utilisateur PISP autorisé initie une transaction avec un identifiant de participant invalide. L’erreur est détectée à l’étape de récupération des parties et la demande est automatiquement terminée, l’utilisateur recevant une notification d’échec et la raison. + +#### Schéma de Flux + +![Cas d’usage - Remplacer par exemple](./assets/ML2RA_3PaT-ucTransactReqFail-BadPartyLookup_Mar22-b.png) +>Schéma de flux UC : Échec de demande transaction – Partie introuvable + +### Échec de la Demande de Transaction Tiers – Demande de Transaction Invalide + +#### Description + +Ce flux permet au Switch de gérer les cas où un utilisateur PISP autorisé initie une demande de transaction tierce, confirme correctement les données du bénéficiaire, mais où le DFSP du bénéficiaire ne trouve pas d’accord valide pour la transaction. Le Switch rejette la demande et notifie l’utilisateur initiateur de l’échec et des actions suggérées. + +#### Schéma de Flux + +![Cas d’usage - Échec Transaction – Transaction Invalide](./assets/ML2RA_3PaT-ucTransactReqFail-BadTransactReq_Mar22-b.png) +>Schéma de flux UC : Échec Transaction – Demande invalide + +### Échec de la Demande de Transaction Tiers – Échec FSPIOP Aval + +#### Description + +Ce flux permet au Switch de gérer les cas où une demande de transaction tierce confirmée échoue côté DFSP lors du processus de devis. Le Switch est informé de la défaillance et transmet la notification à l’utilisateur PISP via son application/processus PISP. + +#### Schéma de Flux + +![Cas d’usage - Échec de la demande – FSPIOP aval](./assets/ML2RA_3PaT-ucTransactReqFail-DownStreamFspiopFail_Mar22-b-P1-2.png) +>Schéma de flux UC : Échec de la demande – FSPIOP aval + +### Échec de la Demande de Transaction Tiers – Autorisation Invalide + +#### Description + +Ce flux permet au Switch de gérer les cas où un parcours de transaction tierce est initié, puis autorisé par un utilisateur PISP sur demande du titulaire DFSP, et où la réponse à la demande de défi DFSP comporte une signature invalide. Le Switch vérifie et notifie le titulaire DFSP qui annule la transaction et informe l’utilisateur PISP via le Switch et son gestionnaire de profil PISP. + +#### Schéma de Flux + +![Cas d’usage - Échec – Autorisation invalide](./assets/ML2RA_3PaT-ucTransactReqFail-AuthInvalid_Mar22-a-P1-3.png) +>Schéma de flux UC : Échec transaction – Autorisation invalide + +### Demande de Transaction Tiers Rejetée par l’Utilisateur + +#### Description + +Ce flux permet au Switch de gérer les cas où un utilisateur PISP initie et confirme une transaction via son PISP, mais décline la signature finale auprès du DFSP. Après refus, le PISP prévient le DFSP via le Switch, qui annule la transaction et envoie la confirmation d’annulation au PISP initiateur. + +#### Schéma de Flux + +![Cas d’usage - Transaction rejetée par utilisateur](./assets/ML2RA_3PaT-ucTransactReqFail-rejectedByUser_Mar22-a-P1-3.png) +>Schéma de flux UC : Transaction rejetée par l’utilisateur + +### Échec de la Demande de Transaction Tiers – Timeout DFSP + +#### Description + +Ce flux permet au Switch de gérer les cas où un utilisateur PISP initie et confirme une transaction via son PISP mais ne répond pas dans le délai requis à la demande d’acceptation de devis et de signature DFSP. Passé le délai, le PISP signale le défaut au DFSP via le Switch et le DFSP annule la transaction et notifie l’utilisateur de l’échec de la demande. + +#### Schéma de Flux + +![Cas d’usage - Timeout DFSP](./assets/ML2RA_3PaT-ucTransactReqFail-dfspTimeout_Mar22-a-P1-3.png) +>Schéma de flux UC : Timeout DFSP + + + \ No newline at end of file diff --git a/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPayerFspInsufficientLiquid_Mar22a.png b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPayerFspInsufficientLiquid_Mar22a.png new file mode 100644 index 000000000..363b750a4 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPayerFspInsufficientLiquid_Mar22a.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfBulk_2022-03-22-a.png b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfBulk_2022-03-22-a.png new file mode 100644 index 000000000..4a8c4de05 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfBulk_2022-03-22-a.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfDuplicPostIgnor_Mar22a.png b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfDuplicPostIgnor_Mar22a.png new file mode 100644 index 000000000..ec6365184 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfDuplicPostIgnor_Mar22a.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfDuplicPostResend_Mar22a.png b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfDuplicPostResend_Mar22a.png new file mode 100644 index 000000000..1487e20c6 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfDuplicPostResend_Mar22a.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfPayeeConfirm_Mar22a-P1-2.png b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfPayeeConfirm_Mar22a-P1-2.png new file mode 100644 index 000000000..8f9d61adb Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfPayeeConfirm_Mar22a-P1-2.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfPayeeFspReject_Mar22a.png b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfPayeeFspReject_Mar22a.png new file mode 100644 index 000000000..a85064494 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfPayeeFspReject_Mar22a.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfTimeoutDuplicPostNoMatch_Mar22a.png b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfTimeoutDuplicPostNoMatch_Mar22a.png new file mode 100644 index 000000000..10256bae5 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfTimeoutDuplicPostNoMatch_Mar22a.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfTimeoutPostCommit_Mar22a.png b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfTimeoutPostCommit_Mar22a.png new file mode 100644 index 000000000..1a9ffefbb Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfTimeoutPostCommit_Mar22a.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfTimeoutPreCommit_Mar22b-P1-2.png b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfTimeoutPreCommit_Mar22b-P1-2.png new file mode 100644 index 000000000..2f11f3088 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfTimeoutPreCommit_Mar22b-P1-2.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfTimeoutPrepare_Mar22a.png b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfTimeoutPrepare_Mar22a.png new file mode 100644 index 000000000..7d17ba4cf Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfTimeoutPrepare_Mar22a.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfUniMode_Mar22a.png b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfUniMode_Mar22a.png new file mode 100644 index 000000000..a8e55e640 Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucPerformTrfUniMode_Mar22a.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucQueryTrfGET_Mar22a.png b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucQueryTrfGET_Mar22a.png new file mode 100644 index 000000000..0bfbd6a1f Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucQueryTrfGET_Mar22a.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucTransferPrepReject_Mar22a.png b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucTransferPrepReject_Mar22a.png new file mode 100644 index 000000000..88d4cc4ce Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucTransferPrepReject_Mar22a.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucTransferPrepValidationFail-InvalidPayee_Mar22a.png b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucTransferPrepValidationFail-InvalidPayee_Mar22a.png new file mode 100644 index 000000000..9ff7d8fda Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucTransferPrepValidationFail-InvalidPayee_Mar22a.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucTransferPrepValidationFail-InvalidPayer_Mar22a.png b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucTransferPrepValidationFail-InvalidPayer_Mar22a.png new file mode 100644 index 000000000..4239eb31e Binary files /dev/null and b/docs/fr/technical/reference-architecture/boundedContexts/transfers/assets/ML2RA_Trf_ucTransferPrepValidationFail-InvalidPayer_Mar22a.png differ diff --git a/docs/fr/technical/reference-architecture/boundedContexts/transfers/index.md b/docs/fr/technical/reference-architecture/boundedContexts/transfers/index.md new file mode 100644 index 000000000..b70e688c4 --- /dev/null +++ b/docs/fr/technical/reference-architecture/boundedContexts/transfers/index.md @@ -0,0 +1,261 @@ +# BC Transferts + +Le BC Transferts est responsable de l'orchestration des demandes de transfert. Il fonctionne en concert avec plusieurs autres BCs, notamment Règlements (Settlements), Planification (Scheduling), Gestion du Cycle de Vie des Participants, Comptes & Soldes, ainsi que le FSPIOP. + +## Termes + +Les termes suivants sont utilisés dans ce BC, également appelé domaine. + +| Terme | Description | +|---|---| +| **Comptes** | Désigne les comptes utilisés dans toutes les activités de transfert. Ils servent à enregistrer les positions créditrices et débitrices, soit de manière temporaire dans le cas des comptes alloués spécifiquement pour les transferts, soit de façon permanente dans le cas des mises à jour finales sur les comptes des participants. | +| **Participant/Acteur** | Désigne généralement les parties DFSP Payeur/Bénéficiaire utilisant Mojaloop. | +| **IGS** | Méthode de règlement des transferts - Règlement Brut Immédiat (Immediate Gross Settlement). Ce processus est typiquement utilisé dans les environnements à haut volume comme le commerce de détail, et s’applique aux comptes individuels ou partagés. Dans le cas de comptes partagés, le système met à jour les soldes des Participants en modifiant la valeur proportionnelle des fonds détenus par chaque Participant sur le total disponible du compte. | +| **DNS** | Méthode de règlement des transferts - Règlement Net Différé (Deferred Net Settlement). Ce processus est fréquemment utilisé dans les environnements où plusieurs Participants réalisent un transfert nécessitant un règlement global entre eux. Par exemple, lorsque des matières premières sont vendues par le Participant A au Participant B pour être transformées en produits finis, puis revendues par le Participant B au Participant A. Le switch calcule alors la valeur proportionnelle due à chaque Participant de la transaction, et effectue le règlement à la clôture de la fenêtre de règlement. | + +## Vue Fonctionnelle - Transferts - Bulk + +![Vue Fonctionnelle - Transferts - Bulk](./assets/ML2RA_Trf_ucPerformTrfBulk_2022-03-22-a.png) +>Diagramme de flux UC : Vue Fonctionnelle - Transferts - Bulk + +## Cas d’Utilisation + +### Effectuer un Transfert (mode universel) + +#### Description + +Le flux de ce cas d'utilisation (UC) permet au BC d’effectuer un transfert en utilisant une méthode qui exclut l’intervention de l’Acteur. + +#### Diagramme de flux + +![Effectuer un Transfert (Mode Universel)](./assets/ML2RA_Trf_ucPerformTrfUniMode_Mar22a.png) +>Diagramme de flux UC : Effectuer un Transfert (Mode Universel) + +### Effectuer un Transfert avec Confirmation du Bénéficiaire + +#### Description + +Le flux de ce cas d’utilisation permet au BC d’effectuer un transfert via une méthode incluant l’intervention de l’Acteur. + +#### Diagramme de flux + +![Cas d’utilisation - Effectuer un Transfert avec Confirmation du Bénéficiaire](./assets/ML2RA_Trf_ucPerformTrfPayeeConfirm_Mar22a-P1-2.png) +>Diagramme de flux UC : Effectuer un Transfert avec Confirmation du Bénéficiaire + +### Requête (GET) Transfert + +#### Description + +Le flux de ce cas d’utilisation permet au BC de fournir un mécanisme de requête pour qu’un Participant puisse interroger l’état d’un transfert. + +#### Diagramme de flux + +![Cas d’utilisation - Requête (GET) Transfert](./assets/ML2RA_Trf_ucQueryTrfGET_Mar22a.png) +>Diagramme de flux UC : Requête (GET) Transfert + +### Effectuer un Transfert – Duplicate POST (Réémission) + +#### Description + +Le flux de ce cas d’utilisation permet au BC de traiter une demande de transfert dupliquée. + +#### Diagramme de flux + +![Cas d’utilisation - Effectuer un Transfert – Duplicate POST (Réémission)](./assets/ML2RA_Trf_ucPerformTrfDuplicPostResend_Mar22a.png) +>Diagramme de flux UC : Effectuer un Transfert – Duplicate POST (Réémission) + +### Effectuer un Transfert – Duplicate POST (Ignorer) + +#### Description + +Le flux de ce cas d’utilisation permet au BC d’ignorer une demande de transfert dupliquée. + +#### Diagramme de flux + +![Cas d’utilisation - Effectuer un Transfert – Duplicate POST (Ignorer)](./assets/ML2RA_Trf_ucPerformTrfDuplicPostIgnor_Mar22a.png) +>Diagramme de flux UC : Effectuer un Transfert – Duplicate POST (Ignorer) + +## Variantes des cas d’utilisation (hors scénario nominal) + +### Effectuer un Transfert - PayeeFSP Rejette le Transfert + +#### Description + +Le flux de ce cas d’utilisation permet au BC de terminer une demande de transfert rejetée par le Bénéficiaire. + +#### Diagramme de flux + +![Cas d’utilisation - Effectuer un Transfert - PayeeFSP Rejette le Transfert](./assets/ML2RA_Trf_ucPerformTrfPayeeFspReject_Mar22a.png) +>Diagramme de flux UC : Effectuer un Transfert - PayeeFSP Rejette le Transfert + +### Effectuer un Transfert - Timeout (Prepare) + +#### Description + +Ce flux permet au BC de terminer une demande de préparation de transfert lorsque le seuil de timeout est dépassé. + +#### Diagramme de flux + +![Cas d’utilisation - Effectuer un Transfert - Timeout (Prepare)](./assets/ML2RA_Trf_ucPerformTrfTimeoutPrepare_Mar22a.png) +>Diagramme de flux UC : Effectuer un Transfert - Timeout (Prepare) + +### Effectuer un Transfert - Timeout (Pre-Committed) + +#### Description + +Ce flux permet au BC de terminer une demande de transfert pré-engagée (pre-committed) dépassant le délai. + +#### Diagramme de flux + +![Cas d’utilisation - Effectuer un Transfert - Timeout (Pre-Committed)](./assets/ML2RA_Trf_ucPerformTrfTimeoutPreCommit_Mar22b-P1-2.png) +>Diagramme de flux UC : Effectuer un Transfert - Timeout (Pre-Committed) + +### Effectuer un Transfert - Timeout (Post-Committed) + +#### Description + +Ce flux permet au BC de terminer une demande de transfert post-engagée (post-committed) dont le délai est dépassé. + +#### Diagramme de flux + +![Cas d’utilisation - Effectuer un Transfert - Timeout (Post-Committed)](./assets/ML2RA_Trf_ucPerformTrfTimeoutPostCommit_Mar22a.png) +>Diagramme de flux UC : Effectuer un Transfert - Timeout (Post-Committed) + +### Effectuer un Transfert - Duplicate POST (Aucun Correspondant) + +#### Description + +Ce flux permet au BC de terminer une demande de transfert dupliquée ne correspondant à aucune transaction existante, lorsqu’un timeout survient. + +#### Diagramme de flux + +![Cas d’utilisation - Effectuer un Transfert - Duplicate POST (Aucun Correspondant)](./assets/ML2RA_Trf_ucPerformTrfTimeoutDuplicPostNoMatch_Mar22a.png) +>Diagramme de flux UC : Effectuer un Transfert - Duplicate POST (Aucun Correspondant) + +### Effectuer un Transfert - Liquidity Insuffisante du Payeur FSP + +#### Description + +Ce flux permet au BC de décliner une demande de transfert échouée car le Payeur ne dispose pas d’assez de liquidités pour couvrir la transaction. + +#### Diagramme de flux + +![Cas d’utilisation - Effectuer un Transfert - Liquidité Insuffisante du Payeur FSP](./assets/ML2RA_Trf_ucPayerFspInsufficientLiquid_Mar22a.png) +>Diagramme de flux UC : Effectuer un Transfert - Liquidité Insuffisante du Payeur FSP + +### Effectuer un Transfert - Échec de Validation lors de la Préparation (Payeur Invalide) + +#### Description + +Ce flux permet au BC de mettre fin à une demande de préparation de transfert qui échoue lors de la validation, du fait d’un payeur invalide ou inexistant. + +#### Diagramme de flux + +![Cas d’utilisation - Effectuer un Transfert - Échec de Validation lors de la Préparation (Payeur Invalide)](./assets/ML2RA_Trf_ucTransferPrepValidationFail-InvalidPayer_Mar22a.png) +>Diagramme de flux UC : Effectuer un Transfert - Échec de Validation lors de la Préparation (Payeur Invalide) + +### Effectuer un Transfert - Échec de Validation lors de la Préparation (Bénéficiaire Invalide) + +#### Description + +Ce flux permet au BC de terminer une demande de préparation qui échoue car le bénéficiaire n'est pas valide ou inexistant. + +#### Diagramme de flux + +![Cas d’utilisation - Effectuer un Transfert - Échec de Validation lors de la Préparation (Bénéficiaire Invalide)](./assets/ML2RA_Trf_ucTransferPrepValidationFail-InvalidPayee_Mar22a.png) +>Diagramme de flux UC : Effectuer un Transfert - Échec de Validation lors de la Préparation (Bénéficiaire Invalide) + +### Requête (GET) Transfert - Échec de Validation (Payeur Invalide) + +#### Description + +Ce flux permet au BC de terminer une requête d’état de transfert lorsque la validation échoue en raison d’un payeur invalide ou inexistant. + + + +### Requête (GET) Transfert - Échec de Validation (Bénéficiaire Invalide) + +#### Description + +Ce flux permet au BC de terminer une requête d’état de transfert lorsque la validation échoue à cause d’un bénéficiaire invalide ou inexistant. + + + +### Requête (GET) Transfert - Échec de Validation (Identifiant de Transfert Introuvable) + +#### Description + +Ce flux permet au BC de terminer une requête d’état de transfert lorsque la validation échoue en raison d’un identifiant de transfert introuvable. + + + +## Modèle Canonique + +Mojaloop utilise deux modèles canoniques pour gérer les transferts de fonds : un pour les transferts simples (hors bulk) et un pour les transferts groupés (bulk). + +### Modèle Canonique Standard + +* Transfert + * transferId + * transferType + * quoteld (optionnel) + * settlementModelId + * Participants + * Payeur + * participantId + * Comptes + * Débit + * accountId + * accountType + * devise (currency) + * Crédit + * accountId + * accountType + * devise (currency) + * Bénéficiaire + * participantId + * Comptes + * Débit + * accountId + * accountType + * devise (currency) + * Crédit + * accountId + * accountType + * devise (currency) + * Montant (montant à transférer) + * value (nombre) + * devise (code devise ISO) + * expiration (dateTime ISO) + * ilpPacket + * Extensions + +### Modèle Canonique Bulk + +* Transferts + * bulkId + * bulkQuoteId + * Transferts[] + * Transfert* (voir ci-dessus) + +## Commentaires Finaux + +* Le FSP Payeur ne doit pas être autorisé à forcer unilatéralement l’expiration d’un transfert (peu importe son délai d’expiration), mais doit respecter les décisions de timeout du Switch. +* La validation des conditions cryptographiques et des accomplissements d’engagement serait gérée par le BC Transferts car il s’agit d’une composante fondamentale du « processus de transfert » (c’est-à-dire : cette fonction n’est pas spécifique au langage FSPIOP). +* Le BC Transferts appliquera le même modèle de validation que le BC Quoting & Party pour valider les Participants, pour déterminer la capacité d’un compte à effectuer une transaction, ou si un Participant est activé en mode exclusif. +* Le BC Transferts est l’unique « source de vérité » pour tous les transferts, il est donc responsable de la persistance de l’état des transferts. +* Désactiver des Participants déjà dans un état « préparé » ne doit pas empêcher le traitement des transferts en cours. Néanmoins, toute nouvelle instruction de transfert reçue par le BC Transferts via des événements TransferPrepareAccountAllocated doit être refusée. + + + + +[^1]: Interfaces communes : [Liste des interfaces communes Mojaloop](../../commonInterfaces.md) diff --git a/docs/fr/technical/reference-architecture/furtherReading/README.md b/docs/fr/technical/reference-architecture/furtherReading/README.md new file mode 100644 index 000000000..20dbccd4b --- /dev/null +++ b/docs/fr/technical/reference-architecture/furtherReading/README.md @@ -0,0 +1,55 @@ +# Lectures complémentaires + +## Ressources de l’équipe + +Lors des sessions de planification de l’Architecture de Référence, l’équipe a utilisé différentes ressources pour conserver un historique des discussions et construire les modèles de cas d’utilisation nécessaires afin de répondre à l’ensemble des exigences possibles des parties prenantes pour la nouvelle architecture. + +N’hésitez pas à consulter les ressources de l’équipe via les liens fournis. + +**P.S.** Une ressource que vous pourriez particulièrement trouver utile est Miro, où nous conservons un enregistrement de l’ensemble des cas d’utilisation de « Bounded Context » actuellement utilisés par le système. + +***Note :** Veuillez garder à l’esprit que le document de l’Architecture de Référence est un document vivant et, en conséquence, il est mis à jour périodiquement pour diverses raisons. Cela signifie que les ressources que nous partageons avec vous sont toujours utilisées et peuvent changer occasionnellement.* + +| Ressource | Objectif | Lien/URL | +| --- | --- | --- | +| Miro | Création de diagrammes de flux des cas d’utilisation | [Miro - Architecture de Référence Mojaloop](https://miro.com/app/board/o9J_lJyA1TA=/) | +| Google Docs | Notes de sessions de travail pour l’équipe, fournissant des détails sur l’architecture de référence à inclure dans la proposition et la documentation d’introduction. | [Mojaloop 2.0 Reference Architecture Work Sessions](https://docs.google.com/document/d/1Nm6B_tSR1mOM0LEzxZ9uQnGwXkruBeYB2slgYK1Kflo/edit#heading=h.vymmtvqaio5b) | +| Google Sheets | Registre des interfaces courantes utilisées dans l’architecture Switch, ainsi que divers autres éléments. | [Mojaloop 2.0 Reference Architecture](https://docs.google.com/spreadsheets/d/1ITmAesHjRZICC0EUNV8vUVV8VDnKLjbSKu_dzhEa5Fw/edit#gid=1810993431) + +## Articles et documents de référence + +Les ressources ci-dessous ont été sélectionnées pour offrir un éclairage supplémentaire sur les modèles d’architecture ayant été mis en œuvre. + +| Ressource | Détails | +| --- | --- | +|[*Domain-Driven Design*, extrait de Wikipédia, l’encyclopédie libre](https://en.wikipedia.org/wiki/Domain-driven_design) | Éditeur : Wikipédia, l’encyclopédie libre ; Auteur : Communauté ; Date : non-spécifiée ; ±7min de lecture | +| [*Domain, Subdomain, Bounded Context, Problem/Solution Space in DDD: Clearly Defined*](https://medium.com/nick-tune-tech-strategy-blog/domains-subdomain-problem-solution-space-in-ddd-clearly-defined-e0b49c7b586c) | Éditeur : Medium.com ; Auteur : Nick Tune ; Date : 11/07/2020 ; ±7min de lecture | +| [*Strategic Domain-Driven Design*](https://microservices.io/patterns/decomposition/decompose-by-subdomain.html) | Éditeur : Vaadin.com ; Auteur : Petter Holmstrom | +| [*Pattern: Decompose by Subdomain Context*](https://microservices.io/patterns/decomposition/decompose-by-subdomain.html) | Éditeur : Microservices Architecture ; Auteur : Chris Richardson | +| [*Rest API Tutorial*](https://www.restapitutorial.com/) | Éditeur : Auto-édité ; Auteur : Todd Fredrich ; Licence : [Creative Commons Attribution ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-sa/4.0/) | +| [*Use Case*, extrait de Wikipédia, l’encyclopédie libre](https://en.wikipedia.org/wiki/Use_case) | En bref, et pour reprendre l’introduction de l’article Wikipédia, un cas d’utilisation est une liste d’actions ou d’étapes, généralement définissant les interactions entre un rôle (connu en Unified Modeling Language (UML) sous le nom d’acteur) et un système afin d’atteindre un objectif. L’acteur peut être un humain ou un autre système externe. En ingénierie système, les cas d’utilisation sont utilisés à un niveau plus élevé que dans l’ingénierie logicielle, représentant souvent des missions ou des objectifs de parties prenantes. Les exigences détaillées peuvent ensuite être capturées dans le Systems Modeling Language (SysML) ou comme des énoncés contractuels. | + +## Réunions d’itération de projet + +Les ressources ci-dessous sont des contributions aux « Technical Convenings » de Mojaloop par l’équipe d’architecture de référence à partir du début de l’année 2021. Elles incluent notes, diapositives et enregistrements vidéo. + +| Itération de projet (PI) | Période | Description | Lien/URL | +| --- | --- | --- | --- | +| PI-13 | Janvier 2021 | Performance de Mojaloop, évolutivité et mise à jour de l’architecture | [PI-13 Slides & Recording](https://community.mojaloop.io/t/mojaloop-performance-scalability-and-architecture-update/240) | +| PI-14 | Avril 2021 | Introduction et Architecture de Référence Mojaloop et TigerBeetle | [Enregistrement PI-14 (YouTube)](https://www.youtube.com/watch?v=UHxULJXIzj8) | +| PI-15 | Juillet 2021 | Architecture de Référence v1.0 | [Ressources PI-15](https://mojaloopcommunitymeeting.us2.pathable.com/meetings/virtual/ookcbEc6aDZgwyo2n) / [Vidéothèque PI-15 (YouTube)](https://www.youtube.com/playlist?list=PLSamWCIlxVXujHm4CWfyl6uLzcXJE1Zi_) | +| PI-16 | Octobre 2021 | Architecture de Référence et mise à jour V2 | [Agenda PI-16](https://github.com/mojaloop/documentation-artifacts/tree/master/presentations/pi_16_october_2021) / [Vidéothèque PI-16](https://mojaloop.io/video/pi-16-mojaloop-community-meeting-technical-sessions-october-2021/) | +| PI-17 | Janvier 2022 | Architecture de Référence : Documentation et mises à jour v.Next | [Présentation Architecture de Référence PI-17 (YouTube)](https://youtu.be/kqbEVbglBEM) | + + \ No newline at end of file diff --git a/docs/fr/technical/reference-architecture/gettingStarted/README.md b/docs/fr/technical/reference-architecture/gettingStarted/README.md new file mode 100644 index 000000000..687ff3899 --- /dev/null +++ b/docs/fr/technical/reference-architecture/gettingStarted/README.md @@ -0,0 +1,6 @@ +# Getting Started + +To help get you started with the Mojaloop Reference Architecture, select which of the options below best suits your needs: + +1. [Sub-menu](./subMenu/) +2. [Contribute to Mojaloop](https://docs.mojaloop.io/documentation/) diff --git a/docs/fr/technical/reference-architecture/gettingStarted/subMenu/README.md b/docs/fr/technical/reference-architecture/gettingStarted/subMenu/README.md new file mode 100644 index 000000000..ffdfdf924 --- /dev/null +++ b/docs/fr/technical/reference-architecture/gettingStarted/subMenu/README.md @@ -0,0 +1,11 @@ +# Sub Menu + +Some text. + +## Sub title 1 + +Some more text. + +## Sub title 2 + +Some more text. diff --git a/docs/fr/technical/reference-architecture/glossary/README.md b/docs/fr/technical/reference-architecture/glossary/README.md new file mode 100644 index 000000000..ebf7390bd --- /dev/null +++ b/docs/fr/technical/reference-architecture/glossary/README.md @@ -0,0 +1,14 @@ +# TBD Placeholder + + \ No newline at end of file diff --git a/docs/fr/technical/reference-architecture/howToImplement/README.md b/docs/fr/technical/reference-architecture/howToImplement/README.md new file mode 100644 index 000000000..cd51378ea --- /dev/null +++ b/docs/fr/technical/reference-architecture/howToImplement/README.md @@ -0,0 +1,2 @@ +# TBD Placeholder for vNext Implementation architecture + diff --git a/docs/fr/technical/reference-architecture/index.md b/docs/fr/technical/reference-architecture/index.md new file mode 100644 index 000000000..98f223627 --- /dev/null +++ b/docs/fr/technical/reference-architecture/index.md @@ -0,0 +1,17 @@ +--- +home: true +heroImage: /mojaloop_logo_med.png +tagline: This is the official Reference Architecture documentation for the Mojaloop project. + + +actionText: Introduction → +actionLink: /introduction/ + +features: +- title: What it is + details: In a software system, a Reference Architecture is a set of software design documents, that capture the essence of the product and provide guidance to its technical evolution. The Reference Architecture is the architectural vision of the perfect design. +- title: Objectives + details: Identify abstractions, interfaces and standardization opportunities; Solutions and patterns to common problems; Enforces technical design principles; Provides guidance to the implementation architectures; Foster's innovation and contribution, by defining what can be done and how +- title: Benefits + details: Foundation for a Technical Roadmap; Guidance to decision-making regarding technology choices and implementation strategies; Alignment between technical vision and product vision +--- diff --git a/docs/fr/technical/reference-architecture/introduction/assets/process.png b/docs/fr/technical/reference-architecture/introduction/assets/process.png new file mode 100644 index 000000000..55e8cf7ed Binary files /dev/null and b/docs/fr/technical/reference-architecture/introduction/assets/process.png differ diff --git a/docs/fr/technical/reference-architecture/introduction/index.md b/docs/fr/technical/reference-architecture/introduction/index.md new file mode 100644 index 000000000..d173b0b0b --- /dev/null +++ b/docs/fr/technical/reference-architecture/introduction/index.md @@ -0,0 +1,109 @@ +# Introduction + +## Qu'est-ce qu'une Architecture de Référence ? + +Dans un système logiciel, l’Architecture de Référence est un ensemble de documents de conception logicielle qui saisissent l’essence du produit et fournissent des indications pour son évolution technique. + +Ce concept peut être simplifié ainsi : + +_**L’Architecture de Référence représente la vision architecturale du design parfait.**_ + +Dans des conditions normales, ce design parfait n’est jamais réellement atteint, en partie car il n’y a ni suffisamment de temps, ni de ressources pour le mettre pleinement en œuvre, en partie car cette conception évolue et s’améliore plus vite qu’elle ne peut être réalisée. +Il est donc dans la nature d’une Architecture de Référence d’être un document vivant, continuellement mis à jour et enrichi. + +## Quels sont les objectifs de l’Architecture de Référence ? + +Les objectifs principaux de l’Architecture de Référence sont : + +* Identifier les abstractions, interfaces et opportunités de standardisation +* Proposer des solutions et des modèles à des problèmes courants +* Aider à l’application des principes de conception technique +* Fournir des orientations pour les architectures d’implémentation +* Favoriser l’innovation et la contribution, en définissant ce qui peut être fait et comment + +## Quels sont les bénéfices d’une Architecture de Référence ? + +Le premier bénéfice est qu’elle constitue la fondation idéale pour une Feuille de Route Technique. En ayant la vision future à l’esprit, on peut facilement créer une feuille de route technique par étapes, garantissant que les ressources et l’attention sont concentrées sur la valeur à long terme. + +Un autre avantage important concerne les orientations qu’elle donne pour la prise de décision en matière de choix technologiques et de stratégies d’implémentation. +Avec l’Architecture de Référence en tête, toute décision de développement peut être qualifiée de tactique ou de stratégique : + +* Tactique – ce qui est nécessaire immédiatement et qui peut faire l’objet d’exceptions à l’Architecture de Référence en raison d’un besoin urgent à forte valeur. Ces exceptions doivent être documentées en tant que dette technique pouvant être traitée ultérieurement. +* Stratégique – ce qui a vocation à durer et devrait être mis en œuvre conformément à l’Architecture de Référence, afin de s’en rapprocher. + +Enfin, et ce n’est pas moins important, elle assure l’alignement entre la vision technique et la vision produit, essentielle (voir ci-dessous concernant le processus et les modes de fonctionnement). + +## Processus de création et de maintien de l’Architecture de Référence + +Lors de la création de la version initiale de l’Architecture de Référence, l’équipe a suivi les étapes suivantes : + +1. Cartographie de l’Espace Problème – Documenter les différents domaines et sous-domaines de problèmes, ainsi que leur classification selon leur importance. +2. Cartographie du Contexte de l’Espace Solution – Regrouper les problèmes similaires selon leur objectif et contexte. +3. Cartographie individuelle des cas d’utilisation – Discuter et documenter les cas d’utilisation en détail, en tenant compte de l’ensemble de la solution. + +## Comment garder une Architecture de Référence à jour ? + +Le schéma ci-dessous illustre où se situe une architecture de référence par rapport aux autres processus de la plateforme Mojaloop ; ce qu’elle doit intégrer et comprendre, non seulement la vision et les principes, mais aussi les exigences, l’expérience passée et même favoriser l’innovation technique. + +![Effectuer un transfert (mode universel)](./assets/process.png) +> Introduction (Mojaloop 2.0 Reference Architecture): Comment garder l’Architecture de Référence à jour + + +## Principes guidant cette architecture + +La conception de l’Architecture de Référence Mojaloop 2.0 s’appuie sur les principes du Domain-Driven Design[^1], et s’inspire également des principes de SOLID[^2] pour la programmation orientée objet, notamment le principe de responsabilité unique (SRP). + +Pour expliquer comment l’architecture est interprétée par Mojaloop, nous incluons un bref aperçu de l’architecture du Domain-Driven Design. + +### Vue d’ensemble de l’architecture inspirée par le DDD + +L’implémentation de l’architecture inspirée du DDD pour Mojaloop inclut les concepts suivants : + +* **Espace Problème** — Typiquement, l’architecture DDD reconnaît les besoins métiers comme appartenant à des domaines distincts. Par exemple, un système eCommerce est vu comme un **_Domaine_**. Mais un système eCommerce possède plusieurs composants : gestion des stocks, panier d’achat, commande, etc. Chaque composant est classé en tant que **_Sous-domaine_**, qui apporte de la valeur au domaine, ici le système eCommerce. Mojaloop utilise un seul domaine : c’est un switch. + + L’Espace Problème est l’un des deux conteneurs où sont regroupés tous les problèmes métier identifiés (améliorations/services) à résoudre. Selon la complexité du problème métier (amélioration) ou la multiplicité des problèmes à résoudre, il est possible de faire évoluer la structure initiale des sous-domaines. Chaque problème est alors assigné à son propre sous-domaine. Il convient cependant de s’assurer de la nécessité de chaque sous-domaine, et de se concentrer uniquement sur ceux qui apportent de la valeur, afin d’éviter une multiplication inutile et confuse de sous-domaines dans l’Espace Problème. + + Ce cloisonnement des améliorations/services dans des sous-domaines séparés permet à différentes équipes de travailler sur des parties gérables du système, ce qui est plus efficace et moins risqué que de construire un système monolithique. Un avantage significatif de cette méthode est que le processus de développement tout entier peut ainsi être centré sur l’amélioration continue et la création de valeur pour la plateforme, plutôt que sur l’ajout de fonctions isolées. + + Typiquement, l’Espace Problème comprend trois grands types de conteneurs qui déterminent comment ou par quoi un problème peut être résolu, auxquels un quatrième a été ajouté pour les exigences non fonctionnelles (NFRs) : + + * Cœur — solutions nécessitant un développement interne pour leur mise en œuvre. + * Soutien (Supporting) — solutions pouvant être implémentées grâce à des produits du marché prêts à l’emploi : par exemple, connexion sécurisée. + * Générique — solutions pouvant s’appuyer sur des produits du marché, mais nécessitant du développement supplémentaire : par exemple, reporting ou authentification. + * Exigences Non Fonctionnelles (NFRs) — solutions nécessaires pour répondre à des besoins communs, sans apporter de valeur directe au produit. + +* **Espace Solution** — Le second grand pilier de l’architecture DDD est « l’Espace Solution ». Contrairement à l’Espace Problème, il ne s’intéresse pas à quoi résoudre, mais à comment résoudre un problème (amélioration/service), et comment les différentes solutions s’articulent entre elles. L’Espace Solution inclut donc nécessairement davantage d’informations et de détails techniques sur la manière de résoudre les problèmes. + + * L’Espace Solution introduit un certain nombre d’éléments pour faciliter et harmoniser les efforts de résolution des problèmes. + + * Les Contextes Délimités (« Bounded Contexts ») servent à regrouper des ensembles cohérents de solutions partageant leur propre langage. + + Bien souvent, la correspondance entre les Contextes Délimités et les Sous-domaines n’est pas univoque. Les Sous-domaines appartiennent à l’Espace Problème et les Contextes Délimités à l’Espace Solution ; il se peut donc qu’un Sous-domaine soit adressé par plusieurs Contextes Délimités, ou qu’un Contexte Délimité couvre plusieurs Sous-domaines. + + En général — et c’est vrai dans l’environnement Mojaloop — les solutions sont conçues et mises en œuvre sans connaître les dépendances d’infrastructure spécifiques ou le fonctionnement interne des autres Contextes Délimités. Cette approche favorise notamment la sécurité, en s’assurant que chaque Contexte Délimité ne connaît que son propre environnement et ses interfaces. Les échanges entre Contextes Délimités s’effectuent exclusivement via des API et des messages sécurisés. Des exemples de Contextes Délimités (CD) dans Mojaloop incluent : Comptes & Soldes, Virements & Transactions, etc. + +* **_Langage Ubiquitaire_** — c’est une approche encourageant l’utilisation d’un langage explicite et compris de tous, lors de la description des problèmes et solutions, de l’utilisateur final au développeur. Deux objectifs principaux au langage ubiquitaire : + + 1. S’assurer que les termes uniques sont identifiés et compris dans un même sens par toutes les parties au sein de leur Contexte Délimité. Par exemple, le terme « Compte » : il peut signifier un profil de compte pour l’un, et un compte du système comptable pour un autre. Il ne s’agit pas ici de chercher un langage universel pour tout le projet ou l’organisation, ce qui serait illusoire : il s’agit de s’assurer que chaque Contexte Délimité possède son jeu de termes parfaitement définis et partagés. + 2. Faire en sorte que ces termes soient utilisés partout : de l’interface utilisateur à la documentation, dans tous les supports du projet, et même dans le code. L’usage ubiquitaire des mêmes termes garantit la compréhension commune des problèmes et solutions décrits et résolus. + +* **_Préoccupations Transversales_**[^3] — Ce sont des aspects de la solution logicielle nécessitant une résolution dans plusieurs Contextes Délimités (ou fonctions/modules), tels que l’audit, la sécurité, l’authentification, ou la gestion de la configuration de la plateforme (métier et technique). Dans notre approche, ces préoccupations transversales sont séparées des Contextes Délimités. La plupart ont une nature distribuée, avec des composants centraux et des bibliothèques clientes. Elles sont représentées dans cette documentation comme l’équivalent des Contextes Délimités. + +### Principes SOLID + +En complément de l’architecture DDD, l’approche architecturale de Mojaloop s’inspire aussi des principes SOLID : + +* Responsabilité unique et interfaces internes permettant d’implémenter des domaines additionnels, comme ISO, sans modifier l’architecture principale +* Les entités logicielles doivent être étendues mais jamais modifiées. La règle : ne jamais modifier le cœur, toujours étendre via des modules ou nœuds additionnels +* Les fonctions utilisant des références à des classes de base doivent pouvoir utiliser des objets issus des classes dérivées sans le savoir +* Plusieurs interfaces client spécifiques valent mieux qu’une seule interface fourre-tout +* Bâtir les dépendances sur les abstractions, jamais sur les implémentations concrètes + + +### Notes + +[^1]: Pour aller plus loin : [Domain-driven design sur Wikipedia, l’encyclopédie libre](https://en.wikipedia.org/wiki/Domain-driven_design) + +[^2]: Pour aller plus loin : [SOLID sur Wikipedia, l’encyclopédie libre](https://en.wikipedia.org/wiki/SOLID) + +[^3]: Pour aller plus loin : [Préoccupation transversale](https://en.wikipedia.org/wiki/Cross-cutting_concern#:~:text=Cross%2Dcutting%20concerns%20are%20parts,oriented%20programming%20or%20procedural%20programming.) – Éditeur : Wikipedia, l’encyclopédie libre diff --git a/docs/fr/technical/reference-architecture/refarch/assets/ML2RA_in_RefArchOver_Core_Apr22c_1670.png b/docs/fr/technical/reference-architecture/refarch/assets/ML2RA_in_RefArchOver_Core_Apr22c_1670.png new file mode 100644 index 000000000..6402dc462 Binary files /dev/null and b/docs/fr/technical/reference-architecture/refarch/assets/ML2RA_in_RefArchOver_Core_Apr22c_1670.png differ diff --git a/docs/fr/technical/reference-architecture/refarch/assets/ML2RA_in_RefArchOver_Generic_Apr22c_1670.png b/docs/fr/technical/reference-architecture/refarch/assets/ML2RA_in_RefArchOver_Generic_Apr22c_1670.png new file mode 100644 index 000000000..17b11b5ab Binary files /dev/null and b/docs/fr/technical/reference-architecture/refarch/assets/ML2RA_in_RefArchOver_Generic_Apr22c_1670.png differ diff --git a/docs/fr/technical/reference-architecture/refarch/assets/ML2RA_in_RefArchOver_NFRs_Apr22c_1670.png b/docs/fr/technical/reference-architecture/refarch/assets/ML2RA_in_RefArchOver_NFRs_Apr22c_1670.png new file mode 100644 index 000000000..523373d7a Binary files /dev/null and b/docs/fr/technical/reference-architecture/refarch/assets/ML2RA_in_RefArchOver_NFRs_Apr22c_1670.png differ diff --git a/docs/fr/technical/reference-architecture/refarch/assets/ML2RA_in_RefArchOver_SolutionSpace_Apr22a.png b/docs/fr/technical/reference-architecture/refarch/assets/ML2RA_in_RefArchOver_SolutionSpace_Apr22a.png new file mode 100644 index 000000000..4034289ad Binary files /dev/null and b/docs/fr/technical/reference-architecture/refarch/assets/ML2RA_in_RefArchOver_SolutionSpace_Apr22a.png differ diff --git a/docs/fr/technical/reference-architecture/refarch/assets/ML2RA_in_RefArchOver_Supporting_Apr22c_1670.png b/docs/fr/technical/reference-architecture/refarch/assets/ML2RA_in_RefArchOver_Supporting_Apr22c_1670.png new file mode 100644 index 000000000..8ad905989 Binary files /dev/null and b/docs/fr/technical/reference-architecture/refarch/assets/ML2RA_in_RefArchOver_Supporting_Apr22c_1670.png differ diff --git a/docs/fr/technical/reference-architecture/refarch/assets/ML2RA_in_RefArchOver_newUnclassified_Apr22c_1670.png b/docs/fr/technical/reference-architecture/refarch/assets/ML2RA_in_RefArchOver_newUnclassified_Apr22c_1670.png new file mode 100644 index 000000000..5d2299425 Binary files /dev/null and b/docs/fr/technical/reference-architecture/refarch/assets/ML2RA_in_RefArchOver_newUnclassified_Apr22c_1670.png differ diff --git a/docs/fr/technical/reference-architecture/refarch/index.md b/docs/fr/technical/reference-architecture/refarch/index.md new file mode 100644 index 000000000..5463f185b --- /dev/null +++ b/docs/fr/technical/reference-architecture/refarch/index.md @@ -0,0 +1,113 @@ +# Aperçu de l’Architecture de Référence Mojaloop + +## Espace Problème (_Identification des problèmes et cartographie_) + +Comme indiqué dans l’aperçu de l’architecture DDD, l’Espace Problème contient un certain nombre de conteneurs orientés solution identifiés par l’équipe d’architectes système, qui servent à catégoriser les sous-domaines où des problèmes (améliorations) ont été détectés. + +### Problèmes Cœur + +#### Description + +Un certain nombre de problèmes Cœur (améliorations) ont été identifiés par (Business/Développeurs/Business & Développeurs). Afin de mettre en œuvre ces améliorations, des équipes de développement « internes » seront chargées de développer les solutions requises. Généralement, les sous-domaines ainsi identifiés générèrent une valeur significative pour le système Mojaloop ; il est donc essentiel de s’assurer que les services qu’ils fournissent ne soient pas compromis. Les exemples de sous-domaines Cœur incluent : la gestion du cycle de vie des participants, le règlement et la planification. + +#### Carte à Haut Niveau + +![Core Problems](./assets/ML2RA_in_RefArchOver_Core_Apr22c_1670.png) +> Architecture de Référence (Mojaloop): Problèmes Cœur + +### Problèmes Génériques + +#### Description + +Un certain nombre de problèmes Génériques (améliorations) ont été identifiés par (Business/Développeurs/Business & Développeurs). Afin de les mettre en œuvre, des solutions du marché seront adoptées sans nécessiter de personnalisation supplémentaire. Une intégration avec Mojaloop sera cependant nécessaire. Les exemples de sous-domaines de problèmes génériques comprennent l’authentification, le FRMS et la surveillance de la plateforme. + +#### Carte à Haut Niveau + +![Generic Problems](./assets/ML2RA_in_RefArchOver_Generic_Apr22c_1670.png) +> Architecture de Référence (Mojaloop): Problèmes Génériques + +### Problèmes de Support + +#### Description + +Un certain nombre de problèmes de Support (améliorations) ont été identifiés par (Business/Développeurs/Business & Développeurs). Pour les mettre en œuvre, des solutions du marché seront également adoptées, mais une personnalisation additionnelle sera demandée pour intégrer pleinement ces solutions au système Mojaloop et répondre aux problèmes identifiés. Exemples de sous-domaines Support : gestion des politiques d’accès, reporting et autorisation (vérification du contenu des politiques d’accès). + +#### Carte à Haut Niveau + +![Supporting Problems](./assets/ML2RA_in_RefArchOver_Supporting_Apr22c_1670.png) +> Architecture de Référence (Mojaloop): Problèmes de Support + +### Exigences Non Fonctionnelles + +#### Description + +Plusieurs exigences non fonctionnelles ont été identifiées par (Business/Développeurs/Business & Développeurs). Bien qu’elles n’ajoutent pas de valeur directe à Mojaloop, elles sont nécessaires pour répondre à certains problèmes (améliorations) métier. Par exemple, la sécurité n’occupe pas son propre sous-domaine : tous les sous-domaines du système devront inclure des éléments de code liés à la sécurité pour répondre à cette exigence, ou bien un service centralisé de gestion de la sécurité sera mis en place, permettant de gérer et de construire des profils de sécurité pour chaque sous-domaine, qui seront téléchargés lors de la jonction au Domaine ou à l’initialisation, et/ou poussés lors de mises à jour par le service central. + +#### Carte à Haut Niveau + +![Non-Functional Requirements](./assets/ML2RA_in_RefArchOver_NFRs_Apr22c_1670.png) +> Architecture de Référence (Mojaloop): Exigences Non Fonctionnelles + +### Nouveaux Problèmes et Non Classifiés (hors-domaine) + +#### Description + +Un certain nombre de nouveaux problèmes et problèmes non classifiés (hors-domaine) ont été identifiés à la fois par les équipes métiers et techniques. Dès que le métier et les architectes du système ont identifié la solution requise, ceux-ci seront classés dans l’un des conteneurs de problème et traités selon le processus associé. + +#### Carte à Haut Niveau + +![New & Unclassified Problems](./assets/ML2RA_in_RefArchOver_newUnclassified_Apr22c_1670.png) +> Architecture de Référence (Mojaloop): Nouveaux Problèmes et Problèmes Non Classifiés + +## Espace Solution (_Description haut niveau et cartographie du contexte_) + +#### Description + +L’Espace Solution défini par l’architecture DDD se concentre sur la manière dont les problèmes métier (améliorations) identifiés dans l’espace problème seront résolus. Par conséquent, il comprend nécessairement plus d’informations et de détails techniques que l’Espace Problème. Il inclut des éléments comme le langage ubiquitaire, les contextes délimités (« Bounded Contexts ») et les préoccupations transversales (« Cross-Cutting Concerns »). + +#### Carte à Haut Niveau + +![Solution Space](./assets/ML2RA_in_RefArchOver_SolutionSpace_Apr22a.png) +> Architecture de Référence (Mojaloop): Espace Solution + +### Langage Ubiquitaire + +#### Description + +Un défi auquel la plupart des équipes sont confrontées est de maintenir une compréhension claire des termes qui peuvent ne pas être uniques à un domaine particulier. Un exemple classique de terme non unique est « compte » : ce terme pourrait désigner un ensemble de comptes financiers, le profil d’une entité ou un identifiant de connexion. + +Comme indiqué dans l’introduction, le langage ubiquitaire sert à éliminer la confusion et la mauvaise communication entre les équipes métiers et techniques qui travaillent à la résolution d’un (groupe de) problème(s) métier. Bien qu’il soit possible que chaque Domaine/Sous-domaine contienne des termes non uniques, il est essentiel, dans chaque contexte particulier — pour l’architecture DDD, c’est-à-dire un contexte limité (« Bounded Context ») — que tous les termes y soient uniques, compris de tous les participants, et appliqués correctement. + +Pour plus d’informations et une description de chacun des termes uniques utilisés dans le domaine Mojaloop, veuillez consulter le [Glossaire](../glossary/README.md) annexé à ce document. + +### Contextes Délimités (« Bounded Contexts ») + +Les contextes délimités suivants ont été identifiés et mis en œuvre dans Mojaloop : + +> Il s'agit d'une description de haut niveau de chacun des contextes délimités qui ont été identifiés et inclus dans l’Architecture de Référence Mojaloop. Une vue détaillée figure dans la section [Contexte Délimité](../boundedContexts/index.md) de ce document. + +| Contexte Délimité | Objectif | Contexte Délimité | Objectif | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Règlements (Settlements) | Exécute les règlements
    Configure les modèles de règlement
    Calcule les règlements | Gestion du Cycle de Vie du Participant | Onboarding des participants
    Gestion du cycle de vie
    Self-service participant
    Interface self-service participant | +| Recherche & Découverte de Compte | Noyau Oracle interne
    Recherche/découverte de compte
    Traitement en masse
    Gestion des identifiants en double
    Connexions inter-schéma (y compris règlements) | Comptes & Soldes | Système d’enregistrement des activités financières et des soldes du participant DFSP | +| Transferts & Transactions | Traitement des transferts
    Vérification de la liquidité pour chaque transfert
    Transactions en masse
    Multi-devises, incluant les transactions multi-hop | Accord (Cotations) | Accord/cotation (cœur)
    Transactions de masse
    Multi-devises, incluant multi-hop
    Enforcement des règles schéma dans chaque Contexte Délimité | +| Planification | Planification des événements d’API selon le temps (cœur) | Notifications & Alertes | État de notification - priorisation & SLA (cœur)
    Gestion des triggers & alertes (cœur)
    Livraison notifications - priorité et SLA (générique) | +| API Interop des FSP | API externe ISO (masse ; API, callbacks déclenchés (transferts uniquement, manquant dans l’AS-IS actuel) | Paiements Initiés par Tiers | Liaison de compte PISP
    Gestion du consentement
    Initiation de paiement par un tiers (cœur) | +| API tiers | | API externe Mojaloop PISP
    API externe ISO PISP | | + +### Préoccupations Transversales (« Cross cutting concerns ») + +Les préoccupations transversales suivantes ont été identifiées dans Mojaloop : + +| Préoccupation Transversale (BC) | Objectif | +| ----------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| AuthZ & AuthN et Gestion des Identités BC | Gérer tous les aspects de l'authentification utilisateur/système (AuthN) et de l'autorisation (AuthZ). Les solutions prévues s’intègreront dans les catégories Générique et de Support. | +| Cryptographie BC | Gérer tous les services cryptographiques, notamment la gestion des clés, des certificats et des systèmes de stockage. Les solutions prévues relèvent de la catégorie Générique. | +| Reporting et Audit BC | Gérer tous les services d’audit et de reporting, notamment les rapports de conformité et d’assurance, journalisation d’événements judiciaires et KMS, accès et gestion des logs forensiques, monitoring des process et SLA, audit système. (Chaque Contexte contiendra des capacités d’audit. Le module Reporting & Auditing centralisera les logs de tous les contextes.) Solutions réparties dans les trois catégories problème. | +| Configuration Plateforme (Business) BC | Gérer le processus de gestion des règles/schémas (NB : leur enforcement reste dans chaque contexte), la gestion des schémas imposés, la gestion des applications, la sécurité, la gestion des identités et des accès (incluant la gestion des utilisateurs et des équipes), l’API bizops pour la gestion des consentements de liaison et la gestion des politiques d’accès. Concerné par tous les types de problèmes. | +| Gestion Technique de la Plateforme BC | Gérer la surveillance et la gestion de la plateforme. Solutions prévues dans la catégorie Générique. | + + + \ No newline at end of file diff --git a/docs/fr/technical/technical/account-lookup-service/README.md b/docs/fr/technical/technical/account-lookup-service/README.md new file mode 100644 index 000000000..974fc9282 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/README.md @@ -0,0 +1,132 @@ +--- +version: 1.1 +--- + + +# Account Lookup Service + +Le **Account Lookup Service** (**ALS**) — *(voir la section `6.2.1.2`)* de la [spécification Mojaloop {{ $page.frontmatter.version }}](/api) — prend en charge les cas d’usage suivants : + +* Recherche de participant (*Participant Look-up*) +* Recherche de partie (*Party Look-up*) +* Gestion des informations du registre des participants + * Ajout d’informations du registre des participants + * Suppression d’informations du registre des participants + +Cas d’usage complémentaires pour l’exploitation du Hub : +* Opérations d’administration + * Gestion du routage des points de terminaison Oracle + * Gestion du routage des points de terminaison du *Switch* + +## 1. Considérations de conception + +### 1.1. Account Lookup Service (ALS) + +La conception de l’ALS fournit un composant « service central » générique du cœur Mojaloop. Il sert à l’alignement et au routage conformes à la spécification de l’API Mojaloop. Il prend en charge plusieurs registres de recherche (*Oracles*). L’ALS expose une API d’administration pour configurer le routage de chaque Oracle, sur le modèle de l’API du service central pour la configuration des points de terminaison de routage DFSP via le *Notification Handler* (composant ML-API-Adapter). L’ALS agit, en substance, comme un *switch* avec un stockage persistant des règles et de la configuration de routage. + +#### 1.1.1. Hypothèses + +* La conception ALS ne couvre pour l’instant qu’un seul *switch*. +* La prise en charge de plusieurs *switch* utilisera le même mécanisme de résolution DNS que celui prévu pour les frontières / réseaux (*Cross Border*). + +#### 1.1.2. Routage + +La configuration de routage repose sur les éléments suivants : + +* **PartyIdType** — voir la section `7.5.6` de la spécification Mojaloop +* **Currency** — voir la section `7.5.5` de la spécification Mojaloop. Code devise selon [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html) (chaîne alphabétique de trois lettres). Champ optionnel ; l’indicateur `isDefault` doit être à `true` si la devise n’est pas fournie. +* **isDefault** — indique qu’un Oracle donné est le fournisseur par défaut pour un **PartyIdType**. Plusieurs Oracles peuvent être « par défaut », mais un seul Oracle par défaut par **PartyIdType**. L’Oracle par défaut pour un **PartyIdType** n’est choisi que si la requête d’origine n’inclut pas de filtre sur la devise. + + +### 1.2. Oracle ALS + +L’Oracle ALS, mis en œuvre comme **Service** ou **Adaptateur** (sémantique selon le cas — médiation = adaptateur, service = implémentation), fournit un registre de recherche aux fonctionnalités proches des ressources API Mojaloop `/participants`. L’interface s’inspire de manière souple de la spécification ML API : elle suit un modèle synchrone, ce qui réduit les besoins de corrélation et de persistance du modèle de *callback* asynchrone direct de la spec ML API. Tous les services / adaptateurs Oracle ALS partagent ainsi une interface normalisée, médiatisée par l’ALS selon sa configuration de routage. +Ce composant (ou les systèmes en aval) assure aussi la persistance et les valeurs par défaut des détails des participants. + +## 2. Conception de la recherche de participants + +### 2.1. Vue d’ensemble de l’architecture +![Flux architectural Account-Lookup pour les participants](./assets/diagrams/architecture/arch-flow-account-lookup-participants.svg) + +_Note : le cas « recherche de participant » s’applique de la même façon à un scénario initié par le bénéficiaire, par exemple les `transactionRequests`. La différence est que le bénéficiaire est l’initiateur dans le schéma ci-dessus._ + +### 2.2. Diagrammes de séquence + +#### 2.2.1. GET Participants + +- [Diagramme de séquence GET Participants](als-get-participants.md) + +#### 2.2.2. POST Participants + +- [Diagramme de séquence POST Participants](als-post-participants.md) + +#### 2.2.3. POST Participants (lot) + +- [Diagramme de séquence POST Participants (lot)](als-post-participants-batch.md) + +#### 2.2.4. DEL Participants + +- [Diagramme de séquence DEL Participants](als-del-participants.md) + +## 3. Conception de la recherche de parties + +### 3.1. Vue d’ensemble de l’architecture +![Flux architectural Account-Lookup pour les parties](./assets/diagrams/architecture/arch-flow-account-lookup-parties.svg) + +### 3.2. Diagramme de séquence + +#### 3.2.1. GET Parties + +- [Diagramme de séquence GET Parties](als-get-parties.md) + +## 4. Conception de l’administration ALS + +### 4.1. Vue d’ensemble de l’architecture +![Flux architectural Account-Lookup — admin GET Oracles](./assets/diagrams/architecture/arch-flow-account-lookup-admin.svg) + +### 4.2. Diagrammes de séquence + +#### 4.2.1 GET Oracles + +- [Diagramme de séquence GET Oracles](als-admin-get-oracles.md) + +#### 4.2.2 POST Oracle + +- [Diagramme de séquence POST Oracle](als-admin-post-oracles.md) + +#### 4.2.3 PUT Oracle + +- [Diagramme de séquence PUT Oracle](als-admin-put-oracles.md) + +#### 4.2.4 DELETE Oracle + +- [Diagramme de séquence DELETE Oracle](als-admin-del-oracles.md) + +#### 4.2.5 DELETE cache de point de terminaison + +- [Diagramme de séquence DELETE cache de point de terminaison](als-del-endpoint.md) + +## 5. Conception de la base de données + +### 5.1. Schéma de base ALS + +#### Notes + +- `partyIdType` — valeurs initialement injectées selon la section _`7.5.6`_ de la [spécification Mojaloop {{ $page.frontmatter.version }}](../../api/README.md). +- `currency` — voir la section `7.5.5` de la spécification Mojaloop ; code selon [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). Optionnel ; une configuration « par défaut » est requise si aucune devise n’est fournie ou si seule la configuration de point de terminaison « par défaut » existe. +- `endPointType` — identifiant du type de point de terminaison (ex. `URL`) pour permettre d’autres transports plus tard. +- `migration*` — tables de métadonnées utilisées par le moteur Knex. +- Un `centralSwitchEndpoint` doit être associé à l’`OracleEndpoint` via l’API d’admin lors de l’insertion d’un nouvel enregistrement `OracleEndpoint`. S’il n’est pas fourni dans la requête API, il doit être positionné par défaut. + +![MCD du Account Lookup Service](./assets/entities/AccountLookupService-schema.png) + +* [MCD Account Lookup Service (DBeaver)](./assets/entities/AccountLookupDB-schema-DBeaver.erd) +* [Export MySQL Workbench Account Lookup Service](./assets/entities/AccountLookup-ddl-MySQLWorkbench.sql) + +## 6. Conception de l’Oracle ALS + +La conception détaillée de l’Oracle est hors périmètre de ce document ; elle dépend des exigences de chaque Oracle. + +### 6.1. Spécification d’API + +Voir **ALS Oracle API** dans la section [Spécifications d’API](../../api/README.md#als-oracle-api). diff --git a/docs/fr/technical/technical/account-lookup-service/als-admin-del-oracles.md b/docs/fr/technical/technical/account-lookup-service/als-admin-del-oracles.md new file mode 100644 index 000000000..23275a7b9 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/als-admin-del-oracles.md @@ -0,0 +1,7 @@ +# DELETE Oracles + +Conception de la suppression d’un oracle (administration ALS). + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-acct-lookup-admin-delete-oracle-7.3.4.svg) diff --git a/docs/fr/technical/technical/account-lookup-service/als-admin-get-oracles.md b/docs/fr/technical/technical/account-lookup-service/als-admin-get-oracles.md new file mode 100644 index 000000000..eb1b29ca5 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/als-admin-get-oracles.md @@ -0,0 +1,7 @@ +# GET Oracles + +Conception de la récupération des oracles (administration ALS). + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-acct-lookup-admin-get-oracle-7.3.1.svg) diff --git a/docs/fr/technical/technical/account-lookup-service/als-admin-post-oracles.md b/docs/fr/technical/technical/account-lookup-service/als-admin-post-oracles.md new file mode 100644 index 000000000..ed49381d4 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/als-admin-post-oracles.md @@ -0,0 +1,7 @@ +# POST Oracles + +Conception de la création d’un oracle (administration ALS). + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-acct-lookup-admin-post-oracle-7.3.2.svg) diff --git a/docs/fr/technical/technical/account-lookup-service/als-admin-put-oracles.md b/docs/fr/technical/technical/account-lookup-service/als-admin-put-oracles.md new file mode 100644 index 000000000..cf9724628 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/als-admin-put-oracles.md @@ -0,0 +1,7 @@ +# PUT Oracles + +Conception de la mise à jour d’un oracle (administration ALS). + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-acct-lookup-admin-put-oracle-7.3.3.svg) diff --git a/docs/fr/technical/technical/account-lookup-service/als-del-endpoint.md b/docs/fr/technical/technical/account-lookup-service/als-del-endpoint.md new file mode 100644 index 000000000..135d618d6 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/als-del-endpoint.md @@ -0,0 +1,7 @@ +# DELETE cache de point de terminaison + +Conception de la suppression du cache de point de terminaison (administration ALS). + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-acct-lookup-del-endpoint-cache-7.3.0.svg) diff --git a/docs/fr/technical/technical/account-lookup-service/als-del-participants.md b/docs/fr/technical/technical/account-lookup-service/als-del-participants.md new file mode 100644 index 000000000..f6c88ab3d --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/als-del-participants.md @@ -0,0 +1,11 @@ +# DEL Participants + +Conception de la suppression d’un participant par un DFSP. + +## Notes + +- Voir la section 6.2.2.4 — l’ALS doit vérifier que c’est bien le FSP actuel de la partie qui supprime l’information. C’est pris en compte dans la conception en s’assurant que la partie appartient au FSP qui demande la suppression. Les autres validations hors périmètre du *Switch* relèvent du schéma. + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-acct-lookup-del-participants-7.1.2.svg) diff --git a/docs/fr/technical/technical/account-lookup-service/als-get-participants.md b/docs/fr/technical/technical/account-lookup-service/als-get-participants.md new file mode 100644 index 000000000..ad9048234 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/als-get-participants.md @@ -0,0 +1,7 @@ +# GET Participants + +Conception de la récupération d’un participant par un DFSP. + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-acct-lookup-get-participants-7.1.0.svg) diff --git a/docs/fr/technical/technical/account-lookup-service/als-get-parties.md b/docs/fr/technical/technical/account-lookup-service/als-get-parties.md new file mode 100644 index 000000000..9ef29912d --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/als-get-parties.md @@ -0,0 +1,7 @@ +# GET Parties + +Conception de la récupération d’informations de partie (*Party*) par un DFSP. + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-acct-lookup-get-parties-7.2.0.svg) diff --git a/docs/fr/technical/technical/account-lookup-service/als-post-participants-batch.md b/docs/fr/technical/technical/account-lookup-service/als-post-participants-batch.md new file mode 100644 index 000000000..5d43df157 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/als-post-participants-batch.md @@ -0,0 +1,14 @@ +# Diagramme de séquence — POST Participants (lot) + +Conception de la création de participants par un DFSP via une requête groupée. + +## Notes + +- L’opération ne prend en charge que les requêtes où : + - tous les FSP des participants correspondent au `FSPIOP-Source` + - tous les participants partagent la même devise, conformément à l’appel `POST /participants` de l’[API FSPIOP Mojaloop](/api/fspiop/v1.1/api-definition.html#post-participants) +- Un second `POST` avec le même TYPE et une devise optionnelle correspondante est traité comme une **mise à jour** : l’enregistrement existant doit être **entièrement remplacé**. + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-acct-lookup-post-participants-batch-7.1.1.svg) diff --git a/docs/fr/technical/technical/account-lookup-service/als-post-participants.md b/docs/fr/technical/technical/account-lookup-service/als-post-participants.md new file mode 100644 index 000000000..671859421 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/als-post-participants.md @@ -0,0 +1,7 @@ +# POST Participant + +Conception de la création d’un participant par un DFSP via une requête. + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-acct-lookup-post-participants-7.1.3.svg) diff --git a/docs/fr/technical/technical/account-lookup-service/assets/.gitkeep b/docs/fr/technical/technical/account-lookup-service/assets/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/architecture/arch-flow-account-lookup-admin.svg b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/architecture/arch-flow-account-lookup-admin.svg new file mode 100644 index 000000000..d46ffa284 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/architecture/arch-flow-account-lookup-admin.svg @@ -0,0 +1,3 @@ + + +
    Account Lookup Service Admin
    (ALS)
    Account Lookup Service Adm...
    HUB
    Backend



    HUB...
    Account Lookup Admin
    Account Lookup Admin
    HUB Operator
    HUB Operator
    A1. Request Oracle Endpoints 
    GET /oracles
    A1. Requ...
    A1.3. Return List of Oracles
    A1.3. Re...
    ALS
    DB
    ALS...
    Key
    Key
    A1.2. Lookup All Oracle Registry Service End-points 
    API
    Internal Use-Only
    API...
    Viewer does not support full SVG 1.1
    \ No newline at end of file diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/architecture/arch-flow-account-lookup-participants.svg b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/architecture/arch-flow-account-lookup-participants.svg new file mode 100644 index 000000000..2bb5d7029 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/architecture/arch-flow-account-lookup-participants.svg @@ -0,0 +1,3 @@ + + +
    Account Lookup Service
    (ALS)

    [Not supported by viewer]
    FSP
    Backend

    (Does not natively speak Mojaloop API)



    [Not supported by viewer]
    Scheme-Adapter

    (Converts from Mojaloop API to backend FSP API)

    [Not supported by viewer]
    FSP
    Backend
      

    (Natively speaks Mojaloop API)



    [Not supported by viewer]
    Participants Account Lookup
    [Not supported by viewer]
    Payer FSP
    [Not supported by viewer]
    Payee FSP
    [Not supported by viewer]
    Party Store
    [Not supported by viewer]
    Party
    Store
    [Not supported by viewer]
    Persistance store
    [Not supported by viewer]
    Central Ledger
    Service
    [Not supported by viewer]
    A5. Retrieve Participant End-points GET /participants/<participantId>/endpoints
    A1. Request Participant Lookup
    GET /participants/<idType>/<id>
    [Not supported by viewer]
    A3. Request Participant Lookup via Oracle
    GET /participants/<idType>/<id>
    [Not supported by viewer]
    Oracle Merchant
    Registry Service
    <idType = 'BUSINESS'>
    [Not supported by viewer]
    A4. Alt
    A4. Alt

    <font color="#000000"><br></font>
    Persistance store
    [Not supported by viewer]
    Oracle Bank Account
    Registry Service
    <idType = 'ACCOUNT_ID'>
    [Not supported by viewer]
    A4. Alt
    A4. Alt

    <font color="#000000"><br></font>
    Oracle Pathfinder
    Registry Service
    Adapter
    <idType = 'MSISDN'>
    [Not supported by viewer]
    A4. Retrieve Participant Data
    [Not supported by viewer]

    <font color="#000000"><br></font>
    A3. Alt
    A3. Alt

    <font color="#000000"><br></font>
    A3. Alt
    A3. Alt

    <font color="#000000"><br></font>
    Mojaloop Central Services
    [Not supported by viewer]
    A7. User Lookup
    PUT /participants/<idType>/<id>
    A7. User Lookup <br>PUT /participants/<idType>/<id>
    Central Ledger DB
    Central Ledger DB
    A6. Retrieve Participant End-point Data
    A6. Retrieve Participant End-point Data

    <font color="#000000"><br></font>
    ALS
    DB
    [Not supported by viewer]
    A2. Lookup Oracle Adapter/Service End-points based on <idType>
    Hub Operator Schema Hosted
    [Not supported by viewer]
    Externally Hosted
    [Not supported by viewer]
    PathFinder GSMA
    [Not supported by viewer]
    API
    Internal Use-Only
    API <br>Internal Use-Only
    Mojaloop API
    Specification v1.0
    Mojaloop API<br>Specification v1.0<br>
    Key
    [Not supported by viewer]
    \ No newline at end of file diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/architecture/arch-flow-account-lookup-parties.svg b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/architecture/arch-flow-account-lookup-parties.svg new file mode 100644 index 000000000..0dd8b76e6 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/architecture/arch-flow-account-lookup-parties.svg @@ -0,0 +1,3 @@ + + +
    Account Lookup Service
    (ALS)

    [Not supported by viewer]
    FSP
    Backend

    (Does not natively speak Mojaloop API)



    [Not supported by viewer]
    Scheme-Adapter

    (Converts from Mojaloop API to backend FSP API)

    [Not supported by viewer]
    FSP
    Backend
      

    (Natively speaks Mojaloop API)



    [Not supported by viewer]
    Parties Account Lookup
    [Not supported by viewer]
    Payer FSP
    [Not supported by viewer]
    Payee FSP
    [Not supported by viewer]
    Party Store
    [Not supported by viewer]
    Party
    Store
    [Not supported by viewer]
    A10. Get 
    receiver 
    details
    [Not supported by viewer]
    Persistance store
    [Not supported by viewer]
    Central Ledger
    Service
    [Not supported by viewer]
    A7. Retrieve PayeeFSP Participant End-pointsGET /participants/<participantId>/endpoints
    A1. Request Party Lookup
    GET /parties/<idType>/<id>
    [Not supported by viewer]
    A4. Request Participant Lookup via Oracle
    GET /participants/<idType>/<id>
    [Not supported by viewer]
    A9. User Lookup
    GET /parties/<idType>/<id>
    A9. User Lookup <br>GET /parties/<idType>/<id>
    Oracle Merchant
    Registry Service
    <idType = 'BUSINESS'>
    [Not supported by viewer]
    A5. Alt
    [Not supported by viewer]

    <font color="#000000"><br></font>
    Persistance store
    [Not supported by viewer]
    Oracle Bank Account
    Registry Service
    <idType = 'ACCOUNT_ID'>
    [Not supported by viewer]
    A5. Alt
    A5. Alt

    <font color="#000000"><br></font>
    Oracle Pathfinder
    Registry Service
    Adapter
    <idType = 'MSISDN'>
    [Not supported by viewer]
    A5. Retrieve Participant Data
    [Not supported by viewer]

    <font color="#000000"><br></font>
    A4. Alt
    A4. Alt

    <font color="#000000"><br></font>
    A4. Alt
    A4. Alt

    <font color="#000000"><br></font>
    Mojaloop Central Services
    [Not supported by viewer]
    A11. User Lookup
    PUT /parties/<idType>/<id>
    A11. User Lookup <br>PUT /parties/<idType>/<id>
    A14. User Lookup
    PUT /parties/<idType>/<id>
    A14. User Lookup <br>PUT /parties/<idType>/<id>
    Central Ledger DB
    Central Ledger DB
    A8. Retrieve Participant End-point Data
    A8. Retrieve Participant End-point Data

    <font color="#000000"><br></font>
    ALS
    DB
    [Not supported by viewer]
    Hub Operator Schema Hosted
    [Not supported by viewer]
    Externally Hosted
    [Not supported by viewer]
    PathFinder GSMA
    [Not supported by viewer]
    API
    Internal Use-Only
    API <br>Internal Use-Only
    Mojaloop API
    Specification v1.0
    Mojaloop API<br>Specification v1.0<br>
    Key
    [Not supported by viewer]
    A3. Lookup Oracle Registry ServiceEnd-points based on <idType>A12. Retrieve PayerFSP Participant End-pointsGET /participants/<participantId>/endpointsA6. Retrieve PayeeFSP Data for ValidationGET /participants/<participantId>(retrieve FSP Data)
    A13. Retrieve Participant End-point Data
    <font style="font-size: 13px">A13. Retrieve Participant End-point Data</font>
    \ No newline at end of file diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-delete-oracle-7.3.4.puml b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-delete-oracle-7.3.4.puml new file mode 100644 index 000000000..99d513604 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-delete-oracle-7.3.4.puml @@ -0,0 +1,92 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Rajiv Mothilal + -------------- + ******'/ + + +@startuml +' titre +title 7.3.4 Supprimer un point de terminaison d’oracle + +autonumber + + +' Clés des acteurs : +' boundary - API / interfaces, etc. +' control - Gestionnaire d’administration ALS +' database - persistance base de données + +' acteurs +entity "OPÉRATEUR DU HUB" as OPERATOR +boundary "API d’administration Account Lookup Service" as ALSADM +control "Gestionnaire DELETE Oracle" as ORC_HANDLER +database "Stockage ALS" as DB + +box "Account Lookup Service" #LightYellow +participant ALSADM +participant ORC_HANDLER +participant DB +end box + +' flux + +activate OPERATOR +group Supprimer un point de terminaison d’oracle + OPERATOR -> ALSADM: Requête pour supprimer un point de terminaison d’oracle —\nDELETE /oracles/{ID} + activate ALSADM + + ALSADM -> ORC_HANDLER: Supprimer le point de terminaison d’oracle + + activate ORC_HANDLER + ORC_HANDLER -> DB: Mettre à jour le point de terminaison Oracle existant par ID + hnote over DB #lightyellow + Mettre isActive = false + end note + alt Suppression du point de terminaison Oracle existant (succès) + activate DB + DB -> ORC_HANDLER: Retour succès + deactivate DB + + ORC_HANDLER -> ALSADM: Retourner une réponse de succès + deactivate ORC_HANDLER + ALSADM --> OPERATOR: Retour Statut HTTP : 204 + + deactivate ALSADM + deactivate OPERATOR + end + alt Suppression du point de terminaison Oracle existant (échec) + DB -> ORC_HANDLER: Lever une erreur (introuvable) + ORC_HANDLER -> ALSADM: Lever une erreur + note left of ALSADM #yellow + Message : + { + "errorInformation": { + "errorCode": , + "errorDescription": , + } + } + end note + ALSADM --> OPERATOR: Retour Statut HTTP : 502 + end +end + +@enduml diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-delete-oracle-7.3.4.svg b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-delete-oracle-7.3.4.svg new file mode 100644 index 000000000..b9ad71aea --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-delete-oracle-7.3.4.svg @@ -0,0 +1,111 @@ + + 7.3.4 Supprimer un point de terminaison d’oracle + + + 7.3.4 Supprimer un point de terminaison d’oracle + + Account Lookup Service + + + + + + + + + + + + OPÉRATEUR DU HUB + + + OPÉRATEUR DU HUB + + + API d’administration Account Lookup Service + + + API d’administration Account Lookup Service + + + Gestionnaire DELETE Oracle + + + Gestionnaire DELETE Oracle + + + Stockage ALS + + + Stockage ALS + + + + + + + + + Supprimer un point de terminaison d’oracle + + + 1 + Requête pour supprimer un point de terminaison d’oracle — + DELETE /oracles/{ID} + + + 2 + Supprimer le point de terminaison d’oracle + + + 3 + Mettre à jour le point de terminaison Oracle existant par ID + + Mettre isActive = false + + + alt + [Suppression du point de terminaison Oracle existant (succès)] + + + 4 + Retour succès + + + 5 + Retourner une réponse de succès + + + 6 + Retour + Statut HTTP : + 204 + + + alt + [Suppression du point de terminaison Oracle existant (échec)] + + + 7 + Lever une erreur (introuvable) + + + 8 + Lever une erreur + + + Message : + { + "errorInformation": { + "errorCode": <Error Code>, + "errorDescription": <Msg>, + } + } + + + 9 + Retour + Statut HTTP : + 502 + + diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-get-oracle-7.3.1.puml b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-get-oracle-7.3.1.puml new file mode 100644 index 000000000..cb3f21207 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-get-oracle-7.3.1.puml @@ -0,0 +1,116 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Rajiv Mothilal + -------------- + ******'/ + + +@startuml +' titre +title 7.3.1 Obtenir tous les points de terminaison d’oracle + +autonumber + + +' Clés des acteurs : +' boundary - API / interfaces, etc. +' control - Gestionnaire d’administration ALS +' database - persistance base de données + +' acteurs +entity "OPÉRATEUR DU HUB" as OPERATOR +boundary "API d’administration Account Lookup Service" as ALSADM +control "Gestionnaire d’obtention des oracles" as ORC_HANDLER +database "Stockage ALS" as DB + +box "Account Lookup Service" #LightYellow +participant ALSADM +participant ORC_HANDLER +participant DB +end box + +' flux + +activate OPERATOR +group Obtenir les points de terminaison d’oracle + OPERATOR -> ALSADM: Requête GET pour tous les points de terminaison d’oracle —\nGET /oracles?currency=USD&type=MSISDN + activate ALSADM + + ALSADM -> ORC_HANDLER: Obtenir les points de terminaison d’oracle + activate ORC_HANDLER + ORC_HANDLER -> DB: Lire les points de terminaison d’oracle + activate DB + + alt Obtenir les points de terminaison d’oracle (succès) + DB --> ORC_HANDLER: Retourner les points de terminaison d’oracle + deactivate DB + + deactivate DB + ORC_HANDLER -> ALSADM: Retourner les points de terminaison d’oracle + deactivate ORC_HANDLER + note left of ALSADM #yellow + Message : + { + [ + { + "oracleId": , + "oracleIdType": , + "endpoint": { + "value": , + "endpointType": + }, + "currency": , + "isDefault": + } + ] + } + end note + ALSADM --> OPERATOR: Retour Statut HTTP : 200 + + deactivate ALSADM + deactivate OPERATOR + end + + alt Obtenir les points de terminaison d’oracle (échec) + DB --> ORC_HANDLER: Lever une erreur + deactivate DB + ORC_HANDLER -> ALSADM: Lever une erreur + deactivate ORC_HANDLER + note left of ALSADM #yellow + Message : + { + "errorInformation": { + "errorCode": , + "errorDescription": , + } + } + end note + + ALSADM --> OPERATOR: Retour Statut HTTP : 502 + + deactivate ALSADM + deactivate OPERATOR + + + end +end + +@enduml diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-get-oracle-7.3.1.svg b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-get-oracle-7.3.1.svg new file mode 100644 index 000000000..2ede59b78 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-get-oracle-7.3.1.svg @@ -0,0 +1,126 @@ + + 7.3.1 Obtenir tous les points de terminaison d’oracle + + + 7.3.1 Obtenir tous les points de terminaison d’oracle + + Account Lookup Service + + + + + + + + + + + + OPÉRATEUR DU HUB + + + OPÉRATEUR DU HUB + + + API d’administration Account Lookup Service + + + API d’administration Account Lookup Service + + + Gestionnaire d’obtention des oracles + + + Gestionnaire d’obtention des oracles + + + Stockage ALS + + + Stockage ALS + + + + + + + + + Obtenir les points de terminaison d’oracle + + + 1 + Requête GET pour tous les points de terminaison d’oracle — + GET /oracles?currency=USD&type=MSISDN + + + 2 + Obtenir les points de terminaison d’oracle + + + 3 + Lire les points de terminaison d’oracle + + + alt + [Obtenir les points de terminaison d’oracle (succès)] + + + 4 + Retourner les points de terminaison d’oracle + + + 5 + Retourner les points de terminaison d’oracle + + + Message : + { + [ + { + "oracleId": <string>, + "oracleIdType": <PartyIdType>, + "endpoint": { + "value": <string>, + "endpointType": <EndpointType> + }, + "currency": <Currency>, + "isDefault": <boolean> + } + ] + } + + + 6 + Retour + Statut HTTP : + 200 + + + alt + [Obtenir les points de terminaison d’oracle (échec)] + + + 7 + Lever une erreur + + + 8 + Lever une erreur + + + Message : + { + "errorInformation": { + "errorCode": <Error Code>, + "errorDescription": <Msg>, + } + } + + + 9 + Retour + Statut HTTP : + 502 + + diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-post-oracle-7.3.2.puml b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-post-oracle-7.3.2.puml new file mode 100644 index 000000000..8fec64948 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-post-oracle-7.3.2.puml @@ -0,0 +1,112 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Rajiv Mothilal + -------------- + ******'/ + + +@startuml +' titre +title 7.3.2 Créer des points de terminaison d’oracle + +autonumber + + +' Clés des acteurs : +' boundary - API / interfaces, etc. +' control - Gestionnaire d’administration ALS +' database - persistance base de données + +' acteurs +entity "OPÉRATEUR DU HUB" as OPERATOR +boundary "API d’administration Account Lookup Service" as ALSADM +control "Gestionnaire POST Oracle" as ORC_HANDLER +database "Stockage ALS" as DB + +box "Account Lookup Service" #LightYellow +participant ALSADM +participant ORC_HANDLER +participant DB +end box + +' flux + +activate OPERATOR +group Créer un point de terminaison d’oracle + OPERATOR -> ALSADM: Requête pour créer un point de terminaison d’oracle —\nPOST /oracles + note left of ALSADM #yellow + Message : + { + "oracleIdType": , + "endpoint": { + "value": , + "endpointType": + }, + "currency": , + "isDefault": + } + end note + activate ALSADM + + ALSADM -> ORC_HANDLER: Créer un point de terminaison d’oracle + + activate ORC_HANDLER + ORC_HANDLER -> ORC_HANDLER: Construire l’objet de données du point de terminaison Oracle + ORC_HANDLER -> DB: Insérer l’objet de données du point de terminaison Oracle + activate DB + + alt Création d’une entrée Oracle (succès) + DB --> ORC_HANDLER: Retourner une réponse de succès + deactivate DB + + ORC_HANDLER -> ALSADM: Retourner une réponse de succès + deactivate ORC_HANDLER + ALSADM --> OPERATOR: Retour Statut HTTP : 201 + + deactivate ALSADM + deactivate OPERATOR + end + + alt Création d’une entrée Oracle (échec) + DB --> ORC_HANDLER: Lever une erreur + deactivate DB + ORC_HANDLER -> ALSADM: Lever une erreur + deactivate ORC_HANDLER + note left of ALSADM #yellow + Message : + { + "errorInformation": { + "errorCode": , + "errorDescription": , + } + } + end note + + ALSADM --> OPERATOR: Retour Statut HTTP : 502 + + deactivate ALSADM + deactivate OPERATOR + + + end +end + +@enduml diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-post-oracle-7.3.2.svg b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-post-oracle-7.3.2.svg new file mode 100644 index 000000000..97d3c7c04 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-post-oracle-7.3.2.svg @@ -0,0 +1,127 @@ + + 7.3.2 Créer des points de terminaison d’oracle + + + 7.3.2 Créer des points de terminaison d’oracle + + Account Lookup Service + + + + + + + + + + + + OPÉRATEUR DU HUB + + + OPÉRATEUR DU HUB + + + API d’administration Account Lookup Service + + + API d’administration Account Lookup Service + + + Gestionnaire POST Oracle + + + Gestionnaire POST Oracle + + + Stockage ALS + + + Stockage ALS + + + + + + + + + Créer un point de terminaison d’oracle + + + 1 + Requête pour créer un point de terminaison d’oracle — + POST /oracles + + + Message : + { + "oracleIdType": <PartyIdType>, + "endpoint": { + "value": <string>, + "endpointType": <EndpointType> + }, + "currency": <Currency>, + "isDefault": <boolean> + } + + + 2 + Créer un point de terminaison d’oracle + + + + + 3 + Construire l’objet de données du point de terminaison Oracle + + + 4 + Insérer l’objet de données du point de terminaison Oracle + + + alt + [Création d’une entrée Oracle (succès)] + + + 5 + Retourner une réponse de succès + + + 6 + Retourner une réponse de succès + + + 7 + Retour + Statut HTTP : + 201 + + + alt + [Création d’une entrée Oracle (échec)] + + + 8 + Lever une erreur + + + 9 + Lever une erreur + + + Message : + { + "errorInformation": { + "errorCode": <Error Code>, + "errorDescription": <Msg>, + } + } + + + 10 + Retour + Statut HTTP : + 502 + + diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-put-oracle-7.3.3.puml b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-put-oracle-7.3.3.puml new file mode 100644 index 000000000..f4e138c30 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-put-oracle-7.3.3.puml @@ -0,0 +1,131 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Rajiv Mothilal + -------------- + ******'/ + + +@startuml +' titre +title 7.3.3 Mettre à jour un point de terminaison d’oracle + +autonumber + + +' Clés des acteurs : +' boundary - API / interfaces, etc. +' control - Gestionnaire d’administration ALS +' database - persistance base de données + +' acteurs +entity "OPÉRATEUR DU HUB" as OPERATOR +boundary "API d’administration Account Lookup Service" as ALSADM +control "Gestionnaire PUT Oracle" as ORC_HANDLER +database "Stockage ALS" as DB + +box "Account Lookup Service" #LightYellow +participant ALSADM +participant ORC_HANDLER +participant DB +end box + +' flux + +activate OPERATOR +group Mettre à jour un point de terminaison d’oracle + OPERATOR -> ALSADM: Requête pour mettre à jour un point de terminaison d’oracle —\nPUT /oracles/{ID} + note left of ALSADM #yellow + Message : + { + "oracleIdType": , + "endpoint": { + "value": , + "endpointType": + }, + "currency": , + "isDefault": + } + end note + activate ALSADM + + ALSADM -> ORC_HANDLER: Mettre à jour le point de terminaison d’oracle + + activate ORC_HANDLER + ORC_HANDLER -> DB: Trouver le point de terminaison Oracle existant + alt Trouver le point de terminaison Oracle existant (succès) + activate DB + DB -> ORC_HANDLER: Retourner le résultat du point de terminaison Oracle + deactivate DB + ORC_HANDLER -> ORC_HANDLER: Mettre à jour l’objet de données Oracle retourné + ORC_HANDLER -> DB: Mettre à jour l’objet de données Oracle + activate DB + alt Mise à jour d’une entrée Oracle (succès) + DB --> ORC_HANDLER: Retourner une réponse de succès + deactivate DB + + ORC_HANDLER -> ALSADM: Retourner une réponse de succès + deactivate ORC_HANDLER + ALSADM --> OPERATOR: Retour Statut HTTP : 204 + + deactivate ALSADM + deactivate OPERATOR + end + + alt Mise à jour d’une entrée Oracle (échec) + DB --> ORC_HANDLER: Lever une erreur + deactivate DB + ORC_HANDLER -> ALSADM: Lever une erreur + deactivate ORC_HANDLER + note left of ALSADM #yellow + Message : + { + "errorInformation": { + "errorCode": , + "errorDescription": , + } + } + end note + + ALSADM --> OPERATOR: Retour Statut HTTP : 502 + + deactivate ALSADM + deactivate OPERATOR + + + end + end + alt Trouver le point de terminaison Oracle existant (échec) + DB -> ORC_HANDLER: Retourne un objet vide + ORC_HANDLER -> ALSADM: Lever une erreur + note left of ALSADM #yellow + Message : + { + "errorInformation": { + "errorCode": , + "errorDescription": , + } + } + end note + ALSADM --> OPERATOR: Retour Statut HTTP : 502 + end +end + +@enduml diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-put-oracle-7.3.3.svg b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-put-oracle-7.3.3.svg new file mode 100644 index 000000000..4ce1ebf83 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-admin-put-oracle-7.3.3.svg @@ -0,0 +1,170 @@ + + 7.3.3 Mettre à jour un point de terminaison d’oracle + + + 7.3.3 Mettre à jour un point de terminaison d’oracle + + Account Lookup Service + + + + + + + + + + + + + + + OPÉRATEUR DU HUB + + + OPÉRATEUR DU HUB + + + API d’administration Account Lookup Service + + + API d’administration Account Lookup Service + + + Gestionnaire PUT Oracle + + + Gestionnaire PUT Oracle + + + Stockage ALS + + + Stockage ALS + + + + + + + + + + Mettre à jour un point de terminaison d’oracle + + + 1 + Requête pour mettre à jour un point de terminaison d’oracle — + PUT /oracles/{ID} + + + Message : + { + "oracleIdType": <PartyIdType>, + "endpoint": { + "value": <string>, + "endpointType": <EndpointType> + }, + "currency": <Currency>, + "isDefault": <boolean> + } + + + 2 + Mettre à jour le point de terminaison d’oracle + + + 3 + Trouver le point de terminaison Oracle existant + + + alt + [Trouver le point de terminaison Oracle existant (succès)] + + + 4 + Retourner le résultat du point de terminaison Oracle + + + + + 5 + Mettre à jour l’objet de données Oracle retourné + + + 6 + Mettre à jour l’objet de données Oracle + + + alt + [Mise à jour d’une entrée Oracle (succès)] + + + 7 + Retourner une réponse de succès + + + 8 + Retourner une réponse de succès + + + 9 + Retour + Statut HTTP : + 204 + + + alt + [Mise à jour d’une entrée Oracle (échec)] + + + 10 + Lever une erreur + + + 11 + Lever une erreur + + + Message : + { + "errorInformation": { + "errorCode": <Error Code>, + "errorDescription": <Msg>, + } + } + + + 12 + Retour + Statut HTTP : + 502 + + + alt + [Trouver le point de terminaison Oracle existant (échec)] + + + 13 + Retourne un objet vide + + + 14 + Lever une erreur + + + Message : + { + "errorInformation": { + "errorCode": <Error Code>, + "errorDescription": <Msg>, + } + } + + + 15 + Retour + Statut HTTP : + 502 + + diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-del-endpoint-cache-7.3.0.puml b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-del-endpoint-cache-7.3.0.puml new file mode 100644 index 000000000..30775bc49 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-del-endpoint-cache-7.3.0.puml @@ -0,0 +1,104 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Rajiv Mothilal + -------------- + ******'/ + + +@startuml +' titre +title 7.3.0 Suppression du cache des points de terminaison + +autonumber + + +' Clés des acteurs : +' boundary - API / interfaces, etc. +' control - Gestionnaire d’API ALS +' database - persistance base de données + +' acteurs +entity "OPÉRATEUR DU HUB" as OPERATOR +boundary "API Account Lookup Service" as ALSAPI +control "Gestionnaire de suppression du cache" as DEL_HANDLER +database "Cache" as Cache + +box "Account Lookup Service" #LightYellow +participant ALSAPI +participant DEL_HANDLER +participant Cache +end box + +' flux + +activate OPERATOR +group Suppression du cache des points de terminaison + OPERATOR -> ALSAPI: Requête DELETE sur le cache des points de terminaison — DELETE /endpointcache + activate ALSAPI + activate ALSAPI + + ALSAPI -> DEL_HANDLER: Supprimer le cache + activate DEL_HANDLER + DEL_HANDLER -> Cache: Arrêter le cache + activate Cache + + + alt Statut d’arrêt du cache (succès) + Cache --> DEL_HANDLER: Retourner le statut + deactivate Cache + + DEL_HANDLER -> Cache: Initialiser le cache + activate Cache + Cache -> DEL_HANDLER: Retourner le statut + deactivate Cache + DEL_HANDLER -> ALSAPI: Retourner le statut + deactivate DEL_HANDLER + ALSAPI --> OPERATOR: Retour Statut HTTP : 202 + + deactivate ALSAPI + deactivate OPERATOR + end + + alt Validation du statut (échec du service) + Cache --> DEL_HANDLER: Lever une erreur + deactivate Cache + DEL_HANDLER -> ALSAPI: Lever une erreur + deactivate DEL_HANDLER + note left of ALSAPI #yellow + Message : + { + "errorInformation": { + "errorCode": , + "errorDescription": , + } + } + end note + + ALSAPI --> OPERATOR: Retour Statut HTTP : 502 + + deactivate ALSAPI + deactivate OPERATOR + + + end +end + +@enduml diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-del-endpoint-cache-7.3.0.svg b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-del-endpoint-cache-7.3.0.svg new file mode 100644 index 000000000..357feebb3 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-del-endpoint-cache-7.3.0.svg @@ -0,0 +1,120 @@ + + 7.3.0 Suppression du cache des points de terminaison + + + 7.3.0 Suppression du cache des points de terminaison + + Account Lookup Service + + + + + + + + + + + + + + OPÉRATEUR DU HUB + + + OPÉRATEUR DU HUB + + + API Account Lookup Service + + + API Account Lookup Service + + + Gestionnaire de suppression du cache + + + Gestionnaire de suppression du cache + + + Cache + + + Cache + + + + + + + + + + + Suppression du cache des points de terminaison + + + 1 + Requête DELETE sur le cache des points de terminaison — DELETE /endpointcache + + + 2 + Supprimer le cache + + + 3 + Arrêter le cache + + + alt + [Statut d’arrêt du cache (succès)] + + + 4 + Retourner le statut + + + 5 + Initialiser le cache + + + 6 + Retourner le statut + + + 7 + Retourner le statut + + + 8 + Retour + Statut HTTP : + 202 + + + alt + [Validation du statut (échec du service)] + + + 9 + Lever une erreur + + + 10 + Lever une erreur + + + Message : + { + "errorInformation": { + "errorCode": <Error Code>, + "errorDescription": <Msg>, + } + } + + + 11 + Retour + Statut HTTP : + 502 + + diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-del-participants-7.1.2.plantuml b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-del-participants-7.1.2.plantuml new file mode 100644 index 000000000..0a2660601 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-del-participants-7.1.2.plantuml @@ -0,0 +1,213 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Rajiv Mothilal + -------------- + ******'/ + + +@startuml +' déclaration du titre +title 7.1.2. Supprimer les détails du participant + +autonumber +' Légendes des Acteurs : +' boundary - APIs/Interfaces, etc. +' entity - Objets d'accès à la base de données +' database - Stockage en base de données + +' Déclaration des acteurs +actor "PSF Payeur" as PAYER_FSP +actor "PSF Bénéficiaire" as PAYEE_FSP +boundary "Service de Recherche de Compte\n(ALS)" as ALS_API +control "Gestionnaire des Participants\nALS" as ALS_PARTICIPANT_HANDLER +entity "ALS CentralService\nEndpoint DAO" as ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO +entity "ALS CentralService\nParticipant DAO" as ALS_CENTRALSERVICE_PARTICIPANT_DAO +'entity "ALS Participant Oracle DAO" as ALS_PARTICIPANT_ORACLE_DAO +entity "ALS Parties\nFSP DAO" as ALS_PARTIES_FSP_DAO +entity "ALS Participant Endpoint\nOracle DAO" as ALS_PARTICIPANT_ORACLE_DAO +database "Base de Données ALS" as ALS_DB +boundary "API du Service Oracle" as ORACLE_API +boundary "API du Service Central" as CENTRALSERVICE_API + +box "Fournisseur de Services Financiers" #LightGrey +participant PAYER_FSP +end box + +box "Service de Recherche de Compte" #LightYellow +participant ALS_API +participant ALS_PARTICIPANT_HANDLER +participant ALS_PARTICIPANT_ORACLE_DAO +participant ALS_DB +participant ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO +participant ALS_CENTRALSERVICE_PARTICIPANT_DAO +participant ALS_PARTIES_FSP_DAO +end box + +box "Services Centraux" #LightGreen +participant CENTRALSERVICE_API +end box + +box "Service/Adaptateur Oracle ALS" #LightBlue +participant ORACLE_API +end box + +box "Fournisseur de Services Financiers" #LightGrey +participant PAYEE_FSP +end box + +' DÉBUT DU FLUX + +group Obtenir les détails du participant + PAYER_FSP ->> ALS_API: Demande de suppression des détails du participant\nDEL - /participants/{TYPE}/{ID}?currency={CURRENCY}\nCode réponse : 202\nCode erreur : 200x, 300x, 310x, 320x + activate ALS_API + note left ALS_API #lightgray + Valider la requête par rapport + à la Spécification d'Interface Mojaloop. + Code erreur : 300x, 310x + end note + + ALS_API -> ALS_PARTICIPANT_HANDLER: Demande de suppression des détails du participant + + alt correspondance de l'oracleEndpoint trouvée et informations sur les parties récupérées + activate ALS_PARTICIPANT_HANDLER + '********************* Récupérer la configuration de routage Oracle - DÉBUT ************************ + ALS_PARTICIPANT_HANDLER <-> ALS_DB: Obtenir la configuration de routage Oracle\nCode erreur : 200x, 310x, 320x + ref over ALS_PARTICIPANT_HANDLER, ALS_DB + GET Participants - [[https://docs.mojaloop.live/mojaloop-technical-overview/account-lookup-service/als-get-participants.html Séquence d'obtention de la configuration de routage Oracle]] + ||| + end ref + '********************* Récupérer la configuration de routage Oracle - FIN ************************ + ||| + '********************* Récupérer la configuration de routage Switch - DÉBUT ************************ +' ALS_PARTICIPANT_HANDLER <-> ALS_DB: Obtenir la configuration de routage Switch\nCode erreur : 200x, 310x, 320x +' ref over ALS_PARTICIPANT_HANDLER, ALS_DB +' GET Participants - [[https://docs.mojaloop.live/mojaloop-technical-overview/account-lookup-service/als-get-participants.html Séquence d'obtention de la configuration de routage Switch]] +' ||| +' end ref + '********************* Récupérer la configuration de routage Switch - FIN ************************ + + ||| + + '********************* Valider le participant FSPIOP-Source - DÉBUT ************************ + group Valider le participant FSPIOP-Source + ALS_PARTICIPANT_HANDLER -> ALS_CENTRALSERVICE_PARTICIPANT_DAO: Demande d'informations sur le participant FSPIOP-Source\nCode erreur : 200x + activate ALS_CENTRALSERVICE_PARTICIPANT_DAO + + ALS_CENTRALSERVICE_PARTICIPANT_DAO -> CENTRALSERVICE_API: GET - /participants/{FSPIOP-Source}\nCode erreur : 200x, 310x, 320x + activate CENTRALSERVICE_API + CENTRALSERVICE_API --> ALS_CENTRALSERVICE_PARTICIPANT_DAO: Retourner les informations du participant FSPIOP-Source + deactivate CENTRALSERVICE_API + + ALS_CENTRALSERVICE_PARTICIPANT_DAO --> ALS_PARTICIPANT_HANDLER: Retourner les informations du participant FSPIOP-Source + + deactivate ALS_CENTRALSERVICE_PARTICIPANT_DAO + + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Valider le participant FSPIOP-Source\nCode erreur : 320x + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Valider que PARTICIPANT.fspId == FSPIOP-Source\nCode erreur : 3100 + end group + '********************* Valider le participant - FIN ************************ + + ||| + + '********************* Demande d'informations sur le participant Oracle - DÉBUT ************************ + + ALS_PARTICIPANT_HANDLER <-> ORACLE_API: Obtenir les informations du participant pour le PSF Payeur\nCode erreur : 200x, 310x, 320x + ref over ALS_PARTICIPANT_HANDLER, ORACLE_API + GET Participants - [[https://docs.mojaloop.live/mojaloop-technical-overview/account-lookup-service/als-get-participants.html Séquence de demande d'informations sur le participant à Oracle]] + ||| + end ref + + '********************* Demande d'informations sur le participant Oracle - FIN ************************ + + ||| + + '********************* Valider la propriété du participant - DÉBUT ************************ + ' Voir section 6.2.2.4 - Remarque : L'ALS doit vérifier que c'est le PSF actuel de la Partie qui supprime les informations du PSF. Est-ce suffisant ? + group Valider la propriété du participant + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Valider que PARTICIPANT.fspId correspond à l'information du participant récupérée d'Oracle.\nCode erreur : 3100 + end group + '********************* Valider le participant - FIN ************************ + + ||| + + '********************* Supprimer les informations du participant Oracle - DÉBUT ************************ + + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_ORACLE_DAO: Demande de suppression des détails FSP du participant DEL - /participants/{TYPE}/{ID}?currency={CURRENCY}\nCode erreur : 200x, 310x, 320x + activate ALS_PARTICIPANT_ORACLE_DAO + ALS_PARTICIPANT_ORACLE_DAO -> ORACLE_API: Demande de suppression des détails FSP du participant DEL - /participants/{TYPE}/{ID}?currency={CURRENCY}\nCode réponse : 200 \nCode erreur : 200x, 310x, 320x + activate ORACLE_API + ORACLE_API --> ALS_PARTICIPANT_ORACLE_DAO: Retour du résultat + deactivate ORACLE_API + ALS_PARTICIPANT_ORACLE_DAO --> ALS_PARTICIPANT_HANDLER: Retour du résultat + deactivate ALS_PARTICIPANT_ORACLE_DAO + + '********************* Supprimer les informations du participant Oracle - FIN ************************ + ||| + + '********************* Obtenir les informations d’endpoint du participant PayerFSP - DÉBUT ************************ + + ALS_PARTICIPANT_HANDLER -> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Récupérer l’endpoint de rappel du participant PayerFSP\nCode erreur : 200x + activate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO -> CENTRALSERVICE_API: Récupérer l’endpoint de rappel du participant PayerFSP\nGET - /participants/{FSPIOP-Source}/endpoints\nCode erreur : 200x, 310x, 320x + activate CENTRALSERVICE_API + CENTRALSERVICE_API --> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Liste des endpoints de rappel du participant PayerFSP + deactivate CENTRALSERVICE_API + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO --> ALS_PARTICIPANT_HANDLER: Liste des endpoints de rappel du participant PayerFSP + deactivate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Associer les endpoints de rappel du participant PayerFSP pour\nFSPIOP_CALLBACK_URL_PARTICIPANT_PUT + + '********************* Obtenir les informations d’endpoint du participant PayerFSP - FIN ************************ + + ALS_PARTICIPANT_HANDLER --> ALS_API: Retour du résultat de la demande de suppression + ALS_API ->> PAYER_FSP: Rappel indiquant le succès :\nPUT - /participants/{TYPE}/{ID}?currency={CURRENCY} + + else Échec de la validation ou Oracle n'a pas pu traiter la demande de suppression + + '********************* Obtenir les informations d’endpoint du participant PayerFSP - DÉBUT ************************ + + ALS_PARTICIPANT_HANDLER -> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Récupérer l’endpoint de rappel du participant PayerFSP\nCode erreur : 200x, 310x, 320x + activate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO -> CENTRALSERVICE_API: Récupérer l’endpoint de rappel du participant PayerFSP\nGET - /participants/{FSPIOP-Source}/endpoints\nCode réponse : 200\nCode erreur : 200x, 310x, 320x + activate CENTRALSERVICE_API + CENTRALSERVICE_API --> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Liste des endpoints de rappel du participant PayerFSP + deactivate CENTRALSERVICE_API + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO --> ALS_PARTICIPANT_HANDLER: Liste des endpoints de rappel du participant PayerFSP + deactivate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Associer les endpoints de rappel du participant PayerFSP pour\nFSPIOP_CALLBACK_URL_PARTICIPANT_PUT_ERROR + + '********************* Obtenir les informations d’endpoint du participant PayerFSP - FIN ************************ + + ALS_PARTICIPANT_HANDLER --> ALS_API: Gérer l’erreur\nCode erreur : 200x, 310x, 320x + ALS_API ->> PAYER_FSP: Rappel : PUT - /participants/{TYPE}/{ID}/error + + else Liste vide de switchEndpoint renvoyée + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Gérer l’erreur\nCode erreur : 200x + hnote right ALS_PARTICIPANT_HANDLER #red + Cadre de gestion des erreurs + end note + end alt + + deactivate ALS_PARTICIPANT_HANDLER +end +@enduml diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-del-participants-7.1.2.svg b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-del-participants-7.1.2.svg new file mode 100644 index 000000000..8488d07d7 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-del-participants-7.1.2.svg @@ -0,0 +1,353 @@ + + 7.1.2. Supprimer les détails du participant + + + 7.1.2. Supprimer les détails du participant + + Fournisseur de Services Financiers + + Service de Recherche de Compte + + Services Centraux + + Service/Adaptateur Oracle ALS + + Fournisseur de Services Financiers + + + + + + + + + + + + + + + + + + + + + + + + + + PSF Payeur + + + PSF Payeur + + + Service de Recherche de Compte + (ALS) + + + Service de Recherche de Compte + (ALS) + + + Gestionnaire des Participants + ALS + + + Gestionnaire des Participants + ALS + + + ALS Participant Endpoint + Oracle DAO + + + ALS Participant Endpoint + Oracle DAO + + + Base de Données ALS + + + Base de Données ALS + + + ALS CentralService + Endpoint DAO + + + ALS CentralService + Endpoint DAO + + + ALS CentralService + Participant DAO + + + ALS CentralService + Participant DAO + + + ALS Parties + FSP DAO + + + ALS Parties + FSP DAO + + + API du Service Central + + + API du Service Central + + + API du Service Oracle + + + API du Service Oracle + + + PSF Bénéficiaire + + + PSF Bénéficiaire + + + + + + + + + + + + + + + Obtenir les détails du participant + + + + 1 + Demande de suppression des détails du participant + DEL - /participants/{TYPE}/{ID}?currency={CURRENCY} + Code réponse&nbsp;: + 202 + Code erreur&nbsp;: + 200x, 300x, 310x, 320x + + + Valider la requête par rapport + à la Spécification d'Interface Mojaloop. + Code erreur&nbsp;: + 300x, 310x + + + 2 + Demande de suppression des détails du participant + + + alt + [correspondance de l'oracleEndpoint trouvée et informations sur les parties récupérées] + + + + 3 + Obtenir la configuration de routage Oracle + Code erreur&nbsp;: + 200x, 310x, 320x + + + ref + GET Participants - + Séquence d'obtention de la configuration de routage Oracle + + + + + + Valider le participant FSPIOP-Source + + + 4 + Demande d'informations sur le participant FSPIOP-Source + Code erreur&nbsp;: + 200x + + + 5 + GET - /participants/{FSPIOP-Source} + Code erreur&nbsp;: + 200x, 310x, 320x + + + 6 + Retourner les informations du participant FSPIOP-Source + + + 7 + Retourner les informations du participant FSPIOP-Source + + + + + 8 + Valider le participant FSPIOP-Source + Code erreur&nbsp;: + 320x + + + + + 9 + Valider que PARTICIPANT.fspId == FSPIOP-Source + Code erreur&nbsp;: + 3100 + + + + 10 + Obtenir les informations du participant pour le PSF Payeur + Code erreur&nbsp;: + 200x, 310x, 320x + + + ref + GET Participants - + Séquence de demande d'informations sur le participant à Oracle + + + + + + Valider la propriété du participant + + + + + 11 + Valider que PARTICIPANT.fspId correspond à l'information du participant récupérée d'Oracle. + Code erreur&nbsp;: + 3100 + + + 12 + Demande de suppression des détails FSP du participant DEL - /participants/{TYPE}/{ID}?currency={CURRENCY} + Code erreur&nbsp;: + 200x, 310x, 320x + + + 13 + Demande de suppression des détails FSP du participant DEL - /participants/{TYPE}/{ID}?currency={CURRENCY} + Code réponse&nbsp;: + 200 +   + Code erreur&nbsp;: + 200x, 310x, 320x + + + 14 + Retour du résultat + + + 15 + Retour du résultat + + + 16 + Récupérer l’endpoint de rappel du participant PayerFSP + Code erreur&nbsp;: + 200x + + + 17 + Récupérer l’endpoint de rappel du participant PayerFSP + GET - /participants/{FSPIOP-Source}/endpoints + Code erreur&nbsp;: + 200x, 310x, 320x + + + 18 + Liste des endpoints de rappel du participant PayerFSP + + + 19 + Liste des endpoints de rappel du participant PayerFSP + + + + + 20 + Associer les endpoints de rappel du participant PayerFSP pour + FSPIOP_CALLBACK_URL_PARTICIPANT_PUT + + + 21 + Retour du résultat de la demande de suppression + + + + 22 + Rappel indiquant le succès&nbsp;: + PUT - /participants/{TYPE}/{ID}?currency={CURRENCY} + + [Échec de la validation ou Oracle n'a pas pu traiter la demande de suppression] + + + 23 + Récupérer l’endpoint de rappel du participant PayerFSP + Code erreur&nbsp;: + 200x, 310x, 320x + + + 24 + Récupérer l’endpoint de rappel du participant PayerFSP + GET - /participants/{FSPIOP-Source}/endpoints + Code réponse&nbsp;: + 200 + Code erreur&nbsp;: + 200x, 310x, 320x + + + 25 + Liste des endpoints de rappel du participant PayerFSP + + + 26 + Liste des endpoints de rappel du participant PayerFSP + + + + + 27 + Associer les endpoints de rappel du participant PayerFSP pour + FSPIOP_CALLBACK_URL_PARTICIPANT_PUT_ERROR + + + 28 + Gérer l’erreur + Code erreur&nbsp;: + 200x, 310x, 320x + + + + 29 + Rappel&nbsp;: PUT - /participants/{TYPE}/{ID}/error + + [Liste vide de switchEndpoint renvoyée] + + + + + 30 + Gérer l’erreur + Code erreur&nbsp;: + 200x + + Cadre de gestion des erreurs + + diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-get-participants-7.1.0.plantuml b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-get-participants-7.1.0.plantuml new file mode 100644 index 000000000..13e9e6f0c --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-get-participants-7.1.0.plantuml @@ -0,0 +1,180 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Rajiv Mothilal + -------------- + ******'/ + + +@startuml +' déclaration du titre +title 7.1.0. Obtenir les Détails du Participant + +autonumber +' Légende des acteurs : +' boundary - APIs/Interfaces, etc. +' entity - Objets d'Accès à la Base de Données +' database - Base de Données Persistante + +' déclaration des acteurs +actor "FSP Payeur" as PAYER_FSP +boundary "Service Account Lookup\n(ALS)" as ALS_API +control "Gestionnaire de Participant\nALS" as ALS_PARTICIPANT_HANDLER +entity "DAO Config Type\nEndpoint ALS" as ALS_TYPE_ENDPOINT_CONFIG_DAO +entity "DAO Endpoint CentralService\nALS" as ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO +entity "DAO Oracle Participant\nALS" as ALS_PARTICIPANT_ORACLE_DAO +entity "DAO Oracle Endpoint Participant\nALS" as ALS_PARTICIPANT_ORACLE_DAO +database "Base de Données ALS" as ALS_DB +boundary "API Service Oracle" as ORACLE_API +boundary "API Service Central" as CENTRALSERVICE_API + +box "Fournisseur de Services Financiers" #LightGrey +participant PAYER_FSP +end box + +box "Service Account Lookup" #LightYellow +participant ALS_API +participant ALS_PARTICIPANT_HANDLER +participant ALS_TYPE_ENDPOINT_CONFIG_DAO +participant ALS_PARTICIPANT_ORACLE_DAO +participant ALS_DB +participant ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO +end box + +box "Services Centraux" #LightGreen +participant CENTRALSERVICE_API +end box + +box "Service/Adaptateur Oracle ALS" #LightBlue +participant ORACLE_API +end box + +' DÉBUT DU FLUX + +group Obtenir les détails FSP du Participant + + + PAYER_FSP ->> ALS_API: Requête pour obtenir les détails FSP du Participant\nGET - /participants/{TYPE}/{ID}?currency={CURRENCY}\nCode réponse : 202 \nCode erreur : 200x, 300x, 310x, 320x + activate ALS_API + note left ALS_API #lightgray + Valider la requête selon + la Spécification d'Interface Mojaloop. + Code erreur : 300x, 310x + end note + + ALS_API -> ALS_PARTICIPANT_HANDLER: Requête pour obtenir les détails FSP du Participant + + alt une correspondance oracleEndpoint trouvée + group #lightskyblue MISE EN OEUVRE : Séquence Config Routage Oracle [CACHÉE] + activate ALS_PARTICIPANT_HANDLER + ALS_PARTICIPANT_HANDLER -> ALS_TYPE_ENDPOINT_CONFIG_DAO: Récupérer la configuration de routage Oracle basée sur\n{TYPE} et {CURRENCY} si fournie\nCode erreur : 200x + activate ALS_TYPE_ENDPOINT_CONFIG_DAO + ALS_TYPE_ENDPOINT_CONFIG_DAO -> ALS_DB: Récupérer oracleEndpoint\nCode erreur : 200x + activate ALS_DB + hnote over ALS_DB #lightyellow + oracleEndpoint + endpointType + partyIdType + currency (optionnel) + end note + ALS_DB --> ALS_TYPE_ENDPOINT_CONFIG_DAO: Retourner le résultat oracleEndpoint + deactivate ALS_DB + ALS_TYPE_ENDPOINT_CONFIG_DAO --> ALS_PARTICIPANT_HANDLER: Liste des **oracleEndpoint** pour le Participant + deactivate ALS_TYPE_ENDPOINT_CONFIG_DAO + opt #lightskyblue oracleEndpoint EST NULL + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Code erreur : 3200 + end + end group + + group #lightskyblue MISE EN OEUVRE : Séquence de Requête d'Informations Participant Oracle + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_ORACLE_DAO: Requête pour obtenir les détails FSP du Participant\nGET - /participants/{TYPE}/{ID}?currency={CURRENCY}\nCode erreur : 200x, 310x, 320x + activate ALS_PARTICIPANT_ORACLE_DAO + ALS_PARTICIPANT_ORACLE_DAO -> ORACLE_API: Requête pour obtenir les détails FSP du Participant\nGET - /participants/{TYPE}/{ID}?currency={CURRENCY}\nCode réponse : 200 \nCode erreur : 200x, 310x, 320x + activate ORACLE_API + ORACLE_API --> ALS_PARTICIPANT_ORACLE_DAO: Retourner la liste des informations du Participant + deactivate ORACLE_API + ALS_PARTICIPANT_ORACLE_DAO --> ALS_PARTICIPANT_HANDLER: Retourner la liste des informations du Participant + deactivate ALS_PARTICIPANT_ORACLE_DAO + end group + +' group #lightskyblue MISE EN OEUVRE : Séquence Config Routage Switch [CACHÉE] +' note right of ALS_PARTICIPANT_HANDLER #lightgray +' **RÉFÉRENCE** : Séquence Config Routage Oracle : oracleEndpoint +' end note +' alt #lightskyblue oracleEndpoint N'EST PAS NULL +' ALS_PARTICIPANT_HANDLER -> ALS_TYPE_ENDPOINT_CONFIG_DAO: Récupérer la configuration de routage Switch\nCode erreur : 200x +' ALS_TYPE_ENDPOINT_CONFIG_DAO -> ALS_DB: Récupérer switchEndpoint\nCode erreur : 200x +' activate ALS_DB +' hnote over ALS_DB #lightyellow +' switchEndpoint +' endpointType +' end note +' ALS_DB -> ALS_TYPE_ENDPOINT_CONFIG_DAO: Retourner switchEndpoint +' deactivate ALS_DB +' ALS_TYPE_ENDPOINT_CONFIG_DAO -> ALS_PARTICIPANT_HANDLER: Retourner **switchEndpoint** +' else +' ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Code erreur : 2000 +' end alt +' end group + + '********************* Obtenir l'End-point Callback du Participant PayerFSP - DÉBUT ************************ + ALS_PARTICIPANT_HANDLER -> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Récupérer l'End-point Callback du Participant PayerFSP\nCode erreur : 200x, 310x, 320x + activate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO -> CENTRALSERVICE_API: Récupérer l'End-point Callback du Participant PayerFSP\nGET - /participants/{FSPIOP-Source}/endpoints\nCode réponse : 200 \nCode erreur : 200x, 310x, 320x + activate CENTRALSERVICE_API + CENTRALSERVICE_API --> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Liste des End-points Callback du PayerFSP + deactivate CENTRALSERVICE_API + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO --> ALS_PARTICIPANT_HANDLER: Liste des End-points Callback du PayerFSP + deactivate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Correspondance des End-points pour\nFSPIOP_CALLBACK_URL_PARTICIPANT_PUT + '********************* Obtenir l'End-point Callback du Participant PayerFSP - FIN ************************ + + ALS_PARTICIPANT_HANDLER --> ALS_API: Retourner la liste des informations du Participant + ALS_API ->> PAYER_FSP: Callback : PUT - /participants/{TYPE}/{ID}?currency={CURRENCY} + else oracleEndpoint EST NULL OU erreur survenue + + '********************* Obtenir l'End-point Callback du Participant - DÉBUT ************************ + ALS_PARTICIPANT_HANDLER -> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Récupérer l'End-point Callback du Participant\nCode erreur : 200x, 310x, 320x + activate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO -> CENTRALSERVICE_API: Récupérer l'End-point Callback du Participant\nGET - /participants/{FSPIOP-Source}/endpoints. \nCode réponse : 200 \nCode erreur : 200x, 310x, 320x + activate CENTRALSERVICE_API + CENTRALSERVICE_API --> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Liste des End-points Callback du Participant + deactivate CENTRALSERVICE_API + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO --> ALS_PARTICIPANT_HANDLER: Liste des End-points Callback du Participant + deactivate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Correspondance des End-points pour\nFSPIOP_CALLBACK_URL_PARTICIPANT_PUT_ERROR + '********************* Obtenir l'End-point Callback du Participant - FIN ************************ + + ALS_PARTICIPANT_HANDLER --> ALS_API: Gérer l'erreur\nCode erreur : 200x, 310x, 320x + ALS_API ->> PAYER_FSP: Callback : PUT - /participants/{TYPE}/{ID}/error + else switchEndpoint EST NULL + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Gérer l'erreur\nCode erreur : 200x + hnote right ALS_PARTICIPANT_HANDLER #red + Cadre de gestion des erreurs + end note + end alt + deactivate ALS_API + + deactivate ALS_PARTICIPANT_HANDLER + +end +@enduml diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-get-participants-7.1.0.svg b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-get-participants-7.1.0.svg new file mode 100644 index 000000000..eb558f5d6 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-get-participants-7.1.0.svg @@ -0,0 +1,308 @@ + + 7.1.0. Obtenir les Détails du Participant + + + 7.1.0. Obtenir les Détails du Participant + + Fournisseur de Services Financiers + + Service Account Lookup + + Services Centraux + + Service/Adaptateur Oracle ALS + + + + + + + + + + + + + + + + + + + + + + + + + FSP Payeur + + + FSP Payeur + + + Service Account Lookup + (ALS) + + + Service Account Lookup + (ALS) + + + Gestionnaire de Participant + ALS + + + Gestionnaire de Participant + ALS + + + DAO Config Type + Endpoint ALS + + + DAO Config Type + Endpoint ALS + + + DAO Oracle Participant + ALS + + + DAO Oracle Participant + ALS + + + Base de Données ALS + + + Base de Données ALS + + + DAO Endpoint CentralService + ALS + + + DAO Endpoint CentralService + ALS + + + API Service Central + + + API Service Central + + + API Service Oracle + + + API Service Oracle + + + + + + + + + + + + + + + Obtenir les détails FSP du Participant + + + + 1 + Requête pour obtenir les détails FSP du Participant + GET - /participants/{TYPE}/{ID}?currency={CURRENCY} + Code réponse : + 202 +   + Code erreur : + 200x, 300x, 310x, 320x + + + Valider la requête selon + la Spécification d'Interface Mojaloop. + Code erreur : + 300x, 310x + + + 2 + Requête pour obtenir les détails FSP du Participant + + + alt + [une correspondance oracleEndpoint trouvée] + + + MISE EN OEUVRE : Séquence Config Routage Oracle + [CACHÉE] + + + 3 + Récupérer la configuration de routage Oracle basée sur + {TYPE} et {CURRENCY} si fournie + Code erreur : + 200x + + + 4 + Récupérer oracleEndpoint + Code erreur : + 200x + + oracleEndpoint + endpointType + partyIdType + currency (optionnel) + + + 5 + Retourner le résultat oracleEndpoint + + + 6 + Liste des + oracleEndpoint + pour le Participant + + + opt + [oracleEndpoint EST NULL] + + + + + 7 + Code erreur : + 3200 + + + MISE EN OEUVRE : Séquence de Requête d'Informations Participant Oracle + + + 8 + Requête pour obtenir les détails FSP du Participant + GET - /participants/{TYPE}/{ID}?currency={CURRENCY} + Code erreur : + 200x, 310x, 320x + + + 9 + Requête pour obtenir les détails FSP du Participant + GET - /participants/{TYPE}/{ID}?currency={CURRENCY} + Code réponse : + 200 +   + Code erreur : + 200x, 310x, 320x + + + 10 + Retourner la liste des informations du Participant + + + 11 + Retourner la liste des informations du Participant + + + 12 + Récupérer l'End-point Callback du Participant PayerFSP + Code erreur : + 200x, 310x, 320x + + + 13 + Récupérer l'End-point Callback du Participant PayerFSP + GET - /participants/{FSPIOP-Source}/endpoints + Code réponse : + 200 +   + Code erreur : + 200x, 310x, 320x + + + 14 + Liste des End-points Callback du PayerFSP + + + 15 + Liste des End-points Callback du PayerFSP + + + + + 16 + Correspondance des End-points pour + FSPIOP_CALLBACK_URL_PARTICIPANT_PUT + + + 17 + Retourner la liste des informations du Participant + + + + 18 + Callback : PUT - /participants/{TYPE}/{ID}?currency={CURRENCY} + + [oracleEndpoint EST NULL OU erreur survenue] + + + 19 + Récupérer l'End-point Callback du Participant + Code erreur : + 200x, 310x, 320x + + + 20 + Récupérer l'End-point Callback du Participant + GET - /participants/{FSPIOP-Source}/endpoints. + Code réponse : + 200 +   + Code erreur : + 200x, 310x, 320x + + + 21 + Liste des End-points Callback du Participant + + + 22 + Liste des End-points Callback du Participant + + + + + 23 + Correspondance des End-points pour + FSPIOP_CALLBACK_URL_PARTICIPANT_PUT_ERROR + + + 24 + Gérer l'erreur + Code erreur : + 200x, 310x, 320x + + + + 25 + Callback : PUT - /participants/{TYPE}/{ID}/error + + [switchEndpoint EST NULL] + + + + + 26 + Gérer l'erreur + Code erreur : + 200x + + Cadre de gestion des erreurs + + diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-get-parties-7.2.0.plantuml b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-get-parties-7.2.0.plantuml new file mode 100644 index 000000000..1aa55f1cf --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-get-parties-7.2.0.plantuml @@ -0,0 +1,215 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Rajiv Mothilal + -------------- + ******'/ + + +@startuml +' déclaration du titre +title 7.2.0. Obtenir les Détails d'une Partie + +autonumber +' Clés des Acteurs : +' boundary - APIs/Interfaces, etc +' entity - Objets d'Accès à la Base de Données +' database - Stockage Persitant des Bases de Données + +' déclaration des acteurs +actor "Payer FSP" as PAYER_FSP +actor "Payee FSP" as PAYEE_FSP +boundary "Service de Recherche de\nCompte (ALS)" as ALS_API +control "Gestionnaire de\nParticipant ALS" as ALS_PARTICIPANT_HANDLER +entity "ALS CentralService\nEndpoint DAO" as ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO +entity "ALS CentralService\nParticipant DAO" as ALS_CENTRALSERVICE_PARTICIPANT_DAO +'entity "ALS Participant Oracle DAO" as ALS_PARTICIPANT_ORACLE_DAO +entity "ALS Parties\nFSP DAO" as ALS_PARTIES_FSP_DAO +database "Base de Données ALS" as ALS_DB +boundary "API Service Oracle" as ORACLE_API +boundary "API Service Central" as CENTRALSERVICE_API + +box "Fournisseur de Services Financiers" #LightGrey +participant PAYER_FSP +end box + +box "Service de Recherche de Compte" #LightYellow +participant ALS_API +participant ALS_PARTICIPANT_HANDLER +participant ALS_DB +participant ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO +participant ALS_CENTRALSERVICE_PARTICIPANT_DAO +participant ALS_PARTIES_FSP_DAO +end box + +box "Services Centraux" #LightGreen +participant CENTRALSERVICE_API +end box + +box "Service/Adaptateur Oracle ALS" #LightBlue +participant ORACLE_API +end box + +box "Fournisseur de Services Financiers" #LightGrey +participant PAYEE_FSP +end box + +' DÉBUT DU FLUX + +group Obtenir les Détails d'une Partie + PAYER_FSP ->> ALS_API: Requête pour obtenir les détails FSP des parties\nGET - /parties/{TYPE}/{ID}?currency={CURRENCY}\nCode réponse : 202\nCode erreur : 200x, 300x, 310x, 320x + activate ALS_API + note left ALS_API #lightgray + Valider la requête selon + la Spécification d'Interface Mojaloop. + Code erreur : 300x, 310x + end note + + ALS_API -> ALS_PARTICIPANT_HANDLER: Requête pour obtenir les détails FSP des parties + + alt correspondance oracleEndpoint trouvée & informations sur les parties récupérées + activate ALS_PARTICIPANT_HANDLER + '********************* Récupération Infos de Routage Oracle - DÉBUT ************************ + ALS_PARTICIPANT_HANDLER <-> ALS_DB: Obtenir la configuration de routage Oracle\nCode erreur : 200x, 310x, 320x + ref over ALS_PARTICIPANT_HANDLER, ALS_DB + OBTENIR Participants - [[https://docs.mojaloop.live/mojaloop-technical-overview/account-lookup-service/als-get-participants.html Get Oracle Routing Config Sequence]] + ||| + end ref + '********************* Récupération Infos de Routage Oracle - FIN ************************ + ||| + '********************* Récupération Infos de Routage Switch - DÉBUT ************************ +' ALS_PARTICIPANT_HANDLER <-> ALS_DB: Obtenir configuration de routage du Switch\nCode erreur : 200x, 310x, 320x +' ref over ALS_PARTICIPANT_HANDLER, ALS_DB +' OBTENIR Participants - [[https://docs.mojaloop.live/mojaloop-technical-overview/account-lookup-service/als-get-participants.html Get Switch Routing Config Sequence]] +' ||| +' end ref + '********************* Récupération Infos de Routage Switch - FIN ************************ + ||| + group Valider le Participant FSPIOP-Source + ALS_PARTICIPANT_HANDLER -> ALS_CENTRALSERVICE_PARTICIPANT_DAO: Requête d'information participant FSPIOP-Source\nCode erreur : 200x + activate ALS_CENTRALSERVICE_PARTICIPANT_DAO + + ALS_CENTRALSERVICE_PARTICIPANT_DAO -> CENTRALSERVICE_API: GET - /participants/{FSPIOP-Source}\nCode erreur : 200x, 310x, 320x + activate CENTRALSERVICE_API + CENTRALSERVICE_API --> ALS_CENTRALSERVICE_PARTICIPANT_DAO: Retourner les informations du participant FSPIOP-Source + deactivate CENTRALSERVICE_API + + ALS_CENTRALSERVICE_PARTICIPANT_DAO --> ALS_PARTICIPANT_HANDLER: Retourner les informations du participant FSPIOP-Source + + deactivate ALS_CENTRALSERVICE_PARTICIPANT_DAO + + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Valider le participant FSPIOP-Source\nCode erreur : 320x + end group + ||| + + '********************* Requête Infos Participant Oracle - DÉBUT ************************ + + ALS_PARTICIPANT_HANDLER <-> ORACLE_API: Obtenir les informations du Participant pour PayeeFSP\nCode erreur : 200x, 310x, 320x + ref over ALS_PARTICIPANT_HANDLER, ORACLE_API + OBTENIR Participants - [[https://docs.mojaloop.live/mojaloop-technical-overview/account-lookup-service/als-get-participants.html Request Participant Information from Oracle Sequence]] + ||| + end ref + + '********************* Requête Infos Participant Oracle - FIN ************************ + ||| + '********************* Requête Infos Parties - DÉBUT ************************ + + ALS_PARTICIPANT_HANDLER -> ALS_PARTIES_FSP_DAO: Requêter les informations des Parties depuis FSP.\nCode erreur : 200x + + activate ALS_PARTIES_FSP_DAO + ALS_PARTIES_FSP_DAO ->> PAYEE_FSP: Rappel des Parties vers la Destination:\nGET - /parties/{TYPE}/{ID}?currency={CURRENCY}\nCode réponse : 202\nCode erreur : 200x, 310x, 320x + deactivate ALS_PARTIES_FSP_DAO + activate PAYEE_FSP + + PAYEE_FSP ->> ALS_API: Rappel avec les informations du Participant:\nPUT - /parties/{TYPE}/{ID}?currency={CURRENCY}\nCode erreur : 200x, 300x, 310x, 320x + deactivate PAYEE_FSP + + ALS_API -> ALS_API: Valider la requête selon\nla Spécification d'Interface Mojaloop\nCode erreur : 300x, 310x + ALS_API -> ALS_PARTICIPANT_HANDLER: Traiter les informations de rappel du Participant pour PUT + + '********************* Requête Infos Parties - FIN ************************ + + '********************* Récupérer l'information d'End-point du Participant PayerFSP - DÉBUT ************************ + + ALS_PARTICIPANT_HANDLER -> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Récupérer l'End-point de rappel du Participant PayerFSP\nCode erreur : 200x + activate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO -> CENTRALSERVICE_API: Récupérer l'End-point de rappel du Participant PayerFSP\nGET - /participants/{FSPIOP-Source}/endpoints\nCode erreur : 200x, 310x, 320x + activate CENTRALSERVICE_API + CENTRALSERVICE_API --> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Liste des end-points de rappel du participant PayerFSP + deactivate CENTRALSERVICE_API + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO --> ALS_PARTICIPANT_HANDLER: Liste des end-points de rappel du participant PayerFSP + deactivate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Associer les End-points de rappel du Participant PayerFSP pour\nFSPIOP_CALLBACK_URL_PARTIES_PUT + + '********************* Récupérer l'information d'End-point du Participant PayerFSP - FIN ************************ + + ALS_PARTICIPANT_HANDLER --> ALS_API: Retourner les informations du Participant à PayerFSP + ALS_API ->> PAYER_FSP: Callback avec infos Parties :\nPUT - /parties/{TYPE}/{ID}?currency={CURRENCY} + + else Liste d'end-points vide renvoyée pour la config (PayeeFSP ou Oracle) ou erreur pour PayerFSP + + '********************* Récupérer l'information d'End-point du Participant PayerFSP - DÉBUT ************************ + + ALS_PARTICIPANT_HANDLER -> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Récupérer l'End-point de rappel du Participant PayerFSP\nCode erreur : 200x, 310x, 320x + activate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO -> CENTRALSERVICE_API: Récupérer l'End-point de rappel du Participant PayerFSP\nGET - /participants/{FSPIOP-Source}/endpoints\nCode réponse : 200\nCode erreur : 200x, 310x, 320x + activate CENTRALSERVICE_API + CENTRALSERVICE_API --> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Liste des end-points de rappel du participant PayerFSP + deactivate CENTRALSERVICE_API + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO --> ALS_PARTICIPANT_HANDLER: Liste des end-points de rappel du participant PayerFSP + deactivate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Associer les end-points de rappel du Participant PayerFSP pour\nFSPIOP_CALLBACK_URL_PARTIES_PUT_ERROR + + '********************* Récupérer l'information d'End-point du Participant PayerFSP - FIN ************************ + + ALS_PARTICIPANT_HANDLER --> ALS_API: Gérer l'erreur\nCode erreur : 200x, 310x, 320x + ALS_API ->> PAYER_FSP: Callback : PUT - /participants/{TYPE}/{ID}/error + else Liste d'end-points vide renvoyée pour la config PayerFSP ou erreur pour PayeeFSP + + '********************* Récupérer l'information d'End-point du Participant PayeeFSP - DÉBUT ************************ + + ALS_PARTICIPANT_HANDLER -> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Récupérer l'End-point de rappel du Participant PayeeFSP\nCode erreur : 200x, 310x, 320x + activate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO -> CENTRALSERVICE_API: Récupérer l'End-point de rappel du Participant PayeeFSP\nGET - /participants/{FSPIOP-Source}/endpoints\nCode réponse : 200\nCode erreur : 200x, 310x, 320x + activate CENTRALSERVICE_API + CENTRALSERVICE_API --> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Liste des end-points de rappel du participant PayeeFSP + deactivate CENTRALSERVICE_API + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO --> ALS_PARTICIPANT_HANDLER: Liste des end-points de rappel du participant PayeeFSP + deactivate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Associer les end-points de rappel du participant PayeeFSP pour\nFSPIOP_CALLBACK_URL_PARTIES_PUT_ERROR + + '********************* Récupérer l'information d'End-point du Participant PayerFSP - FIN ************************ + + ALS_PARTICIPANT_HANDLER --> ALS_API: Gérer l'erreur\nCode erreur : 200x, 310x, 320x + ALS_API ->> PAYEE_FSP: Callback : PUT - /participants/{TYPE}/{ID}/error + else Liste de résultats switchEndpoint vide renvoyée + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Gérer l'erreur\nCode erreur : 200x + hnote right ALS_PARTICIPANT_HANDLER #red + Cadre de Gestion des Erreurs + end note + end alt + + deactivate ALS_PARTICIPANT_HANDLER +end +@enduml diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-get-parties-7.2.0.svg b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-get-parties-7.2.0.svg new file mode 100644 index 000000000..a7a7aaf57 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-get-parties-7.2.0.svg @@ -0,0 +1,385 @@ + + 7.2.0. Obtenir les Détails d'une Partie + + + 7.2.0. Obtenir les Détails d'une Partie + + Fournisseur de Services Financiers + + Service de Recherche de Compte + + Services Centraux + + Service/Adaptateur Oracle ALS + + Fournisseur de Services Financiers + + + + + + + + + + + + + + + + + + + + + + + + + + Payer FSP + + + Payer FSP + + + Service de Recherche de + Compte (ALS) + + + Service de Recherche de + Compte (ALS) + + + Gestionnaire de + Participant ALS + + + Gestionnaire de + Participant ALS + + + Base de Données ALS + + + Base de Données ALS + + + ALS CentralService + Endpoint DAO + + + ALS CentralService + Endpoint DAO + + + ALS CentralService + Participant DAO + + + ALS CentralService + Participant DAO + + + ALS Parties + FSP DAO + + + ALS Parties + FSP DAO + + + API Service Central + + + API Service Central + + + API Service Oracle + + + API Service Oracle + + + Payee FSP + + + Payee FSP + + + + + + + + + + + + + + + + + Obtenir les Détails d'une Partie + + + + 1 + Requête pour obtenir les détails FSP des parties + GET - /parties/{TYPE}/{ID}?currency={CURRENCY} + Code réponse : + 202 + Code erreur : + 200x, 300x, 310x, 320x + + + Valider la requête selon + la Spécification d'Interface Mojaloop. + Code erreur : + 300x, 310x + + + 2 + Requête pour obtenir les détails FSP des parties + + + alt + [correspondance oracleEndpoint trouvée & informations sur les parties récupérées] + + + + 3 + Obtenir la configuration de routage Oracle + Code erreur : + 200x, 310x, 320x + + + ref + OBTENIR Participants - + Get Oracle Routing Config Sequence + + + + + + Valider le Participant FSPIOP-Source + + + 4 + Requête d'information participant FSPIOP-Source + Code erreur : + 200x + + + 5 + GET - /participants/{FSPIOP-Source} + Code erreur : + 200x, 310x, 320x + + + 6 + Retourner les informations du participant FSPIOP-Source + + + 7 + Retourner les informations du participant FSPIOP-Source + + + + + 8 + Valider le participant FSPIOP-Source + Code erreur : + 320x + + + + 9 + Obtenir les informations du Participant pour PayeeFSP + Code erreur : + 200x, 310x, 320x + + + ref + OBTENIR Participants - + Request Participant Information from Oracle Sequence + + + + + + 10 + Requêter les informations des Parties depuis FSP. + Code erreur : + 200x + + + + 11 + Rappel des Parties vers la Destination: + GET - /parties/{TYPE}/{ID}?currency={CURRENCY} + Code réponse : + 202 + Code erreur : + 200x, 310x, 320x + + + + 12 + Rappel avec les informations du Participant: + PUT - /parties/{TYPE}/{ID}?currency={CURRENCY} + Code erreur : + 200x, 300x, 310x, 320x + + + + + 13 + Valider la requête selon + la Spécification d'Interface Mojaloop + Code erreur : + 300x, 310x + + + 14 + Traiter les informations de rappel du Participant pour PUT + + + 15 + Récupérer l'End-point de rappel du Participant PayerFSP + Code erreur : + 200x + + + 16 + Récupérer l'End-point de rappel du Participant PayerFSP + GET - /participants/{FSPIOP-Source}/endpoints + Code erreur : + 200x, 310x, 320x + + + 17 + Liste des end-points de rappel du participant PayerFSP + + + 18 + Liste des end-points de rappel du participant PayerFSP + + + + + 19 + Associer les End-points de rappel du Participant PayerFSP pour + FSPIOP_CALLBACK_URL_PARTIES_PUT + + + 20 + Retourner les informations du Participant à PayerFSP + + + + 21 + Callback avec infos Parties : + PUT - /parties/{TYPE}/{ID}?currency={CURRENCY} + + [Liste d'end-points vide renvoyée pour la config (PayeeFSP ou Oracle) ou erreur pour PayerFSP] + + + 22 + Récupérer l'End-point de rappel du Participant PayerFSP + Code erreur : + 200x, 310x, 320x + + + 23 + Récupérer l'End-point de rappel du Participant PayerFSP + GET - /participants/{FSPIOP-Source}/endpoints + Code réponse : + 200 + Code erreur : + 200x, 310x, 320x + + + 24 + Liste des end-points de rappel du participant PayerFSP + + + 25 + Liste des end-points de rappel du participant PayerFSP + + + + + 26 + Associer les end-points de rappel du Participant PayerFSP pour + FSPIOP_CALLBACK_URL_PARTIES_PUT_ERROR + + + 27 + Gérer l'erreur + Code erreur : + 200x, 310x, 320x + + + + 28 + Callback : PUT - /participants/{TYPE}/{ID}/error + + [Liste d'end-points vide renvoyée pour la config PayerFSP ou erreur pour PayeeFSP] + + + 29 + Récupérer l'End-point de rappel du Participant PayeeFSP + Code erreur : + 200x, 310x, 320x + + + 30 + Récupérer l'End-point de rappel du Participant PayeeFSP + GET - /participants/{FSPIOP-Source}/endpoints + Code réponse : + 200 + Code erreur : + 200x, 310x, 320x + + + 31 + Liste des end-points de rappel du participant PayeeFSP + + + 32 + Liste des end-points de rappel du participant PayeeFSP + + + + + 33 + Associer les end-points de rappel du participant PayeeFSP pour + FSPIOP_CALLBACK_URL_PARTIES_PUT_ERROR + + + 34 + Gérer l'erreur + Code erreur : + 200x, 310x, 320x + + + + 35 + Callback : PUT - /participants/{TYPE}/{ID}/error + + [Liste de résultats switchEndpoint vide renvoyée] + + + + + 36 + Gérer l'erreur + Code erreur : + 200x + + Cadre de Gestion des Erreurs + + diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-post-participants-7.1.3.plantuml b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-post-participants-7.1.3.plantuml new file mode 100644 index 000000000..034740749 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-post-participants-7.1.3.plantuml @@ -0,0 +1,213 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Rajiv Mothilal + -------------- + ******'/ + + +@startuml +' déclaration du titre +title 7.1.3 Poster les détails du Participant par Type et ID + +autonumber +' Clés des acteurs : +' boundary - API / Interfaces, etc. +' entity - Objets d’accès à la base de données +' database - Stockage persistant en base de données + +' déclaration des acteurs +actor "PSF Payeur" as PAYER_FSP +boundary "Service de découverte de compte\n(ALS)" as ALS_API +control "Gestionnaire de participant ALS" as ALS_PARTICIPANT_HANDLER +entity "DAO des points d'accès Service Central ALS" as ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO +entity "DAO des participants Service Central ALS" as ALS_CENTRALSERVICE_PARTICIPANT_DAO +entity "DAO Oracle des participants ALS" as ALS_PARTICIPANT_ORACLE_DAO +database "Base de données ALS" as ALS_DB +boundary "API du service Oracle" as ORACLE_API +boundary "API Service Central" as CENTRALSERVICE_API + +box "Prestataire de services financiers" #LightGrey +participant PAYER_FSP +end box + +box "Service de découverte de compte" #LightYellow +participant ALS_API +participant ALS_PARTICIPANT_HANDLER +participant ALS_PARTICIPANT_ORACLE_DAO +participant ALS_DB +participant ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO +participant ALS_CENTRALSERVICE_PARTICIPANT_DAO +end box + +box "Services centraux" #LightGreen +participant CENTRALSERVICE_API +end box + +box "Service/Adaptateur Oracle ALS" #LightBlue +participant ORACLE_API +end box + +' DÉBUT DU FLUX + +group Publication des détails PSF du Participant + note right of PAYER_FSP #yellow + Entêtes - postParticipantsByTypeIDHeaders: { + Content-Length: , + Content-Type: , + Date: , + X-Forwarded-For: , + FSPIOP-Source: , + FSPIOP-Destination: , + FSPIOP-Encryption: , + FSPIOP-Signature: , + FSPIOP-URI: , + FSPIOP-HTTP-Method: + } + + Charge utile - postParticipantsByTypeIDMessage: + { + "fspId": "chaîne" + } + end note + PAYER_FSP ->> ALS_API: Requête pour ajouter les détails PSF du participant\nPOST - /participants/{Type}/{ID}\nCode de réponse : 202 \nCode d’erreur : 200x, 300x, 310x, 320x + + activate ALS_API + note left ALS_API #lightgray + Valider la requête suivant + la Spécification d’interface Mojaloop. + Code d’erreur : 300x, 310x + end note + + ALS_API -> ALS_PARTICIPANT_HANDLER: Traiter la création des détails PSF du participant + deactivate ALS_API + activate ALS_PARTICIPANT_HANDLER + + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Vérifier que PARTICIPANT.fspId == FSPIOP-Source\nCode d’erreur : 3100 + + '********************* Trier dans les groupes de participants selon {TYPE} - FIN ************************ + + alt Validation réussie + + + '********************* Récupérer les infos de routage Oracle - DÉBUT ************************ + + '********************* Récupérer les infos de routage Oracle - DÉBUT ************************ + + ALS_PARTICIPANT_HANDLER <-> ALS_DB: Obtenir la configuration de routage Oracle selon Type (et optionnellement Devise)\nCode d’erreur : 300x, 310x + ref over ALS_PARTICIPANT_HANDLER, ALS_DB + OBTENIR Participants - [[https://docs.mojaloop.live/mojaloop-technical-overview/account-lookup-service/als-get-participants.html Sequence de récupération de la configuration de routage Oracle]] + ||| + end ref + + '********************* Récupérer les infos de routage Oracle - FIN ************************ + + ||| + +' '********************* Récupérer les infos de routage Oracle - FIN ************************ +' +' '********************* Récupérer la config de routage Switch - DÉBUT ************************ +' +' ALS_PARTICIPANT_HANDLER <-> ALS_DB: Obtenir la configuration de routage Switch\nCode d’erreur : 300x, 310x +' ref over ALS_PARTICIPANT_HANDLER, ALS_DB +' ||| +' OBTENIR Participants - [[https://docs.mojaloop.live/mojaloop-technical-overview/account-lookup-service/als-get-participants.html Sequence de récupération de la configuration de routage Switch]] +' ||| +' end ref +' +' '********************* Récupérer la config de routage Switch - FIN ************************ +' ||| + + '********************* Validation du participant - DÉBUT ************************ + group Validation du PSF du participant + + ALS_PARTICIPANT_HANDLER -> ALS_CENTRALSERVICE_PARTICIPANT_DAO: Requête d’informations sur le participant (PARTICIPANT.fspId) pour {Type}\nCode d’erreur : 200x + activate ALS_CENTRALSERVICE_PARTICIPANT_DAO + + ALS_CENTRALSERVICE_PARTICIPANT_DAO -> CENTRALSERVICE_API: GET - /participants/{PARTICIPANT.fspId}\nCode de réponse : 200 \nCode d’erreur : 200x, 310x, 320x + activate CENTRALSERVICE_API + CENTRALSERVICE_API --> ALS_CENTRALSERVICE_PARTICIPANT_DAO: Retourner les informations du participant + deactivate CENTRALSERVICE_API + + ALS_CENTRALSERVICE_PARTICIPANT_DAO --> ALS_PARTICIPANT_HANDLER: Retourner les informations du participant + + deactivate ALS_CENTRALSERVICE_PARTICIPANT_DAO + + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Valider le participant\nCode d’erreur : 320x + end group + '********************* Validation du participant - FIN ************************ + + '********************* Création des informations du participant - DÉBUT ************************ + + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_ORACLE_DAO: Créer les détails PSF du participant\nPOST - /participants\nCode d’erreur : 200x, 310x, 320x + activate ALS_PARTICIPANT_ORACLE_DAO + ALS_PARTICIPANT_ORACLE_DAO -> ORACLE_API: Créer les détails PSF du participant\nPOST - /participants\nCode de réponse : 204 \nCode d’erreur : 200x, 310x, 320x + activate ORACLE_API + + ORACLE_API --> ALS_PARTICIPANT_ORACLE_DAO: Retourner le résultat de la requête de création du participant + deactivate ORACLE_API + + ALS_PARTICIPANT_ORACLE_DAO --> ALS_PARTICIPANT_HANDLER: Retourner le résultat de la création du participant + deactivate ALS_PARTICIPANT_ORACLE_DAO + + '********************* Création des informations du participant - FIN ************************ + + '********************* Obtenir les informations d’end-point du PSF Payeur - DÉBUT ************************ + + ALS_PARTICIPANT_HANDLER -> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Récupérer l’endpoint Callback Participant du PSF Payeur (FSPIOP-Source)\nCode d’erreur : 200x, 310x, 320x + activate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO -> CENTRALSERVICE_API: Récupérer l’endpoint Callback Participant du PSF Payeur\nGET - /participants/{FSPIOP-Source}/endpoints\nCode de réponse : 200 \nCode d’erreur : 200x, 310x, 320x + activate CENTRALSERVICE_API + CENTRALSERVICE_API --> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Liste des endpoints Callback Participant du PSF Payeur + deactivate CENTRALSERVICE_API + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO --> ALS_PARTICIPANT_HANDLER: Liste des endpoints Callback Participant du PSF Payeur + deactivate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Faire correspondre les endpoints Callback du PSF Payeur pour\nFSPIOP_CALLBACK_URL_PARTICIPANT_PUT + + '********************* Obtenir les informations d’end-point du PSF Payeur - FIN ************************ + + ALS_PARTICIPANT_HANDLER --> ALS_API: Retourner la liste d’informations de participant à partir du ParticipantResult + ALS_API ->> PAYER_FSP: Callback : PUT - /participants/{Type}/{ID} + + else Validation échouée + '********************* Obtenir les informations d’end-point du PSF Payeur - DÉBUT ************************ + + ALS_PARTICIPANT_HANDLER -> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Récupérer l’endpoint Callback Participant du PSF Payeur (FSPIOP-Source)\nCode d’erreur : 200x, 310x, 320x + activate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO -> CENTRALSERVICE_API: Récupérer l’endpoint Callback Participant du PSF Payeur\nGET - /participants/{FSPIOP-Source}/endpoints\nCode de réponse : 200 \nCode d’erreur : 200x, 310x, 320x + activate CENTRALSERVICE_API + CENTRALSERVICE_API --> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Liste des endpoints Callback Participant du PSF Payeur + deactivate CENTRALSERVICE_API + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO --> ALS_PARTICIPANT_HANDLER: Liste des endpoints Callback Participant du PSF Payeur + deactivate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Faire correspondre les endpoints Callback Participant pour\nFSPIOP_CALLBACK_URL_PARTICIPANT_PUT_ERROR + + '********************* Obtenir les informations d’end-point du PSF Payeur - FIN ************************ + + ALS_PARTICIPANT_HANDLER --> ALS_API: Gérer l’erreur\nCode d’erreur : 200x, 310x, 320x + ALS_API ->> PAYER_FSP: Callback : PUT - /participants/{Type}/{ID}/error + end alt + + + deactivate ALS_PARTICIPANT_HANDLER +end +@enduml diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-post-participants-7.1.3.svg b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-post-participants-7.1.3.svg new file mode 100644 index 000000000..9eae33320 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-post-participants-7.1.3.svg @@ -0,0 +1,316 @@ + + 7.1.3 Poster les détails du Participant par Type et ID + + + 7.1.3 Poster les détails du Participant par Type et ID + + Prestataire de services financiers + + Service de découverte de compte + + Services centraux + + Service/Adaptateur Oracle ALS + + + + + + + + + + + + + + + + + + + + + + + PSF Payeur + + + PSF Payeur + + + Service de découverte de compte + (ALS) + + + Service de découverte de compte + (ALS) + + + Gestionnaire de participant ALS + + + Gestionnaire de participant ALS + + + DAO Oracle des participants ALS + + + DAO Oracle des participants ALS + + + Base de données ALS + + + Base de données ALS + + + DAO des points d'accès Service Central ALS + + + DAO des points d'accès Service Central ALS + + + DAO des participants Service Central ALS + + + DAO des participants Service Central ALS + + + API Service Central + + + API Service Central + + + API du service Oracle + + + API du service Oracle + + + + + + + + + + + + + + + Publication des détails PSF du Participant + + + Entêtes - postParticipantsByTypeIDHeaders: { + Content-Length: <Content-Length>, + Content-Type: <Content-Type>, + Date: <Date>, + X-Forwarded-For: <X-Forwarded-For>, + FSPIOP-Source: <FSPIOP-Source>, + FSPIOP-Destination: <FSPIOP-Destination>, + FSPIOP-Encryption: <FSPIOP-Encryption>, + FSPIOP-Signature: <FSPIOP-Signature>, + FSPIOP-URI: <FSPIOP-URI>, + FSPIOP-HTTP-Method: <FSPIOP-HTTP-Method> + } +   + Charge utile - postParticipantsByTypeIDMessage: + { + "fspId": "chaîne" + } + + + + 1 + Requête pour ajouter les détails PSF du participant + POST - /participants/{Type}/{ID} + Code de réponse : + 202 +   + Code d’erreur : + 200x, 300x, 310x, 320x + + + Valider la requête suivant + la Spécification d’interface Mojaloop. + Code d’erreur : + 300x, 310x + + + 2 + Traiter la création des détails PSF du participant + + + + + 3 + Vérifier que PARTICIPANT.fspId == FSPIOP-Source + Code d’erreur : + 3100 + + + alt + [Validation réussie] + + + + 4 + Obtenir la configuration de routage Oracle selon Type (et optionnellement Devise) + Code d’erreur : + 300x, 310x + + + ref + OBTENIR Participants - + Sequence de récupération de la configuration de routage Oracle + + + + + + Validation du PSF du participant + + + 5 + Requête d’informations sur le participant (PARTICIPANT.fspId) pour {Type} + Code d’erreur : + 200x + + + 6 + GET - /participants/{PARTICIPANT.fspId} + Code de réponse : + 200 +   + Code d’erreur : + 200x, 310x, 320x + + + 7 + Retourner les informations du participant + + + 8 + Retourner les informations du participant + + + + + 9 + Valider le participant + Code d’erreur : + 320x + + + 10 + Créer les détails PSF du participant + POST - /participants + Code d’erreur : + 200x, 310x, 320x + + + 11 + Créer les détails PSF du participant + POST - /participants + Code de réponse : + 204 +   + Code d’erreur : + 200x, 310x, 320x + + + 12 + Retourner le résultat de la requête de création du participant + + + 13 + Retourner le résultat de la création du participant + + + 14 + Récupérer l’endpoint Callback Participant du PSF Payeur (FSPIOP-Source) + Code d’erreur : + 200x, 310x, 320x + + + 15 + Récupérer l’endpoint Callback Participant du PSF Payeur + GET - /participants/{FSPIOP-Source}/endpoints + Code de réponse : + 200 +   + Code d’erreur : + 200x, 310x, 320x + + + 16 + Liste des endpoints Callback Participant du PSF Payeur + + + 17 + Liste des endpoints Callback Participant du PSF Payeur + + + + + 18 + Faire correspondre les endpoints Callback du PSF Payeur pour + FSPIOP_CALLBACK_URL_PARTICIPANT_PUT + + + 19 + Retourner la liste d’informations de participant à partir du ParticipantResult + + + + 20 + Callback : PUT - /participants/{Type}/{ID} + + [Validation échouée] + + + 21 + Récupérer l’endpoint Callback Participant du PSF Payeur (FSPIOP-Source) + Code d’erreur : + 200x, 310x, 320x + + + 22 + Récupérer l’endpoint Callback Participant du PSF Payeur + GET - /participants/{FSPIOP-Source}/endpoints + Code de réponse : + 200 +   + Code d’erreur : + 200x, 310x, 320x + + + 23 + Liste des endpoints Callback Participant du PSF Payeur + + + 24 + Liste des endpoints Callback Participant du PSF Payeur + + + + + 25 + Faire correspondre les endpoints Callback Participant pour + FSPIOP_CALLBACK_URL_PARTICIPANT_PUT_ERROR + + + 26 + Gérer l’erreur + Code d’erreur : + 200x, 310x, 320x + + + + 27 + Callback : PUT - /participants/{Type}/{ID}/error + + diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-post-participants-batch-7.1.1.plantuml b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-post-participants-batch-7.1.1.plantuml new file mode 100644 index 000000000..97b3062f7 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-post-participants-batch-7.1.1.plantuml @@ -0,0 +1,238 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Rajiv Mothilal + -------------- + ******'/ + + +@startuml +' déclaration du titre +title 7.1.1. Détail : Publication des participants (Batch) + +autonumber +' Clés des acteurs : +' boundary - APIs/Interfaces, etc. +' entity - Objets d'accès à la base de données +' database - Stockage persistant en base + +' déclaration des acteurs +actor "FSP Payeur" as PAYER_FSP +boundary "Service de Recherche\nde Compte (ALS)" as ALS_API +control "Gestionnaire de Participant\nALS" as ALS_PARTICIPANT_HANDLER +entity "DAO Endpoint ALS CentralService" as ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO +entity "DAO Participant ALS CentralService" as ALS_CENTRALSERVICE_PARTICIPANT_DAO +entity "DAO Oracle Participant ALS" as ALS_PARTICIPANT_ORACLE_DAO +database "Base de Données ALS" as ALS_DB +boundary "API Service Oracle" as ORACLE_API +boundary "API Service Central" as CENTRALSERVICE_API + +box "Fournisseur de Services Financiers" #LightGrey +participant PAYER_FSP +end box + +box "Service de Recherche de Compte" #LightYellow +participant ALS_API +participant ALS_PARTICIPANT_HANDLER +participant ALS_PARTICIPANT_ORACLE_DAO +participant ALS_DB +participant ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO +participant ALS_CENTRALSERVICE_PARTICIPANT_DAO +end box + +box "Services Centraux" #LightGreen +participant CENTRALSERVICE_API +end box + +box "Service/Adaptateur Oracle ALS" #LightBlue +participant ORACLE_API +end box + +' DÉBUT DU FLUX + +group Publication des détails FSP du Participant + note right of PAYER_FSP #yellow + En-têtes - postParticipantsHeaders : { + Content-Length: , + Content-Type: , + Date: , + X-Forwarded-For: , + FSPIOP-Source: , + FSPIOP-Destination: , + FSPIOP-Encryption: , + FSPIOP-Signature: , + FSPIOP-URI: , + FSPIOP-HTTP-Method: + } + + Corps - postParticipantsMessage: + { + "requestId": "string", + "partyList": [ + { + "partyIdType": "string", + "partyIdentifier": "string", + "partySubIdOrType": "string", + "fspId": "string" + } + ], + "currency": "string" + } + end note + PAYER_FSP ->> ALS_API: Requête pour ajouter les détails FSP du participant\nPOST - /participants\nCode réponse : 202 \nCodes erreur : 200x, 300x, 310x, 320x + + activate ALS_API + note left ALS_API #lightgray + Valide la requête selon + les spécifications d'interface Mojaloop. + Codes d’erreur : 300x, 310x + end note + + ALS_API -> ALS_PARTICIPANT_HANDLER: Traite la création des détails FSP du participant + deactivate ALS_API + activate ALS_PARTICIPANT_HANDLER + + '********************* Trier dans des groupes de Participants selon {TYPE} - DÉBUT ************************ + loop pour chaque Participant dans ParticipantList + + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Valider que PARTICIPANT.fspId == FSPIOP-Source\nCode erreur : 3100 + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Grouper la liste des Participants dans une Carte (ParticipantMap) selon {TYPE} + + end loop + + '********************* Trier dans des groupes de Participants selon {TYPE} - FIN ************************ + + alt Validation réussie et la ParticipantMap a été créée avec succès + + loop pour chaque clé de ParticipantMap -> TypeKey + + '********************* Récupérer les infos de routage Oracle - DÉBUT ************************ + + '********************* Récupérer les infos de routage Oracle - DÉBUT ************************ + + ALS_PARTICIPANT_HANDLER <-> ALS_DB: Obtenir la config de routage Oracle selon TypeKey (et la devise si présente)\nCodes erreur : 300x, 310x + ref over ALS_PARTICIPANT_HANDLER, ALS_DB + GET Participants - [[https://docs.mojaloop.live/mojaloop-technical-overview/account-lookup-service/als-get-participants.html Séquence : Obtenir la config de routage Oracle]] + ||| + end ref + + '********************* Récupérer les infos de routage Oracle - FIN ************************ + + ||| + +' '********************* Fin récupération infos routage Oracle - FIN ************************ +' +' '********************* Début récupération infos routage Switch - DÉBUT ************************ +' +' ALS_PARTICIPANT_HANDLER <-> ALS_DB: Obtenir la config de routage Switch\nCodes erreur : 300x, 310x +' ref over ALS_PARTICIPANT_HANDLER, ALS_DB +' ||| +' GET Participants - [[https://docs.mojaloop.live/mojaloop-technical-overview/account-lookup-service/als-get-participants.html Séquence : Obtenir la config de routage Switch]] +' ||| +' end ref +' +' '********************* Fin récupération infos routage Switch - FIN ************************ +' ||| + + '********************* Valider le Participant - DÉBUT ************************ + group Validation du FSP du Participant + + ALS_PARTICIPANT_HANDLER -> ALS_CENTRALSERVICE_PARTICIPANT_DAO: Demander les informations sur le participant (PARTICIPANT.fspId) pour {TypeKey}\nCode erreur : 200x + activate ALS_CENTRALSERVICE_PARTICIPANT_DAO + + ALS_CENTRALSERVICE_PARTICIPANT_DAO -> CENTRALSERVICE_API: GET - /participants/{PARTICIPANT.fspId}\nCode réponse : 200 \nCodes erreur : 200x, 310x, 320x + activate CENTRALSERVICE_API + CENTRALSERVICE_API --> ALS_CENTRALSERVICE_PARTICIPANT_DAO: Retourner les informations du participant + deactivate CENTRALSERVICE_API + + ALS_CENTRALSERVICE_PARTICIPANT_DAO --> ALS_PARTICIPANT_HANDLER: Retourner les informations du participant + + deactivate ALS_CENTRALSERVICE_PARTICIPANT_DAO + + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Valider le participant\nCode erreur : 320x + end group + '********************* Valider le Participant - FIN ************************ + + '********************* Créer l’Information de Participant - DÉBUT ************************ + + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_ORACLE_DAO: Créer les détails FSP du participant\nPOST - /participants\nCodes erreur : 200x, 310x, 320x + activate ALS_PARTICIPANT_ORACLE_DAO + ALS_PARTICIPANT_ORACLE_DAO -> ORACLE_API: Créer les détails FSP du participant\nPOST - /participants\nCode réponse : 204 \nCodes erreur : 200x, 310x, 320x + activate ORACLE_API + + ORACLE_API --> ALS_PARTICIPANT_ORACLE_DAO: Retourner le résultat de la requête de création du Participant + deactivate ORACLE_API + + ALS_PARTICIPANT_ORACLE_DAO --> ALS_PARTICIPANT_HANDLER: Retourner le résultat de la création du participant + deactivate ALS_PARTICIPANT_ORACLE_DAO + + '********************* Créer l’Information de Participant - FIN ************************ + + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Stocker les résultats dans ParticipantResultMap[TypeKey] + + end loop + + loop pour chaque clé dans ParticipantResultMap -> TypeKey + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Combiner les résultats de ParticipantResultMap[TypeKey] dans ParticipantResult + end loop + + '********************* Obtenir les infos du point de terminaison Participant FSP payeur - DÉBUT ************************ + + ALS_PARTICIPANT_HANDLER -> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Récupérer l’endpoint de rappel du participant PayerFSP (FSPIOP-Source)\nCodes erreur : 200x, 310x, 320x + activate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO -> CENTRALSERVICE_API: Récupérer l’endpoint de rappel du participant PayerFSP\nGET - /participants/{FSPIOP-Source}/endpoints\nCode réponse : 200 \nCodes erreur : 200x, 310x, 320x + activate CENTRALSERVICE_API + CENTRALSERVICE_API --> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Liste des endpoints de rappel du participant PayerFSP + deactivate CENTRALSERVICE_API + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO --> ALS_PARTICIPANT_HANDLER: Liste des endpoints de rappel du participant PayerFSP + deactivate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Trouver les endpoints de rappel de Participant PayerFSP pour\nFSPIOP_CALLBACK_URL_PARTICIPANT_BATCH_PUT + + '********************* Obtenir les infos du point de terminaison Participant FSP payeur - FIN ************************ + + ALS_PARTICIPANT_HANDLER --> ALS_API: Retourner la liste des informations du participant depuis ParticipantResult + ALS_API ->> PAYER_FSP: Callback : PUT - /participants/{requestId} + + else Échec de validation ou la ParticipantMap n’a pas pu être créée + '********************* Obtenir les infos du point de terminaison Participant FSP payeur - DÉBUT ************************ + + ALS_PARTICIPANT_HANDLER -> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Récupérer l’endpoint de rappel du participant PayerFSP (FSPIOP-Source)\nCodes erreur : 200x, 310x, 320x + activate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO -> CENTRALSERVICE_API: Récupérer l’endpoint de rappel du participant PayerFSP\nGET - /participants/{FSPIOP-Source}/endpoints\nCode réponse : 200 \nCodes erreur : 200x, 310x, 320x + activate CENTRALSERVICE_API + CENTRALSERVICE_API --> ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO: Liste des endpoints de rappel du participant PayerFSP + deactivate CENTRALSERVICE_API + ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO --> ALS_PARTICIPANT_HANDLER: Liste des endpoints de rappel du participant PayerFSP + deactivate ALS_CENTRALSERVICE_ENDPOINT_CONFIG_DAO + + ALS_PARTICIPANT_HANDLER -> ALS_PARTICIPANT_HANDLER: Trouver les endpoints de rappel du participant pour\nFSPIOP_CALLBACK_URL_PARTICIPANT_BATCH_PUT_ERROR + + '********************* Obtenir les infos du point de terminaison Participant FSP payeur - FIN ************************ + + ALS_PARTICIPANT_HANDLER --> ALS_API: Gérer l’erreur\nCodes erreur : 200x, 310x, 320x + ALS_API ->> PAYER_FSP: Callback : PUT - /participants/{requestId}/error + end alt + + + deactivate ALS_PARTICIPANT_HANDLER +end +@enduml diff --git a/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-post-participants-batch-7.1.1.svg b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-post-participants-batch-7.1.1.svg new file mode 100644 index 000000000..9ca6001b8 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/diagrams/sequence/seq-acct-lookup-post-participants-batch-7.1.1.svg @@ -0,0 +1,360 @@ + + 7.1.1. Détail : Publication des participants (Batch) + + + 7.1.1. Détail : Publication des participants (Batch) + + Fournisseur de Services Financiers + + Service de Recherche de Compte + + Services Centraux + + Service/Adaptateur Oracle ALS + + + + + + + + + + + + + + + + + + + + + + + + + + FSP Payeur + + + FSP Payeur + + + Service de Recherche + de Compte (ALS) + + + Service de Recherche + de Compte (ALS) + + + Gestionnaire de Participant + ALS + + + Gestionnaire de Participant + ALS + + + DAO Oracle Participant ALS + + + DAO Oracle Participant ALS + + + Base de Données ALS + + + Base de Données ALS + + + DAO Endpoint ALS CentralService + + + DAO Endpoint ALS CentralService + + + DAO Participant ALS CentralService + + + DAO Participant ALS CentralService + + + API Service Central + + + API Service Central + + + API Service Oracle + + + API Service Oracle + + + + + + + + + + + + + + + Publication des détails FSP du Participant + + + En-têtes - postParticipantsHeaders : { + Content-Length: <Content-Length>, + Content-Type: <Content-Type>, + Date: <Date>, + X-Forwarded-For: <X-Forwarded-For>, + FSPIOP-Source: <FSPIOP-Source>, + FSPIOP-Destination: <FSPIOP-Destination>, + FSPIOP-Encryption: <FSPIOP-Encryption>, + FSPIOP-Signature: <FSPIOP-Signature>, + FSPIOP-URI: <FSPIOP-URI>, + FSPIOP-HTTP-Method: <FSPIOP-HTTP-Method> + } +   + Corps - postParticipantsMessage: + { + "requestId": "string", + "partyList": [ + { + "partyIdType": "string", + "partyIdentifier": "string", + "partySubIdOrType": "string", + "fspId": "string" + } + ], + "currency": "string" + } + + + + 1 + Requête pour ajouter les détails FSP du participant + POST - /participants + Code réponse : + 202 +   + Codes erreur : + 200x, 300x, 310x, 320x + + + Valide la requête selon + les spécifications d'interface Mojaloop. + Codes d’erreur : + 300x, 310x + + + 2 + Traite la création des détails FSP du participant + + + loop + [pour chaque Participant dans ParticipantList] + + + + + 3 + Valider que PARTICIPANT.fspId == FSPIOP-Source + Code erreur : + 3100 + + + + + 4 + Grouper la liste des Participants dans une Carte (ParticipantMap) selon {TYPE} + + + alt + [Validation réussie et la ParticipantMap a été créée avec succès] + + + loop + [pour chaque clé de ParticipantMap -> TypeKey] + + + + 5 + Obtenir la config de routage Oracle selon TypeKey (et la devise si présente) + Codes erreur : + 300x, 310x + + + ref + GET Participants - + Séquence : Obtenir la config de routage Oracle + + + + + + Validation du FSP du Participant + + + 6 + Demander les informations sur le participant (PARTICIPANT.fspId) pour {TypeKey} + Code erreur : + 200x + + + 7 + GET - /participants/{PARTICIPANT.fspId} + Code réponse : + 200 +   + Codes erreur : + 200x, 310x, 320x + + + 8 + Retourner les informations du participant + + + 9 + Retourner les informations du participant + + + + + 10 + Valider le participant + Code erreur : + 320x + + + 11 + Créer les détails FSP du participant + POST - /participants + Codes erreur : + 200x, 310x, 320x + + + 12 + Créer les détails FSP du participant + POST - /participants + Code réponse : + 204 +   + Codes erreur : + 200x, 310x, 320x + + + 13 + Retourner le résultat de la requête de création du Participant + + + 14 + Retourner le résultat de la création du participant + + + + + 15 + Stocker les résultats dans ParticipantResultMap[TypeKey] + + + loop + [pour chaque clé dans ParticipantResultMap -> TypeKey] + + + + + 16 + Combiner les résultats de ParticipantResultMap[TypeKey] dans ParticipantResult + + + 17 + Récupérer l’endpoint de rappel du participant PayerFSP (FSPIOP-Source) + Codes erreur : + 200x, 310x, 320x + + + 18 + Récupérer l’endpoint de rappel du participant PayerFSP + GET - /participants/{FSPIOP-Source}/endpoints + Code réponse : + 200 +   + Codes erreur : + 200x, 310x, 320x + + + 19 + Liste des endpoints de rappel du participant PayerFSP + + + 20 + Liste des endpoints de rappel du participant PayerFSP + + + + + 21 + Trouver les endpoints de rappel de Participant PayerFSP pour + FSPIOP_CALLBACK_URL_PARTICIPANT_BATCH_PUT + + + 22 + Retourner la liste des informations du participant depuis ParticipantResult + + + + 23 + Callback : PUT - /participants/{requestId} + + [Échec de validation ou la ParticipantMap n’a pas pu être créée] + + + 24 + Récupérer l’endpoint de rappel du participant PayerFSP (FSPIOP-Source) + Codes erreur : + 200x, 310x, 320x + + + 25 + Récupérer l’endpoint de rappel du participant PayerFSP + GET - /participants/{FSPIOP-Source}/endpoints + Code réponse : + 200 +   + Codes erreur : + 200x, 310x, 320x + + + 26 + Liste des endpoints de rappel du participant PayerFSP + + + 27 + Liste des endpoints de rappel du participant PayerFSP + + + + + 28 + Trouver les endpoints de rappel du participant pour + FSPIOP_CALLBACK_URL_PARTICIPANT_BATCH_PUT_ERROR + + + 29 + Gérer l’erreur + Codes erreur : + 200x, 310x, 320x + + + + 30 + Callback : PUT - /participants/{requestId}/error + + diff --git a/docs/fr/technical/technical/account-lookup-service/assets/entities/AccountLookup-ddl-MySQLWorkbench.sql b/docs/fr/technical/technical/account-lookup-service/assets/entities/AccountLookup-ddl-MySQLWorkbench.sql new file mode 100644 index 000000000..e538b6351 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/entities/AccountLookup-ddl-MySQLWorkbench.sql @@ -0,0 +1,195 @@ +-- MySQL dump 10.13 Distrib 5.7.17, for macos10.12 (x86_64) +-- +-- Host: 127.0.0.1 Database: account_lookup +-- ------------------------------------------------------ +-- Server version 8.0.12 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `currency` +-- + +DROP TABLE IF EXISTS `currency`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `currency` ( + `currencyId` varchar(3) NOT NULL, + `name` varchar(128) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`currencyId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `currency` +-- + +LOCK TABLES `currency` WRITE; +/*!40000 ALTER TABLE `currency` DISABLE KEYS */; +INSERT INTO `currency` VALUES ('AED','UAE dirham',1,'2019-03-28 09:07:47'),('AFA','Afghanistan afghani (obsolete)',1,'2019-03-28 09:07:47'),('AFN','Afghanistan afghani',1,'2019-03-28 09:07:47'),('ALL','Albanian lek',1,'2019-03-28 09:07:47'),('AMD','Armenian dram',1,'2019-03-28 09:07:47'),('ANG','Netherlands Antillian guilder',1,'2019-03-28 09:07:47'),('AOA','Angolan kwanza',1,'2019-03-28 09:07:47'),('AOR','Angolan kwanza reajustado',1,'2019-03-28 09:07:47'),('ARS','Argentine peso',1,'2019-03-28 09:07:47'),('AUD','Australian dollar',1,'2019-03-28 09:07:47'),('AWG','Aruban guilder',1,'2019-03-28 09:07:47'),('AZN','Azerbaijanian new manat',1,'2019-03-28 09:07:47'),('BAM','Bosnia-Herzegovina convertible mark',1,'2019-03-28 09:07:47'),('BBD','Barbados dollar',1,'2019-03-28 09:07:47'),('BDT','Bangladeshi taka',1,'2019-03-28 09:07:47'),('BGN','Bulgarian lev',1,'2019-03-28 09:07:47'),('BHD','Bahraini dinar',1,'2019-03-28 09:07:47'),('BIF','Burundi franc',1,'2019-03-28 09:07:47'),('BMD','Bermudian dollar',1,'2019-03-28 09:07:47'),('BND','Brunei dollar',1,'2019-03-28 09:07:47'),('BOB','Bolivian boliviano',1,'2019-03-28 09:07:47'),('BRL','Brazilian real',1,'2019-03-28 09:07:47'),('BSD','Bahamian dollar',1,'2019-03-28 09:07:47'),('BTN','Bhutan ngultrum',1,'2019-03-28 09:07:47'),('BWP','Botswana pula',1,'2019-03-28 09:07:47'),('BYN','Belarusian ruble',1,'2019-03-28 09:07:47'),('BZD','Belize dollar',1,'2019-03-28 09:07:47'),('CAD','Canadian dollar',1,'2019-03-28 09:07:47'),('CDF','Congolese franc',1,'2019-03-28 09:07:47'),('CHF','Swiss franc',1,'2019-03-28 09:07:47'),('CLP','Chilean peso',1,'2019-03-28 09:07:47'),('CNY','Chinese yuan renminbi',1,'2019-03-28 09:07:47'),('COP','Colombian peso',1,'2019-03-28 09:07:47'),('CRC','Costa Rican colon',1,'2019-03-28 09:07:47'),('CUC','Cuban convertible peso',1,'2019-03-28 09:07:47'),('CUP','Cuban peso',1,'2019-03-28 09:07:47'),('CVE','Cape Verde escudo',1,'2019-03-28 09:07:47'),('CZK','Czech koruna',1,'2019-03-28 09:07:47'),('DJF','Djibouti franc',1,'2019-03-28 09:07:47'),('DKK','Danish krone',1,'2019-03-28 09:07:47'),('DOP','Dominican peso',1,'2019-03-28 09:07:47'),('DZD','Algerian dinar',1,'2019-03-28 09:07:47'),('EEK','Estonian kroon',1,'2019-03-28 09:07:47'),('EGP','Egyptian pound',1,'2019-03-28 09:07:47'),('ERN','Eritrean nakfa',1,'2019-03-28 09:07:47'),('ETB','Ethiopian birr',1,'2019-03-28 09:07:47'),('EUR','EU euro',1,'2019-03-28 09:07:47'),('FJD','Fiji dollar',1,'2019-03-28 09:07:47'),('FKP','Falkland Islands pound',1,'2019-03-28 09:07:47'),('GBP','British pound',1,'2019-03-28 09:07:47'),('GEL','Georgian lari',1,'2019-03-28 09:07:47'),('GGP','Guernsey pound',1,'2019-03-28 09:07:47'),('GHS','Ghanaian new cedi',1,'2019-03-28 09:07:47'),('GIP','Gibraltar pound',1,'2019-03-28 09:07:47'),('GMD','Gambian dalasi',1,'2019-03-28 09:07:47'),('GNF','Guinean franc',1,'2019-03-28 09:07:47'),('GTQ','Guatemalan quetzal',1,'2019-03-28 09:07:47'),('GYD','Guyana dollar',1,'2019-03-28 09:07:47'),('HKD','Hong Kong SAR dollar',1,'2019-03-28 09:07:47'),('HNL','Honduran lempira',1,'2019-03-28 09:07:47'),('HRK','Croatian kuna',1,'2019-03-28 09:07:47'),('HTG','Haitian gourde',1,'2019-03-28 09:07:47'),('HUF','Hungarian forint',1,'2019-03-28 09:07:47'),('IDR','Indonesian rupiah',1,'2019-03-28 09:07:47'),('ILS','Israeli new shekel',1,'2019-03-28 09:07:47'),('IMP','Isle of Man pound',1,'2019-03-28 09:07:47'),('INR','Indian rupee',1,'2019-03-28 09:07:47'),('IQD','Iraqi dinar',1,'2019-03-28 09:07:47'),('IRR','Iranian rial',1,'2019-03-28 09:07:47'),('ISK','Icelandic krona',1,'2019-03-28 09:07:47'),('JEP','Jersey pound',1,'2019-03-28 09:07:47'),('JMD','Jamaican dollar',1,'2019-03-28 09:07:47'),('JOD','Jordanian dinar',1,'2019-03-28 09:07:47'),('JPY','Japanese yen',1,'2019-03-28 09:07:47'),('KES','Kenyan shilling',1,'2019-03-28 09:07:47'),('KGS','Kyrgyz som',1,'2019-03-28 09:07:47'),('KHR','Cambodian riel',1,'2019-03-28 09:07:47'),('KMF','Comoros franc',1,'2019-03-28 09:07:47'),('KPW','North Korean won',1,'2019-03-28 09:07:47'),('KRW','South Korean won',1,'2019-03-28 09:07:47'),('KWD','Kuwaiti dinar',1,'2019-03-28 09:07:47'),('KYD','Cayman Islands dollar',1,'2019-03-28 09:07:47'),('KZT','Kazakh tenge',1,'2019-03-28 09:07:47'),('LAK','Lao kip',1,'2019-03-28 09:07:47'),('LBP','Lebanese pound',1,'2019-03-28 09:07:47'),('LKR','Sri Lanka rupee',1,'2019-03-28 09:07:47'),('LRD','Liberian dollar',1,'2019-03-28 09:07:47'),('LSL','Lesotho loti',1,'2019-03-28 09:07:47'),('LTL','Lithuanian litas',1,'2019-03-28 09:07:47'),('LVL','Latvian lats',1,'2019-03-28 09:07:47'),('LYD','Libyan dinar',1,'2019-03-28 09:07:47'),('MAD','Moroccan dirham',1,'2019-03-28 09:07:47'),('MDL','Moldovan leu',1,'2019-03-28 09:07:47'),('MGA','Malagasy ariary',1,'2019-03-28 09:07:47'),('MKD','Macedonian denar',1,'2019-03-28 09:07:47'),('MMK','Myanmar kyat',1,'2019-03-28 09:07:47'),('MNT','Mongolian tugrik',1,'2019-03-28 09:07:47'),('MOP','Macao SAR pataca',1,'2019-03-28 09:07:47'),('MRO','Mauritanian ouguiya',1,'2019-03-28 09:07:47'),('MUR','Mauritius rupee',1,'2019-03-28 09:07:47'),('MVR','Maldivian rufiyaa',1,'2019-03-28 09:07:47'),('MWK','Malawi kwacha',1,'2019-03-28 09:07:47'),('MXN','Mexican peso',1,'2019-03-28 09:07:47'),('MYR','Malaysian ringgit',1,'2019-03-28 09:07:47'),('MZN','Mozambique new metical',1,'2019-03-28 09:07:47'),('NAD','Namibian dollar',1,'2019-03-28 09:07:47'),('NGN','Nigerian naira',1,'2019-03-28 09:07:47'),('NIO','Nicaraguan cordoba oro',1,'2019-03-28 09:07:47'),('NOK','Norwegian krone',1,'2019-03-28 09:07:47'),('NPR','Nepalese rupee',1,'2019-03-28 09:07:47'),('NZD','New Zealand dollar',1,'2019-03-28 09:07:47'),('OMR','Omani rial',1,'2019-03-28 09:07:47'),('PAB','Panamanian balboa',1,'2019-03-28 09:07:47'),('PEN','Peruvian nuevo sol',1,'2019-03-28 09:07:47'),('PGK','Papua New Guinea kina',1,'2019-03-28 09:07:47'),('PHP','Philippine peso',1,'2019-03-28 09:07:47'),('PKR','Pakistani rupee',1,'2019-03-28 09:07:47'),('PLN','Polish zloty',1,'2019-03-28 09:07:47'),('PYG','Paraguayan guarani',1,'2019-03-28 09:07:47'),('QAR','Qatari rial',1,'2019-03-28 09:07:47'),('RON','Romanian new leu',1,'2019-03-28 09:07:47'),('RSD','Serbian dinar',1,'2019-03-28 09:07:47'),('RUB','Russian ruble',1,'2019-03-28 09:07:47'),('RWF','Rwandan franc',1,'2019-03-28 09:07:47'),('SAR','Saudi riyal',1,'2019-03-28 09:07:47'),('SBD','Solomon Islands dollar',1,'2019-03-28 09:07:47'),('SCR','Seychelles rupee',1,'2019-03-28 09:07:47'),('SDG','Sudanese pound',1,'2019-03-28 09:07:47'),('SEK','Swedish krona',1,'2019-03-28 09:07:47'),('SGD','Singapore dollar',1,'2019-03-28 09:07:47'),('SHP','Saint Helena pound',1,'2019-03-28 09:07:47'),('SLL','Sierra Leone leone',1,'2019-03-28 09:07:47'),('SOS','Somali shilling',1,'2019-03-28 09:07:47'),('SPL','Seborgan luigino',1,'2019-03-28 09:07:47'),('SRD','Suriname dollar',1,'2019-03-28 09:07:47'),('STD','Sao Tome and Principe dobra',1,'2019-03-28 09:07:47'),('SVC','El Salvador colon',1,'2019-03-28 09:07:47'),('SYP','Syrian pound',1,'2019-03-28 09:07:47'),('SZL','Swaziland lilangeni',1,'2019-03-28 09:07:47'),('THB','Thai baht',1,'2019-03-28 09:07:47'),('TJS','Tajik somoni',1,'2019-03-28 09:07:47'),('TMT','Turkmen new manat',1,'2019-03-28 09:07:47'),('TND','Tunisian dinar',1,'2019-03-28 09:07:47'),('TOP','Tongan pa\'anga',1,'2019-03-28 09:07:47'),('TRY','Turkish lira',1,'2019-03-28 09:07:47'),('TTD','Trinidad and Tobago dollar',1,'2019-03-28 09:07:47'),('TVD','Tuvaluan dollar',1,'2019-03-28 09:07:47'),('TWD','Taiwan New dollar',1,'2019-03-28 09:07:47'),('TZS','Tanzanian shilling',1,'2019-03-28 09:07:47'),('UAH','Ukrainian hryvnia',1,'2019-03-28 09:07:47'),('UGX','Uganda new shilling',1,'2019-03-28 09:07:47'),('USD','US dollar',1,'2019-03-28 09:07:47'),('UYU','Uruguayan peso uruguayo',1,'2019-03-28 09:07:47'),('UZS','Uzbekistani sum',1,'2019-03-28 09:07:47'),('VEF','Venezuelan bolivar fuerte',1,'2019-03-28 09:07:47'),('VND','Vietnamese dong',1,'2019-03-28 09:07:47'),('VUV','Vanuatu vatu',1,'2019-03-28 09:07:47'),('WST','Samoan tala',1,'2019-03-28 09:07:47'),('XAF','CFA franc BEAC',1,'2019-03-28 09:07:47'),('XAG','Silver (ounce)',1,'2019-03-28 09:07:47'),('XAU','Gold (ounce)',1,'2019-03-28 09:07:47'),('XCD','East Caribbean dollar',1,'2019-03-28 09:07:47'),('XDR','IMF special drawing right',1,'2019-03-28 09:07:47'),('XFO','Gold franc',1,'2019-03-28 09:07:47'),('XFU','UIC franc',1,'2019-03-28 09:07:47'),('XOF','CFA franc BCEAO',1,'2019-03-28 09:07:47'),('XPD','Palladium (ounce)',1,'2019-03-28 09:07:47'),('XPF','CFP franc',1,'2019-03-28 09:07:47'),('XPT','Platinum (ounce)',1,'2019-03-28 09:07:47'),('YER','Yemeni rial',1,'2019-03-28 09:07:47'),('ZAR','South African rand',1,'2019-03-28 09:07:47'),('ZMK','Zambian kwacha (obsolete)',1,'2019-03-28 09:07:47'),('ZMW','Zambian kwacha',1,'2019-03-28 09:07:47'),('ZWD','Zimbabwe dollar (initial)',1,'2019-03-28 09:07:47'),('ZWL','Zimbabwe dollar (3rd denomination)',1,'2019-03-28 09:07:47'),('ZWN','Zimbabwe dollar (1st denomination)',1,'2019-03-28 09:07:47'),('ZWR','Zimbabwe dollar (2nd denomination)',1,'2019-03-28 09:07:47'); +/*!40000 ALTER TABLE `currency` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `endpointType` +-- + +DROP TABLE IF EXISTS `endpointType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `endpointType` ( + `endpointTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `type` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`endpointTypeId`), + UNIQUE KEY `endpointtype_type_unique` (`type`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `endpointType` +-- + +LOCK TABLES `endpointType` WRITE; +/*!40000 ALTER TABLE `endpointType` DISABLE KEYS */; +INSERT INTO `endpointType` VALUES (1,'URL','REST URLs',1,'2019-03-28 09:07:47'); +/*!40000 ALTER TABLE `endpointType` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `migration` +-- + +DROP TABLE IF EXISTS `migration`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `migration` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) DEFAULT NULL, + `batch` int(11) DEFAULT NULL, + `migration_time` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `migration` +-- + +LOCK TABLES `migration` WRITE; +/*!40000 ALTER TABLE `migration` DISABLE KEYS */; +INSERT INTO `migration` VALUES (1,'01_currency.js',1,'2019-03-28 11:07:46'),(2,'02_endpointType.js',1,'2019-03-28 11:07:46'),(3,'03_endpointType-indexes.js',1,'2019-03-28 11:07:46'),(4,'04_partyIdType.js',1,'2019-03-28 11:07:46'),(5,'05_partyIdType-indexes.js',1,'2019-03-28 11:07:46'),(6,'08_oracleEndpoint.js',1,'2019-03-28 11:07:47'),(7,'09_oracleEndpoint-indexes.js',1,'2019-03-28 11:07:47'); +/*!40000 ALTER TABLE `migration` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `migration_lock` +-- + +DROP TABLE IF EXISTS `migration_lock`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `migration_lock` ( + `index` int(10) unsigned NOT NULL AUTO_INCREMENT, + `is_locked` int(11) DEFAULT NULL, + PRIMARY KEY (`index`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `migration_lock` +-- + +LOCK TABLES `migration_lock` WRITE; +/*!40000 ALTER TABLE `migration_lock` DISABLE KEYS */; +INSERT INTO `migration_lock` VALUES (1,0); +/*!40000 ALTER TABLE `migration_lock` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `oracleEndpoint` +-- + +DROP TABLE IF EXISTS `oracleEndpoint`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `oracleEndpoint` ( + `oracleEndpointId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `partyIdTypeId` int(10) unsigned NOT NULL, + `endpointTypeId` int(10) unsigned NOT NULL, + `currencyId` varchar(255) DEFAULT NULL, + `value` varchar(512) NOT NULL, + `isDefault` tinyint(1) NOT NULL DEFAULT '0', + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `createdBy` varchar(128) NOT NULL, + PRIMARY KEY (`oracleEndpointId`), + KEY `oracleendpoint_currencyid_foreign` (`currencyId`), + KEY `oracleendpoint_partyidtypeid_index` (`partyIdTypeId`), + KEY `oracleendpoint_endpointtypeid_index` (`endpointTypeId`), + CONSTRAINT `oracleendpoint_currencyid_foreign` FOREIGN KEY (`currencyId`) REFERENCES `currency` (`currencyid`), + CONSTRAINT `oracleendpoint_endpointtypeid_foreign` FOREIGN KEY (`endpointTypeId`) REFERENCES `endpointType` (`endpointtypeid`), + CONSTRAINT `oracleendpoint_partyidtypeid_foreign` FOREIGN KEY (`partyIdTypeId`) REFERENCES `partyIdType` (`partyidtypeid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `oracleEndpoint` +-- + +LOCK TABLES `oracleEndpoint` WRITE; +/*!40000 ALTER TABLE `oracleEndpoint` DISABLE KEYS */; +/*!40000 ALTER TABLE `oracleEndpoint` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `partyIdType` +-- + +DROP TABLE IF EXISTS `partyIdType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `partyIdType` ( + `partyIdTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `description` varchar(512) NOT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`partyIdTypeId`), + UNIQUE KEY `partyidtype_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `partyIdType` +-- + +LOCK TABLES `partyIdType` WRITE; +/*!40000 ALTER TABLE `partyIdType` DISABLE KEYS */; +INSERT INTO `partyIdType` VALUES (1,'MSISDN','A MSISDN (Mobile Station International Subscriber Directory Number, that is, the phone number) is used as reference to a participant. The MSISDN identifier should be in international format according to the ITU-T E.164 standard. Optionally, the MSISDN may be prefixed by a single plus sign, indicating the international prefix.',1,'2019-03-28 09:07:47'),(2,'EMAIL','An email is used as reference to a participant. The format of the email should be according to the informational RFC 3696.',1,'2019-03-28 09:07:47'),(3,'PERSONAL_ID','A personal identifier is used as reference to a participant. Examples of personal identification are passport number, birth certificate number, and national registration number. The identifier number is added in the PartyIdentifier element. The personal identifier type is added in the PartySubIdOrType element.',1,'2019-03-28 09:07:47'),(4,'BUSINESS','A specific Business (for example, an organization or a company) is used as reference to a participant. The BUSINESS identifier can be in any format. To make a transaction connected to a specific username or bill number in a Business, the PartySubIdOrType element should be used.',1,'2019-03-28 09:07:47'),(5,'DEVICE','A specific device (for example, a POS or ATM) ID connected to a specific business or organization is used as reference to a Party. For referencing a specific device under a specific business or organization, use the PartySubIdOrType element.',1,'2019-03-28 09:07:47'),(6,'ACCOUNT_ID','A bank account number or FSP account ID should be used as reference to a participant. The ACCOUNT_ID identifier can be in any format, as formats can greatly differ depending on country and FSP.',1,'2019-03-28 09:07:47'),(7,'IBAN','A bank account number or FSP account ID is used as reference to a participant. The IBAN identifier can consist of up to 34 alphanumeric characters and should be entered without whitespace.',1,'2019-03-28 09:07:47'),(8,'ALIAS','An alias is used as reference to a participant. The alias should be created in the FSP as an alternative reference to an account owner. Another example of an alias is a username in the FSP system. The ALIAS identifier can be in any format. It is also possible to use the PartySubIdOrType element for identifying an account under an Alias defined by the PartyIdentifier.',1,'2019-03-28 09:07:47'); +/*!40000 ALTER TABLE `partyIdType` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2019-03-28 11:09:54 diff --git a/docs/fr/technical/technical/account-lookup-service/assets/entities/AccountLookupDB-schema-DBeaver.erd b/docs/fr/technical/technical/account-lookup-service/assets/entities/AccountLookupDB-schema-DBeaver.erd new file mode 100644 index 000000000..ea177ae89 --- /dev/null +++ b/docs/fr/technical/technical/account-lookup-service/assets/entities/AccountLookupDB-schema-DBeaver.erd @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/fr/technical/technical/account-lookup-service/assets/entities/AccountLookupService-schema.png b/docs/fr/technical/technical/account-lookup-service/assets/entities/AccountLookupService-schema.png new file mode 100644 index 000000000..bdca208cd Binary files /dev/null and b/docs/fr/technical/technical/account-lookup-service/assets/entities/AccountLookupService-schema.png differ diff --git a/docs/fr/technical/technical/assets/diagrams/architecture/Arch-Mojaloop-end-to-end-PI5.svg b/docs/fr/technical/technical/assets/diagrams/architecture/Arch-Mojaloop-end-to-end-PI5.svg new file mode 100644 index 000000000..d87484a3c --- /dev/null +++ b/docs/fr/technical/technical/assets/diagrams/architecture/Arch-Mojaloop-end-to-end-PI5.svg @@ -0,0 +1,3 @@ + + +
    Mojaloop Adapter
    Mojaloop Adapter
    Central-Ledger
    Central-Ledger
    Mojaloop
    Adapter
    [Not supported by viewer]
    C 1. Transfer
    C 1. Transfer
    request_to_prepare
    request_to_prepare
    C 1.2
    [Not supported by viewer]
    C 1.3
    [Not supported by viewer]
    prepared.notification
    prepared.notification
    C 1.4
    C 1.4
    fulfiled.notification
    fulfiled.notification
    request_to_fulfil
    request_to_fulfil
    Fulfil Transfer
    Fulfil Transfer
    C 1.8
    C 1.8
    C 1.9
    [Not supported by viewer]
    C 1.10
    [Not supported by viewer]
    C 1.11
    C 1.11
    C 1.12 Fulfil Notify
    C 1.12 Fulfil Notify
    C 1.1
    C 1.1
    C 1.5
    C 1.5
    DB
    DB
    Mojaloop
    Open Source Services
    [Not supported by viewer]
    positions
    positions
    Account Lookup Service
    (Parties / Participant)
    [Not supported by viewer]
    FSP
    Backend

    (Does not natively speak Mojaloop API)



    [Not supported by viewer]
    Scheme-Adapter

    (Converts from Mojaloop API to backend FSP API)
    [Not supported by viewer]
    A 2. MSISDN
    based lookup
    A 2. MSISDN <br>based lookup
    DB
    DB
     Database
     Database
    FSP
    Backend
      

    (Natively speaks Mojaloop API)



    [Not supported by viewer]
    A
    A
    A 1. User Lookup
    A 1. User Lookup
    A 3. Receiver Details
    A 3. Receiver Details
    B
    B
    Merchant 
    Registry
    [Not supported by viewer]
    A 2. mID based
    lookup
    A 2. mID based <br>lookup
    B 1. Quote
    B 1. Quote
    Mojaloop Hub
    <font>Mojaloop Hub<br></font>
    Payer FSP
    [Not supported by viewer]
    Payee FSP
    [Not supported by viewer]
    Ledger
    Ledger<br>
    Ledger
    Ledger<br>
    C
    C
    kafka
    kafka
    kafka
    kafka
    kafka
    kafka
    kafka
    kafka
    kafka
    kafka
    C 1.6
    Prepare
    Transfer
    [Not supported by viewer]
    C 1.7
    C 1.7
    C 1.11
    C 1.11
    C 1.12
    C 1.12
    Fulfil Notify
    Fulfil Notify
    C 1.13
    Fulfil Notify
    [Not supported by viewer]
    B 2. Fee /
    Commission
    [Not supported by viewer]
    A 4. Get 
    receiver 
    details
    [Not supported by viewer]
    B 1. Quote
    B 1. Quote
    D 6.
    D 6.
    Central-Settlement
    Central-Settlement
    D 5. Update Positions
    [Not supported by viewer]
    settlement.notifications
    settlement.notifications
    kafka
    kafka
    Scheme Settlement Processor
    <span>Scheme Settlement Processor</span><br>
    Hub Operator
    Hub Operator
    D 1. Create
    Settlement
    [Not supported by viewer]
    D
    D
    D 2. Query
    Settlement
    Report
    (Pull)
    [Not supported by viewer]
    D 4. Send
    Acks
    (Push)
    [Not supported by viewer]
    Settlement
    Bank
    Settlement<br>Bank<br>
    D 3. Process Settlements
    [Not supported by viewer]
    Bank
    [Not supported by viewer]
    D 7. Position Notifications Change result
    D 7. Position Notifications Change result
    D 7. Settlement Notification
    D 7. Settlement Notification
    kafka
    kafka
    GSMA
    [Not supported by viewer]
    (Schema customised by Hub Operator)
    [Not supported by viewer]
    Pathfinder
    [Not supported by viewer]
    ALS Oracle MSISDN Adapter
    [Not supported by viewer]
    ALS Oracle Merchant Service
    [Not supported by viewer]
    API
    Internal Use-Only
    API <br>Internal Use-Only
    Mojaloop API
    Specification v1.0
    Mojaloop API<br>Specification v1.0<br>
    Key
    [Not supported by viewer]
    \ No newline at end of file diff --git a/docs/fr/technical/technical/assets/diagrams/architecture/Arch-Mojaloop-end-to-end-PI6.svg b/docs/fr/technical/technical/assets/diagrams/architecture/Arch-Mojaloop-end-to-end-PI6.svg new file mode 100644 index 000000000..f75130984 --- /dev/null +++ b/docs/fr/technical/technical/assets/diagrams/architecture/Arch-Mojaloop-end-to-end-PI6.svg @@ -0,0 +1,3 @@ + + +
    Mojaloop Adapter
    Mojaloop Adapter
    Central-Services
    (Ledger - API, Handlers)
    Central-Services<br>(Ledger - API, Handlers)<br>
    Mojaloop
    Adapter
    [Not supported by viewer]
    C 1. Transfer
    C 1. Transfer
    request_to_prepare
    request_to_prepare
    C 1.2
    [Not supported by viewer]
    C 1.3
    [Not supported by viewer]
    prepared.notification
    prepared.notification
    C 1.4
    C 1.4
    fulfiled.notification
    fulfiled.notification
    request_to_fulfil
    request_to_fulfil
    Fulfil Transfer
    Fulfil Transfer
    C 1.8
    C 1.8
    C 1.9
    [Not supported by viewer]
    C 1.10
    [Not supported by viewer]
    C 1.11
    C 1.11
    C 1.12 Fulfil Notify
    C 1.12 Fulfil Notify
    C 1.1
    C 1.1
    C 1.5
    C 1.5
    DB
    DB
    Mojaloop
    Open Source Services
    [Not supported by viewer]
    positions
    positions
    Account Lookup Service
    (Parties / Participant)
    [Not supported by viewer]
    FSP
    Backend

    (Does not natively speak Mojaloop API)



    [Not supported by viewer]
    Scheme-Adapter

    (Converts from Mojaloop API to backend FSP API)
    [Not supported by viewer]
    A 2. MSISDN
    based lookup
    A 2. MSISDN <br>based lookup
    DB
    DB
     Database
     Database
    FSP
    Backend
      

    (Natively speaks Mojaloop API)



    [Not supported by viewer]
    A
    A
    A 1. User Lookup
    A 1. User Lookup
    A 3. Receiver Details
    A 3. Receiver Details
    B
    B
    Merchant 
    Registry
    [Not supported by viewer]
    A 2. mID based
    lookup
    A 2. mID based <br>lookup
    B 1. Quote
    B 1. Quote
    Mojaloop Hub
    <font>Mojaloop Hub<br></font>
    Payer FSP
    [Not supported by viewer]
    Payee FSP
    [Not supported by viewer]
    Ledger
    Ledger<br>
    Ledger
    Ledger<br>
    C
    C
    kafka
    kafka
    kafka
    kafka
    kafka
    kafka
    kafka
    kafka
    kafka
    kafka
    C 1.6
    Prepare
    Transfer
    [Not supported by viewer]
    C 1.7
    C 1.7
    C 1.11
    C 1.11
    C 1.12
    C 1.12
    Fulfil Notify
    Fulfil Notify
    C 1.13
    Fulfil Notify
    [Not supported by viewer]
    B 2. Fee /
    Commission
    [Not supported by viewer]
    A 4. Get 
    receiver 
    details
    [Not supported by viewer]
    B 1. Quote
    B 1. Quote
    D 6.
    D 6.
    Central-Settlement
    Central-Settlement
    D 5. Update Positions
    [Not supported by viewer]
    settlement.notifications
    settlement.notifications
    kafka
    kafka
    Scheme Settlement Processor
    <span>Scheme Settlement Processor</span><br>
    Hub Operator
    Hub Operator
    D 1. Create
    Settlement
    [Not supported by viewer]
    D
    D
    D 2. Query
    Settlement
    Report
    (Pull)
    [Not supported by viewer]
    D 4. Send
    Acks
    (Push)
    [Not supported by viewer]
    Settlement
    Bank
    Settlement<br>Bank<br>
    D 3. Process Settlements
    [Not supported by viewer]
    Bank
    [Not supported by viewer]
    D 7. Position Notifications Change result
    D 7. Position Notifications Change result
    D 7. Settlement Notification
    D 7. Settlement Notification
    kafka
    kafka
    GSMA
    [Not supported by viewer]
    (Schema customised by Hub Operator)
    [Not supported by viewer]
    Pathfinder
    [Not supported by viewer]
    ALS Oracle MSISDN Adapter
    [Not supported by viewer]
    ALS Oracle Merchant Service
    [Not supported by viewer]
    API
    Internal Use-Only
    API <br>Internal Use-Only
    Mojaloop API
    Specification v1.0
    Mojaloop API<br>Specification v1.0<br>
    Key
    [Not supported by viewer]
    Quoting-Service
    Quoting-Service
    ALS Oracle Simulator
    [Not supported by viewer]
    A 2. *ID based
    lookup
    A 2. *ID based <br>lookup
    \ No newline at end of file diff --git a/docs/fr/technical/technical/assets/diagrams/architecture/Arch-Mojaloop-end-to-end-simple.svg b/docs/fr/technical/technical/assets/diagrams/architecture/Arch-Mojaloop-end-to-end-simple.svg new file mode 100644 index 000000000..a2fbbe512 --- /dev/null +++ b/docs/fr/technical/technical/assets/diagrams/architecture/Arch-Mojaloop-end-to-end-simple.svg @@ -0,0 +1,3 @@ + + +
    C 4. Transfer
    Fulfil Notify
    [Not supported by viewer]
    Account Lookup Services
    [Not supported by viewer]
    Pathfinder
    Pathfinder
    FSP
    Backend


    (Does not natively speak Mojaloop API)








    [Not supported by viewer]
    S
    c
    h
    e
    m
    e

    A
    d
    a
    p
    t
    e
    r

    [Not supported by viewer]
    A 2. MSISDN based lookup
    A 2. MSISDN based lookup
    FSP
    Backend
      

    (Natively speaks Mojaloop API)









    [Not supported by viewer]
    A
    A
    A 1. User
    Lookup
    A 1. User <br>Lookup
    B
    B
    Merchant 
    Registry
    [Not supported by viewer]
    A 2. mID based lookup
    A 2. mID based lookup
    Mojaloop Hub
    [Not supported by viewer]
    Payer FSP
    [Not supported by viewer]
    Payee FSP
    [Not supported by viewer]
    Ledger
    Ledger<br>
    Ledger
    Ledger<br>
    C
    C
    C 1. Transfer
        Prepare
    [Not supported by viewer]
    A 3. Receiver
    Details
    A 3. Receiver<br>Details<br>
     Fee /
    Comm
    [Not supported by viewer]
    Get Receiver
    Details
    [Not supported by viewer]
     C 2. Transfer
    Prepare
    [Not supported by viewer]
    C 5. Transfer
    Fulfil Notify
    [Not supported by viewer]
    Transfer
    Prepare
    [Not supported by viewer]
    C 3. Transfer
    Fulfil
    C 3. Transfer<br>Fulfil<br>
    Transfer
    Fulfil
    [Not supported by viewer]
    B 1. Quote
    B 1. Quote
    Central Services
    [Not supported by viewer]
    B 1. Quote
    B 1. Quote<br>
    Settlement Provider
    Settlement Provider
    Hub Operator
    Hub Operator
    D 1. Create Settlement
    D 1. Create Settlement
    D
    D
    D 2. Query Settlement Report
    (Pull)
    D 2. Query Settlement Report<br>(Pull)<br>
    D 3. Send Acknowledgements
    (Push)
    D 3. Send Acknowledgements<br>(Push)<br>
    Quoting Service
    <font style="font-size: 18px">Quoting Service</font>
    Central Services
    • Transfers
    • Settlements
    • Auditing
    • Notifications
    [Not supported by viewer]
    \ No newline at end of file diff --git a/docs/fr/technical/technical/assets/diagrams/architecture/central_ledger_block_diagram.png b/docs/fr/technical/technical/assets/diagrams/architecture/central_ledger_block_diagram.png new file mode 100644 index 000000000..48199cf3e Binary files /dev/null and b/docs/fr/technical/technical/assets/diagrams/architecture/central_ledger_block_diagram.png differ diff --git a/docs/fr/technical/technical/central-bulk-transfers/README.md b/docs/fr/technical/technical/central-bulk-transfers/README.md new file mode 100644 index 000000000..5d724540a --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/README.md @@ -0,0 +1,298 @@ +# Conception des transferts groupés (*Bulk Transfers*) + +Le scénario des transferts groupés est décrit dans le document de définition d’API pour la ressource `/bulkTransfers`. Pour le détail, *(voir la section `6.10`)* selon la [spécification Mojaloop](https://github.com/mojaloop/mojaloop-specification/blob/master/API%20Definition%20v1.0.pdf). + +1. [Introduction](introduction) +2. [Considérations de conception](design-considerations) +3. [Étapes de l’architecture de haut niveau](steps-involved-in-the-high-level-architecture) +4. [Notes](notes) + 1. [Points de discussion](discussion-items) + 2. [Nouvelles tables proposées](proposed-new-tables) + 3. [États des transferts groupés](bulk-transfers-states) + 4. [Notes complémentaires](additional-notes) +5. [Sujets de feuille de route](roadmap-topics) + +## 1. Introduction + +Le processus de transferts groupés est traité à la section 6.10 du document *API Definition* 1.0, illustré par la figure 60 dont un extrait figure ci-dessous. +![Figure 60](./assets/diagrams/architecture/Figure60-Example-Bulk-Transfer-Process-Spec1.0.png) + +Les éléments clés implicites dans la spécification en version 1.0 sont les suivants : + +- La réserve de fonds est effectuée pour chaque transfert individuel du FSP payeur vers le FSP bénéficiaire +- Si un seul transfert individuel échoue pendant la phase *prepare*, l’ensemble du lot doit être rejeté. + +## 2. Considérations de conception + +D’après la figure 60 de la spécification, voici quelques implications importantes. + +1. Le DFSP payeur effectue les recherches d’utilisateur pour chaque partie du paiement groupé séparément +2. Le DFSP payeur effectue une cotation groupée par DFSP bénéficiaire +3. Il incombe au DFSP payeur de préparer les transferts groupés selon les FSP bénéficiaires et d’envoyer une demande de transfert groupé à un seul FSP bénéficiaire +4. Il s’agit d’un processus « tout ou rien » : si un transfert individuel ne peut pas être réservé, tout le lot est rejeté, car on ne peut l’envoyer tel quel au bénéficiaire s’il contient un transfert sans réserve de fonds +5. Dans cette logique, la proposition actuelle est de donner au *Switch* le pouvoir (la spécification devra être mise à jour) d’envoyer la requête `POST /bulkTransfers` avec la liste des transferts individuels pour lesquels les fonds ont pu être réservés sur le *Switch* +6. Le *Switch* agrège alors les engagements et les échec côté FSP bénéficiaire et envoie un seul appel `PUT /bulkTransfers/{ID}` au FSP payeur avec la liste complète, y compris les transferts ayant échoué sur le *Switch* ou chez le FSP bénéficiaire +7. Exemple : 1000 transferts dans un lot ; le *Switch* réserve les fonds pour 900 d’entre eux — la requête *prepare* vers le DFSP bénéficiaire ne contient que ces 900. Si le FSP bénéficiaire renvoie un *Bulk Fulfil* avec 800 engagements et 100 abandons, le *Switch* traite chaque transfert et envoie le *callback* `PUT /bulkTransfers/{ID}` au FSP payeur pour les 1000 transferts : 800 *committed*, 200 *aborted* +8. Des impacts sur la signature, le chiffrement, la PKI et d’autres aspects de sécurité devront être traités +9. L’ordonnancement des transferts individuels relève aussi du schéma. Dans les marchés émergents, l’objectif peut être de maximiser le volume : un schéma peut réordonner par montants croissants avant traitement — décision de schéma +10. Une règle de schéma recommandée : les FSP bénéficiaires ne devraient pas pouvoir réordonner les transferts d’un lot pour éviter un biais en faveur des parties bénéficiaires +11. Les règlements impliquant des paiements publics de très gros montants via transferts groupés doivent être examinés pour permettre le traitement sans règles de liquidité trop strictes + +## 3. Étapes de l’architecture de haut niveau + +Étapes principales pour les transferts groupés. + +![Diagramme d’architecture](./assets/diagrams/architecture/bulk-transfer-arch-flows.svg) + +1. [1.0, 1.1, 1.2] Une entrée `POST /bulkTransfers` sur le *bulk-api-adapter* est stockée dans un objet ; une notification avec référence au message est publiée sur le topic Kafka `bulk-prepare` ; une réponse **202** est renvoyée au FSP payeur +2. [1.3] Le *Bulk Prepare handler* consomme la requête et enregistre l’état RECEIVED + + a. Il valide le lot et passe à PENDING si la validation réussit + + b. Règle supplémentaire proposée : rejeter un lot si des identifiants de transfert dupliqués apparaissent dans le lot + + c. [1.4] Si la validation échoue, passage de `bulkTransferState` à PENDING_INVALID (état interne) et message vers le topic de traitement groupé + i. Le *Bulk processing Handler* met `bulkTransferState` à REJECTED et notifie le payeur + +3. [1.4] [suite de 2.a] Le *Bulk Prepare handler* décompose le lot en transferts individuels et les envoie sur le topic *prepare* + + a. Chaque transfert reçoit notamment la même date d’expiration que le transfert groupé (et les autres champs nécessaires) + +4. [1.5, 1.6, 1.7] Les *Prepare handler* et *Position handler* sont adaptés pour traiter les transferts d’un lot (indicateurs `type`, `action`, `status`, etc.) + + a. La réserve de fonds est gérée par les gestionnaires concernés ; le lot est agrégé dans le *Bulk Processing Handler* + +5. [1.8] Le *Position Handler* publie des messages vers le topic de traitement groupé pour chaque transfert du lot +6. [1.9] Pour chaque message consommé, le *Bulk processing Handler* vérifie s’il s’agit du dernier transfert de la phase en cours +7. [1.10, 1.11, 1.12] S’il s’agit du dernier transfert, agréger l’état de tous les transferts individuels et + + a. S’ils sont tous en état réservé → envoyer `POST /bulkTransfers` au bénéficiaire (message vers le topic *notifications*, consommé par le *notification handler*) + + b. Une fois la requête *prepare* envoyée au bénéficiaire, passer le statut à ACCEPTED + +8. En cas de *Prepare* réussi — à réception du `PUT` *bulkFulfil* du FSP bénéficiaire, publication sur le topic *bulk fulfil* avec référence au message *Fulfil* stocké dans le *object store* +9. Consommation par le *bulkFulfilHandler*, passage à PROCESSING +10. Le *bulk-fulfil-handler* décompose le lot et envoie chaque transfert aux *Fulfil* et *Position Handlers* refactorisés pour valider ou abandonner selon le `PUT /bulkTransfers/{ID}` du bénéficiaire et pour engager ou libérer les fonds sur le *Switch* +11. Le *bulk-processing-handler* agrège les résultats et fixe l’état `bulkTransfer` à COMPLETED ou REJECTED + + a. Si le bénéficiaire envoie COMMITTED pour au moins un transfert individuel, proposition : état de lot COMPLETED + + b. En revanche, pour l’étape 8 ou si le bénéficiaire envoie REJECTED comme `bulkTransferState`, l’état final sur le *Switch* doit être REJECTED + +12. Notifications au payeur et au bénéficiaire (proche des transferts unitaires, avec écart par rapport à la spec 1.0). Le FSP payeur reçoit la liste exhaustive des transferts individuels (identique à celle de la requête *prepare*). Le FSP bénéficiaire ne reçoit que le sous-ensemble qui lui a été adressé dans la requête *Bulk prepare* (transferts réservés sur le *Switch*). + +## 4. Détails d’implémentation + +### 4.1 États des transferts groupés + +États d’un transfert groupé selon la spécification d’API Mojaloop : + +1. RECEIVED +2. PENDING +3. ACCEPTED +4. PROCESSING +5. COMPLETED +6. REJECTED +7. État interne — PENDING_PREPARE (mappé sur PENDING) +8. État interne — PENDING_INVALID (mappé sur PENDING) +9. État interne — PENDING_FULFIL (mappé sur PROCESSING) +10. État interne — EXPIRING (mappé sur PROCESSING) +11. État interne — EXPIRED (mappé sur COMPLETED) +12. État interne — INVALID (mappé sur REJECTED) +13. Des micro-états supplémentaires peuvent être ajoutés pour usage interne sur le *Switch* + +### 4.2 Nouvelles tables proposées + +Tables proposées pour la conception des transferts groupés : + +- bulkTransfer +- bulkTransferStateChange +- bulkTransferError +- bulkTransferDuplicateCheck +- bulkTransferFulfilment +- bulkTransferFulfilmentDuplicateCheck +- bulkTransferAssociation +- bulkTransferExtension +- bulkTransferState +- bulkProcessingState + +### 4.3 Combinaisons internes type — action — statut + +#### 1. Transfert groupé validé au schéma [ml-api-adapter → bulk-prepare-handler] + + 1. type: bulk-prepare + 2. action: bulk-prepare + 3. Status: success + 4. Résultat : bulkTransferState=RECEIVED, bulkProcessingState=RECEIVED + +#### 2. Doublon [bulk-prepare-handler → notification handler] + + 1. type: notification + 2. action: bulk-prepare-duplicate + 3. Status: success + 4. Résultat : bulkTransferState=N/A, bulkProcessingState=N/A + +#### 3. Échec de validation *Bulk Prepare* [bulk-prepare-handler → notification-handler] + + 1. type: notification + 2. action: bulk-abort + 3. Status: error + +#### 4. *Bulk Prepare* valide (décomposé en transferts individuels) [bulk-prepare-handler → prepare-handler] + + 1. type: prepare + 2. action: bulk-prepare + 3. Status: success + +#### 5. Doublon d’un transfert individuel du lot [prepare-handler → bulk-processing-handler] + + 1. type: bulk-processing + 2. action: prepare-duplicate + 3. Status: success + 4. Action attendue : ajouter un message d’erreur indiquant un doublon + 5. Résultat : bulkTransferState=PENDING_PREPARE/ACCEPTED (selon qu’il s’agisse du dernier ou non), bulkProcessingState=RECEIVED_DUPLICATE + +#### 6. Transfert *Prepare* individuel, doublon valide dans le *prepare handler* [prepare-handler → bulk-processing-handler] + + 1. type: bulk-processing + 2. action: prepare-duplicate + 3. Status: error + 4. Résultat : bulkTransferState=PENDING_PREPARE/ACCEPTED (selon qu’il s’agisse du dernier ou non), bulkProcessingState=RECEIVED_DUPLICATE + +#### 7. *Prepare* individuel valide, membre d’un lot [prepare-handler → position-handler] + + 1. type: position + 2. action: bulk-prepare + 3. Status: success + +#### 8. *Prepare* individuel du lot, validation échouée dans le *prepare handler* [prepare-handler → bulk-processing-handler] + + 1. type: bulk-processing + 2. action: bulk-prepare + 3. Status: error + 4. Résultat : bulkTransferState=PENDING_PREPARE/ACCEPTED (selon qu’il s’agisse du dernier ou non), bulkProcessingState=RECEIVED_INVALID + +#### 9. *Prepare* individuel valide, membre d’un lot [position-handler → bulk-processing-handler] + + 1. type: bulk-processing + 2. action: bulk-prepare + 3. Status: success + 4. Résultat : bulkTransferState=PENDING_PREPARE/ACCEPTED (selon qu’il s’agisse du dernier ou non), bulkProcessingState=ACCEPTED + +#### 10. *Prepare* individuel du lot, validation échouée dans le *position handler* [position-handler → bulk-processing-handler] + + 1. type: bulk-processing + 2. action: bulk-prepare + 3. Status: error + 4. Résultat : bulkTransferState=PENDING_PREPARE/ACCEPTED (selon qu’il s’agisse du dernier ou non), bulkProcessingState=RECEIVED_INVALID + +#### 11. *Fulfil* individuel valide (engagement), membre d’un lot [position-handler → bulk-processing-handler] + + 1. type: bulk-processing + 2. action: bulk-commit + 3. Status: success + 4. Résultat : bulkTransferState=PENDING_FULFIL/COMPLETED (selon qu’il s’agisse du dernier ou non), bulkProcessingState=COMPLETED + +#### 12. Message *Fulfil* de lot validé [ml-api-adapter → bulk-fulfil-handler] + + 1. type: bulk-fulfil + 2. action: bulk-commit + 3. Status: success + +#### 13. Transfert individuel valide du lot, *timeout* dans le *position handler* [position-handler → bulk-processing-handler] + + 1. type: bulk-processing + 2. action: bulk-timeout-reserved + 3. Status: error + 4. Résultat : bulkTransferState=PENDING_FULFIL/COMPLETED (selon qu’il s’agisse du dernier ou non), bulkProcessingState=FULFIL_INVALID + +#### 14. *Fulfil* individuel valide (rejet), membre d’un lot [position-handler → bulk-processing-handler] + + 1. type: bulk-processing + 2. action: reject + 3. Status: success + 4. Résultat : bulkTransferState=PENDING_FULFIL/COMPLETED (selon qu’il s’agisse du dernier ou non), bulkProcessingState=REJECTED + +#### 15. Doublon *Fulfil* invalide pour un transfert du lot [fulfil-handler → bulk-processing-handler] + + 1. type: bulk-processing + 2. action: fulfil-duplicate + 3. Status: error + 4. Résultat : bulkTransferState=PENDING_FULFIL/COMPLETED (selon qu’il s’agisse du dernier ou non), bulkProcessingState=FULFIL_DUPLICATE + +#### 16. Doublon *Fulfil* valide pour un transfert du lot [fulfil-handler → bulk-processing-handler] + + 1. type: bulk-processing + 2. action: fulfil-duplicate + 3. Status: success + 4. Résultat : bulkTransferState=PENDING_FULFIL/COMPLETED (selon qu’il s’agisse du dernier ou non), bulkProcessingState=FULFIL_DUPLICATE + +#### 17. Message *Fulfil* valide pour un transfert du lot [fulfil-handler → position-handler] + + 1. type: position + 2. action: bulk-commit + 3. Status: success + +#### 18. *Fulfil* individuel du lot, validation échouée dans le *fulfil handler* [fulfil-handler → bulk-processing-handler] + + 1. type: bulk-processing + 2. action: bulk-commit + 3. Status: error + 4. Résultat : bulkTransferState=PENDING_FULFIL/COMPLETED (selon qu’il s’agisse du dernier ou non), bulkProcessingState=FULFIL_INVALID + +#### 19. Demande *Fulfil* valide pour un transfert du lot [bulk-fulfil-handler → fulfil-handler] + + 1. type: bulk-fulfil + 2. action: bulk-commit + 3. Status: success + +#### 20. Transferts groupés : validation échouée au niveau *bulk-fulfil-handler* [bulk-fulfil-handler → notification-handler] + + 1. type: notification + 2. action: bulk-abort + 3. Status: error + +#### 21. Notifications de transfert groupé vers les FSP [bulk-processing-handler → notification-handler] + + 1. type: notification + 2. action: bulk-prepare / bulk-commit + 3. Status: success + +#### 22. Notification de *timeout* [timeout-handler → bulk-processing-handler] + + 1. type: bulk-processing + 2. action: bulk-timeout-received + 3. Status: error + 4. Résultat : bulkTransferState=COMPLETED (pour le dernier), bulkProcessingState=EXPIRED + +#### 23. Notification de *timeout* [timeout-handler → position-handler] + + 1. type: position + 2. action: bulk-timeout-reserved + 3. Status: error + +#### 24. Notification de *timeout* après ajustement de position [position-handler → bulk-processing-handler] + + 1. type: bulk-processing + 2. action: bulk-timeout-reserved + 3. Status: error + 4. Résultat : bulkTransferState=COMPLETED (pour le dernier), bulkProcessingState=EXPIRED + +### 4.4 Notes complémentaires + +1. Documenter `GET /bulkTransfers` pour préciser les différences de réponses entre FSP payeur et FSP bénéficiaire +2. Utiliser un service dédié : *bulk-api-adapter* pour les points de terminaison des transferts groupés (y compris la persistance évoquée ci-dessus) + +## 5. Sujets de feuille de route + +1. Réévaluer le besoin de prendre en charge plusieurs FSP bénéficiaires dans un lot et les évolutions de spécification +2. Traiter par priorité les points et enseignements du PoC documentés +3. Étudier une ressource type *Bulk make* (`/bulkMake` ?) où le *Switch* accepte un lot complet et enchaîne les trois phases — recherche, cotation et transferts +4. *Throttling* des transferts individuels dans un lot ? +5. Ordre de traitement dans un lot — sur le *Switch* et chez les FSP. Recommandation : règle imposant aux FSP de respecter l’ordre du lot sans traitement préférentiel ; sur le *Switch*, rester neutre sur l’ordre, bonne pratique : tri par montants croissants +6. Règlements avec transferts groupés et paiements publics de très montants : assouplir les règles de liquidité si nécessaire +7. Implémenter `GET /bulkTransfers` +8. Notifications / journaux pour tous les cas négatifs de lot +9. Couverture complète par tests unitaires +10. Tests d’intégration du *golden path* de transfert groupé réussi +11. Tests de régression, scénarios négatifs inclus diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/database/central-ledger-ddl-MySQLWorkbench.sql b/docs/fr/technical/technical/central-bulk-transfers/assets/database/central-ledger-ddl-MySQLWorkbench.sql new file mode 100644 index 000000000..f6995bc85 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/database/central-ledger-ddl-MySQLWorkbench.sql @@ -0,0 +1,1600 @@ +-- MySQL dump 10.13 Distrib 8.0.16, for macos10.14 (x86_64) +-- +-- Host: 127.0.0.1 Database: central_ledger +-- ------------------------------------------------------ +-- Server version 8.0.13 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; + SET NAMES utf8 ; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `amountType` +-- + +DROP TABLE IF EXISTS `amountType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `amountType` ( + `amountTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(256) NOT NULL, + `description` varchar(1024) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`amountTypeId`), + UNIQUE KEY `amounttype_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `balanceOfPayments` +-- + +DROP TABLE IF EXISTS `balanceOfPayments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `balanceOfPayments` ( + `balanceOfPaymentsId` int(10) unsigned NOT NULL, + `name` varchar(256) NOT NULL, + `description` varchar(1024) DEFAULT NULL COMMENT 'Possible values and meaning are defined in https://www.imf.org/external/np/sta/bopcode/', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`balanceOfPaymentsId`), + UNIQUE KEY `balanceofpayments_name_unique` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='See https://www.imf.org/external/np/sta/bopcode/guide.htm'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bulkProcessingState` +-- + +DROP TABLE IF EXISTS `bulkProcessingState`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `bulkProcessingState` ( + `bulkProcessingStateId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`bulkProcessingStateId`), + UNIQUE KEY `bulkprocessingstate_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bulkTransfer` +-- + +DROP TABLE IF EXISTS `bulkTransfer`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `bulkTransfer` ( + `bulkTransferId` varchar(36) NOT NULL, + `bulkQuoteId` varchar(36) DEFAULT NULL, + `payerParticipantId` int(10) unsigned DEFAULT NULL, + `payeeParticipantId` int(10) unsigned DEFAULT NULL, + `expirationDate` datetime NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`bulkTransferId`), + KEY `bulktransfer_payerparticipantid_index` (`payerParticipantId`), + KEY `bulktransfer_payeeparticipantid_index` (`payeeParticipantId`), + CONSTRAINT `bulktransfer_bulktransferid_foreign` FOREIGN KEY (`bulkTransferId`) REFERENCES `bulkTransferDuplicateCheck` (`bulktransferid`), + CONSTRAINT `bulktransfer_payeeparticipantid_foreign` FOREIGN KEY (`payeeParticipantId`) REFERENCES `participant` (`participantid`), + CONSTRAINT `bulktransfer_payerparticipantid_foreign` FOREIGN KEY (`payerParticipantId`) REFERENCES `participant` (`participantid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bulkTransferAssociation` +-- + +DROP TABLE IF EXISTS `bulkTransferAssociation`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `bulkTransferAssociation` ( + `bulkTransferAssociationId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `transferId` varchar(36) NOT NULL, + `bulkTransferId` varchar(36) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `bulkProcessingStateId` int(10) unsigned NOT NULL, + `lastProcessedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `errorCode` int(10) unsigned DEFAULT NULL, + `errorDescription` varchar(128) DEFAULT NULL, + PRIMARY KEY (`bulkTransferAssociationId`), + UNIQUE KEY `bulktransferassociation_transferid_bulktransferid_unique` (`transferId`,`bulkTransferId`), + KEY `bulktransferassociation_bulktransferid_foreign` (`bulkTransferId`), + KEY `bulktransferassociation_bulkprocessingstateid_foreign` (`bulkProcessingStateId`), + CONSTRAINT `bulktransferassociation_bulkprocessingstateid_foreign` FOREIGN KEY (`bulkProcessingStateId`) REFERENCES `bulkProcessingState` (`bulkprocessingstateid`), + CONSTRAINT `bulktransferassociation_bulktransferid_foreign` FOREIGN KEY (`bulkTransferId`) REFERENCES `bulkTransfer` (`bulktransferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bulkTransferDuplicateCheck` +-- + +DROP TABLE IF EXISTS `bulkTransferDuplicateCheck`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `bulkTransferDuplicateCheck` ( + `bulkTransferId` varchar(36) NOT NULL, + `hash` varchar(256) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`bulkTransferId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bulkTransferError` +-- + +DROP TABLE IF EXISTS `bulkTransferError`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `bulkTransferError` ( + `bulkTransferErrorId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `bulkTransferStateChangeId` bigint(20) unsigned NOT NULL, + `errorCode` int(10) unsigned NOT NULL, + `errorDescription` varchar(128) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`bulkTransferErrorId`), + KEY `bulktransfererror_bulktransferstatechangeid_index` (`bulkTransferStateChangeId`), + CONSTRAINT `bulktransfererror_bulktransferstatechangeid_foreign` FOREIGN KEY (`bulkTransferStateChangeId`) REFERENCES `bulkTransferStateChange` (`bulktransferstatechangeid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bulkTransferExtension` +-- + +DROP TABLE IF EXISTS `bulkTransferExtension`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `bulkTransferExtension` ( + `bulkTransferExtensionId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `bulkTransferId` varchar(36) NOT NULL, + `isFulfilment` tinyint(1) NOT NULL DEFAULT '0', + `key` varchar(128) NOT NULL, + `value` text NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`bulkTransferExtensionId`), + KEY `bulktransferextension_bulktransferid_index` (`bulkTransferId`), + CONSTRAINT `bulktransferextension_bulktransferid_foreign` FOREIGN KEY (`bulkTransferId`) REFERENCES `bulkTransfer` (`bulktransferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bulkTransferFulfilment` +-- + +DROP TABLE IF EXISTS `bulkTransferFulfilment`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `bulkTransferFulfilment` ( + `bulkTransferId` varchar(36) NOT NULL, + `completedDate` datetime NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`bulkTransferId`), + CONSTRAINT `bulktransferfulfilment_bulktransferid_foreign` FOREIGN KEY (`bulkTransferId`) REFERENCES `bulkTransferFulfilmentDuplicateCheck` (`bulktransferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bulkTransferFulfilmentDuplicateCheck` +-- + +DROP TABLE IF EXISTS `bulkTransferFulfilmentDuplicateCheck`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `bulkTransferFulfilmentDuplicateCheck` ( + `bulkTransferId` varchar(36) NOT NULL, + `hash` varchar(256) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`bulkTransferId`), + CONSTRAINT `bulktransferfulfilmentduplicatecheck_bulktransferid_foreign` FOREIGN KEY (`bulkTransferId`) REFERENCES `bulkTransfer` (`bulktransferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bulkTransferState` +-- + +DROP TABLE IF EXISTS `bulkTransferState`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `bulkTransferState` ( + `bulkTransferStateId` varchar(50) NOT NULL, + `enumeration` varchar(50) NOT NULL COMMENT 'bulkTransferState associated to the Mojaloop API', + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`bulkTransferStateId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bulkTransferStateChange` +-- + +DROP TABLE IF EXISTS `bulkTransferStateChange`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `bulkTransferStateChange` ( + `bulkTransferStateChangeId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `bulkTransferId` varchar(36) NOT NULL, + `bulkTransferStateId` varchar(50) NOT NULL, + `reason` varchar(512) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`bulkTransferStateChangeId`), + KEY `bulktransferstatechange_bulktransferid_index` (`bulkTransferId`), + KEY `bulktransferstatechange_bulktransferstateid_index` (`bulkTransferStateId`), + CONSTRAINT `bulktransferstatechange_bulktransferid_foreign` FOREIGN KEY (`bulkTransferId`) REFERENCES `bulkTransfer` (`bulktransferid`), + CONSTRAINT `bulktransferstatechange_bulktransferstateid_foreign` FOREIGN KEY (`bulkTransferStateId`) REFERENCES `bulkTransferState` (`bulktransferstateid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `contactType` +-- + +DROP TABLE IF EXISTS `contactType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `contactType` ( + `contactTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`contactTypeId`), + UNIQUE KEY `contacttype_name_unique` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `currency` +-- + +DROP TABLE IF EXISTS `currency`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `currency` ( + `currencyId` varchar(3) NOT NULL, + `name` varchar(128) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `scale` int(10) unsigned NOT NULL DEFAULT '4', + PRIMARY KEY (`currencyId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `endpointType` +-- + +DROP TABLE IF EXISTS `endpointType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `endpointType` ( + `endpointTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`endpointTypeId`), + UNIQUE KEY `endpointtype_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `event` +-- + +DROP TABLE IF EXISTS `event`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `event` ( + `eventId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(128) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`eventId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `geoCode` +-- + +DROP TABLE IF EXISTS `geoCode`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `geoCode` ( + `geoCodeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `quotePartyId` bigint(20) unsigned NOT NULL COMMENT 'Optionally the GeoCode for the Payer/Payee may have been provided. If the Quote Response has the GeoCode for the Payee, an additional row is added', + `latitude` varchar(50) NOT NULL COMMENT 'Latitude of the initiating Party', + `longitude` varchar(50) NOT NULL COMMENT 'Longitude of the initiating Party', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`geoCodeId`), + KEY `geocode_quotepartyid_foreign` (`quotePartyId`), + CONSTRAINT `geocode_quotepartyid_foreign` FOREIGN KEY (`quotePartyId`) REFERENCES `quoteParty` (`quotepartyid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ilpPacket` +-- + +DROP TABLE IF EXISTS `ilpPacket`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `ilpPacket` ( + `transferId` varchar(36) NOT NULL, + `value` text NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferId`), + CONSTRAINT `ilppacket_transferid_foreign` FOREIGN KEY (`transferId`) REFERENCES `transfer` (`transferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ledgerAccountType` +-- + +DROP TABLE IF EXISTS `ledgerAccountType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `ledgerAccountType` ( + `ledgerAccountTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`ledgerAccountTypeId`), + UNIQUE KEY `ledgeraccounttype_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ledgerEntryType` +-- + +DROP TABLE IF EXISTS `ledgerEntryType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `ledgerEntryType` ( + `ledgerEntryTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`ledgerEntryTypeId`), + UNIQUE KEY `ledgerentrytype_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `migration` +-- + +DROP TABLE IF EXISTS `migration`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `migration` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) DEFAULT NULL, + `batch` int(11) DEFAULT NULL, + `migration_time` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=138 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `migration_lock` +-- + +DROP TABLE IF EXISTS `migration_lock`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `migration_lock` ( + `index` int(10) unsigned NOT NULL AUTO_INCREMENT, + `is_locked` int(11) DEFAULT NULL, + PRIMARY KEY (`index`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `participant` +-- + +DROP TABLE IF EXISTS `participant`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `participant` ( + `participantId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(256) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `createdBy` varchar(128) NOT NULL, + PRIMARY KEY (`participantId`), + UNIQUE KEY `participant_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `participantContact` +-- + +DROP TABLE IF EXISTS `participantContact`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `participantContact` ( + `participantContactId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `participantId` int(10) unsigned NOT NULL, + `contactTypeId` int(10) unsigned NOT NULL, + `value` varchar(256) NOT NULL, + `priorityPreference` int(11) NOT NULL DEFAULT '9', + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `createdBy` varchar(128) NOT NULL, + PRIMARY KEY (`participantContactId`), + KEY `participantcontact_participantid_index` (`participantId`), + KEY `participantcontact_contacttypeid_index` (`contactTypeId`), + CONSTRAINT `participantcontact_contacttypeid_foreign` FOREIGN KEY (`contactTypeId`) REFERENCES `contactType` (`contacttypeid`), + CONSTRAINT `participantcontact_participantid_foreign` FOREIGN KEY (`participantId`) REFERENCES `participant` (`participantid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `participantCurrency` +-- + +DROP TABLE IF EXISTS `participantCurrency`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `participantCurrency` ( + `participantCurrencyId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `participantId` int(10) unsigned NOT NULL, + `currencyId` varchar(3) NOT NULL, + `ledgerAccountTypeId` int(10) unsigned NOT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `createdBy` varchar(128) NOT NULL, + PRIMARY KEY (`participantCurrencyId`), + UNIQUE KEY `participantcurrency_pcl_unique` (`participantId`,`currencyId`,`ledgerAccountTypeId`), + KEY `participantcurrency_ledgeraccounttypeid_foreign` (`ledgerAccountTypeId`), + KEY `participantcurrency_participantid_index` (`participantId`), + KEY `participantcurrency_currencyid_index` (`currencyId`), + CONSTRAINT `participantcurrency_currencyid_foreign` FOREIGN KEY (`currencyId`) REFERENCES `currency` (`currencyid`), + CONSTRAINT `participantcurrency_ledgeraccounttypeid_foreign` FOREIGN KEY (`ledgerAccountTypeId`) REFERENCES `ledgerAccountType` (`ledgeraccounttypeid`), + CONSTRAINT `participantcurrency_participantid_foreign` FOREIGN KEY (`participantId`) REFERENCES `participant` (`participantid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `participantEndpoint` +-- + +DROP TABLE IF EXISTS `participantEndpoint`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `participantEndpoint` ( + `participantEndpointId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `participantId` int(10) unsigned NOT NULL, + `endpointTypeId` int(10) unsigned NOT NULL, + `value` varchar(512) NOT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `createdBy` varchar(128) NOT NULL, + PRIMARY KEY (`participantEndpointId`), + KEY `participantendpoint_participantid_index` (`participantId`), + KEY `participantendpoint_endpointtypeid_index` (`endpointTypeId`), + CONSTRAINT `participantendpoint_endpointtypeid_foreign` FOREIGN KEY (`endpointTypeId`) REFERENCES `endpointType` (`endpointtypeid`), + CONSTRAINT `participantendpoint_participantid_foreign` FOREIGN KEY (`participantId`) REFERENCES `participant` (`participantid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `participantLimit` +-- + +DROP TABLE IF EXISTS `participantLimit`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `participantLimit` ( + `participantLimitId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `participantCurrencyId` int(10) unsigned NOT NULL, + `participantLimitTypeId` int(10) unsigned NOT NULL, + `value` decimal(18,4) NOT NULL DEFAULT '0.0000', + `thresholdAlarmPercentage` decimal(5,2) NOT NULL DEFAULT '10.00', + `startAfterParticipantPositionChangeId` bigint(20) unsigned DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `createdBy` varchar(128) NOT NULL, + PRIMARY KEY (`participantLimitId`), + KEY `participantlimit_participantcurrencyid_index` (`participantCurrencyId`), + KEY `participantlimit_participantlimittypeid_index` (`participantLimitTypeId`), + KEY `participantlimit_startafterparticipantpositionchangeid_index` (`startAfterParticipantPositionChangeId`), + CONSTRAINT `participantlimit_participantcurrencyid_foreign` FOREIGN KEY (`participantCurrencyId`) REFERENCES `participantCurrency` (`participantcurrencyid`), + CONSTRAINT `participantlimit_participantlimittypeid_foreign` FOREIGN KEY (`participantLimitTypeId`) REFERENCES `participantLimitType` (`participantlimittypeid`), + CONSTRAINT `participantlimit_startafterparticipantpositionchangeid_foreign` FOREIGN KEY (`startAfterParticipantPositionChangeId`) REFERENCES `participantPositionChange` (`participantpositionchangeid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `participantLimitType` +-- + +DROP TABLE IF EXISTS `participantLimitType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `participantLimitType` ( + `participantLimitTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`participantLimitTypeId`), + UNIQUE KEY `participantlimittype_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `participantParty` +-- + +DROP TABLE IF EXISTS `participantParty`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `participantParty` ( + `participantPartyId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `participantId` int(10) unsigned NOT NULL, + `partyId` bigint(20) unsigned NOT NULL, + PRIMARY KEY (`participantPartyId`), + UNIQUE KEY `participantparty_participantid_partyid_unique` (`participantId`,`partyId`), + KEY `participantparty_participantid_index` (`participantId`), + CONSTRAINT `participantparty_participantid_foreign` FOREIGN KEY (`participantId`) REFERENCES `participant` (`participantid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `participantPosition` +-- + +DROP TABLE IF EXISTS `participantPosition`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `participantPosition` ( + `participantPositionId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `participantCurrencyId` int(10) unsigned NOT NULL, + `value` decimal(18,4) NOT NULL, + `reservedValue` decimal(18,4) NOT NULL, + `changedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`participantPositionId`), + KEY `participantposition_participantcurrencyid_index` (`participantCurrencyId`), + CONSTRAINT `participantposition_participantcurrencyid_foreign` FOREIGN KEY (`participantCurrencyId`) REFERENCES `participantCurrency` (`participantcurrencyid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `participantPositionChange` +-- + +DROP TABLE IF EXISTS `participantPositionChange`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `participantPositionChange` ( + `participantPositionChangeId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `participantPositionId` bigint(20) unsigned NOT NULL, + `transferStateChangeId` bigint(20) unsigned NOT NULL, + `value` decimal(18,4) NOT NULL, + `reservedValue` decimal(18,4) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`participantPositionChangeId`), + KEY `participantpositionchange_participantpositionid_index` (`participantPositionId`), + KEY `participantpositionchange_transferstatechangeid_index` (`transferStateChangeId`), + CONSTRAINT `participantpositionchange_participantpositionid_foreign` FOREIGN KEY (`participantPositionId`) REFERENCES `participantPosition` (`participantpositionid`), + CONSTRAINT `participantpositionchange_transferstatechangeid_foreign` FOREIGN KEY (`transferStateChangeId`) REFERENCES `transferStateChange` (`transferstatechangeid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `party` +-- + +DROP TABLE IF EXISTS `party`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `party` ( + `partyId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `quotePartyId` bigint(20) unsigned NOT NULL, + `firstName` varchar(128) DEFAULT NULL, + `middleName` varchar(128) DEFAULT NULL, + `lastName` varchar(128) DEFAULT NULL, + `dateOfBirth` datetime DEFAULT NULL, + PRIMARY KEY (`partyId`), + KEY `party_quotepartyid_foreign` (`quotePartyId`), + CONSTRAINT `party_quotepartyid_foreign` FOREIGN KEY (`quotePartyId`) REFERENCES `quoteParty` (`quotepartyid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Optional pers. data provided during Quote Request & Response'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `partyIdentifierType` +-- + +DROP TABLE IF EXISTS `partyIdentifierType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `partyIdentifierType` ( + `partyIdentifierTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `description` varchar(512) NOT NULL, + PRIMARY KEY (`partyIdentifierTypeId`), + UNIQUE KEY `partyidentifiertype_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `partyType` +-- + +DROP TABLE IF EXISTS `partyType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `partyType` ( + `partyTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(128) NOT NULL, + `description` varchar(256) NOT NULL, + PRIMARY KEY (`partyTypeId`), + UNIQUE KEY `partytype_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `quote` +-- + +DROP TABLE IF EXISTS `quote`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `quote` ( + `quoteId` varchar(36) NOT NULL, + `transactionReferenceId` varchar(36) NOT NULL COMMENT 'Common ID (decided by the Payer FSP) between the FSPs for the future transaction object', + `transactionRequestId` varchar(36) DEFAULT NULL COMMENT 'Optional previously-sent transaction request', + `note` text COMMENT 'A memo that will be attached to the transaction', + `expirationDate` datetime DEFAULT NULL COMMENT 'Optional expiration for the requested transaction', + `transactionInitiatorId` int(10) unsigned NOT NULL COMMENT 'This is part of the transaction initiator', + `transactionInitiatorTypeId` int(10) unsigned NOT NULL COMMENT 'This is part of the transaction initiator type', + `transactionScenarioId` int(10) unsigned NOT NULL COMMENT 'This is part of the transaction scenario', + `balanceOfPaymentsId` int(10) unsigned DEFAULT NULL COMMENT 'This is part of the transaction type that contains the elements- balance of payment', + `transactionSubScenarioId` int(10) unsigned DEFAULT NULL COMMENT 'This is part of the transaction type sub scenario as defined by the local scheme', + `amountTypeId` int(10) unsigned NOT NULL COMMENT 'This is part of the transaction type that contains valid elements for - Amount Type', + `amount` decimal(18,4) NOT NULL DEFAULT '0.0000' COMMENT 'The amount that the quote is being requested for. Need to be interpert in accordance with the amount type', + `currencyId` varchar(255) DEFAULT NULL COMMENT 'Trading currency pertaining to the Amount', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`quoteId`), + KEY `quote_transactionreferenceid_foreign` (`transactionReferenceId`), + KEY `quote_transactionrequestid_foreign` (`transactionRequestId`), + KEY `quote_transactioninitiatorid_foreign` (`transactionInitiatorId`), + KEY `quote_transactioninitiatortypeid_foreign` (`transactionInitiatorTypeId`), + KEY `quote_transactionscenarioid_foreign` (`transactionScenarioId`), + KEY `quote_balanceofpaymentsid_foreign` (`balanceOfPaymentsId`), + KEY `quote_transactionsubscenarioid_foreign` (`transactionSubScenarioId`), + KEY `quote_amounttypeid_foreign` (`amountTypeId`), + KEY `quote_currencyid_foreign` (`currencyId`), + CONSTRAINT `quote_amounttypeid_foreign` FOREIGN KEY (`amountTypeId`) REFERENCES `amountType` (`amounttypeid`), + CONSTRAINT `quote_balanceofpaymentsid_foreign` FOREIGN KEY (`balanceOfPaymentsId`) REFERENCES `balanceOfPayments` (`balanceofpaymentsid`), + CONSTRAINT `quote_currencyid_foreign` FOREIGN KEY (`currencyId`) REFERENCES `currency` (`currencyid`), + CONSTRAINT `quote_transactioninitiatorid_foreign` FOREIGN KEY (`transactionInitiatorId`) REFERENCES `transactionInitiator` (`transactioninitiatorid`), + CONSTRAINT `quote_transactioninitiatortypeid_foreign` FOREIGN KEY (`transactionInitiatorTypeId`) REFERENCES `transactionInitiatorType` (`transactioninitiatortypeid`), + CONSTRAINT `quote_transactionreferenceid_foreign` FOREIGN KEY (`transactionReferenceId`) REFERENCES `transactionReference` (`transactionreferenceid`), + CONSTRAINT `quote_transactionrequestid_foreign` FOREIGN KEY (`transactionRequestId`) REFERENCES `transactionReference` (`transactionreferenceid`), + CONSTRAINT `quote_transactionscenarioid_foreign` FOREIGN KEY (`transactionScenarioId`) REFERENCES `transactionScenario` (`transactionscenarioid`), + CONSTRAINT `quote_transactionsubscenarioid_foreign` FOREIGN KEY (`transactionSubScenarioId`) REFERENCES `transactionSubScenario` (`transactionsubscenarioid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `quoteDuplicateCheck` +-- + +DROP TABLE IF EXISTS `quoteDuplicateCheck`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `quoteDuplicateCheck` ( + `quoteId` varchar(36) NOT NULL COMMENT 'Common ID between the FSPs for the quote object, decided by the Payer FSP', + `hash` varchar(1024) DEFAULT NULL COMMENT 'hash value received for the quote request', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`quoteId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `quoteError` +-- + +DROP TABLE IF EXISTS `quoteError`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `quoteError` ( + `quoteErrorId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `quoteId` varchar(36) NOT NULL COMMENT 'Common ID between the FSPs for the quote object, decided by the Payer FSP', + `quoteResponseId` bigint(20) unsigned DEFAULT NULL COMMENT 'The response to the intial quote', + `errorCode` int(10) unsigned NOT NULL, + `errorDescription` varchar(128) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`quoteErrorId`), + KEY `quoteerror_quoteid_foreign` (`quoteId`), + KEY `quoteerror_quoteresponseid_foreign` (`quoteResponseId`), + CONSTRAINT `quoteerror_quoteid_foreign` FOREIGN KEY (`quoteId`) REFERENCES `quote` (`quoteid`), + CONSTRAINT `quoteerror_quoteresponseid_foreign` FOREIGN KEY (`quoteResponseId`) REFERENCES `quoteResponse` (`quoteresponseid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `quoteExtension` +-- + +DROP TABLE IF EXISTS `quoteExtension`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `quoteExtension` ( + `quoteExtensionId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `quoteId` varchar(36) NOT NULL COMMENT 'Common ID between the FSPs for the quote object, decided by the Payer FSP', + `quoteResponseId` bigint(20) unsigned NOT NULL COMMENT 'The response to the intial quote', + `transactionId` varchar(36) NOT NULL COMMENT 'The transaction reference that is part of the initial quote', + `key` varchar(128) NOT NULL, + `value` text NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`quoteExtensionId`), + KEY `quoteextension_quoteid_foreign` (`quoteId`), + KEY `quoteextension_quoteresponseid_foreign` (`quoteResponseId`), + KEY `quoteextension_transactionid_foreign` (`transactionId`), + CONSTRAINT `quoteextension_quoteid_foreign` FOREIGN KEY (`quoteId`) REFERENCES `quote` (`quoteid`), + CONSTRAINT `quoteextension_quoteresponseid_foreign` FOREIGN KEY (`quoteResponseId`) REFERENCES `quoteResponse` (`quoteresponseid`), + CONSTRAINT `quoteextension_transactionid_foreign` FOREIGN KEY (`transactionId`) REFERENCES `transactionReference` (`transactionreferenceid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `quoteParty` +-- + +DROP TABLE IF EXISTS `quoteParty`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `quoteParty` ( + `quotePartyId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `quoteId` varchar(36) NOT NULL COMMENT 'Common ID between the FSPs for the quote object, decided by the Payer FSP', + `partyTypeId` int(10) unsigned NOT NULL COMMENT 'Specifies the type of party this row relates to; typically PAYER or PAYEE', + `partyIdentifierTypeId` int(10) unsigned NOT NULL COMMENT 'Specifies the type of identifier used to identify this party e.g. MSISDN, IBAN etc...', + `partyIdentifierValue` varchar(128) NOT NULL COMMENT 'The value of the identifier used to identify this party', + `partySubIdOrTypeId` int(10) unsigned DEFAULT NULL COMMENT 'A sub-identifier or sub-type for the Party', + `fspId` varchar(255) DEFAULT NULL COMMENT 'This is the FSP ID as provided in the quote. For the switch between multi-parties it is required', + `participantId` int(10) unsigned DEFAULT NULL COMMENT 'Reference to the resolved FSP ID (if supplied/known). If not an error will be reported', + `merchantClassificationCode` varchar(4) DEFAULT NULL COMMENT 'Used in the context of Payee Information, where the Payee happens to be a merchant accepting merchant payments', + `partyName` varchar(128) DEFAULT NULL COMMENT 'Display name of the Party, could be a real name or a nick name', + `transferParticipantRoleTypeId` int(10) unsigned NOT NULL COMMENT 'The role this Party is playing in the transaction', + `ledgerEntryTypeId` int(10) unsigned NOT NULL COMMENT 'The type of financial entry this Party is presenting', + `amount` decimal(18,4) NOT NULL, + `currencyId` varchar(3) NOT NULL COMMENT 'Trading currency pertaining to the party amount', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`quotePartyId`), + KEY `quoteparty_quoteid_foreign` (`quoteId`), + KEY `quoteparty_partytypeid_foreign` (`partyTypeId`), + KEY `quoteparty_partyidentifiertypeid_foreign` (`partyIdentifierTypeId`), + KEY `quoteparty_partysubidortypeid_foreign` (`partySubIdOrTypeId`), + KEY `quoteparty_participantid_foreign` (`participantId`), + KEY `quoteparty_transferparticipantroletypeid_foreign` (`transferParticipantRoleTypeId`), + KEY `quoteparty_ledgerentrytypeid_foreign` (`ledgerEntryTypeId`), + KEY `quoteparty_currencyid_foreign` (`currencyId`), + CONSTRAINT `quoteparty_currencyid_foreign` FOREIGN KEY (`currencyId`) REFERENCES `currency` (`currencyid`), + CONSTRAINT `quoteparty_ledgerentrytypeid_foreign` FOREIGN KEY (`ledgerEntryTypeId`) REFERENCES `ledgerEntryType` (`ledgerentrytypeid`), + CONSTRAINT `quoteparty_participantid_foreign` FOREIGN KEY (`participantId`) REFERENCES `participant` (`participantid`), + CONSTRAINT `quoteparty_partyidentifiertypeid_foreign` FOREIGN KEY (`partyIdentifierTypeId`) REFERENCES `partyIdentifierType` (`partyidentifiertypeid`), + CONSTRAINT `quoteparty_partysubidortypeid_foreign` FOREIGN KEY (`partySubIdOrTypeId`) REFERENCES `partyIdentifierType` (`partyidentifiertypeid`), + CONSTRAINT `quoteparty_partytypeid_foreign` FOREIGN KEY (`partyTypeId`) REFERENCES `partyType` (`partytypeid`), + CONSTRAINT `quoteparty_quoteid_foreign` FOREIGN KEY (`quoteId`) REFERENCES `quote` (`quoteid`), + CONSTRAINT `quoteparty_transferparticipantroletypeid_foreign` FOREIGN KEY (`transferParticipantRoleTypeId`) REFERENCES `transferParticipantRoleType` (`transferparticipantroletypeid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Temporary view structure for view `quotePartyView` +-- + +DROP TABLE IF EXISTS `quotePartyView`; +/*!50001 DROP VIEW IF EXISTS `quotePartyView`*/; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8mb4; +/*!50001 CREATE VIEW `quotePartyView` AS SELECT + 1 AS `quoteId`, + 1 AS `quotePartyId`, + 1 AS `partyType`, + 1 AS `identifierType`, + 1 AS `partyIdentifierValue`, + 1 AS `partySubIdOrType`, + 1 AS `fspId`, + 1 AS `merchantClassificationCode`, + 1 AS `partyName`, + 1 AS `firstName`, + 1 AS `lastName`, + 1 AS `middleName`, + 1 AS `dateOfBirth`, + 1 AS `longitude`, + 1 AS `latitude`*/; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `quoteResponse` +-- + +DROP TABLE IF EXISTS `quoteResponse`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `quoteResponse` ( + `quoteResponseId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `quoteId` varchar(36) NOT NULL COMMENT 'Common ID between the FSPs for the quote object, decided by the Payer FSP', + `transferAmountCurrencyId` varchar(3) NOT NULL COMMENT 'CurrencyId of the transfer amount', + `transferAmount` decimal(18,4) NOT NULL COMMENT 'The amount of money that the Payer FSP should transfer to the Payee FSP', + `payeeReceiveAmountCurrencyId` varchar(3) DEFAULT NULL COMMENT 'CurrencyId of the payee receive amount', + `payeeReceiveAmount` decimal(18,4) DEFAULT NULL COMMENT 'The amount of Money that the Payee should receive in the end-to-end transaction. Optional as the Payee FSP might not want to disclose any optional Payee fees', + `payeeFspFeeCurrencyId` varchar(3) DEFAULT NULL COMMENT 'CurrencyId of the payee fsp fee amount', + `payeeFspFeeAmount` decimal(18,4) DEFAULT NULL COMMENT 'Payee FSP’s part of the transaction fee', + `payeeFspCommissionCurrencyId` varchar(3) DEFAULT NULL COMMENT 'CurrencyId of the payee fsp commission amount', + `payeeFspCommissionAmount` decimal(18,4) DEFAULT NULL COMMENT 'Transaction commission from the Payee FSP', + `ilpCondition` varchar(256) NOT NULL, + `responseExpirationDate` datetime DEFAULT NULL COMMENT 'Optional expiration for the requested transaction', + `isValid` tinyint(1) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`quoteResponseId`), + KEY `quoteresponse_quoteid_foreign` (`quoteId`), + KEY `quoteresponse_transferamountcurrencyid_foreign` (`transferAmountCurrencyId`), + KEY `quoteresponse_payeereceiveamountcurrencyid_foreign` (`payeeReceiveAmountCurrencyId`), + KEY `quoteresponse_payeefspcommissioncurrencyid_foreign` (`payeeFspCommissionCurrencyId`), + CONSTRAINT `quoteresponse_payeefspcommissioncurrencyid_foreign` FOREIGN KEY (`payeeFspCommissionCurrencyId`) REFERENCES `currency` (`currencyid`), + CONSTRAINT `quoteresponse_payeereceiveamountcurrencyid_foreign` FOREIGN KEY (`payeeReceiveAmountCurrencyId`) REFERENCES `currency` (`currencyid`), + CONSTRAINT `quoteresponse_quoteid_foreign` FOREIGN KEY (`quoteId`) REFERENCES `quote` (`quoteid`), + CONSTRAINT `quoteresponse_transferamountcurrencyid_foreign` FOREIGN KEY (`transferAmountCurrencyId`) REFERENCES `currency` (`currencyid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='This table is the primary store for quote responses'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `quoteResponseDuplicateCheck` +-- + +DROP TABLE IF EXISTS `quoteResponseDuplicateCheck`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `quoteResponseDuplicateCheck` ( + `quoteResponseId` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'The response to the intial quote', + `quoteId` varchar(36) NOT NULL COMMENT 'Common ID between the FSPs for the quote object, decided by the Payer FSP', + `hash` varchar(255) DEFAULT NULL COMMENT 'hash value received for the quote response', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`quoteResponseId`), + KEY `quoteresponseduplicatecheck_quoteid_foreign` (`quoteId`), + CONSTRAINT `quoteresponseduplicatecheck_quoteid_foreign` FOREIGN KEY (`quoteId`) REFERENCES `quote` (`quoteid`), + CONSTRAINT `quoteresponseduplicatecheck_quoteresponseid_foreign` FOREIGN KEY (`quoteResponseId`) REFERENCES `quoteResponse` (`quoteresponseid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `quoteResponseIlpPacket` +-- + +DROP TABLE IF EXISTS `quoteResponseIlpPacket`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `quoteResponseIlpPacket` ( + `quoteResponseId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `value` text NOT NULL COMMENT 'ilpPacket returned from Payee in response to a quote request', + PRIMARY KEY (`quoteResponseId`), + CONSTRAINT `quoteresponseilppacket_quoteresponseid_foreign` FOREIGN KEY (`quoteResponseId`) REFERENCES `quoteResponse` (`quoteresponseid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Temporary view structure for view `quoteResponseView` +-- + +DROP TABLE IF EXISTS `quoteResponseView`; +/*!50001 DROP VIEW IF EXISTS `quoteResponseView`*/; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8mb4; +/*!50001 CREATE VIEW `quoteResponseView` AS SELECT + 1 AS `quoteResponseId`, + 1 AS `quoteId`, + 1 AS `transferAmountCurrencyId`, + 1 AS `transferAmount`, + 1 AS `payeeReceiveAmountCurrencyId`, + 1 AS `payeeReceiveAmount`, + 1 AS `payeeFspFeeCurrencyId`, + 1 AS `payeeFspFeeAmount`, + 1 AS `payeeFspCommissionCurrencyId`, + 1 AS `payeeFspCommissionAmount`, + 1 AS `ilpCondition`, + 1 AS `responseExpirationDate`, + 1 AS `isValid`, + 1 AS `createdDate`, + 1 AS `ilpPacket`, + 1 AS `longitude`, + 1 AS `latitude`*/; +SET character_set_client = @saved_cs_client; + +-- +-- Temporary view structure for view `quoteView` +-- + +DROP TABLE IF EXISTS `quoteView`; +/*!50001 DROP VIEW IF EXISTS `quoteView`*/; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8mb4; +/*!50001 CREATE VIEW `quoteView` AS SELECT + 1 AS `quoteId`, + 1 AS `transactionReferenceId`, + 1 AS `transactionRequestId`, + 1 AS `note`, + 1 AS `expirationDate`, + 1 AS `transactionInitiator`, + 1 AS `transactionInitiatorType`, + 1 AS `transactionScenario`, + 1 AS `balanceOfPaymentsId`, + 1 AS `transactionSubScenario`, + 1 AS `amountType`, + 1 AS `amount`, + 1 AS `currency`*/; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `segment` +-- + +DROP TABLE IF EXISTS `segment`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `segment` ( + `segmentId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `segmentType` varchar(50) NOT NULL, + `enumeration` int(11) NOT NULL DEFAULT '0', + `tableName` varchar(50) NOT NULL, + `value` bigint(20) NOT NULL, + `changedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`segmentId`), + KEY `segment_keys_index` (`segmentType`,`enumeration`,`tableName`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlement` +-- + +DROP TABLE IF EXISTS `settlement`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `settlement` ( + `settlementId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `reason` varchar(512) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `currentStateChangeId` bigint(20) unsigned DEFAULT NULL, + PRIMARY KEY (`settlementId`), + KEY `settlement_currentstatechangeid_foreign` (`currentStateChangeId`), + CONSTRAINT `settlement_currentstatechangeid_foreign` FOREIGN KEY (`currentStateChangeId`) REFERENCES `settlementStateChange` (`settlementstatechangeid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementParticipantCurrency` +-- + +DROP TABLE IF EXISTS `settlementParticipantCurrency`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `settlementParticipantCurrency` ( + `settlementParticipantCurrencyId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `settlementId` bigint(20) unsigned NOT NULL, + `participantCurrencyId` int(10) unsigned NOT NULL, + `netAmount` decimal(18,4) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `currentStateChangeId` bigint(20) unsigned DEFAULT NULL, + `settlementTransferId` varchar(36) DEFAULT NULL, + PRIMARY KEY (`settlementParticipantCurrencyId`), + KEY `settlementparticipantcurrency_settlementid_index` (`settlementId`), + KEY `settlementparticipantcurrency_participantcurrencyid_index` (`participantCurrencyId`), + KEY `settlementparticipantcurrency_settlementtransferid_index` (`settlementTransferId`), + KEY `spc_currentstatechangeid_foreign` (`currentStateChangeId`), + CONSTRAINT `settlementparticipantcurrency_participantcurrencyid_foreign` FOREIGN KEY (`participantCurrencyId`) REFERENCES `participantCurrency` (`participantcurrencyid`), + CONSTRAINT `settlementparticipantcurrency_settlementid_foreign` FOREIGN KEY (`settlementId`) REFERENCES `settlement` (`settlementid`), + CONSTRAINT `spc_currentstatechangeid_foreign` FOREIGN KEY (`currentStateChangeId`) REFERENCES `settlementParticipantCurrencyStateChange` (`settlementparticipantcurrencystatechangeid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementParticipantCurrencyStateChange` +-- + +DROP TABLE IF EXISTS `settlementParticipantCurrencyStateChange`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `settlementParticipantCurrencyStateChange` ( + `settlementParticipantCurrencyStateChangeId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `settlementParticipantCurrencyId` bigint(20) unsigned NOT NULL, + `settlementStateId` varchar(50) NOT NULL, + `reason` varchar(512) DEFAULT NULL, + `externalReference` varchar(50) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`settlementParticipantCurrencyStateChangeId`), + KEY `spcsc_settlementparticipantcurrencyid_index` (`settlementParticipantCurrencyId`), + KEY `spcsc_settlementstateid_index` (`settlementStateId`), + CONSTRAINT `spcsc_settlementparticipantcurrencyid_foreign` FOREIGN KEY (`settlementParticipantCurrencyId`) REFERENCES `settlementParticipantCurrency` (`settlementparticipantcurrencyid`), + CONSTRAINT `spcsc_settlementstateid_foreign` FOREIGN KEY (`settlementStateId`) REFERENCES `settlementState` (`settlementstateid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementSettlementWindow` +-- + +DROP TABLE IF EXISTS `settlementSettlementWindow`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `settlementSettlementWindow` ( + `settlementSettlementWindowId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `settlementId` bigint(20) unsigned NOT NULL, + `settlementWindowId` bigint(20) unsigned NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`settlementSettlementWindowId`), + UNIQUE KEY `settlementsettlementwindow_unique` (`settlementId`,`settlementWindowId`), + KEY `settlementsettlementwindow_settlementid_index` (`settlementId`), + KEY `settlementsettlementwindow_settlementwindowid_index` (`settlementWindowId`), + CONSTRAINT `settlementsettlementwindow_settlementid_foreign` FOREIGN KEY (`settlementId`) REFERENCES `settlement` (`settlementid`), + CONSTRAINT `settlementsettlementwindow_settlementwindowid_foreign` FOREIGN KEY (`settlementWindowId`) REFERENCES `settlementWindow` (`settlementwindowid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementState` +-- + +DROP TABLE IF EXISTS `settlementState`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `settlementState` ( + `settlementStateId` varchar(50) NOT NULL, + `enumeration` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`settlementStateId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementStateChange` +-- + +DROP TABLE IF EXISTS `settlementStateChange`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `settlementStateChange` ( + `settlementStateChangeId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `settlementId` bigint(20) unsigned NOT NULL, + `settlementStateId` varchar(50) NOT NULL, + `reason` varchar(512) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`settlementStateChangeId`), + KEY `settlementstatechange_settlementid_index` (`settlementId`), + KEY `settlementstatechange_settlementstateid_index` (`settlementStateId`), + CONSTRAINT `settlementstatechange_settlementid_foreign` FOREIGN KEY (`settlementId`) REFERENCES `settlement` (`settlementid`), + CONSTRAINT `settlementstatechange_settlementstateid_foreign` FOREIGN KEY (`settlementStateId`) REFERENCES `settlementState` (`settlementstateid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementTransferParticipant` +-- + +DROP TABLE IF EXISTS `settlementTransferParticipant`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `settlementTransferParticipant` ( + `settlementTransferParticipantId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `settlementId` bigint(20) unsigned NOT NULL, + `settlementWindowId` bigint(20) unsigned NOT NULL, + `participantCurrencyId` int(10) unsigned NOT NULL, + `transferParticipantRoleTypeId` int(10) unsigned NOT NULL, + `ledgerEntryTypeId` int(10) unsigned NOT NULL, + `amount` decimal(18,4) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`settlementTransferParticipantId`), + KEY `settlementtransferparticipant_settlementid_index` (`settlementId`), + KEY `settlementtransferparticipant_settlementwindowid_index` (`settlementWindowId`), + KEY `settlementtransferparticipant_participantcurrencyid_index` (`participantCurrencyId`), + KEY `stp_transferparticipantroletypeid_index` (`transferParticipantRoleTypeId`), + KEY `settlementtransferparticipant_ledgerentrytypeid_index` (`ledgerEntryTypeId`), + CONSTRAINT `settlementtransferparticipant_ledgerentrytypeid_foreign` FOREIGN KEY (`ledgerEntryTypeId`) REFERENCES `ledgerEntryType` (`ledgerentrytypeid`), + CONSTRAINT `settlementtransferparticipant_participantcurrencyid_foreign` FOREIGN KEY (`participantCurrencyId`) REFERENCES `participantCurrency` (`participantcurrencyid`), + CONSTRAINT `settlementtransferparticipant_settlementid_foreign` FOREIGN KEY (`settlementId`) REFERENCES `settlement` (`settlementid`), + CONSTRAINT `settlementtransferparticipant_settlementwindowid_foreign` FOREIGN KEY (`settlementWindowId`) REFERENCES `settlementWindow` (`settlementwindowid`), + CONSTRAINT `stp_transferparticipantroletypeid_foreign` FOREIGN KEY (`transferParticipantRoleTypeId`) REFERENCES `transferParticipantRoleType` (`transferparticipantroletypeid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementWindow` +-- + +DROP TABLE IF EXISTS `settlementWindow`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `settlementWindow` ( + `settlementWindowId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `reason` varchar(512) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `currentStateChangeId` bigint(20) unsigned DEFAULT NULL, + PRIMARY KEY (`settlementWindowId`), + KEY `settlementwindow_currentstatechangeid_foreign` (`currentStateChangeId`), + CONSTRAINT `settlementwindow_currentstatechangeid_foreign` FOREIGN KEY (`currentStateChangeId`) REFERENCES `settlementWindowStateChange` (`settlementwindowstatechangeid`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementWindowState` +-- + +DROP TABLE IF EXISTS `settlementWindowState`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `settlementWindowState` ( + `settlementWindowStateId` varchar(50) NOT NULL, + `enumeration` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`settlementWindowStateId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementWindowStateChange` +-- + +DROP TABLE IF EXISTS `settlementWindowStateChange`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `settlementWindowStateChange` ( + `settlementWindowStateChangeId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `settlementWindowId` bigint(20) unsigned NOT NULL, + `settlementWindowStateId` varchar(50) NOT NULL, + `reason` varchar(512) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`settlementWindowStateChangeId`), + KEY `settlementwindowstatechange_settlementwindowid_index` (`settlementWindowId`), + KEY `settlementwindowstatechange_settlementwindowstateid_index` (`settlementWindowStateId`), + CONSTRAINT `settlementwindowstatechange_settlementwindowid_foreign` FOREIGN KEY (`settlementWindowId`) REFERENCES `settlementWindow` (`settlementwindowid`), + CONSTRAINT `settlementwindowstatechange_settlementwindowstateid_foreign` FOREIGN KEY (`settlementWindowStateId`) REFERENCES `settlementWindowState` (`settlementwindowstateid`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `token` +-- + +DROP TABLE IF EXISTS `token`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `token` ( + `tokenId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `participantId` int(10) unsigned NOT NULL, + `value` varchar(256) NOT NULL, + `expiration` bigint(20) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`tokenId`), + UNIQUE KEY `token_value_unique` (`value`), + KEY `token_participantid_index` (`participantId`), + CONSTRAINT `token_participantid_foreign` FOREIGN KEY (`participantId`) REFERENCES `participant` (`participantid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transactionInitiator` +-- + +DROP TABLE IF EXISTS `transactionInitiator`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `transactionInitiator` ( + `transactionInitiatorId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(256) NOT NULL, + `description` varchar(1024) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`transactionInitiatorId`), + UNIQUE KEY `transactioninitiator_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transactionInitiatorType` +-- + +DROP TABLE IF EXISTS `transactionInitiatorType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `transactionInitiatorType` ( + `transactionInitiatorTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(256) NOT NULL, + `description` varchar(1024) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`transactionInitiatorTypeId`), + UNIQUE KEY `transactioninitiatortype_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transactionReference` +-- + +DROP TABLE IF EXISTS `transactionReference`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `transactionReference` ( + `transactionReferenceId` varchar(36) NOT NULL COMMENT 'Common ID (decided by the Payer FSP) between the FSPs for the future transaction object', + `quoteId` varchar(36) DEFAULT NULL COMMENT 'Common ID between the FSPs for the quote object, decided by the Payer FSP', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System row creation timestamp', + PRIMARY KEY (`transactionReferenceId`), + KEY `transactionreference_quoteid_index` (`quoteId`), + CONSTRAINT `transactionreference_quoteid_foreign` FOREIGN KEY (`quoteId`) REFERENCES `quoteDuplicateCheck` (`quoteid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transactionScenario` +-- + +DROP TABLE IF EXISTS `transactionScenario`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `transactionScenario` ( + `transactionScenarioId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(256) NOT NULL, + `description` varchar(1024) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`transactionScenarioId`), + UNIQUE KEY `transactionscenario_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transactionSubScenario` +-- + +DROP TABLE IF EXISTS `transactionSubScenario`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `transactionSubScenario` ( + `transactionSubScenarioId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(256) NOT NULL, + `description` varchar(1024) DEFAULT NULL COMMENT 'Possible sub-scenario, defined locally within the scheme', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`transactionSubScenarioId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transfer` +-- + +DROP TABLE IF EXISTS `transfer`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `transfer` ( + `transferId` varchar(36) NOT NULL, + `amount` decimal(18,4) NOT NULL, + `currencyId` varchar(3) NOT NULL, + `ilpCondition` varchar(256) NOT NULL, + `expirationDate` datetime NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferId`), + KEY `transfer_currencyid_index` (`currencyId`), + CONSTRAINT `transfer_currencyid_foreign` FOREIGN KEY (`currencyId`) REFERENCES `currency` (`currencyid`), + CONSTRAINT `transfer_transferid_foreign` FOREIGN KEY (`transferId`) REFERENCES `transferDuplicateCheck` (`transferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferDuplicateCheck` +-- + +DROP TABLE IF EXISTS `transferDuplicateCheck`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `transferDuplicateCheck` ( + `transferId` varchar(36) NOT NULL, + `hash` varchar(256) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferError` +-- + +DROP TABLE IF EXISTS `transferError`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `transferError` ( + `transferId` varchar(36) NOT NULL, + `transferStateChangeId` bigint(20) unsigned NOT NULL, + `errorCode` int(10) unsigned NOT NULL, + `errorDescription` varchar(128) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferId`), + KEY `transfererror_transferstatechangeid_foreign` (`transferStateChangeId`), + CONSTRAINT `transfererror_transferstatechangeid_foreign` FOREIGN KEY (`transferStateChangeId`) REFERENCES `transferStateChange` (`transferstatechangeid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferErrorDuplicateCheck` +-- + +DROP TABLE IF EXISTS `transferErrorDuplicateCheck`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `transferErrorDuplicateCheck` ( + `transferId` varchar(36) NOT NULL, + `hash` varchar(256) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferId`), + CONSTRAINT `transfererrorduplicatecheck_transferid_foreign` FOREIGN KEY (`transferId`) REFERENCES `transfer` (`transferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferExtension` +-- + +DROP TABLE IF EXISTS `transferExtension`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `transferExtension` ( + `transferExtensionId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `transferId` varchar(36) NOT NULL, + `key` varchar(128) NOT NULL, + `value` text NOT NULL, + `isFulfilment` tinyint(1) NOT NULL DEFAULT '0', + `isError` tinyint(1) NOT NULL DEFAULT '0', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferExtensionId`), + KEY `transferextension_transferid_foreign` (`transferId`), + CONSTRAINT `transferextension_transferid_foreign` FOREIGN KEY (`transferId`) REFERENCES `transfer` (`transferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferFulfilment` +-- + +DROP TABLE IF EXISTS `transferFulfilment`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `transferFulfilment` ( + `transferId` varchar(36) NOT NULL, + `ilpFulfilment` varchar(256) DEFAULT NULL, + `completedDate` datetime NOT NULL, + `isValid` tinyint(1) DEFAULT NULL, + `settlementWindowId` bigint(20) unsigned DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferId`), + KEY `transferfulfilment_settlementwindowid_foreign` (`settlementWindowId`), + CONSTRAINT `transferfulfilment_settlementwindowid_foreign` FOREIGN KEY (`settlementWindowId`) REFERENCES `settlementWindow` (`settlementwindowid`), + CONSTRAINT `transferfulfilment_transferid_foreign` FOREIGN KEY (`transferId`) REFERENCES `transferFulfilmentDuplicateCheck` (`transferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferFulfilmentDuplicateCheck` +-- + +DROP TABLE IF EXISTS `transferFulfilmentDuplicateCheck`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `transferFulfilmentDuplicateCheck` ( + `transferId` varchar(36) NOT NULL, + `hash` varchar(256) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferId`), + CONSTRAINT `transferfulfilmentduplicatecheck_transferid_foreign` FOREIGN KEY (`transferId`) REFERENCES `transfer` (`transferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferParticipant` +-- + +DROP TABLE IF EXISTS `transferParticipant`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `transferParticipant` ( + `transferParticipantId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `transferId` varchar(36) NOT NULL, + `participantCurrencyId` int(10) unsigned NOT NULL, + `transferParticipantRoleTypeId` int(10) unsigned NOT NULL, + `ledgerEntryTypeId` int(10) unsigned NOT NULL, + `amount` decimal(18,4) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferParticipantId`), + KEY `transferparticipant_transferid_index` (`transferId`), + KEY `transferparticipant_participantcurrencyid_index` (`participantCurrencyId`), + KEY `transferparticipant_transferparticipantroletypeid_index` (`transferParticipantRoleTypeId`), + KEY `transferparticipant_ledgerentrytypeid_index` (`ledgerEntryTypeId`), + CONSTRAINT `transferparticipant_ledgerentrytypeid_foreign` FOREIGN KEY (`ledgerEntryTypeId`) REFERENCES `ledgerEntryType` (`ledgerentrytypeid`), + CONSTRAINT `transferparticipant_participantcurrencyid_foreign` FOREIGN KEY (`participantCurrencyId`) REFERENCES `participantCurrency` (`participantcurrencyid`), + CONSTRAINT `transferparticipant_transferid_foreign` FOREIGN KEY (`transferId`) REFERENCES `transfer` (`transferid`), + CONSTRAINT `transferparticipant_transferparticipantroletypeid_foreign` FOREIGN KEY (`transferParticipantRoleTypeId`) REFERENCES `transferParticipantRoleType` (`transferparticipantroletypeid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferParticipantRoleType` +-- + +DROP TABLE IF EXISTS `transferParticipantRoleType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `transferParticipantRoleType` ( + `transferParticipantRoleTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferParticipantRoleTypeId`), + UNIQUE KEY `transferparticipantroletype_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferRules` +-- + +DROP TABLE IF EXISTS `transferRules`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `transferRules` ( + `transferRulesId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(128) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `rule` text NOT NULL, + `enabled` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferRulesId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferState` +-- + +DROP TABLE IF EXISTS `transferState`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `transferState` ( + `transferStateId` varchar(50) NOT NULL, + `enumeration` varchar(50) NOT NULL COMMENT 'transferState associated to the Mojaloop API', + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferStateId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferStateChange` +-- + +DROP TABLE IF EXISTS `transferStateChange`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `transferStateChange` ( + `transferStateChangeId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `transferId` varchar(36) NOT NULL, + `transferStateId` varchar(50) NOT NULL, + `reason` varchar(512) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferStateChangeId`), + KEY `transferstatechange_transferid_index` (`transferId`), + KEY `transferstatechange_transferstateid_index` (`transferStateId`), + CONSTRAINT `transferstatechange_transferid_foreign` FOREIGN KEY (`transferId`) REFERENCES `transfer` (`transferid`), + CONSTRAINT `transferstatechange_transferstateid_foreign` FOREIGN KEY (`transferStateId`) REFERENCES `transferState` (`transferstateid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferTimeout` +-- + +DROP TABLE IF EXISTS `transferTimeout`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `transferTimeout` ( + `transferTimeoutId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `transferId` varchar(36) NOT NULL, + `expirationDate` datetime NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferTimeoutId`), + UNIQUE KEY `transfertimeout_transferid_unique` (`transferId`), + CONSTRAINT `transfertimeout_transferid_foreign` FOREIGN KEY (`transferId`) REFERENCES `transfer` (`transferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Final view structure for view `quotePartyView` +-- + +/*!50001 DROP VIEW IF EXISTS `quotePartyView`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`central_ledger`@`%` SQL SECURITY DEFINER */ +/*!50001 VIEW `quotePartyView` AS select `qp`.`quoteId` AS `quoteId`,`qp`.`quotePartyId` AS `quotePartyId`,`pt`.`name` AS `partyType`,`pit`.`name` AS `identifierType`,`qp`.`partyIdentifierValue` AS `partyIdentifierValue`,`spit`.`name` AS `partySubIdOrType`,`qp`.`fspId` AS `fspId`,`qp`.`merchantClassificationCode` AS `merchantClassificationCode`,`qp`.`partyName` AS `partyName`,`p`.`firstName` AS `firstName`,`p`.`lastName` AS `lastName`,`p`.`middleName` AS `middleName`,`p`.`dateOfBirth` AS `dateOfBirth`,`gc`.`longitude` AS `longitude`,`gc`.`latitude` AS `latitude` from (((((`quoteParty` `qp` join `partyType` `pt` on((`pt`.`partyTypeId` = `qp`.`partyTypeId`))) join `partyIdentifierType` `pit` on((`pit`.`partyIdentifierTypeId` = `qp`.`partyIdentifierTypeId`))) left join `party` `p` on((`p`.`quotePartyId` = `qp`.`quotePartyId`))) left join `partyIdentifierType` `spit` on((`spit`.`partyIdentifierTypeId` = `qp`.`partySubIdOrTypeId`))) left join `geoCode` `gc` on((`gc`.`quotePartyId` = `qp`.`quotePartyId`))) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; + +-- +-- Final view structure for view `quoteResponseView` +-- + +/*!50001 DROP VIEW IF EXISTS `quoteResponseView`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`central_ledger`@`%` SQL SECURITY DEFINER */ +/*!50001 VIEW `quoteResponseView` AS select `qr`.`quoteResponseId` AS `quoteResponseId`,`qr`.`quoteId` AS `quoteId`,`qr`.`transferAmountCurrencyId` AS `transferAmountCurrencyId`,`qr`.`transferAmount` AS `transferAmount`,`qr`.`payeeReceiveAmountCurrencyId` AS `payeeReceiveAmountCurrencyId`,`qr`.`payeeReceiveAmount` AS `payeeReceiveAmount`,`qr`.`payeeFspFeeCurrencyId` AS `payeeFspFeeCurrencyId`,`qr`.`payeeFspFeeAmount` AS `payeeFspFeeAmount`,`qr`.`payeeFspCommissionCurrencyId` AS `payeeFspCommissionCurrencyId`,`qr`.`payeeFspCommissionAmount` AS `payeeFspCommissionAmount`,`qr`.`ilpCondition` AS `ilpCondition`,`qr`.`responseExpirationDate` AS `responseExpirationDate`,`qr`.`isValid` AS `isValid`,`qr`.`createdDate` AS `createdDate`,`qrilp`.`value` AS `ilpPacket`,`gc`.`longitude` AS `longitude`,`gc`.`latitude` AS `latitude` from ((((`quoteResponse` `qr` join `quoteResponseIlpPacket` `qrilp` on((`qrilp`.`quoteResponseId` = `qr`.`quoteResponseId`))) join `quoteParty` `qp` on((`qp`.`quoteId` = `qr`.`quoteId`))) join `partyType` `pt` on((`pt`.`partyTypeId` = `qp`.`partyTypeId`))) left join `geoCode` `gc` on((`gc`.`quotePartyId` = `qp`.`quotePartyId`))) where (`pt`.`name` = 'PAYEE') */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; + +-- +-- Final view structure for view `quoteView` +-- + +/*!50001 DROP VIEW IF EXISTS `quoteView`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`central_ledger`@`%` SQL SECURITY DEFINER */ +/*!50001 VIEW `quoteView` AS select `q`.`quoteId` AS `quoteId`,`q`.`transactionReferenceId` AS `transactionReferenceId`,`q`.`transactionRequestId` AS `transactionRequestId`,`q`.`note` AS `note`,`q`.`expirationDate` AS `expirationDate`,`ti`.`name` AS `transactionInitiator`,`tit`.`name` AS `transactionInitiatorType`,`ts`.`name` AS `transactionScenario`,`q`.`balanceOfPaymentsId` AS `balanceOfPaymentsId`,`tss`.`name` AS `transactionSubScenario`,`amt`.`name` AS `amountType`,`q`.`amount` AS `amount`,`q`.`currencyId` AS `currency` from (((((`quote` `q` join `transactionInitiator` `ti` on((`ti`.`transactionInitiatorId` = `q`.`transactionInitiatorId`))) join `transactionInitiatorType` `tit` on((`tit`.`transactionInitiatorTypeId` = `q`.`transactionInitiatorTypeId`))) join `transactionScenario` `ts` on((`ts`.`transactionScenarioId` = `q`.`transactionScenarioId`))) join `amountType` `amt` on((`amt`.`amountTypeId` = `q`.`amountTypeId`))) left join `transactionSubScenario` `tss` on((`tss`.`transactionSubScenarioId` = `q`.`transactionSubScenarioId`))) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2019-10-14 21:12:45 diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/database/central-ledger-schema-DBeaver.erd b/docs/fr/technical/technical/central-bulk-transfers/assets/database/central-ledger-schema-DBeaver.erd new file mode 100644 index 000000000..12059bab5 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/database/central-ledger-schema-DBeaver.erd @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + COLOR LEGEND: +Green - subject specific entity +Gray - transfer specific entity +Brown - bulk transfer entity +Red - settlement specific entity +Blue - lookup entity +Cyan - impl. specific +Yellow - tbd + + \ No newline at end of file diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/database/central-ledger-schema.png b/docs/fr/technical/technical/central-bulk-transfers/assets/database/central-ledger-schema.png new file mode 100644 index 000000000..6afdaf2ea Binary files /dev/null and b/docs/fr/technical/technical/central-bulk-transfers/assets/database/central-ledger-schema.png differ diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/architecture/Figure60-Example-Bulk-Transfer-Process-Spec1.0.png b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/architecture/Figure60-Example-Bulk-Transfer-Process-Spec1.0.png new file mode 100644 index 000000000..aa361a64a Binary files /dev/null and b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/architecture/Figure60-Example-Bulk-Transfer-Process-Spec1.0.png differ diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/architecture/bulk-transfer-arch-flows.svg b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/architecture/bulk-transfer-arch-flows.svg new file mode 100644 index 000000000..b22f23afe --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/architecture/bulk-transfer-arch-flows.svg @@ -0,0 +1,3 @@ + + +
    1.7 Increment Position (fsp1)
    [Not supported by viewer]
    1.6 Increment
    Position (fsp1)

    [Not supported by viewer]
    Fulfil
    Sucess
    [Not supported by viewer]
    2.6 Fulfil
    Success
    [Not supported by viewer]
    <alt> 2.6  Fulfil Reject
    [Not supported by viewer]
    Fulfil
    Reject
    [Not supported by viewer]
    <alt> 2.7 Decrement
    Position (fsp1)

    [Not supported by viewer]
    Central - Services
    <font style="font-size: 18px">Central - Services</font>
    3.0 Reject
    [Not supported by viewer]
    1.0 Bulk Transfer 
    Request

    [Not supported by viewer]
    3.1 Decrement
    Position (fsp1)

    [Not supported by viewer]
    ML-Adapter
    [Not supported by viewer]
    Bulk Transfer
    Bulk Transfer<br>
    Notification
    Event Handler
    [Not supported by viewer]
    notifications
    notifications
    FSP1
    (Payer)

    [Not supported by viewer]
    FSP2
    (Payee)
    [Not supported by viewer]
    1.1
    Prepare Request
    [Not supported by viewer]
    1.2 Accpeted
    (202)
    [Not supported by viewer]
    Bulk Transfer
    Bulk Transfer<br>
    2.0 Bulk Fulfil 
    Success / 
    Reject

    [Not supported by viewer]
    bulk fulfil
    bulk fulfil
    2.7 Decrement
    Position (fsp2)

    [Not supported by viewer]
    2.1 Bulk Fulfil 
    Success / Reject

    [Not supported by viewer]
    2.2 OK
    (202)
    [Not supported by viewer]
    OK (200)
    [Not supported by viewer]
    OK (200)
    [Not supported by viewer]
    Transfer Timeout
    Handler
    [Not supported by viewer]
    2.12 Bulk Fulfil Notify Callback /
    <alt> 2.12 Bulk Reject Response (Fulfil reject) /
    3.6 Bulk Reject Response (Timeout) /
    <alt> 1.8 Bulk Prepare Failure 
    [Not supported by viewer]
    1.12 Bulk Prepare Notify /
    2.13 Bulk Fulfil Notify /
    <alt> 2.13 Bulk Reject Response (Fulfil reject)
    3.7 Bulk Reject Response (Timeout)

    [Not supported by viewer]
    positions
    positions<br>
    bulk processing
    bulk processing
    BulkFulfil
    Handler
    [Not supported by viewer]
    1.3 Bulk Prepare Consume
    [Not supported by viewer]
    BulkPrepare
    Handler
    BulkPrepare<br>Handler
     prepare
     prepare
    fulfil
    fulfil
    BulkProcessing Handler
    BulkProcessing Handler<br>
    1.4 Individual Prepare
    [Not supported by viewer]
    1.5 Individual Prepare
    [Not supported by viewer]
    1.5
     / 1.9 / 2.9 / 3.3
     Individual Notify
    [Not supported by viewer]
    1.8 / 2.8 / 3.2 Individual
    Notify
    [Not supported by viewer]
    1.6 / 1.10 / 2.10 / 3.4 Bulk Notify
    [Not supported by viewer]
    1.7 / 1.11 / 2.11 / 3.5 Bulk Notify
    [Not supported by viewer]
    2.3 Bulk Fulfil Consume
    [Not supported by viewer]
    2.4 Individual
    Fulfil
    [Not supported by viewer]
    2.5 Individual
    Fulfil
    [Not supported by viewer]
    FulfilHandler
    FulfilHandler
    Success/
    Reject
    [Not supported by viewer]
    PositionHandler
    PositionHandler
    PrepareHandler
    PrepareHandler
    Object Store
    [Not supported by viewer]
    <alt> 1.4 Bulk Prepare Failure
    [Not supported by viewer]
    <alt> 1.6 Individual Prepare Failure
    [Not supported by viewer]
    <alt> 1.8 Individual
    Failure Notify

    [Not supported by viewer]
    <alt> 2.4 Bulk Fulfil Failure
    [Not supported by viewer]
    <alt> 2.6 Individual Fulfil Failure
    [Not supported by viewer]
    bulk prepare
    bulk prepare
    Object Store
    [Not supported by viewer]
    Object Store
    [Not supported by viewer]
    \ No newline at end of file diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.1.0-bulk-prepare-overview.plantuml b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.1.0-bulk-prepare-overview.plantuml new file mode 100644 index 000000000..5bdd8119f --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.1.0-bulk-prepare-overview.plantuml @@ -0,0 +1,217 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Samuel Kummary + -------------- + ******'/ + +@startuml +' declare title +title 1.1.0. DFSP1 sends a Bulk Prepare Transfer request to DFSP2 + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +actor "DFSP1\nPayer" as DFSP1 +actor "DFSP2\nPayee" as DFSP2 +boundary "Bulk API Adapter" as BULK_API +control "Bulk API Notification \nHandler" as NOTIFY_HANDLER +collections "mojaloop-\nobject-store\n(**MLOS**)" as OBJECT_STORE +boundary "Central Service API" as CSAPI +collections "topic-\nbulk-prepare" as TOPIC_BULK_PREPARE +control "Bulk Prepare\nHandler" as BULK_PREP_HANDLER +collections "topic-\ntransfer-prepare" as TOPIC_TRANSFER_PREPARE +control "Prepare Handler" as PREP_HANDLER +collections "topic-\ntransfer-position" as TOPIC_TRANSFER_POSITION +control "Position Handler" as POS_HANDLER +collections "topic-\nbulk-processing" as TOPIC_BULK_PROCESSING +control "Bulk Processing\nHandler" as BULK_PROC_HANDLER +collections "topic-\nnotifications" as TOPIC_NOTIFICATIONS + +box "Financial Service Providers" #lightGray + participant DFSP1 + participant DFSP2 +end box + +box "Bulk API Adapter Service" #LightBlue + participant BULK_API + participant NOTIFY_HANDLER +end box + +box "Central Service" #LightYellow + participant OBJECT_STORE + participant CSAPI + participant TOPIC_BULK_PREPARE + participant BULK_PREP_HANDLER + participant TOPIC_TRANSFER_PREPARE + participant PREP_HANDLER + participant TOPIC_TRANSFER_POSITION + participant POS_HANDLER + participant TOPIC_BULK_PROCESSING + participant BULK_PROC_HANDLER + participant TOPIC_NOTIFICATIONS +end box + +' start flow +activate NOTIFY_HANDLER +activate BULK_PREP_HANDLER +activate PREP_HANDLER +activate POS_HANDLER +activate BULK_PROC_HANDLER +group DFSP1 sends a Bulk Prepare Transfer request to DFSP2 + note right of DFSP1 #yellow + Headers - transferHeaders: { + Content-Length: , + Content-Type: , + Date: , + FSPIOP-Source: , + FSPIOP-Destination: , + FSPIOP-Encryption: , + FSPIOP-Signature: , + FSPIOP-URI: , + FSPIOP-HTTP-Method: + } + + Payload - bulkTransferMessage: + { + bulkTransferId: , + bulkQuoteId: , + payeeFsp: , + payerFsp: , + individualTransfers: [ + { + transferId: , + transferAmount: + { + currency: , + amount: + }, + ilpPacket: , + condition: , + extensionList: { extension: [ + { key: , value: } + ] } + } + ], + extensionList: { extension: [ + { key: , value: } + ] }, + expiration: + } + end note + DFSP1 ->> BULK_API: POST - /bulkTransfers + activate BULK_API + BULK_API -> BULK_API: Validate incoming message\nError codes: 3000-3002, 3100-3107 + loop + BULK_API -> OBJECT_STORE: Persist individual transfers in the bulk to\nobject store: **MLOS.individualTransfers** + activate OBJECT_STORE + OBJECT_STORE --> BULK_API: Return messageId reference to the stored object(s) + deactivate OBJECT_STORE + end + note right of BULK_API #yellow + Message: + { + id: + to: , + from: , + type: "application/json" + content: { + headers: , + payload: { + bulkTransferId: , + bulkQuoteId": , + payerFsp: , + payeeFsp: , + expiration: , + hash: + } + }, + metadata: { + event: { + id: , + type: "bulk-prepare", + action: "bulk-prepare", + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + BULK_API -> TOPIC_BULK_PREPARE: Route & Publish Bulk Prepare event \nfor Payer\nError code: 2003 + activate TOPIC_BULK_PREPARE + TOPIC_BULK_PREPARE <-> TOPIC_BULK_PREPARE: Ensure event is replicated \nas configured (ACKS=all)\nError code: 2003 + TOPIC_BULK_PREPARE --> BULK_API: Respond replication acknowledgements \nhave been received + deactivate TOPIC_BULK_PREPARE + BULK_API -->> DFSP1: Respond HTTP - 202 (Accepted) + deactivate BULK_API + ||| + TOPIC_BULK_PREPARE <- BULK_PREP_HANDLER: Consume message + ref over TOPIC_BULK_PREPARE, BULK_PREP_HANDLER, TOPIC_TRANSFER_PREPARE: Bulk Prepare Handler Consume \n + alt Success + BULK_PREP_HANDLER -> TOPIC_TRANSFER_PREPARE: Produce (stream) single transfer message\nfor each individual transfer [loop] + else Failure + BULK_PREP_HANDLER --> TOPIC_NOTIFICATIONS: Produce single message for the entire bulk + end + ||| + TOPIC_TRANSFER_PREPARE <- PREP_HANDLER: Consume message + ref over TOPIC_TRANSFER_PREPARE, PREP_HANDLER, TOPIC_TRANSFER_POSITION: Prepare Handler Consume\n + alt Success + PREP_HANDLER -> TOPIC_TRANSFER_POSITION: Produce message + else Failure + PREP_HANDLER --> TOPIC_BULK_PROCESSING: Produce message + end + ||| + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consume message + ref over TOPIC_TRANSFER_POSITION, POS_HANDLER, TOPIC_BULK_PROCESSING: Position Handler Consume\n + POS_HANDLER -> TOPIC_BULK_PROCESSING: Produce message + ||| + TOPIC_BULK_PROCESSING <- BULK_PROC_HANDLER: Consume message + ref over TOPIC_BULK_PROCESSING, BULK_PROC_HANDLER, TOPIC_NOTIFICATIONS: Bulk Processing Handler Consume\n + BULK_PROC_HANDLER -> OBJECT_STORE: Persist bulk message by destination to the\nobject store: **MLOS.bulkTransferResults** + activate OBJECT_STORE + OBJECT_STORE --> BULK_PROC_HANDLER: Return the reference to the stored \nnotification object(s): **messageId** + deactivate OBJECT_STORE + BULK_PROC_HANDLER -> TOPIC_NOTIFICATIONS: Send Bulk Prepare notification + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consume message + NOTIFY_HANDLER -> OBJECT_STORE: Retrieve bulk notification(s) by reference & destination:\n**MLOS.bulkTransferResults.messageId + destination** + activate OBJECT_STORE + OBJECT_STORE --> NOTIFY_HANDLER: Return notification(s) payload + deactivate OBJECT_STORE + ref over DFSP2, TOPIC_NOTIFICATIONS: Send notification to Participant (Payee)\n + NOTIFY_HANDLER -> DFSP2: Send Bulk Prepare notification to Payee + ||| +end +deactivate POS_HANDLER +deactivate BULK_PREP_HANDLER +deactivate PREP_HANDLER +deactivate BULK_PROC_HANDLER +deactivate NOTIFY_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.1.0-bulk-prepare-overview.svg b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.1.0-bulk-prepare-overview.svg new file mode 100644 index 000000000..9c52a416a --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.1.0-bulk-prepare-overview.svg @@ -0,0 +1,405 @@ + + 1.1.0. DFSP1 sends a Bulk Prepare Transfer request to DFSP2 + + + 1.1.0. DFSP1 sends a Bulk Prepare Transfer request to DFSP2 + + Financial Service Providers + + Bulk API Adapter Service + + Central Service + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DFSP1 + Payer + + + DFSP1 + Payer + + + DFSP2 + Payee + + + DFSP2 + Payee + + + Bulk API Adapter + + + Bulk API Adapter + + + Bulk API Notification + Handler + + + Bulk API Notification + Handler + + + + + mojaloop- + object-store + ( + MLOS + ) + + + mojaloop- + object-store + ( + MLOS + ) + Central Service API + + + Central Service API + + + + + topic- + bulk-prepare + + + topic- + bulk-prepare + Bulk Prepare + Handler + + + Bulk Prepare + Handler + + + + + topic- + transfer-prepare + + + topic- + transfer-prepare + Prepare Handler + + + Prepare Handler + + + + + topic- + transfer-position + + + topic- + transfer-position + Position Handler + + + Position Handler + + + + + topic- + bulk-processing + + + topic- + bulk-processing + Bulk Processing + Handler + + + Bulk Processing + Handler + + + + + topic- + notifications + + + topic- + notifications + + + + + + + + + + + + + DFSP1 sends a Bulk Prepare Transfer request to DFSP2 + + + Headers - transferHeaders: { + Content-Length: <int>, + Content-Type: <string>, + Date: <date>, + FSPIOP-Source: <string>, + FSPIOP-Destination: <string>, + FSPIOP-Encryption: <string>, + FSPIOP-Signature: <string>, + FSPIOP-URI: <uri>, + FSPIOP-HTTP-Method: <string> + } +   + Payload - bulkTransferMessage: + { + bulkTransferId: <uuid>, + bulkQuoteId: <uuid>, + payeeFsp: <string>, + payerFsp: <string>, + individualTransfers: [ + { + transferId: <uuid>, + transferAmount: + { + currency: <string>, + amount: <string> + }, + ilpPacket: <string>, + condition: <string>, + extensionList: { extension: [ + { key: <string>, value: <string> } + ] } + } + ], + extensionList: { extension: [ + { key: <string>, value: <string> } + ] }, + expiration: <string> + } + + + + 1 + POST - /bulkTransfers + + + + + 2 + Validate incoming message + Error codes: + 3000-3002, 3100-3107 + + + loop + + + 3 + Persist individual transfers in the bulk to + object store: + MLOS.individualTransfers + + + 4 + Return messageId reference to the stored object(s) + + + Message: + { + id: <messageId> + to: <payeeFspName>, + from: <payerFspName>, + type: "application/json" + content: { + headers: <bulkTransferHeaders>, + payload: { + bulkTransferId: <uuid>, + bulkQuoteId": <uuid>, + payerFsp: <string>, + payeeFsp: <string>, + expiration: <timestamp>, + hash: <string> + } + }, + metadata: { + event: { + id: <uuid>, + type: "bulk-prepare", + action: "bulk-prepare", + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 5 + Route & Publish Bulk Prepare event + for Payer + Error code: + 2003 + + + + + + 6 + Ensure event is replicated + as configured (ACKS=all) + Error code: + 2003 + + + 7 + Respond replication acknowledgements + have been received + + + + 8 + Respond HTTP - 202 (Accepted) + + + 9 + Consume message + + + ref + Bulk Prepare Handler Consume +   + + + alt + [Success] + + + 10 + Produce (stream) single transfer message + for each individual transfer [loop] + + [Failure] + + + 11 + Produce single message for the entire bulk + + + 12 + Consume message + + + ref + Prepare Handler Consume +   + + + alt + [Success] + + + 13 + Produce message + + [Failure] + + + 14 + Produce message + + + 15 + Consume message + + + ref + Position Handler Consume +   + + + 16 + Produce message + + + 17 + Consume message + + + ref + Bulk Processing Handler Consume +   + + + 18 + Persist bulk message by destination to the + object store: + MLOS.bulkTransferResults + + + 19 + Return the reference to the stored + notification object(s): + messageId + + + 20 + Send Bulk Prepare notification + + + 21 + Consume message + + + 22 + Retrieve bulk notification(s) by reference & destination: + MLOS.bulkTransferResults.messageId + destination + + + 23 + Return notification(s) payload + + + ref + Send notification to Participant (Payee) +   + + + 24 + Send Bulk Prepare notification to Payee + + diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.1.1-bulk-prepare-handler.plantuml b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.1.1-bulk-prepare-handler.plantuml new file mode 100644 index 000000000..a9c53292f --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.1.1-bulk-prepare-handler.plantuml @@ -0,0 +1,320 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Samuel Kummary + -------------- + ******'/ + +@startuml +' declare title +title 1.1.1. Bulk Prepare Handler Consume + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +collections "topic-\nbulk-prepare" as TOPIC_BULK_PREPARE +collections "mojaloop-\nobject-store\n(**MLOS**)" as OBJECT_STORE +control "Bulk Prepare \nHandler" as BULK_PREP_HANDLER +collections "topic-\ntransfer-prepare" as TOPIC_TRANSFER_PREPARE +collections "topic-event" as TOPIC_EVENTS +collections "topic-\nnotification" as TOPIC_NOTIFICATIONS +collections "topic-bulk-\nprocessing" as TOPIC_BULK_PROCESSING +entity "Bulk DAO" as BULK_DAO +entity "Participant DAO" as PARTICIPANT_DAO +database "Central Store" as DB + +box "Central Service" #LightYellow + participant OBJECT_STORE + participant TOPIC_BULK_PREPARE + participant BULK_PREP_HANDLER + participant TOPIC_TRANSFER_PREPARE + participant TOPIC_EVENTS + participant TOPIC_NOTIFICATIONS + participant TOPIC_BULK_PROCESSING + participant BULK_DAO + participant PARTICIPANT_DAO + participant DB +end box + +' start flow +activate BULK_PREP_HANDLER +group Bulk Prepare Handler Consume + TOPIC_BULK_PREPARE <- BULK_PREP_HANDLER: Consume Bulk Prepare message + activate TOPIC_BULK_PREPARE + deactivate TOPIC_BULK_PREPARE + group Validate Bulk Prepare Transfer + group Duplicate Check + note right of BULK_PREP_HANDLER #cyan + The Specification doesn't touch on the duplicate handling + of bulk transfers, so the current design mostly follows the + strategy used for individual transfers, except in two places: + + 1. For duplicate requests where hash matches, the current design + includes only the status of the bulk & timestamp (if completed), + but not the individual transfers (for which a GET should be used). + + 2. For duplicate requests where hash matches, but are not in a + finalized state, only the state of the bulkTransfer is sent. + end note + ||| + BULK_PREP_HANDLER -> DB: Request Duplicate Check + ref over BULK_PREP_HANDLER, DB: Request Duplicate Check (using message.content.payload)\n + DB --> BULK_PREP_HANDLER: Return { hasDuplicateId: Boolean, hasDuplicateHash: Boolean } + end + + alt hasDuplicateId == TRUE && hasDuplicateHash == TRUE + break Return TRUE & Log ('Not implemented') + end + else hasDuplicateId == TRUE && hasDuplicateHash == FALSE + note right of BULK_PREP_HANDLER #yellow + { + id: , + from: , + to: , + type: "application/json", + content: { + headers: , + payload: { + errorInformation: { + errorCode: "3106", + errorDescription: "Modified request", + extensionList: { + extension: [ + { + key: "_cause", + value: + } + ] + } + }, + uriParams: { + id: + } + } + }, + metadata: { + correlationId: , + event: { + id: , + type: "notification", + action: "bulk-prepare", + createdAt: , + state: { + status: "error", + code: "3106", + description: "Modified request" + }, + responseTo: + } + } + } + end note + BULK_PREP_HANDLER -> TOPIC_NOTIFICATIONS: Publish Notification (failure) event for Payer\nError codes: 3106 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + else hasDuplicateId == FALSE + group Validate Bulk Transfer Prepare Request + BULK_PREP_HANDLER <-> BULK_PREP_HANDLER: FSPIOP Source matches Payer + BULK_PREP_HANDLER <-> BULK_PREP_HANDLER: Check expiration + BULK_PREP_HANDLER <-> BULK_PREP_HANDLER: Payer and Payee FSP's are different + group Validate Payer + BULK_PREP_HANDLER -> PARTICIPANT_DAO: Request to retrieve Payer Participant details (if it exists) + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Request Participant details + hnote over DB #lightyellow + participant + participantCurrency + end note + activate DB + PARTICIPANT_DAO <-- DB: Return Participant details if it exists + deactivate DB + PARTICIPANT_DAO --> BULK_PREP_HANDLER: Return Participant details if it exists + deactivate PARTICIPANT_DAO + BULK_PREP_HANDLER <-> BULK_PREP_HANDLER: Validate Payer\nError codes: 3202 + end + group Validate Payee + BULK_PREP_HANDLER -> PARTICIPANT_DAO: Request to retrieve Payee Participant details (if it exists) + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Request Participant details + hnote over DB #lightyellow + participant + participantCurrency + end note + activate DB + PARTICIPANT_DAO <-- DB: Return Participant details if it exists + deactivate DB + PARTICIPANT_DAO --> BULK_PREP_HANDLER: Return Participant details if it exists + deactivate PARTICIPANT_DAO + BULK_PREP_HANDLER <-> BULK_PREP_HANDLER: Validate Payee\nError codes: 3203 + end + end + ||| + alt Validate Bulk Transfer Prepare Request (success) + group Persist Bulk Transfer State (with bulkTransferState='RECEIVED') + BULK_PREP_HANDLER -> BULK_DAO: Request to persist bulk transfer\nError codes: 2003 + activate BULK_DAO + BULK_DAO -> DB: Persist bulkTransfer + hnote over DB #lightyellow + bulkTransfer + bulkTransferExtension + bulkTransferStateChange + end note + activate DB + deactivate DB + BULK_DAO --> BULK_PREP_HANDLER: Return state + deactivate BULK_DAO + end + else Validate Bulk Transfer Prepare Request (failure) + group Persist Bulk Transfer State (with bulkTransferState='INVALID') (Introducing a new status INVALID to mark these entries) + BULK_PREP_HANDLER -> BULK_DAO: Request to persist bulk transfer\n(when Payee/Payer/crypto-condition validation fails)\nError codes: 2003 + activate BULK_DAO + BULK_DAO -> DB: Persist transfer + hnote over DB #lightyellow + bulkTransfer + bulkTransferExtension + bulkTransferStateChange + bulkTransferError + end note + activate DB + deactivate DB + BULK_DAO --> BULK_PREP_HANDLER: Return state + deactivate BULK_DAO + end + end + end + end + alt Validate Bulk Prepare Transfer (success) + loop for each individual transfer in the bulk + BULK_PREP_HANDLER -> OBJECT_STORE: Retrieve individual transfers from the bulk using\nreference: **MLOS.individualTransfers.messageId** + activate OBJECT_STORE + note right of OBJECT_STORE #lightgrey + Add elements such as Expiry time, Payer FSP, Payee FSP, etc. to each + transfer to make their format similar to a single transfer + end note + OBJECT_STORE --> BULK_PREP_HANDLER: Stream bulk's individual transfers + deactivate OBJECT_STORE + + group Insert Bulk Transfer Association (with bulkProcessingState='RECEIVED') + BULK_PREP_HANDLER -> BULK_DAO: Request to persist bulk transfer association\nError codes: 2003 + activate BULK_DAO + BULK_DAO -> DB: Insert bulkTransferAssociation + hnote over DB #lightyellow + bulkTransferAssociation + bulkTransferStateChange + end note + activate DB + deactivate DB + BULK_DAO --> BULK_PREP_HANDLER: Return state + deactivate BULK_DAO + end + + note right of BULK_PREP_HANDLER #yellow + Message: + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: "prepare", + action: "bulk-prepare", + createdAt: , + state: { + status: "success", + code: 0, + description:"action successful" + } + } + } + } + end note + BULK_PREP_HANDLER -> TOPIC_TRANSFER_PREPARE: Route & Publish Prepare event to the Payee for the Individual Transfer\nError codes: 2003 + activate TOPIC_TRANSFER_PREPARE + deactivate TOPIC_TRANSFER_PREPARE + end + else Validate Bulk Prepare Transfer (failure) + note right of BULK_PREP_HANDLER #yellow + Message: + { + id: + from: , + to: , + type: "application/json", + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": + "errorDescription": "", + "extensionList": + } + }, + metadata: { + event: { + id: , + responseTo: , + type: "bulk-processing", + action: "bulk-abort", + createdAt: , + state: { + status: "error", + code: + description: + } + } + } + } + end note + BULK_PREP_HANDLER -> TOPIC_BULK_PROCESSING: Publish Processing (failure) event for Payer\nError codes: 2003 + activate TOPIC_BULK_PROCESSING + deactivate TOPIC_BULK_PROCESSING + group Insert Bulk Transfer Association (with bulkProcessingState='INVALID') + BULK_PREP_HANDLER -> BULK_DAO: Request to persist bulk transfer association\nError codes: 2003 + activate BULK_DAO + BULK_DAO -> DB: Insert bulkTransferAssociation + hnote over DB #lightyellow + bulkTransferAssociation + bulkTransferStateChange + end note + activate DB + deactivate DB + BULK_DAO --> BULK_PREP_HANDLER: Return state + deactivate BULK_DAO + end + + end +end +deactivate BULK_PREP_HANDLER +@enduml + diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.1.1-bulk-prepare-handler.svg b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.1.1-bulk-prepare-handler.svg new file mode 100644 index 000000000..ac272e017 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.1.1-bulk-prepare-handler.svg @@ -0,0 +1,518 @@ + + 1.1.1. Bulk Prepare Handler Consume + + + 1.1.1. Bulk Prepare Handler Consume + + Central Service + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + mojaloop- + object-store + ( + MLOS + ) + + + mojaloop- + object-store + ( + MLOS + ) + + + topic- + bulk-prepare + + + topic- + bulk-prepare + Bulk Prepare + Handler + + + Bulk Prepare + Handler + + + + + topic- + transfer-prepare + + + topic- + transfer-prepare + + + topic-event + + + topic-event + + + topic- + notification + + + topic- + notification + + + topic-bulk- + processing + + + topic-bulk- + processing + Bulk DAO + + + Bulk DAO + + + Participant DAO + + + Participant DAO + + + Central Store + + + Central Store + + + + + + + + + + + + + + + + + + + + + + + Bulk Prepare Handler Consume + + + 1 + Consume Bulk Prepare message + + + Validate Bulk Prepare Transfer + + + Duplicate Check + + + The Specification doesn't touch on the duplicate handling + of bulk transfers, so the current design mostly follows the + strategy used for individual transfers, except in two places: +   + 1. For duplicate requests where hash matches, the current design + includes only the status of the bulk & timestamp (if completed), + but not the individual transfers (for which a GET should be used). +   + 2. For duplicate requests where hash matches, but are not in a + finalized state, only the state of the bulkTransfer is sent. + + + 2 + Request Duplicate Check + + + ref + Request Duplicate Check (using message.content.payload) +   + + + 3 + Return { hasDuplicateId: Boolean, hasDuplicateHash: Boolean } + + + alt + [hasDuplicateId == TRUE && hasDuplicateHash == TRUE] + + + break + [Return TRUE & Log ('Not implemented')] + + [hasDuplicateId == TRUE && hasDuplicateHash == FALSE] + + + { + id: <messageId>, + from: <ledgerName>, + to: <payerFspName>, + type: "application/json", + content: { + headers: <bulkTransferHeaders>, + payload: { + errorInformation: { + errorCode: "3106", + errorDescription: "Modified request", + extensionList: { + extension: [ + { + key: "_cause", + value: <FSPIOPError> + } + ] + } + }, + uriParams: { + id: <bulkTransferId> + } + } + }, + metadata: { + correlationId: <uuid>, + event: { + id: <uuid>, + type: "notification", + action: "bulk-prepare", + createdAt: <timestamp>, + state: { + status: "error", + code: "3106", + description: "Modified request" + }, + responseTo: <uuid> + } + } + } + + + 4 + Publish Notification (failure) event for Payer + Error codes: + 3106 + + [hasDuplicateId == FALSE] + + + Validate Bulk Transfer Prepare Request + + + + + + 5 + FSPIOP Source matches Payer + + + + + + 6 + Check expiration + + + + + + 7 + Payer and Payee FSP's are different + + + Validate Payer + + + 8 + Request to retrieve Payer Participant details (if it exists) + + + 9 + Request Participant details + + participant + participantCurrency + + + 10 + Return Participant details if it exists + + + 11 + Return Participant details if it exists + + + + + + 12 + Validate Payer + Error codes: + 3202 + + + Validate Payee + + + 13 + Request to retrieve Payee Participant details (if it exists) + + + 14 + Request Participant details + + participant + participantCurrency + + + 15 + Return Participant details if it exists + + + 16 + Return Participant details if it exists + + + + + + 17 + Validate Payee + Error codes: + 3203 + + + alt + [Validate Bulk Transfer Prepare Request (success)] + + + Persist Bulk Transfer State (with bulkTransferState='RECEIVED') + + + 18 + Request to persist bulk transfer + Error codes: + 2003 + + + 19 + Persist bulkTransfer + + bulkTransfer + bulkTransferExtension + bulkTransferStateChange + + + 20 + Return state + + [Validate Bulk Transfer Prepare Request (failure)] + + + Persist Bulk Transfer State (with bulkTransferState='INVALID') (Introducing a new status INVALID to mark these entries) + + + 21 + Request to persist bulk transfer + (when Payee/Payer/crypto-condition validation fails) + Error codes: + 2003 + + + 22 + Persist transfer + + bulkTransfer + bulkTransferExtension + bulkTransferStateChange + bulkTransferError + + + 23 + Return state + + + alt + [Validate Bulk Prepare Transfer (success)] + + + loop + [for each individual transfer in the bulk] + + + 24 + Retrieve individual transfers from the bulk using + reference: + MLOS.individualTransfers.messageId + + + Add elements such as Expiry time, Payer FSP, Payee FSP, etc. to each + transfer to make their format similar to a single transfer + + + 25 + Stream bulk's individual transfers + + + Insert Bulk Transfer Association (with bulkProcessingState='RECEIVED') + + + 26 + Request to persist bulk transfer association + Error codes: + 2003 + + + 27 + Insert bulkTransferAssociation + + bulkTransferAssociation + bulkTransferStateChange + + + 28 + Return state + + + Message: + { + id: <messageId> + from: <payerFspName>, + to: <payeeFspName>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: "prepare", + action: "bulk-prepare", + createdAt: <timestamp>, + state: { + status: "success", + code: 0, + description:"action successful" + } + } + } + } + + + 29 + Route & Publish Prepare event to the Payee for the Individual Transfer + Error codes: + 2003 + + [Validate Bulk Prepare Transfer (failure)] + + + Message: + { + id: <messageId> + from: <ledgerName>, + to: <bulkTransferMessage.payerFsp>, + type: "application/json", + content: { + headers: <bulkTransferHeaders>, + payload: { + "errorInformation": { + "errorCode": <possible codes: [2003, 3100, 3105, 3106, 3202, 3203, 3300, 3301]> + "errorDescription": "<refer to section 7.6 for description>", + "extensionList": <transferMessage.extensionList> + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: "bulk-processing", + action: "bulk-abort", + createdAt: <timestamp>, + state: { + status: "error", + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 30 + Publish Processing (failure) event for Payer + Error codes: + 2003 + + + Insert Bulk Transfer Association (with bulkProcessingState='INVALID') + + + 31 + Request to persist bulk transfer association + Error codes: + 2003 + + + 32 + Insert bulkTransferAssociation + + bulkTransferAssociation + bulkTransferStateChange + + + 33 + Return state + + diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.2.1-prepare-handler.plantuml b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.2.1-prepare-handler.plantuml new file mode 100644 index 000000000..aee02560a --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.2.1-prepare-handler.plantuml @@ -0,0 +1,324 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Miguel de Barros + * Rajiv Mothilal + * Samuel Kummary + * Shashikant Hirugade + -------------- + ******'/ + +@startuml +' declate title +title 1.2.1. Prepare Handler Consume individual transfers from Bulk + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +collections "topic-\ntransfer-prepare" as TOPIC_TRANSFER_PREPARE +control "Prepare Handler" as PREP_HANDLER +collections "topic-\ntransfer-position" as TOPIC_TRANSFER_POSITION +collections "topic-\nbulk-processing" as TOPIC_BULK_PROCESSING +collections "topic-\nevent" as TOPIC_EVENTS +collections "topic-\nnotification" as TOPIC_NOTIFICATIONS +entity "Position DAO" as POS_DAO +entity "Participant DAO" as PARTICIPANT_DAO +database "Central Store" as DB + +box "Central Service" #LightYellow + participant TOPIC_TRANSFER_PREPARE + participant PREP_HANDLER + participant TOPIC_TRANSFER_POSITION + participant TOPIC_EVENTS + participant TOPIC_NOTIFICATIONS + participant TOPIC_BULK_PROCESSING + participant POS_DAO + participant PARTICIPANT_DAO + participant DB +end box + +' start flow +activate PREP_HANDLER +group Prepare Handler Consume + TOPIC_TRANSFER_PREPARE <- PREP_HANDLER: Consume Prepare event message + activate TOPIC_TRANSFER_PREPARE + deactivate TOPIC_TRANSFER_PREPARE + + break + group Validate Event + PREP_HANDLER <-> PREP_HANDLER: Validate event - Rule: type == 'prepare' && action == 'bulk-prepare'\nError codes: 2001 + end + end + + group Persist Event Information + ||| + PREP_HANDLER -> TOPIC_EVENTS: Publish event information + ref over PREP_HANDLER, TOPIC_EVENTS : Event Handler Consume\n + ||| + end + + group Validate Prepare Transfer + PREP_HANDLER <-> PREP_HANDLER: Schema validation of the incoming message + PREP_HANDLER <-> PREP_HANDLER: Verify the message's signature (to be confirmed in future requirement) + + group Validate Duplicate Check + ||| + PREP_HANDLER -> DB: Request Duplicate Check + ref over PREP_HANDLER, DB: Request Duplicate Check\n + DB --> PREP_HANDLER: Return { hasDuplicateId: Boolean, hasDuplicateHash: Boolean } + end + + alt hasDuplicateId == TRUE && hasDuplicateHash == TRUE + note right of PREP_HANDLER #lightgrey + In the context of a bulk (when compared to regular transfers), duplicate + individual transfers are now considered and reported with Modified Request, + because they could have already been handled for another bulk. + end note + break + note right of PREP_HANDLER #yellow + { + id: + from: , + to: , + type: "application/json", + content: { + headers: , + payload: { + errorInformation: { + errorCode: "3106", + errorDescription: "Modified request - Individual transfer prepare duplicate", + extensionList: { extension: [ { key: "_cause", value: } ] } + } + }, + uriParams: { id: } + }, + metadata: { + correlationId: , + event: { + type: "bulk-processing", + action: "prepare-duplicate", + createdAt: , + state: { + code: "3106", + status: "error", + description: "Modified request - Individual transfer prepare duplicate" + }, + id: , + responseTo: + } + } + end note + PREP_HANDLER -> TOPIC_BULK_PROCESSING: Publish Processing (failure) event for Payer\nError codes: 2003 + activate TOPIC_BULK_PROCESSING + deactivate TOPIC_BULK_PROCESSING + end + else hasDuplicateId == TRUE && hasDuplicateHash == FALSE + break + note right of PREP_HANDLER #yellow + { + id: + from: , + to: , + type: "application/json", + content: { + headers: , + payload: { + errorInformation: { + errorCode: "3106", + errorDescription: "Modified request", + extensionList: { extension: [ { key: "_cause", value: } ] } + } + }, + uriParams: { id: } + }, + metadata: { + correlationId: , + event: { + type: "bulk-processing", + action: "prepare-duplicate", + createdAt: , + state: { + code: "3106", + status: "error", + description: "Modified request" + }, + id: , + responseTo: + } + } + end note + PREP_HANDLER -> TOPIC_BULK_PROCESSING: Publish Processing (failure) event for Payer\nError codes: 2003 + activate TOPIC_BULK_PROCESSING + deactivate TOPIC_BULK_PROCESSING + end + else hasDuplicateId == FALSE + note right of PREP_HANDLER #lightgrey + The validation of Payer, Payee can be skipped for individual transfers in Bulk + as they should've/would've been validated already in the bulk prepare part. + However, leaving it here for now, as in the future, this can be leveraged + when bulk transfers to multiple Payees are supported by the Specification. + end note + group Validate Payer + PREP_HANDLER -> PARTICIPANT_DAO: Request to retrieve Payer Participant details (if it exists) + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Request Participant details + hnote over DB #lightyellow + participant + participantCurrency + end note + activate DB + PARTICIPANT_DAO <-- DB: Return Participant details if it exists + deactivate DB + PARTICIPANT_DAO --> PREP_HANDLER: Return Participant details if it exists + deactivate PARTICIPANT_DAO + PREP_HANDLER <-> PREP_HANDLER: Validate Payer\nError codes: 3202 + end + group Validate Payee + PREP_HANDLER -> PARTICIPANT_DAO: Request to retrieve Payee Participant details (if it exists) + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Request Participant details + hnote over DB #lightyellow + participant + participantCurrency + end note + activate DB + PARTICIPANT_DAO <-- DB: Return Participant details if it exists + deactivate DB + PARTICIPANT_DAO --> PREP_HANDLER: Return Participant details if it exists + deactivate PARTICIPANT_DAO + PREP_HANDLER <-> PREP_HANDLER: Validate Payee\nError codes: 3203 + end + + alt Validate Prepare Transfer (success) + group Persist Transfer State (with transferState='RECEIVED-PREPARE') + PREP_HANDLER -> POS_DAO: Request to persist transfer\nError codes: 2003 + activate POS_DAO + POS_DAO -> DB: Persist transfer + hnote over DB #lightyellow + transfer + transferParticipant + transferStateChange + transferExtension + ilpPacket + end note + activate DB + deactivate DB + POS_DAO --> PREP_HANDLER: Return success + deactivate POS_DAO + end + else Validate Prepare Transfer (failure) + group Persist Transfer State (with transferState='INVALID') (Introducing a new status INVALID to mark these entries) + PREP_HANDLER -> POS_DAO: Request to persist transfer\n(when Payee/Payer/crypto-condition validation fails)\nError codes: 2003 + activate POS_DAO + POS_DAO -> DB: Persist transfer + hnote over DB #lightyellow + transfer + transferParticipant + transferStateChange + transferExtension + transferError + ilpPacket + end note + activate DB + deactivate DB + POS_DAO --> PREP_HANDLER: Return success + deactivate POS_DAO + end + end + end + end + + alt Validate Prepare Transfer (success) + note right of PREP_HANDLER #yellow + Message: + { + id: + from: , + to: , + type: "application/json", + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: "position", + action: "bulk-prepare", + createdAt: , + state: { + status: "success", + code: 0, + description:"action successful" + } + } + } + } + end note + PREP_HANDLER -> TOPIC_TRANSFER_POSITION: Route & Publish Position event for Payer\nError codes: 2003 + else Validate Prepare Transfer (failure) + note right of PREP_HANDLER #yellow + Message: + { + id: + from: , + to: , + type: "application/json" + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": + "errorDescription": "", + "extensionList": + } + }, + metadata: { + event: { + id: , + responseTo: , + type: "bulk-processing", + action: "prepare", + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + PREP_HANDLER -> TOPIC_BULK_PROCESSING: Publish Prepare failure event to Bulk Processing Topic (for Payer) \nError codes: 2003 + end +end + +deactivate PREP_HANDLER +@enduml + diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.2.1-prepare-handler.svg b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.2.1-prepare-handler.svg new file mode 100644 index 000000000..210388650 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.2.1-prepare-handler.svg @@ -0,0 +1,484 @@ + + 1.2.1. Prepare Handler Consume individual transfers from Bulk + + + 1.2.1. Prepare Handler Consume individual transfers from Bulk + + Central Service + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + topic- + transfer-prepare + + + topic- + transfer-prepare + Prepare Handler + + + Prepare Handler + + + + + topic- + transfer-position + + + topic- + transfer-position + + + topic- + event + + + topic- + event + + + topic- + notification + + + topic- + notification + + + topic- + bulk-processing + + + topic- + bulk-processing + Position DAO + + + Position DAO + + + Participant DAO + + + Participant DAO + + + Central Store + + + Central Store + + + + + + + + + + + + + + + + + Prepare Handler Consume + + + 1 + Consume Prepare event message + + + break + + + Validate Event + + + + + + 2 + Validate event - Rule: type == 'prepare' && action == 'bulk-prepare' + Error codes: + 2001 + + + Persist Event Information + + + 3 + Publish event information + + + ref + Event Handler Consume +   + + + Validate Prepare Transfer + + + + + + 4 + Schema validation of the incoming message + + + + + + 5 + Verify the message's signature (to be confirmed in future requirement) + + + Validate Duplicate Check + + + 6 + Request Duplicate Check + + + ref + Request Duplicate Check +   + + + 7 + Return { hasDuplicateId: Boolean, hasDuplicateHash: Boolean } + + + alt + [hasDuplicateId == TRUE && hasDuplicateHash == TRUE] + + + In the context of a bulk (when compared to regular transfers), duplicate + individual transfers are now considered and reported with Modified Request, + because they could have already been handled for another bulk. + + + break + + + { + id: <messageId> + from: <ledgerName>, + to: <payerFspName>, + type: "application/json", + content: { + headers: <transferHeaders>, + payload: { + errorInformation: { + errorCode: "3106", + errorDescription: "Modified request - Individual transfer prepare duplicate", + extensionList: { extension: [ { key: "_cause", value: <FSPIOPError> } ] } + } + }, + uriParams: { id: <transferId> } + }, + metadata: { + correlationId: <uuid>, + event: { + type: "bulk-processing", + action: "prepare-duplicate", + createdAt: <timestamp>, + state: { + code: "3106", + status: "error", + description: "Modified request - Individual transfer prepare duplicate" + }, + id: <uuid>, + responseTo: <uuid> + } + } + + + 8 + Publish Processing (failure) event for Payer + Error codes: + 2003 + + [hasDuplicateId == TRUE && hasDuplicateHash == FALSE] + + + break + + + { + id: <messageId> + from: <ledgerName>, + to: <payerFspName>, + type: "application/json", + content: { + headers: <transferHeaders>, + payload: { + errorInformation: { + errorCode: "3106", + errorDescription: "Modified request", + extensionList: { extension: [ { key: "_cause", value: <FSPIOPError> } ] } + } + }, + uriParams: { id: <transferId> } + }, + metadata: { + correlationId: <uuid>, + event: { + type: "bulk-processing", + action: "prepare-duplicate", + createdAt: <timestamp>, + state: { + code: "3106", + status: "error", + description: "Modified request" + }, + id: <uuid>, + responseTo: <uuid> + } + } + + + 9 + Publish Processing (failure) event for Payer + Error codes: + 2003 + + [hasDuplicateId == FALSE] + + + The validation of Payer, Payee can be skipped for individual transfers in Bulk + as they should've/would've been validated already in the bulk prepare part. + However, leaving it here for now, as in the future, this can be leveraged + when bulk transfers to multiple Payees are supported by the Specification. + + + Validate Payer + + + 10 + Request to retrieve Payer Participant details (if it exists) + + + 11 + Request Participant details + + participant + participantCurrency + + + 12 + Return Participant details if it exists + + + 13 + Return Participant details if it exists + + + + + + 14 + Validate Payer + Error codes: + 3202 + + + Validate Payee + + + 15 + Request to retrieve Payee Participant details (if it exists) + + + 16 + Request Participant details + + participant + participantCurrency + + + 17 + Return Participant details if it exists + + + 18 + Return Participant details if it exists + + + + + + 19 + Validate Payee + Error codes: + 3203 + + + alt + [Validate Prepare Transfer (success)] + + + Persist Transfer State (with transferState='RECEIVED-PREPARE') + + + 20 + Request to persist transfer + Error codes: + 2003 + + + 21 + Persist transfer + + transfer + transferParticipant + transferStateChange + transferExtension + ilpPacket + + + 22 + Return success + + [Validate Prepare Transfer (failure)] + + + Persist Transfer State (with transferState='INVALID') (Introducing a new status INVALID to mark these entries) + + + 23 + Request to persist transfer + (when Payee/Payer/crypto-condition validation fails) + Error codes: + 2003 + + + 24 + Persist transfer + + transfer + transferParticipant + transferStateChange + transferExtension + transferError + ilpPacket + + + 25 + Return success + + + alt + [Validate Prepare Transfer (success)] + + + Message: + { + id: <messageId> + from: <payerFspName>, + to: <payeeFspName>, + type: "application/json", + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: "position", + action: "bulk-prepare", + createdAt: <timestamp>, + state: { + status: "success", + code: 0, + description:"action successful" + } + } + } + } + + + 26 + Route & Publish Position event for Payer + Error codes: + 2003 + + [Validate Prepare Transfer (failure)] + + + Message: + { + id: <messageId> + from: <ledgerName>, + to: <payerFspName>, + type: "application/json" + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": <possible codes: [2003, 3100, 3105, 3106, 3202, 3203, 3300, 3301]> + "errorDescription": "<refer to section 35.1.3 for description>", + "extensionList": <transferMessage.extensionList> + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: "bulk-processing", + action: "prepare", + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 27 + Publish Prepare failure event to Bulk Processing Topic (for Payer) + Error codes: + 2003 + + diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.3.0-position-overview.plantuml b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.3.0-position-overview.plantuml new file mode 100644 index 000000000..44d640284 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.3.0-position-overview.plantuml @@ -0,0 +1,116 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Miguel de Barros + * Rajiv Mothilal + * Samuel Kummary + -------------- + ******'/ + +@startuml +' declate title +title 1.3.0. Position Handler Consume individual transfers from Bulk + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +collections "topic-transfer-position" as TOPIC_TRANSFER_POSITION +control "Position Handler" as POS_HANDLER +collections "Event-Topic" as TOPIC_EVENTS +collections "Notification-Topic" as TOPIC_NOTIFICATIONS + + +box "Central Service" #LightYellow + participant TOPIC_TRANSFER_POSITION + participant POS_HANDLER + participant TOPIC_EVENTS + participant TOPIC_NOTIFICATIONS +end box + +' start flow +activate POS_HANDLER +group Position Handler Consume + alt Consume Prepare message for Payer + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consume Position event message for Payer + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + break + group Validate Event + POS_HANDLER <-> POS_HANDLER: Validate event - Rule: type == 'position' && action == 'bulk-prepare'\nError codes: 2001 + end + end + group Persist Event Information + ||| + POS_HANDLER -> TOPIC_EVENTS: Publish event information + ref over POS_HANDLER, TOPIC_EVENTS: Event Handler Consume\n + ||| + end + ||| + ref over POS_HANDLER: Prepare Position Handler Consume\n + POS_HANDLER -> TOPIC_NOTIFICATIONS: Produce message + else Consume Fulfil message for Payee + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consume Position event message for Payee + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + break + group Validate Event + POS_HANDLER <-> POS_HANDLER: Validate event - Rule: type == 'position' && action == 'bulk-commit'\nError codes: 2001 + end + end + group Persist Event Information + ||| + POS_HANDLER -> TOPIC_EVENTS: Publish event information + ref over POS_HANDLER, TOPIC_EVENTS : Event Handler Consume\n + ||| + end + ||| + ref over POS_HANDLER: Fulfil Position Handler Consume\n + POS_HANDLER -> TOPIC_NOTIFICATIONS: Produce message + else Consume Abort message + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consume Position event message + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + break + group Validate Event + POS_HANDLER <-> POS_HANDLER: Validate event - Rule: type == 'position' && action == 'timeout-reserved'\nError codes: 2001 + end + end + group Persist Event Information + ||| + POS_HANDLER -> TOPIC_EVENTS: Publish event information + ref over POS_HANDLER, TOPIC_EVENTS : Event Handler Consume\n + ||| + end + ||| + ref over POS_HANDLER: Abort Position Handler Consume\n + POS_HANDLER -> TOPIC_NOTIFICATIONS: Produce message + end + +end +deactivate POS_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.3.0-position-overview.svg b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.3.0-position-overview.svg new file mode 100644 index 000000000..ee9d9ac7c --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.3.0-position-overview.svg @@ -0,0 +1,187 @@ + + 1.3.0. Position Handler Consume individual transfers from Bulk + + + 1.3.0. Position Handler Consume individual transfers from Bulk + + Central Service + + + + + + + + + + + + + + + + + + + + + + topic-transfer-position + + + topic-transfer-position + Position Handler + + + Position Handler + + + + + Event-Topic + + + Event-Topic + + + Notification-Topic + + + Notification-Topic + + + + + + + Position Handler Consume + + + alt + [Consume Prepare message for Payer] + + + 1 + Consume Position event message for Payer + + + break + + + Validate Event + + + + + + 2 + Validate event - Rule: type == 'position' && action == 'bulk-prepare' + Error codes: + 2001 + + + Persist Event Information + + + 3 + Publish event information + + + ref + Event Handler Consume +   + + + ref + Prepare Position Handler Consume +   + + + 4 + Produce message + + [Consume Fulfil message for Payee] + + + 5 + Consume Position event message for Payee + + + break + + + Validate Event + + + + + + 6 + Validate event - Rule: type == 'position' && action == 'bulk-commit' + Error codes: + 2001 + + + Persist Event Information + + + 7 + Publish event information + + + ref + Event Handler Consume +   + + + ref + Fulfil Position Handler Consume +   + + + 8 + Produce message + + [Consume Abort message] + + + 9 + Consume Position event message + + + break + + + Validate Event + + + + + + 10 + Validate event - Rule: type == 'position' && action == 'timeout-reserved' + Error codes: + 2001 + + + Persist Event Information + + + 11 + Publish event information + + + ref + Event Handler Consume +   + + + ref + Abort Position Handler Consume +   + + + 12 + Produce message + + diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.3.1-position-prepare.plantuml b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.3.1-position-prepare.plantuml new file mode 100644 index 000000000..370eaf388 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.3.1-position-prepare.plantuml @@ -0,0 +1,365 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Miguel de Barros + * Rajiv Mothilal + * Samuel Kummary + -------------- + ******'/ + +@startuml +' declate title +title 1.3.1. Prepare Position Handler Consume (single message, includes individual transfers from Bulk) + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistence Store + +' declare actors +control "Position Handler" as POS_HANDLER + +entity "Position\nManagement\nFacade" as POS_MGMT +collections "topic-\nnotification" as TOPIC_NOTIFICATIONS +collections "topic-\nbulk-processing" as TOPIC_BULK_PROCESSING +entity "Position DAO" as POS_DAO +database "Central Store" as DB + +box "Central Service" #LightYellow + participant POS_HANDLER + participant TOPIC_NOTIFICATIONS + participant TOPIC_BULK_PROCESSING + participant POS_MGMT + participant POS_DAO + participant DB +end box + +' start flow +activate POS_HANDLER +group Prepare Position Handler Consume + POS_HANDLER -> POS_MGMT: Request transfers to be processed + activate POS_MGMT + POS_MGMT -> POS_MGMT: Check 1st transfer to select the Participant and Currency + group DB TRANSACTION + ' DB Trans: This is where 1st DB Transaction would start in 2 DB transacation future model for horizontal scaling + POS_MGMT -> POS_MGMT: Loop through batch and build list of transferIds and calculate sumTransfersInBatch,\nchecking all in Batch are for the correct Paricipant and Currency\nError code: 2001, 3100 + POS_MGMT -> DB: Retrieve current state of all transfers in array from DB with select whereIn\n(FYI: The two DB transaction model needs to add a mini-state step here (RECEIVED_PREPARE => RECEIVDED_PREPARE_PROCESSING) so that the transfers are left alone if processing has started) + activate DB + hnote over DB #lightyellow + transferStateChange + transferParticipant + end note + DB --> POS_MGMT: Return current state of all selected transfers from DB + deactivate DB + POS_MGMT <-> POS_MGMT: Validate current state (transferStateChange.transferStateId == 'RECEIVED_PREPARE')\nError code: 2001 against failing transfers\nBatch is not rejected as a whole. + + note right of POS_MGMT #lightgray + List of transfers used during processing + **reservedTransfers** is list of transfers to be processed in the batch + **abortedTransfers** is the list of transfers in the incorrect state going into the process. Currently the transferStateChange is set to ABORTED - this should only be done if not already in a final state (idempotency) + **processedTransfers** is the list of transfers that have gone through the position management algorithm. Both successful and failed trasnfers appear here as the order and "running position" against each is necessary for reconciliation + + Scalar intermidate values used in the algorithm + **transferAmount** = payload.amount.amount + **sumTransfersInBatch** = SUM amount against each Transfer in batch + **currentPosition** = participantPosition.value + **reservedPosition** = participantPosition.{original}reservedValue + **effectivePosition** = currentPosition + reservedPosition + **heldPosition** = effectivePosition + sumTransfersInBatch + **availablePosition** = participantLimit(NetDebitCap) - effectivePosition + **sumReserved** = SUM of transfers that have met rule criteria and processed + end note + note over POS_MGMT,DB + Going to reserve the sum of the valid transfers in the batch against the Participants Positon in the Currency of this batch + and calculate the available position for the Participant to use + end note + POS_MGMT -> DB: Select effectivePosition FOR UPDATE from DB for Payer + activate DB + hnote over DB #lightyellow + participantPosition + end note + DB --> POS_MGMT: Return effectivePosition (currentPosition and reservedPosition) from DB for Payer + deactivate DB + POS_MGMT -> POS_MGMT: Increment reservedValue to heldPosition\n(reservedValue = reservedPosition + sumTransfersInBatch) + POS_MGMT -> DB: Persist reservedValue + activate DB + hnote over DB #lightyellow + UPDATE **participantPosition** + SET reservedValue += sumTransfersInBatch + end note + deactivate DB + ' DB Trans: This is where 1st DB Transaction would end in 2 DB transacation future model for horizontal scaling + + + POS_MGMT -> DB: Request position limits for Payer Participant + activate DB + hnote over DB #lightyellow + FROM **participantLimit** + WHERE participantLimit.limitTypeId = 'NET-DEBIT-CAP' + AND participantLimit.participantId = payload.payerFsp + AND participantLimit.currencyId = payload.amount.currency + end note + DB --> POS_MGMT: Return position limits + deactivate DB + POS_MGMT <-> POS_MGMT: **availablePosition** = participantLimit(netDebitCap) - effectivePosition (same as = netDebitCap - currentPosition - reservedPosition) + note over POS_MGMT,DB + For each transfer in the batch, validate the availablility of position to meet the transfer amount + this will be as per the position algorithm documented below + end note + POS_MGMT <-> POS_MGMT: Validate availablePosition for each tranfser (see algorithm below)\nError code: 4001 + note right of POS_MGMT #lightgray + 01: sumReserved = 0 // Record the sum of the transfers we allow to progress to RESERVED + 02: sumProcessed =0 // Record the sum of the transfers already processed in this batch + 03: processedTransfers = {} // The list of processed transfers - so that we can store the additional information around the decision. Most importantly the "running" position + 04: foreach transfer in reservedTransfers + 05: sumProcessed += transfer.amount // the total processed so far **(NEED TO UPDATE IN CODE)** + 06: if availablePosition >= transfer.amount + 07: transfer.state = "RESERVED" + 08: availablePosition -= preparedTransfer.amount + 09: sumRESERVED += preparedTransfer.amount + 10: else + 11: preparedTransfer.state = "ABORTED" + 12: preparedTransfer.reason = "Net Debit Cap exceeded by this request at this time, please try again later" + 13: end if + 14: runningPosition = currentPosition + sumReserved // the initial value of the Participants position plus the total value that has been accepted in the batch so far + 15: runningReservedValue = sumTransfersInBatch - sumProcessed + reservedPosition **(NEED TO UPDATE IN CODE)** // the running down of the total reserved value at the begining of the batch. + 16: Add transfer to the processedTransfer list recording the transfer state and running position and reserved values { transferState, transfer, rawMessage, transferAmount, runningPosition, runningReservedValue } + 16: end foreach + end note + note over POS_MGMT,DB + Once the outcome for all transfers is known,update the Participant's position and remove the reserved amount associated with the batch + (If there are any alarm limits, process those returning limits in which the threshold has been breached) + Do a bulk insert of the trasnferStateChanges associated with processing, using the result to complete the participantPositionChange and bulk insert of these to persist the running position + end note + POS_MGMT->POS_MGMT: Assess any limit thresholds on the final position\nadding to alarm list if triggered + + ' DB Trans: This is where 2nd DB Transaction would start in 2 DB transacation future model for horizontal scaling + POS_MGMT->DB: Persist latest position **value** and **reservedValue** to DB for Payer + hnote over DB #lightyellow + UPDATE **participantPosition** + SET value += sumRESERVED, + reservedValue -= sumTransfersInBatch + end note + activate DB + deactivate DB + + POS_MGMT -> DB: Bulk persist transferStateChange for all processedTransfers + hnote over DB #lightyellow + batch INSERT **transferStateChange** + select for update from transfer table where transferId in ([transferBatch.transferId,...]) + build list of transferStateChanges from transferBatch + + end note + activate DB + deactivate DB + + POS_MGMT->POS_MGMT: Populate batchParticipantPositionChange from the resultant transferStateChange and the earlier processedTransfer list + + note right of POS_MGMT #lightgray + Effectively: + SET transferStateChangeId = processedTransfer.transferStateChangeId, + participantPositionId = preparedTransfer.participantPositionId, + value = preparedTransfer.positionValue, + reservedValue = preparedTransfer.positionReservedValue + end note + POS_MGMT -> DB: Bulk persist the participant position change for all processedTransfers + hnote over DB #lightyellow + batch INSERT **participantPositionChange** + end note + activate DB + deactivate DB + ' DB Trans: This is where 2nd DB Transaction would end in 2 DB transacation future model for horizontal scaling + end + POS_MGMT --> POS_HANDLER: Return a map of transferIds and their transferStateChanges + deactivate POS_MGMT + alt Calculate & Validate Latest Position Prepare (success) + POS_HANDLER -> POS_HANDLER: Notifications for Position Validation Success \nReference: Position Validation Success case (Prepare) + else Calculate & Validate Latest Position Prepare (failure) + note right of POS_HANDLER #red: Validation failure! + + group Persist Transfer State (with transferState='ABORTED' on position check fail) + POS_HANDLER -> POS_DAO: Request to persist transfer\nError code: 2003 + activate POS_DAO + note right of POS_HANDLER #lightgray + transferStateChange.state = "ABORTED", + transferStateChange.reason = "Net Debit Cap exceeded by this request at this time, please try again later" + end note + POS_DAO -> DB: Persist transfer state + hnote over DB #lightyellow + transferStateChange + end note + activate DB + deactivate DB + POS_DAO --> POS_HANDLER: Return success + deactivate POS_DAO + end + POS_HANDLER -> POS_HANDLER: Notifications for failures\nReference: Failure in Position Validation (Prepare) + end +end + + +group Reference: Failure in Position Validation (Prepare) + alt If action == 'bulk-prepare' + note right of POS_HANDLER #yellow + Message: + { + id: "" + from: , + to: , + type: "application/json" + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": 4001, + "errorDescription": "Payer FSP insufficient liquidity", + "extensionList": + } + }, + metadata: { + event: { + id: , + responseTo: , + type: "bulk-processing", + action: "bulk-prepare", + createdAt: , + state: { + status: "error", + code: + description: + } + } + } + } + end note + POS_HANDLER -> TOPIC_BULK_PROCESSING: Publish Position failure event (in Prepare) to Bulk Processing Topic (for Payer) \nError codes: 2003 + activate TOPIC_BULK_PROCESSING + deactivate TOPIC_BULK_PROCESSING + else If action == 'prepare' + note right of POS_HANDLER #yellow + Message: + { + id: "" + from: , + to: , + type: "application/json" + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": 4001, + "errorDescription": "Payer FSP insufficient liquidity", + "extensionList": + } + }, + metadata: { + event: { + id: , + responseTo: , + type: "notification", + action: "position", + createdAt: , + state: { + status: "error", + code: + description: + } + } + } + } + end note + POS_HANDLER -> TOPIC_NOTIFICATIONS: Publish Notification (failure) event for Payer\nError code: 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end + +end + +group Reference: Position Validation Success case (Prepare) + alt If action == 'bulk-prepare' + note right of POS_HANDLER #yellow + Message: + { + id: "" + from: , + to: , + type: "application/json" + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: "bulk-processing", + action: "bulk-prepare", + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + POS_HANDLER -> TOPIC_BULK_PROCESSING: Publish Position Success event (in Prepare) to Bulk Processing Topic\nError codes: 2003 + activate TOPIC_BULK_PROCESSING + deactivate TOPIC_BULK_PROCESSING + else If action == 'prepare' + note right of POS_HANDLER #yellow + Message: + { + id: "" + from: , + to: , + type: "application/json" + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: "notification", + action: "abort", + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + POS_HANDLER -> TOPIC_NOTIFICATIONS: Publish Notification event\nError code: 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end +end + +deactivate POS_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.3.1-position-prepare.svg b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.3.1-position-prepare.svg new file mode 100644 index 000000000..bbf658e1c --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.3.1-position-prepare.svg @@ -0,0 +1,522 @@ + + 1.3.1. Prepare Position Handler Consume (single message, includes individual transfers from Bulk) + + + 1.3.1. Prepare Position Handler Consume (single message, includes individual transfers from Bulk) + + Central Service + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Position Handler + + + Position Handler + + + + + topic- + notification + + + topic- + notification + + + topic- + bulk-processing + + + topic- + bulk-processing + Position + Management + Facade + + + Position + Management + Facade + + + Position DAO + + + Position DAO + + + Central Store + + + Central Store + + + + + + + + + + + + + + + + + + + + Prepare Position Handler Consume + + + 1 + Request transfers to be processed + + + + + 2 + Check 1st transfer to select the Participant and Currency + + + DB TRANSACTION + + + + + 3 + Loop through batch and build list of transferIds and calculate sumTransfersInBatch, + checking all in Batch are for the correct Paricipant and Currency + Error code: + 2001, 3100 + + + 4 + Retrieve current state of all transfers in array from DB with select whereIn + (FYI: The two DB transaction model needs to add a mini-state step here (RECEIVED_PREPARE => RECEIVDED_PREPARE_PROCESSING) so that the transfers are left alone if processing has started) + + transferStateChange + transferParticipant + + + 5 + Return current state of all selected transfers from DB + + + + + + 6 + Validate current state (transferStateChange.transferStateId == 'RECEIVED_PREPARE') + Error code: + 2001 + against failing transfers + Batch is not rejected as a whole. + + + List of transfers used during processing + reservedTransfers + is list of transfers to be processed in the batch + abortedTransfers + is the list of transfers in the incorrect state going into the process. Currently the transferStateChange is set to ABORTED - this should only be done if not already in a final state (idempotency) + processedTransfers + is the list of transfers that have gone through the position management algorithm. Both successful and failed trasnfers appear here as the order and "running position" against each is necessary for reconciliation +   + Scalar intermidate values used in the algorithm + transferAmount + = payload.amount.amount + sumTransfersInBatch + = SUM amount against each Transfer in batch + currentPosition + = participantPosition.value + reservedPosition + = participantPosition.{original}reservedValue + effectivePosition + = currentPosition + reservedPosition + heldPosition + = effectivePosition + sumTransfersInBatch + availablePosition + = participantLimit(NetDebitCap) - effectivePosition + sumReserved + = SUM of transfers that have met rule criteria and processed + + + Going to reserve the sum of the valid transfers in the batch against the Participants Positon in the Currency of this batch + and calculate the available position for the Participant to use + + + 7 + Select effectivePosition FOR UPDATE from DB for Payer + + participantPosition + + + 8 + Return effectivePosition (currentPosition and reservedPosition) from DB for Payer + + + + + 9 + Increment reservedValue to heldPosition + (reservedValue = reservedPosition + sumTransfersInBatch) + + + 10 + Persist reservedValue + + UPDATE + participantPosition + SET reservedValue += sumTransfersInBatch + + + 11 + Request position limits for Payer Participant + + FROM + participantLimit + WHERE participantLimit.limitTypeId = 'NET-DEBIT-CAP' + AND participantLimit.participantId = payload.payerFsp + AND participantLimit.currencyId = payload.amount.currency + + + 12 + Return position limits + + + + + + 13 + availablePosition + = participantLimit(netDebitCap) - effectivePosition (same as = netDebitCap - currentPosition - reservedPosition) + + + For each transfer in the batch, validate the availablility of position to meet the transfer amount + this will be as per the position algorithm documented below + + + + + + 14 + Validate availablePosition for each tranfser (see algorithm below) + Error code: + 4001 + + + 01: sumReserved = 0 // Record the sum of the transfers we allow to progress to RESERVED + 02: sumProcessed =0 // Record the sum of the transfers already processed in this batch + 03: processedTransfers = {} // The list of processed transfers - so that we can store the additional information around the decision. Most importantly the "running" position + 04: foreach transfer in reservedTransfers + 05: sumProcessed += transfer.amount // the total processed so far + (NEED TO UPDATE IN CODE) + 06: if availablePosition >= transfer.amount + 07: transfer.state = "RESERVED" + 08: availablePosition -= preparedTransfer.amount + 09: sumRESERVED += preparedTransfer.amount + 10: else + 11: preparedTransfer.state = "ABORTED" + 12: preparedTransfer.reason = "Net Debit Cap exceeded by this request at this time, please try again later" + 13: end if + 14: runningPosition = currentPosition + sumReserved // the initial value of the Participants position plus the total value that has been accepted in the batch so far + 15: runningReservedValue = sumTransfersInBatch - sumProcessed + reservedPosition + (NEED TO UPDATE IN CODE) + // the running down of the total reserved value at the begining of the batch. + 16: Add transfer to the processedTransfer list recording the transfer state and running position and reserved values { transferState, transfer, rawMessage, transferAmount, runningPosition, runningReservedValue } + 16: end foreach + + + Once the outcome for all transfers is known,update the Participant's position and remove the reserved amount associated with the batch + (If there are any alarm limits, process those returning limits in which the threshold has been breached) + Do a bulk insert of the trasnferStateChanges associated with processing, using the result to complete the participantPositionChange and bulk insert of these to persist the running position + + + + + 15 + Assess any limit thresholds on the final position + adding to alarm list if triggered + + + 16 + Persist latest position + value + and + reservedValue + to DB for Payer + + UPDATE + participantPosition + SET value += sumRESERVED, + reservedValue -= sumTransfersInBatch + + + 17 + Bulk persist transferStateChange for all processedTransfers + + batch INSERT + transferStateChange + select for update from transfer table where transferId in ([transferBatch.transferId,...]) + build list of transferStateChanges from transferBatch +   + + + + + 18 + Populate batchParticipantPositionChange from the resultant transferStateChange and the earlier processedTransfer list + + + Effectively: + SET transferStateChangeId = processedTransfer.transferStateChangeId, + participantPositionId = preparedTransfer.participantPositionId, + value = preparedTransfer.positionValue, + reservedValue = preparedTransfer.positionReservedValue + + + 19 + Bulk persist the participant position change for all processedTransfers + + batch INSERT + participantPositionChange +              + + + 20 + Return a map of transferIds and their transferStateChanges + + + alt + [Calculate & Validate Latest Position Prepare (success)] + + + + + 21 + Notifications for Position Validation Success + Reference: Position Validation Success case (Prepare) + + [Calculate & Validate Latest Position Prepare (failure)] + + + Validation failure! + + + Persist Transfer State (with transferState='ABORTED' on position check fail) + + + 22 + Request to persist transfer + Error code: + 2003 + + + transferStateChange.state = "ABORTED", + transferStateChange.reason = "Net Debit Cap exceeded by this request at this time, please try again later" + + + 23 + Persist transfer state + + transferStateChange + + + 24 + Return success + + + + + 25 + Notifications for failures + Reference: Failure in Position Validation (Prepare) + + + Reference: Failure in Position Validation (Prepare) + + + alt + [If action == 'bulk-prepare'] + + + Message: + { + id: "<messageId>" + from: <ledgerName>, + to: <transferMessage.payerFsp>, + type: "application/json" + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": 4001, + "errorDescription": "Payer FSP insufficient liquidity", + "extensionList": <transferMessage.extensionList> + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: "bulk-processing", + action: "bulk-prepare", + createdAt: <timestamp>, + state: { + status: "error", + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 26 + Publish Position failure event (in Prepare) to Bulk Processing Topic (for Payer) + Error codes: + 2003 + + [If action == 'prepare'] + + + Message: + { + id: "<messageId>" + from: <ledgerName>, + to: <transferMessage.payerFsp>, + type: "application/json" + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": 4001, + "errorDescription": "Payer FSP insufficient liquidity", + "extensionList": <transferMessage.extensionList> + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: "notification", + action: "position", + createdAt: <timestamp>, + state: { + status: "error", + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 27 + Publish Notification (failure) event for Payer + Error code: + 2003 + + + Reference: Position Validation Success case (Prepare) + + + alt + [If action == 'bulk-prepare'] + + + Message: + { + id: "<messageId>" + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: "application/json" + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: "bulk-processing", + action: "bulk-prepare", + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 28 + Publish Position Success event (in Prepare) to Bulk Processing Topic + Error codes: + 2003 + + [If action == 'prepare'] + + + Message: + { + id: "<messageId>" + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: "application/json" + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: "notification", + action: "abort", + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 29 + Publish Notification event + Error code: + 2003 + + diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.4.1-bulk-processing-handler.plantuml b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.4.1-bulk-processing-handler.plantuml new file mode 100644 index 000000000..19b2a9574 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.4.1-bulk-processing-handler.plantuml @@ -0,0 +1,347 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + -------------- + ******'/ + +@startuml +' declare title +title 1.4.0. Bulk Processing Handler Consume + +autonumber + +/'***** + Diagram notes + -------------- + RECEIVED/RECEIVED + from: prepare-handler , action: prepare-duplicate/success, result: PENDING_PREPARE/ACCEPTED & RECEIVED_DUPLICATE + from: prepare-handler , action: prepare-duplicate/error , result: PENDING_PREPARE/ACCEPTED & RECEIVED_DUPLICATE + from: prepare-handler , action: prepare/error , result: PENDING_PREPARE/ACCEPTED & RECEIVED_INVALID + from: position-handler, action: prepare/error , result: PENDING_PREPARE/ACCEPTED & RECEIVED_INVALID + from: position-handler, action: prepare/success , result: PENDING_PREPARE/ACCEPTED & ACCEPTED + from: timeout-handler , action: timeout-received/error , result: unchanged/COMPLETED & EXPIRED + -------------- + ACCEPTED/ACCEPTED + from: position-handler, action: timeout-reserved/error , result: unchanged/COMPLETED & EXPIRED + -------------- + PROCESSING/ACCEPTED + from: fulfil-handler , action: fulfil-duplicate/success , result: PENDING_FULFIL/COMPLETED & FULFIL_DUPLICATE + from: fulfil-handler , action: fulfil-duplicate/error , result: PENDING_FULFIL/COMPLETED & FULFIL_DUPLICATE + from: position-handler, action: commit/success , result: PENDING_FULFIL/COMPLETED & COMPLETED + from: position-handler, action: reject/success , result: PENDING_FULFIL/COMPLETED & REJECTED + from: position-handler, action: abort/error , result: PENDING_FULFIL/COMPLETED & FULFIL_INVALID + from: fulfil-handler , action: commit/error , result: PENDING_FULFIL/COMPLETED & FULFIL_INVALID + from: position-handler, action: timeout-reserved/error , result: unchanged/COMPLETED & EXPIRED + -------------- + COMPLETED/EXPIRED + -------------- + ******'/ + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +collections "topic-bulk-\nprocessing" as TOPIC_BULK_PROCESSING +control "Bulk Processing\nHandler" as BULK_PROC_HANDLER +collections "topic-event" as TOPIC_EVENTS +collections "mojaloop-\nobject-store\n(**MLOS**)" as OBJECT_STORE +collections "topic-notification" as TOPIC_NOTIFICATION +entity "Bulk DAO" as BULK_DAO +database "Central Store" as DB + +box "Central Service" #LightYellow + participant TOPIC_BULK_PROCESSING + participant BULK_PROC_HANDLER + participant TOPIC_EVENTS + participant OBJECT_STORE + participant TOPIC_NOTIFICATION + participant BULK_DAO + participant DB +end box + +' start flow +activate BULK_PROC_HANDLER +group Bulk Processing Handler Consume + TOPIC_BULK_PROCESSING <- BULK_PROC_HANDLER: Consume message + activate TOPIC_BULK_PROCESSING + deactivate TOPIC_BULK_PROCESSING + + break + group Validate Event + BULK_PROC_HANDLER <-> BULK_PROC_HANDLER: Validate event - Rule:\ntype == 'bulk-processing' && action IN\n['prepare-duplicate', 'bulk-prepare',\n'bulk-timeout-received', 'fulfil-duplicate',\n'bulk-commit', 'bulk-timeout-reserved']\nError codes: 2001 + end + end + + group Persist Event Information + ||| + BULK_PROC_HANDLER -> TOPIC_EVENTS: Publish event information + ref over BULK_PROC_HANDLER, TOPIC_EVENTS: Event Handler Consume\n + ||| + end + + group Process Message + BULK_PROC_HANDLER -> BULK_DAO: Retrieve current state of Bulk Transfer + activate BULK_DAO + BULK_DAO -> DB: Retrieve current state of Bulk Transfer + activate DB + hnote over DB #lightyellow + bulkTransfer + bulkTransferStateChange + end note + BULK_DAO <-- DB: Return **bulkTransferInfo** + deactivate DB + BULK_PROC_HANDLER <-- BULK_DAO: Return **bulkTransferInfo** + deactivate BULK_DAO + + group Validate Bulk Transfer State + note right of BULK_PROC_HANDLER #lightgrey + **Initialize variables**: + let criteriaState + let incompleteBulkState + let completedBulkState + let bulkTransferState + let processingState + let errorCode, errorMessage + let produceNotification = false + end note + alt bulkTransferInfo.bulkTransferState IN ['RECEIVED', 'PENDING_PREPARE'] + note right of BULK_PROC_HANDLER #lightgrey + criteriaState = 'RECEIVED' + incompleteBulkState = 'PENDING_PREPARE' + completedBulkState = 'ACCEPTED' + end note + alt action == 'prepare-duplicate' AND state.status == 'error' + note right of BULK_PROC_HANDLER #lightgrey + processingState = 'RECEIVED_DUPLICATE' + errorCode = payload.errorInformation.errorCode + errorDescription = payload.errorInformation.errorDescription + end note + else action == 'bulk-prepare' AND state.status == 'error' + note right of BULK_PROC_HANDLER #lightgrey + processingState = 'RECEIVED_INVALID' + errorCode = payload.errorInformation.errorCode + errorDescription = payload.errorInformation.errorDescription + end note + else action == 'bulk-prepare' AND state.status == 'success' + note right of BULK_PROC_HANDLER #lightgrey + processingState = 'ACCEPTED' + end note + else action IN ['bulk-timeout-received', 'bulk-timeout-reserved'] + note right of BULK_PROC_HANDLER #lightgrey + incompleteBulkState = 'EXPIRING' + completedBulkState = 'COMPLETED' + processingState = 'EXPIRED' + errorCode = payload.errorInformation.errorCode + errorDescription = payload.errorInformation.errorDescription + end note + else all other actions + note right of BULK_PROC_HANDLER #lightgrey + throw ErrorHandler.Factory.createFSPIOPError(INTERNAL_SERVER_ERROR) + end note + end + else bulkTransferInfo.bulkTransferState IN ['ACCEPTED'] + alt action == 'bulk-timeout-reserved' + note right of BULK_PROC_HANDLER #lightgrey + criteriaState = 'ACCEPTED' + incompleteBulkState = 'EXPIRING' + completedBulkState = 'COMPLETED' + processingState = 'EXPIRED' + end note + else all other actions + note right of BULK_PROC_HANDLER #lightgrey + throw ErrorHandler.Factory.createFSPIOPError(INTERNAL_SERVER_ERROR) + end note + end + else bulkTransferInfo.bulkTransferState IN ['PROCESSING', 'PENDING_FULFIL', 'EXPIRING'] + note right of BULK_PROC_HANDLER #lightgrey + criteriaState = 'PROCESSING' + incompleteBulkState = 'PENDING_FULFIL' + completedBulkState = 'COMPLETED' + end note + alt action == 'fulfil-duplicate' + note right of BULK_PROC_HANDLER #lightgrey + processingState = 'FULFIL_DUPLICATE' + end note + else action == 'bulk-commit' AND state.status == 'success' + note right of BULK_PROC_HANDLER #lightgrey + processingState = 'COMPLETED' + end note + else action == 'reject' AND state.status == 'success' + note right of BULK_PROC_HANDLER #lightgrey + processingState = 'REJECTED' + end note + else action IN ['commit', 'abort'] AND state.status == 'error' + note right of BULK_PROC_HANDLER #lightgrey + processingState = 'FULFIL_INVALID' + end note + else action == 'bulk-timeout-reserved' + note right of BULK_PROC_HANDLER #lightgrey + incompleteBulkState = 'EXPIRING' + completedBulkState = 'COMPLETED' + processingState = 'EXPIRED' + errorCode = payload.errorInformation.errorCode + errorDescription = payload.errorInformation.errorDescription + end note + else all other actions + note right of BULK_PROC_HANDLER #lightgrey + throw ErrorHandler.Factory.createFSPIOPError(INTERNAL_SERVER_ERROR) + end note + end + else bulkTransferInfo.bulkTransferState IN ['ABORTING'] + alt action == 'bulk-abort' + note right of BULK_PROC_HANDLER #lightgrey + criteriaState = 'ABORTING' + processingState = 'FULFIL_INVALID' + completedBulkState = 'REJECTED' + incompleteBulkState = 'ABORTING' + errorCode = payload.errorInformation.errorCode + errorDescription = payload.errorInformation.errorDescription + end note + else all other actions + note right of BULK_PROC_HANDLER #lightgrey + throw ErrorHandler.Factory.createFSPIOPError(INTERNAL_SERVER_ERROR) + end note + end + else all other ['PENDING_INVALID', 'COMPLETED', 'REJECTED', 'INVALID'] + note right of BULK_PROC_HANDLER #lightgrey + throw ErrorHandler.Factory.createFSPIOPError(INTERNAL_SERVER_ERROR) + end note + end + end + + BULK_PROC_HANDLER -> BULK_DAO: Persist individual transfer processing state + activate BULK_DAO + BULK_DAO -> DB: Persist individual transfer processing state\n-- store errorCode/errorMessage when\nstate.status == 'error' + activate DB + hnote over DB #lightyellow + bulkTransferAssociation + end note + deactivate DB + BULK_PROC_HANDLER <-- BULK_DAO: Return success + deactivate BULK_DAO + + BULK_PROC_HANDLER -> BULK_DAO: Check previously defined completion criteria + activate BULK_DAO + BULK_DAO -> DB: Select EXISTS (LIMIT 1) in criteriaState + activate DB + hnote over DB #lightyellow + bulkTransferAssociation + end note + BULK_DAO <-- DB: Return **existingIndividualTransfer** + deactivate DB + BULK_PROC_HANDLER <-- BULK_DAO: Return **existingIndividualTransfer** + deactivate BULK_DAO + + alt individual transfer exists + note right of BULK_PROC_HANDLER #lightgrey + bulkTransferState = incompleteBulkState + end note + else no transfer in criteriaState exists + note right of BULK_PROC_HANDLER #lightgrey + bulkTransferState = completedBulkState + produceNotification = true + end note + end + + BULK_PROC_HANDLER -> BULK_DAO: Persist bulkTransferState from previous step + activate BULK_DAO + BULK_DAO -> DB: Persist bulkTransferState + activate DB + deactivate DB + hnote over DB #lightyellow + bulkTransferStateChange + end note + BULK_PROC_HANDLER <-- BULK_DAO: Return success + deactivate BULK_DAO + + + alt produceNotification == true + BULK_PROC_HANDLER -> BULK_DAO: Request to retrieve all bulk transfer and individual transfer results + activate BULK_DAO + BULK_DAO -> DB: Get bulkTransferResult + activate DB + hnote over DB #lightyellow + bulkTransfer + bulkTransferStateChange + bulkTransferAssociation + end note + BULK_DAO <-- DB: Return **bulkTransferResult** + deactivate DB + BULK_PROC_HANDLER <-- BULK_DAO: Return **bulkTransferResult** + deactivate BULK_DAO + + group Send Bulk Notification(s) + note right of BULK_PROC_HANDLER #lightgrey + Depending on the action decide where to + send notification: payer, payee OR both + end note + + BULK_PROC_HANDLER -> OBJECT_STORE: Generate & Persist bulk message to object store:\n**MLOS.bulkTransferResults** by destination + activate OBJECT_STORE + OBJECT_STORE --> BULK_PROC_HANDLER: Return reference to the stored object(s)\n**MLOS.bulkTransferResults.messageId** + deactivate OBJECT_STORE + note right of BULK_PROC_HANDLER #yellow + Message: + { + id: + from: , + to: , + type: "application/json" + content: { + headers: , + payload: { + bulkTransferId: , + bulkTransferState: + } + }, + metadata: { + event: { + id: , + responseTo: , + type: "notification", + action: "bulk-[prepare | commit | abort | processing]", + createdAt: , + state: { + status: state.status, + code: state.code + } + } + } + } + end note + + BULK_PROC_HANDLER -> TOPIC_NOTIFICATION: Publish Notification event for Payer/Payee\nError codes: 2003 + activate TOPIC_NOTIFICATION + deactivate TOPIC_NOTIFICATION + end + else produceNotification == false + note right of BULK_PROC_HANDLER #lightgrey + Do nothing (awaitAllTransfers) + end note + end + end +end +deactivate BULK_PROC_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.4.1-bulk-processing-handler.svg b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.4.1-bulk-processing-handler.svg new file mode 100644 index 000000000..9d756ff45 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-1.4.1-bulk-processing-handler.svg @@ -0,0 +1,468 @@ + + 1.4.0. Bulk Processing Handler Consume + + + 1.4.0. Bulk Processing Handler Consume + + Central Service + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + topic-bulk- + processing + + + topic-bulk- + processing + Bulk Processing + Handler + + + Bulk Processing + Handler + + + + + topic-event + + + topic-event + + + mojaloop- + object-store + ( + MLOS + ) + + + mojaloop- + object-store + ( + MLOS + ) + + + topic-notification + + + topic-notification + Bulk DAO + + + Bulk DAO + + + Central Store + + + Central Store + + + + + + + + + + + + + + + + + + + Bulk Processing Handler Consume + + + 1 + Consume message + + + break + + + Validate Event + + + + + + 2 + Validate event - Rule: + type == 'bulk-processing' && action IN + ['prepare-duplicate', 'bulk-prepare', + 'bulk-timeout-received', 'fulfil-duplicate', + 'bulk-commit', 'bulk-timeout-reserved'] + Error codes: + 2001 + + + Persist Event Information + + + 3 + Publish event information + + + ref + Event Handler Consume +   + + + Process Message + + + 4 + Retrieve current state of Bulk Transfer + + + 5 + Retrieve current state of Bulk Transfer + + bulkTransfer + bulkTransferStateChange + + + 6 + Return + bulkTransferInfo + + + 7 + Return + bulkTransferInfo + + + Validate Bulk Transfer State + + + Initialize variables + : + let criteriaState + let incompleteBulkState + let completedBulkState + let bulkTransferState + let processingState + let errorCode, errorMessage + let produceNotification = false + + + alt + [bulkTransferInfo.bulkTransferState IN ['RECEIVED', 'PENDING_PREPARE']] + + + criteriaState = 'RECEIVED' + incompleteBulkState = 'PENDING_PREPARE' + completedBulkState = 'ACCEPTED' + + + alt + [action == 'prepare-duplicate' AND state.status == 'error'] + + + processingState = 'RECEIVED_DUPLICATE' + errorCode = payload.errorInformation.errorCode + errorDescription = payload.errorInformation.errorDescription + + [action == 'bulk-prepare' AND state.status == 'error'] + + + processingState = 'RECEIVED_INVALID' + errorCode = payload.errorInformation.errorCode + errorDescription = payload.errorInformation.errorDescription + + [action == 'bulk-prepare' AND state.status == 'success'] + + + processingState = 'ACCEPTED' + + [action IN ['bulk-timeout-received', 'bulk-timeout-reserved']] + + + incompleteBulkState = 'EXPIRING' + completedBulkState = 'COMPLETED' + processingState = 'EXPIRED' + errorCode = payload.errorInformation.errorCode + errorDescription = payload.errorInformation.errorDescription + + [all other actions] + + + throw + ErrorHandler.Factory.createFSPIOPError(INTERNAL_SERVER_ERROR) + + [bulkTransferInfo.bulkTransferState IN ['ACCEPTED']] + + + alt + [action == 'bulk-timeout-reserved'] + + + criteriaState = 'ACCEPTED' + incompleteBulkState = 'EXPIRING' + completedBulkState = 'COMPLETED' + processingState = 'EXPIRED' + + [all other actions] + + + throw + ErrorHandler.Factory.createFSPIOPError(INTERNAL_SERVER_ERROR) + + [bulkTransferInfo.bulkTransferState IN ['PROCESSING', 'PENDING_FULFIL', 'EXPIRING']] + + + criteriaState = 'PROCESSING' + incompleteBulkState = 'PENDING_FULFIL' + completedBulkState = 'COMPLETED' + + + alt + [action == 'fulfil-duplicate'] + + + processingState = 'FULFIL_DUPLICATE' + + [action == 'bulk-commit' AND state.status == 'success'] + + + processingState = 'COMPLETED' + + [action == 'reject' AND state.status == 'success'] + + + processingState = 'REJECTED' + + [action IN ['commit', 'abort'] AND state.status == 'error'] + + + processingState = 'FULFIL_INVALID' + + [action == 'bulk-timeout-reserved'] + + + incompleteBulkState = 'EXPIRING' + completedBulkState = 'COMPLETED' + processingState = 'EXPIRED' + errorCode = payload.errorInformation.errorCode + errorDescription = payload.errorInformation.errorDescription + + [all other actions] + + + throw + ErrorHandler.Factory.createFSPIOPError(INTERNAL_SERVER_ERROR) + + [bulkTransferInfo.bulkTransferState IN ['ABORTING']] + + + alt + [action == 'bulk-abort'] + + + criteriaState = 'ABORTING' + processingState = 'FULFIL_INVALID' + completedBulkState = 'REJECTED' + incompleteBulkState = 'ABORTING' + errorCode = payload.errorInformation.errorCode + errorDescription = payload.errorInformation.errorDescription + + [all other actions] + + + throw + ErrorHandler.Factory.createFSPIOPError(INTERNAL_SERVER_ERROR) + + [all other ['PENDING_INVALID', 'COMPLETED', 'REJECTED', 'INVALID']] + + + throw + ErrorHandler.Factory.createFSPIOPError(INTERNAL_SERVER_ERROR) + + + 8 + Persist individual transfer processing state + + + 9 + Persist individual transfer processing state + -- store errorCode/errorMessage when + state.status == 'error' + + bulkTransferAssociation + + + 10 + Return success + + + 11 + Check previously defined completion criteria + + + 12 + Select EXISTS (LIMIT 1) in criteriaState + + bulkTransferAssociation + + + 13 + Return + existingIndividualTransfer + + + 14 + Return + existingIndividualTransfer + + + alt + [individual transfer exists] + + + bulkTransferState = incompleteBulkState + + [no transfer in criteriaState exists] + + + bulkTransferState = completedBulkState + produceNotification = true + + + 15 + Persist bulkTransferState from previous step + + + 16 + Persist bulkTransferState + + bulkTransferStateChange + + + 17 + Return success + + + alt + [produceNotification == true] + + + 18 + Request to retrieve all bulk transfer and individual transfer results + + + 19 + Get bulkTransferResult + + bulkTransfer + bulkTransferStateChange + bulkTransferAssociation + + + 20 + Return + bulkTransferResult + + + 21 + Return + bulkTransferResult + + + Send Bulk Notification(s) + + + Depending on the action decide where to + send notification: payer, payee OR both + + + 22 + Generate & Persist bulk message to object store: + MLOS.bulkTransferResults + by destination + + + 23 + Return reference to the stored object(s) + MLOS.bulkTransferResults.messageId + + + Message: + { + id: <messageId> + from: <source>, + to: <destination>, + type: "application/json" + content: { + headers: <bulkTransferHeaders>, + payload: { + bulkTransferId: <uuid>, + bulkTransferState: <string> + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: "notification", + action: "bulk-[prepare | commit | abort | processing]", + createdAt: <timestamp>, + state: { + status: state.status, + code: state.code + } + } + } + } + + + 24 + Publish Notification event for Payer/Payee + Error codes: + 2003 + + [produceNotification == false] + + + Do nothing (awaitAllTransfers) + + diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.1.0-bulk-fulfil-overview.plantuml b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.1.0-bulk-fulfil-overview.plantuml new file mode 100644 index 000000000..476d76354 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.1.0-bulk-fulfil-overview.plantuml @@ -0,0 +1,225 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + -------------- + ******'/ + +@startuml +' declate title +title 2.1.0. DFSP2 sends a Bulk Fulfil Success Transfer request + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +actor "DFSP1\nPayer" as DFSP1 +actor "DFSP2\nPayee" as DFSP2 +boundary "ML API Adapter" as MLAPI +control "ML API \nNotification Handler" as NOTIFY_HANDLER +collections "mongo-\nobject-store" as OBJECT_STORE +boundary "Central Service API" as CSAPI +collections "topic-\nbulk-fulfil" as TOPIC_BULK_FULFIL +control "Bulk Fulfil\nHandler" as BULK_FULFIL_HANDLER +collections "topic-\nfulfil" as TOPIC_FULFIL +control "Fulfil \nHandler" as FULF_HANDLER +collections "topic-\ntransfer-position" as TOPIC_TRANSFER_POSITION +control "Position \nHandler" as POS_HANDLER +collections "topic-\nbulk-processing" as TOPIC_BULK_PROCESSING +control "Bulk Processing\nHandler" as BULK_PROC_HANDLER +collections "topic-\nnotification" as TOPIC_NOTIFICATIONS + +box "Financial Service Providers" #lightGray + participant DFSP1 + participant DFSP2 +end box + +box "ML API Adapter Service" #LightBlue + participant MLAPI + participant NOTIFY_HANDLER +end box + +box "Central Service" #LightYellow + participant OBJECT_STORE + participant CSAPI + participant TOPIC_BULK_FULFIL + participant BULK_FULFIL_HANDLER + participant TOPIC_FULFIL + participant FULF_HANDLER + participant TOPIC_TRANSFER_POSITION + participant POS_HANDLER + participant TOPIC_BULK_PROCESSING + participant BULK_PROC_HANDLER + participant TOPIC_NOTIFICATIONS +end box + +' start flow +activate NOTIFY_HANDLER +activate BULK_FULFIL_HANDLER +activate FULF_HANDLER +activate POS_HANDLER +activate BULK_PROC_HANDLER +group DFSP2 sends a Bulk Fulfil Success Transfer request to DFSP1 + note right of DFSP2 #yellow + Headers - transferHeaders: { + Content-Length: , + Content-Type: , + Date: , + FSPIOP-Source: , + FSPIOP-Destination: , + FSPIOP-Encryption: , + FSPIOP-Signature: , + FSPIOP-URI: , + FSPIOP-HTTP-Method: + } + + Payload - bulkTransferMessage: + { + bulkTransferState: , + completedTimestamp: , + individualTransferResults: + [ + { + transferId: , + fulfilment: , + extensionList: { extension: [ + { key: , value: } + ] } + } + ], + extensionList: { extension: [ + { key: , value: } + ] } + } + end note + DFSP2 ->> MLAPI: PUT - /bulkTransfers/ + activate MLAPI + MLAPI -> OBJECT_STORE: Persist incoming bulk message to\nobject store: **MLOS.individualTransferFulfils** + activate OBJECT_STORE + OBJECT_STORE --> MLAPI: Return messageId reference to the stored object(s) + deactivate OBJECT_STORE + note right of MLAPI #yellow + Message: + { + id: , + from: , + to: , + type: "application/json", + content: { + headers: , + payload: { + bulkTransferId: , + bulkTransferState: "COMPLETED", + completedTimestamp: , + extensionList: { extension: [ + { key: , value: } + ] }, + count: , + hash: + } + }, + metadata: { + event: { + id: , + type: "bulk-fulfil", + action: "bulk-commit", + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + MLAPI -> TOPIC_BULK_FULFIL: Route & Publish Bulk Fulfil event for Payee\nError code: 2003 + activate TOPIC_BULK_FULFIL + TOPIC_BULK_FULFIL <-> TOPIC_BULK_FULFIL: Ensure event is replicated \nas configured (ACKS=all)\nError code: 2003 + TOPIC_BULK_FULFIL --> MLAPI: Respond replication acknowledgements \nhave been received + deactivate TOPIC_BULK_FULFIL + MLAPI -->> DFSP2: Respond HTTP - 200 (OK) + deactivate MLAPI + TOPIC_BULK_FULFIL <- BULK_FULFIL_HANDLER: Consume message + BULK_FULFIL_HANDLER -> OBJECT_STORE: Retrieve individual transfers by key:\n**MLOS.individualTransferFulfils.messageId** + activate OBJECT_STORE + OBJECT_STORE --> BULK_FULFIL_HANDLER: Stream bulk's individual transfers + deactivate OBJECT_STORE + ref over TOPIC_BULK_FULFIL, TOPIC_FULFIL: Bulk Prepare Handler Consume \n + alt Success + BULK_FULFIL_HANDLER -> TOPIC_FULFIL: Produce (stream) single transfer message\nfor each individual transfer [loop] + else Failure + BULK_FULFIL_HANDLER --> TOPIC_NOTIFICATIONS: Produce single message for the entire bulk + end + ||| + TOPIC_FULFIL <- FULF_HANDLER: Consume message + ref over TOPIC_FULFIL, TOPIC_TRANSFER_POSITION: Fulfil Handler Consume (Success)\n + alt Success + FULF_HANDLER -> TOPIC_TRANSFER_POSITION: Produce message + else Failure + FULF_HANDLER --> TOPIC_BULK_PROCESSING: Produce message + end + ||| + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consume message + ref over TOPIC_TRANSFER_POSITION, TOPIC_BULK_PROCESSING: Position Handler Consume (Success)\n + POS_HANDLER -> TOPIC_BULK_PROCESSING: Produce message + ||| + TOPIC_BULK_PROCESSING <- BULK_PROC_HANDLER: Consume message + ref over TOPIC_BULK_PROCESSING, TOPIC_NOTIFICATIONS: Bulk Processing Handler Consume (Success)\n + BULK_PROC_HANDLER -> OBJECT_STORE: Persist bulk message by destination to the\nobject store: **MLOS.bulkTransferResults** + activate OBJECT_STORE + OBJECT_STORE --> BULK_PROC_HANDLER: Return the reference to the stored \nnotification object(s): **messageId** + deactivate OBJECT_STORE + BULK_PROC_HANDLER -> TOPIC_NOTIFICATIONS: Send Bulk Commit notification + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consume message + NOTIFY_HANDLER -> OBJECT_STORE: Retrieve bulk notification(s) by reference & destination:\n**MLOS.bulkTransferResults.messageId + destination** + activate OBJECT_STORE + OBJECT_STORE --> NOTIFY_HANDLER: Return notification payload + deactivate OBJECT_STORE + opt action == 'bulk-commit' + ||| + ref over DFSP1, TOPIC_NOTIFICATIONS: Send notification to Participant (Payer)\n + NOTIFY_HANDLER -> DFSP1: Send callback notification + end + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consume message + NOTIFY_HANDLER -> OBJECT_STORE: Retrieve bulk notification(s) by reference & destination:\n**MLOS.bulkTransferResults.messageId + destination** + activate OBJECT_STORE + OBJECT_STORE --> NOTIFY_HANDLER: Return notification payload + deactivate OBJECT_STORE + opt action == 'bulk-commit' + ||| + ref over DFSP2, TOPIC_NOTIFICATIONS: Send notification to Participant (Payee)\n + NOTIFY_HANDLER -> DFSP2: Send callback notification + end + ||| +end +deactivate POS_HANDLER +activate BULK_FULFIL_HANDLER +deactivate FULF_HANDLER +deactivate BULK_PROC_HANDLER +deactivate NOTIFY_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.1.0-bulk-fulfil-overview.svg b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.1.0-bulk-fulfil-overview.svg new file mode 100644 index 000000000..223109602 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.1.0-bulk-fulfil-overview.svg @@ -0,0 +1,429 @@ + + 2.1.0. DFSP2 sends a Bulk Fulfil Success Transfer request + + + 2.1.0. DFSP2 sends a Bulk Fulfil Success Transfer request + + Financial Service Providers + + ML API Adapter Service + + Central Service + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DFSP1 + Payer + + + DFSP1 + Payer + + + DFSP2 + Payee + + + DFSP2 + Payee + + + ML API Adapter + + + ML API Adapter + + + ML API + Notification Handler + + + ML API + Notification Handler + + + + + mongo- + object-store + + + mongo- + object-store + Central Service API + + + Central Service API + + + + + topic- + bulk-fulfil + + + topic- + bulk-fulfil + Bulk Fulfil + Handler + + + Bulk Fulfil + Handler + + + + + topic- + fulfil + + + topic- + fulfil + Fulfil + Handler + + + Fulfil + Handler + + + + + topic- + transfer-position + + + topic- + transfer-position + Position + Handler + + + Position + Handler + + + + + topic- + bulk-processing + + + topic- + bulk-processing + Bulk Processing + Handler + + + Bulk Processing + Handler + + + + + topic- + notification + + + topic- + notification + + + + + + + + + + + + + + + DFSP2 sends a Bulk Fulfil Success Transfer request to DFSP1 + + + Headers - transferHeaders: { + Content-Length: <int>, + Content-Type: <string>, + Date: <date>, + FSPIOP-Source: <string>, + FSPIOP-Destination: <string>, + FSPIOP-Encryption: <string>, + FSPIOP-Signature: <string>, + FSPIOP-URI: <uri>, + FSPIOP-HTTP-Method: <string> + } +   + Payload - bulkTransferMessage: + { + bulkTransferState: <bulkTransferState>, + completedTimestamp: <completedTimeStamp>, + individualTransferResults: + [ + { + transferId: <uuid>, + fulfilment: <ilpCondition>, + extensionList: { extension: [ + { key: <string>, value: <string> } + ] } + } + ], + extensionList: { extension: [ + { key: <string>, value: <string> } + ] } + } + + + + 1 + PUT - /bulkTransfers/<ID> + + + 2 + Persist incoming bulk message to + object store: + MLOS.individualTransferFulfils + + + 3 + Return messageId reference to the stored object(s) + + + Message: + { + id: <messageId>, + from: <payeeFspName>, + to: <payerFspName>, + type: "application/json", + content: { + headers: <bulkTransferHeaders>, + payload: { + bulkTransferId: <uuid>, + bulkTransferState: "COMPLETED", + completedTimestamp: <timestamp>, + extensionList: { extension: [ + { key: <string>, value: <string> } + ] }, + count: <int>, + hash: <string> + } + }, + metadata: { + event: { + id: <uuid>, + type: "bulk-fulfil", + action: "bulk-commit", + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 4 + Route & Publish Bulk Fulfil event for Payee + Error code: + 2003 + + + + + + 5 + Ensure event is replicated + as configured (ACKS=all) + Error code: + 2003 + + + 6 + Respond replication acknowledgements + have been received + + + + 7 + Respond HTTP - 200 (OK) + + + 8 + Consume message + + + 9 + Retrieve individual transfers by key: + MLOS.individualTransferFulfils.messageId + + + 10 + Stream bulk's individual transfers + + + ref + Bulk Prepare Handler Consume +   + + + alt + [Success] + + + 11 + Produce (stream) single transfer message + for each individual transfer [loop] + + [Failure] + + + 12 + Produce single message for the entire bulk + + + 13 + Consume message + + + ref + Fulfil Handler Consume (Success) +   + + + alt + [Success] + + + 14 + Produce message + + [Failure] + + + 15 + Produce message + + + 16 + Consume message + + + ref + Position Handler Consume (Success) +   + + + 17 + Produce message + + + 18 + Consume message + + + ref + Bulk Processing Handler Consume (Success) +   + + + 19 + Persist bulk message by destination to the + object store: + MLOS.bulkTransferResults + + + 20 + Return the reference to the stored + notification object(s): + messageId + + + 21 + Send Bulk Commit notification + + + 22 + Consume message + + + 23 + Retrieve bulk notification(s) by reference & destination: + MLOS.bulkTransferResults.messageId + destination + + + 24 + Return notification payload + + + opt + [action == 'bulk-commit'] + + + ref + Send notification to Participant (Payer) +   + + + 25 + Send callback notification + + + 26 + Consume message + + + 27 + Retrieve bulk notification(s) by reference & destination: + MLOS.bulkTransferResults.messageId + destination + + + 28 + Return notification payload + + + opt + [action == 'bulk-commit'] + + + ref + Send notification to Participant (Payee) +   + + + 29 + Send callback notification + + diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.1.1-bulk-fulfil-handler.plantuml b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.1.1-bulk-fulfil-handler.plantuml new file mode 100644 index 000000000..2da07f279 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.1.1-bulk-fulfil-handler.plantuml @@ -0,0 +1,324 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + -------------- + ******'/ + +@startuml +' declare title +title 2.1.1. Bulk Fulfil Handler Consume + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +collections "mongo-\nobject-store" as OBJECT_STORE +collections "topic-bulk-\nfulfil" as TOPIC_BULK_FULFIL +collections "topic-bulk-\nprocessing" as TOPIC_BULK_PROCESSING +control "Bulk Fulfil\nHandler" as BULK_FULF_HANDLER +collections "topic-transfer-\nfulfil" as TOPIC_TRANSFER_FULFIL +collections "topic-event" as TOPIC_EVENTS +collections "topic-notification" as TOPIC_NOTIFICATION +entity "Bulk DAO" as BULK_DAO +database "Central Store" as DB + +box "Central Service" #LightYellow + participant OBJECT_STORE + participant TOPIC_BULK_FULFIL + participant BULK_FULF_HANDLER + participant TOPIC_TRANSFER_FULFIL + participant TOPIC_BULK_PROCESSING + participant TOPIC_EVENTS + participant TOPIC_NOTIFICATION + participant BULK_DAO + participant DB +end box + +' start flow +activate BULK_FULF_HANDLER +group Bulk Fulfil Handler Consume + TOPIC_BULK_FULFIL <- BULK_FULF_HANDLER: Consume message + activate TOPIC_BULK_FULFIL + deactivate TOPIC_BULK_FULFIL + + break + group Validate Event + BULK_FULF_HANDLER <-> BULK_FULF_HANDLER: Validate event - Rule:\ntype == 'bulk-fulfil' && action == 'bulk-commit'\nError codes: 2001 + end + end + + group Persist Event Information + ||| + BULK_FULF_HANDLER -> TOPIC_EVENTS: Publish event information + ref over BULK_FULF_HANDLER, TOPIC_EVENTS: Event Handler Consume \n + ||| + end + + group Validate FSPIOP-Signature + ||| + ref over BULK_FULF_HANDLER, TOPIC_NOTIFICATION: Validate message.content.headers.**FSPIOP-Signature**\nError codes: 3105/3106\n + ||| + end + + group Validate Bulk Fulfil Transfer + BULK_FULF_HANDLER <-> BULK_FULF_HANDLER: Schema validation of the incoming message + BULK_FULF_HANDLER <-> BULK_FULF_HANDLER: Verify the message's signature\n(to be confirmed in future requirement) + note right of BULK_FULF_HANDLER #lightgrey + The above validation steps are already handled by the + Bulk-API-Adapter for the open source implementation. + It may need to be added in future for custom adapters. + end note + + group Validate Duplicate Check + ||| + BULK_FULF_HANDLER -> DB: Request Duplicate Check + ref over BULK_FULF_HANDLER, DB: Request Duplicate Check\n + DB --> BULK_FULF_HANDLER: Return { hasDuplicateId: Boolean, hasDuplicateHash: Boolean } + end + + alt hasDuplicateId == TRUE && hasDuplicateHash == TRUE + break + BULK_FULF_HANDLER -> BULK_DAO: Request to retrieve Bulk Transfer state & completedTimestamp\nError code: 2003 + activate BULK_DAO + BULK_DAO -> DB: Query database + hnote over DB #lightyellow + bulkTransfer + bulkTransferFulfilment + bulkTransferStateChange + end note + activate DB + BULK_DAO <-- DB: Return resultset + deactivate DB + BULK_DAO --> BULK_FULF_HANDLER: Return **bulkTransferStateId** & **completedTimestamp** (not null when completed) + deactivate BULK_DAO + + note right of BULK_FULF_HANDLER #yellow + Message: + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: { + bulkTransferState: , + completedTimestamp: + } + }, + metadata: { + event: { + id: , + responseTo: , + type: "notification", + action: "bulk-fulfil-duplicate", + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + BULK_FULF_HANDLER -> TOPIC_NOTIFICATION: Publish Notification event for Payee + activate TOPIC_NOTIFICATION + deactivate TOPIC_NOTIFICATION + end + else hasDuplicateId == TRUE && hasDuplicateHash == FALSE + note right of BULK_FULF_HANDLER #yellow + { + id: , + from: , + type: "application/json", + content: { + headers: , + payload: { + errorInformation: { + errorCode: "3106", + errorDescription: "Modified request", + extensionList: { + extension: [ + { + key: "_cause", + value: + } + ] + } + }, + uriParams: { + id: + } + } + }, + metadata: { + correlationId: , + event: { + id: , + type: "notification", + action: "bulk-commit", + createdAt: , + state: { + status: "error", + code: "3106", + description: "Modified request" + }, + responseTo: + } + } + } + end note + BULK_FULF_HANDLER -> TOPIC_NOTIFICATION: Publish Notification (failure) event for Payer\nError codes: 3106 + activate TOPIC_NOTIFICATION + deactivate TOPIC_NOTIFICATION + else hasDuplicateId == FALSE + alt Validate Bulk Transfer Fulfil (success) + group Persist Bulk Transfer State (with bulktransferState='PROCESSING') + BULK_FULF_HANDLER -> BULK_DAO: Request to persist bulk transfer fulfil\nError codes: 2003 + activate BULK_DAO + BULK_DAO -> DB: Persist bulkTransferFulfilment + hnote over DB #lightyellow + bulkTransferFulfilment + bulkTransferStateChange + bulkTransferExtension + end note + activate DB + deactivate DB + BULK_DAO --> BULK_FULF_HANDLER: Return success + deactivate BULK_DAO + end + else Validate Bulk Transfer Fulfil (failure) + group Persist Bulk Transfer State (with bulkTransferState='ABORTING') + BULK_FULF_HANDLER -> BULK_DAO: Request to persist bulk\ntransfer fulfil failure\nError codes: 2003 + activate BULK_DAO + BULK_DAO -> DB: Persist transfer + hnote over DB #lightyellow + bulkTransferFulfilment + bulkTransferStateChange + bulkTransferExtension + bulkTransferError + end note + activate DB + deactivate DB + BULK_DAO --> BULK_FULF_HANDLER: Return success + deactivate BULK_DAO + end + end + end + end + alt Validate Bulk Transfer Fulfil (success) + loop for every individual transfer in the bulk fulfil list + BULK_FULF_HANDLER -> OBJECT_STORE: Retrieve individual transfers from the bulk using\nreference: **MLOS.individualTransferFulfils.messageId** + activate OBJECT_STORE + OBJECT_STORE --> BULK_FULF_HANDLER: Return stored bulk transfer containing individual transfers + deactivate OBJECT_STORE + + BULK_FULF_HANDLER --> OBJECT_STORE: Update bulk transfer association record to bulk transfer processing state 'PROCESSING' + activate OBJECT_STORE + OBJECT_STORE --> BULK_FULF_HANDLER: Bulk transfer association record commited + deactivate OBJECT_STORE + + note right of BULK_FULF_HANDLER #yellow + Message: + { + id: + from: , + to: , + type: "application/json" + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: "fulfil", + action: "bulk-commit", + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + BULK_FULF_HANDLER -> TOPIC_TRANSFER_FULFIL: Route & Publish fulfil bulk commit events to the Payer for the Individual Transfer\nError codes: 2003 + activate TOPIC_TRANSFER_FULFIL + deactivate TOPIC_TRANSFER_FULFIL + end + else Validate Bulk Transfer Fulfil (failure) + loop for every individual transfer in the bulk fulfil list + BULK_FULF_HANDLER -> OBJECT_STORE: Retrieve individual transfers from the bulk using\nreference: **MLOS.individualTransferFulfils.messageId** + activate OBJECT_STORE + OBJECT_STORE --> BULK_FULF_HANDLER: Stream bulk's individual transfer fulfils + deactivate OBJECT_STORE + + BULK_FULF_HANDLER --> OBJECT_STORE: Update bulk transfer association record to bulk transfer processing state 'ABORTING' + activate OBJECT_STORE + OBJECT_STORE --> BULK_FULF_HANDLER: Bulk transfer association record commited + deactivate OBJECT_STORE + + note right of BULK_FULF_HANDLER #yellow + Message: + { + id: + from: , + to: , + type: "application/json" + content: { + headers: , + payload: "errorInformation": { + "errorCode": + "errorDescription": "", + } + }, + metadata: { + event: { + id: , + responseTo: , + type: "fulfil", + action: "bulk-abort", + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + BULK_FULF_HANDLER -> TOPIC_TRANSFER_FULFIL: Route & Publish fulfil bulk abort events to the Payer for the Individual Transfer\nError codes: 2003 + activate TOPIC_TRANSFER_FULFIL + deactivate TOPIC_TRANSFER_FULFIL + end +end +deactivate BULK_FULF_HANDLER +@enduml + diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.1.1-bulk-fulfil-handler.svg b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.1.1-bulk-fulfil-handler.svg new file mode 100644 index 000000000..7ab28f05f --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.1.1-bulk-fulfil-handler.svg @@ -0,0 +1,496 @@ + + 2.1.1. Bulk Fulfil Handler Consume + + + 2.1.1. Bulk Fulfil Handler Consume + + Central Service + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + mongo- + object-store + + + mongo- + object-store + + + topic-bulk- + fulfil + + + topic-bulk- + fulfil + Bulk Fulfil + Handler + + + Bulk Fulfil + Handler + + + + + topic-transfer- + fulfil + + + topic-transfer- + fulfil + + + topic-bulk- + processing + + + topic-bulk- + processing + + + topic-event + + + topic-event + + + topic-notification + + + topic-notification + Bulk DAO + + + Bulk DAO + + + Central Store + + + Central Store + + + + + + + + + + + + + + + + + + + + + 1 + Consume message + + + break + + + Validate Event + + + + + + 2 + Validate event - Rule: + type == 'bulk-fulfil' && action == 'bulk-commit' + Error codes: + 2001 + + + Persist Event Information + + + 3 + Publish event information + + + ref + Event Handler Consume +   + + + Validate FSPIOP-Signature + + + ref + Validate message.content.headers. + FSPIOP-Signature + Error codes: + 3105/3106 +   + + + Validate Bulk Fulfil Transfer + + + + + + 4 + Schema validation of the incoming message + + + + + + 5 + Verify the message's signature + (to be confirmed in future requirement) + + + The above validation steps are already handled by the + Bulk-API-Adapter for the open source implementation. + It may need to be added in future for custom adapters. + + + Validate Duplicate Check + + + 6 + Request Duplicate Check + + + ref + Request Duplicate Check +   + + + 7 + Return { hasDuplicateId: Boolean, hasDuplicateHash: Boolean } + + + alt + [hasDuplicateId == TRUE && hasDuplicateHash == TRUE] + + + break + + + 8 + Request to retrieve Bulk Transfer state & completedTimestamp + Error code: + 2003 + + + 9 + Query database + + bulkTransfer + bulkTransferFulfilment + bulkTransferStateChange + + + 10 + Return resultset + + + 11 + Return + bulkTransferStateId + & + completedTimestamp + (not null when completed) + + + Message: + { + id: <messageId> + from: <ledgerName>, + to: <payeeFspName>, + type: application/json + content: { + headers: <bulkTransferHeaders>, + payload: { + bulkTransferState: <string>, + completedTimestamp: <optional> + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: "notification", + action: "bulk-fulfil-duplicate", + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 12 + Publish Notification event for Payee + + [hasDuplicateId == TRUE && hasDuplicateHash == FALSE] + + + { + id: <messageId>, + from: <ledgerName", + to: <payeeFspName>, + type: "application/json", + content: { + headers: <bulkTransferHeaders>, + payload: { + errorInformation: { + errorCode: "3106", + errorDescription: "Modified request", + extensionList: { + extension: [ + { + key: "_cause", + value: <FSPIOPError> + } + ] + } + }, + uriParams: { + id: <bulkTransferId> + } + } + }, + metadata: { + correlationId: <uuid>, + event: { + id: <uuid>, + type: "notification", + action: "bulk-commit", + createdAt: <timestamp>, + state: { + status: "error", + code: "3106", + description: "Modified request" + }, + responseTo: <uuid> + } + } + } + + + 13 + Publish Notification (failure) event for Payer + Error codes: + 3106 + + [hasDuplicateId == FALSE] + + + alt + [Validate Bulk Transfer Fulfil (success)] + + + Persist Bulk Transfer State (with bulktransferState='PROCESSING') + + + 14 + Request to persist bulk transfer fulfil + Error codes: + 2003 + + + 15 + Persist bulkTransferFulfilment + + bulkTransferFulfilment + bulkTransferStateChange + bulkTransferExtension + + + 16 + Return success + + [Validate Bulk Transfer Fulfil (failure)] + + + Persist Bulk Transfer State (with bulkTransferState='ABORTING') + + + 17 + Request to persist bulk + transfer fulfil failure + Error codes: + 2003 + + + 18 + Persist transfer + + bulkTransferFulfilment + bulkTransferStateChange + bulkTransferExtension + bulkTransferError + + + 19 + Return success + + + alt + [Validate Bulk Transfer Fulfil (success)] + + + loop + [for every individual transfer in the bulk fulfil list] + + + 20 + Retrieve individual transfers from the bulk using + reference: + MLOS.individualTransferFulfils.messageId + + + 21 + Return stored bulk transfer containing individual transfers + + + 22 + Update bulk transfer association record to bulk transfer processing state 'PROCESSING' + + + 23 + Bulk transfer association record commited + + + Message: + { + id: <messageId> + from: <payeeFspName>, + to: <payerFspName>, + type: "application/json" + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: "fulfil", + action: "bulk-commit", + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 24 + Route & Publish fulfil bulk commit events to the Payer for the Individual Transfer + Error codes: + 2003 + + [Validate Bulk Transfer Fulfil (failure)] + + + loop + [for every individual transfer in the bulk fulfil list] + + + 25 + Retrieve individual transfers from the bulk using + reference: + MLOS.individualTransferFulfils.messageId + + + 26 + Stream bulk's individual transfer fulfils + + + 27 + Update bulk transfer association record to bulk transfer processing state 'ABORTING' + + + 28 + Bulk transfer association record commited + + + Message: + { + id: <messageId> + from: <payeeFspName>, + to: <payerFspName>, + type: "application/json" + content: { + headers: <transferHeaders>, + payload: "errorInformation": { + "errorCode": <possible codes: [3100]> + "errorDescription": "<description>", + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: "fulfil", + action: "bulk-abort", + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 29 + Route & Publish fulfil bulk abort events to the Payer for the Individual Transfer + Error codes: + 2003 + + diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.2.1-fulfil-handler-commit.plantuml b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.2.1-fulfil-handler-commit.plantuml new file mode 100644 index 000000000..b53afd2e5 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.2.1-fulfil-handler-commit.plantuml @@ -0,0 +1,236 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Rajiv Mothilal + * Sam Kummary + -------------- + ******'/ + +@startuml +' declate title +title 2.2.1. Fulfil Handler Consume (Success) individual transfers from Bulk + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store +' declare actors +collections "Fulfil-Topic" as TOPIC_FULFIL +control "Fulfil Handler" as FULF_HANDLER +collections "topic-\nevent" as TOPIC_EVENT +collections "topic-\ntransfer-position" as TOPIC_TRANSFER_POSITION +collections "topic-\nnotification" as TOPIC_NOTIFICATIONS +collections "topic-\nbulk-processing" as TOPIC_BULK_PROCESSING +entity "Position DAO" as POS_DAO +database "Central Store" as DB +box "Central Service" #LightYellow + participant TOPIC_FULFIL + participant FULF_HANDLER + participant TOPIC_TRANSFER_POSITION + participant TOPIC_EVENT + participant TOPIC_BULK_PROCESSING + participant TOPIC_NOTIFICATIONS + participant POS_DAO + participant DB +end box +' start flow +activate FULF_HANDLER +group Fulfil Handler Consume (Success) + TOPIC_FULFIL <- FULF_HANDLER: Consume Fulfil event message for Payer + activate TOPIC_FULFIL + deactivate TOPIC_FULFIL + break + group Validate Event + FULF_HANDLER <-> FULF_HANDLER: Validate event - Rule: type == 'fulfil' && action == 'bulk-commit'\nError codes: 2001 + end + end + group Persist Event Information + FULF_HANDLER -> TOPIC_EVENT: Publish event information + ref over FULF_HANDLER, TOPIC_EVENT: Event Handler Consume\n + end + group Validate FSPIOP-Signature + ||| + ref over FULF_HANDLER, TOPIC_NOTIFICATIONS: Validate message.content.headers.**FSPIOP-Signature**\nError codes: 3105/3106\n + ||| + end + + group Validate Duplicate Check + ||| + FULF_HANDLER -> DB: Request Duplicate Check + ref over FULF_HANDLER, DB: Request Duplicate Check\n + DB --> FULF_HANDLER: Return { hasDuplicateId: Boolean, hasDuplicateHash: Boolean } + end + + alt hasDuplicateId == TRUE && hasDuplicateHash == TRUE + break + FULF_HANDLER -> FULF_HANDLER: stateRecord = await getTransferState(transferId) + alt endStateList.includes(stateRecord.transferStateId) + ||| + ref over FULF_HANDLER, TOPIC_NOTIFICATIONS: getTransfer callback\n + FULF_HANDLER -> TOPIC_NOTIFICATIONS: Produce message + else + note right of FULF_HANDLER #lightgrey + Ignore - resend in progress + end note + end + end + else hasDuplicateId == TRUE && hasDuplicateHash == FALSE + note right of FULF_HANDLER #lightgrey + Validate Prepare Transfer (failure) - Modified Request + end note + else hasDuplicateId == FALSE + + end + + group Validate and persist Transfer Fulfilment + FULF_HANDLER -> POS_DAO: Request information for the validate checks\nError code: 2003 + activate POS_DAO + POS_DAO -> DB: Fetch from database + activate DB + hnote over DB #lightyellow + transfer + end note + DB --> POS_DAO + deactivate DB + FULF_HANDLER <-- POS_DAO: Return transfer + deactivate POS_DAO + FULF_HANDLER ->FULF_HANDLER: Validate that Transfer.ilpCondition = SHA-256 (content.payload.fulfilment)\nError code: 2001 + FULF_HANDLER -> FULF_HANDLER: Validate expirationDate\nError code: 3303 + + opt Transfer.ilpCondition validate successful + group Request current Settlement Window + FULF_HANDLER -> POS_DAO: Request to retrieve current/latest transfer settlement window\nError code: 2003 + activate POS_DAO + POS_DAO -> DB: Fetch settlementWindowId + activate DB + hnote over DB #lightyellow + settlementWindow + end note + DB --> POS_DAO + deactivate DB + FULF_HANDLER <-- POS_DAO: Return settlementWindowId to be appended during transferFulfilment insert\n**TODO**: During settlement design make sure transfers in 'RECEIVED-FULFIL'\nstate are updated to the next settlement window + deactivate POS_DAO + end + end + + group Persist fulfilment + FULF_HANDLER -> POS_DAO: Persist fulfilment with the result of the above check (transferFulfilment.isValid)\nError code: 2003 + activate POS_DAO + POS_DAO -> DB: Persist to database + activate DB + deactivate DB + hnote over DB #lightyellow + transferFulfilment + transferExtension + end note + FULF_HANDLER <-- POS_DAO: Return success + deactivate POS_DAO + end + + alt Transfer.ilpCondition validate successful + group Persist Transfer State (with transferState='RECEIVED-FULFIL') + FULF_HANDLER -> POS_DAO: Request to persist transfer state\nError code: 2003 + activate POS_DAO + POS_DAO -> DB: Persist transfer state + activate DB + hnote over DB #lightyellow + transferStateChange + end note + deactivate DB + POS_DAO --> FULF_HANDLER: Return success + deactivate POS_DAO + end + + note right of FULF_HANDLER #yellow + Message: + { + id: , + from: , + to: , + type: "application/json", + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: "position", + action: "bulk-commit", + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_TRANSFER_POSITION: Route & Publish Position event for Payee + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + else Validate Fulfil Transfer not successful + break + FULF_HANDLER -> FULF_HANDLER: Route & Publish Notification event for Payee\nReference: Failure in validation + end + end + end +end + +group Reference: Failure in validation + note right of FULF_HANDLER #yellow + Message: + { + id: , + from: , + to: , + type: "application/json", + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: "bulk-processing", + action: "bulk-commit", + createdAt: , + state: { + status: "error", + code: 1 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_BULK_PROCESSING: Publish Notification event for Payee to Bulk Processing Topic\nError codes: 2003 + activate TOPIC_BULK_PROCESSING + deactivate TOPIC_BULK_PROCESSING +end + +deactivate FULF_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.2.1-fulfil-handler-commit.svg b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.2.1-fulfil-handler-commit.svg new file mode 100644 index 000000000..6dccfb80f --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.2.1-fulfil-handler-commit.svg @@ -0,0 +1,401 @@ + + 2.2.1. Fulfil Handler Consume (Success) individual transfers from Bulk + + + 2.2.1. Fulfil Handler Consume (Success) individual transfers from Bulk + + Central Service + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Fulfil-Topic + + + Fulfil-Topic + Fulfil Handler + + + Fulfil Handler + + + + + topic- + transfer-position + + + topic- + transfer-position + + + topic- + event + + + topic- + event + + + topic- + bulk-processing + + + topic- + bulk-processing + + + topic- + notification + + + topic- + notification + Position DAO + + + Position DAO + + + Central Store + + + Central Store + + + + + + + + + + + + + + + + + Fulfil Handler Consume (Success) + + + 1 + Consume Fulfil event message for Payer + + + break + + + Validate Event + + + + + + 2 + Validate event - Rule: type == 'fulfil' && action == 'bulk-commit' + Error codes: + 2001 + + + Persist Event Information + + + 3 + Publish event information + + + ref + Event Handler Consume +   + + + Validate FSPIOP-Signature + + + ref + Validate message.content.headers. + FSPIOP-Signature + Error codes: + 3105/3106 +   + + + Validate Duplicate Check + + + 4 + Request Duplicate Check + + + ref + Request Duplicate Check +   + + + 5 + Return { hasDuplicateId: Boolean, hasDuplicateHash: Boolean } + + + alt + [hasDuplicateId == TRUE && hasDuplicateHash == TRUE] + + + break + + + + + 6 + stateRecord = await getTransferState(transferId) + + + alt + [endStateList.includes(stateRecord.transferStateId)] + + + ref + getTransfer callback +   + + + 7 + Produce message + + + + Ignore - resend in progress + + [hasDuplicateId == TRUE && hasDuplicateHash == FALSE] + + + Validate Prepare Transfer (failure) - Modified Request + + [hasDuplicateId == FALSE] + + + Validate and persist Transfer Fulfilment + + + 8 + Request information for the validate checks + Error code: + 2003 + + + 9 + Fetch from database + + transfer + + + 10 +   + + + 11 + Return transfer + + + + + 12 + Validate that Transfer.ilpCondition = SHA-256 (content.payload.fulfilment) + Error code: + 2001 + + + + + 13 + Validate expirationDate + Error code: + 3303 + + + opt + [Transfer.ilpCondition validate successful] + + + Request current Settlement Window + + + 14 + Request to retrieve current/latest transfer settlement window + Error code: + 2003 + + + 15 + Fetch settlementWindowId + + settlementWindow + + + 16 +   + + + 17 + Return settlementWindowId to be appended during transferFulfilment insert + TODO + : During settlement design make sure transfers in 'RECEIVED-FULFIL' + state are updated to the next settlement window + + + Persist fulfilment + + + 18 + Persist fulfilment with the result of the above check (transferFulfilment.isValid) + Error code: + 2003 + + + 19 + Persist to database + + transferFulfilment + transferExtension + + + 20 + Return success + + + alt + [Transfer.ilpCondition validate successful] + + + Persist Transfer State (with transferState='RECEIVED-FULFIL') + + + 21 + Request to persist transfer state + Error code: + 2003 + + + 22 + Persist transfer state + + transferStateChange + + + 23 + Return success + + + Message: + { + id: <messageId>, + from: <payeeFspName>, + to: <payerFspName>, + type: "application/json", + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: "position", + action: "bulk-commit", + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 24 + Route & Publish Position event for Payee + + [Validate Fulfil Transfer not successful] + + + break + + + + + 25 + Route & Publish Notification event for Payee + Reference: Failure in validation + + + Reference: Failure in validation + + + Message: + { + id: <messageId>, + from: <ledgerName>, + to: <payeeFspName>, + type: "application/json", + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: "bulk-processing", + action: "bulk-commit", + createdAt: <timestamp>, + state: { + status: "error", + code: 1 + } + } + } + } + + + 26 + Publish Notification event for Payee to Bulk Processing Topic + Error codes: + 2003 + + diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.2.2-fulfil-handler-abort.plantuml b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.2.2-fulfil-handler-abort.plantuml new file mode 100644 index 000000000..a90928354 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.2.2-fulfil-handler-abort.plantuml @@ -0,0 +1,616 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Rajiv Mothilal + * Sam Kummary + -------------- + ******'/ + +@startuml +' declate title +title 2.2.2. Fulfil Handler Consume (Reject/Abort) (single message, includes individual transfers from Bulk) + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store +' declare actors +collections "topic-\nfulfil" as TOPIC_FULFIL +control "Fulfil Handler" as FULF_HANDLER +collections "topic-\nevent" as TOPIC_EVENT +collections "topic-\ntransfer-position" as TOPIC_TRANSFER_POSITION +collections "topic-\nnotification" as TOPIC_NOTIFICATIONS +collections "topic-\nbulk-processing" as TOPIC_BULK_PROCESSING +'entity "Transfer Duplicate Facade" as DUP_FACADE +entity "Transfer DAO" as TRANS_DAO +database "Central Store" as DB +box "Central Service" #LightYellow + participant TOPIC_FULFIL + participant FULF_HANDLER + participant TOPIC_TRANSFER_POSITION + participant TOPIC_EVENT + participant TOPIC_BULK_PROCESSING + participant TOPIC_NOTIFICATIONS + participant TRANS_DAO + participant DB +end box +' start flow +activate FULF_HANDLER +group Fulfil Handler Consume (Failure) + alt Consume Single Message + TOPIC_FULFIL <- FULF_HANDLER: Consume Fulfil event message for Payer + activate TOPIC_FULFIL + deactivate TOPIC_FULFIL + break + group Validate Event + FULF_HANDLER <-> FULF_HANDLER: Validate event - Rule: type IN ['fulfil','bulk-fulfil'] && ( action IN ['reject','abort'] )\nError codes: 2001 + end + end + group Persist Event Information + FULF_HANDLER -> TOPIC_EVENT: Publish event information + ref over FULF_HANDLER, TOPIC_EVENT: Event Handler Consume\n + end + group Validate FSPIOP-Signature + ||| + ref over FULF_HANDLER, TOPIC_NOTIFICATIONS: Validate message.content.headers.**FSPIOP-Signature**\nError codes: 2001 + end + group Validate Transfer Fulfil Duplicate Check + FULF_HANDLER -> FULF_HANDLER: Generate transferFulfilmentId uuid + FULF_HANDLER -> TRANS_DAO: Request to retrieve transfer fulfilment hashes by transferId\nError code: 2003 + activate TRANS_DAO + TRANS_DAO -> DB: Request Transfer fulfilment \nduplicate message hashes + hnote over DB #lightyellow + SELET transferId, hash + FROM **transferFulfilmentDuplicateCheck** + WHERE transferId = request.params.id + end note + activate DB + TRANS_DAO <-- DB: Return existing hashes + deactivate DB + TRANS_DAO --> FULF_HANDLER: Return (list of) transfer fulfil messages hash(es) + deactivate TRANS_DAO + FULF_HANDLER -> FULF_HANDLER: Loop the list of returned hashes & compare \neach entry with the calculated message hash + alt Hash matched + ' Need to check what respond with same results if finalised then resend, else ignore and wait for response + FULF_HANDLER -> TRANS_DAO: Request to retrieve Transfer Fulfilment & Transfer state\nError code: 2003 + activate TRANS_DAO + TRANS_DAO -> DB: Request to retrieve \ntransferFulfilment & transferState + hnote over DB #lightyellow + transferFulfilment + transferStateChange + end note + activate DB + TRANS_DAO <-- DB: Return transferFulfilment & \ntransferState + deactivate DB + TRANS_DAO --> FULF_HANDLER: Return Transfer Fulfilment & Transfer state + deactivate TRANS_DAO + alt transferFulfilment.isValid == 0 + break + alt If type == 'fulfil' + note right of FULF_HANDLER #yellow + Message: + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: fulfil-duplicate, + createdAt: , + state: { + status: "error", + code: 1 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_NOTIFICATIONS: Publish Notification event for Payee - Modified Request\nError codes: 3106 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + else If type == 'bulk-fulfil' + note right of FULF_HANDLER #yellow + Message: + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: bulk-processing, + action: fulfil-duplicate, + createdAt: , + state: { + status: "error", + code: 1 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_BULK_PROCESSING: Publish Notification event for Payee - Modified Request \n3106 to Bulk Processing Topic\nError codes: 3106 + activate TOPIC_BULK_PROCESSING + deactivate TOPIC_BULK_PROCESSING + end + end + else transferState IN ['COMMITTED', 'ABORTED'] + break + alt If type == 'fulfil' + ref over FULF_HANDLER, TOPIC_NOTIFICATIONS: Send notification to Participant (Payee)\n + else If type == 'bulk-fulfil' + note right of FULF_HANDLER #yellow + Message: + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: bulk-processing, + action: fulfil-duplicate, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_BULK_PROCESSING: Publish Notification event for Payee to Bulk Processing Topic\nError codes: 2003 + activate TOPIC_BULK_PROCESSING + deactivate TOPIC_BULK_PROCESSING + end + end + else transferState NOT 'RESERVED' + break + FULF_HANDLER <-> FULF_HANDLER: Reference: Failure in validation\nError code: 2001 + end + else + break + alt If type == 'fulfil' + FULF_HANDLER <-> FULF_HANDLER: Allow previous request to complete + else If type == 'bulk-fulfil' + note right of FULF_HANDLER #yellow + Message: + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: bulk-processing, + action: fulfil-duplicate, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_BULK_PROCESSING: Publish Notification event for Payee to Bulk Processing Topic\nError codes: 2003 + activate TOPIC_BULK_PROCESSING + deactivate TOPIC_BULK_PROCESSING + end + end + end + else Hash not matched + FULF_HANDLER -> TRANS_DAO: Request to persist transfer hash\nError codes: 2003 + activate TRANS_DAO + TRANS_DAO -> DB: Persist hash + hnote over DB #lightyellow + transferFulfilmentDuplicateCheck + end note + activate DB + deactivate DB + TRANS_DAO --> FULF_HANDLER: Return success + deactivate TRANS_DAO + end + end + alt action=='reject' call made on PUT /transfers/{ID} + FULF_HANDLER -> TRANS_DAO: Request information for the validate checks\nError code: 2003 + activate TRANS_DAO + TRANS_DAO -> DB: Fetch from database + activate DB + hnote over DB #lightyellow + transfer + end note + DB --> TRANS_DAO + deactivate DB + FULF_HANDLER <-- TRANS_DAO: Return transfer + deactivate TRANS_DAO + + alt Fulfilment present in the PUT /transfers/{ID} message + FULF_HANDLER ->FULF_HANDLER: Validate that Transfer.ilpCondition = SHA-256 (content.payload.fulfilment)\nError code: 2001 + + group Persist fulfilment + FULF_HANDLER -> TRANS_DAO: Persist fulfilment with the result of the above check (transferFulfilment.isValid)\nError code: 2003 + activate TRANS_DAO + TRANS_DAO -> DB: Persist to database + activate DB + deactivate DB + hnote over DB #lightyellow + transferFulfilment + transferExtension + end note + FULF_HANDLER <-- TRANS_DAO: Return success + deactivate TRANS_DAO + end + else Fulfilment NOT present in the PUT /transfers/{ID} message + FULF_HANDLER ->FULF_HANDLER: Validate that transfer fulfilment message to Abort is valid\nError code: 2001 + group Persist extensions + FULF_HANDLER -> TRANS_DAO: Persist extensionList elements\nError code: 2003 + activate TRANS_DAO + TRANS_DAO -> DB: Persist to database + activate DB + deactivate DB + hnote over DB #lightyellow + transferExtension + end note + FULF_HANDLER <-- TRANS_DAO: Return success + deactivate TRANS_DAO + end + end + + alt Transfer.ilpCondition validate successful OR generic validation successful + group Persist Transfer State (with transferState='RECEIVED_REJECT') + FULF_HANDLER -> TRANS_DAO: Request to persist transfer state\nError code: 2003 + activate TRANS_DAO + TRANS_DAO -> DB: Persist transfer state + activate DB + hnote over DB #lightyellow + transferStateChange + end note + deactivate DB + TRANS_DAO --> FULF_HANDLER: Return success + end + + FULF_HANDLER -> FULF_HANDLER: Route & Publish Position event for Payer\nReference: Publish Position Reject event for Payer + + else Validate Fulfil Transfer not successful or Generic validation failed + break + FULF_HANDLER -> FULF_HANDLER: Publish event for Payee\nReference: Failure in validation + end + end + else action=='abort' Error callback + alt Validation successful + group Persist Transfer State (with transferState='RECEIVED_ERROR') + FULF_HANDLER -> TRANS_DAO: Request to persist transfer state & Error\nError code: 2003 + activate TRANS_DAO + TRANS_DAO -> DB: Persist transfer state & Error + activate DB + hnote over DB #lightyellow + transferStateChange + transferError + transferExtension + end note + deactivate DB + TRANS_DAO --> FULF_HANDLER: Return success + end + + FULF_HANDLER -> FULF_HANDLER: Error callback validated\nReference: Produce message for validated error callback + + else Validate Transfer Error Message not successful + break + FULF_HANDLER -> FULF_HANDLER: Notifications for failures\nReference: Validate Transfer Error Message not successful + end + end + end + else Consume Batch Messages + note left of FULF_HANDLER #lightblue + To be delivered by future story + end note + end +end + +group Reference: Validate Transfer Error Message not successful + alt If type == 'bulk-fulfil' + note right of FULF_HANDLER #yellow + Message: + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: bulk-processing, + action: abort, + createdAt: , + state: { + status: "error", + code: 1 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_BULK_PROCESSING: Publish Processing event for Payee to Bulk Processing Topic\nError codes: 2003 + activate TOPIC_BULK_PROCESSING + deactivate TOPIC_BULK_PROCESSING + else If type == 'fulfil' + note right of FULF_HANDLER #yellow + Message: + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: fulfil, + action: abort, + createdAt: , + state: { + status: "error", + code: 1 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_NOTIFICATIONS: Route & Publish Notification event for Payee + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end +end + +group Reference: Produce message for validated error callback + alt If type == 'bulk-fulfil' + note right of FULF_HANDLER #yellow + Message: + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: bulk-position, + action: abort, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_TRANSFER_POSITION: Route & Publish Position event for Payer + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + else If type == 'fulfil' + note right of FULF_HANDLER #yellow + Message: + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: position, + action: abort, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_TRANSFER_POSITION: Route & Publish Position event for Payer + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + end +end + +group Reference: Failure in validation + alt If type == 'bulk-fulfil' + note right of FULF_HANDLER #yellow + Message: + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: bulk-processing, + action: reject, + createdAt: , + state: { + status: "error", + code: 1 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_BULK_PROCESSING: Publish processing event to the Bulk Processing Topic\nError codes: 2003 + activate TOPIC_BULK_PROCESSING + deactivate TOPIC_BULK_PROCESSING + else If type == 'fulfil' + note right of FULF_HANDLER #yellow + Message: + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: fulfil, + action: reject, + createdAt: , + state: { + status: "error", + code: 1 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_NOTIFICATIONS: Route & Publish Notification event for Payee + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end +end + +group Reference: Publish Position Reject event for Payer + alt If type == 'bulk-fulfil' + note right of FULF_HANDLER #yellow + Message: + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: bulk-position, + action: reject, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_TRANSFER_POSITION: Route & Publish Position event for Payer + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + else If type == 'fulfil' + note right of FULF_HANDLER #yellow + Message: + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: position, + action: reject, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_TRANSFER_POSITION: Route & Publish Position event for Payer + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + end +end + +deactivate FULF_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.2.2-fulfil-handler-abort.svg b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.2.2-fulfil-handler-abort.svg new file mode 100644 index 000000000..6cb06df4e --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.2.2-fulfil-handler-abort.svg @@ -0,0 +1,949 @@ + + 2.2.2. Fulfil Handler Consume (Reject/Abort) (single message, includes individual transfers from Bulk) + + + 2.2.2. Fulfil Handler Consume (Reject/Abort) (single message, includes individual transfers from Bulk) + + Central Service + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + topic- + fulfil + + + topic- + fulfil + Fulfil Handler + + + Fulfil Handler + + + + + topic- + transfer-position + + + topic- + transfer-position + + + topic- + event + + + topic- + event + + + topic- + bulk-processing + + + topic- + bulk-processing + + + topic- + notification + + + topic- + notification + Transfer DAO + + + Transfer DAO + + + Central Store + + + Central Store + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Fulfil Handler Consume (Failure) + + + alt + [Consume Single Message] + + + 1 + Consume Fulfil event message for Payer + + + break + + + Validate Event + + + + + + 2 + Validate event - Rule: type IN ['fulfil','bulk-fulfil'] && ( action IN ['reject','abort'] ) + Error codes: + 2001 + + + Persist Event Information + + + 3 + Publish event information + + + ref + Event Handler Consume +   + + + Validate FSPIOP-Signature + + + ref + Validate message.content.headers. + FSPIOP-Signature + Error codes: + 2001 + + + Validate Transfer Fulfil Duplicate Check + + + + + 4 + Generate transferFulfilmentId uuid + + + 5 + Request to retrieve transfer fulfilment hashes by transferId + Error code: + 2003 + + + 6 + Request Transfer fulfilment + duplicate message hashes + + SELET transferId, hash + FROM + transferFulfilmentDuplicateCheck + WHERE transferId = request.params.id + + + 7 + Return existing hashes + + + 8 + Return (list of) transfer fulfil messages hash(es) + + + + + 9 + Loop the list of returned hashes & compare + each entry with the calculated message hash + + + alt + [Hash matched] + + + 10 + Request to retrieve Transfer Fulfilment & Transfer state + Error code: + 2003 + + + 11 + Request to retrieve + transferFulfilment & transferState + + transferFulfilment + transferStateChange + + + 12 + Return transferFulfilment & + transferState + + + 13 + Return Transfer Fulfilment & Transfer state + + + alt + [transferFulfilment.isValid == 0] + + + break + + + alt + [If type == 'fulfil'] + + + Message: + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: fulfil-duplicate, + createdAt: <timestamp>, + state: { + status: "error", + code: 1 + } + } + } + } + + + 14 + Publish Notification event for Payee - Modified Request + Error codes: + 3106 + + [If type == 'bulk-fulfil'] + + + Message: + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: bulk-processing, + action: fulfil-duplicate, + createdAt: <timestamp>, + state: { + status: "error", + code: 1 + } + } + } + } + + + 15 + Publish Notification event for Payee - Modified Request + 3106 to Bulk Processing Topic + Error codes: + 3106 + + [transferState IN ['COMMITTED', 'ABORTED']] + + + break + + + alt + [If type == 'fulfil'] + + + ref + Send notification to Participant (Payee) +   + + [If type == 'bulk-fulfil'] + + + Message: + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: bulk-processing, + action: fulfil-duplicate, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 16 + Publish Notification event for Payee to Bulk Processing Topic + Error codes: + 2003 + + [transferState NOT 'RESERVED'] + + + break + + + + + + 17 + Reference: Failure in validation + Error code: + 2001 + + + + break + + + alt + [If type == 'fulfil'] + + + + + + 18 + Allow previous request to complete + + [If type == 'bulk-fulfil'] + + + Message: + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: bulk-processing, + action: fulfil-duplicate, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 19 + Publish Notification event for Payee to Bulk Processing Topic + Error codes: + 2003 + + [Hash not matched] + + + 20 + Request to persist transfer hash + Error codes: + 2003 + + + 21 + Persist hash + + transferFulfilmentDuplicateCheck + + + 22 + Return success + + + alt + [action=='reject' call made on PUT /transfers/{ID}] + + + 23 + Request information for the validate checks + Error code: + 2003 + + + 24 + Fetch from database + + transfer + + + 25 +   + + + 26 + Return transfer + + + alt + [Fulfilment present in the PUT /transfers/{ID} message] + + + + + 27 + Validate that Transfer.ilpCondition = SHA-256 (content.payload.fulfilment) + Error code: + 2001 + + + Persist fulfilment + + + 28 + Persist fulfilment with the result of the above check (transferFulfilment.isValid) + Error code: + 2003 + + + 29 + Persist to database + + transferFulfilment + transferExtension + + + 30 + Return success + + [Fulfilment NOT present in the PUT /transfers/{ID} message] + + + + + 31 + Validate that transfer fulfilment message to Abort is valid + Error code: + 2001 + + + Persist extensions + + + 32 + Persist extensionList elements + Error code: + 2003 + + + 33 + Persist to database + + transferExtension + + + 34 + Return success + + + alt + [Transfer.ilpCondition validate successful OR generic validation successful] + + + Persist Transfer State (with transferState='RECEIVED_REJECT') + + + 35 + Request to persist transfer state + Error code: + 2003 + + + 36 + Persist transfer state + + transferStateChange + + + 37 + Return success + + + + + 38 + Route & Publish Position event for Payer + Reference: Publish Position Reject event for Payer + + [Validate Fulfil Transfer not successful or Generic validation failed] + + + break + + + + + 39 + Publish event for Payee + Reference: Failure in validation + + [action=='abort' Error callback] + + + alt + [Validation successful] + + + Persist Transfer State (with transferState='RECEIVED_ERROR') + + + 40 + Request to persist transfer state & Error + Error code: + 2003 + + + 41 + Persist transfer state & Error + + transferStateChange + transferError + transferExtension + + + 42 + Return success + + + + + 43 + Error callback validated + Reference: Produce message for validated error callback + + [Validate Transfer Error Message not successful] + + + break + + + + + 44 + Notifications for failures + Reference: Validate Transfer Error Message not successful + + [Consume Batch Messages] + + + To be delivered by future story + + + Reference: Validate Transfer Error Message not successful + + + alt + [If type == 'bulk-fulfil'] + + + Message: + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: bulk-processing, + action: abort, + createdAt: <timestamp>, + state: { + status: "error", + code: 1 + } + } + } + } + + + 45 + Publish Processing event for Payee to Bulk Processing Topic + Error codes: + 2003 + + [If type == 'fulfil'] + + + Message: + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: fulfil, + action: abort, + createdAt: <timestamp>, + state: { + status: "error", + code: 1 + } + } + } + } + + + 46 + Route & Publish Notification event for Payee + + + Reference: Produce message for validated error callback + + + alt + [If type == 'bulk-fulfil'] + + + Message: + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: bulk-position, + action: abort, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 47 + Route & Publish Position event for Payer + + [If type == 'fulfil'] + + + Message: + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: position, + action: abort, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 48 + Route & Publish Position event for Payer + + + Reference: Failure in validation + + + alt + [If type == 'bulk-fulfil'] + + + Message: + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: bulk-processing, + action: reject, + createdAt: <timestamp>, + state: { + status: "error", + code: 1 + } + } + } + } + + + 49 + Publish processing event to the Bulk Processing Topic + Error codes: + 2003 + + [If type == 'fulfil'] + + + Message: + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: fulfil, + action: reject, + createdAt: <timestamp>, + state: { + status: "error", + code: 1 + } + } + } + } + + + 50 + Route & Publish Notification event for Payee + + + Reference: Publish Position Reject event for Payer + + + alt + [If type == 'bulk-fulfil'] + + + Message: + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: bulk-position, + action: reject, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 51 + Route & Publish Position event for Payer + + [If type == 'fulfil'] + + + Message: + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: position, + action: reject, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 52 + Route & Publish Position event for Payer + + diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.3.1-position-fulfil.plantuml b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.3.1-position-fulfil.plantuml new file mode 100644 index 000000000..f992f9284 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.3.1-position-fulfil.plantuml @@ -0,0 +1,176 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Miguel de Barros + * Rajiv Mothilal + * Sam Kummary + -------------- + ******'/ + +@startuml +' declate title +title 2.3.1. Fulfil Position Handler Consume (single message, includes individual transfers from Bulk) + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistence Store + +' declare actors +control "Position Handler" as POS_HANDLER +collections "topic-\nnotifications" as TOPIC_NOTIFICATIONS +collections "topic-\nbulk-processing" as TOPIC_BULK_PROCESSING +entity "Position Facade" as POS_FACADE +entity "Position DAO" as POS_DAO +database "Central Store" as DB + +box "Central Service" #LightYellow + participant POS_HANDLER + participant TOPIC_NOTIFICATIONS + participant TOPIC_BULK_PROCESSING + participant POS_DAO + participant POS_FACADE + participant DB +end box + +' start flow +activate POS_HANDLER +group Fulfil Position Handler Consume + POS_HANDLER -> POS_DAO: Request current state of transfer from DB \nError code: 2003 + activate POS_DAO + POS_DAO -> DB: Retrieve current state of transfer from DB + activate DB + hnote over DB #lightyellow + transferStateChange + transferParticipant + end note + DB --> POS_DAO: Return current state of transfer from DB + deactivate DB + POS_DAO --> POS_HANDLER: Return current state of transfer from DB + deactivate POS_DAO + POS_HANDLER <-> POS_HANDLER: Validate current state (transferState is 'RECEIVED-FULFIL')\nError code: 2001 + group Persist Position change and Transfer State (with transferState='COMMITTED' on position check pass) + POS_HANDLER -> POS_FACADE: Request to persist latest position and state to DB\nError code: 2003 + group DB TRANSACTION + activate POS_FACADE + POS_FACADE -> DB: Select participantPosition.value FOR UPDATE from DB for Payee + activate DB + hnote over DB #lightyellow + participantPosition + end note + DB --> POS_FACADE: Return participantPosition.value from DB for Payee + deactivate DB + POS_FACADE <-> POS_FACADE: **latestPosition** = participantPosition.value - payload.amount.amount + POS_FACADE->DB: Persist latestPosition to DB for Payee + hnote over DB #lightyellow + UPDATE **participantPosition** + SET value = latestPosition + end note + activate DB + deactivate DB + POS_FACADE -> DB: Persist transfer state and participant position change + hnote over DB #lightyellow + INSERT **transferStateChange** transferStateId = 'COMMITTED' + + INSERT **participantPositionChange** + SET participantPositionId = participantPosition.participantPositionId, + transferStateChangeId = transferStateChange.transferStateChangeId, + value = latestPosition, + reservedValue = participantPosition.reservedValue + createdDate = new Date() + end note + activate DB + deactivate DB + deactivate POS_DAO + end + POS_FACADE --> POS_HANDLER: Return success + deactivate POS_FACADE + end + + alt If type == 'bulk-position' + note right of POS_HANDLER #yellow + Message: + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: bulk-processing, + action: bulk-commit, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + POS_HANDLER -> TOPIC_BULK_PROCESSING: Publish Transfer event to Bulk Processing Topic\nError codes: 2003 + activate TOPIC_BULK_PROCESSING + deactivate TOPIC_BULK_PROCESSING + else If type == 'position' + note right of POS_HANDLER #yellow + Message: + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: commit, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + POS_HANDLER -> TOPIC_NOTIFICATIONS: Publish Transfer event\nError code: 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end + +end +deactivate POS_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.3.1-position-fulfil.svg b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.3.1-position-fulfil.svg new file mode 100644 index 000000000..750ea14e1 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.3.1-position-fulfil.svg @@ -0,0 +1,238 @@ + + 2.3.1. Fulfil Position Handler Consume (single message, includes individual transfers from Bulk) + + + 2.3.1. Fulfil Position Handler Consume (single message, includes individual transfers from Bulk) + + Central Service + + + + + + + + + + + + + + + + + + + + Position Handler + + + Position Handler + + + + + topic- + notifications + + + topic- + notifications + + + topic- + bulk-processing + + + topic- + bulk-processing + Position DAO + + + Position DAO + + + Position Facade + + + Position Facade + + + Central Store + + + Central Store + + + + + + + + + + + + + + Fulfil Position Handler Consume + + + 1 + Request current state of transfer from DB + Error code: + 2003 + + + 2 + Retrieve current state of transfer from DB + + transferStateChange + transferParticipant + + + 3 + Return current state of transfer from DB + + + 4 + Return current state of transfer from DB + + + + + + 5 + Validate current state (transferState is 'RECEIVED-FULFIL') + Error code: + 2001 + + + Persist Position change and Transfer State (with transferState='COMMITTED' on position check pass) + + + 6 + Request to persist latest position and state to DB + Error code: + 2003 + + + DB TRANSACTION + + + 7 + Select participantPosition.value FOR UPDATE from DB for Payee + + participantPosition + + + 8 + Return participantPosition.value from DB for Payee + + + + + + 9 + latestPosition + = participantPosition.value - payload.amount.amount + + + 10 + Persist latestPosition to DB for Payee + + UPDATE + participantPosition + SET value = latestPosition + + + 11 + Persist transfer state and participant position change + + INSERT + transferStateChange + transferStateId = 'COMMITTED' +   + INSERT + participantPositionChange + SET participantPositionId = participantPosition.participantPositionId, + transferStateChangeId = transferStateChange.transferStateChangeId, + value = latestPosition, + reservedValue = participantPosition.reservedValue + createdDate = new Date() + + + 12 + Return success + + + alt + [If type == 'bulk-position'] + + + Message: + { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: bulk-processing, + action: bulk-commit, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 13 + Publish Transfer event to Bulk Processing Topic + Error codes: + 2003 + + [If type == 'position'] + + + Message: + { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: commit, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 14 + Publish Transfer event + Error code: + 2003 + + diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.3.2-position-abort.plantuml b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.3.2-position-abort.plantuml new file mode 100644 index 000000000..467666a01 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.3.2-position-abort.plantuml @@ -0,0 +1,419 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Rajiv Mothilal + * Sam Kummary + ------------- + ******'/ + +@startuml +' declate title +title 2.3.2. Abort Position Handler Consume (single message, includes individual transfers from Bulk) + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistence Store + +' declare actors +control "Position Handler" as POS_HANDLER +entity "Position DAO" as POS_DAO +collections "topic-\nnotification" as TOPIC_NOTIFICATIONS +collections "topic-\nbulk-processing" as TOPIC_BULK_PROCESSING +database "Central Store" as DB + +box "Central Service" #LightYellow + participant POS_HANDLER + participant TOPIC_NOTIFICATIONS + participant TOPIC_BULK_PROCESSING + participant POS_DAO + participant DB +end box + +' start flow +activate POS_HANDLER +group Abort Position Handler Consume + opt type IN ['position','bulk-position'] && action == 'timeout-reserved' + POS_HANDLER -> POS_DAO: Request current state of transfer from DB\nError code: 2003 + activate POS_DAO + POS_DAO -> DB: Retrieve current state of transfer from DB + activate DB + hnote over DB #lightyellow + transferStateChange + transferParticipant + end note + DB --> POS_DAO: Return current state of transfer from DB + deactivate DB + POS_DAO --> POS_HANDLER: Return current state of transfer from DB + deactivate POS_DAO + POS_HANDLER <-> POS_HANDLER: Validate current state \n(transferStateChange.transferStateId == 'RESERVED_TIMEOUT')\nError code: 2001 + + group Persist Position change and Transfer state + POS_HANDLER -> POS_HANDLER: **transferStateId** = 'EXPIRED_RESERVED' + POS_HANDLER -> POS_DAO: Request to persist latest position and state to DB\nError code: 2003 + group DB TRANSACTION IMPLEMENTATION + activate POS_DAO + POS_DAO -> DB: Select participantPosition.value FOR UPDATE for payerCurrencyId + activate DB + hnote over DB #lightyellow + participantPosition + end note + DB --> POS_DAO: Return participantPosition + deactivate DB + POS_DAO <-> POS_DAO: **latestPosition** = participantPosition - payload.amount.amount + POS_DAO->DB: Persist latestPosition to DB for Payer + hnote over DB #lightyellow + UPDATE **participantPosition** + SET value = latestPosition + end note + activate DB + deactivate DB + POS_DAO -> DB: Persist participant position change and state change + hnote over DB #lightyellow + INSERT **transferStateChange** + VALUES (transferStateId) + + INSERT **participantPositionChange** + SET participantPositionId = participantPosition.participantPositionId, + transferStateChangeId = transferStateChange.transferStateChangeId, + value = latestPosition, + reservedValue = participantPosition.reservedValue + createdDate = new Date() + end note + activate DB + deactivate DB + end + POS_DAO --> POS_HANDLER: Return success + deactivate POS_DAO + end + alt If type == 'bulk-position' + note right of POS_HANDLER #yellow + Message: { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": 3300, + "errorDescription": "Transfer expired", + "extensionList": + } + } + }, + metadata: { + event: { + id: , + responseTo: , + type: bulk-processing, + action: abort, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + POS_HANDLER -> TOPIC_BULK_PROCESSING: Publish Transfer event to Bulk Processing Topic (for Payer) \nError codes: 2003 + activate TOPIC_BULK_PROCESSING + deactivate TOPIC_BULK_PROCESSING + else If type == 'position' + note right of POS_HANDLER #yellow + Message: { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": 3300, + "errorDescription": "Transfer expired", + "extensionList": + } + } + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: abort, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + POS_HANDLER -> TOPIC_NOTIFICATIONS: Publish Notification event\nError code: 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end + end + opt type IN ['position','bulk-position'] && (action IN ['reject', 'abort']) + POS_HANDLER -> POS_DAO: Request current state of transfer from DB\nError code: 2003 + activate POS_DAO + POS_DAO -> DB: Retrieve current state of transfer from DB + activate DB + hnote over DB #lightyellow + transferStateChange + end note + DB --> POS_DAO: Return current state of transfer from DB + deactivate DB + POS_DAO --> POS_HANDLER: Return current state of transfer from DB + deactivate POS_DAO + POS_HANDLER <-> POS_HANDLER: Validate current state \n(transferStateChange.transferStateId IN ['RECEIVED_REJECT', 'RECEIVED_ERROR'])\nError code: 2001 + + group Persist Position change and Transfer state + POS_HANDLER -> POS_HANDLER: **transferStateId** = (action == 'reject' ? 'ABORTED_REJECTED' : 'ABORTED_ERROR' ) + POS_HANDLER -> POS_DAO: Request to persist latest position and state to DB\nError code: 2003 + group Refer to DB TRANSACTION IMPLEMENTATION above + activate POS_DAO + POS_DAO -> DB: Persist to database + activate DB + deactivate DB + hnote over DB #lightyellow + participantPosition + transferStateChange + participantPositionChange + end note + end + POS_DAO --> POS_HANDLER: Return success + deactivate POS_DAO + end + alt If action == 'reject' + alt If type == 'position' + note right of POS_HANDLER #yellow + Message: { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: reject, + createdAt: , + state: { + status: "success", + code: 0, + description: "action successful" + } + } + } + } + end note + POS_HANDLER -> TOPIC_NOTIFICATIONS: Publish Notification event\nError code: 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + else If type == 'bulk-position' + note right of POS_HANDLER #yellow + Message: { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: bulk-processing, + action: reject, + createdAt: , + state: { + status: "success", + code: 0, + description: "action successful" + } + } + } + } + end note + POS_HANDLER -> TOPIC_BULK_PROCESSING: Publish Notification event\nError code: 2003 + activate TOPIC_BULK_PROCESSING + deactivate TOPIC_BULK_PROCESSING + end + else action == 'abort' + note right of POS_HANDLER #yellow + Message: { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: abort, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + POS_HANDLER -> TOPIC_NOTIFICATIONS: Publish Notification event\nError code: 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end + end + + ' TODO: We do not see how this scenario will be triggered + opt type IN ['position','bulk-position'] && action == 'fail' (Unable to currently trigger this scenario) + POS_HANDLER -> POS_DAO: Request current state of transfer from DB\nError code: 2003 + activate POS_DAO + POS_DAO -> DB: Retrieve current state of transfer from DB + activate DB + hnote over DB #lightyellow + transferStateChange + end note + DB --> POS_DAO: Return current state of transfer from DB + deactivate DB + POS_DAO --> POS_HANDLER: Return current state of transfer from DB + deactivate POS_DAO + POS_HANDLER <-> POS_HANDLER: Validate current state (transferStateChange.transferStateId == 'FAILED') + + group Persist Position change and Transfer state + POS_HANDLER -> POS_HANDLER: **transferStateId** = 'FAILED' + POS_HANDLER -> POS_DAO: Request to persist latest position and state to DB\nError code: 2003 + group Refer to DB TRANSACTION IMPLEMENTATION above + activate POS_DAO + POS_DAO -> DB: Persist to database + activate DB + deactivate DB + hnote over DB #lightyellow + participantPosition + transferStateChange + participantPositionChange + end note + end + POS_DAO --> POS_HANDLER: Return success + deactivate POS_DAO + end + alt If type =='position' + note right of POS_HANDLER #yellow + Message: { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": 3100, + "errorDescription": "Transfer failed", + "extensionList": + } + } + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: abort, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + POS_HANDLER -> TOPIC_NOTIFICATIONS: Publish Notification event\nError code: 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + else If type =='bulk-position' + note right of POS_HANDLER #yellow + Message: { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": 3100, + "errorDescription": "Transfer failed", + "extensionList": + } + } + }, + metadata: { + event: { + id: , + responseTo: , + type: bulk-processing, + action: abort, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + POS_HANDLER -> TOPIC_BULK_PROCESSING: Publish Notification event\nError code: 2003 + activate TOPIC_BULK_PROCESSING + deactivate TOPIC_BULK_PROCESSING + end + end +end +deactivate POS_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.3.2-position-abort.svg b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.3.2-position-abort.svg new file mode 100644 index 000000000..038eaff5f --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-2.3.2-position-abort.svg @@ -0,0 +1,613 @@ + + 2.3.2. Abort Position Handler Consume (single message, includes individual transfers from Bulk) + + + 2.3.2. Abort Position Handler Consume (single message, includes individual transfers from Bulk) + + Central Service + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Position Handler + + + Position Handler + + + + + topic- + notification + + + topic- + notification + + + topic- + bulk-processing + + + topic- + bulk-processing + Position DAO + + + Position DAO + + + Central Store + + + Central Store + + + + + + + + + + + + + + + + + + + + + + + + + + + Abort Position Handler Consume + + + opt + [type IN ['position','bulk-position'] && action == 'timeout-reserved'] + + + 1 + Request current state of transfer from DB + Error code: + 2003 + + + 2 + Retrieve current state of transfer from DB + + transferStateChange + transferParticipant + + + 3 + Return current state of transfer from DB + + + 4 + Return current state of transfer from DB + + + + + + 5 + Validate current state + (transferStateChange.transferStateId == 'RESERVED_TIMEOUT') + Error code: + 2001 + + + Persist Position change and Transfer state + + + + + 6 + transferStateId + = 'EXPIRED_RESERVED' + + + 7 + Request to persist latest position and state to DB + Error code: + 2003 + + + DB TRANSACTION IMPLEMENTATION + + + 8 + Select participantPosition.value FOR UPDATE for payerCurrencyId + + participantPosition + + + 9 + Return participantPosition + + + + + + 10 + latestPosition + = participantPosition - payload.amount.amount + + + 11 + Persist latestPosition to DB for Payer + + UPDATE + participantPosition + SET value = latestPosition + + + 12 + Persist participant position change and state change + + INSERT + transferStateChange +   + VALUES (transferStateId) +   + INSERT + participantPositionChange + SET participantPositionId = participantPosition.participantPositionId, + transferStateChangeId = transferStateChange.transferStateChangeId, + value = latestPosition, + reservedValue = participantPosition.reservedValue + createdDate = new Date() + + + 13 + Return success + + + alt + [If type == 'bulk-position'] + + + Message: { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": 3300, + "errorDescription": "Transfer expired", + "extensionList": <transferMessage.extensionList> + } + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: bulk-processing, + action: abort, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 14 + Publish Transfer event to Bulk Processing Topic (for Payer) + Error codes: + 2003 + + [If type == 'position'] + + + Message: { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": 3300, + "errorDescription": "Transfer expired", + "extensionList": <transferMessage.extensionList> + } + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: abort, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 15 + Publish Notification event + Error code: + 2003 + + + opt + [type IN ['position','bulk-position'] && (action IN ['reject', 'abort'])] + + + 16 + Request current state of transfer from DB + Error code: + 2003 + + + 17 + Retrieve current state of transfer from DB + + transferStateChange + + + 18 + Return current state of transfer from DB + + + 19 + Return current state of transfer from DB + + + + + + 20 + Validate current state + (transferStateChange.transferStateId IN ['RECEIVED_REJECT', 'RECEIVED_ERROR']) + Error code: + 2001 + + + Persist Position change and Transfer state + + + + + 21 + transferStateId + = (action == 'reject' ? 'ABORTED_REJECTED' : 'ABORTED_ERROR' ) + + + 22 + Request to persist latest position and state to DB + Error code: + 2003 + + + Refer to + DB TRANSACTION IMPLEMENTATION + above + + + 23 + Persist to database + + participantPosition + transferStateChange + participantPositionChange + + + 24 + Return success + + + alt + [If action == 'reject'] + + + alt + [If type == 'position'] + + + Message: { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: reject, + createdAt: <timestamp>, + state: { + status: "success", + code: 0, + description: "action successful" + } + } + } + } + + + 25 + Publish Notification event + Error code: + 2003 + + [If type == 'bulk-position'] + + + Message: { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: bulk-processing, + action: reject, + createdAt: <timestamp>, + state: { + status: "success", + code: 0, + description: "action successful" + } + } + } + } + + + 26 + Publish Notification event + Error code: + 2003 + + [action == 'abort'] + + + Message: { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: abort, + createdAt: <timestamp>, + state: { + status: 'error', + code: <payload.errorInformation.errorCode || 5000> + description: <payload.errorInformation.errorDescription> + } + } + } + } + + + 27 + Publish Notification event + Error code: + 2003 + + + opt + [type IN ['position','bulk-position'] && action == 'fail' (Unable to currently trigger this scenario)] + + + 28 + Request current state of transfer from DB + Error code: + 2003 + + + 29 + Retrieve current state of transfer from DB + + transferStateChange + + + 30 + Return current state of transfer from DB + + + 31 + Return current state of transfer from DB + + + + + + 32 + Validate current state (transferStateChange.transferStateId == 'FAILED') + + + Persist Position change and Transfer state + + + + + 33 + transferStateId + = 'FAILED' + + + 34 + Request to persist latest position and state to DB + Error code: + 2003 + + + Refer to + DB TRANSACTION IMPLEMENTATION + above + + + 35 + Persist to database + + participantPosition + transferStateChange + participantPositionChange + + + 36 + Return success + + + alt + [If type =='position'] + + + Message: { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": 3100, + "errorDescription": "Transfer failed", + "extensionList": <transferMessage.extensionList> + } + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: abort, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 37 + Publish Notification event + Error code: + 2003 + + [If type =='bulk-position'] + + + Message: { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": 3100, + "errorDescription": "Transfer failed", + "extensionList": <transferMessage.extensionList> + } + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: bulk-processing, + action: abort, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 38 + Publish Notification event + Error code: + 2003 + + diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-3.1.0-timeout-overview.plantuml b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-3.1.0-timeout-overview.plantuml new file mode 100644 index 000000000..3f29d4657 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-3.1.0-timeout-overview.plantuml @@ -0,0 +1,230 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + -------------- + ******'/ + +@startuml +' declate title +title 3.1.0. Transfer Timeout (incl. Bulk Transfer) + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +actor "DFSP1\nPayer" as DFSP1 +actor "DFSP2\nPayee" as DFSP2 +boundary "ML API\nAdapter" as MLAPI +control "ML API Notification\nEvent Handler" as NOTIFY_HANDLER +control "Transfer Timeout\nHandler" as EXP_HANDLER +collections "topic-\ntransfer-position" as TOPIC_TRANSFER_POSITION +control "Position Event\nHandler" as POS_HANDLER +control "Bulk Processing\nHandler" as BULK_PROCESSING_HANDLER +collections "topic-\nnotification" as TOPIC_NOTIFICATIONS +collections "topic-event" as TOPIC_EVENT +collections "topic-\nbulk-processing" as BULK_PROCESSING_TOPIC + +box "Financial Service Providers" #lightGray + participant DFSP1 + participant DFSP2 +end box + +box "ML API Adapter Service" #LightBlue + participant MLAPI + participant NOTIFY_HANDLER +end box + +box "Central Service" #LightYellow + participant EXP_HANDLER + participant TOPIC_TRANSFER_POSITION + participant TOPIC_EVENT + participant POS_HANDLER + participant TOPIC_NOTIFICATIONS + participant BULK_PROCESSING_HANDLER + participant BULK_PROCESSING_TOPIC +end box + +' start flow +activate NOTIFY_HANDLER +activate EXP_HANDLER +activate POS_HANDLER +activate BULK_PROCESSING_HANDLER +group Transfer Expiry + ||| + ref over EXP_HANDLER, TOPIC_EVENT : Timeout Handler Consume\n + alt transferStateId == 'RECEIVED_PREPARE' + alt Regular Transfer + EXP_HANDLER -> TOPIC_NOTIFICATIONS: Produce message + else Individual Transfer from a Bulk + EXP_HANDLER -> BULK_PROCESSING_TOPIC: Produce message + end + else transferStateId == 'RESERVED' + EXP_HANDLER -> TOPIC_TRANSFER_POSITION: Produce message + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consume message + ref over TOPIC_TRANSFER_POSITION, TOPIC_NOTIFICATIONS : Position Hander Consume (Timeout)\n + alt Regular Transfer + POS_HANDLER -> TOPIC_NOTIFICATIONS: Produce message + else Individual Transfer from a Bulk + POS_HANDLER -> BULK_PROCESSING_TOPIC: Produce message + end + end + opt action IN ['bulk-timeout-received', 'bulk-timeout-reserved'] + ||| + BULK_PROCESSING_TOPIC <- BULK_PROCESSING_HANDLER: Consume message + ref over TOPIC_NOTIFICATIONS, BULK_PROCESSING_TOPIC : Bulk Processing Consume\n + BULK_PROCESSING_HANDLER -> TOPIC_NOTIFICATIONS: Produce message + end + ||| + opt action IN ['timeout-received', 'timeout-reserved', 'bulk-timeout-received', 'bulk-timeout-reserved'] + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consume message + ref over DFSP1, TOPIC_NOTIFICATIONS : Send notification to Participant (Payer)\n + alt Timeout before any processing + note left of NOTIFY_HANDLER #yellow + PUT /bulkTransfers/ + { + headers: , + body: { + "bulkTransferState": "COMPLETED", + "completedTimestamp": "2022-08-18T01:00:24.407Z", + "individualTransferResults": [ + { + "errorInformation": { + "errorCode": "3303", + "errorDescription": "Transfer expired", + "extensionList": + } + "transferId": + }, + { + "errorInformation": { + "errorCode": "3303", + "errorDescription": "Transfer expired", + "extensionList": + } + "transferId": + }, + ] + } + } + end note + else Timeout in middle of processing + note left of NOTIFY_HANDLER #yellow + PUT /bulkTransfers/ + { + headers: , + body: { + "bulkTransferState": "COMPLETED", + "completedTimestamp": "2022-08-18T01:00:24.407Z", + "individualTransferResults": [ + { + "transferId": , + "fulfilment": + }, + { + "errorInformation": { + "errorCode": "3303", + "errorDescription": "Transfer expired", + "extensionList": + } + "transferId": + }, + ] + } + } + end note + end + NOTIFY_HANDLER -> DFSP1: Send callback notification + end + ||| + opt action IN ['timeout-reserved', 'bulk-timeout-reserved'] + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consume message + ref over DFSP2, TOPIC_NOTIFICATIONS : Send notification to Participant (Payee)\n + alt Timeout before any processing + note left of NOTIFY_HANDLER #yellow + PUT /bulkTransfers/ + { + headers: , + body: { + "bulkTransferState": "COMPLETED", + "completedTimestamp": "2022-08-18T01:00:24.407Z", + "individualTransferResults": [ + { + "errorInformation": { + "errorCode": "3303", + "errorDescription": "Transfer expired", + "extensionList": + } + "transferId": + }, + { + "errorInformation": { + "errorCode": "3303", + "errorDescription": "Transfer expired", + "extensionList": + } + "transferId": + }, + ] + } + } + end note + else Timeout in middle of processing + note left of NOTIFY_HANDLER #yellow + PUT /bulkTransfers/ + { + headers: , + body: { + "bulkTransferState": "COMPLETED", + "completedTimestamp": "2022-08-18T01:00:24.407Z", + "individualTransferResults": [ + { + "transferId": , + "fulfilment": + }, + { + "errorInformation": { + "errorCode": "3303", + "errorDescription": "Transfer expired", + "extensionList": + } + "transferId": + }, + ] + } + } + end note + end + NOTIFY_HANDLER -> DFSP2: Send callback notification + end +end +deactivate BULK_PROCESSING_HANDLER +deactivate POS_HANDLER +deactivate EXP_HANDLER +deactivate NOTIFY_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-3.1.0-timeout-overview.svg b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-3.1.0-timeout-overview.svg new file mode 100644 index 000000000..e9424fc66 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-3.1.0-timeout-overview.svg @@ -0,0 +1,349 @@ + + 3.1.0. Transfer Timeout (incl. Bulk Transfer) + + + 3.1.0. Transfer Timeout (incl. Bulk Transfer) + + Financial Service Providers + + ML API Adapter Service + + Central Service + + + + + + + + + + + + + + + + + + + + + + + + + DFSP1 + Payer + + + DFSP1 + Payer + + + DFSP2 + Payee + + + DFSP2 + Payee + + + ML API + Adapter + + + ML API + Adapter + + + ML API Notification + Event Handler + + + ML API Notification + Event Handler + + + Transfer Timeout + Handler + + + Transfer Timeout + Handler + + + + + topic- + transfer-position + + + topic- + transfer-position + + + topic-event + + + topic-event + Position Event + Handler + + + Position Event + Handler + + + + + topic- + notification + + + topic- + notification + Bulk Processing + Handler + + + Bulk Processing + Handler + + + + + topic- + bulk-processing + + + topic- + bulk-processing + + + + + + + Transfer Expiry + + + ref + Timeout Handler Consume +   + + + alt + [transferStateId == 'RECEIVED_PREPARE'] + + + alt + [Regular Transfer] + + + 1 + Produce message + + [Individual Transfer from a Bulk] + + + 2 + Produce message + + [transferStateId == 'RESERVED'] + + + 3 + Produce message + + + 4 + Consume message + + + ref + Position Hander Consume (Timeout) +   + + + alt + [Regular Transfer] + + + 5 + Produce message + + [Individual Transfer from a Bulk] + + + 6 + Produce message + + + opt + [action IN ['bulk-timeout-received', 'bulk-timeout-reserved']] + + + 7 + Consume message + + + ref + Bulk Processing Consume +   + + + 8 + Produce message + + + opt + [action IN ['timeout-received', 'timeout-reserved', 'bulk-timeout-received', 'bulk-timeout-reserved']] + + + 9 + Consume message + + + ref + Send notification to Participant (Payer) +   + + + alt + [Timeout before any processing] + + + PUT /bulkTransfers/<ID> + { + headers: <bulkTransferHeaders>, + body: { + "bulkTransferState": "COMPLETED", + "completedTimestamp": "2022-08-18T01:00:24.407Z", + "individualTransferResults": [ + { + "errorInformation": { + "errorCode": "3303", + "errorDescription": "Transfer expired", + "extensionList": <transferMessage.extensionList> + } + "transferId": <ID> + }, + { + "errorInformation": { + "errorCode": "3303", + "errorDescription": "Transfer expired", + "extensionList": <transferMessage.extensionList> + } + "transferId": <ID> + }, + ] + } + } + + [Timeout in middle of processing] + + + PUT /bulkTransfers/<ID> + { + headers: <bulkTransferHeaders>, + body: { + "bulkTransferState": "COMPLETED", + "completedTimestamp": "2022-08-18T01:00:24.407Z", + "individualTransferResults": [ + { + "transferId": <ID>, + "fulfilment": <fulfilment> + }, + { + "errorInformation": { + "errorCode": "3303", + "errorDescription": "Transfer expired", + "extensionList": <transferMessage.extensionList> + } + "transferId": <ID> + }, + ] + } + } + + + 10 + Send callback notification + + + opt + [action IN ['timeout-reserved', 'bulk-timeout-reserved']] + + + 11 + Consume message + + + ref + Send notification to Participant (Payee) +   + + + alt + [Timeout before any processing] + + + PUT /bulkTransfers/<ID> + { + headers: <bulkTransferHeaders>, + body: { + "bulkTransferState": "COMPLETED", + "completedTimestamp": "2022-08-18T01:00:24.407Z", + "individualTransferResults": [ + { + "errorInformation": { + "errorCode": "3303", + "errorDescription": "Transfer expired", + "extensionList": <transferMessage.extensionList> + } + "transferId": <ID> + }, + { + "errorInformation": { + "errorCode": "3303", + "errorDescription": "Transfer expired", + "extensionList": <transferMessage.extensionList> + } + "transferId": <ID> + }, + ] + } + } + + [Timeout in middle of processing] + + + PUT /bulkTransfers/<ID> + { + headers: <bulkTransferHeaders>, + body: { + "bulkTransferState": "COMPLETED", + "completedTimestamp": "2022-08-18T01:00:24.407Z", + "individualTransferResults": [ + { + "transferId": <ID>, + "fulfilment": <fulfilment> + }, + { + "errorInformation": { + "errorCode": "3303", + "errorDescription": "Transfer expired", + "extensionList": <transferMessage.extensionList> + } + "transferId": <ID> + }, + ] + } + } + + + 12 + Send callback notification + + diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-3.1.1-timeout-handler.plantuml b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-3.1.1-timeout-handler.plantuml new file mode 100644 index 000000000..1c9343431 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-3.1.1-timeout-handler.plantuml @@ -0,0 +1,420 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Rajiv Mothilal + -------------- + ******'/ + +@startuml +' declare title +title 3.1.1. Timeout Handler Consume (incl. Bulk Transfer) + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +control "Transfer Timeout\nHandler" as TIMEOUT_HANDLER +collections "topic-\ntransfer-position" as TOPIC_TRANSFER_POSITION +collections "topic-\nnotification" as NOTIFICATIONS_TOPIC +collections "topic-event" as EVENT_TOPIC +collections "topic-\nbulk-processing" as BULK_PROCESSING_TOPIC +entity "Segment DAO" as SEGMENT_DAO +entity "Position DAO" as POS_DAO +database "Central Store" as DB + +box "Central Service" #LightYellow + participant TIMEOUT_HANDLER + participant TOPIC_TRANSFER_POSITION + participant NOTIFICATIONS_TOPIC + participant EVENT_TOPIC + participant BULK_PROCESSING_TOPIC + participant POS_DAO + participant SEGMENT_DAO + participant DB +end box + +' start flow + +group Timeout Handler Consume + activate TIMEOUT_HANDLER + group Persist Event Information + TIMEOUT_HANDLER -> EVENT_TOPIC: Publish event information + ref over TIMEOUT_HANDLER, EVENT_TOPIC : Event Handler Consume\n + end + + group Get previous checkpoint of last record processed (Lower limit for inclusion) + TIMEOUT_HANDLER -> SEGMENT_DAO: Get last segment as @intervalMin + activate SEGMENT_DAO + SEGMENT_DAO -> DB: Get last segment as @intervalMin + hnote over DB #lightyellow + SELECT value INTO @intervalMin + FROM **segment** + WHERE segmentType = 'timeout' + AND enumeration = 0 + AND tableName = 'transferStateChange' + end note + activate DB + DB --> SEGMENT_DAO: Return @intervalMin + deactivate DB + SEGMENT_DAO --> TIMEOUT_HANDLER: Return @intervalMin + deactivate SEGMENT_DAO + opt @intervalMin IS NULL => segment record NOT FOUND + TIMEOUT_HANDLER->TIMEOUT_HANDLER: Set @intervalMin = 0 + end + end + + group Do Cleanup + TIMEOUT_HANDLER -> POS_DAO: Clean up transferTimeout from finalised transfers + activate POS_DAO + POS_DAO -> DB: Clean up transferTimeout from finalised transfers + hnote over DB #lightyellow + DELETE tt + FROM **transferTimeout** AS tt + JOIN (SELECT tsc.transferId, MAX(tsc.transferStateChangeId) maxTransferStateChangeId + FROM **transferTimeout** tt1 + JOIN **transferStateChange** tsc + ON tsc.transferId = tt1.transferId + GROUP BY transferId) ts + ON ts.transferId = tt.transferId + JOIN **transferStateChange** tsc + ON tsc.transferStateChangeId = ts.maxTransferStateChangeId + WHERE tsc.transferStateId IN ('RECEIVED_FULFIL', 'COMMITTED', 'FAILED' + , 'EXPIRED', 'REJECTED', 'EXPIRED_PREPARED', 'EXPIRED_RESERVED', 'ABORTED') + end note + activate DB + deactivate DB + POS_DAO --> TIMEOUT_HANDLER: Return success + deactivate POS_DAO + end + + group Determine IntervalMax (Upper limit for inclusion) + TIMEOUT_HANDLER -> POS_DAO: Get last transferStateChangeId as @intervalMax + activate POS_DAO + POS_DAO -> DB: Get last transferStateChangeId as @intervalMax + hnote over DB #lightyellow + SELECT MAX(transferStateChangeId) INTO @intervalMax + FROM **transferStateChange** + end note + activate DB + DB --> POS_DAO: Return @intervalMax + deactivate DB + POS_DAO --> TIMEOUT_HANDLER: Return @intervalMax + deactivate POS_DAO + end + + + group Prepare data and return the list for expiration + TIMEOUT_HANDLER -> POS_DAO: Prepare data and get transfers to be expired + activate POS_DAO + group DB TRANSACTION + POS_DAO <-> POS_DAO: **transactionTimestamp** = now() + POS_DAO -> DB: Insert all new transfers still in processing state + hnote over DB #lightyellow + INSERT INTO **transferTimeout**(transferId, expirationDate) + SELECT t.transferId, t.expirationDate + FROM **transfer** t + JOIN (SELECT transferId, MAX(transferStateChangeId) maxTransferStateChangeId + FROM **transferStateChange** + WHERE transferStateChangeId > @intervalMin + AND transferStateChangeId <= @intervalMax + GROUP BY transferId) ts + ON ts.transferId = t.transferId + JOIN **transferStateChange** tsc + ON tsc.transferStateChangeId = ts.maxTransferStateChangeId + WHERE tsc.transferStateId IN ('RECEIVED_PREPARE', 'RESERVED') + end note + activate DB + deactivate DB + + POS_DAO -> DB: Insert transfer state ABORTED for\nexpired RECEIVED_PREPARE transfers + hnote over DB #lightyellow + INSERT INTO **transferStateChange** + SELECT tt.transferId, 'EXPIRED_PREPARED' AS transferStateId, 'Aborted by Timeout Handler' AS reason + FROM **transferTimeout** tt + JOIN ( -- Following subquery is reused 3 times and may be optimized if needed + SELECT tsc1.transferId, MAX(tsc1.transferStateChangeId) maxTransferStateChangeId + FROM **transferStateChange** tsc1 + JOIN **transferTimeout** tt1 + ON tt1.transferId = tsc1.transferId + GROUP BY tsc1.transferId) ts + ON ts.transferId = tt.transferId + JOIN **transferStateChange** tsc + ON tsc.transferStateChangeId = ts.maxTransferStateChangeId + WHERE tt.expirationDate < {transactionTimestamp} + AND tsc.transferStateId = 'RECEIVED_PREPARE' + end note + activate DB + deactivate DB + + POS_DAO -> DB: Insert transfer state EXPIRED for\nexpired RESERVED transfers + hnote over DB #lightyellow + INSERT INTO **transferStateChange** + SELECT tt.transferId, 'RESERVED_TIMEOUT' AS transferStateId, 'Expired by Timeout Handler' AS reason + FROM **transferTimeout** tt + JOIN (SELECT tsc1.transferId, MAX(tsc1.transferStateChangeId) maxTransferStateChangeId + FROM **transferStateChange** tsc1 + JOIN **transferTimeout** tt1 + ON tt1.transferId = tsc1.transferId + GROUP BY tsc1.transferId) ts + ON ts.transferId = tt.transferId + JOIN **transferStateChange** tsc + ON tsc.transferStateChangeId = ts.maxTransferStateChangeId + WHERE tt.expirationDate < {transactionTimestamp} + AND tsc.transferStateId = 'RESERVED' + end note + activate DB + deactivate DB + + POS_DAO -> DB: Update segment table to be used for the next run + hnote over DB #lightyellow + IF @intervalMin = 0 + INSERT + INTO **segment**(segmentType, enumeration, tableName, value) + VALUES ('timeout', 0, 'transferStateChange', @intervalMax) + ELSE + UPDATE **segment** + SET value = @intervalMax + WHERE segmentType = 'timeout' + AND enumeration = 0 + AND tableName = 'transferStateChange' + end note + activate DB + deactivate DB + end + + POS_DAO -> DB: Get list of transfers to be expired with current state + hnote over DB #lightyellow + SELECT tt.*, tsc.transferStateId, tp1.participantCurrencyId payerParticipantId, + tp2.participantCurrencyId payeeParticipantId, bta.bulkTransferId + FROM **transferTimeout** tt + JOIN (SELECT tsc1.transferId, MAX(tsc1.transferStateChangeId) maxTransferStateChangeId + FROM **transferStateChange** tsc1 + JOIN **transferTimeout** tt1 + ON tt1.transferId = tsc1.transferId + GROUP BY tsc1.transferId) ts + ON ts.transferId = tt.transferId + JOIN **transferStateChange** tsc + ON tsc.transferStateChangeId = ts.maxTransferStateChangeId + JOIN **transferParticipant** tp1 + ON tp1.transferId = tt.transferId + AND tp1.transferParticipantRoleTypeId = {PAYER_DFSP} + AND tp1.ledgerEntryTypeId = {PRINCIPLE_VALUE} + JOIN **transferParticipant** tp2 + ON tp2.transferId = tt.transferId + AND tp2.transferParticipantRoleTypeId = {PAYEE_DFSP} + AND tp2.ledgerEntryTypeId = {PRINCIPLE_VALUE} + LEFT JOIN **bulkTransferAssociation** bta + ON bta.transferId = tt.transferId + WHERE tt.expirationDate < {transactionTimestamp} + end note + activate DB + POS_DAO <-- DB: Return **transferTimeoutList** + deactivate DB + POS_DAO --> TIMEOUT_HANDLER: Return **transferTimeoutList** + deactivate POS_DAO + end + + loop for each transfer in the list + ||| + alt transferTimeoutList.bulkTransferId == NULL (Regular Transfer) + alt transferStateId == 'RECEIVED_PREPARE' + note right of TIMEOUT_HANDLER #yellow + Message: + { + id: , + from: , + to: , + type: application/json, + content: { + headers: { + Content-Length: , + Content-Type: , + Date: , + X-Forwarded-For: , + FSPIOP-Source: , + FSPIOP-Destination: , + FSPIOP-Encryption: , + FSPIOP-Signature: , + FSPIOP-URI: , + FSPIOP-HTTP-Method: + }, + payload: { + "errorInformation": { + "errorCode": 3303, + "errorDescription": "Transfer expired", + "extensionList": + } + } + }, + metadata: { + event: { + id: , + type: notification, + action: timeout-received, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + TIMEOUT_HANDLER -> NOTIFICATIONS_TOPIC: Publish Notification event + activate NOTIFICATIONS_TOPIC + deactivate NOTIFICATIONS_TOPIC + else transferStateId == 'RESERVED' + note right of TIMEOUT_HANDLER #yellow + Message: + { + id: , + from: , + to: , + type: application/json, + content: { + headers: { + Content-Length: , + Content-Type: , + Date: , + X-Forwarded-For: , + FSPIOP-Source: , + FSPIOP-Destination: , + FSPIOP-Encryption: , + FSPIOP-Signature: , + FSPIOP-URI: , + FSPIOP-HTTP-Method: + }, + payload: { + "errorInformation": { + "errorCode": 3303, + "errorDescription": "Transfer expired", + "extensionList": + } + } + }, + metadata: { + event: { + id: , + type: position, + action: timeout-reserved, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + TIMEOUT_HANDLER -> TOPIC_TRANSFER_POSITION: Route & Publish Position event + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + end + else Individual Transfer from a Bulk + alt transferStateId == 'RECEIVED_PREPARE' + note right of TIMEOUT_HANDLER #yellow + Message: + { + id: , + transferId: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": 3303, + "errorDescription": "Transfer expired", + "extensionList": + } + } + }, + metadata: { + event: { + id: , + type: bulk-processing, + action: bulk-timeout-received, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + TIMEOUT_HANDLER -> BULK_PROCESSING_TOPIC: Publish to Bulk Processing topic + activate BULK_PROCESSING_TOPIC + deactivate BULK_PROCESSING_TOPIC + else transferStateId == 'RESERVED' + note right of TIMEOUT_HANDLER #yellow + Message: + { + id: , + transferId: , + from: , + to: , + type: application/json, + content: { + headers: ,, + payload: { + "errorInformation": { + "errorCode": 3303, + "errorDescription": "Transfer expired", + "extensionList": + } + } + }, + metadata: { + event: { + id: , + type: position, + action: bulk-timeout-reserved, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + TIMEOUT_HANDLER -> TOPIC_TRANSFER_POSITION: Route & Publish Position event + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + end + end + end + + deactivate TIMEOUT_HANDLER +end +@enduml diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-3.1.1-timeout-handler.svg b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-3.1.1-timeout-handler.svg new file mode 100644 index 000000000..5d241117d --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-3.1.1-timeout-handler.svg @@ -0,0 +1,596 @@ + + 3.1.1. Timeout Handler Consume (incl. Bulk Transfer) + + + 3.1.1. Timeout Handler Consume (incl. Bulk Transfer) + + Central Service + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Transfer Timeout + Handler + + + Transfer Timeout + Handler + + + + + topic- + transfer-position + + + topic- + transfer-position + + + topic- + notification + + + topic- + notification + + + topic-event + + + topic-event + + + topic- + bulk-processing + + + topic- + bulk-processing + Position DAO + + + Position DAO + + + Segment DAO + + + Segment DAO + + + Central Store + + + Central Store + + + + + + + + + + + + + + + + + + + + + + Timeout Handler Consume + + + Persist Event Information + + + 1 + Publish event information + + + ref + Event Handler Consume +   + + + Get previous checkpoint of last record processed (Lower limit for inclusion) + + + 2 + Get last segment as @intervalMin + + + 3 + Get last segment as @intervalMin + + SELECT value INTO @intervalMin + FROM + segment + WHERE segmentType = 'timeout' + AND enumeration = 0 + AND tableName = 'transferStateChange' + + + 4 + Return @intervalMin + + + 5 + Return @intervalMin + + + opt + [@intervalMin IS NULL => segment record NOT FOUND] + + + + + 6 + Set @intervalMin = 0 + + + Do Cleanup + + + 7 + Clean up transferTimeout from finalised transfers + + + 8 + Clean up transferTimeout from finalised transfers + + DELETE tt + FROM + transferTimeout + AS tt + JOIN (SELECT tsc.transferId, MAX(tsc.transferStateChangeId) maxTransferStateChangeId + FROM + transferTimeout + tt1 + JOIN + transferStateChange + tsc + ON tsc.transferId = tt1.transferId + GROUP BY transferId) ts + ON ts.transferId = tt.transferId + JOIN + transferStateChange + tsc + ON tsc.transferStateChangeId = ts.maxTransferStateChangeId + WHERE tsc.transferStateId IN ('RECEIVED_FULFIL', 'COMMITTED', 'FAILED' + , 'EXPIRED', 'REJECTED', 'EXPIRED_PREPARED', 'EXPIRED_RESERVED', 'ABORTED') + + + 9 + Return success + + + Determine IntervalMax (Upper limit for inclusion) + + + 10 + Get last transferStateChangeId as @intervalMax + + + 11 + Get last transferStateChangeId as @intervalMax + + SELECT MAX(transferStateChangeId) INTO @intervalMax + FROM + transferStateChange + + + 12 + Return @intervalMax + + + 13 + Return @intervalMax + + + Prepare data and return the list for expiration + + + 14 + Prepare data and get transfers to be expired + + + DB TRANSACTION + + + + + + 15 + transactionTimestamp + = now() + + + 16 + Insert all new transfers still in processing state + + INSERT INTO + transferTimeout + (transferId, expirationDate) + SELECT t.transferId, t.expirationDate + FROM + transfer + t + JOIN (SELECT transferId, MAX(transferStateChangeId) maxTransferStateChangeId + FROM + transferStateChange + WHERE transferStateChangeId > @intervalMin + AND transferStateChangeId <= @intervalMax + GROUP BY transferId) ts + ON ts.transferId = t.transferId + JOIN + transferStateChange + tsc + ON tsc.transferStateChangeId = ts.maxTransferStateChangeId + WHERE tsc.transferStateId IN ('RECEIVED_PREPARE', 'RESERVED') + + + 17 + Insert transfer state ABORTED for + expired RECEIVED_PREPARE transfers + + INSERT INTO + transferStateChange + SELECT tt.transferId, 'EXPIRED_PREPARED' AS transferStateId, 'Aborted by Timeout Handler' AS reason + FROM + transferTimeout + tt + JOIN ( + -- Following subquery is reused 3 times and may be optimized if needed + SELECT tsc1.transferId, MAX(tsc1.transferStateChangeId) maxTransferStateChangeId + FROM + transferStateChange + tsc1 + JOIN + transferTimeout + tt1 + ON tt1.transferId = tsc1.transferId + GROUP BY tsc1.transferId) ts + ON ts.transferId = tt.transferId + JOIN + transferStateChange + tsc + ON tsc.transferStateChangeId = ts.maxTransferStateChangeId + WHERE tt.expirationDate < {transactionTimestamp} + AND tsc.transferStateId = 'RECEIVED_PREPARE' + + + 18 + Insert transfer state EXPIRED for + expired RESERVED transfers + + INSERT INTO + transferStateChange + SELECT tt.transferId, 'RESERVED_TIMEOUT' AS transferStateId, 'Expired by Timeout Handler' AS reason + FROM + transferTimeout + tt + JOIN (SELECT tsc1.transferId, MAX(tsc1.transferStateChangeId) maxTransferStateChangeId + FROM + transferStateChange + tsc1 + JOIN + transferTimeout + tt1 + ON tt1.transferId = tsc1.transferId + GROUP BY tsc1.transferId) ts + ON ts.transferId = tt.transferId + JOIN + transferStateChange + tsc + ON tsc.transferStateChangeId = ts.maxTransferStateChangeId + WHERE tt.expirationDate < {transactionTimestamp} + AND tsc.transferStateId = 'RESERVED' + + + 19 + Update segment table to be used for the next run + + IF @intervalMin = 0 + INSERT + INTO + segment + (segmentType, enumeration, tableName, value) + VALUES ('timeout', 0, 'transferStateChange', @intervalMax) + ELSE + UPDATE + segment + SET value = @intervalMax + WHERE segmentType = 'timeout' + AND enumeration = 0 + AND tableName = 'transferStateChange' + + + 20 + Get list of transfers to be expired with current state + + SELECT tt.*, tsc.transferStateId, tp1.participantCurrencyId payerParticipantId, + tp2.participantCurrencyId payeeParticipantId, bta.bulkTransferId + FROM + transferTimeout + tt + JOIN (SELECT tsc1.transferId, MAX(tsc1.transferStateChangeId) maxTransferStateChangeId + FROM + transferStateChange + tsc1 + JOIN + transferTimeout + tt1 + ON tt1.transferId = tsc1.transferId + GROUP BY tsc1.transferId) ts + ON ts.transferId = tt.transferId + JOIN + transferStateChange + tsc + ON tsc.transferStateChangeId = ts.maxTransferStateChangeId + JOIN + transferParticipant + tp1 + ON tp1.transferId = tt.transferId + AND tp1.transferParticipantRoleTypeId = {PAYER_DFSP} + AND tp1.ledgerEntryTypeId = {PRINCIPLE_VALUE} + JOIN + transferParticipant + tp2 + ON tp2.transferId = tt.transferId + AND tp2.transferParticipantRoleTypeId = {PAYEE_DFSP} + AND tp2.ledgerEntryTypeId = {PRINCIPLE_VALUE} + LEFT JOIN + bulkTransferAssociation + bta + ON bta.transferId = tt.transferId + WHERE tt.expirationDate < {transactionTimestamp} + + + 21 + Return + transferTimeoutList + + + 22 + Return + transferTimeoutList + + + loop + [for each transfer in the list] + + + alt + [transferTimeoutList.bulkTransferId == NULL (Regular Transfer)] + + + alt + [transferStateId == 'RECEIVED_PREPARE'] + + + Message: + { + id: <transferId>, + from: <payerParticipantId>, + to: <payeeParticipantId>, + type: application/json, + content: { + headers: { + Content-Length: <Content-Length>, + Content-Type: <Content-Type>, + Date: <Date>, + X-Forwarded-For: <X-Forwarded-For>, + FSPIOP-Source: <FSPIOP-Source>, + FSPIOP-Destination: <FSPIOP-Destination>, + FSPIOP-Encryption: <FSPIOP-Encryption>, + FSPIOP-Signature: <FSPIOP-Signature>, + FSPIOP-URI: <FSPIOP-URI>, + FSPIOP-HTTP-Method: <FSPIOP-HTTP-Method> + }, + payload: { + "errorInformation": { + "errorCode": 3303, + "errorDescription": "Transfer expired", + "extensionList": <transferMessage.extensionList> + } + } + }, + metadata: { + event: { + id: <uuid>, + type: notification, + action: timeout-received, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 23 + Publish Notification event + + [transferStateId == 'RESERVED'] + + + Message: + { + id: <transferId>, + from: <payerParticipantId>, + to: <payeeParticipantId>, + type: application/json, + content: { + headers: { + Content-Length: <Content-Length>, + Content-Type: <Content-Type>, + Date: <Date>, + X-Forwarded-For: <X-Forwarded-For>, + FSPIOP-Source: <FSPIOP-Source>, + FSPIOP-Destination: <FSPIOP-Destination>, + FSPIOP-Encryption: <FSPIOP-Encryption>, + FSPIOP-Signature: <FSPIOP-Signature>, + FSPIOP-URI: <FSPIOP-URI>, + FSPIOP-HTTP-Method: <FSPIOP-HTTP-Method> + }, + payload: { + "errorInformation": { + "errorCode": 3303, + "errorDescription": "Transfer expired", + "extensionList": <transferMessage.extensionList> + } + } + }, + metadata: { + event: { + id: <uuid>, + type: position, + action: timeout-reserved, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 24 + Route & Publish Position event + + [Individual Transfer from a Bulk] + + + alt + [transferStateId == 'RECEIVED_PREPARE'] + + + Message: + { +      + id + : <transferTimeoutList.bulkTransferId>, +      + transferId + : <transferTimeoutList.transferId>, + from: <payerParticipantId>, + to: <payeeParticipantId>, + type: application/json, + content: { + headers: <bulkTransferHeaders>, + payload: { + "errorInformation": { + "errorCode": 3303, + "errorDescription": "Transfer expired", + "extensionList": <transferMessage.extensionList> + } + } + }, + metadata: { + event: { + id: <uuid>, + type: bulk-processing, + action: bulk-timeout-received, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 25 + Publish to Bulk Processing topic + + [transferStateId == 'RESERVED'] + + + Message: + { +      + id + : <transferTimeoutList.bulkTransferId>, +      + transferId + : <transferTimeoutList.transferId>, + from: <payerParticipantId>, + to: <payeeParticipantId>, + type: application/json, + content: { + headers: <bulkTransferHeaders>,, + payload: { + "errorInformation": { + "errorCode": 3303, + "errorDescription": "Transfer expired", + "extensionList": <transferMessage.extensionList> + } + } + }, + metadata: { + event: { + id: <uuid>, + type: position, + action: bulk-timeout-reserved, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 26 + Route & Publish Position event + + diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-4.1.0-abort-overview.plantuml b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-4.1.0-abort-overview.plantuml new file mode 100644 index 000000000..e02a15142 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-4.1.0-abort-overview.plantuml @@ -0,0 +1,233 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Steven Oderayi + -------------- + ******'/ + +@startuml +' declare title +title 4.1.0. Bulk Transfer Abort + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +actor "DFSP1\nPayer" as DFSP1 +actor "DFSP2\nPayee" as DFSP2 +boundary "Bulk API Adapter" as BULKAPI +control "Bulk API Notification Event Handler" as NOTIFY_HANDLER +boundary "Central Service API" as CSAPI +collections "Bulk-Fulfil-Topic" as TOPIC_BULK_FULFIL +collections "Fulfil-Topic" as TOPIC_FULFIL +control "Bulk Fulfil Event Handler" as BULK_FULFIL_HANDLER +control "Fulfil Event Handler" as FULFIL_HANDLER +collections "topic-transfer-position" as TOPIC_POSITION +control "Position Event Handler" as POS_HANDLER +collections "topic-bulk-processing" as TOPIC_BULK_PROCESSING +control "Bulk Processing Event Handler" as BULK_PROCESSING_HANDLER +collections "Event-Topic" as TOPIC_EVENTS +collections "Notification-Topic" as TOPIC_NOTIFICATIONS +collections "mojaloop-\nobject-store\n(**MLOS**)" as OBJECT_STORE +database "Central Services DB" as DB + +box "Financial Service Providers" #lightGray + participant DFSP1 + participant DFSP2 +end box + +box "Bulk API Adapter Service" #LightBlue + participant BULKAPI + participant NOTIFY_HANDLER +end box + +box "Central Service" #LightYellow + participant CSAPI + participant TOPIC_BULK_FULFIL + participant TOPIC_FULFIL + participant BULK_FULFIL_HANDLER + participant FULFIL_HANDLER + participant TOPIC_POSITION + participant TOPIC_EVENTS + participant POS_HANDLER + participant TOPIC_BULK_PROCESSING + participant BULK_PROCESSING_HANDLER + participant TOPIC_NOTIFICATIONS + participant OBJECT_STORE + participant DB +end box + +' start flow +activate NOTIFY_HANDLER +activate BULK_FULFIL_HANDLER +activate FULFIL_HANDLER +activate FULFIL_HANDLER +activate BULK_PROCESSING_HANDLER +activate POS_HANDLER + +group DFSP2 sends a Fulfil Abort Transfer request + note right of DFSP2 #lightblue + **Note**: In the payload for PUT /bulkTransfers//error + only the **errorInformation** field is **required** + end note + note right of DFSP2 #yellow + Headers - transferHeaders: { + Content-Length: , + Content-Type: , + Date: , + X-Forwarded-For: , + FSPIOP-Source: , + FSPIOP-Destination: , + FSPIOP-Encryption: , + FSPIOP-Signature: , + FSPIOP-URI: , + FSPIOP-HTTP-Method: + } + Payload - errorMessage: + { + "errorInformation": { + "errorCode": , + "errorDescription": , + "extensionList": { + "extension": [ + { + "key": , + "value": + } + ] + } + } + } + end note + DFSP2 ->> BULKAPI: **PUT - /bulkTransfers//error** + activate BULKAPI + + BULKAPI -> OBJECT_STORE: Persist request payload with messageId in cache + activate OBJECT_STORE + note right of BULKAPI #yellow + Message: { + messageId: , + bulkTransferId: , + payload: + } + end note + hnote over OBJECT_STORE #lightyellow + individualTransferFulfils + end hnote + BULKAPI <- OBJECT_STORE: Response of save operation + deactivate OBJECT_STORE + note right of BULKAPI #yellow + Message: + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + type: fulfil, + action: reject, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + BULKAPI -> TOPIC_BULK_FULFIL: Produce bulk-fulfil message + BULKAPI -->> DFSP2: Respond HTTP - 200 (OK) + TOPIC_BULK_FULFIL <- BULK_FULFIL_HANDLER: Consume bulk-fulfil message + BULK_FULFIL_HANDLER -> BULK_FULFIL_HANDLER: Perform duplicate check + BULK_FULFIL_HANDLER -> BULK_FULFIL_HANDLER: Validate request + loop n times, n = number of individual transfers + note right of BULK_FULFIL_HANDLER + Message: { + transferId: , + bulkTransferId< , + bulkTransferAssociationRecord: { + transferId: , + bulkTransferId: , + bulkProcessingStateId: , + errorCode: , + errorDescription: + } + } + end note + BULK_FULFIL_HANDLER -> DB: Update bulkTransferAssociation table + activate DB + hnote over DB #lightyellow + bulkTransferAssociation + end hnote + deactivate DB + BULK_FULFIL_HANDLER -> TOPIC_FULFIL: Produce fulfil message with action bulk-abort for each individual transfer + end + ||| + loop n times, n = number of individual transfers + TOPIC_FULFIL <- FULFIL_HANDLER: Consume message + ref over TOPIC_FULFIL, TOPIC_EVENTS: Fulfil Handler Consume (bulk-abort)\n + FULFIL_HANDLER -> TOPIC_POSITION: Produce message + end + ||| + loop n times, n = number of individual transfers + TOPIC_POSITION <- POS_HANDLER: Consume message + ref over TOPIC_POSITION, BULK_PROCESSING_HANDLER: Position Handler Consume (bulk-abort)\n + POS_HANDLER -> TOPIC_BULK_PROCESSING: Produce message + end + ||| + loop n times, n = number of individual transfers + TOPIC_BULK_PROCESSING <- BULK_PROCESSING_HANDLER: Consume individual transfer message + ref over TOPIC_BULK_PROCESSING, TOPIC_NOTIFICATIONS: Bulk Processing Handler Consume (bulk-abort)\n + end + BULK_PROCESSING_HANDLER -> TOPIC_NOTIFICATIONS: Produce message (Payer) + BULK_PROCESSING_HANDLER -> TOPIC_NOTIFICATIONS: Produce message (Payee) + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consume message (Payer) + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consume message (Payee) + opt action == 'bulk-abort' + ||| + ref over DFSP1, TOPIC_NOTIFICATIONS: Notification Handler (Payer)\n + NOTIFY_HANDLER -> DFSP1: Send callback notification + end + ||| + opt action == 'bulk-abort' + ||| + ref over DFSP2, TOPIC_NOTIFICATIONS: Notification Handler (Payee)\n + NOTIFY_HANDLER -> DFSP2: Send callback notification + end + ||| +end +activate POS_HANDLER +activate FULFIL_HANDLER +activate FULFIL_HANDLER +activate NOTIFY_HANDLER +@enduml + diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-4.1.0-abort-overview.svg b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-4.1.0-abort-overview.svg new file mode 100644 index 000000000..51eae9583 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-4.1.0-abort-overview.svg @@ -0,0 +1,397 @@ + + 4.1.0. Bulk Transfer Abort + + + 4.1.0. Bulk Transfer Abort + + Financial Service Providers + + Bulk API Adapter Service + + Central Service + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DFSP1 + Payer + + + DFSP1 + Payer + + + DFSP2 + Payee + + + DFSP2 + Payee + + + Bulk API Adapter + + + Bulk API Adapter + + + Bulk API Notification Event Handler + + + Bulk API Notification Event Handler + + + Central Service API + + + Central Service API + + + + + Bulk-Fulfil-Topic + + + Bulk-Fulfil-Topic + + + Fulfil-Topic + + + Fulfil-Topic + Bulk Fulfil Event Handler + + + Bulk Fulfil Event Handler + + + Fulfil Event Handler + + + Fulfil Event Handler + + + + + topic-transfer-position + + + topic-transfer-position + + + Event-Topic + + + Event-Topic + Position Event Handler + + + Position Event Handler + + + + + topic-bulk-processing + + + topic-bulk-processing + Bulk Processing Event Handler + + + Bulk Processing Event Handler + + + + + Notification-Topic + + + Notification-Topic + + + mojaloop- + object-store + ( + MLOS + ) + + + mojaloop- + object-store + ( + MLOS + ) + Central Services DB + + + Central Services DB + + + + + + + + + + + + + + DFSP2 sends a Fulfil Abort Transfer request + + + Note + : In the payload for PUT /bulkTransfers/<ID>/error + only the + errorInformation + field is + required + + + Headers - transferHeaders: { + Content-Length: <Content-Length>, + Content-Type: <Content-Type>, + Date: <Date>, + X-Forwarded-For: <X-Forwarded-For>, + FSPIOP-Source: <FSPIOP-Source>, + FSPIOP-Destination: <FSPIOP-Destination>, + FSPIOP-Encryption: <FSPIOP-Encryption>, + FSPIOP-Signature: <FSPIOP-Signature>, + FSPIOP-URI: <FSPIOP-URI>, + FSPIOP-HTTP-Method: <FSPIOP-HTTP-Method> + } + Payload - errorMessage: + { + "errorInformation": { + "errorCode": <string>, + "errorDescription": <string>, + "extensionList": { + "extension": [ + { + "key": <string>, + "value": <string> + } + ] + } + } + } + + + + 1 + PUT - /bulkTransfers/<ID>/error + + + 2 + Persist request payload with messageId in cache + + + Message: { + messageId: <string>, + bulkTransferId: <string>, + payload: <object> + } + + individualTransferFulfils + + + 3 + Response of save operation + + + Message: + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + type: fulfil, + action: reject, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 4 + Produce bulk-fulfil message + + + + 5 + Respond HTTP - 200 (OK) + + + 6 + Consume bulk-fulfil message + + + + + 7 + Perform duplicate check + + + + + 8 + Validate request + + + loop + [n times, n = number of individual transfers] + + + Message: { + transferId: <string>, + bulkTransferId< <string>, + bulkTransferAssociationRecord: { + transferId: <string>, + bulkTransferId: <string>, + bulkProcessingStateId: <string>, + errorCode: <string>, + errorDescription: <string> + } + } + + + 9 + Update bulkTransferAssociation table + + bulkTransferAssociation + + + 10 + Produce fulfil message with action bulk-abort for each individual transfer + + + loop + [n times, n = number of individual transfers] + + + 11 + Consume message + + + ref + Fulfil Handler Consume (bulk-abort) +   + + + 12 + Produce message + + + loop + [n times, n = number of individual transfers] + + + 13 + Consume message + + + ref + Position Handler Consume (bulk-abort) +   + + + 14 + Produce message + + + loop + [n times, n = number of individual transfers] + + + 15 + Consume individual transfer message + + + ref + Bulk Processing Handler Consume (bulk-abort) +   + + + 16 + Produce message (Payer) + + + 17 + Produce message (Payee) + + + 18 + Consume message (Payer) + + + 19 + Consume message (Payee) + + + opt + [action == 'bulk-abort'] + + + ref + Notification Handler (Payer) +   + + + 20 + Send callback notification + + + opt + [action == 'bulk-abort'] + + + ref + Notification Handler (Payee) +   + + + 21 + Send callback notification + + diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-5.1.0-get-overview.plantuml b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-5.1.0-get-overview.plantuml new file mode 100644 index 000000000..e219f2465 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-5.1.0-get-overview.plantuml @@ -0,0 +1,209 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Steven Oderayi + -------------- + ******'/ + +@startuml +' declate title +title 5.1.0. Request Bulk Transfer Status + +autonumber + +' declare actors +actor "DFSP(n)\nParticipant" as DFSP +control "Bulk API Notification Event Handler" as NOTIFY_HANDLER +boundary "Bulk API Adapter" as BULKAPI +collections "Topic-Transfer-Get" as TOPIC_GET +control "GET Event Handler" as GET_HANDLER +entity "Bulk Transfer DAO" as BULK_TRANSFER_DAO +database "Central Store" as DB + +box "Financial Service Provider" #lightGray + participant DFSP +end box +box "Bulk API Adapter Service" #LightBlue + participant BULKAPI + participant NOTIFY_HANDLER +end box +box "Central Ledger" #LightYellow + participant TOPIC_GET + participant GET_HANDLER + participant BULK_TRANSFER_DAO + participant DB +end box + +' start flow +group Request Bulk transfer status + activate DFSP + DFSP -> BULKAPI: Request bulk transfer status - GET - /bulkTransfers/{ID} + activate BULKAPI + ||| + BULKAPI -> TOPIC_GET: Publish event information + deactivate BULKAPI + activate TOPIC_GET + ||| + deactivate GET_HANDLER + + DFSP <-- BULKAPI: Respond HTTP - 200 (OK) + deactivate DFSP + deactivate BULKAPI + GET_HANDLER -> TOPIC_GET: Consume message + ||| + ref over TOPIC_GET, GET_HANDLER : GET Handler Consume\n + ||| + deactivate TOPIC_GET + + GET_HANDLER -> BULK_TRANSFER_DAO: Request bulk transfer participants + activate GET_HANDLER + activate BULK_TRANSFER_DAO + BULK_TRANSFER_DAO -> DB: Fetch bulk transfer participants + activate DB + hnote over DB #lightYellow + bulkTransfer + participant + end hnote + BULK_TRANSFER_DAO <-- DB: Return query result + deactivate DB + GET_HANDLER <-- BULK_TRANSFER_DAO: Return bulk transfer participants + deactivate BULK_TRANSFER_DAO + alt Is request not from bulk transfer Payer or Payee FSP? + note left of NOTIFY_HANDLER #yellow + { + "errorInformation": { + "errorCode": 3210, + "errorDescription": "Bulk transfer ID not found" + } + } + end note + GET_HANDLER -> NOTIFY_HANDLER: Publish notification event (404) + deactivate GET_HANDLER + activate NOTIFY_HANDLER + DFSP <- NOTIFY_HANDLER: callback PUT on /bulkTransfers/{ID}/error + deactivate NOTIFY_HANDLER + end + GET_HANDLER -> BULK_TRANSFER_DAO: Request bulk transfer status + activate GET_HANDLER + activate BULK_TRANSFER_DAO + BULK_TRANSFER_DAO -> DB: Fetch bulk transfer status + + activate DB + hnote over DB #lightyellow + bulkTransferStateChange + bulkTransferState + bulkTransferError + bulkTransferExtension + transferStateChange + transferState + transferFulfilment + transferError + transferExtension + ilpPacket + end hnote + BULK_TRANSFER_DAO <-- DB: Return query result + deactivate DB + + GET_HANDLER <-- BULK_TRANSFER_DAO: Return bulk transfer status + deactivate BULK_TRANSFER_DAO + + alt Is there a bulk transfer with the given ID recorded in the system? + alt Bulk Transfer state is **"PROCESSING"** + note left of GET_HANDLER #yellow + { + "bulkTransferState": "PROCESSING" + } + end note + NOTIFY_HANDLER <- GET_HANDLER: Publish notification event + deactivate GET_HANDLER + activate NOTIFY_HANDLER + NOTIFY_HANDLER -> DFSP: Send callback - PUT /bulkTransfers/{ID} + deactivate NOTIFY_HANDLER + end + ||| + alt Request is from Payee FSP? + GET_HANDLER <-> GET_HANDLER: Exclude transfers with **transferStateId** not in \n [ **COMMITTED**, **ABORTED_REJECTED**, **EXPIRED_RESERVED** ] + activate GET_HANDLER + end + + note left of GET_HANDLER #yellow + { + "bulkTransferState": "", + "individualTransferResults": [ + { + "transferId": "", + "fulfilment": "WLctttbu2HvTsa1XWvUoGRcQozHsqeu9Ahl2JW9Bsu8", + "errorInformation": , + "extensionList": { + "extension": + [ + { + "key": "Description", + "value": "This is a more detailed description" + } + ] + } + } + ], + "completedTimestamp": "2018-09-24T08:38:08.699-04:00", + "extensionList": + { + "extension": + [ + { + "key": "Description", + "value": "This is a more detailed description" + } + ] + } + } + end note + note left of GET_HANDLER #lightGray + NOTE: If transfer is REJECTED, error information may be provided. + Either fulfilment or errorInformation should be set, not both. + end note + NOTIFY_HANDLER <- GET_HANDLER: Publish notification event + deactivate GET_HANDLER + activate NOTIFY_HANDLER + DFSP <- NOTIFY_HANDLER: callback PUT on /bulkTransfers/{ID} + deactivate NOTIFY_HANDLER + note right of NOTIFY_HANDLER #lightgray + Log ERROR event + end note + else A bulk transfer with the given ID is not present in the System or this is an invalid request + note left of NOTIFY_HANDLER #yellow + { + "errorInformation": { + "errorCode": 3210, + "errorDescription": "Bulk transfer ID not found" + } + } + end note + GET_HANDLER -> NOTIFY_HANDLER: Publish notification event (404) + activate NOTIFY_HANDLER + DFSP <- NOTIFY_HANDLER: callback PUT on /bulkTransfers/{ID}/error + deactivate NOTIFY_HANDLER + end + + deactivate GET_HANDLER + deactivate NOTIFY_HANDLER +deactivate DFSP +end +@enduml diff --git a/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-5.1.0-get-overview.svg b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-5.1.0-get-overview.svg new file mode 100644 index 000000000..9b520a21c --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/assets/diagrams/sequence/seq-bulk-5.1.0-get-overview.svg @@ -0,0 +1,295 @@ + + 5.1.0. Request Bulk Transfer Status + + + 5.1.0. Request Bulk Transfer Status + + Financial Service Provider + + Bulk API Adapter Service + + Central Ledger + + + + + + + + + + + + + + + + + + + + + + + + + + + DFSP(n) + Participant + + + DFSP(n) + Participant + + + Bulk API Adapter + + + Bulk API Adapter + + + Bulk API Notification Event Handler + + + Bulk API Notification Event Handler + + + + + Topic-Transfer-Get + + + Topic-Transfer-Get + GET Event Handler + + + GET Event Handler + + + Bulk Transfer DAO + + + Bulk Transfer DAO + + + Central Store + + + Central Store + + + + + + + + + + + + + + + + + + + Request Bulk transfer status + + + 1 + Request bulk transfer status - GET - /bulkTransfers/{ID} + + + 2 + Publish event information + + + 3 + Respond HTTP - 200 (OK) + + + 4 + Consume message + + + ref + GET Handler Consume +   + + + 5 + Request bulk transfer participants + + + 6 + Fetch bulk transfer participants + + bulkTransfer + participant + + + 7 + Return query result + + + 8 + Return bulk transfer participants + + + alt + [Is request not from bulk transfer Payer or Payee FSP?] + + + { + "errorInformation": { + "errorCode": 3210, + "errorDescription": "Bulk transfer ID not found" + } + } + + + 9 + Publish notification event (404) + + + 10 + callback PUT on /bulkTransfers/{ID}/error + + + 11 + Request bulk transfer status + + + 12 + Fetch bulk transfer status + + bulkTransferStateChange + bulkTransferState + bulkTransferError + bulkTransferExtension + transferStateChange + transferState + transferFulfilment + transferError + transferExtension + ilpPacket + + + 13 + Return query result + + + 14 + Return bulk transfer status + + + alt + [Is there a bulk transfer with the given ID recorded in the system?] + + + alt + [Bulk Transfer state is + "PROCESSING" + ] + + + { + "bulkTransferState": "PROCESSING" + } + + + 15 + Publish notification event + + + 16 + Send callback - PUT /bulkTransfers/{ID} + + + alt + [Request is from Payee FSP?] + + + + + + 17 + Exclude transfers with + transferStateId + not in + [ + COMMITTED + , + ABORTED_REJECTED + , + EXPIRED_RESERVED + ] + + + { + "bulkTransferState": "<BulkTransferState>", + "individualTransferResults": [ + { + "transferId": "<TransferId>", + "fulfilment": "WLctttbu2HvTsa1XWvUoGRcQozHsqeu9Ahl2JW9Bsu8", + "errorInformation": <ErrorInformationObject>, + "extensionList": { + "extension": + [ + { + "key": "Description", + "value": "This is a more detailed description" + } + ] + } + } + ], + "completedTimestamp": "2018-09-24T08:38:08.699-04:00", + "extensionList": + { + "extension": + [ + { + "key": "Description", + "value": "This is a more detailed description" + } + ] + } + } + + + NOTE: If transfer is REJECTED, error information may be provided. + Either fulfilment or errorInformation should be set, not both. + + + 18 + Publish notification event + + + 19 + callback PUT on /bulkTransfers/{ID} + + + Log ERROR event + + [A bulk transfer with the given ID is not present in the System or this is an invalid request] + + + { + "errorInformation": { + "errorCode": 3210, + "errorDescription": "Bulk transfer ID not found" + } + } + + + 20 + Publish notification event (404) + + + 21 + callback PUT on /bulkTransfers/{ID}/error + + diff --git a/docs/fr/technical/technical/central-bulk-transfers/transfers/1.1.0-bulk-prepare-transfer-request-overview.md b/docs/fr/technical/technical/central-bulk-transfers/transfers/1.1.0-bulk-prepare-transfer-request-overview.md new file mode 100644 index 000000000..8ad8c6ce7 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/transfers/1.1.0-bulk-prepare-transfer-request-overview.md @@ -0,0 +1,15 @@ +# Bulk Prepare Transfer Request [Overview] [includes individual transfers in a bulk] + +Sequence design diagram for Prepare Transfer Request process. + +## References within Sequence Diagram + +* [Bulk Prepare Handler Consume (1.1.1)](1.1.1-bulk-prepare-handler-consume.md) +* [Prepare Handler Consume (1.2.1)](1.2.1-prepare-handler-consume-for-bulk.md) +* [Position Handler Consume (1.3.0)](1.3.0-position-handler-consume-overview.md) +* [Bulk Processing Handler Consume (1.4.1)](1.4.1-bulk-processing-handler.md) +* [Send notification to Participant (1.1.4.a)](1.1.4.a-send-notification-to-participant.md) + +## Sequence Diagram + +![seq-bulk-1.1.0-bulk-prepare-overview.svg](../assets/diagrams/sequence/seq-bulk-1.1.0-bulk-prepare-overview.svg) diff --git a/docs/fr/technical/technical/central-bulk-transfers/transfers/1.1.1-bulk-prepare-handler-consume.md b/docs/fr/technical/technical/central-bulk-transfers/transfers/1.1.1-bulk-prepare-handler-consume.md new file mode 100644 index 000000000..495a0fdaf --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/transfers/1.1.1-bulk-prepare-handler-consume.md @@ -0,0 +1,11 @@ +# Bulk Prepare handler consume + +Sequence design diagram for Bulk Prepare Handler Consume process + +## References within Sequence Diagram + +* [Event Handler Consume (9.1.0)](../../central-event-processor/9.1.0-event-handler-placeholder.md) + +## Sequence Diagram + +![seq-bulk-1.1.1-bulk-prepare-handler.svg](../assets/diagrams/sequence/seq-bulk-1.1.1-bulk-prepare-handler.svg) diff --git a/docs/fr/technical/technical/central-bulk-transfers/transfers/1.2.1-prepare-handler-consume-for-bulk.md b/docs/fr/technical/technical/central-bulk-transfers/transfers/1.2.1-prepare-handler-consume-for-bulk.md new file mode 100644 index 000000000..aabde9fb1 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/transfers/1.2.1-prepare-handler-consume-for-bulk.md @@ -0,0 +1,11 @@ +# Prepare handler consume [that includes individual transfers in a bulk] + +Sequence design diagram for Prepare Handler Consume process + +## References within Sequence Diagram + +* [Event Handler Consume (9.1.0)](../../central-event-processor/9.1.0-event-handler-placeholder.md) + +## Sequence Diagram + +![seq-bulk-1.2.1-prepare-handler.svg](../assets/diagrams/sequence/seq-bulk-1.2.1-prepare-handler.svg) diff --git a/docs/fr/technical/technical/central-bulk-transfers/transfers/1.3.0-position-handler-consume-overview.md b/docs/fr/technical/technical/central-bulk-transfers/transfers/1.3.0-position-handler-consume-overview.md new file mode 100644 index 000000000..aae066006 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/transfers/1.3.0-position-handler-consume-overview.md @@ -0,0 +1,14 @@ +# Position Handler Consume [that includes individual transfers in a bulk] + +Sequence design diagram for Position Handler Consume process + +## References within Sequence Diagram + +* [Event Handler Consume (9.1.0)](../../central-event-processor/9.1.0-event-handler-placeholder.md) +* [Prepare Position Handler Consume (1.3.1)](1.3.1-prepare-position-handler-consume.md) +* [Fufil Position Handler Consume (2.2.1)](2.2.1-fulfil-commit-for-bulk.md) +* [Abort Position Handler Consume (2.2.2)](2.2.2-fulfil-abort-for-bulk.md) + +## Sequence Diagram + +![seq-bulk-1.3.0-position-overview.svg](../assets/diagrams/sequence/seq-bulk-1.3.0-position-overview.svg) diff --git a/docs/fr/technical/technical/central-bulk-transfers/transfers/1.3.1-prepare-position-handler-consume.md b/docs/fr/technical/technical/central-bulk-transfers/transfers/1.3.1-prepare-position-handler-consume.md new file mode 100644 index 000000000..460ab7350 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/transfers/1.3.1-prepare-position-handler-consume.md @@ -0,0 +1,7 @@ +# Prepare Position Handler Consume [that includes individual transfers in a bulk] + +Sequence design diagram for Prepare Position Handler Consume process + +## Sequence Diagram + +![seq-bulk-1.3.1-position-prepare.svg](../assets/diagrams/sequence/seq-bulk-1.3.1-position-prepare.svg) diff --git a/docs/fr/technical/technical/central-bulk-transfers/transfers/1.4.1-bulk-processing-handler.md b/docs/fr/technical/technical/central-bulk-transfers/transfers/1.4.1-bulk-processing-handler.md new file mode 100644 index 000000000..53fe3c2b8 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/transfers/1.4.1-bulk-processing-handler.md @@ -0,0 +1,7 @@ +# Bulk Processing Handler Consume + +Sequence design diagram for Bulk Processing Handler Consume process + +## Sequence Diagram + +![seq-bulk-1.4.1-bulk-processing-handler.svg](../assets/diagrams/sequence/seq-bulk-1.4.1-bulk-processing-handler.svg) diff --git a/docs/fr/technical/technical/central-bulk-transfers/transfers/2.1.0-bulk-fulfil-transfer-request-overview.md b/docs/fr/technical/technical/central-bulk-transfers/transfers/2.1.0-bulk-fulfil-transfer-request-overview.md new file mode 100644 index 000000000..f08b37d9e --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/transfers/2.1.0-bulk-fulfil-transfer-request-overview.md @@ -0,0 +1,15 @@ +# Bulk Fulfil Transfer Request Overview + +Sequence design diagram for the Bulk Fulfil Transfer request + +## References within Sequence Diagram + +* [Bulk Fulfil Handler Consume (Success) (2.1.1)](2.1.1-bulk-fulfil-handler-consume.md) +* [Fulfil Handler Consume (Success) (2.2.1)](2.2.1-fulfil-commit-for-bulk.md) +* [Position Handler Consume (Success) (2.3.1)](2.3.1-fulfil-position-handler-consume.md) +* [Bulk Processing Handler Consume (1.4.1)](1.4.1-bulk-processing-handler.md) +* [Send Notification to Participant (1.1.4.a)](1.1.4.a-send-notification-to-participant.md) + +## Sequence Diagram + +![seq-bulk-2.1.0-bulk-fulfil-overview.svg](../assets/diagrams/sequence/seq-bulk-2.1.0-bulk-fulfil-overview.svg) diff --git a/docs/fr/technical/technical/central-bulk-transfers/transfers/2.1.1-bulk-fulfil-handler-consume.md b/docs/fr/technical/technical/central-bulk-transfers/transfers/2.1.1-bulk-fulfil-handler-consume.md new file mode 100644 index 000000000..ea730d0b8 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/transfers/2.1.1-bulk-fulfil-handler-consume.md @@ -0,0 +1,13 @@ +# Bulk Fulfil Handler Consume + +Sequence design diagram for the Bulk Fulfil Handler Consume process + +## References within Sequence Diagram + +* [Event Handler Consume (9.1.0)](../../central-event-processor/9.1.0-event-handler-placeholder.md) +* [seq-signature-validation](../../central-event-processor/signature-validation.md) +* [Send Notification to Participant (1.1.4.a)](1.1.4.a-send-notification-to-participant.md) + +## Sequence Diagram + +![seq-bulk-2.1.1-bulk-fulfil-handler.svg](../assets/diagrams/sequence/seq-bulk-2.1.1-bulk-fulfil-handler.svg) diff --git a/docs/fr/technical/technical/central-bulk-transfers/transfers/2.2.1-fulfil-commit-for-bulk.md b/docs/fr/technical/technical/central-bulk-transfers/transfers/2.2.1-fulfil-commit-for-bulk.md new file mode 100644 index 000000000..7a2102201 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/transfers/2.2.1-fulfil-commit-for-bulk.md @@ -0,0 +1,11 @@ +# Payee sends a Bulk Fulfil Transfer request - Bulk is broken down into individual transfers + +Sequence design diagram for the Bulk Fulfil Transfer for the Commit option + +## References within Sequence Diagram + +* [Event Handler Consume (9.1.0)](../../central-event-processor/9.1.0-event-handler-placeholder.md) + +## Sequence Diagram + +![seq-bulk-2.2.1-fulfil-handler-commit.svg](../assets/diagrams/sequence/seq-bulk-2.2.1-fulfil-handler-commit.svg) diff --git a/docs/fr/technical/technical/central-bulk-transfers/transfers/2.2.2-fulfil-abort-for-bulk.md b/docs/fr/technical/technical/central-bulk-transfers/transfers/2.2.2-fulfil-abort-for-bulk.md new file mode 100644 index 000000000..6b32a71bc --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/transfers/2.2.2-fulfil-abort-for-bulk.md @@ -0,0 +1,13 @@ +# Payee sends a Bulk Fulfil Transfer request - Bulk is broken down into individual transfers + +Sequence design diagram for the Fulfil Handler Consume Reject/Abort process + +## References within Sequence Diagram + +* [Event Handler Consume (9.1.0)](../../central-event-processor/9.1.0-event-handler-placeholder.md) +* [seq-signature-validation](../../central-event-processor/signature-validation.md) +* [Send Notification to Participant (1.1.4.a)](1.1.4.a-send-notification-to-participant.md) + +## Sequence Diagram + +![seq-bulk-2.2.2-fulfil-handler-abort.svg](../assets/diagrams/sequence/seq-bulk-2.2.2-fulfil-handler-abort.svg) diff --git a/docs/fr/technical/technical/central-bulk-transfers/transfers/2.3.1-fulfil-position-handler-consume.md b/docs/fr/technical/technical/central-bulk-transfers/transfers/2.3.1-fulfil-position-handler-consume.md new file mode 100644 index 000000000..3b4d2877a --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/transfers/2.3.1-fulfil-position-handler-consume.md @@ -0,0 +1,11 @@ +# Fulfil Position Handler Consume [that includes individual transfers in a bulk] + +Sequence design diagram for the Fulfil Position Handler Consume process + +## References within Sequence Diagram + +* [Event Handler Consume (9.1.0)](../../central-event-processor/9.1.0-event-handler-placeholder.md) + +## Sequence Diagram + +![seq-bulk-2.3.1-position-fulfil.svg](../assets/diagrams/sequence/seq-bulk-2.3.1-position-fulfil.svg) diff --git a/docs/fr/technical/technical/central-bulk-transfers/transfers/2.3.2-position-consume-abort.md b/docs/fr/technical/technical/central-bulk-transfers/transfers/2.3.2-position-consume-abort.md new file mode 100644 index 000000000..ed4d3f9f8 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/transfers/2.3.2-position-consume-abort.md @@ -0,0 +1,7 @@ +# Position Handler Consume for Fulfil aborts at individual transfer level + +Sequence design diagram for Fulfil Position Handler Consume process + +## Sequence Diagram + +![seq-bulk-2.3.2-position-abort.svg](../assets/diagrams/sequence/seq-bulk-2.3.2-position-abort.svg) diff --git a/docs/fr/technical/technical/central-bulk-transfers/transfers/3.1.0-transfer-timeout-overview-for-bulk.md b/docs/fr/technical/technical/central-bulk-transfers/transfers/3.1.0-transfer-timeout-overview-for-bulk.md new file mode 100644 index 000000000..030f29281 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/transfers/3.1.0-transfer-timeout-overview-for-bulk.md @@ -0,0 +1,7 @@ +# Transfer Timeout [includes individual transfers in a Bulk] + +Sequence design diagram for the Transfer Timeout process. + +## Sequence Diagram + +![seq-bulk-3.1.0-timeout-overview.svg](../assets/diagrams/sequence/seq-bulk-3.1.0-timeout-overview.svg) diff --git a/docs/fr/technical/technical/central-bulk-transfers/transfers/3.1.1-transfer-timeout-handler-consume.md b/docs/fr/technical/technical/central-bulk-transfers/transfers/3.1.1-transfer-timeout-handler-consume.md new file mode 100644 index 000000000..d8fcefc23 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/transfers/3.1.1-transfer-timeout-handler-consume.md @@ -0,0 +1,7 @@ +# TimeOut Handler + +Sequence design diagram for Timeout Handler process + +## Sequence Diagram + +![seq-bulk-3.1.1-timeout-handler.svg](../assets/diagrams/sequence/seq-bulk-3.1.1-timeout-handler.svg) diff --git a/docs/fr/technical/technical/central-bulk-transfers/transfers/4.1.0-transfer-abort-overview-for-bulk.md b/docs/fr/technical/technical/central-bulk-transfers/transfers/4.1.0-transfer-abort-overview-for-bulk.md new file mode 100644 index 000000000..25c4873e4 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/transfers/4.1.0-transfer-abort-overview-for-bulk.md @@ -0,0 +1,7 @@ +# Bulk Transfer Abort Overview [includes individual transfers in a Bulk] + +Sequence design diagram for the Bulk Transfer Abort process. + +## Sequence Diagram + +![seq-bulk-4.1.0-abort-overview.svg](../assets/diagrams/sequence/seq-bulk-4.1.0-abort-overview.svg) diff --git a/docs/fr/technical/technical/central-bulk-transfers/transfers/5.1.0-transfer-get-overview-for-bulk.md b/docs/fr/technical/technical/central-bulk-transfers/transfers/5.1.0-transfer-get-overview-for-bulk.md new file mode 100644 index 000000000..d4d05674a --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/transfers/5.1.0-transfer-get-overview-for-bulk.md @@ -0,0 +1,7 @@ +# Get Bulk Transfer Overview + +Sequence design diagram for the Get Bulk Transfer process. + +## Sequence Diagram + +![seq-bulk-5.1.0-get-overview.svg](../assets/diagrams/sequence/seq-bulk-5.1.0-get-overview.svg) diff --git a/docs/fr/technical/technical/central-bulk-transfers/transfers/README.md b/docs/fr/technical/technical/central-bulk-transfers/transfers/README.md new file mode 100644 index 000000000..315828c50 --- /dev/null +++ b/docs/fr/technical/technical/central-bulk-transfers/transfers/README.md @@ -0,0 +1,11 @@ +# Opérations de transferts groupés Mojaloop + +Processus opérationnels au cœur du traitement des transferts groupés : + +- Processus *Bulk Prepare* au niveau du transfert groupé +- Processus *Prepare* au niveau d’un transfert unitaire +- Processus *Bulk Fulfil* au niveau du transfert groupé +- Processus *Fulfil* au niveau d’un transfert unitaire +- Processus de notifications au niveau du transfert groupé +- Processus de rejet / abandon +- Traitement groupé au niveau unitaire pour agréger les *bulks* diff --git a/docs/fr/technical/technical/central-event-processor/README.md b/docs/fr/technical/technical/central-event-processor/README.md new file mode 100644 index 000000000..cdeb59ec1 --- /dev/null +++ b/docs/fr/technical/technical/central-event-processor/README.md @@ -0,0 +1,13 @@ +# Service Central Event Processor + +Le service **Central Event Processor** (**CEP**) permet de surveiller un ensemble de règles métier ou de motifs prédéfinis et configurés. + +Dans l’itération actuelle, les règles portent sur trois critères : + + 1. Dépassement d’un seuil sur la limite du plafond de débit net (fixée notamment lors de l’intégration), + 2. Ajustement de la limite — plafond de débit net, + 3. Ajustement de position suite à un règlement. + +Le CEP peut ensuite être couplé à un service de notification pour envoyer des alertes ou des notifications. Ici, il s’intègre à **email-notifier** pour envoyer des alertes selon ces critères. + +![Architecture du Central Event Processor](./assets/diagrams/architecture/CEPArchTechOverview.svg) diff --git a/docs/fr/technical/technical/central-event-processor/assets/diagrams/architecture/CEPArchTechOverview.svg b/docs/fr/technical/technical/central-event-processor/assets/diagrams/architecture/CEPArchTechOverview.svg new file mode 100644 index 000000000..40e9f3ae0 --- /dev/null +++ b/docs/fr/technical/technical/central-event-processor/assets/diagrams/architecture/CEPArchTechOverview.svg @@ -0,0 +1,2 @@ + +


    Notifiers
    /email, sms, etc./
    [Not supported by viewer]
    ML-Adapter
    [Not supported by viewer]
    prepare 
    [Not supported by viewer]
    fulfil 
    [Not supported by viewer]
    notification 
    <b>notification </b>

    DB
    [Not supported by viewer]
    Central-Services
    Central-Services

    MangoDB
    [Not supported by viewer]
    Central Event
    Processor (CEP)

    [Not supported by viewer]
    RxJS
    RxJS
    json-rule-engine
    json-rule-engine

    Heading

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

    [Not supported by viewer]
    REST admin API
    [Not supported by viewer]
    \ No newline at end of file diff --git a/docs/fr/technical/technical/central-event-processor/assets/diagrams/sequence/seq-event-9.1.0.plantuml b/docs/fr/technical/technical/central-event-processor/assets/diagrams/sequence/seq-event-9.1.0.plantuml new file mode 100644 index 000000000..2610f98ca --- /dev/null +++ b/docs/fr/technical/technical/central-event-processor/assets/diagrams/sequence/seq-event-9.1.0.plantuml @@ -0,0 +1,95 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Samuel Kummary + -------------- + ******'/ + +@startuml +' declate title +title 9.1.0. Gestionnaire d'événements (espace réservé) + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +control "Gestionnaire d'événements\n(espace réservé)" as EVENT_HANDLER + +box "Gestionnaire d'événements (espace réservé)" #LightGray + participant EVENT_HANDLER +end box + +collections "Topic Événements" as TOPIC_EVENTS + +' start flow +activate EVENT_HANDLER + +group Gestionnaire d'événements (espace réservé) + EVENT_HANDLER -> TOPIC_EVENTS : Consommer le message d'événement \n Code d'erreur : 2001 + note right of EVENT_HANDLER #yellow + Message : + { + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + type: INFO, + action: AUDIT, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + note right of EVENT_HANDLER #LightGray + Le « type » serait une énumération (ENUM) avec les valeurs : + [INFO, DEBUG, ERROR, WARN, FATAL, TRACE] + Les valeurs possibles pour « action » seraient + [AUDIT, EXCEPTION] + Les messages d'événement peuvent être traités en fonction des valeurs + de ces deux variables (lorsque l'espace réservé est étendu). + end note + EVENT_HANDLER -> EVENT_HANDLER : Auto-commit \n Code d'erreur : 2001 + note right of EVENT_HANDLER #lightBlue + Pour l'instant, les événements ne sont publiés que dans le cadre + de l'espace réservé. Ce comportement pourra évoluer pour ajouter + les fonctionnalités pertinentes. + end note + activate TOPIC_EVENTS + deactivate TOPIC_EVENTS +end +deactivate EVENT_HANDLER + +@enduml diff --git a/docs/fr/technical/technical/central-event-processor/assets/diagrams/sequence/seq-event-9.1.0.svg b/docs/fr/technical/technical/central-event-processor/assets/diagrams/sequence/seq-event-9.1.0.svg new file mode 100644 index 000000000..fc69e9721 --- /dev/null +++ b/docs/fr/technical/technical/central-event-processor/assets/diagrams/sequence/seq-event-9.1.0.svg @@ -0,0 +1,86 @@ + + 9.1.0. Gestionnaire d'événements (espace réservé) + + + 9.1.0. Gestionnaire d'événements (espace réservé) + + Gestionnaire d'événements (espace réservé) + + + + + + Gestionnaire d'événements + (espace réservé) + + + Gestionnaire d'événements + (espace réservé) + + + + + Topic Événements + + + Topic Événements + + + + + Gestionnaire d'événements (espace réservé) + + + 1 + Consommer le message d'événement +   + Code d'erreur : + 2001 + + + Message : + { + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + type: INFO, + action: AUDIT, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + Le « type » serait une énumération (ENUM) avec les valeurs : + [INFO, DEBUG, ERROR, WARN, FATAL, TRACE] + Les valeurs possibles pour « action » seraient + [AUDIT, EXCEPTION] + Les messages d'événement peuvent être traités en fonction des valeurs + de ces deux variables (lorsque l'espace réservé est étendu). + + + + + 2 + Auto-commit +   + Code d'erreur : + 2001 + + + Pour l'instant, les événements ne sont publiés que dans le cadre + de l'espace réservé. Ce comportement pourra évoluer pour ajouter + les fonctionnalités pertinentes. + + diff --git a/docs/fr/technical/technical/central-event-processor/assets/diagrams/sequence/seq-notification-reject-5.1.1.plantuml b/docs/fr/technical/technical/central-event-processor/assets/diagrams/sequence/seq-notification-reject-5.1.1.plantuml new file mode 100644 index 000000000..ab43deeb4 --- /dev/null +++ b/docs/fr/technical/technical/central-event-processor/assets/diagrams/sequence/seq-notification-reject-5.1.1.plantuml @@ -0,0 +1,111 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Henk Kodde + -------------- + ******'/ + +@startuml +' declate title +title 5.1.1. Gestionnaire de notifications pour les rejets + +autonumber + +' Actor Keys: + +' declare actors + +actor "DFSP1\nPayeur" as DFSP1 +control "Gestionnaire d'événements de notification ML API" as NOTIFY_HANDLER +boundary "API du service central" as CSAPI +collections "Topic Événements" as TOPIC_EVENT +collections "Topic Notifications" as TOPIC_NOTIFICATIONS + +box "Fournisseurs de services financiers" #lightGray + participant DFSP1 +end box + +box "Service adaptateur ML API" #LightBlue + participant NOTIFY_HANDLER +end box + +box "Service central" #LightYellow + participant CSAPI + participant TOPIC_EVENT + participant TOPIC_NOTIFICATIONS +end box + +' start flow + +group Notification du DFSP en cas de rejet + activate NOTIFY_HANDLER + NOTIFY_HANDLER -> TOPIC_NOTIFICATIONS : Consommer le message d'événement de notification \n Code d'erreur : 2001 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + group Persister les informations d'événement + NOTIFY_HANDLER -> TOPIC_EVENT : Publier les informations d'événement \n Code d'erreur : 3201 + activate TOPIC_EVENT + ref over TOPIC_EVENT : Gestionnaire d'événements + deactivate TOPIC_EVENT + end + + alt consommer un message unique + group Valider l'événement + NOTIFY_HANDLER <-> NOTIFY_HANDLER : Valider l'événement — Règle : type == 'notification' && [action IN ['reject', 'timeout-received', 'timeout-reserved']] + end + NOTIFY_HANDLER -> CSAPI : Demander les détails de callback du participant \n Code d'erreur : 3201 + ref over NOTIFY_HANDLER, CSAPI : Obtenir les détails de callback du participant + NOTIFY_HANDLER <-- CSAPI : Retourner les détails de callback du participant + note left of NOTIFY_HANDLER #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + payload: + }, + } + end note + NOTIFY_HANDLER --> DFSP1 : Envoyer la notification de callback \n Code d'erreur : 1000, 1001, 3002 + else Règle de validation type != 'notification' / Erreur + note right of NOTIFY_HANDLER #yellow + Message : + { + "errorInformation": { + "errorCode": , + "errorDescription": , + } + } + end note + NOTIFY_HANDLER -> TOPIC_EVENT : Messages invalides récupérés depuis le topic Notifications \n Code d'erreur : 3201 + activate TOPIC_EVENT + deactivate TOPIC_EVENT + ref over TOPIC_EVENT: Gestionnaire d'événements + note right of NOTIFY_HANDLER #lightblue + Journaliser les messages d'ERREUR + Mettre à jour le journal d'événements lors de la notification d'ERREUR + end note +' deactivate TOPIC_NOTIFICATIONS + end +end +@enduml diff --git a/docs/fr/technical/technical/central-event-processor/assets/diagrams/sequence/seq-notification-reject-5.1.1.svg b/docs/fr/technical/technical/central-event-processor/assets/diagrams/sequence/seq-notification-reject-5.1.1.svg new file mode 100644 index 000000000..6f6d0e300 --- /dev/null +++ b/docs/fr/technical/technical/central-event-processor/assets/diagrams/sequence/seq-notification-reject-5.1.1.svg @@ -0,0 +1,160 @@ + + 5.1.1. Gestionnaire de notifications pour les rejets + + + 5.1.1. Gestionnaire de notifications pour les rejets + + Fournisseurs de services financiers + + Service adaptateur ML API + + Service central + + + + + + + + + + + + + + DFSP1 + Payeur + + + DFSP1 + Payeur + + + Gestionnaire d'événements de notification ML API + + + Gestionnaire d'événements de notification ML API + + + API du service central + + + API du service central + + + + + Topic Événements + + + Topic Événements + + + Topic Notifications + + + Topic Notifications + + + + + + + Notification du DFSP en cas de rejet + + + 1 + Consommer le message d'événement de notification +   + Code d'erreur : + 2001 + + + Persister les informations d'événement + + + 2 + Publier les informations d'événement +   + Code d'erreur : + 3201 + + + ref + Gestionnaire d'événements + + + alt + [consommer un message unique] + + + Valider l'événement + + + + + + 3 + Valider l'événement — Règle : type == 'notification' && [action IN ['reject', 'timeout-received', 'timeout-reserved']] + + + 4 + Demander les détails de callback du participant +   + Code d'erreur : + 3201 + + + ref + Obtenir les détails de callback du participant + + + 5 + Retourner les détails de callback du participant + + + Message : + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + payload: <transferMessage> + }, + } + + + 6 + Envoyer la notification de callback +   + Code d'erreur : + 1000, 1001, 3002 + + [Règle de validation type != 'notification' / Erreur] + + + Message : + { + "errorInformation": { + "errorCode": <errorCode>, + "errorDescription": <ErrorMessage>, + } + } + + + 7 + Messages invalides récupérés depuis le topic Notifications +   + Code d'erreur : + 3201 + + + ref + Gestionnaire d'événements + + + Journaliser les messages d'ERREUR + Mettre à jour le journal d'événements lors de la notification d'ERREUR + + diff --git a/docs/fr/technical/technical/central-event-processor/assets/diagrams/sequence/seq-signature-validation.plantuml b/docs/fr/technical/technical/central-event-processor/assets/diagrams/sequence/seq-signature-validation.plantuml new file mode 100644 index 000000000..c3d8294e1 --- /dev/null +++ b/docs/fr/technical/technical/central-event-processor/assets/diagrams/sequence/seq-signature-validation.plantuml @@ -0,0 +1,35 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Samuel Kummary + * Rajiv Mothilal + -------------- + ******'/ + +@startuml +' declare title +title Validation de la signature + +Alice -> Bob : Demande d'authentification +Bob --> Alice : Réponse d'authentification + +Alice -> Bob : Autre demande d'authentification +Alice <-- Bob : Autre réponse d'authentification +@enduml diff --git a/docs/fr/technical/technical/central-event-processor/assets/diagrams/sequence/seq-signature-validation.svg b/docs/fr/technical/technical/central-event-processor/assets/diagrams/sequence/seq-signature-validation.svg new file mode 100644 index 000000000..8d3785474 --- /dev/null +++ b/docs/fr/technical/technical/central-event-processor/assets/diagrams/sequence/seq-signature-validation.svg @@ -0,0 +1,29 @@ + + Validation de la signature + + + Validation de la signature + + + + Alice + + Alice + + Bob + + Bob + + + Demande d'authentification + + + Réponse d'authentification + + + Autre demande d'authentification + + + Autre réponse d'authentification + + diff --git a/docs/fr/technical/technical/central-event-processor/event-handler-placeholder.md b/docs/fr/technical/technical/central-event-processor/event-handler-placeholder.md new file mode 100644 index 000000000..108aad82c --- /dev/null +++ b/docs/fr/technical/technical/central-event-processor/event-handler-placeholder.md @@ -0,0 +1,7 @@ +# Gestionnaire d’événements (espace réservé) + +Diagramme de conception de séquence pour le processus du gestionnaire d’événements. + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-event-9.1.0.svg) diff --git a/docs/fr/technical/technical/central-event-processor/notification-handler-for-rejections.md b/docs/fr/technical/technical/central-event-processor/notification-handler-for-rejections.md new file mode 100644 index 000000000..127f551c2 --- /dev/null +++ b/docs/fr/technical/technical/central-event-processor/notification-handler-for-rejections.md @@ -0,0 +1,12 @@ +# Gestionnaire de notifications pour les rejets + +Diagramme de conception de séquence pour le processus du gestionnaire de notifications en cas de rejet. + +## Références dans le diagramme de séquence + +* [Consommation du gestionnaire d’événements (9.1.0)](event-handler-placeholder.md) +* [Obtenir les détails de callback du participant (3.1.0)](../central-ledger/admin-operations/3.1.0-post-participant-callback-details.md) + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-notification-reject-5.1.1.svg) diff --git a/docs/fr/technical/technical/central-event-processor/signature-validation.md b/docs/fr/technical/technical/central-event-processor/signature-validation.md new file mode 100644 index 000000000..dd42df493 --- /dev/null +++ b/docs/fr/technical/technical/central-event-processor/signature-validation.md @@ -0,0 +1,7 @@ +# Validation de la signature + +Diagramme de conception de séquence pour le processus de validation de la signature. + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-signature-validation.svg) diff --git a/docs/fr/technical/technical/central-ledger/.gitkeep b/docs/fr/technical/technical/central-ledger/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/docs/fr/technical/technical/central-ledger/README.md b/docs/fr/technical/technical/central-ledger/README.md new file mode 100644 index 000000000..4673eab42 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/README.md @@ -0,0 +1,53 @@ +# Services du registre central (*Central Ledger*) + +Le registre central est un ensemble de services qui assurent la compensation et le règlement des transferts entre DFSP, notamment : + +* La mise en relation des messages temps réel pour la compensation des fonds +* Le suivi des positions nettes en vue d’un règlement net différé +* La propagation des frais au niveau du schéma et hors transfert + +## 1. Conception du processus du registre central + +### 1.1 Vue d’ensemble de l’architecture + +![Architecture du registre central](./assets/diagrams/architecture/Arch-mojaloop-central-ledger.svg) + +## 2. Architecture de bout en bout des transferts + +### 2.1 Architecture de bout en bout des transferts (v1.1) + +![Architecture des transferts pour l’API d’interopérabilité Mojaloop FSP v1.1](./assets/diagrams/architecture/Transfers-Arch-End-to-End-v1.1.svg) + +### 2.2 Architecture de bout en bout des transferts (v1.0) + +![Architecture des transferts pour l’API d’interopérabilité Mojaloop FSP v1.0](./assets/diagrams/architecture/Transfers-Arch-End-to-End-v1.0.svg) + +## 3. Conception de la base de données + +### Remarque + +Les tables en *gris* sont propres au processus de transfert. Les tables en *bleu* et *vert* servent de référence pendant le transfert. + +Résumé des tables liées au transfert : + +- `transfer` — données du transfert ; +- `transferDuplicateCheck` — détection des doublons lors des demandes de transfert ; +- `transferError` — erreurs rencontrées pendant le transfert ; +- `transferErrorDuplicateCheck` — détection des doublons pour les processus d’erreur ; +- `transferExtensions` — données d’extension du transfert ; +- `transferFulfilment` — transferts ayant terminé la phase *prepare* ; +- `transferFulfilmentDuplicateCheck` — détection des doublons pour les demandes de *fulfil* ; +- `transferParticipant` — informations de participant liées au transfert ; +- `transferStateChange` — suivi des changements d’état de chaque transfert (piste d’audit) ; +- `transferTimeout` — transferts ayant subi une expiration (*timeout*) ; +- `ilpPacket` — paquet ILP du transfert ; + +Les autres tables du MCD ci-dessous sont soit de consultation (*lookup*, bleu), soit liées au règlement (rouge), et figurent comme dépendances directes ou indirectes pour montrer la relation entre entités « transfert » et tables associées. + +La définition du schéma de base de données du **registre central** : [schéma SQL du registre central](./assets/database/central-ledger-ddl-MySQLWorkbench.sql). + +![Schéma de base du registre central](./assets/database/central-ledger-schema.png) + +## 4. Spécification d’API + +Voir **Central Ledger API** dans la section [Spécifications d’API](../../api/README.md#central-ledger-api). diff --git a/docs/fr/technical/technical/central-ledger/admin-operations/1.0.0-get-health-check.md b/docs/fr/technical/technical/central-ledger/admin-operations/1.0.0-get-health-check.md new file mode 100644 index 000000000..07858367d --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/admin-operations/1.0.0-get-health-check.md @@ -0,0 +1,265 @@ +# GET — Vérification d’état (Health Check) + +Discussion de conception pour la nouvelle implémentation de la vérification d’état. + + +## Objectifs + +L’objectif de cette conception est d’implémenter une nouvelle vérification d’état pour les services du switch Mojaloop permettant un niveau de détail accru. + +Elle prévoit notamment : +- Des codes HTTP explicites (inutile d’inspecter le corps de la réponse pour savoir s’il n’y a pas de problème) +- ~Rétrocompatibilité avec les vérifications d’état existantes~ — Ce n’est plus une exigence. Voir [cette discussion](https://github.com/mojaloop/project/issues/796#issuecomment-498350828). +- Des informations sur la version de l’API et la durée de fonctionnement du service +- Des informations sur les connexions aux sous-services (Kafka, sidecar de journalisation et MySQL) + +## Format de la requête +`/health` + +Utilise la vérification d’état nouvellement implémentée. Comme évoqué [ici](https://github.com/mojaloop/project/issues/796#issuecomment-498350828), comme il n’y aura pas de surcharge de connexion supplémentaire (par ex. requête vers une base de données) dans l’implémentation de la vérification d’état, il n’est pas nécessaire de compliquer les choses avec une version « simple » et une version « détaillée ». + +Codes de réponse : +- `200` — Succès. L’API est en ligne et connectée aux services nécessaires. +- `502` — Passerelle invalide (*Bad Gateway*). L’API est en ligne mais ne peut pas se connecter à un service nécessaire (par ex. `kafka`). +- `503` — Service indisponible. Cette réponse n’est pas implémentée dans cette conception, mais sera la réponse par défaut si l’API n’est pas en ligne. + +## Format de la réponse + +| Nom | Type | Description | Exemple | +| --- | --- | --- | --- | +| `status` | `statusEnum` | État du service. Valeurs possibles : `OK` et `DOWN`. _Voir `statusEnum` ci-dessous_. | `"OK"` | +| `uptime` | `number` | Durée de vie du service en secondes. | `123456` | +| `started` | `string` (date-heure au format ISO) | Date et heure de démarrage du service (UTC) | `"2019-05-31T05:09:25.409Z"` | +| `versionNumber` | `string` (semver) | Version courante du service. | `"5.2.5"` | +| `services` | `Array` | Liste des services dont dépend ce service et statut de connexion | _voir ci-dessous_ | + +### serviceHealth + +| Nom | Type | Description | Exemple | +| --- | --- | --- | --- | +| `name` | `subServiceEnum` | Nom du sous-service. _Voir `subServiceEnum` ci-dessous_. | `"broker"` | +| `status` | `enum` | État du service. Valeurs possibles : `OK` et `DOWN` | `"OK"` | + +### subServiceEnum + +L’énumération `subServiceEnum` décrit le nom du sous-service : + +Options : +- `datastore` → Base de données de ce service (typiquement MySQL). +- `broker` → Courtier de messages de ce service (typiquement Kafka). +- `sidecar` → Sous-service sidecar de journalisation auquel ce service est rattaché. +- `cache` → Sous-service de mise en cache auquel ce service est rattaché. + + +### statusEnum + +L’énumération d’état représente l’état du système ou d’un sous-service. + +Elle comporte deux options : +- `OK` → Le service ou sous-service est sain. +- `DOWN` → Le service ou sous-service est dégradé ou indisponible. + +Lorsqu’un service est `OK` : l’API est considérée comme saine, et tous les sous-services le sont également. + +Si __un quelconque__ sous-service est `DOWN`, l’ensemble de la vérification d’état échoue et l’API est considérée comme `DOWN`. + +## Définition de l’état des sous-services + +Il ne suffit pas de « pinger » un sous-service pour savoir s’il est sain ; il faut aller plus loin. Ces critères évolueront selon le sous-service. + +### `datastore` + +Pour `datastore`, un état `OK` signifie : +- Une connexion active à la base de données +- La base n’est pas vide (contient plus d’une table) + + +### `broker` + +Pour `broker`, un état `OK` signifie : +- Une connexion active au courtier Kafka +- Les rubriques (*topics*) nécessaires existent. Cela dépend du service sur lequel s’exécute la vérification d’état. + +Par exemple, pour que le service `central-ledger` soit considéré comme sain, les rubriques suivantes doivent être présentes : +``` +topic-admin-transfer +topic-transfer-prepare +topic-transfer-position +topic-transfer-fulfil +``` + +### `sidecar` + +Pour `sidecar`, un état `OK` signifie : +- Une connexion active au sidecar + + +### `cache` + +Pour `cache`, un état `OK` signifie : +- Une connexion active au cache + + +## Définition Swagger + +>_Remarque : ces éléments seront ajoutés aux définitions Swagger existantes des services suivants :_ +> - `ml-api-adapter` +> - `central-ledger` +> - `central-settlement` +> - `central-event-processor` +> - `email-notifier` + +```json +{ + /// . . . + "/health": { + "get": { + "operationId": "getHealth", + "tags": [ + "health" + ], + "responses": { + "default": { + "schema": { + "$ref": "#/definitions/health" + }, + "description": "Succès" + } + } + } + }, + // . . . + "definitions": { + "health": { + "type": "object", + "properties": { + "status": { + "type": "string", + "enum": [ + "OK", + "DOWN" + ] + }, + "uptime": { + "description": "Durée de vie du service en secondes.", + "type": "number", + }, + "started": { + "description": "Date et heure de démarrage du service (UTC)", + "type": "string", + "format": "date-time" + }, + "versionNumber": { + "description": "Version courante du service.", + "type": "string", + "example": "5.2.3", + }, + "services": { + "description": "Liste des services dont dépend ce service et statut de connexion", + "type": "array", + "items": { + "$ref": "#/definitions/serviceHealth" + } + }, + }, + }, + "serviceHealth": { + "type": "object", + "properties": { + "name": { + "description": "Nom du sous-service.", + "type": "string", + "enum": [ + "datastore", + "broker", + "sidecar", + "cache" + ] + }, + "status": { + "description": "Statut de connexion avec le service.", + "type": "string", + "enum": [ + "OK", + "DOWN" + ] + } + } + } + } +} +``` + + +### Exemples de requêtes et de réponses : + +__Vérification d’état héritée réussie :__ + +```bash +GET /health HTTP/1.1 +Content-Type: application/json + +200 SUCCESS +{ + "status": "OK" +} +``` + + +__Nouvelle vérification d’état réussie :__ + +``` +GET /health?detailed=true HTTP/1.1 +Content-Type: application/json + +200 SUCCESS +{ + "status": "OK", + "uptime": 0, + "started": "2019-05-31T05:09:25.409Z", + "versionNumber": "5.2.3", + "services": [ + { + "name": "broker", + "status": "OK", + } + ] +} +``` + +__Vérification d’état en échec, mais API en ligne :__ + +``` +GET /health?detailed=true HTTP/1.1 +Content-Type: application/json + +502 BAD GATEWAY +{ + "status": "DOWN", + "uptime": 0, + "started": "2019-05-31T05:09:25.409Z", + "versionNumber": "5.2.3", + "services": [ + { + "name": "broker", + "status": "DOWN", + } + ] +} +``` + +__Vérification d’état en échec :__ + +``` +GET /health?detailed=true HTTP/1.1 +Content-Type: application/json + +503 SERVICE UNAVAILABLE +``` + + +## Diagramme de séquence + +Diagramme de séquence pour l’endpoint GET /health (vérification d’état). + +![seq-get-health-1.0.0.svg](../assets/diagrams/sequence/seq-get-health-1.0.0.svg) diff --git a/docs/fr/technical/technical/central-ledger/admin-operations/1.0.0-get-limits-for-all-participants.md b/docs/fr/technical/technical/central-ledger/admin-operations/1.0.0-get-limits-for-all-participants.md new file mode 100644 index 000000000..3d3e19208 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/admin-operations/1.0.0-get-limits-for-all-participants.md @@ -0,0 +1,7 @@ +# GET — Détails des limites de tous les participants + +Diagramme de séquence pour le processus d’obtention des détails de limite de tous les participants. + +## Diagramme de séquence + +![seq-get-all-participant-limit-1.0.0.svg](../assets/diagrams/sequence/seq-get-all-participant-limit-1.0.0.svg) diff --git a/docs/fr/technical/technical/central-ledger/admin-operations/1.0.0-post-participant-position-limit.md b/docs/fr/technical/technical/central-ledger/admin-operations/1.0.0-post-participant-position-limit.md new file mode 100644 index 000000000..1ef580a76 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/admin-operations/1.0.0-post-participant-position-limit.md @@ -0,0 +1,7 @@ +# Créer la position initiale et les limites d’un participant + +Diagramme de séquence pour le processus POST (création) de la position initiale et des limites d’un participant. + +## Diagramme de séquence + +![seq-participant-position-limits-1.0.0.svg](../assets/diagrams/sequence/seq-participant-position-limits-1.0.0.svg) diff --git a/docs/fr/technical/technical/central-ledger/admin-operations/1.1.0-get-participant-limit-details.md b/docs/fr/technical/technical/central-ledger/admin-operations/1.1.0-get-participant-limit-details.md new file mode 100644 index 000000000..69eb2bf42 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/admin-operations/1.1.0-get-participant-limit-details.md @@ -0,0 +1,7 @@ +# Demander les détails de position et de limite d’un participant + +Diagramme de séquence pour le processus de demande des détails de position et de limite d’un participant. + +## Diagramme de séquence + +![seq-get-participant-position-limit-1.1.0.svg](../assets/diagrams/sequence/seq-get-participant-position-limit-1.1.0.svg) diff --git a/docs/fr/technical/technical/central-ledger/admin-operations/1.1.0-post-participant-limits.md b/docs/fr/technical/technical/central-ledger/admin-operations/1.1.0-post-participant-limits.md new file mode 100644 index 000000000..e2a521a05 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/admin-operations/1.1.0-post-participant-limits.md @@ -0,0 +1,7 @@ +# Ajuster la limite d’un participant pour une devise donnée + +Diagramme de séquence pour le processus POST (gestion) des détails de limite d’un participant. + +## Diagramme de séquence + +![seq-manage-participant-limit-1.1.0.svg](../assets/diagrams/sequence/seq-manage-participant-limit-1.1.0.svg) diff --git a/docs/fr/technical/technical/central-ledger/admin-operations/1.1.5-get-transfer-status.md b/docs/fr/technical/technical/central-ledger/admin-operations/1.1.5-get-transfer-status.md new file mode 100644 index 000000000..f0785e1a6 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/admin-operations/1.1.5-get-transfer-status.md @@ -0,0 +1,7 @@ +# Demander le statut d’un transfert + +Diagramme de séquence pour le processus GET du statut de transfert. + +## Diagramme de séquence + +![seq-get-transfer-1.1.5-phase2.svg](../assets/diagrams/sequence/seq-get-transfer-1.1.5-phase2.svg) diff --git a/docs/fr/technical/technical/central-ledger/admin-operations/3.1.0-get-participant-callback-details.md b/docs/fr/technical/technical/central-ledger/admin-operations/3.1.0-get-participant-callback-details.md new file mode 100644 index 000000000..21b054c8c --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/admin-operations/3.1.0-get-participant-callback-details.md @@ -0,0 +1,7 @@ +# 3.1.0 Obtenir les détails de rappel (*callback*) d’un participant + +Diagramme de séquence pour le processus GET des détails de rappel d’un participant. + +## Diagramme de séquence + +![seq-callback-3.1.0.svg](../assets/diagrams/sequence/seq-callback-3.1.0.svg) diff --git a/docs/fr/technical/technical/central-ledger/admin-operations/3.1.0-post-participant-callback-details.md b/docs/fr/technical/technical/central-ledger/admin-operations/3.1.0-post-participant-callback-details.md new file mode 100644 index 000000000..676db84f8 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/admin-operations/3.1.0-post-participant-callback-details.md @@ -0,0 +1,7 @@ +# 3.1.0 Ajouter les détails de rappel (*callback*) d’un participant + +Diagramme de séquence pour le processus POST (ajout) des détails de rappel d’un participant. + +## Diagramme de séquence + +![seq-callback-add-3.1.0.svg](../assets/diagrams/sequence/seq-callback-add-3.1.0.svg) diff --git a/docs/fr/technical/technical/central-ledger/admin-operations/4.1.0-get-participant-position-details.md b/docs/fr/technical/technical/central-ledger/admin-operations/4.1.0-get-participant-position-details.md new file mode 100644 index 000000000..451499e88 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/admin-operations/4.1.0-get-participant-position-details.md @@ -0,0 +1,7 @@ +# Obtenir les détails de position d’un participant + +Diagramme de séquence pour le processus GET des détails de position d’un participant. + +## Diagramme de séquence + +![seq-participants-positions-query-4.1.0.svg](../assets/diagrams/sequence/seq-participants-positions-query-4.1.0.svg) diff --git a/docs/fr/technical/technical/central-ledger/admin-operations/4.2.0-get-positions-of-all-participants.md b/docs/fr/technical/technical/central-ledger/admin-operations/4.2.0-get-positions-of-all-participants.md new file mode 100644 index 000000000..fb221a42f --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/admin-operations/4.2.0-get-positions-of-all-participants.md @@ -0,0 +1,7 @@ +# Obtenir les détails de position pour tous les participants + +Diagramme de séquence pour le processus d’obtention des positions de tous les participants. + +## Diagramme de séquence + +![seq-participants-positions-query-all-4.2.0.svg](../assets/diagrams/sequence/seq-participants-positions-query-all-4.2.0.svg) diff --git a/docs/fr/technical/technical/central-ledger/admin-operations/README.md b/docs/fr/technical/technical/central-ledger/admin-operations/README.md new file mode 100644 index 000000000..0719a1ff9 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/admin-operations/README.md @@ -0,0 +1,3 @@ +# Opérations HUB / Switch Mojaloop + +Processus opérationnels généralement lancés par un opérateur du HUB ou du *Switch*. diff --git a/docs/fr/technical/technical/central-ledger/assets/database/README.md b/docs/fr/technical/technical/central-ledger/assets/database/README.md new file mode 100644 index 000000000..d931c6fc0 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/database/README.md @@ -0,0 +1,20 @@ +# Comment modifier le fichier central-ledger-schema-DBeaver.erd + +Guide de base pour consulter ou mettre à jour le fichier `central-ledger-schema-DBeaver.erd`. + +## Prérequis + +* Installer DBeaver Community (gestionnaire de bases de données) +* La base MySQL du registre central Mojaloop doit être démarrée et accessible depuis DBeaver +* Un éditeur de texte + +## Étapes + +* Créer une connexion à la base MySQL dans DBeaver (onglet *Database Navigator*). +* Sous l’onglet *Projects*, clic droit puis créer un nouveau diagramme ER. +* Nommer le diagramme et sélectionner la base `central-ledger` dans l’assistant. + +* Copier le fichier `central-ledger-schema-DBeaver.erd` du module de documentation vers `DBeaverData/workspace/General/Diagrams` à l’emplacement de stockage DBeaver. +* Ouvrir avec un éditeur le fichier `.erd` nouvellement créé, rechercher `data-source id` et copier sa valeur (ex. `mysql5-171ea991174-1218b6e1bf273693`). +* Ouvrir `central-ledger-schema-DBeaver.erd` du dossier des diagrammes ER et remplacer la valeur `data-source id` par celle copiée. +* Le fichier `central-ledger-schema-DBeaver.erd` doit alors afficher les tables comme sur `central-ledger-schema.png`. diff --git a/docs/fr/technical/technical/central-ledger/assets/database/central-ledger-ddl-MySQLWorkbench.sql b/docs/fr/technical/technical/central-ledger/assets/database/central-ledger-ddl-MySQLWorkbench.sql new file mode 100644 index 000000000..280962173 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/database/central-ledger-ddl-MySQLWorkbench.sql @@ -0,0 +1,1820 @@ +-- MySQL dump 10.13 Distrib 8.0.18, for macos10.14 (x86_64) +-- +-- Host: localhost Database: central_ledger +-- ------------------------------------------------------ +-- Server version 8.0.13 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `amountType` +-- + +DROP TABLE IF EXISTS `amountType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `amountType` ( + `amountTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(256) NOT NULL, + `description` varchar(1024) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`amountTypeId`), + UNIQUE KEY `amounttype_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `balanceOfPayments` +-- + +DROP TABLE IF EXISTS `balanceOfPayments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `balanceOfPayments` ( + `balanceOfPaymentsId` int(10) unsigned NOT NULL, + `name` varchar(256) NOT NULL, + `description` varchar(1024) DEFAULT NULL COMMENT 'Possible values and meaning are defined in https://www.imf.org/external/np/sta/bopcode/', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`balanceOfPaymentsId`), + UNIQUE KEY `balanceofpayments_name_unique` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='See https://www.imf.org/external/np/sta/bopcode/guide.htm'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bulkProcessingState` +-- + +DROP TABLE IF EXISTS `bulkProcessingState`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `bulkProcessingState` ( + `bulkProcessingStateId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`bulkProcessingStateId`), + UNIQUE KEY `bulkprocessingstate_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bulkTransfer` +-- + +DROP TABLE IF EXISTS `bulkTransfer`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `bulkTransfer` ( + `bulkTransferId` varchar(36) NOT NULL, + `bulkQuoteId` varchar(36) DEFAULT NULL, + `payerParticipantId` int(10) unsigned DEFAULT NULL, + `payeeParticipantId` int(10) unsigned DEFAULT NULL, + `expirationDate` datetime NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`bulkTransferId`), + KEY `bulktransfer_payerparticipantid_index` (`payerParticipantId`), + KEY `bulktransfer_payeeparticipantid_index` (`payeeParticipantId`), + CONSTRAINT `bulktransfer_bulktransferid_foreign` FOREIGN KEY (`bulkTransferId`) REFERENCES `bulkTransferDuplicateCheck` (`bulktransferid`), + CONSTRAINT `bulktransfer_payeeparticipantid_foreign` FOREIGN KEY (`payeeParticipantId`) REFERENCES `participant` (`participantid`), + CONSTRAINT `bulktransfer_payerparticipantid_foreign` FOREIGN KEY (`payerParticipantId`) REFERENCES `participant` (`participantid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bulkTransferAssociation` +-- + +DROP TABLE IF EXISTS `bulkTransferAssociation`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `bulkTransferAssociation` ( + `bulkTransferAssociationId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `transferId` varchar(36) NOT NULL, + `bulkTransferId` varchar(36) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `bulkProcessingStateId` int(10) unsigned NOT NULL, + `lastProcessedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `errorCode` int(10) unsigned DEFAULT NULL, + `errorDescription` varchar(128) DEFAULT NULL, + PRIMARY KEY (`bulkTransferAssociationId`), + UNIQUE KEY `bulktransferassociation_transferid_bulktransferid_unique` (`transferId`,`bulkTransferId`), + KEY `bulktransferassociation_bulktransferid_foreign` (`bulkTransferId`), + KEY `bulktransferassociation_bulkprocessingstateid_foreign` (`bulkProcessingStateId`), + CONSTRAINT `bulktransferassociation_bulkprocessingstateid_foreign` FOREIGN KEY (`bulkProcessingStateId`) REFERENCES `bulkProcessingState` (`bulkprocessingstateid`), + CONSTRAINT `bulktransferassociation_bulktransferid_foreign` FOREIGN KEY (`bulkTransferId`) REFERENCES `bulkTransfer` (`bulktransferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bulkTransferDuplicateCheck` +-- + +DROP TABLE IF EXISTS `bulkTransferDuplicateCheck`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `bulkTransferDuplicateCheck` ( + `bulkTransferId` varchar(36) NOT NULL, + `hash` varchar(256) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`bulkTransferId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bulkTransferError` +-- + +DROP TABLE IF EXISTS `bulkTransferError`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `bulkTransferError` ( + `bulkTransferErrorId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `bulkTransferStateChangeId` bigint(20) unsigned NOT NULL, + `errorCode` int(10) unsigned NOT NULL, + `errorDescription` varchar(128) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`bulkTransferErrorId`), + KEY `bulktransfererror_bulktransferstatechangeid_index` (`bulkTransferStateChangeId`), + CONSTRAINT `bulktransfererror_bulktransferstatechangeid_foreign` FOREIGN KEY (`bulkTransferStateChangeId`) REFERENCES `bulkTransferStateChange` (`bulktransferstatechangeid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bulkTransferExtension` +-- + +DROP TABLE IF EXISTS `bulkTransferExtension`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `bulkTransferExtension` ( + `bulkTransferExtensionId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `bulkTransferId` varchar(36) NOT NULL, + `isFulfilment` tinyint(1) NOT NULL DEFAULT '0', + `key` varchar(128) NOT NULL, + `value` text NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`bulkTransferExtensionId`), + KEY `bulktransferextension_bulktransferid_index` (`bulkTransferId`), + CONSTRAINT `bulktransferextension_bulktransferid_foreign` FOREIGN KEY (`bulkTransferId`) REFERENCES `bulkTransfer` (`bulktransferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bulkTransferFulfilment` +-- + +DROP TABLE IF EXISTS `bulkTransferFulfilment`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `bulkTransferFulfilment` ( + `bulkTransferId` varchar(36) NOT NULL, + `completedDate` datetime NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`bulkTransferId`), + CONSTRAINT `bulktransferfulfilment_bulktransferid_foreign` FOREIGN KEY (`bulkTransferId`) REFERENCES `bulkTransferFulfilmentDuplicateCheck` (`bulktransferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bulkTransferFulfilmentDuplicateCheck` +-- + +DROP TABLE IF EXISTS `bulkTransferFulfilmentDuplicateCheck`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `bulkTransferFulfilmentDuplicateCheck` ( + `bulkTransferId` varchar(36) NOT NULL, + `hash` varchar(256) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`bulkTransferId`), + CONSTRAINT `bulktransferfulfilmentduplicatecheck_bulktransferid_foreign` FOREIGN KEY (`bulkTransferId`) REFERENCES `bulkTransfer` (`bulktransferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bulkTransferState` +-- + +DROP TABLE IF EXISTS `bulkTransferState`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `bulkTransferState` ( + `bulkTransferStateId` varchar(50) NOT NULL, + `enumeration` varchar(50) NOT NULL COMMENT 'bulkTransferState associated to the Mojaloop API', + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`bulkTransferStateId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bulkTransferStateChange` +-- + +DROP TABLE IF EXISTS `bulkTransferStateChange`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `bulkTransferStateChange` ( + `bulkTransferStateChangeId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `bulkTransferId` varchar(36) NOT NULL, + `bulkTransferStateId` varchar(50) NOT NULL, + `reason` varchar(512) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`bulkTransferStateChangeId`), + KEY `bulktransferstatechange_bulktransferid_index` (`bulkTransferId`), + KEY `bulktransferstatechange_bulktransferstateid_index` (`bulkTransferStateId`), + CONSTRAINT `bulktransferstatechange_bulktransferid_foreign` FOREIGN KEY (`bulkTransferId`) REFERENCES `bulkTransfer` (`bulktransferid`), + CONSTRAINT `bulktransferstatechange_bulktransferstateid_foreign` FOREIGN KEY (`bulkTransferStateId`) REFERENCES `bulkTransferState` (`bulktransferstateid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `contactType` +-- + +DROP TABLE IF EXISTS `contactType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `contactType` ( + `contactTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`contactTypeId`), + UNIQUE KEY `contacttype_name_unique` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `currency` +-- + +DROP TABLE IF EXISTS `currency`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `currency` ( + `currencyId` varchar(3) NOT NULL, + `name` varchar(128) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `scale` int(10) unsigned NOT NULL DEFAULT '4', + PRIMARY KEY (`currencyId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `endpointType` +-- + +DROP TABLE IF EXISTS `endpointType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `endpointType` ( + `endpointTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`endpointTypeId`), + UNIQUE KEY `endpointtype_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `event` +-- + +DROP TABLE IF EXISTS `event`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `event` ( + `eventId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(128) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`eventId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `expiringTransfer` +-- + +DROP TABLE IF EXISTS `expiringTransfer`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `expiringTransfer` ( + `expiringTransferId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `transferId` varchar(36) NOT NULL, + `expirationDate` datetime NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`expiringTransferId`), + UNIQUE KEY `expiringtransfer_transferid_unique` (`transferId`), + KEY `expiringtransfer_expirationdate_index` (`expirationDate`), + CONSTRAINT `expiringtransfer_transferid_foreign` FOREIGN KEY (`transferId`) REFERENCES `transfer` (`transferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `geoCode` +-- + +DROP TABLE IF EXISTS `geoCode`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `geoCode` ( + `geoCodeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `quotePartyId` bigint(20) unsigned NOT NULL COMMENT 'Optionally the GeoCode for the Payer/Payee may have been provided. If the Quote Response has the GeoCode for the Payee, an additional row is added', + `latitude` varchar(50) NOT NULL COMMENT 'Latitude of the initiating Party', + `longitude` varchar(50) NOT NULL COMMENT 'Longitude of the initiating Party', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`geoCodeId`), + KEY `geocode_quotepartyid_foreign` (`quotePartyId`), + CONSTRAINT `geocode_quotepartyid_foreign` FOREIGN KEY (`quotePartyId`) REFERENCES `quoteParty` (`quotepartyid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ilpPacket` +-- + +DROP TABLE IF EXISTS `ilpPacket`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ilpPacket` ( + `transferId` varchar(36) NOT NULL, + `value` text NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferId`), + CONSTRAINT `ilppacket_transferid_foreign` FOREIGN KEY (`transferId`) REFERENCES `transfer` (`transferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ledgerAccountType` +-- + +DROP TABLE IF EXISTS `ledgerAccountType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ledgerAccountType` ( + `ledgerAccountTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `isSettleable` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`ledgerAccountTypeId`), + UNIQUE KEY `ledgeraccounttype_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ledgerEntryType` +-- + +DROP TABLE IF EXISTS `ledgerEntryType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ledgerEntryType` ( + `ledgerEntryTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `ledgerAccountTypeId` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`ledgerEntryTypeId`), + UNIQUE KEY `ledgerentrytype_name_unique` (`name`), + KEY `ledgerentrytype_ledgeraccounttypeid_foreign` (`ledgerAccountTypeId`), + CONSTRAINT `ledgerentrytype_ledgeraccounttypeid_foreign` FOREIGN KEY (`ledgerAccountTypeId`) REFERENCES `ledgerAccountType` (`ledgeraccounttypeid`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `migration` +-- + +DROP TABLE IF EXISTS `migration`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `migration` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) DEFAULT NULL, + `batch` int(11) DEFAULT NULL, + `migration_time` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=157 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `migration_lock` +-- + +DROP TABLE IF EXISTS `migration_lock`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `migration_lock` ( + `index` int(10) unsigned NOT NULL AUTO_INCREMENT, + `is_locked` int(11) DEFAULT NULL, + PRIMARY KEY (`index`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `participant` +-- + +DROP TABLE IF EXISTS `participant`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `participant` ( + `participantId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(256) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `createdBy` varchar(128) NOT NULL, + PRIMARY KEY (`participantId`), + UNIQUE KEY `participant_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `participantContact` +-- + +DROP TABLE IF EXISTS `participantContact`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `participantContact` ( + `participantContactId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `participantId` int(10) unsigned NOT NULL, + `contactTypeId` int(10) unsigned NOT NULL, + `value` varchar(256) NOT NULL, + `priorityPreference` int(11) NOT NULL DEFAULT '9', + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `createdBy` varchar(128) NOT NULL, + PRIMARY KEY (`participantContactId`), + KEY `participantcontact_participantid_index` (`participantId`), + KEY `participantcontact_contacttypeid_index` (`contactTypeId`), + CONSTRAINT `participantcontact_contacttypeid_foreign` FOREIGN KEY (`contactTypeId`) REFERENCES `contactType` (`contacttypeid`), + CONSTRAINT `participantcontact_participantid_foreign` FOREIGN KEY (`participantId`) REFERENCES `participant` (`participantid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `participantCurrency` +-- + +DROP TABLE IF EXISTS `participantCurrency`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `participantCurrency` ( + `participantCurrencyId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `participantId` int(10) unsigned NOT NULL, + `currencyId` varchar(3) NOT NULL, + `ledgerAccountTypeId` int(10) unsigned NOT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `createdBy` varchar(128) NOT NULL, + PRIMARY KEY (`participantCurrencyId`), + UNIQUE KEY `participantcurrency_pcl_unique` (`participantId`,`currencyId`,`ledgerAccountTypeId`), + KEY `participantcurrency_ledgeraccounttypeid_foreign` (`ledgerAccountTypeId`), + KEY `participantcurrency_participantid_index` (`participantId`), + KEY `participantcurrency_currencyid_index` (`currencyId`), + CONSTRAINT `participantcurrency_currencyid_foreign` FOREIGN KEY (`currencyId`) REFERENCES `currency` (`currencyid`), + CONSTRAINT `participantcurrency_ledgeraccounttypeid_foreign` FOREIGN KEY (`ledgerAccountTypeId`) REFERENCES `ledgerAccountType` (`ledgeraccounttypeid`), + CONSTRAINT `participantcurrency_participantid_foreign` FOREIGN KEY (`participantId`) REFERENCES `participant` (`participantid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `participantEndpoint` +-- + +DROP TABLE IF EXISTS `participantEndpoint`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `participantEndpoint` ( + `participantEndpointId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `participantId` int(10) unsigned NOT NULL, + `endpointTypeId` int(10) unsigned NOT NULL, + `value` varchar(512) NOT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `createdBy` varchar(128) NOT NULL, + PRIMARY KEY (`participantEndpointId`), + KEY `participantendpoint_participantid_index` (`participantId`), + KEY `participantendpoint_endpointtypeid_index` (`endpointTypeId`), + CONSTRAINT `participantendpoint_endpointtypeid_foreign` FOREIGN KEY (`endpointTypeId`) REFERENCES `endpointType` (`endpointtypeid`), + CONSTRAINT `participantendpoint_participantid_foreign` FOREIGN KEY (`participantId`) REFERENCES `participant` (`participantid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `participantLimit` +-- + +DROP TABLE IF EXISTS `participantLimit`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `participantLimit` ( + `participantLimitId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `participantCurrencyId` int(10) unsigned NOT NULL, + `participantLimitTypeId` int(10) unsigned NOT NULL, + `value` decimal(18,4) NOT NULL DEFAULT '0.0000', + `thresholdAlarmPercentage` decimal(5,2) NOT NULL DEFAULT '10.00', + `startAfterParticipantPositionChangeId` bigint(20) unsigned DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `createdBy` varchar(128) NOT NULL, + PRIMARY KEY (`participantLimitId`), + KEY `participantlimit_participantcurrencyid_index` (`participantCurrencyId`), + KEY `participantlimit_participantlimittypeid_index` (`participantLimitTypeId`), + KEY `participantlimit_startafterparticipantpositionchangeid_index` (`startAfterParticipantPositionChangeId`), + CONSTRAINT `participantlimit_participantcurrencyid_foreign` FOREIGN KEY (`participantCurrencyId`) REFERENCES `participantCurrency` (`participantcurrencyid`), + CONSTRAINT `participantlimit_participantlimittypeid_foreign` FOREIGN KEY (`participantLimitTypeId`) REFERENCES `participantLimitType` (`participantlimittypeid`), + CONSTRAINT `participantlimit_startafterparticipantpositionchangeid_foreign` FOREIGN KEY (`startAfterParticipantPositionChangeId`) REFERENCES `participantPositionChange` (`participantpositionchangeid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `participantLimitType` +-- + +DROP TABLE IF EXISTS `participantLimitType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `participantLimitType` ( + `participantLimitTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`participantLimitTypeId`), + UNIQUE KEY `participantlimittype_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `participantParty` +-- + +DROP TABLE IF EXISTS `participantParty`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `participantParty` ( + `participantPartyId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `participantId` int(10) unsigned NOT NULL, + `partyId` bigint(20) unsigned NOT NULL, + PRIMARY KEY (`participantPartyId`), + UNIQUE KEY `participantparty_participantid_partyid_unique` (`participantId`,`partyId`), + KEY `participantparty_participantid_index` (`participantId`), + CONSTRAINT `participantparty_participantid_foreign` FOREIGN KEY (`participantId`) REFERENCES `participant` (`participantid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `participantPosition` +-- + +DROP TABLE IF EXISTS `participantPosition`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `participantPosition` ( + `participantPositionId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `participantCurrencyId` int(10) unsigned NOT NULL, + `value` decimal(18,4) NOT NULL, + `reservedValue` decimal(18,4) NOT NULL, + `changedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`participantPositionId`), + KEY `participantposition_participantcurrencyid_index` (`participantCurrencyId`), + CONSTRAINT `participantposition_participantcurrencyid_foreign` FOREIGN KEY (`participantCurrencyId`) REFERENCES `participantCurrency` (`participantcurrencyid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `participantPositionChange` +-- + +DROP TABLE IF EXISTS `participantPositionChange`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `participantPositionChange` ( + `participantPositionChangeId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `participantPositionId` bigint(20) unsigned NOT NULL, + `transferStateChangeId` bigint(20) unsigned NOT NULL, + `value` decimal(18,4) NOT NULL, + `reservedValue` decimal(18,4) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`participantPositionChangeId`), + KEY `participantpositionchange_participantpositionid_index` (`participantPositionId`), + KEY `participantpositionchange_transferstatechangeid_index` (`transferStateChangeId`), + CONSTRAINT `participantpositionchange_participantpositionid_foreign` FOREIGN KEY (`participantPositionId`) REFERENCES `participantPosition` (`participantpositionid`), + CONSTRAINT `participantpositionchange_transferstatechangeid_foreign` FOREIGN KEY (`transferStateChangeId`) REFERENCES `transferStateChange` (`transferstatechangeid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `party` +-- + +DROP TABLE IF EXISTS `party`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `party` ( + `partyId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `quotePartyId` bigint(20) unsigned NOT NULL, + `firstName` varchar(128) DEFAULT NULL, + `middleName` varchar(128) DEFAULT NULL, + `lastName` varchar(128) DEFAULT NULL, + `dateOfBirth` datetime DEFAULT NULL, + PRIMARY KEY (`partyId`), + KEY `party_quotepartyid_foreign` (`quotePartyId`), + CONSTRAINT `party_quotepartyid_foreign` FOREIGN KEY (`quotePartyId`) REFERENCES `quoteParty` (`quotepartyid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Optional pers. data provided during Quote Request & Response'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `partyIdentifierType` +-- + +DROP TABLE IF EXISTS `partyIdentifierType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `partyIdentifierType` ( + `partyIdentifierTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `description` varchar(512) NOT NULL, + PRIMARY KEY (`partyIdentifierTypeId`), + UNIQUE KEY `partyidentifiertype_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `partyType` +-- + +DROP TABLE IF EXISTS `partyType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `partyType` ( + `partyTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(128) NOT NULL, + `description` varchar(256) NOT NULL, + PRIMARY KEY (`partyTypeId`), + UNIQUE KEY `partytype_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `quote` +-- + +DROP TABLE IF EXISTS `quote`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `quote` ( + `quoteId` varchar(36) NOT NULL, + `transactionReferenceId` varchar(36) NOT NULL COMMENT 'Common ID (decided by the Payer FSP) between the FSPs for the future transaction object', + `transactionRequestId` varchar(36) DEFAULT NULL COMMENT 'Optional previously-sent transaction request', + `note` text COMMENT 'A memo that will be attached to the transaction', + `expirationDate` datetime DEFAULT NULL COMMENT 'Optional expiration for the requested transaction', + `transactionInitiatorId` int(10) unsigned NOT NULL COMMENT 'This is part of the transaction initiator', + `transactionInitiatorTypeId` int(10) unsigned NOT NULL COMMENT 'This is part of the transaction initiator type', + `transactionScenarioId` int(10) unsigned NOT NULL COMMENT 'This is part of the transaction scenario', + `balanceOfPaymentsId` int(10) unsigned DEFAULT NULL COMMENT 'This is part of the transaction type that contains the elements- balance of payment', + `transactionSubScenarioId` int(10) unsigned DEFAULT NULL COMMENT 'This is part of the transaction type sub scenario as defined by the local scheme', + `amountTypeId` int(10) unsigned NOT NULL COMMENT 'This is part of the transaction type that contains valid elements for - Amount Type', + `amount` decimal(18,4) NOT NULL DEFAULT '0.0000' COMMENT 'The amount that the quote is being requested for. Need to be interpert in accordance with the amount type', + `currencyId` varchar(255) DEFAULT NULL COMMENT 'Trading currency pertaining to the Amount', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`quoteId`), + KEY `quote_transactionreferenceid_foreign` (`transactionReferenceId`), + KEY `quote_transactionrequestid_foreign` (`transactionRequestId`), + KEY `quote_transactioninitiatorid_foreign` (`transactionInitiatorId`), + KEY `quote_transactioninitiatortypeid_foreign` (`transactionInitiatorTypeId`), + KEY `quote_transactionscenarioid_foreign` (`transactionScenarioId`), + KEY `quote_balanceofpaymentsid_foreign` (`balanceOfPaymentsId`), + KEY `quote_transactionsubscenarioid_foreign` (`transactionSubScenarioId`), + KEY `quote_amounttypeid_foreign` (`amountTypeId`), + KEY `quote_currencyid_foreign` (`currencyId`), + CONSTRAINT `quote_amounttypeid_foreign` FOREIGN KEY (`amountTypeId`) REFERENCES `amountType` (`amounttypeid`), + CONSTRAINT `quote_balanceofpaymentsid_foreign` FOREIGN KEY (`balanceOfPaymentsId`) REFERENCES `balanceOfPayments` (`balanceofpaymentsid`), + CONSTRAINT `quote_currencyid_foreign` FOREIGN KEY (`currencyId`) REFERENCES `currency` (`currencyid`), + CONSTRAINT `quote_transactioninitiatorid_foreign` FOREIGN KEY (`transactionInitiatorId`) REFERENCES `transactionInitiator` (`transactioninitiatorid`), + CONSTRAINT `quote_transactioninitiatortypeid_foreign` FOREIGN KEY (`transactionInitiatorTypeId`) REFERENCES `transactionInitiatorType` (`transactioninitiatortypeid`), + CONSTRAINT `quote_transactionreferenceid_foreign` FOREIGN KEY (`transactionReferenceId`) REFERENCES `transactionReference` (`transactionreferenceid`), + CONSTRAINT `quote_transactionrequestid_foreign` FOREIGN KEY (`transactionRequestId`) REFERENCES `transactionReference` (`transactionreferenceid`), + CONSTRAINT `quote_transactionscenarioid_foreign` FOREIGN KEY (`transactionScenarioId`) REFERENCES `transactionScenario` (`transactionscenarioid`), + CONSTRAINT `quote_transactionsubscenarioid_foreign` FOREIGN KEY (`transactionSubScenarioId`) REFERENCES `transactionSubScenario` (`transactionsubscenarioid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `quoteDuplicateCheck` +-- + +DROP TABLE IF EXISTS `quoteDuplicateCheck`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `quoteDuplicateCheck` ( + `quoteId` varchar(36) NOT NULL COMMENT 'Common ID between the FSPs for the quote object, decided by the Payer FSP', + `hash` varchar(1024) DEFAULT NULL COMMENT 'hash value received for the quote request', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`quoteId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `quoteError` +-- + +DROP TABLE IF EXISTS `quoteError`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `quoteError` ( + `quoteErrorId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `quoteId` varchar(36) NOT NULL COMMENT 'Common ID between the FSPs for the quote object, decided by the Payer FSP', + `quoteResponseId` bigint(20) unsigned DEFAULT NULL COMMENT 'The response to the intial quote', + `errorCode` int(10) unsigned NOT NULL, + `errorDescription` varchar(128) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`quoteErrorId`), + KEY `quoteerror_quoteid_foreign` (`quoteId`), + KEY `quoteerror_quoteresponseid_foreign` (`quoteResponseId`), + CONSTRAINT `quoteerror_quoteid_foreign` FOREIGN KEY (`quoteId`) REFERENCES `quote` (`quoteid`), + CONSTRAINT `quoteerror_quoteresponseid_foreign` FOREIGN KEY (`quoteResponseId`) REFERENCES `quoteResponse` (`quoteresponseid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `quoteExtension` +-- + +DROP TABLE IF EXISTS `quoteExtension`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `quoteExtension` ( + `quoteExtensionId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `quoteId` varchar(36) NOT NULL COMMENT 'Common ID between the FSPs for the quote object, decided by the Payer FSP', + `quoteResponseId` bigint(20) unsigned NOT NULL COMMENT 'The response to the intial quote', + `transactionId` varchar(36) NOT NULL COMMENT 'The transaction reference that is part of the initial quote', + `key` varchar(128) NOT NULL, + `value` text NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`quoteExtensionId`), + KEY `quoteextension_quoteid_foreign` (`quoteId`), + KEY `quoteextension_quoteresponseid_foreign` (`quoteResponseId`), + KEY `quoteextension_transactionid_foreign` (`transactionId`), + CONSTRAINT `quoteextension_quoteid_foreign` FOREIGN KEY (`quoteId`) REFERENCES `quote` (`quoteid`), + CONSTRAINT `quoteextension_quoteresponseid_foreign` FOREIGN KEY (`quoteResponseId`) REFERENCES `quoteResponse` (`quoteresponseid`), + CONSTRAINT `quoteextension_transactionid_foreign` FOREIGN KEY (`transactionId`) REFERENCES `transactionReference` (`transactionreferenceid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `quoteParty` +-- + +DROP TABLE IF EXISTS `quoteParty`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `quoteParty` ( + `quotePartyId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `quoteId` varchar(36) NOT NULL COMMENT 'Common ID between the FSPs for the quote object, decided by the Payer FSP', + `partyTypeId` int(10) unsigned NOT NULL COMMENT 'Specifies the type of party this row relates to; typically PAYER or PAYEE', + `partyIdentifierTypeId` int(10) unsigned NOT NULL COMMENT 'Specifies the type of identifier used to identify this party e.g. MSISDN, IBAN etc...', + `partyIdentifierValue` varchar(128) NOT NULL COMMENT 'The value of the identifier used to identify this party', + `partySubIdOrTypeId` int(10) unsigned DEFAULT NULL COMMENT 'A sub-identifier or sub-type for the Party', + `fspId` varchar(255) DEFAULT NULL COMMENT 'This is the FSP ID as provided in the quote. For the switch between multi-parties it is required', + `participantId` int(10) unsigned DEFAULT NULL COMMENT 'Reference to the resolved FSP ID (if supplied/known). If not an error will be reported', + `merchantClassificationCode` varchar(4) DEFAULT NULL COMMENT 'Used in the context of Payee Information, where the Payee happens to be a merchant accepting merchant payments', + `partyName` varchar(128) DEFAULT NULL COMMENT 'Display name of the Party, could be a real name or a nick name', + `transferParticipantRoleTypeId` int(10) unsigned NOT NULL COMMENT 'The role this Party is playing in the transaction', + `ledgerEntryTypeId` int(10) unsigned NOT NULL COMMENT 'The type of financial entry this Party is presenting', + `amount` decimal(18,4) NOT NULL, + `currencyId` varchar(3) NOT NULL COMMENT 'Trading currency pertaining to the party amount', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`quotePartyId`), + KEY `quoteparty_quoteid_foreign` (`quoteId`), + KEY `quoteparty_partytypeid_foreign` (`partyTypeId`), + KEY `quoteparty_partyidentifiertypeid_foreign` (`partyIdentifierTypeId`), + KEY `quoteparty_partysubidortypeid_foreign` (`partySubIdOrTypeId`), + KEY `quoteparty_participantid_foreign` (`participantId`), + KEY `quoteparty_transferparticipantroletypeid_foreign` (`transferParticipantRoleTypeId`), + KEY `quoteparty_ledgerentrytypeid_foreign` (`ledgerEntryTypeId`), + KEY `quoteparty_currencyid_foreign` (`currencyId`), + CONSTRAINT `quoteparty_currencyid_foreign` FOREIGN KEY (`currencyId`) REFERENCES `currency` (`currencyid`), + CONSTRAINT `quoteparty_ledgerentrytypeid_foreign` FOREIGN KEY (`ledgerEntryTypeId`) REFERENCES `ledgerEntryType` (`ledgerentrytypeid`), + CONSTRAINT `quoteparty_participantid_foreign` FOREIGN KEY (`participantId`) REFERENCES `participant` (`participantid`), + CONSTRAINT `quoteparty_partyidentifiertypeid_foreign` FOREIGN KEY (`partyIdentifierTypeId`) REFERENCES `partyIdentifierType` (`partyidentifiertypeid`), + CONSTRAINT `quoteparty_partysubidortypeid_foreign` FOREIGN KEY (`partySubIdOrTypeId`) REFERENCES `partyIdentifierType` (`partyidentifiertypeid`), + CONSTRAINT `quoteparty_partytypeid_foreign` FOREIGN KEY (`partyTypeId`) REFERENCES `partyType` (`partytypeid`), + CONSTRAINT `quoteparty_quoteid_foreign` FOREIGN KEY (`quoteId`) REFERENCES `quote` (`quoteid`), + CONSTRAINT `quoteparty_transferparticipantroletypeid_foreign` FOREIGN KEY (`transferParticipantRoleTypeId`) REFERENCES `transferParticipantRoleType` (`transferparticipantroletypeid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Temporary view structure for view `quotePartyView` +-- + +DROP TABLE IF EXISTS `quotePartyView`; +/*!50001 DROP VIEW IF EXISTS `quotePartyView`*/; +SET @saved_cs_client = @@character_set_client; +/*!50503 SET character_set_client = utf8mb4 */; +/*!50001 CREATE VIEW `quotePartyView` AS SELECT + 1 AS `quoteId`, + 1 AS `quotePartyId`, + 1 AS `partyType`, + 1 AS `identifierType`, + 1 AS `partyIdentifierValue`, + 1 AS `partySubIdOrType`, + 1 AS `fspId`, + 1 AS `merchantClassificationCode`, + 1 AS `partyName`, + 1 AS `firstName`, + 1 AS `lastName`, + 1 AS `middleName`, + 1 AS `dateOfBirth`, + 1 AS `longitude`, + 1 AS `latitude`*/; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `quoteResponse` +-- + +DROP TABLE IF EXISTS `quoteResponse`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `quoteResponse` ( + `quoteResponseId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `quoteId` varchar(36) NOT NULL COMMENT 'Common ID between the FSPs for the quote object, decided by the Payer FSP', + `transferAmountCurrencyId` varchar(3) NOT NULL COMMENT 'CurrencyId of the transfer amount', + `transferAmount` decimal(18,4) NOT NULL COMMENT 'The amount of money that the Payer FSP should transfer to the Payee FSP', + `payeeReceiveAmountCurrencyId` varchar(3) DEFAULT NULL COMMENT 'CurrencyId of the payee receive amount', + `payeeReceiveAmount` decimal(18,4) DEFAULT NULL COMMENT 'The amount of Money that the Payee should receive in the end-to-end transaction. Optional as the Payee FSP might not want to disclose any optional Payee fees', + `payeeFspFeeCurrencyId` varchar(3) DEFAULT NULL COMMENT 'CurrencyId of the payee fsp fee amount', + `payeeFspFeeAmount` decimal(18,4) DEFAULT NULL COMMENT 'Payee FSP’s part of the transaction fee', + `payeeFspCommissionCurrencyId` varchar(3) DEFAULT NULL COMMENT 'CurrencyId of the payee fsp commission amount', + `payeeFspCommissionAmount` decimal(18,4) DEFAULT NULL COMMENT 'Transaction commission from the Payee FSP', + `ilpCondition` varchar(256) NOT NULL, + `responseExpirationDate` datetime DEFAULT NULL COMMENT 'Optional expiration for the requested transaction', + `isValid` tinyint(1) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`quoteResponseId`), + KEY `quoteresponse_quoteid_foreign` (`quoteId`), + KEY `quoteresponse_transferamountcurrencyid_foreign` (`transferAmountCurrencyId`), + KEY `quoteresponse_payeereceiveamountcurrencyid_foreign` (`payeeReceiveAmountCurrencyId`), + KEY `quoteresponse_payeefspcommissioncurrencyid_foreign` (`payeeFspCommissionCurrencyId`), + CONSTRAINT `quoteresponse_payeefspcommissioncurrencyid_foreign` FOREIGN KEY (`payeeFspCommissionCurrencyId`) REFERENCES `currency` (`currencyid`), + CONSTRAINT `quoteresponse_payeereceiveamountcurrencyid_foreign` FOREIGN KEY (`payeeReceiveAmountCurrencyId`) REFERENCES `currency` (`currencyid`), + CONSTRAINT `quoteresponse_quoteid_foreign` FOREIGN KEY (`quoteId`) REFERENCES `quote` (`quoteid`), + CONSTRAINT `quoteresponse_transferamountcurrencyid_foreign` FOREIGN KEY (`transferAmountCurrencyId`) REFERENCES `currency` (`currencyid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='This table is the primary store for quote responses'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `quoteResponseDuplicateCheck` +-- + +DROP TABLE IF EXISTS `quoteResponseDuplicateCheck`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `quoteResponseDuplicateCheck` ( + `quoteResponseId` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'The response to the intial quote', + `quoteId` varchar(36) NOT NULL COMMENT 'Common ID between the FSPs for the quote object, decided by the Payer FSP', + `hash` varchar(255) DEFAULT NULL COMMENT 'hash value received for the quote response', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`quoteResponseId`), + KEY `quoteresponseduplicatecheck_quoteid_foreign` (`quoteId`), + CONSTRAINT `quoteresponseduplicatecheck_quoteid_foreign` FOREIGN KEY (`quoteId`) REFERENCES `quote` (`quoteid`), + CONSTRAINT `quoteresponseduplicatecheck_quoteresponseid_foreign` FOREIGN KEY (`quoteResponseId`) REFERENCES `quoteResponse` (`quoteresponseid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `quoteResponseIlpPacket` +-- + +DROP TABLE IF EXISTS `quoteResponseIlpPacket`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `quoteResponseIlpPacket` ( + `quoteResponseId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `value` text NOT NULL COMMENT 'ilpPacket returned from Payee in response to a quote request', + PRIMARY KEY (`quoteResponseId`), + CONSTRAINT `quoteresponseilppacket_quoteresponseid_foreign` FOREIGN KEY (`quoteResponseId`) REFERENCES `quoteResponse` (`quoteresponseid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Temporary view structure for view `quoteResponseView` +-- + +DROP TABLE IF EXISTS `quoteResponseView`; +/*!50001 DROP VIEW IF EXISTS `quoteResponseView`*/; +SET @saved_cs_client = @@character_set_client; +/*!50503 SET character_set_client = utf8mb4 */; +/*!50001 CREATE VIEW `quoteResponseView` AS SELECT + 1 AS `quoteResponseId`, + 1 AS `quoteId`, + 1 AS `transferAmountCurrencyId`, + 1 AS `transferAmount`, + 1 AS `payeeReceiveAmountCurrencyId`, + 1 AS `payeeReceiveAmount`, + 1 AS `payeeFspFeeCurrencyId`, + 1 AS `payeeFspFeeAmount`, + 1 AS `payeeFspCommissionCurrencyId`, + 1 AS `payeeFspCommissionAmount`, + 1 AS `ilpCondition`, + 1 AS `responseExpirationDate`, + 1 AS `isValid`, + 1 AS `createdDate`, + 1 AS `ilpPacket`, + 1 AS `longitude`, + 1 AS `latitude`*/; +SET character_set_client = @saved_cs_client; + +-- +-- Temporary view structure for view `quoteView` +-- + +DROP TABLE IF EXISTS `quoteView`; +/*!50001 DROP VIEW IF EXISTS `quoteView`*/; +SET @saved_cs_client = @@character_set_client; +/*!50503 SET character_set_client = utf8mb4 */; +/*!50001 CREATE VIEW `quoteView` AS SELECT + 1 AS `quoteId`, + 1 AS `transactionReferenceId`, + 1 AS `transactionRequestId`, + 1 AS `note`, + 1 AS `expirationDate`, + 1 AS `transactionInitiator`, + 1 AS `transactionInitiatorType`, + 1 AS `transactionScenario`, + 1 AS `balanceOfPaymentsId`, + 1 AS `transactionSubScenario`, + 1 AS `amountType`, + 1 AS `amount`, + 1 AS `currency`*/; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `segment` +-- + +DROP TABLE IF EXISTS `segment`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `segment` ( + `segmentId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `segmentType` varchar(50) NOT NULL, + `enumeration` int(11) NOT NULL DEFAULT '0', + `tableName` varchar(50) NOT NULL, + `value` bigint(20) NOT NULL, + `changedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`segmentId`), + KEY `segment_keys_index` (`segmentType`,`enumeration`,`tableName`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlement` +-- + +DROP TABLE IF EXISTS `settlement`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settlement` ( + `settlementId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `reason` varchar(512) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `currentStateChangeId` bigint(20) unsigned DEFAULT NULL, + `settlementModelId` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`settlementId`), + KEY `settlement_currentstatechangeid_foreign` (`currentStateChangeId`), + KEY `settlement_settlementmodelid_foreign` (`settlementModelId`), + CONSTRAINT `settlement_currentstatechangeid_foreign` FOREIGN KEY (`currentStateChangeId`) REFERENCES `settlementStateChange` (`settlementstatechangeid`), + CONSTRAINT `settlement_settlementmodelid_foreign` FOREIGN KEY (`settlementModelId`) REFERENCES `settlementModel` (`settlementmodelid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementContentAggregation` +-- + +DROP TABLE IF EXISTS `settlementContentAggregation`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settlementContentAggregation` ( + `settlementContentAggregationId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `settlementWindowContentId` bigint(20) unsigned NOT NULL, + `participantCurrencyId` int(10) unsigned NOT NULL, + `transferParticipantRoleTypeId` int(10) unsigned NOT NULL, + `ledgerEntryTypeId` int(10) unsigned NOT NULL, + `amount` decimal(18,2) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `currentStateId` varchar(50) NOT NULL, + `settlementId` bigint(20) unsigned DEFAULT NULL, + PRIMARY KEY (`settlementContentAggregationId`), + KEY `settlementcontentaggregation_settlementwindowcontentid_index` (`settlementWindowContentId`), + KEY `settlementcontentaggregation_participantcurrencyid_index` (`participantCurrencyId`), + KEY `settlementcontentaggregation_transferparticipantroletypeid_index` (`transferParticipantRoleTypeId`), + KEY `settlementcontentaggregation_ledgerentrytypeid_index` (`ledgerEntryTypeId`), + KEY `settlementcontentaggregation_currentstateid_index` (`currentStateId`), + KEY `settlementcontentaggregation_settlementid_index` (`settlementId`), + CONSTRAINT `sca_transferparticipantroletypeid_foreign` FOREIGN KEY (`transferParticipantRoleTypeId`) REFERENCES `transferParticipantRoleType` (`transferparticipantroletypeid`), + CONSTRAINT `settlementcontentaggregation_currentstateid_foreign` FOREIGN KEY (`currentStateId`) REFERENCES `settlementWindowState` (`settlementwindowstateid`), + CONSTRAINT `settlementcontentaggregation_ledgerentrytypeid_foreign` FOREIGN KEY (`ledgerEntryTypeId`) REFERENCES `ledgerEntryType` (`ledgerentrytypeid`), + CONSTRAINT `settlementcontentaggregation_participantcurrencyid_foreign` FOREIGN KEY (`participantCurrencyId`) REFERENCES `participantCurrency` (`participantcurrencyid`), + CONSTRAINT `settlementcontentaggregation_settlementid_foreign` FOREIGN KEY (`settlementId`) REFERENCES `settlement` (`settlementid`), + CONSTRAINT `settlementcontentaggregation_settlementwindowcontentid_foreign` FOREIGN KEY (`settlementWindowContentId`) REFERENCES `settlementWindowContent` (`settlementwindowcontentid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementDelay` +-- + +DROP TABLE IF EXISTS `settlementDelay`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settlementDelay` ( + `settlementDelayId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`settlementDelayId`), + UNIQUE KEY `settlementdelay_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementGranularity` +-- + +DROP TABLE IF EXISTS `settlementGranularity`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settlementGranularity` ( + `settlementGranularityId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`settlementGranularityId`), + UNIQUE KEY `settlementgranularity_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementInterchange` +-- + +DROP TABLE IF EXISTS `settlementInterchange`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settlementInterchange` ( + `settlementInterchangeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`settlementInterchangeId`), + UNIQUE KEY `settlementinterchange_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementModel` +-- + +DROP TABLE IF EXISTS `settlementModel`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settlementModel` ( + `settlementModelId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `settlementGranularityId` int(10) unsigned NOT NULL, + `settlementInterchangeId` int(10) unsigned NOT NULL, + `settlementDelayId` int(10) unsigned NOT NULL, + `currencyId` varchar(3) DEFAULT NULL, + `requireLiquidityCheck` tinyint(1) NOT NULL DEFAULT '1', + `ledgerAccountTypeId` int(10) unsigned NOT NULL, + `autoPositionReset` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`settlementModelId`), + UNIQUE KEY `settlementmodel_name_unique` (`name`), + KEY `settlementmodel_settlementgranularityid_index` (`settlementGranularityId`), + KEY `settlementmodel_settlementinterchangeid_index` (`settlementInterchangeId`), + KEY `settlementmodel_settlementdelayid_index` (`settlementDelayId`), + KEY `settlementmodel_currencyid_index` (`currencyId`), + KEY `settlementmodel_ledgeraccounttypeid_index` (`ledgerAccountTypeId`), + CONSTRAINT `settlementmodel_currencyid_foreign` FOREIGN KEY (`currencyId`) REFERENCES `currency` (`currencyid`), + CONSTRAINT `settlementmodel_ledgeraccounttypeid_foreign` FOREIGN KEY (`ledgerAccountTypeId`) REFERENCES `ledgerAccountType` (`ledgeraccounttypeid`), + CONSTRAINT `settlementmodel_settlementdelayid_foreign` FOREIGN KEY (`settlementDelayId`) REFERENCES `settlementDelay` (`settlementdelayid`), + CONSTRAINT `settlementmodel_settlementgranularityid_foreign` FOREIGN KEY (`settlementGranularityId`) REFERENCES `settlementGranularity` (`settlementgranularityid`), + CONSTRAINT `settlementmodel_settlementinterchangeid_foreign` FOREIGN KEY (`settlementInterchangeId`) REFERENCES `settlementInterchange` (`settlementinterchangeid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementParticipantCurrency` +-- + +DROP TABLE IF EXISTS `settlementParticipantCurrency`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settlementParticipantCurrency` ( + `settlementParticipantCurrencyId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `settlementId` bigint(20) unsigned NOT NULL, + `participantCurrencyId` int(10) unsigned NOT NULL, + `netAmount` decimal(18,4) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `currentStateChangeId` bigint(20) unsigned DEFAULT NULL, + `settlementTransferId` varchar(36) DEFAULT NULL, + PRIMARY KEY (`settlementParticipantCurrencyId`), + KEY `settlementparticipantcurrency_settlementid_index` (`settlementId`), + KEY `settlementparticipantcurrency_participantcurrencyid_index` (`participantCurrencyId`), + KEY `settlementparticipantcurrency_settlementtransferid_index` (`settlementTransferId`), + KEY `spc_currentstatechangeid_foreign` (`currentStateChangeId`), + CONSTRAINT `settlementparticipantcurrency_participantcurrencyid_foreign` FOREIGN KEY (`participantCurrencyId`) REFERENCES `participantCurrency` (`participantcurrencyid`), + CONSTRAINT `settlementparticipantcurrency_settlementid_foreign` FOREIGN KEY (`settlementId`) REFERENCES `settlement` (`settlementid`), + CONSTRAINT `spc_currentstatechangeid_foreign` FOREIGN KEY (`currentStateChangeId`) REFERENCES `settlementParticipantCurrencyStateChange` (`settlementparticipantcurrencystatechangeid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementParticipantCurrencyStateChange` +-- + +DROP TABLE IF EXISTS `settlementParticipantCurrencyStateChange`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settlementParticipantCurrencyStateChange` ( + `settlementParticipantCurrencyStateChangeId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `settlementParticipantCurrencyId` bigint(20) unsigned NOT NULL, + `settlementStateId` varchar(50) NOT NULL, + `reason` varchar(512) DEFAULT NULL, + `externalReference` varchar(50) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`settlementParticipantCurrencyStateChangeId`), + KEY `spcsc_settlementparticipantcurrencyid_index` (`settlementParticipantCurrencyId`), + KEY `spcsc_settlementstateid_index` (`settlementStateId`), + CONSTRAINT `spcsc_settlementparticipantcurrencyid_foreign` FOREIGN KEY (`settlementParticipantCurrencyId`) REFERENCES `settlementParticipantCurrency` (`settlementparticipantcurrencyid`), + CONSTRAINT `spcsc_settlementstateid_foreign` FOREIGN KEY (`settlementStateId`) REFERENCES `settlementState` (`settlementstateid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementSettlementWindow` +-- + +DROP TABLE IF EXISTS `settlementSettlementWindow`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settlementSettlementWindow` ( + `settlementSettlementWindowId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `settlementId` bigint(20) unsigned NOT NULL, + `settlementWindowId` bigint(20) unsigned NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`settlementSettlementWindowId`), + UNIQUE KEY `settlementsettlementwindow_unique` (`settlementId`,`settlementWindowId`), + KEY `settlementsettlementwindow_settlementid_index` (`settlementId`), + KEY `settlementsettlementwindow_settlementwindowid_index` (`settlementWindowId`), + CONSTRAINT `settlementsettlementwindow_settlementid_foreign` FOREIGN KEY (`settlementId`) REFERENCES `settlement` (`settlementid`), + CONSTRAINT `settlementsettlementwindow_settlementwindowid_foreign` FOREIGN KEY (`settlementWindowId`) REFERENCES `settlementWindow` (`settlementwindowid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementState` +-- + +DROP TABLE IF EXISTS `settlementState`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settlementState` ( + `settlementStateId` varchar(50) NOT NULL, + `enumeration` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`settlementStateId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementStateChange` +-- + +DROP TABLE IF EXISTS `settlementStateChange`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settlementStateChange` ( + `settlementStateChangeId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `settlementId` bigint(20) unsigned NOT NULL, + `settlementStateId` varchar(50) NOT NULL, + `reason` varchar(512) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`settlementStateChangeId`), + KEY `settlementstatechange_settlementid_index` (`settlementId`), + KEY `settlementstatechange_settlementstateid_index` (`settlementStateId`), + CONSTRAINT `settlementstatechange_settlementid_foreign` FOREIGN KEY (`settlementId`) REFERENCES `settlement` (`settlementid`), + CONSTRAINT `settlementstatechange_settlementstateid_foreign` FOREIGN KEY (`settlementStateId`) REFERENCES `settlementState` (`settlementstateid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementTransferParticipant` +-- + +DROP TABLE IF EXISTS `settlementTransferParticipant`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settlementTransferParticipant` ( + `settlementTransferParticipantId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `settlementId` bigint(20) unsigned NOT NULL, + `settlementWindowId` bigint(20) unsigned NOT NULL, + `participantCurrencyId` int(10) unsigned NOT NULL, + `transferParticipantRoleTypeId` int(10) unsigned NOT NULL, + `ledgerEntryTypeId` int(10) unsigned NOT NULL, + `amount` decimal(18,4) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`settlementTransferParticipantId`), + KEY `settlementtransferparticipant_settlementid_index` (`settlementId`), + KEY `settlementtransferparticipant_settlementwindowid_index` (`settlementWindowId`), + KEY `settlementtransferparticipant_participantcurrencyid_index` (`participantCurrencyId`), + KEY `stp_transferparticipantroletypeid_index` (`transferParticipantRoleTypeId`), + KEY `settlementtransferparticipant_ledgerentrytypeid_index` (`ledgerEntryTypeId`), + CONSTRAINT `settlementtransferparticipant_ledgerentrytypeid_foreign` FOREIGN KEY (`ledgerEntryTypeId`) REFERENCES `ledgerEntryType` (`ledgerentrytypeid`), + CONSTRAINT `settlementtransferparticipant_participantcurrencyid_foreign` FOREIGN KEY (`participantCurrencyId`) REFERENCES `participantCurrency` (`participantcurrencyid`), + CONSTRAINT `settlementtransferparticipant_settlementid_foreign` FOREIGN KEY (`settlementId`) REFERENCES `settlement` (`settlementid`), + CONSTRAINT `settlementtransferparticipant_settlementwindowid_foreign` FOREIGN KEY (`settlementWindowId`) REFERENCES `settlementWindow` (`settlementwindowid`), + CONSTRAINT `stp_transferparticipantroletypeid_foreign` FOREIGN KEY (`transferParticipantRoleTypeId`) REFERENCES `transferParticipantRoleType` (`transferparticipantroletypeid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementWindow` +-- + +DROP TABLE IF EXISTS `settlementWindow`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settlementWindow` ( + `settlementWindowId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `reason` varchar(512) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `currentStateChangeId` bigint(20) unsigned DEFAULT NULL, + PRIMARY KEY (`settlementWindowId`), + KEY `settlementwindow_currentstatechangeid_foreign` (`currentStateChangeId`), + CONSTRAINT `settlementwindow_currentstatechangeid_foreign` FOREIGN KEY (`currentStateChangeId`) REFERENCES `settlementWindowStateChange` (`settlementwindowstatechangeid`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementWindowContent` +-- + +DROP TABLE IF EXISTS `settlementWindowContent`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settlementWindowContent` ( + `settlementWindowContentId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `settlementWindowId` bigint(20) unsigned NOT NULL, + `ledgerAccountTypeId` int(10) unsigned NOT NULL, + `currencyId` varchar(3) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `currentStateChangeId` bigint(20) unsigned DEFAULT NULL, + `settlementId` bigint(20) unsigned DEFAULT NULL, + PRIMARY KEY (`settlementWindowContentId`), + KEY `settlementwindowcontent_settlementwindowid_index` (`settlementWindowId`), + KEY `settlementwindowcontent_ledgeraccounttypeid_index` (`ledgerAccountTypeId`), + KEY `settlementwindowcontent_currencyid_index` (`currencyId`), + KEY `settlementwindowcontent_currentstatechangeid_index` (`currentStateChangeId`), + KEY `settlementwindowcontent_settlementid_index` (`settlementId`), + CONSTRAINT `settlementwindowcontent_currencyid_foreign` FOREIGN KEY (`currencyId`) REFERENCES `currency` (`currencyid`), + CONSTRAINT `settlementwindowcontent_currentstatechangeid_foreign` FOREIGN KEY (`currentStateChangeId`) REFERENCES `settlementWindowContentStateChange` (`settlementwindowcontentstatechangeid`), + CONSTRAINT `settlementwindowcontent_ledgeraccounttypeid_foreign` FOREIGN KEY (`ledgerAccountTypeId`) REFERENCES `ledgerAccountType` (`ledgeraccounttypeid`), + CONSTRAINT `settlementwindowcontent_settlementid_foreign` FOREIGN KEY (`settlementId`) REFERENCES `settlement` (`settlementid`), + CONSTRAINT `settlementwindowcontent_settlementwindowid_foreign` FOREIGN KEY (`settlementWindowId`) REFERENCES `settlementWindow` (`settlementwindowid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementWindowContentStateChange` +-- + +DROP TABLE IF EXISTS `settlementWindowContentStateChange`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settlementWindowContentStateChange` ( + `settlementWindowContentStateChangeId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `settlementWindowContentId` bigint(20) unsigned NOT NULL, + `settlementWindowStateId` varchar(50) NOT NULL, + `reason` varchar(512) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`settlementWindowContentStateChangeId`), + KEY `swcsc_settlementwindowcontentid_index` (`settlementWindowContentId`), + KEY `swcsc_settlementwindowstateid_index` (`settlementWindowStateId`), + CONSTRAINT `swc_settlementwindowcontentid_foreign` FOREIGN KEY (`settlementWindowContentId`) REFERENCES `settlementWindowContent` (`settlementwindowcontentid`), + CONSTRAINT `sws1_settlementwindowstateid_foreign` FOREIGN KEY (`settlementWindowStateId`) REFERENCES `settlementWindowState` (`settlementwindowstateid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementWindowState` +-- + +DROP TABLE IF EXISTS `settlementWindowState`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settlementWindowState` ( + `settlementWindowStateId` varchar(50) NOT NULL, + `enumeration` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`settlementWindowStateId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `settlementWindowStateChange` +-- + +DROP TABLE IF EXISTS `settlementWindowStateChange`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settlementWindowStateChange` ( + `settlementWindowStateChangeId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `settlementWindowId` bigint(20) unsigned NOT NULL, + `settlementWindowStateId` varchar(50) NOT NULL, + `reason` varchar(512) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`settlementWindowStateChangeId`), + KEY `settlementwindowstatechange_settlementwindowid_index` (`settlementWindowId`), + KEY `settlementwindowstatechange_settlementwindowstateid_index` (`settlementWindowStateId`), + CONSTRAINT `settlementwindowstatechange_settlementwindowid_foreign` FOREIGN KEY (`settlementWindowId`) REFERENCES `settlementWindow` (`settlementwindowid`), + CONSTRAINT `settlementwindowstatechange_settlementwindowstateid_foreign` FOREIGN KEY (`settlementWindowStateId`) REFERENCES `settlementWindowState` (`settlementwindowstateid`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `token` +-- + +DROP TABLE IF EXISTS `token`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `token` ( + `tokenId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `participantId` int(10) unsigned NOT NULL, + `value` varchar(256) NOT NULL, + `expiration` bigint(20) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`tokenId`), + UNIQUE KEY `token_value_unique` (`value`), + KEY `token_participantid_index` (`participantId`), + CONSTRAINT `token_participantid_foreign` FOREIGN KEY (`participantId`) REFERENCES `participant` (`participantid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transactionInitiator` +-- + +DROP TABLE IF EXISTS `transactionInitiator`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `transactionInitiator` ( + `transactionInitiatorId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(256) NOT NULL, + `description` varchar(1024) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`transactionInitiatorId`), + UNIQUE KEY `transactioninitiator_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transactionInitiatorType` +-- + +DROP TABLE IF EXISTS `transactionInitiatorType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `transactionInitiatorType` ( + `transactionInitiatorTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(256) NOT NULL, + `description` varchar(1024) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`transactionInitiatorTypeId`), + UNIQUE KEY `transactioninitiatortype_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transactionReference` +-- + +DROP TABLE IF EXISTS `transactionReference`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `transactionReference` ( + `transactionReferenceId` varchar(36) NOT NULL COMMENT 'Common ID (decided by the Payer FSP) between the FSPs for the future transaction object', + `quoteId` varchar(36) DEFAULT NULL COMMENT 'Common ID between the FSPs for the quote object, decided by the Payer FSP', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System row creation timestamp', + PRIMARY KEY (`transactionReferenceId`), + KEY `transactionreference_quoteid_index` (`quoteId`), + CONSTRAINT `transactionreference_quoteid_foreign` FOREIGN KEY (`quoteId`) REFERENCES `quoteDuplicateCheck` (`quoteid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transactionScenario` +-- + +DROP TABLE IF EXISTS `transactionScenario`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `transactionScenario` ( + `transactionScenarioId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(256) NOT NULL, + `description` varchar(1024) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`transactionScenarioId`), + UNIQUE KEY `transactionscenario_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transactionSubScenario` +-- + +DROP TABLE IF EXISTS `transactionSubScenario`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `transactionSubScenario` ( + `transactionSubScenarioId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(256) NOT NULL, + `description` varchar(1024) DEFAULT NULL COMMENT 'Possible sub-scenario, defined locally within the scheme', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'System dateTime stamp pertaining to the inserted record', + PRIMARY KEY (`transactionSubScenarioId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transfer` +-- + +DROP TABLE IF EXISTS `transfer`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `transfer` ( + `transferId` varchar(36) NOT NULL, + `amount` decimal(18,4) NOT NULL, + `currencyId` varchar(3) NOT NULL, + `ilpCondition` varchar(256) NOT NULL, + `expirationDate` datetime NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferId`), + KEY `transfer_currencyid_index` (`currencyId`), + CONSTRAINT `transfer_currencyid_foreign` FOREIGN KEY (`currencyId`) REFERENCES `currency` (`currencyid`), + CONSTRAINT `transfer_transferid_foreign` FOREIGN KEY (`transferId`) REFERENCES `transferDuplicateCheck` (`transferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferDuplicateCheck` +-- + +DROP TABLE IF EXISTS `transferDuplicateCheck`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `transferDuplicateCheck` ( + `transferId` varchar(36) NOT NULL, + `hash` varchar(256) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferError` +-- + +DROP TABLE IF EXISTS `transferError`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `transferError` ( + `transferId` varchar(36) NOT NULL, + `transferStateChangeId` bigint(20) unsigned NOT NULL, + `errorCode` int(10) unsigned NOT NULL, + `errorDescription` varchar(128) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferId`), + KEY `transfererror_transferstatechangeid_foreign` (`transferStateChangeId`), + CONSTRAINT `transfererror_transferstatechangeid_foreign` FOREIGN KEY (`transferStateChangeId`) REFERENCES `transferStateChange` (`transferstatechangeid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferErrorDuplicateCheck` +-- + +DROP TABLE IF EXISTS `transferErrorDuplicateCheck`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `transferErrorDuplicateCheck` ( + `transferId` varchar(36) NOT NULL, + `hash` varchar(256) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferId`), + CONSTRAINT `transfererrorduplicatecheck_transferid_foreign` FOREIGN KEY (`transferId`) REFERENCES `transfer` (`transferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferExtension` +-- + +DROP TABLE IF EXISTS `transferExtension`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `transferExtension` ( + `transferExtensionId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `transferId` varchar(36) NOT NULL, + `key` varchar(128) NOT NULL, + `value` text NOT NULL, + `isFulfilment` tinyint(1) NOT NULL DEFAULT '0', + `isError` tinyint(1) NOT NULL DEFAULT '0', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferExtensionId`), + KEY `transferextension_transferid_foreign` (`transferId`), + CONSTRAINT `transferextension_transferid_foreign` FOREIGN KEY (`transferId`) REFERENCES `transfer` (`transferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferFulfilment` +-- + +DROP TABLE IF EXISTS `transferFulfilment`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `transferFulfilment` ( + `transferId` varchar(36) NOT NULL, + `ilpFulfilment` varchar(256) DEFAULT NULL, + `completedDate` datetime NOT NULL, + `isValid` tinyint(1) DEFAULT NULL, + `settlementWindowId` bigint(20) unsigned DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferId`), + KEY `transferfulfilment_settlementwindowid_foreign` (`settlementWindowId`), + CONSTRAINT `transferfulfilment_settlementwindowid_foreign` FOREIGN KEY (`settlementWindowId`) REFERENCES `settlementWindow` (`settlementwindowid`), + CONSTRAINT `transferfulfilment_transferid_foreign` FOREIGN KEY (`transferId`) REFERENCES `transferFulfilmentDuplicateCheck` (`transferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferFulfilmentDuplicateCheck` +-- + +DROP TABLE IF EXISTS `transferFulfilmentDuplicateCheck`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `transferFulfilmentDuplicateCheck` ( + `transferId` varchar(36) NOT NULL, + `hash` varchar(256) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferId`), + CONSTRAINT `transferfulfilmentduplicatecheck_transferid_foreign` FOREIGN KEY (`transferId`) REFERENCES `transfer` (`transferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferParticipant` +-- + +DROP TABLE IF EXISTS `transferParticipant`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `transferParticipant` ( + `transferParticipantId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `transferId` varchar(36) NOT NULL, + `participantCurrencyId` int(10) unsigned NOT NULL, + `transferParticipantRoleTypeId` int(10) unsigned NOT NULL, + `ledgerEntryTypeId` int(10) unsigned NOT NULL, + `amount` decimal(18,4) NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `currentStateChangeId` bigint(20) unsigned DEFAULT NULL, + PRIMARY KEY (`transferParticipantId`), + KEY `transferparticipant_transferid_index` (`transferId`), + KEY `transferparticipant_participantcurrencyid_index` (`participantCurrencyId`), + KEY `transferparticipant_transferparticipantroletypeid_index` (`transferParticipantRoleTypeId`), + KEY `transferparticipant_ledgerentrytypeid_index` (`ledgerEntryTypeId`), + KEY `transferparticipant_currentstatechangeid_foreign` (`currentStateChangeId`), + CONSTRAINT `transferparticipant_currentstatechangeid_foreign` FOREIGN KEY (`currentStateChangeId`) REFERENCES `transferParticipantStateChange` (`transferparticipantstatechangeid`), + CONSTRAINT `transferparticipant_ledgerentrytypeid_foreign` FOREIGN KEY (`ledgerEntryTypeId`) REFERENCES `ledgerEntryType` (`ledgerentrytypeid`), + CONSTRAINT `transferparticipant_participantcurrencyid_foreign` FOREIGN KEY (`participantCurrencyId`) REFERENCES `participantCurrency` (`participantcurrencyid`), + CONSTRAINT `transferparticipant_transferid_foreign` FOREIGN KEY (`transferId`) REFERENCES `transfer` (`transferid`), + CONSTRAINT `transferparticipant_transferparticipantroletypeid_foreign` FOREIGN KEY (`transferParticipantRoleTypeId`) REFERENCES `transferParticipantRoleType` (`transferparticipantroletypeid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferParticipantRoleType` +-- + +DROP TABLE IF EXISTS `transferParticipantRoleType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `transferParticipantRoleType` ( + `transferParticipantRoleTypeId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferParticipantRoleTypeId`), + UNIQUE KEY `transferparticipantroletype_name_unique` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferParticipantStateChange` +-- + +DROP TABLE IF EXISTS `transferParticipantStateChange`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `transferParticipantStateChange` ( + `transferParticipantStateChangeId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `transferParticipantId` bigint(20) unsigned NOT NULL, + `settlementWindowStateId` varchar(50) NOT NULL, + `reason` varchar(512) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferParticipantStateChangeId`), + KEY `transferparticipantstatechange_transferparticipantid_index` (`transferParticipantId`), + KEY `transferparticipantstatechange_settlementwindowstateid_index` (`settlementWindowStateId`), + CONSTRAINT `transferparticipantstatechange_settlementwindowstateid_foreign` FOREIGN KEY (`settlementWindowStateId`) REFERENCES `settlementWindowState` (`settlementwindowstateid`), + CONSTRAINT `transferparticipantstatechange_transferparticipantid_foreign` FOREIGN KEY (`transferParticipantId`) REFERENCES `transferParticipant` (`transferparticipantid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferRules` +-- + +DROP TABLE IF EXISTS `transferRules`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `transferRules` ( + `transferRulesId` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(128) NOT NULL, + `description` varchar(512) DEFAULT NULL, + `rule` text NOT NULL, + `enabled` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferRulesId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferState` +-- + +DROP TABLE IF EXISTS `transferState`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `transferState` ( + `transferStateId` varchar(50) NOT NULL, + `enumeration` varchar(50) NOT NULL COMMENT 'transferState associated to the Mojaloop API', + `description` varchar(512) DEFAULT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferStateId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferStateChange` +-- + +DROP TABLE IF EXISTS `transferStateChange`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `transferStateChange` ( + `transferStateChangeId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `transferId` varchar(36) NOT NULL, + `transferStateId` varchar(50) NOT NULL, + `reason` varchar(512) DEFAULT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferStateChangeId`), + KEY `transferstatechange_transferid_index` (`transferId`), + KEY `transferstatechange_transferstateid_index` (`transferStateId`), + CONSTRAINT `transferstatechange_transferid_foreign` FOREIGN KEY (`transferId`) REFERENCES `transfer` (`transferid`), + CONSTRAINT `transferstatechange_transferstateid_foreign` FOREIGN KEY (`transferStateId`) REFERENCES `transferState` (`transferstateid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transferTimeout` +-- + +DROP TABLE IF EXISTS `transferTimeout`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `transferTimeout` ( + `transferTimeoutId` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `transferId` varchar(36) NOT NULL, + `expirationDate` datetime NOT NULL, + `createdDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`transferTimeoutId`), + UNIQUE KEY `transfertimeout_transferid_unique` (`transferId`), + CONSTRAINT `transfertimeout_transferid_foreign` FOREIGN KEY (`transferId`) REFERENCES `transfer` (`transferid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Final view structure for view `quotePartyView` +-- + +/*!50001 DROP VIEW IF EXISTS `quotePartyView`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`central_ledger`@`%` SQL SECURITY DEFINER */ +/*!50001 VIEW `quotePartyView` AS select `qp`.`quoteId` AS `quoteId`,`qp`.`quotePartyId` AS `quotePartyId`,`pt`.`name` AS `partyType`,`pit`.`name` AS `identifierType`,`qp`.`partyIdentifierValue` AS `partyIdentifierValue`,`spit`.`name` AS `partySubIdOrType`,`qp`.`fspId` AS `fspId`,`qp`.`merchantClassificationCode` AS `merchantClassificationCode`,`qp`.`partyName` AS `partyName`,`p`.`firstName` AS `firstName`,`p`.`lastName` AS `lastName`,`p`.`middleName` AS `middleName`,`p`.`dateOfBirth` AS `dateOfBirth`,`gc`.`longitude` AS `longitude`,`gc`.`latitude` AS `latitude` from (((((`quoteParty` `qp` join `partyType` `pt` on((`pt`.`partyTypeId` = `qp`.`partyTypeId`))) join `partyIdentifierType` `pit` on((`pit`.`partyIdentifierTypeId` = `qp`.`partyIdentifierTypeId`))) left join `party` `p` on((`p`.`quotePartyId` = `qp`.`quotePartyId`))) left join `partyIdentifierType` `spit` on((`spit`.`partyIdentifierTypeId` = `qp`.`partySubIdOrTypeId`))) left join `geoCode` `gc` on((`gc`.`quotePartyId` = `qp`.`quotePartyId`))) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; + +-- +-- Final view structure for view `quoteResponseView` +-- + +/*!50001 DROP VIEW IF EXISTS `quoteResponseView`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`central_ledger`@`%` SQL SECURITY DEFINER */ +/*!50001 VIEW `quoteResponseView` AS select `qr`.`quoteResponseId` AS `quoteResponseId`,`qr`.`quoteId` AS `quoteId`,`qr`.`transferAmountCurrencyId` AS `transferAmountCurrencyId`,`qr`.`transferAmount` AS `transferAmount`,`qr`.`payeeReceiveAmountCurrencyId` AS `payeeReceiveAmountCurrencyId`,`qr`.`payeeReceiveAmount` AS `payeeReceiveAmount`,`qr`.`payeeFspFeeCurrencyId` AS `payeeFspFeeCurrencyId`,`qr`.`payeeFspFeeAmount` AS `payeeFspFeeAmount`,`qr`.`payeeFspCommissionCurrencyId` AS `payeeFspCommissionCurrencyId`,`qr`.`payeeFspCommissionAmount` AS `payeeFspCommissionAmount`,`qr`.`ilpCondition` AS `ilpCondition`,`qr`.`responseExpirationDate` AS `responseExpirationDate`,`qr`.`isValid` AS `isValid`,`qr`.`createdDate` AS `createdDate`,`qrilp`.`value` AS `ilpPacket`,`gc`.`longitude` AS `longitude`,`gc`.`latitude` AS `latitude` from ((((`quoteResponse` `qr` join `quoteResponseIlpPacket` `qrilp` on((`qrilp`.`quoteResponseId` = `qr`.`quoteResponseId`))) join `quoteParty` `qp` on((`qp`.`quoteId` = `qr`.`quoteId`))) join `partyType` `pt` on((`pt`.`partyTypeId` = `qp`.`partyTypeId`))) left join `geoCode` `gc` on((`gc`.`quotePartyId` = `qp`.`quotePartyId`))) where (`pt`.`name` = 'PAYEE') */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; + +-- +-- Final view structure for view `quoteView` +-- + +/*!50001 DROP VIEW IF EXISTS `quoteView`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`central_ledger`@`%` SQL SECURITY DEFINER */ +/*!50001 VIEW `quoteView` AS select `q`.`quoteId` AS `quoteId`,`q`.`transactionReferenceId` AS `transactionReferenceId`,`q`.`transactionRequestId` AS `transactionRequestId`,`q`.`note` AS `note`,`q`.`expirationDate` AS `expirationDate`,`ti`.`name` AS `transactionInitiator`,`tit`.`name` AS `transactionInitiatorType`,`ts`.`name` AS `transactionScenario`,`q`.`balanceOfPaymentsId` AS `balanceOfPaymentsId`,`tss`.`name` AS `transactionSubScenario`,`amt`.`name` AS `amountType`,`q`.`amount` AS `amount`,`q`.`currencyId` AS `currency` from (((((`quote` `q` join `transactionInitiator` `ti` on((`ti`.`transactionInitiatorId` = `q`.`transactionInitiatorId`))) join `transactionInitiatorType` `tit` on((`tit`.`transactionInitiatorTypeId` = `q`.`transactionInitiatorTypeId`))) join `transactionScenario` `ts` on((`ts`.`transactionScenarioId` = `q`.`transactionScenarioId`))) join `amountType` `amt` on((`amt`.`amountTypeId` = `q`.`amountTypeId`))) left join `transactionSubScenario` `tss` on((`tss`.`transactionSubScenarioId` = `q`.`transactionSubScenarioId`))) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2020-02-20 22:51:43 diff --git a/docs/fr/technical/technical/central-ledger/assets/database/central-ledger-schema-DBeaver.erd b/docs/fr/technical/technical/central-ledger/assets/database/central-ledger-schema-DBeaver.erd new file mode 100644 index 000000000..303fa1534 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/database/central-ledger-schema-DBeaver.erd @@ -0,0 +1,612 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/fr/technical/technical/central-ledger/assets/database/central-ledger-schema.png b/docs/fr/technical/technical/central-ledger/assets/database/central-ledger-schema.png new file mode 100644 index 000000000..62b4a1a1e Binary files /dev/null and b/docs/fr/technical/technical/central-ledger/assets/database/central-ledger-schema.png differ diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/architecture/Arch-mojaloop-central-ledger.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/architecture/Arch-mojaloop-central-ledger.svg new file mode 100644 index 000000000..d91178975 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/architecture/Arch-mojaloop-central-ledger.svg @@ -0,0 +1,3 @@ + + +
    Mojaloop Adapter
    Mojaloop Adapter
    Ledger
    Ledger
    Mojaloop
    Adapter
    [Not supported by viewer]
    C 1. Transfer
    C 1. Transfer
    request_to_prepare
    request_to_prepare
    C 1.2
    [Not supported by viewer]
    C 1.3
    [Not supported by viewer]
    prepared.notification
    prepared.notification
    C 1.4
    C 1.4
    fulfiled.notification
    fulfiled.notification
    request_to_fulfil
    request_to_fulfil
    Fulfil Transfer
    Fulfil Transfer
    C 1.8
    C 1.8
    C 1.9
    [Not supported by viewer]
    C 1.10
    [Not supported by viewer]
    C 1.11
    C 1.11
    C 1.12 Fulfil Notify
    C 1.12 Fulfil Notify
    C 1.1
    C 1.1
    C 1.5
    C 1.5
    DB
    DB
    Central Services
    [Not supported by viewer]
    positions
    positions
    Account-Lookup-Service
    [Not supported by viewer]
    Pathfinder
    Pathfinder
    FSP
    Backend

    (Does not natively speak Mojaloop API)



    [Not supported by viewer]
    Scheme-Adapter

    (Converts from Mojaloop API to backend FSP API)
    [Not supported by viewer]
    A 2. MSISDN
    based lookup
    A 2. MSISDN <br>based lookup
    DB
    DB
     Database
     Database
    FSP
    Backend
      

    (Natively speaks Mojaloop API)



    [Not supported by viewer]
    A
    A
    A 1. User Lookup
    A 1. User Lookup
    A 3. Receiver Details
    A 3. Receiver Details
    B
    B
    B 1. Quote
    B 1. Quote
    Mojaloop Hub
    [Not supported by viewer]
    Payer FSP
    [Not supported by viewer]
    Payee FSP
    [Not supported by viewer]
    Ledger
    Ledger<br>
    Ledger
    Ledger<br>
    C
    C
    kafka
    kafka
    kafka
    kafka
    kafka
    kafka
    kafka
    kafka
    kafka
    kafka
    C 1.6
    Prepare
    Transfer
    [Not supported by viewer]
    C 1.7
    C 1.7
    C 1.11
    C 1.11
    C 1.12
    C 1.12
    Fulfil Notify
    Fulfil Notify
    C 1.13
    Fulfil Notify
    [Not supported by viewer]
    B 2. Fee /
    Commission
    [Not supported by viewer]
    A 4. Get 
    receiver 
    details
    [Not supported by viewer]
    B 1. Quote
    B 1. Quote
    D 6.
    D 6.
    Settlements
    Settlements
    D 5. Update Positions
    [Not supported by viewer]
    settlement.notifications
    settlement.notifications
    Scheme Settlement Processor
    <span>Scheme Settlement Processor</span><br>
    Hub Operator
    Hub Operator
    D 1. Create
    Settlement
    [Not supported by viewer]
    D
    D
    D 2. Query
    Settlement
    Report
    (Pull)
    [Not supported by viewer]
    D 4. Send
    Acks
    (Push)
    [Not supported by viewer]
    Settlement
    Bank
    Settlement<br>Bank<br>
    D 3. Process Settlements
    [Not supported by viewer]
    Bank
    [Not supported by viewer]
    D 7. Position Notifications Change result
    D 7. Position Notifications Change result
    D 7. Settlement Notification
    D 7. Settlement Notification
    \ No newline at end of file diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/architecture/Transfers-Arch-End-to-End-v1.0-old.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/architecture/Transfers-Arch-End-to-End-v1.0-old.svg new file mode 100644 index 000000000..73c49765f --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/architecture/Transfers-Arch-End-to-End-v1.0-old.svg @@ -0,0 +1,3 @@ + + +
    1.5 Increment Position (fsp1)
    [Not supported by viewer]
    1.4 Increment
    Position (fsp1)

    [Not supported by viewer]
    PrepareHandler
    PrepareHandler
    PositionHandler
    PositionHandler
    Fulfil
    Sucess
    [Not supported by viewer]
    2.4 Fulfil
    Success
    [Not supported by viewer]
    <alt> 2.4 
    Fulfil Reject

    [Not supported by viewer]
    Fulfil
    Reject
    [Not supported by viewer]
    <alt> 2.5 Decrement
    Position (fsp1)

    [Not supported by viewer]
    <alt>1.6 Reject Notification
    (Not enough position)

    [Not supported by viewer]
    Central - Services
    <font style="font-size: 18px">Central - Services</font>
    3.0 Reject
    [Not supported by viewer]
    2.6 Fulfil Notification /
     <alt> 2.6 Reject Notification (Fulfil) /
    3.2 Reject Notification (Timeout)

    [Not supported by viewer]
    1.0 Transfer 
    Request

    [Not supported by viewer]
    3.1 Decrement
    Position (fsp1)

    [Not supported by viewer]
    1.6 Prepare Notification
    [Not supported by viewer]
    ML-Adapter
    [Not supported by viewer]
    Transfer
    API
    [Not supported by viewer]
    Notification
    Event Handler
    [Not supported by viewer]
    fsp prepare
    fsp prepare
    1.3 Prepare Consume
    [Not supported by viewer]
    notifications
    notifications
    FSP1
    (Payer)

    [Not supported by viewer]
    FSP2
    (Payee)
    [Not supported by viewer]
    1.1
    Prepare Request
    [Not supported by viewer]
    1.2 Accpeted
    (202)
    [Not supported by viewer]
    Transfer
    API
    [Not supported by viewer]
    2.0 Fulfil 
    Success / 
    Reject

    [Not supported by viewer]
    fulfils
    fulfils
    FulfilHandler
    FulfilHandler
    Success/
    Reject
    [Not supported by viewer]
    2.5 Decrement
    Position (fsp2)

    [Not supported by viewer]
    2.1 Fulfil 
    Success / Reject

    [Not supported by viewer]
    2.2 OK
    (200)
    [Not supported by viewer]
    2.3 Fulfil
    Success /
    Reject
    Consume
    [Not supported by viewer]
    OK (200)
    [Not supported by viewer]
    OK (200)
    [Not supported by viewer]
    Transfer Timeout
    Handler
    [Not supported by viewer]
    <alt> 1.4 Prepare Failure
    [Not supported by viewer]
    <alt> 2.4 Fulfil Failure
    [Not supported by viewer]
    2.7 Fulfil Notify Callback /
    <alt> 2.7 Reject Response (Fulfil reject) /
    3.1, 3.3 Reject Response (Timeout) /
    <alt> 1.7 Reject Response (Not enough position)
    <alt> 1.5 Prepare Failure 

    [Not supported by viewer]
    1.7 Prepare Notify /
    2.8 Fulfil Notify /
    <alt> 2.7 Reject Response (Fulfil reject)
    3.3 Reject Response (Timeout)
    <alt> 2.5 Fulfil Failure

    [Not supported by viewer]
    position
    position<br>
    \ No newline at end of file diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/architecture/Transfers-Arch-End-to-End-v1.0.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/architecture/Transfers-Arch-End-to-End-v1.0.svg new file mode 100644 index 000000000..02658b83d --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/architecture/Transfers-Arch-End-to-End-v1.0.svg @@ -0,0 +1,3 @@ + + +
    1.5 Increment Position (fsp1)
    1.5 Increment Position (fsp1)
    1.4 Increment
    Position (fsp1)

    1.4 Increment...
    PrepareHandler
    PrepareHandler
    PositionHandler
    PositionHandler
    Fulfil
    Sucess
    Fulfil...
    2.4 Fulfil
    Success
    2.4 Fulfil...
    <alt> 2.4 
    Fulfil Reject

    <alt> 2.4...
    Fulfil
    Reject
    Fulfil...
    <alt> 2.5 Decrement
    Position (fsp1)

    <alt> 2.5 Decrement...
    <alt>1.6 Reject Notification
    (Not enough position)

    <alt>1.6...
    Central - Services
    Central - Services
    3.0 Reject
    3.0 Reject
    2.6 Fulfil Notification /
     <alt> 2.6 Reject Notification (Fulfil) /
    3.2 Reject Notification (Timeout)

    2.6 Fulfil Notification /...
    1.0 Transfer 
    Request

    1.0 Transfer...
    3.1 Decrement
    Position (fsp1)

    3.1 Decrement...
    1.6 Prepare Notification
    1.6 Prepare Notification
    ML-Adapter
    ML-Adapter
    Transfer
    API
    Transfer...
    Notification
    Event Handler
    Notification...
    fsp prepare
    fsp prep...
    1.3 Prepare Consume
    1.3 Prepare Consume
    notifications
    notificati...
    FSP1
    (Payer)

    FSP1...
    FSP2
    (Payee)
    FSP2...
    1.1
    Prepare Request
    1.1...
    1.2 Accpeted
    (202)
    1.2 Accpeted...
    Transfer
    API
    Transfer...
    2.0 Fulfil 
    Success / 
    Reject

    2...
    fulfils
    fulfils
    FulfilHandler
    FulfilHandler
    Success/
    Reject
    Success/...
    2.5 Decrement
    Position (fsp2)

    2.5 Decrement...
    2.1 Fulfil 
    Success / Reject

    2.1 Fulfil...
    2.2 OK
    (200)
    2.2 OK...
    2.3 Fulfil
    Success /
    Reject
    Consume
    2.3 Fulfil...
    OK (200)
    OK (200)
    OK (200)
    OK (200)
    Transfer Timeout
    Handler
    Transfer Timeout...
    <alt> 1.4 Prepare Failure
    <alt> 1.4 Prepare Failure
    <alt> 2.4 Fulfil Failure
    <alt>...
    2.7 Fulfil Notify Callback /
    <alt> 2.7 Reject Response (Fulfil reject) /
    3.1, 3.3 Reject Response (Timeout) /
    <alt> 1.7 Reject Response (Not enough position)
    <alt> 1.5 Prepare Failure 

    2.7 Fulfil Notify Callback /...
    1.7 Prepare Notify /
    2.8 Commit Notify (optional) /
    <alt> 2.7 Reject Response (Fulfil reject)
    3.3 Reject Response (Timeout)
    <alt> 2.5 Fulfil Failure

    1.7 Prepare Notify /...
    position
    position
    Viewer does not support full SVG 1.1
    \ No newline at end of file diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/architecture/Transfers-Arch-End-to-End-v1.1.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/architecture/Transfers-Arch-End-to-End-v1.1.svg new file mode 100644 index 000000000..e9a1460c8 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/architecture/Transfers-Arch-End-to-End-v1.1.svg @@ -0,0 +1,3 @@ + + +
    1.5 Increment Position (fsp1)
    1.5 Increment Position (fsp1)
    1.4 Increment
    Position (fsp1)

    1.4 Increment...
    PrepareHandler
    PrepareHandler
    PositionHandler
    PositionHandler
    Fulfil
    Sucess
    Fulfil...
    2.4 Fulfil
    Success
    2.4 Fulfil...
    <alt> 2.4 
    Fulfil Reject

    <alt> 2.4...
    Fulfil
    Reject
    Fulfil...
    <alt> 2.5 Decrement
    Position (fsp1)

    <alt> 2.5 Decrement...
    <alt>1.6 Reject Notification
    (Not enough position)

    <alt>1.6...
    Central - Services
    Central - Services
    3.0 Reject
    3.0 Reject
    2.6 Fulfil Notification /
     <alt> 2.6 Reject Notification (Fulfil) /
    3.2 Reject Notification (Timeout)

    2.6 Fulfil Notification /...
    1.0 Transfer 
    Request

    1.0 Transfer...
    3.1 Decrement
    Position (fsp1)

    3.1 Decrement...
    1.6 Prepare Notification
    1.6 Prepare Notification
    ML-Adapter
    ML-Adapter
    Transfer
    API
    Transfer...
    Notification
    Event Handler
    Notification...
    fsp prepare
    fsp prep...
    1.3 Prepare Consume
    1.3 Prepare Consume
    notifications
    notificati...
    FSP1
    (Payer)

    FSP1...
    FSP2
    (Payee)
    FSP2...
    1.1
    Prepare Request
    1.1...
    1.2 Accpeted
    (202)
    1.2 Accpeted...
    Transfer
    API
    Transfer...
    2.0 Fulfil 
    Success / 
    Reject

    2...
    fulfils
    fulfils
    FulfilHandler
    FulfilHandler
    Success/
    Reject
    Success/...
    2.5 Decrement
    Position (fsp2)

    2.5 Decrement...
    2.1 Fulfil 
    Success / Reject

    2.1 Fulfil...
    2.2 OK
    (200)
    2.2 OK...
    2.3 Fulfil
    Success /
    Reject
    Consume
    2.3 Fulfil...
    OK (200)
    OK (200)
    OK (200)
    OK (200)
    Transfer Timeout
    Handler
    Transfer Timeout...
    <alt> 1.4 Prepare Failure
    <alt> 1.4 Prepare Failure
    <alt> 2.4 Fulfil Failure
    <alt>...
    2.7 Fulfil Notify Callback /
    <alt> 2.7 Reject Response (Fulfil reject) /
    3.1, 3.3 Reject Response (Timeout) /
    <alt> 1.7 Reject Response (Not enough position)
    <alt> 1.5 Prepare Failure 

    2.7 Fulfil Notify Callback /...
    1.7 Prepare Notify /
    2.8 Commit Notify (if transfer reserved) /
    <alt> 2.7 Reject Response (Fulfil reject)
    3.3 Reject Response (Timeout)
    <alt> 2.5 Fulfil Failure

    1.7 Prepare Notify /...
    position
    position
    Viewer does not support full SVG 1.1
    \ No newline at end of file diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-callback-3.1.0.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-callback-3.1.0.plantuml new file mode 100644 index 000000000..d406585bb --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-callback-3.1.0.plantuml @@ -0,0 +1,160 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Shashikant Hirugade + -------------- + ******'/ + +@startuml +' declate title +title 3.1.0 Détails de rappel (callback) du participant + +autonumber +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +entity "ML-API-ADAPTER" as MLAPI +boundary "API du service central" as CSAPI +control "Gestionnaire des participants" as PARTICIPANT_HANDLER +entity "API du service central" as CSAPI +entity "DAO participant" as PARTICIPANT_DAO +database "Stockage central" as DB +box "Service adaptateur ML API" #LightBlue +participant MLAPI +end box + +box "Services centraux" #LightYellow +participant CSAPI +participant PARTICIPANT_HANDLER +participant PARTICIPANT_DAO +participant DB +end box + +' start flow + +activate MLAPI +group Obtenir les détails de rappel (callback) + MLAPI -> CSAPI: Demande d'obtenir les détails de rappel — GET - /participants/{name}/endpoints?type={typeValue} + activate CSAPI + CSAPI -> PARTICIPANT_HANDLER: Récupérer les détails de rappel du participant + activate PARTICIPANT_HANDLER + PARTICIPANT_HANDLER ->PARTICIPANT_DAO: Récupérer le participant \nCode d'erreur : 3200 + + activate PARTICIPANT_DAO + PARTICIPANT_DAO ->DB: Récupérer le participant + activate DB + hnote over DB #lightyellow + participant + end note + DB --> PARTICIPANT_DAO: Participant récupéré + deactivate DB + PARTICIPANT_DAO -->PARTICIPANT_HANDLER: Renvoyer le participant + deactivate PARTICIPANT_DAO + PARTICIPANT_HANDLER ->PARTICIPANT_HANDLER: Valider le DFSP + alt Valider le participant (succès) + PARTICIPANT_HANDLER -> PARTICIPANT_HANDLER: vérifier si le paramètre « type » est envoyé + alt Paramètre « type » envoyé (oui) + PARTICIPANT_HANDLER ->PARTICIPANT_DAO: Récupérer les détails de rappel du participant et du type \nCode d'erreur : 3000 + activate PARTICIPANT_DAO + PARTICIPANT_DAO ->DB: Récupérer les détails de rappel du participant et du type + note right of PARTICIPANT_DAO #lightgrey + Condition : + isActive = 1 + [endpointTypeId = ] + end note + + activate DB + hnote over DB #lightyellow + participantEndpoint + end note + DB --> PARTICIPANT_DAO: Détails de rappel récupérés pour le participant et le type + deactivate DB + PARTICIPANT_DAO -->PARTICIPANT_HANDLER: Renvoyer les détails de rappel du participant et du type + deactivate PARTICIPANT_DAO + note right of PARTICIPANT_HANDLER #yellow + Message : + { + endpoints: {type: , value: } + } + end note + PARTICIPANT_HANDLER -->CSAPI: Renvoyer les détails de rappel du participant + deactivate PARTICIPANT_HANDLER + CSAPI -->MLAPI: Renvoyer les détails de rappel du participant + else Paramètre « type » envoyé (non) + activate PARTICIPANT_HANDLER + PARTICIPANT_HANDLER ->PARTICIPANT_DAO: Récupérer les détails de rappel du participant \nCode d'erreur : 3000 + activate PARTICIPANT_DAO + PARTICIPANT_DAO ->DB: Récupérer les détails de rappel du participant + note right of PARTICIPANT_DAO #lightgrey + Condition : + isActive = 1 + end note + + activate DB + hnote over DB #lightyellow + participantEndpoint + end note + DB --> PARTICIPANT_DAO: Détails de rappel récupérés pour le participant + deactivate DB + PARTICIPANT_DAO -->PARTICIPANT_HANDLER: Renvoyer les détails de rappel du participant + deactivate PARTICIPANT_DAO + note right of PARTICIPANT_HANDLER #yellow + Message : + { + endpoints: [ + {type: , value: }, + {type: , value: } + ] + } + end note + PARTICIPANT_HANDLER -->CSAPI: Renvoyer les détails de rappel du participant + ' deactivate PARTICIPANT_HANDLER + CSAPI -->MLAPI: Renvoyer les détails de rappel du participant + end + + + else Valider le participant (échec) / erreur + activate PARTICIPANT_HANDLER + note right of PARTICIPANT_HANDLER #red: Échec de validation / erreur ! + activate PARTICIPANT_HANDLER + note right of PARTICIPANT_HANDLER #yellow + Message : + { + "errorInformation": { + "errorCode": , + "errorDescription": , + } + } + end note + PARTICIPANT_HANDLER -->CSAPI: Renvoyer Code d'erreur : 3000, 3200 + deactivate PARTICIPANT_HANDLER + CSAPI -->MLAPI: Renvoyer Code d'erreur : 3000, 3200 + + end + deactivate CSAPI + deactivate MLAPI +end + +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-callback-3.1.0.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-callback-3.1.0.svg new file mode 100644 index 000000000..5784732ce --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-callback-3.1.0.svg @@ -0,0 +1,228 @@ + + 3.1.0 Détails de rappel (callback) du participant + + + 3.1.0 Détails de rappel (callback) du participant + + Service adaptateur ML API + + Services centraux + + + + + + + + + + + + + + + + + + + ML-API-ADAPTER + + + ML-API-ADAPTER + + + API du service central + + + API du service central + + + Gestionnaire des participants + + + Gestionnaire des participants + + + DAO participant + + + DAO participant + + + Stockage central + + + Stockage central + + + + + + + + + + + + + + + Obtenir les détails de rappel (callback) + + + 1 + Demande d'obtenir les détails de rappel — GET - /participants/{name}/endpoints?type={typeValue} + + + 2 + Récupérer les détails de rappel du participant + + + 3 + Récupérer le participant + Code d'erreur : + 3200 + + + 4 + Récupérer le participant + + participant + + + 5 + Participant récupéré + + + 6 + Renvoyer le participant + + + + + 7 + Valider le DFSP + + + alt + [Valider le participant (succès)] + + + + + 8 + vérifier si le paramètre « type » est envoyé + + + alt + [Paramètre « type » envoyé (oui)] + + + 9 + Récupérer les détails de rappel du participant et du type + Code d'erreur : + 3000 + + + 10 + Récupérer les détails de rappel du participant et du type + + + Condition : + isActive = 1 + [endpointTypeId = <type>] + + participantEndpoint + + + 11 + Détails de rappel récupérés pour le participant et le type + + + 12 + Renvoyer les détails de rappel du participant et du type + + + Message : + { + endpoints: {type: <type>, value: <value>} + } + + + 13 + Renvoyer les détails de rappel du participant + + + 14 + Renvoyer les détails de rappel du participant + + [Paramètre « type » envoyé (non)] + + + 15 + Récupérer les détails de rappel du participant + Code d'erreur : + 3000 + + + 16 + Récupérer les détails de rappel du participant + + + Condition : + isActive = 1 + + participantEndpoint + + + 17 + Détails de rappel récupérés pour le participant + + + 18 + Renvoyer les détails de rappel du participant + + + Message : + { + endpoints: [ + {type: <type>, value: <value>}, + {type: <type>, value: <value>} + ] + } + + + 19 + Renvoyer les détails de rappel du participant + + + 20 + Renvoyer les détails de rappel du participant + + [Valider le participant (échec) / erreur] + + + Échec de validation / erreur ! + + + Message : + { + "errorInformation": { + "errorCode": <errorCode>, + "errorDescription": <ErrorMessage>, + } + } + + + 21 + Renvoyer + Code d'erreur : + 3000, 3200 + + + 22 + Renvoyer + Code d'erreur : + 3000, 3200 + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-callback-add-3.1.0.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-callback-add-3.1.0.plantuml new file mode 100644 index 000000000..74a9796b6 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-callback-add-3.1.0.plantuml @@ -0,0 +1,149 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Shashikant Hirugade + -------------- + ******'/ + + +@startuml +' declate title +title 3.1.0 Ajout des détails de rappel du participant + +autonumber +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +actor "Opérateur HUB" as OPERATOR +boundary "API du service central" as CSAPI +control "Gestionnaire des participants" as PARTICIPANT_HANDLER +entity "API du service central" as CSAPI +entity "DAO participant" as PARTICIPANT_DAO +database "Stockage central" as DB + +box "Services centraux" #LightYellow +participant CSAPI +participant PARTICIPANT_HANDLER +participant PARTICIPANT_DAO +participant DB +end box + +' start flow + +activate OPERATOR +group Ajouter les détails de rappel (callback) + OPERATOR -> CSAPI: Demande d'ajouter les détails de rappel — POST - /paticipants/{name}/endpoints + note right of OPERATOR #yellow + Message : + { + payload: { + endpoint: { + type: , + value: + } + } + } + end note + + activate CSAPI + CSAPI -> PARTICIPANT_HANDLER: Ajouter les détails de rappel du participant + activate PARTICIPANT_HANDLER + PARTICIPANT_HANDLER ->PARTICIPANT_DAO: Récupérer le participant \nCode d'erreur : 3200 + + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Récupérer le participant + activate DB + hnote over DB #lightyellow + participant + end note + DB --> PARTICIPANT_DAO: Participant récupéré + deactivate DB + PARTICIPANT_DAO --> PARTICIPANT_HANDLER: Renvoyer le participant + deactivate PARTICIPANT_DAO + PARTICIPANT_HANDLER ->PARTICIPANT_HANDLER: Valider le DFSP + alt Valider le participant (succès) + PARTICIPANT_HANDLER ->PARTICIPANT_DAO: Ajouter les détails de rappel du participant \nCode d'erreur : 2003/Msg : Service unavailable \nCode d'erreur : 2001/Msg : Internal Server Error + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Persister le point de terminaison participant + activate DB + hnote over DB #lightyellow + participantEndpoint + end note + deactivate DB + note right of PARTICIPANT_DAO #lightgrey + Si (endpoint existe && isActive = 1) + oldEndpoint.isActive = 0 + insérer endpoint + Sinon + insérer endpoint + Fin + + end note + PARTICIPANT_DAO --> PARTICIPANT_HANDLER: Renvoyer le statut + deactivate PARTICIPANT_DAO + PARTICIPANT_HANDLER -> PARTICIPANT_HANDLER: Valider le statut + alt Valider le statut (succès) + PARTICIPANT_HANDLER -->CSAPI: Renvoyer le code statut 201 + deactivate PARTICIPANT_HANDLER + CSAPI -->OPERATOR: Renvoyer le code statut 201 + else Valider le statut (échec) / erreur + note right of PARTICIPANT_HANDLER #red: Erreur ! + activate PARTICIPANT_HANDLER + note right of PARTICIPANT_HANDLER #yellow + Message : + { + "errorInformation": { + "errorCode": , + "errorDescription": , + } + } + end note + PARTICIPANT_HANDLER -->CSAPI: Renvoyer Code d'erreur + ' deactivate PARTICIPANT_HANDLER + CSAPI -->OPERATOR: Renvoyer Code d'erreur + + end + + else Valider le participant (échec) + note right of PARTICIPANT_HANDLER #red: Échec de validation ! + activate PARTICIPANT_HANDLER + note right of PARTICIPANT_HANDLER #yellow + Message : + { + "errorInformation": { + "errorCode": 3200, + "errorDescription": "Identifiant FSP introuvable", + } + } + end note + PARTICIPANT_HANDLER -->CSAPI: Renvoyer Code d'erreur : 3200 + deactivate PARTICIPANT_HANDLER + CSAPI -->OPERATOR: Renvoyer Code d'erreur : 3200 + + end + deactivate CSAPI + deactivate OPERATOR +end +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-callback-add-3.1.0.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-callback-add-3.1.0.svg new file mode 100644 index 000000000..4ee5af8dd --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-callback-add-3.1.0.svg @@ -0,0 +1,215 @@ + + 3.1.0 Ajout des détails de rappel du participant + + + 3.1.0 Ajout des détails de rappel du participant + + Services centraux + + + + + + + + + + + + + + + + + Opérateur HUB + + + Opérateur HUB + + + API du service central + + + API du service central + + + Gestionnaire des participants + + + Gestionnaire des participants + + + DAO participant + + + DAO participant + + + Stockage central + + + Stockage central + + + + + + + + + + + + + Ajouter les détails de rappel (callback) + + + 1 + Demande d'ajouter les détails de rappel — POST - /paticipants/{name}/endpoints + + + Message : + { + payload: { + endpoint: { + type: <typeValue>, + value: <endpointValue> + } + } + } + + + 2 + Ajouter les détails de rappel du participant + + + 3 + Récupérer le participant + Code d'erreur : + 3200 + + + 4 + Récupérer le participant + + participant + + + 5 + Participant récupéré + + + 6 + Renvoyer le participant + + + + + 7 + Valider le DFSP + + + alt + [Valider le participant (succès)] + + + 8 + Ajouter les détails de rappel du participant + Code d'erreur : + 2003/ + Msg : + Service unavailable +   + Code d'erreur : + 2001/ + Msg : + Internal Server Error + + + 9 + Persister le point de terminaison participant + + participantEndpoint + + + Si (endpoint existe && isActive = 1) + oldEndpoint.isActive = 0 + insérer endpoint + Sinon + insérer endpoint + Fin +      + + + 10 + Renvoyer le statut + + + + + 11 + Valider le statut + + + alt + [Valider le statut (succès)] + + + 12 + Renvoyer le code statut 201 + + + 13 + Renvoyer le code statut 201 + + [Valider le statut (échec) / erreur] + + + Erreur ! + + + Message : + { + "errorInformation": { + "errorCode": <Error Code>, + "errorDescription": <Msg>, + } + } + + + 14 + Renvoyer + Code d'erreur + + + 15 + Renvoyer + Code d'erreur + + [Valider le participant (échec)] + + + Échec de validation ! + + + Message : + { + "errorInformation": { + "errorCode": 3200, + "errorDescription": "Identifiant FSP introuvable", + } + } + + + 16 + Renvoyer + Code d'erreur : + 3200 + + + 17 + Renvoyer + Code d'erreur : + 3200 + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.0-v1.1.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.0-v1.1.plantuml new file mode 100644 index 000000000..a24c0b1ce --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.0-v1.1.plantuml @@ -0,0 +1,207 @@ +/' + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Valentin Genev + -------------- + '/ + + +@startuml +' declate title +title 2.1.0. DFSP2 envoie une demande d'exécution réussie du transfert v1.1 + +autonumber +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +actor "DFSP1\nPayeur" as DFSP1 +actor "DFSP2\nBénéficiaire" as DFSP2 +boundary "Adaptateur ML API" as MLAPI +control "Gestionnaire d'événements de notification ML API" as NOTIFY_HANDLER +boundary "API du service central" as CSAPI +collections "topic-fulfil" as TOPIC_FULFIL +control "Gestionnaire d'événements d'exécution" as FULF_HANDLER +collections "topic-\nsettlement-model" as TOPIC_SETMODEL +control "Gestionnaire de modèle\nde règlement" as SETMODEL_HANDLER +collections "topic-\ntransfer-position" as TOPIC_TRANSFER_POSITION +control "Gestionnaire de position" as POS_HANDLER +collections "topic-\nnotification" as TOPIC_NOTIFICATIONS + +box "Fournisseurs de services financiers" #lightGray + participant DFSP1 + participant DFSP2 +end box + +box "Service adaptateur ML API" #LightBlue + participant MLAPI + participant NOTIFY_HANDLER +end box + +box "Services centraux" #LightYellow + participant CSAPI + participant TOPIC_FULFIL + participant FULF_HANDLER + participant TOPIC_SETMODEL + participant SETMODEL_HANDLER + participant TOPIC_TRANSFER_POSITION + participant POS_HANDLER + participant TOPIC_NOTIFICATIONS +end box + +' start flow +activate NOTIFY_HANDLER +activate FULF_HANDLER +activate SETMODEL_HANDLER +activate POS_HANDLER +group DFSP2 envoie une demande de notification après validation du transfert dans le Switch + DFSP2 <-> DFSP2: Récupérer la chaîne d'exécution générée lors du\nprocessus de devis ou la régénérer avec\n**Local secret** et **ILP Packet** comme entrées + alt Renvoyer la demande de notification de réservation + note right of DFSP2 #yellow + Headers - transferHeaders: { + Content-Length: , + Content-Type: , + Date: , + X-Forwarded-For: , + FSPIOP-Source: , + FSPIOP-Destination: , + FSPIOP-Encryption: , + FSPIOP-Signature: , + FSPIOP-URI: , + FSPIOP-HTTP-Method: + } + + Payload - transferMessage : + { + "fulfilment": , + "transferState": "RESERVED" + "extensionList": { + "extension": [ + { + "key": , + "value": + } + ] + } + } + end note + else Renvoyer la demande de validation + + note right of DFSP2 #yellow + Headers - transferHeaders: { + Content-Length: , + Content-Type: , + Date: , + X-Forwarded-For: , + FSPIOP-Source: , + FSPIOP-Destination: , + FSPIOP-Encryption: , + FSPIOP-Signature: , + FSPIOP-URI: , + FSPIOP-HTTP-Method: + } + + Payload - transferMessage : + { + "fulfilment": , + "completedTimestamp": , + "transferState": "COMMITTED" + "extensionList": { + "extension": [ + { + "key": , + "value": + } + ] + } + } + end note + end + DFSP2 ->> MLAPI: PUT - /transfers/ + activate MLAPI + MLAPI -> MLAPI: Valider le jeton entrant et l'initiateur correspondant au bénéficiaire\nCodes d'erreur : 3000-3002, 3100-3107 + note right of MLAPI #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + type: fulfil, + action: reserve || commit, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + MLAPI -> TOPIC_FULFIL: Acheminer et publier l'événement d'exécution pour le bénéficiaire\nCode d'erreur : 2003 + activate TOPIC_FULFIL + TOPIC_FULFIL <-> TOPIC_FULFIL: S'assurer que l'événement est répliqué tel que configuré (ACKS=all)\nCode d'erreur : 2003 + TOPIC_FULFIL --> MLAPI: Répondre que les accusés de réplication ont été reçus + deactivate TOPIC_FULFIL + MLAPI -->> DFSP2: Répondre HTTP — 200 (OK) + deactivate MLAPI + TOPIC_FULFIL <- FULF_HANDLER: Consommer le message + ref over TOPIC_FULFIL, TOPIC_TRANSFER_POSITION: Consommation par le gestionnaire d'exécution (succès) {[[https://github.com/mojaloop/documentation/tree/master/mojaloop-technical-overview/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.1-v1.1.svg 2.1.1-v1.1]]} \n + FULF_HANDLER -> TOPIC_SETMODEL: Produire le message + FULF_HANDLER -> TOPIC_TRANSFER_POSITION: Produire le message + ||| + TOPIC_SETMODEL <- SETMODEL_HANDLER: Consommer le message + ref over TOPIC_SETMODEL, SETMODEL_HANDLER: Consommation par le gestionnaire de modèle de règlement (succès)\n + ||| + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consommer le message + ref over TOPIC_TRANSFER_POSITION, TOPIC_NOTIFICATIONS: Consommation par le gestionnaire de position (succès)\n + POS_HANDLER -> TOPIC_NOTIFICATIONS: Produire le message + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consommer le message + opt action == 'commit' + ||| + ref over DFSP1, TOPIC_NOTIFICATIONS: Envoyer une notification au participant (payeur)\n + NOTIFY_HANDLER -> DFSP1: Envoyer la notification de rappel (callback) + end + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consommer le message + opt action == 'reserve' + ||| + ref over DFSP2, TOPIC_NOTIFICATIONS: Envoyer une notification au participant (bénéficiaire)\n + NOTIFY_HANDLER -> DFSP2: Envoyer la notification de rappel (callback) + end + ||| +end +deactivate POS_HANDLER +deactivate FULF_HANDLER +deactivate NOTIFY_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.0-v1.1.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.0-v1.1.svg new file mode 100644 index 000000000..c6e4ec61f --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.0-v1.1.svg @@ -0,0 +1,340 @@ + + 2.1.0. DFSP2 envoie une demande d'exécution réussie du transfert v1.1 + + + 2.1.0. DFSP2 envoie une demande d'exécution réussie du transfert v1.1 + + Fournisseurs de services financiers + + Service adaptateur ML API + + Services centraux + + + + + + + + + + + + + + + + + + + + + + + DFSP1 + Payeur + + + DFSP1 + Payeur + + + DFSP2 + Bénéficiaire + + + DFSP2 + Bénéficiaire + + + Adaptateur ML API + + + Adaptateur ML API + + + Gestionnaire d'événements de notification ML API + + + Gestionnaire d'événements de notification ML API + + + API du service central + + + API du service central + + + + + topic-fulfil + + + topic-fulfil + Gestionnaire d'événements d'exécution + + + Gestionnaire d'événements d'exécution + + + + + topic- + settlement-model + + + topic- + settlement-model + Gestionnaire de modèle + de règlement + + + Gestionnaire de modèle + de règlement + + + + + topic- + transfer-position + + + topic- + transfer-position + Gestionnaire de position + + + Gestionnaire de position + + + + + topic- + notification + + + topic- + notification + + + + + + + + + DFSP2 envoie une demande de notification après validation du transfert dans le Switch + + + + + + 1 + Récupérer la chaîne d'exécution générée lors du + processus de devis ou la régénérer avec + Local secret + et + ILP Packet + comme entrées + + + alt + [Renvoyer la demande de notification de réservation] + + + Headers - transferHeaders: { + Content-Length: <Content-Length>, + Content-Type: <Content-Type>, + Date: <Date>, + X-Forwarded-For: <X-Forwarded-For>, + FSPIOP-Source: <FSPIOP-Source>, + FSPIOP-Destination: <FSPIOP-Destination>, + FSPIOP-Encryption: <FSPIOP-Encryption>, + FSPIOP-Signature: <FSPIOP-Signature>, + FSPIOP-URI: <FSPIOP-URI>, + FSPIOP-HTTP-Method: <FSPIOP-HTTP-Method> + } +   + Payload - transferMessage : + { + "fulfilment": <IlpFulfilment>, + "transferState": "RESERVED" + "extensionList": { + "extension": [ + { + "key": <string>, + "value": <string> + } + ] + } + } + + [Renvoyer la demande de validation] + + + Headers - transferHeaders: { + Content-Length: <Content-Length>, + Content-Type: <Content-Type>, + Date: <Date>, + X-Forwarded-For: <X-Forwarded-For>, + FSPIOP-Source: <FSPIOP-Source>, + FSPIOP-Destination: <FSPIOP-Destination>, + FSPIOP-Encryption: <FSPIOP-Encryption>, + FSPIOP-Signature: <FSPIOP-Signature>, + FSPIOP-URI: <FSPIOP-URI>, + FSPIOP-HTTP-Method: <FSPIOP-HTTP-Method> + } +   + Payload - transferMessage : + { + "fulfilment": <IlpFulfilment>, + "completedTimestamp": <DateTime>, + "transferState": "COMMITTED" + "extensionList": { + "extension": [ + { + "key": <string>, + "value": <string> + } + ] + } + } + + + + 2 + PUT - /transfers/<ID> + + + + + 3 + Valider le jeton entrant et l'initiateur correspondant au bénéficiaire + Codes d'erreur : + 3000-3002, 3100-3107 + + + Message : + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + type: fulfil, + action: reserve || commit, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 4 + Acheminer et publier l'événement d'exécution pour le bénéficiaire + Code d'erreur : + 2003 + + + + + + 5 + S'assurer que l'événement est répliqué tel que configuré (ACKS=all) + Code d'erreur : + 2003 + + + 6 + Répondre que les accusés de réplication ont été reçus + + + + 7 + Répondre HTTP — 200 (OK) + + + 8 + Consommer le message + + + ref + Consommation par le gestionnaire d'exécution (succès) { + 2.1.1-v1.1 + } +   + + + 9 + Produire le message + + + 10 + Produire le message + + + 11 + Consommer le message + + + ref + Consommation par le gestionnaire de modèle de règlement (succès) +   + + + 12 + Consommer le message + + + ref + Consommation par le gestionnaire de position (succès) +   + + + 13 + Produire le message + + + 14 + Consommer le message + + + opt + [action == 'commit'] + + + ref + Envoyer une notification au participant (payeur) +   + + + 15 + Envoyer la notification de rappel (callback) + + + 16 + Consommer le message + + + opt + [action == 'reserve'] + + + ref + Envoyer une notification au participant (bénéficiaire) +   + + + 17 + Envoyer la notification de rappel (callback) + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.0.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.0.plantuml new file mode 100644 index 000000000..d54d1e58f --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.0.plantuml @@ -0,0 +1,174 @@ +/' + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + -------------- + '/ + + +@startuml +' declate title +title 2.1.0. DFSP2 envoie une demande d'exécution réussie du transfert + +autonumber +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +actor "DFSP1\nPayeur" as DFSP1 +actor "DFSP2\nBénéficiaire" as DFSP2 +boundary "Adaptateur ML API" as MLAPI +control "Gestionnaire d'événements de notification ML API" as NOTIFY_HANDLER +boundary "API du service central" as CSAPI +collections "topic-fulfil" as TOPIC_FULFIL +control "Gestionnaire d'événements d'exécution" as FULF_HANDLER +collections "topic-\nsettlement-model" as TOPIC_SETMODEL +control "Gestionnaire de modèle\nde règlement" as SETMODEL_HANDLER +collections "topic-\ntransfer-position" as TOPIC_TRANSFER_POSITION +control "Gestionnaire de position" as POS_HANDLER +collections "topic-\nnotification" as TOPIC_NOTIFICATIONS + +box "Fournisseurs de services financiers" #lightGray + participant DFSP1 + participant DFSP2 +end box + +box "Service adaptateur ML API" #LightBlue + participant MLAPI + participant NOTIFY_HANDLER +end box + +box "Services centraux" #LightYellow + participant CSAPI + participant TOPIC_FULFIL + participant FULF_HANDLER + participant TOPIC_SETMODEL + participant SETMODEL_HANDLER + participant TOPIC_TRANSFER_POSITION + participant POS_HANDLER + participant TOPIC_NOTIFICATIONS +end box + +' start flow +activate NOTIFY_HANDLER +activate FULF_HANDLER +activate SETMODEL_HANDLER +activate POS_HANDLER +group DFSP2 envoie une demande d'exécution réussie du transfert + DFSP2 <-> DFSP2: Récupérer la chaîne d'exécution générée lors du\nprocessus de devis ou la régénérer avec\n**Local secret** et **ILP Packet** comme entrées + note right of DFSP2 #yellow + Headers - transferHeaders: { + Content-Length: , + Content-Type: , + Date: , + X-Forwarded-For: , + FSPIOP-Source: , + FSPIOP-Destination: , + FSPIOP-Encryption: , + FSPIOP-Signature: , + FSPIOP-URI: , + FSPIOP-HTTP-Method: + } + + Payload - transferMessage : + { + "fulfilment": , + "completedTimestamp": , + "transferState": "COMMITTED", + "extensionList": { + "extension": [ + { + "key": , + "value": + } + ] + } + } + end note + DFSP2 ->> MLAPI: PUT - /transfers/ + activate MLAPI + MLAPI -> MLAPI: Valider le jeton entrant et l'initiateur correspondant au bénéficiaire\nCodes d'erreur : 3000-3002, 3100-3107 + note right of MLAPI #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + type: fulfil, + action: commit, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + MLAPI -> TOPIC_FULFIL: Acheminer et publier l'événement d'exécution pour le bénéficiaire\nCode d'erreur : 2003 + activate TOPIC_FULFIL + TOPIC_FULFIL <-> TOPIC_FULFIL: S'assurer que l'événement est répliqué tel que configuré (ACKS=all)\nCode d'erreur : 2003 + TOPIC_FULFIL --> MLAPI: Répondre que les accusés de réplication ont été reçus + deactivate TOPIC_FULFIL + MLAPI -->> DFSP2: Répondre HTTP — 200 (OK) + deactivate MLAPI + TOPIC_FULFIL <- FULF_HANDLER: Consommer le message + ref over TOPIC_FULFIL, TOPIC_TRANSFER_POSITION: Consommation par le gestionnaire d'exécution (succès) {[[https://github.com/mojaloop/documentation/tree/master/mojaloop-technical-overview/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.1.svg 2.1.1]]} \n + FULF_HANDLER -> TOPIC_SETMODEL: Produire le message + FULF_HANDLER -> TOPIC_TRANSFER_POSITION: Produire le message + ||| + TOPIC_SETMODEL <- SETMODEL_HANDLER: Consommer le message + ref over TOPIC_SETMODEL, SETMODEL_HANDLER: Consommation par le gestionnaire de modèle de règlement (succès)\n + ||| + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consommer le message + ref over TOPIC_TRANSFER_POSITION, TOPIC_NOTIFICATIONS: Consommation par le gestionnaire de position (succès)\n + POS_HANDLER -> TOPIC_NOTIFICATIONS: Produire le message + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consommer le message + opt action == 'commit' + ||| + ref over DFSP1, TOPIC_NOTIFICATIONS: Envoyer une notification au participant (payeur)\n + NOTIFY_HANDLER -> DFSP1: Envoyer la notification de rappel (callback) + end + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consommer le message + opt action == 'commit' + ||| + ref over DFSP2, TOPIC_NOTIFICATIONS: Envoyer une notification au participant (bénéficiaire)\n + NOTIFY_HANDLER -> DFSP2: Envoyer la notification de rappel (callback) + end + ||| +end +deactivate POS_HANDLER +deactivate FULF_HANDLER +deactivate NOTIFY_HANDLER +@enduml \ No newline at end of file diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.0.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.0.svg new file mode 100644 index 000000000..6b011bbe5 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.0.svg @@ -0,0 +1,305 @@ + + 2.1.0. DFSP2 envoie une demande d'exécution réussie du transfert + + + 2.1.0. DFSP2 envoie une demande d'exécution réussie du transfert + + Fournisseurs de services financiers + + Service adaptateur ML API + + Services centraux + + + + + + + + + + + + + + + + + + + + + + DFSP1 + Payeur + + + DFSP1 + Payeur + + + DFSP2 + Bénéficiaire + + + DFSP2 + Bénéficiaire + + + Adaptateur ML API + + + Adaptateur ML API + + + Gestionnaire d'événements de notification ML API + + + Gestionnaire d'événements de notification ML API + + + API du service central + + + API du service central + + + + + topic-fulfil + + + topic-fulfil + Gestionnaire d'événements d'exécution + + + Gestionnaire d'événements d'exécution + + + + + topic- + settlement-model + + + topic- + settlement-model + Gestionnaire de modèle + de règlement + + + Gestionnaire de modèle + de règlement + + + + + topic- + transfer-position + + + topic- + transfer-position + Gestionnaire de position + + + Gestionnaire de position + + + + + topic- + notification + + + topic- + notification + + + + + + + + + DFSP2 envoie une demande d'exécution réussie du transfert + + + + + + 1 + Récupérer la chaîne d'exécution générée lors du + processus de devis ou la régénérer avec + Local secret + et + ILP Packet + comme entrées + + + Headers - transferHeaders: { + Content-Length: <Content-Length>, + Content-Type: <Content-Type>, + Date: <Date>, + X-Forwarded-For: <X-Forwarded-For>, + FSPIOP-Source: <FSPIOP-Source>, + FSPIOP-Destination: <FSPIOP-Destination>, + FSPIOP-Encryption: <FSPIOP-Encryption>, + FSPIOP-Signature: <FSPIOP-Signature>, + FSPIOP-URI: <FSPIOP-URI>, + FSPIOP-HTTP-Method: <FSPIOP-HTTP-Method> + } +   + Payload - transferMessage : + { + "fulfilment": <IlpFulfilment>, + "completedTimestamp": <DateTime>, + "transferState": "COMMITTED", + "extensionList": { + "extension": [ + { + "key": <string>, + "value": <string> + } + ] + } + } + + + + 2 + PUT - /transfers/<ID> + + + + + 3 + Valider le jeton entrant et l'initiateur correspondant au bénéficiaire + Codes d'erreur : + 3000-3002, 3100-3107 + + + Message : + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + type: fulfil, + action: commit, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 4 + Acheminer et publier l'événement d'exécution pour le bénéficiaire + Code d'erreur : + 2003 + + + + + + 5 + S'assurer que l'événement est répliqué tel que configuré (ACKS=all) + Code d'erreur : + 2003 + + + 6 + Répondre que les accusés de réplication ont été reçus + + + + 7 + Répondre HTTP — 200 (OK) + + + 8 + Consommer le message + + + ref + Consommation par le gestionnaire d'exécution (succès) { + 2.1.1 + } +   + + + 9 + Produire le message + + + 10 + Produire le message + + + 11 + Consommer le message + + + ref + Consommation par le gestionnaire de modèle de règlement (succès) +   + + + 12 + Consommer le message + + + ref + Consommation par le gestionnaire de position (succès) +   + + + 13 + Produire le message + + + 14 + Consommer le message + + + opt + [action == 'commit'] + + + ref + Envoyer une notification au participant (payeur) +   + + + 15 + Envoyer la notification de rappel (callback) + + + 16 + Consommer le message + + + opt + [action == 'commit'] + + + ref + Envoyer une notification au participant (bénéficiaire) +   + + + 17 + Envoyer la notification de rappel (callback) + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.1-v1.1.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.1-v1.1.plantuml new file mode 100644 index 000000000..fb43d387c --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.1-v1.1.plantuml @@ -0,0 +1,273 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Rajiv Mothilal + * Georgi Georgiev + * Valentin Genev + -------------- + ******'/ + +@startuml +' declate title +title 2.1.1. Consommation par le gestionnaire d'exécution (succès) v1.1 +autonumber +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store +' declare actors +collections "topic-fulfil" as TOPIC_FULFIL +control "Gestionnaire d'événements\nd'exécution" as FULF_HANDLER +collections "topic-event" as TOPIC_EVENT +collections "topic-\ntransfer-position" as TOPIC_TRANSFER_POSITION +collections "topic-\nsettlement-model" as TOPIC_SETMODEL +collections "topic-\nnotification" as TOPIC_NOTIFICATIONS + +entity "DAO de position" as POS_DAO +database "Stockage central" as DB +box "Service central" #LightYellow + participant TOPIC_FULFIL + participant FULF_HANDLER + participant TOPIC_TRANSFER_POSITION + participant TOPIC_EVENT + participant TOPIC_SETMODEL + participant TOPIC_NOTIFICATIONS + participant POS_DAO + participant DB +end box +' start flow +activate FULF_HANDLER +group Consommation par le gestionnaire d'exécution (succès) + alt Consommer un message unique + TOPIC_FULFIL <- FULF_HANDLER: Consommer le message d'événement d'exécution pour le payeur + activate TOPIC_FULFIL + deactivate TOPIC_FULFIL + break + group Valider l'événement + FULF_HANDLER <-> FULF_HANDLER: Valider l'événement — règle : type == 'fulfil' && action IN ['commit', 'reserve']\nCodes d'erreur : 2001 + end + end + group Persister les informations d'événement + ||| + FULF_HANDLER -> TOPIC_EVENT: Publier les informations d'événement + ref over FULF_HANDLER, TOPIC_EVENT: Consommation du gestionnaire d'événements\n + ||| + end + + group Valider le contrôle de doublon + ||| + FULF_HANDLER -> DB: Demande de contrôle de doublon + ref over FULF_HANDLER, DB: Contrôle de doublon de requête\n + DB --> FULF_HANDLER: Renvoyer { hasDuplicateId: Boolean, hasDuplicateHash: Boolean } + end + + alt hasDuplicateId == TRUE && hasDuplicateHash == TRUE + break + FULF_HANDLER -> FULF_HANDLER: stateRecord = await getTransferState(transferId) + alt endStateList.includes(stateRecord.transferStateId) + ||| + ref over FULF_HANDLER, TOPIC_NOTIFICATIONS: Rappel (callback) getTransfer\n + FULF_HANDLER -> TOPIC_NOTIFICATIONS: Produire le message + else + note right of FULF_HANDLER #lightgrey + Ignorer — renvoi en cours + end note + end + end + else hasDuplicateId == TRUE && hasDuplicateHash == FALSE + note right of FULF_HANDLER #lightgrey + Validation préparation transfert (échec) — requête modifiée + end note + else hasDuplicateId == FALSE + group Valider et persister l'exécution du transfert + FULF_HANDLER -> POS_DAO: Demander les informations pour les contrôles de validation\nCode d'erreur : 2003 + activate POS_DAO + POS_DAO -> DB: Récupérer depuis la base de données + activate DB + hnote over DB #lightyellow + transfer + end note + DB --> POS_DAO + deactivate DB + FULF_HANDLER <-- POS_DAO: Renvoyer le transfert + deactivate POS_DAO + FULF_HANDLER ->FULF_HANDLER: Valider que Transfer.ilpCondition = SHA-256 (content.payload.fulfilment)\nCode d'erreur : 2001 + FULF_HANDLER -> FULF_HANDLER: Valider expirationDate\nCode d'erreur : 3303 + + opt Validation de Transfer.ilpCondition réussie + group Demander la fenêtre de règlement actuelle + FULF_HANDLER -> POS_DAO: Demande de récupérer la fenêtre de règlement actuelle/la plus récente\nCode d'erreur : 2003 + activate POS_DAO + POS_DAO -> DB: Récupérer settlementWindowId + activate DB + hnote over DB #lightyellow + settlementWindow + end note + DB --> POS_DAO + deactivate DB + FULF_HANDLER <-- POS_DAO: Renvoyer settlementWindowId à ajouter lors de l'insertion transferFulfilment\n**TODO**: Lors de la conception du règlement, s'assurer que les transferts en état 'RECEIVED-FULFIL'\nsont mis à jour vers la prochaine fenêtre de règlement + deactivate POS_DAO + end + end + + group Persister l'exécution + FULF_HANDLER -> POS_DAO: Persister l'exécution avec le résultat du contrôle ci-dessus (transferFulfilment.isValid)\nCode d'erreur : 2003 + activate POS_DAO + POS_DAO -> DB: Persister en base de données + activate DB + deactivate DB + hnote over DB #lightyellow + transferFulfilment + transferExtension + end note + FULF_HANDLER <-- POS_DAO: Renvoyer le succès + deactivate POS_DAO + end + + alt Validation de Transfer.ilpCondition réussie + group Persister l'état du transfert (transferState='RECEIVED-FULFIL') + FULF_HANDLER -> POS_DAO: Demande de persister le transfert state\nCode d'erreur : 2003 + activate POS_DAO + POS_DAO -> DB: Persister l'état du transfert + activate DB + hnote over DB #lightyellow + transferStateChange + end note + deactivate DB + POS_DAO --> FULF_HANDLER: Renvoyer le succès + deactivate POS_DAO + end + + note right of FULF_HANDLER #yellow + Message : + { + id: , + from: switch, + to: switch, + type: application/json + content: { + payload: { + transferId: {id} + } + }, + metadata: { + event: { + id: , + responseTo: , + type: setmodel, + action: commit, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_SETMODEL: Acheminer et publier l'événement de modèle de règlement + activate TOPIC_SETMODEL + deactivate TOPIC_SETMODEL + + note right of FULF_HANDLER #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: position, + action: commit || reserve, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_TRANSFER_POSITION: Acheminer et publier l'événement de position pour le bénéficiaire + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + else Validation d'exécution du transfert infructueuse + group Persister l'état du transfert (transferState='ABORTED') + FULF_HANDLER -> POS_DAO: Demande de persister le transfert state\nCode d'erreur : 2003 + activate POS_DAO + POS_DAO -> DB: Persister l'état du transfert + activate DB + hnote over DB #lightyellow + transferStateChange + end note + deactivate DB + POS_DAO --> FULF_HANDLER: Renvoyer le succès + deactivate POS_DAO + end + + note right of FULF_HANDLER #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: position, + action: abort, + createdAt: , + state: { + status: "error", + code: 1 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_TRANSFER_POSITION: Acheminer et publier l'événement de position pour le payeur + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + end + end + end + else Consommer des messages groupés + note left of FULF_HANDLER #lightblue + À livrer dans une future itération + end note + end +end +deactivate FULF_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.1-v1.1.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.1-v1.1.svg new file mode 100644 index 000000000..76be01bf9 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.1-v1.1.svg @@ -0,0 +1,439 @@ + + 2.1.1. Consommation par le gestionnaire d'exécution (succès) v1.1 + + + 2.1.1. Consommation par le gestionnaire d'exécution (succès) v1.1 + + Service central + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + topic-fulfil + + + topic-fulfil + Gestionnaire d'événements + d'exécution + + + Gestionnaire d'événements + d'exécution + + + + + topic- + transfer-position + + + topic- + transfer-position + + + topic-event + + + topic-event + + + topic- + settlement-model + + + topic- + settlement-model + + + topic- + notification + + + topic- + notification + DAO de position + + + DAO de position + + + Stockage central + + + Stockage central + + + + + + + + + + + + + + + + + + + + Consommation par le gestionnaire d'exécution (succès) + + + alt + [Consommer un message unique] + + + 1 + Consommer le message d'événement d'exécution pour le payeur + + + break + + + Valider l'événement + + + + + + 2 + Valider l'événement — règle : type == 'fulfil' && action IN ['commit', 'reserve'] + Codes d'erreur : + 2001 + + + Persister les informations d'événement + + + 3 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements +   + + + Valider le contrôle de doublon + + + 4 + Demande de contrôle de doublon + + + ref + Contrôle de doublon de requête +   + + + 5 + Renvoyer { hasDuplicateId: Boolean, hasDuplicateHash: Boolean } + + + alt + [hasDuplicateId == TRUE && hasDuplicateHash == TRUE] + + + break + + + + + 6 + stateRecord = await getTransferState(transferId) + + + alt + [endStateList.includes(stateRecord.transferStateId)] + + + ref + Rappel (callback) getTransfer +   + + + 7 + Produire le message + + + + Ignorer — renvoi en cours + + [hasDuplicateId == TRUE && hasDuplicateHash == FALSE] + + + Validation préparation transfert (échec) — requête modifiée + + [hasDuplicateId == FALSE] + + + Valider et persister l'exécution du transfert + + + 8 + Demander les informations pour les contrôles de validation + Code d'erreur : + 2003 + + + 9 + Récupérer depuis la base de données + + transfer + + + 10 +   + + + 11 + Renvoyer le transfert + + + + + 12 + Valider que Transfer.ilpCondition = SHA-256 (content.payload.fulfilment) + Code d'erreur : + 2001 + + + + + 13 + Valider expirationDate + Code d'erreur : + 3303 + + + opt + [Validation de Transfer.ilpCondition réussie] + + + Demander la fenêtre de règlement actuelle + + + 14 + Demande de récupérer la fenêtre de règlement actuelle/la plus récente + Code d'erreur : + 2003 + + + 15 + Récupérer settlementWindowId + + settlementWindow + + + 16 +   + + + 17 + Renvoyer settlementWindowId à ajouter lors de l'insertion transferFulfilment + TODO + : Lors de la conception du règlement, s'assurer que les transferts en état 'RECEIVED-FULFIL' + sont mis à jour vers la prochaine fenêtre de règlement + + + Persister l'exécution + + + 18 + Persister l'exécution avec le résultat du contrôle ci-dessus (transferFulfilment.isValid) + Code d'erreur : + 2003 + + + 19 + Persister en base de données + + transferFulfilment + transferExtension + + + 20 + Renvoyer le succès + + + alt + [Validation de Transfer.ilpCondition réussie] + + + Persister l'état du transfert (transferState='RECEIVED-FULFIL') + + + 21 + Demande de persister le transfert state + Code d'erreur : + 2003 + + + 22 + Persister l'état du transfert + + transferStateChange + + + 23 + Renvoyer le succès + + + Message : + { + id: <id>, + from: switch, + to: switch, + type: application/json + content: { + payload: { + transferId: {id} + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: setmodel, + action: commit, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 24 + Acheminer et publier l'événement de modèle de règlement + + + Message : + { + id: <id>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: position, + action: commit || reserve, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 25 + Acheminer et publier l'événement de position pour le bénéficiaire + + [Validation d'exécution du transfert infructueuse] + + + Persister l'état du transfert (transferState='ABORTED') + + + 26 + Demande de persister le transfert state + Code d'erreur : + 2003 + + + 27 + Persister l'état du transfert + + transferStateChange + + + 28 + Renvoyer le succès + + + Message : + { + id: <id>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: position, + action: abort, + createdAt: <timestamp>, + state: { + status: "error", + code: 1 + } + } + } + } + + + 29 + Acheminer et publier l'événement de position pour le payeur + + [Consommer des messages groupés] + + + À livrer dans une future itération + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.1.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.1.plantuml new file mode 100644 index 000000000..bdb471f8e --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.1.plantuml @@ -0,0 +1,272 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Rajiv Mothilal + * Georgi Georgiev + -------------- + ******'/ + +@startuml +' declate title +title 2.1.1. Consommation par le gestionnaire d'exécution (succès) +autonumber +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store +' declare actors +collections "topic-fulfil" as TOPIC_FULFIL +control "Gestionnaire d'événements\nd'exécution" as FULF_HANDLER +collections "topic-event" as TOPIC_EVENT +collections "topic-\ntransfer-position" as TOPIC_TRANSFER_POSITION +collections "topic-\nsettlement-model" as TOPIC_SETMODEL +collections "topic-\nnotification" as TOPIC_NOTIFICATIONS + +entity "DAO de position" as POS_DAO +database "Stockage central" as DB +box "Service central" #LightYellow + participant TOPIC_FULFIL + participant FULF_HANDLER + participant TOPIC_TRANSFER_POSITION + participant TOPIC_EVENT + participant TOPIC_SETMODEL + participant TOPIC_NOTIFICATIONS + participant POS_DAO + participant DB +end box +' start flow +activate FULF_HANDLER +group Consommation par le gestionnaire d'exécution (succès) + alt Consommer un message unique + TOPIC_FULFIL <- FULF_HANDLER: Consommer le message d'événement d'exécution pour le payeur + activate TOPIC_FULFIL + deactivate TOPIC_FULFIL + break + group Valider l'événement + FULF_HANDLER <-> FULF_HANDLER: Valider l'événement — règle : type == 'fulfil' && action == 'commit'\nCodes d'erreur : 2001 + end + end + group Persister les informations d'événement + ||| + FULF_HANDLER -> TOPIC_EVENT: Publier les informations d'événement + ref over FULF_HANDLER, TOPIC_EVENT: Consommation du gestionnaire d'événements\n + ||| + end + + group Valider le contrôle de doublon + ||| + FULF_HANDLER -> DB: Demande de contrôle de doublon + ref over FULF_HANDLER, DB: Contrôle de doublon de requête\n + DB --> FULF_HANDLER: Renvoyer { hasDuplicateId: Boolean, hasDuplicateHash: Boolean } + end + + alt hasDuplicateId == TRUE && hasDuplicateHash == TRUE + break + FULF_HANDLER -> FULF_HANDLER: stateRecord = await getTransferState(transferId) + alt endStateList.includes(stateRecord.transferStateId) + ||| + ref over FULF_HANDLER, TOPIC_NOTIFICATIONS: Rappel (callback) getTransfer\n + FULF_HANDLER -> TOPIC_NOTIFICATIONS: Produire le message + else + note right of FULF_HANDLER #lightgrey + Ignorer — renvoi en cours + end note + end + end + else hasDuplicateId == TRUE && hasDuplicateHash == FALSE + note right of FULF_HANDLER #lightgrey + Validation préparation transfert (échec) — requête modifiée + end note + else hasDuplicateId == FALSE + group Valider et persister l'exécution du transfert + FULF_HANDLER -> POS_DAO: Demander les informations pour les contrôles de validation\nCode d'erreur : 2003 + activate POS_DAO + POS_DAO -> DB: Récupérer depuis la base de données + activate DB + hnote over DB #lightyellow + transfer + end note + DB --> POS_DAO + deactivate DB + FULF_HANDLER <-- POS_DAO: Renvoyer le transfert + deactivate POS_DAO + FULF_HANDLER ->FULF_HANDLER: Valider que Transfer.ilpCondition = SHA-256 (content.payload.fulfilment)\nCode d'erreur : 2001 + FULF_HANDLER -> FULF_HANDLER: Valider expirationDate\nCode d'erreur : 3303 + + opt Validation de Transfer.ilpCondition réussie + group Demander la fenêtre de règlement actuelle + FULF_HANDLER -> POS_DAO: Demande de récupérer la fenêtre de règlement actuelle/la plus récente\nCode d'erreur : 2003 + activate POS_DAO + POS_DAO -> DB: Récupérer settlementWindowId + activate DB + hnote over DB #lightyellow + settlementWindow + end note + DB --> POS_DAO + deactivate DB + FULF_HANDLER <-- POS_DAO: Renvoyer settlementWindowId à ajouter lors de l'insertion transferFulfilment\n**TODO**: Lors de la conception du règlement, s'assurer que les transferts en état 'RECEIVED-FULFIL'\nsont mis à jour vers la prochaine fenêtre de règlement + deactivate POS_DAO + end + end + + group Persister l'exécution + FULF_HANDLER -> POS_DAO: Persister l'exécution avec le résultat du contrôle ci-dessus (transferFulfilment.isValid)\nCode d'erreur : 2003 + activate POS_DAO + POS_DAO -> DB: Persister en base de données + activate DB + deactivate DB + hnote over DB #lightyellow + transferFulfilment + transferExtension + end note + FULF_HANDLER <-- POS_DAO: Renvoyer le succès + deactivate POS_DAO + end + + alt Validation de Transfer.ilpCondition réussie + group Persister l'état du transfert (transferState='RECEIVED-FULFIL') + FULF_HANDLER -> POS_DAO: Demande de persister le transfert state\nCode d'erreur : 2003 + activate POS_DAO + POS_DAO -> DB: Persister l'état du transfert + activate DB + hnote over DB #lightyellow + transferStateChange + end note + deactivate DB + POS_DAO --> FULF_HANDLER: Renvoyer le succès + deactivate POS_DAO + end + + note right of FULF_HANDLER #yellow + Message : + { + id: , + from: switch, + to: switch, + type: application/json + content: { + payload: { + transferId: {id} + } + }, + metadata: { + event: { + id: , + responseTo: , + type: setmodel, + action: commit, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_SETMODEL: Acheminer et publier l'événement de modèle de règlement + activate TOPIC_SETMODEL + deactivate TOPIC_SETMODEL + + note right of FULF_HANDLER #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: position, + action: commit, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_TRANSFER_POSITION: Acheminer et publier l'événement de position pour le bénéficiaire + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + else Validation d'exécution du transfert infructueuse + group Persister l'état du transfert (transferState='ABORTED') + FULF_HANDLER -> POS_DAO: Demande de persister le transfert state\nCode d'erreur : 2003 + activate POS_DAO + POS_DAO -> DB: Persister l'état du transfert + activate DB + hnote over DB #lightyellow + transferStateChange + end note + deactivate DB + POS_DAO --> FULF_HANDLER: Renvoyer le succès + deactivate POS_DAO + end + + note right of FULF_HANDLER #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: position, + action: abort, + createdAt: , + state: { + status: "error", + code: 1 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_TRANSFER_POSITION: Acheminer et publier l'événement de position pour le payeur + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + end + end + end + else Consommer des messages groupés + note left of FULF_HANDLER #lightblue + À livrer dans une future itération + end note + end +end +deactivate FULF_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.1.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.1.svg new file mode 100644 index 000000000..4cdbdeacb --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-fulfil-2.1.1.svg @@ -0,0 +1,439 @@ + + 2.1.1. Consommation par le gestionnaire d'exécution (succès) + + + 2.1.1. Consommation par le gestionnaire d'exécution (succès) + + Service central + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + topic-fulfil + + + topic-fulfil + Gestionnaire d'événements + d'exécution + + + Gestionnaire d'événements + d'exécution + + + + + topic- + transfer-position + + + topic- + transfer-position + + + topic-event + + + topic-event + + + topic- + settlement-model + + + topic- + settlement-model + + + topic- + notification + + + topic- + notification + DAO de position + + + DAO de position + + + Stockage central + + + Stockage central + + + + + + + + + + + + + + + + + + + + Consommation par le gestionnaire d'exécution (succès) + + + alt + [Consommer un message unique] + + + 1 + Consommer le message d'événement d'exécution pour le payeur + + + break + + + Valider l'événement + + + + + + 2 + Valider l'événement — règle : type == 'fulfil' && action == 'commit' + Codes d'erreur : + 2001 + + + Persister les informations d'événement + + + 3 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements +   + + + Valider le contrôle de doublon + + + 4 + Demande de contrôle de doublon + + + ref + Contrôle de doublon de requête +   + + + 5 + Renvoyer { hasDuplicateId: Boolean, hasDuplicateHash: Boolean } + + + alt + [hasDuplicateId == TRUE && hasDuplicateHash == TRUE] + + + break + + + + + 6 + stateRecord = await getTransferState(transferId) + + + alt + [endStateList.includes(stateRecord.transferStateId)] + + + ref + Rappel (callback) getTransfer +   + + + 7 + Produire le message + + + + Ignorer — renvoi en cours + + [hasDuplicateId == TRUE && hasDuplicateHash == FALSE] + + + Validation préparation transfert (échec) — requête modifiée + + [hasDuplicateId == FALSE] + + + Valider et persister l'exécution du transfert + + + 8 + Demander les informations pour les contrôles de validation + Code d'erreur : + 2003 + + + 9 + Récupérer depuis la base de données + + transfer + + + 10 +   + + + 11 + Renvoyer le transfert + + + + + 12 + Valider que Transfer.ilpCondition = SHA-256 (content.payload.fulfilment) + Code d'erreur : + 2001 + + + + + 13 + Valider expirationDate + Code d'erreur : + 3303 + + + opt + [Validation de Transfer.ilpCondition réussie] + + + Demander la fenêtre de règlement actuelle + + + 14 + Demande de récupérer la fenêtre de règlement actuelle/la plus récente + Code d'erreur : + 2003 + + + 15 + Récupérer settlementWindowId + + settlementWindow + + + 16 +   + + + 17 + Renvoyer settlementWindowId à ajouter lors de l'insertion transferFulfilment + TODO + : Lors de la conception du règlement, s'assurer que les transferts en état 'RECEIVED-FULFIL' + sont mis à jour vers la prochaine fenêtre de règlement + + + Persister l'exécution + + + 18 + Persister l'exécution avec le résultat du contrôle ci-dessus (transferFulfilment.isValid) + Code d'erreur : + 2003 + + + 19 + Persister en base de données + + transferFulfilment + transferExtension + + + 20 + Renvoyer le succès + + + alt + [Validation de Transfer.ilpCondition réussie] + + + Persister l'état du transfert (transferState='RECEIVED-FULFIL') + + + 21 + Demande de persister le transfert state + Code d'erreur : + 2003 + + + 22 + Persister l'état du transfert + + transferStateChange + + + 23 + Renvoyer le succès + + + Message : + { + id: <id>, + from: switch, + to: switch, + type: application/json + content: { + payload: { + transferId: {id} + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: setmodel, + action: commit, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 24 + Acheminer et publier l'événement de modèle de règlement + + + Message : + { + id: <id>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: position, + action: commit, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 25 + Acheminer et publier l'événement de position pour le bénéficiaire + + [Validation d'exécution du transfert infructueuse] + + + Persister l'état du transfert (transferState='ABORTED') + + + 26 + Demande de persister le transfert state + Code d'erreur : + 2003 + + + 27 + Persister l'état du transfert + + transferStateChange + + + 28 + Renvoyer le succès + + + Message : + { + id: <id>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: position, + action: abort, + createdAt: <timestamp>, + state: { + status: "error", + code: 1 + } + } + } + } + + + 29 + Acheminer et publier l'événement de position pour le payeur + + [Consommer des messages groupés] + + + À livrer dans une future itération + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-all-participant-limit-1.0.0.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-all-participant-limit-1.0.0.plantuml new file mode 100644 index 000000000..6aed2fce0 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-all-participant-limit-1.0.0.plantuml @@ -0,0 +1,111 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Shashikant Hirugade + -------------- + ******'/ + +@startuml +' declate title +title 1.0.0 Détails des limites de tous les participants + +autonumber + + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +entity "Opérateur HUB" as OPERATOR +boundary "API du service central" as CSAPI +control "Gestionnaire des participants" as PARTICIPANT_HANDLER +entity "API du service central" as CSAPI +entity "Façade participant" as PARTICIPANT_DAO +database "Stockage central" as DB + +box "Services centraux" #LightYellow +participant CSAPI +participant PARTICIPANT_HANDLER +participant PARTICIPANT_DAO +participant DB +end box + +' start flow + +activate OPERATOR +group Obtenir les limites de tous les participants + OPERATOR -> CSAPI: Demande d'obtenir les limites — GET - /participants/limits?type={typeValue}¤cy={currencyType} + activate CSAPI + CSAPI -> PARTICIPANT_HANDLER: Récupérer les limites de tous les participants + activate PARTICIPANT_HANDLER + PARTICIPANT_HANDLER ->PARTICIPANT_DAO: Récupérer les limites pour tous les participants avec devise et type \nCode d'erreur : 3000 + activate PARTICIPANT_DAO + PARTICIPANT_DAO ->DB: Récupérer les limites pour currencyId et type (si fourni) + note right of PARTICIPANT_DAO #lightgrey + Condition : + participantCurrency.participantCurrencyId = participant.participantCurrencyId + participantLimit.isActive = 1 + participantLimit.participantCurrencyId = participantCurrency.participantCurrencyId + [ + participantLimit.participantLimitTypeId = participantLimitType.participantLimitTypeId + participantLimit.participantCurrencyId = + participantLimitType.name = + ] + end note + + activate DB + hnote over DB #lightyellow + participant + participantCurrency + participantLimit + participantLimitType + end note + DB --> PARTICIPANT_DAO: Limites participant récupérées pour currencyId et type + deactivate DB + PARTICIPANT_DAO -->PARTICIPANT_HANDLER: Renvoyer les limites de tous les participants + deactivate PARTICIPANT_DAO + note right of PARTICIPANT_HANDLER #yellow + Message : + [ + { + name: + currency: , + limit: {type: , value: } + }, + { + name: + currency: , + limit: {type: , value: } + } + ] + end note + PARTICIPANT_HANDLER -->CSAPI: Renvoyer les limites de tous les participants \nCode d'erreur : 3000 + deactivate PARTICIPANT_HANDLER + CSAPI -->OPERATOR: Renvoyer les limites de tous les participants \nCode d'erreur : 3000 + + deactivate CSAPI + deactivate OPERATOR +end + +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-all-participant-limit-1.0.0.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-all-participant-limit-1.0.0.svg new file mode 100644 index 000000000..2b49dada4 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-all-participant-limit-1.0.0.svg @@ -0,0 +1,127 @@ + + 1.0.0 Détails des limites de tous les participants + + + 1.0.0 Détails des limites de tous les participants + + Services centraux + + + + + + + + + + + + Opérateur HUB + + + Opérateur HUB + + + API du service central + + + API du service central + + + Gestionnaire des participants + + + Gestionnaire des participants + + + Façade participant + + + Façade participant + + + Stockage central + + + Stockage central + + + + + + + + + + Obtenir les limites de tous les participants + + + 1 + Demande d'obtenir les limites — GET - /participants/limits?type={typeValue}&currency={currencyType} + + + 2 + Récupérer les limites de tous les participants + + + 3 + Récupérer les limites pour tous les participants avec devise et type + Code d'erreur : + 3000 + + + 4 + Récupérer les limites pour currencyId et type (si fourni) + + + Condition : + participantCurrency.participantCurrencyId = participant.participantCurrencyId + participantLimit.isActive = 1 + participantLimit.participantCurrencyId = participantCurrency.participantCurrencyId + [ + participantLimit.participantLimitTypeId = participantLimitType.participantLimitTypeId + participantLimit.participantCurrencyId = <currencyId> + participantLimitType.name = <type> + ] + + participant + participantCurrency + participantLimit + participantLimitType + + + 5 + Limites participant récupérées pour currencyId et type + + + 6 + Renvoyer les limites de tous les participants + + + Message : + [ + { + name: <fsp> + currency: <currencyId>, + limit: {type: <type>, value: <value>} + }, + { + name: <fsp> + currency: <currencyId>, + limit: {type: <type>, value: <value>} + } + ] + + + 7 + Renvoyer les limites de tous les participants + Code d'erreur : + 3000 + + + 8 + Renvoyer les limites de tous les participants + Code d'erreur : + 3000 + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-health-1.0.0.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-health-1.0.0.plantuml new file mode 100644 index 000000000..889043f11 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-health-1.0.0.plantuml @@ -0,0 +1,203 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Lewis Daly + -------------- + ******'/ + + +@startuml +' declare title +title 1.0.0 Vérification d'état (Health Check) + +autonumber + + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +entity "Opérateur HUB" as OPERATOR +boundary "API du service central" as CSAPI +control "Gestionnaire de métadonnées" as METADATA_HANDLER +entity "API du service central" as CSAPI +database "Stockage central" as DB +collections "Stockage Kafka" as KAFKA +collections "Sidecar de journalisation" as SIDECAR + +box "Services centraux" #LightYellow +participant CSAPI +participant METADATA_HANDLER +participant DB +participant KAFKA +participant SIDECAR +end box + +' start flow + +activate OPERATOR +group Vérification d'état détaillée + OPERATOR -> CSAPI: Demande getHealth — GET /health?detailed=true + activate CSAPI + + CSAPI -> METADATA_HANDLER: Récupérer l'état de santé de tous les sous-services + activate METADATA_HANDLER + + METADATA_HANDLER -> METADATA_HANDLER: Récupérer les métadonnées du service + note right of METADATA_HANDLER #yellow + - versionNumber + - uptime + - heure de démarrage du service + end note + + + METADATA_HANDLER -> DB: Vérifier l'état de la connexion + activate DB + DB --> METADATA_HANDLER: Rapporter l'état de la connexion + deactivate DB + + + METADATA_HANDLER -> KAFKA: Vérifier l'état de la connexion + activate KAFKA + KAFKA --> METADATA_HANDLER: Rapporter l'état de la connexion + deactivate KAFKA + + + METADATA_HANDLER -> SIDECAR: Vérifier l'état de la connexion + activate SIDECAR + SIDECAR --> METADATA_HANDLER: Rapporter l'état de la connexion + deactivate SIDECAR + + alt Valider l'état (succès) + METADATA_HANDLER --> CSAPI: Renvoyer la réponse d'état + deactivate METADATA_HANDLER + note right of OPERATOR #yellow + **Exemple de message :** + ""200 Succès"" + { + "status": "UP", + "uptime": 1234, + "started": "2019-05-31T05:09:25.409Z", + "versionNumber": "5.2.3", + "services": [ + { + "name": "kafka", + "status": "UP", + "latency": 10 + } + ] + } + end note + + CSAPI --> OPERATOR: Renvoyer Statut HTTP : 200 + + deactivate CSAPI + deactivate OPERATOR + end + + alt Valider l'état (échec de service) + METADATA_HANDLER --> CSAPI: Renvoyer la réponse d'état + deactivate METADATA_HANDLER + note right of OPERATOR #yellow + **Exemple de message :** + ""502 Passerelle invalide"" + { + "status": "DOWN", + "uptime": 1234, + "started": "2019-05-31T05:09:25.409Z", + "versionNumber": "5.2.3", + "services": [ + { + "name": "kafka", + "status": "DOWN", + "latency": 1111111 + } + ] + } + end note + + CSAPI --> OPERATOR: Renvoyer Statut HTTP : 502 + + deactivate CSAPI + deactivate OPERATOR + + + end + + +' group Obtenir les limites de tous les participants +' OPERATOR -> CSAPI: Demande d'obtenir les limites — GET - /participants/limits?type={typeValue}¤cy={currencyType} +' activate CSAPI +' CSAPI -> PARTICIPANT_HANDLER: Récupérer les limites de tous les participants +' activate PARTICIPANT_HANDLER +' PARTICIPANT_HANDLER ->PARTICIPANT_DAO: Récupérer les limites pour tous les participants avec devise et type \nCode d'erreur : 3000 +' activate PARTICIPANT_DAO +' PARTICIPANT_DAO ->DB: Récupérer les limites pour currencyId et type (si fourni) +' note right of PARTICIPANT_DAO #lightgrey +' Condition : +' participantCurrency.participantCurrencyId = participant.participantCurrencyId +' participantLimit.isActive = 1 +' participantLimit.participantCurrencyId = participantCurrency.participantCurrencyId +' [ +' participantLimit.participantLimitTypeId = participantLimitType.participantLimitTypeId +' participantLimit.participantCurrencyId = +' participantLimitType.name = +' ] +' end note + +' activate DB +' hnote over DB #lightyellow +' participant +' participantCurrency +' participantLimit +' participantLimitType +' end note +' DB --> PARTICIPANT_DAO: Limites participant récupérées pour currencyId et type +' deactivate DB +' PARTICIPANT_DAO -->PARTICIPANT_HANDLER: Renvoyer les limites de tous les participants +' deactivate PARTICIPANT_DAO +' note right of PARTICIPANT_HANDLER #yellow +' Message : +' [ +' { +' name: +' currency: , +' limit: {type: , value: } +' }, +' { +' name: +' currency: , +' limit: {type: , value: } +' } +' ] +' end note +' PARTICIPANT_HANDLER -->CSAPI: Renvoyer les limites de tous les participants \nCode d'erreur : 3000 +' deactivate PARTICIPANT_HANDLER +' CSAPI -->OPERATOR: Renvoyer les limites de tous les participants \nCode d'erreur : 3000 + +' deactivate CSAPI +' deactivate OPERATOR +end + +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-health-1.0.0.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-health-1.0.0.svg new file mode 100644 index 000000000..71d3756f4 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-health-1.0.0.svg @@ -0,0 +1,174 @@ + + 1.0.0 Vérification d'état (Health Check) + + + 1.0.0 Vérification d'état (Health Check) + + Services centraux + + + + + + + + + + + + + + + + Opérateur HUB + + + Opérateur HUB + + + API du service central + + + API du service central + + + Gestionnaire de métadonnées + + + Gestionnaire de métadonnées + + + Stockage central + + + Stockage central + + + + + Stockage Kafka + + + Stockage Kafka + + + Sidecar de journalisation + + + Sidecar de journalisation + + + + + + + + + Vérification d'état détaillée + + + 1 + Demande getHealth — GET /health?detailed=true + + + 2 + Récupérer l'état de santé de tous les sous-services + + + + + 3 + Récupérer les métadonnées du service + + + - versionNumber + - uptime + - heure de démarrage du service + + + 4 + Vérifier l'état de la connexion + + + 5 + Rapporter l'état de la connexion + + + 6 + Vérifier l'état de la connexion + + + 7 + Rapporter l'état de la connexion + + + 8 + Vérifier l'état de la connexion + + + 9 + Rapporter l'état de la connexion + + + alt + [Valider l'état (succès)] + + + 10 + Renvoyer la réponse d'état + + + Exemple de message : + 200 Succès + { + "status": "UP", + "uptime": 1234, + "started": "2019-05-31T05:09:25.409Z", + "versionNumber": "5.2.3", + "services": [ + { + "name": "kafka", + "status": "UP", + "latency": 10 + } + ] + } + + + 11 + Renvoyer + Statut HTTP : + 200 + + + alt + [Valider l'état (échec de service)] + + + 12 + Renvoyer la réponse d'état + + + Exemple de message : + 502 Passerelle invalide + { + "status": "DOWN", + "uptime": 1234, + "started": "2019-05-31T05:09:25.409Z", + "versionNumber": "5.2.3", + "services": [ + { + "name": "kafka", + "status": "DOWN", + "latency": 1111111 + } + ] + } + + + 13 + Renvoyer + Statut HTTP : + 502 + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-participant-position-limit-1.1.0.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-participant-position-limit-1.1.0.plantuml new file mode 100644 index 000000000..96edebfbf --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-participant-position-limit-1.1.0.plantuml @@ -0,0 +1,206 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Shashikant Hirugade + -------------- + ******'/ + +@startuml +' declate title +title 1.1.0 Détails de position et de limite d'un participant + +autonumber + + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +entity "Opérateur HUB" as OPERATOR +boundary "API du service central" as CSAPI +control "Gestionnaire des participants" as PARTICIPANT_HANDLER +entity "API du service central" as CSAPI +entity "Façade participant" as PARTICIPANT_DAO +database "Stockage central" as DB + +box "Services centraux" #LightYellow +participant CSAPI +participant PARTICIPANT_HANDLER +participant PARTICIPANT_DAO +participant DB +end box + +' start flow + +activate OPERATOR +group Obtenir les limites du participant + OPERATOR -> CSAPI: Demande d'obtenir les limites — GET - /participants/{name}/limits?type={typeValue}¤cy={currencyValue} + activate CSAPI + CSAPI -> PARTICIPANT_HANDLER: Récupérer les limites du participant + activate PARTICIPANT_HANDLER + PARTICIPANT_HANDLER -> PARTICIPANT_HANDLER: vérifier si le paramètre « currency » est envoyé + alt Paramètre « currency » envoyé (oui) + PARTICIPANT_HANDLER ->PARTICIPANT_DAO: Récupérer l'id participant/devise \nCode d'erreur : 3200 + + activate PARTICIPANT_DAO + PARTICIPANT_DAO ->DB: Récupérer l'id participant/devise + activate DB + hnote over DB #lightyellow + participant + participantCurrency + end note + DB --> PARTICIPANT_DAO: Participant récupéré + deactivate DB + PARTICIPANT_DAO -->PARTICIPANT_HANDLER: Renvoyer l'id participant/devise + deactivate PARTICIPANT_DAO + PARTICIPANT_HANDLER ->PARTICIPANT_HANDLER: Valider le DFSP + alt Valider le participant (succès) + PARTICIPANT_HANDLER ->PARTICIPANT_DAO: Récupérer les limites participant pour devise et type \nCode d'erreur : 3000 + activate PARTICIPANT_DAO + PARTICIPANT_DAO ->DB: Récupérer la limite participant pour currencyId et type (si fourni) + note right of PARTICIPANT_DAO #lightgrey + Condition : + participantLimit.isActive = 1 + participantLimit.participantCurrencyId = + [ participantLimit.participantLimitTypeId = participantLimitType.participantLimitTypeId + participantLimitType.name = + ] + end note + + activate DB + hnote over DB #lightyellow + participantLimit + participantLimitType + end note + DB --> PARTICIPANT_DAO: Limites participant récupérées pour currencyId et type + deactivate DB + PARTICIPANT_DAO -->PARTICIPANT_HANDLER: Renvoyer les limites participant pour currencyId et type + deactivate PARTICIPANT_DAO + note right of PARTICIPANT_HANDLER #yellow + Message : + [ + { currency: , + limit: {type: , value: } + } + ] + end note + PARTICIPANT_HANDLER -->CSAPI: Renvoyer les limites participant + deactivate PARTICIPANT_HANDLER + CSAPI -->OPERATOR: Renvoyer les limites participant + + + else Valider le participant (échec) / erreur + activate PARTICIPANT_HANDLER + note right of PARTICIPANT_HANDLER #red: Échec de validation / erreur ! + activate PARTICIPANT_HANDLER + note right of PARTICIPANT_HANDLER #yellow + Message : + { + "errorInformation": { + "errorCode": , + "errorDescription": , + } + } + end note + PARTICIPANT_HANDLER -->CSAPI: Renvoyer Code d'erreur : 3000, 3200 + deactivate PARTICIPANT_HANDLER + CSAPI -->OPERATOR: Renvoyer Code d'erreur : 3000, 3200 + end + + else Paramètre « currency » envoyé (non) + PARTICIPANT_HANDLER ->PARTICIPANT_DAO: Récupérer le participant \nCode d'erreur : 3200 + + activate PARTICIPANT_DAO + PARTICIPANT_DAO ->DB: Récupérer le participant + activate DB + hnote over DB #lightyellow + participant + end note + DB --> PARTICIPANT_DAO: Participant récupéré + deactivate DB + PARTICIPANT_DAO -->PARTICIPANT_HANDLER: Renvoyer le participant + deactivate PARTICIPANT_DAO + PARTICIPANT_HANDLER ->PARTICIPANT_HANDLER: Valider le DFSP + alt Valider le participant (succès) + PARTICIPANT_HANDLER ->PARTICIPANT_DAO: Récupérer les limites participant pour toutes les devises et le type \nCode d'erreur : 3000 + activate PARTICIPANT_DAO + PARTICIPANT_DAO ->DB: Récupérer la limite participant pour toutes les devises et type (si fourni) + note right of PARTICIPANT_DAO #lightgrey + Condition : + participantCurrency.participantId = + participantLimit.participantCurrencyId = participantCurrency.participantCurrencyId + participantLimit.isActive = 1 + [ participantLimit.participantLimitTypeId = participantLimitType.participantLimitTypeId + participantLimitType.name = + ] + end note + + activate DB + hnote over DB #lightyellow + participantCurrency + participantLimit + participantLimitType + end note + DB --> PARTICIPANT_DAO: Limites participant récupérées pour toutes les devises et type + deactivate DB + PARTICIPANT_DAO -->PARTICIPANT_HANDLER: Renvoyer les limites participant pour toutes les devises et type + deactivate PARTICIPANT_DAO + note right of PARTICIPANT_HANDLER #yellow + Message : + [ + { currency: , + limit: {type: , value: } + } + ] + end note + PARTICIPANT_HANDLER -->CSAPI: Renvoyer les limites participant + deactivate PARTICIPANT_HANDLER + CSAPI -->OPERATOR: Renvoyer les limites participant + + + else Valider le participant (échec) / erreur + activate PARTICIPANT_HANDLER + note right of PARTICIPANT_HANDLER #red: Échec de validation / erreur ! + activate PARTICIPANT_HANDLER + note right of PARTICIPANT_HANDLER #yellow + Message : + { + "errorInformation": { + "errorCode": , + "errorDescription": , + } + } + end note + PARTICIPANT_HANDLER -->CSAPI: Renvoyer Code d'erreur : 3000, 3200 + deactivate PARTICIPANT_HANDLER + CSAPI -->OPERATOR: Renvoyer Code d'erreur : 3000, 3200 + end + end + + + deactivate CSAPI + deactivate OPERATOR +end + +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-participant-position-limit-1.1.0.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-participant-position-limit-1.1.0.svg new file mode 100644 index 000000000..b9563948d --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-participant-position-limit-1.1.0.svg @@ -0,0 +1,306 @@ + + 1.1.0 Détails de position et de limite d'un participant + + + 1.1.0 Détails de position et de limite d'un participant + + Services centraux + + + + + + + + + + + + + + + + + + + + + + + + + Opérateur HUB + + + Opérateur HUB + + + API du service central + + + API du service central + + + Gestionnaire des participants + + + Gestionnaire des participants + + + Façade participant + + + Façade participant + + + Stockage central + + + Stockage central + + + + + + + + + + + + + + + + + + + + Obtenir les limites du participant + + + 1 + Demande d'obtenir les limites — GET - /participants/{name}/limits?type={typeValue}&currency={currencyValue} + + + 2 + Récupérer les limites du participant + + + + + 3 + vérifier si le paramètre « currency » est envoyé + + + alt + [Paramètre « currency » envoyé (oui)] + + + 4 + Récupérer l'id participant/devise + Code d'erreur : + 3200 + + + 5 + Récupérer l'id participant/devise + + participant + participantCurrency + + + 6 + Participant récupéré + + + 7 + Renvoyer l'id participant/devise + + + + + 8 + Valider le DFSP + + + alt + [Valider le participant (succès)] + + + 9 + Récupérer les limites participant pour devise et type + Code d'erreur : + 3000 + + + 10 + Récupérer la limite participant pour currencyId et type (si fourni) + + + Condition : + participantLimit.isActive = 1 + participantLimit.participantCurrencyId = <currencyId> + [ participantLimit.participantLimitTypeId = participantLimitType.participantLimitTypeId + participantLimitType.name = <type> + ] + + participantLimit + participantLimitType + + + 11 + Limites participant récupérées pour currencyId et type + + + 12 + Renvoyer les limites participant pour currencyId et type + + + Message : + [ + { currency: <currencyId>, + limit: {type: <type>, value: <value>} + } + ] + + + 13 + Renvoyer les limites participant + + + 14 + Renvoyer les limites participant + + [Valider le participant (échec) / erreur] + + + Échec de validation / erreur ! + + + Message : + { + "errorInformation": { + "errorCode": <errorCode>, + "errorDescription": <ErrorMessage>, + } + } + + + 15 + Renvoyer + Code d'erreur : + 3000, 3200 + + + 16 + Renvoyer + Code d'erreur : + 3000, 3200 + + [Paramètre « currency » envoyé (non)] + + + 17 + Récupérer le participant + Code d'erreur : + 3200 + + + 18 + Récupérer le participant + + participant + + + 19 + Participant récupéré + + + 20 + Renvoyer le participant + + + + + 21 + Valider le DFSP + + + alt + [Valider le participant (succès)] + + + 22 + Récupérer les limites participant pour toutes les devises et le type + Code d'erreur : + 3000 + + + 23 + Récupérer la limite participant pour toutes les devises et type (si fourni) + + + Condition : + participantCurrency.participantId = <participantId> + participantLimit.participantCurrencyId = participantCurrency.participantCurrencyId + participantLimit.isActive = 1 + [ participantLimit.participantLimitTypeId = participantLimitType.participantLimitTypeId + participantLimitType.name = <type> + ] + + participantCurrency + participantLimit + participantLimitType + + + 24 + Limites participant récupérées pour toutes les devises et type + + + 25 + Renvoyer les limites participant pour toutes les devises et type + + + Message : + [ + { currency: <currencyId>, + limit: {type: <type>, value: <value>} + } + ] + + + 26 + Renvoyer les limites participant + + + 27 + Renvoyer les limites participant + + [Valider le participant (échec) / erreur] + + + Échec de validation / erreur ! + + + Message : + { + "errorInformation": { + "errorCode": <errorCode>, + "errorDescription": <ErrorMessage>, + } + } + + + 28 + Renvoyer + Code d'erreur : + 3000, 3200 + + + 29 + Renvoyer + Code d'erreur : + 3000, 3200 + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-transfer-1.1.5-phase2.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-transfer-1.1.5-phase2.plantuml new file mode 100644 index 000000000..c9581bc3e --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-transfer-1.1.5-phase2.plantuml @@ -0,0 +1,167 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Samuel Kummary + -------------- + ******'/ + +@startuml +' declate title +title 1.1.5. Demande de statut de transfert (getTransferStatusById) — version phase 2 + +autonumber + +' declare actors +actor "DFSP(n)\nParticipant" as DFSP +control "Gestionnaire d'événements de notification ML API" as NOTIFY_HANDLER +boundary "API du service central" as CSAPI +collections "Rubrique d'événements" as TOPIC_EVENTS +entity "DAO transfert" as TRANSFER_DAO +database "Stockage central" as DB + +box "Fournisseur de services financiers" #lightGray + participant DFSP +end box + +box "Service adaptateur ML API" #LightBlue + participant NOTIFY_HANDLER +end box + +box "Service central" #LightYellow + participant CSAPI + participant TOPIC_EVENTS + participant TRANSFER_DAO + participant DB +end box + +' start flow +group Demander le statut du transfert + activate DFSP + DFSP -> NOTIFY_HANDLER: URL de demande de statut de transfert (callback) — GET - /transfers/{ID} +'alt invalid tansferId +' activate NOTIFY_HANDLER +' NOTIFY_HANDLER -> NOTIFY_HANDLER: Validate TransferId +' break +' note right of NOTIFY_HANDLER #yellow +' { +' "errorInformation": { +' "errorCode": , +' "errorDescription": "Charge utile ou état invalide" +' } +' } +' end note +' DFSP <-- NOTIFY_HANDLER: Respond HTTP - 4xx (Bad Request) +' end +'else valid transfer + ||| + group Persister les informations d'événement +' hnote over NOTIFY_HANDLER #Pink +' Do we need to write the event to the Event-Topic? +' Not transaction related. +' end hnote + NOTIFY_HANDLER -> CSAPI: Demander les informations de transfert — GET - /transfers/{ID} + activate CSAPI + + activate TOPIC_EVENTS + CSAPI -> TOPIC_EVENTS: Publier les informations d'événement + ||| + ref over TOPIC_EVENTS : Consommation du gestionnaire d'événements\n + ||| + CSAPI <-- TOPIC_EVENTS: Renvoyer le succès + deactivate TOPIC_EVENTS + CSAPI --> NOTIFY_HANDLER: Renvoyer le succès + deactivate CSAPI + end + DFSP <-- NOTIFY_HANDLER: Répondre HTTP — 200 (OK) +'end + NOTIFY_HANDLER -> CSAPI: Demander les détails du transfert — GET - /transfers/{ID}\nCode d'erreur : 2003 + activate CSAPI + CSAPI -> TRANSFER_DAO: Demander le statut du transfert\nCode d'erreur : 2003 + activate TRANSFER_DAO + TRANSFER_DAO -> DB: Récupérer le statut du transfert + activate DB + hnote over DB #lightyellow + SELECT transferId, transferStateId + FROM **transferStateChange** + WHERE transferId = {ID} + ORDER BY transferStateChangeId desc limit 1 + end note + deactivate DB + CSAPI <-- TRANSFER_DAO: Renvoyer le statut du transfert + deactivate TRANSFER_DAO + NOTIFY_HANDLER <-- CSAPI: Renvoyer le statut du transfert\nCodes d'erreur : 3202, 3203 + deactivate CSAPI + + alt Un transfert avec l'ID donné est-il enregistré dans le système ? + alt Oui ET transferState vaut COMMITTED\nCela signifie qu'un transfert réussi avec l'ID donné est enregistré + note left of NOTIFY_HANDLER #yellow + { + "fulfilment": "WLctttbu2HvTsa1XWvUoGRcQozHsqeu9Ahl2JW9Bsu8", + "completedTimestamp": "2018-09-24T08:38:08.699-04:00", + "transferState": "COMMITTED", + extensionList: + { + extension: + [ + { + "key": "Description", + "value": "Description plus détaillée" + } + ] + } + } + end note + DFSP <- NOTIFY_HANDLER: callback PUT sur /transfers/{ID} + else transferState dans [RECEIVED, RESERVED, ABORTED] + note left of NOTIFY_HANDLER #yellow + { + "transferState": "RECEIVED", + extensionList: + { + extension: + [ + { + "key": "Description", + "value": "Description plus détaillée" + } + ] + } + } + end note + DFSP <- NOTIFY_HANDLER: callback PUT sur /transfers/{ID} + end + note right of NOTIFY_HANDLER #lightgray + Journaliser l'événement ERROR + end note + else Aucun transfert avec l'ID donné dans le système, ou requête invalide + note left of NOTIFY_HANDLER #yellow + { + "errorInformation": { + "errorCode": , + "errorDescription": "Description d'erreur client" + } + } + end note + DFSP <- NOTIFY_HANDLER: callback PUT sur /transfers/{ID}/error + end + deactivate NOTIFY_HANDLER +deactivate DFSP +end +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-transfer-1.1.5-phase2.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-transfer-1.1.5-phase2.svg new file mode 100644 index 000000000..185856495 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-get-transfer-1.1.5-phase2.svg @@ -0,0 +1,208 @@ + + 1.1.5. Demande de statut de transfert (getTransferStatusById) — version phase 2 + + + 1.1.5. Demande de statut de transfert (getTransferStatusById) — version phase 2 + + Fournisseur de services financiers + + Service adaptateur ML API + + Service central + + + + + + + + + + + + + + + + + DFSP(n) + Participant + + + DFSP(n) + Participant + + + Gestionnaire d'événements de notification ML API + + + Gestionnaire d'événements de notification ML API + + + API du service central + + + API du service central + + + + + Rubrique d'événements + + + Rubrique d'événements + DAO transfert + + + DAO transfert + + + Stockage central + + + Stockage central + + + + + + + + + + + Demander le statut du transfert + + + 1 + URL de demande de statut de transfert (callback) — GET - /transfers/{ID} + + + Persister les informations d'événement + + + 2 + Demander les informations de transfert — GET - /transfers/{ID} + + + 3 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements +   + + + 4 + Renvoyer le succès + + + 5 + Renvoyer le succès + + + 6 + Répondre HTTP — 200 (OK) + + + 7 + Demander les détails du transfert — GET - /transfers/{ID} + Code d'erreur : + 2003 + + + 8 + Demander le statut du transfert + Code d'erreur : + 2003 + + + 9 + Récupérer le statut du transfert + + SELECT transferId, transferStateId + FROM + transferStateChange + WHERE transferId = {ID} + ORDER BY transferStateChangeId desc limit 1 + + + 10 + Renvoyer le statut du transfert + + + 11 + Renvoyer le statut du transfert + Codes d'erreur : + 3202, 3203 + + + alt + [Un transfert avec l'ID donné est-il enregistré dans le système ?] + + + alt + [Oui ET transferState vaut COMMITTED + Cela signifie qu'un transfert réussi avec l'ID donné est enregistré] + + + { + "fulfilment": "WLctttbu2HvTsa1XWvUoGRcQozHsqeu9Ahl2JW9Bsu8", + "completedTimestamp": "2018-09-24T08:38:08.699-04:00", + "transferState": "COMMITTED", + extensionList: + { + extension: + [ + { + "key": "Description", + "value": "Description plus détaillée" + } + ] + } + } + + + 12 + callback PUT sur /transfers/{ID} + + [transferState dans [RECEIVED, RESERVED, ABORTED]] + + + { + "transferState": "RECEIVED", + extensionList: + { + extension: + [ + { + "key": "Description", + "value": "Description plus détaillée" + } + ] + } + } + + + 13 + callback PUT sur /transfers/{ID} + + + Journaliser l'événement ERROR + + [Aucun transfert avec l'ID donné dans le système, ou requête invalide] + + + { + "errorInformation": { + "errorCode": <integer>, + "errorDescription": "Description d'erreur client" + } + } + + + 14 + callback PUT sur /transfers/{ID}/error + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-manage-participant-limit-1.1.0.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-manage-participant-limit-1.1.0.plantuml new file mode 100644 index 000000000..0bba91899 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-manage-participant-limit-1.1.0.plantuml @@ -0,0 +1,174 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Samuel Kummary + * Shashikant Hirugade + -------------- + ******'/ + +@startuml +' declare title +title 1.1.0 Gestion des limites participant + +autonumber + +' declare actors +actor "Opérateur HUB" as OPERATOR +boundary "API du service central" as CSAPI +control "Gestionnaire des participants" as PARTICIPANT_HANDLER +entity "API du service central" as CSAPI +entity "DAO participant" as PARTICIPANT_DAO +database "Stockage central" as DB + +box "Services centraux" #LightYellow +participant PARTICIPANT_HANDLER +participant PARTICIPANT_DAO +participant DB +end box + +' start flow + +activate OPERATOR +group Gérer le plafond de débit net + OPERATOR -> CSAPI: Demande d'ajuster la limite d'un participant pour une devise — POST - /participants/{name}/limits + note right of OPERATOR #yellow + Message : + { + payload: { + currency: , + limit: { + type: , + value: + } + } + } + end note + + activate CSAPI + CSAPI -> PARTICIPANT_HANDLER: Ajuster la limite du participant + activate PARTICIPANT_HANDLER + PARTICIPANT_HANDLER ->PARTICIPANT_DAO: Récupérer participant/devise \nCode d'erreur : 3200 + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Récupérer participant/devise + activate DB + hnote over DB #lightyellow + participant + participantCurrency + end note + DB --> PARTICIPANT_DAO: Participant/devise récupéré + deactivate DB + PARTICIPANT_DAO --> PARTICIPANT_HANDLER: Renvoyer participant/devise + deactivate PARTICIPANT_DAO + PARTICIPANT_HANDLER -> PARTICIPANT_HANDLER: Valider le DFSP + alt Valider le participant (succès) + PARTICIPANT_HANDLER ->PARTICIPANT_DAO: (for ParticipantCurrency) Récupérer ParticipantLimit \nCode d'erreur : 3200 + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Récupérer ParticipantLimit + activate DB + hnote over DB #lightyellow + participantLimit + end note + DB --> PARTICIPANT_DAO: ParticipantLimit récupéré + deactivate DB + PARTICIPANT_DAO --> PARTICIPANT_HANDLER: Renvoyer ParticipantLimit + deactivate PARTICIPANT_DAO + PARTICIPANT_HANDLER -> PARTICIPANT_HANDLER: Valider ParticipantLimit + alt Valider participantLimit (succès) + group IMPLÉMENTATION TRANSACTION BD — verrou sur la table ParticipantLimit avec UPDATE + note right of PARTICIPANT_DAO #lightgrey + Si (enregistrement existe && isActive = 1) + oldIsActive.isActive = 0 + insérer l'enregistrement + Else + insérer l'enregistrement + End + + end note + + PARTICIPANT_HANDLER ->PARTICIPANT_DAO: (for ParticipantLimit) Insérer un nouveau ParticipantLimit \nCode d'erreur : 3200 + + activate PARTICIPANT_DAO + + PARTICIPANT_DAO -> DB: Insérer ParticipantLimit + activate DB + hnote over DB #lightyellow + participantLimit + end note + DB --> PARTICIPANT_DAO: ParticipantLimit inséré + deactivate DB + PARTICIPANT_DAO --> PARTICIPANT_HANDLER: Renvoyer ParticipantLimit + + + deactivate PARTICIPANT_DAO + ' Libérer le verrou sur la table ParticipantLimit + end + + else Valider participantLimit (échec) + note right of PARTICIPANT_HANDLER #red: Échec de validation ! + + note right of PARTICIPANT_HANDLER #yellow + Message : + { + "errorInformation": { + "errorCode": 3200, + "errorDescription": "ParticipantLimit introuvable", + } + } + end note + end + PARTICIPANT_HANDLER --> CSAPI: Renvoyer les nouvelles valeurs de limite et statut 200 + note right of PARTICIPANT_HANDLER #yellow + Message : + { + "currency": "EUR", + "limit": { + "participantLimitId": , + "participantLimitTypeId": , + "type": , + "value": , + "isActive": 1 + } + } + end note + CSAPI --> OPERATOR: Renvoyer les nouvelles valeurs de limite et statut 200 + + else Valider le participant (échec) + note right of PARTICIPANT_HANDLER #red: Échec de validation ! + + note right of PARTICIPANT_HANDLER #yellow + Message : + { + "errorInformation": { + "errorCode": 3200, + "errorDescription": "Identifiant FSP introuvable", + } + } + end note + + end + PARTICIPANT_HANDLER -->CSAPI: Renvoyer Code d'erreur : 3200 + deactivate PARTICIPANT_HANDLER + CSAPI -->OPERATOR: Renvoyer Code d'erreur : 3200 + + deactivate PARTICIPANT_HANDLER + deactivate CSAPI + deactivate OPERATOR +end +@enduml \ No newline at end of file diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-manage-participant-limit-1.1.0.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-manage-participant-limit-1.1.0.svg new file mode 100644 index 000000000..a07422ba3 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-manage-participant-limit-1.1.0.svg @@ -0,0 +1,243 @@ + + 1.1.0 Gestion des limites participant + + + 1.1.0 Gestion des limites participant + + Services centraux + + + + + + + + + + + + + + + + + + + Opérateur HUB + + + Opérateur HUB + + + API du service central + + + API du service central + + + Gestionnaire des participants + + + Gestionnaire des participants + + + DAO participant + + + DAO participant + + + Stockage central + + + Stockage central + + + + + + + + + + + + + + Gérer le plafond de débit net + + + 1 + Demande d'ajuster la limite d'un participant pour une devise — POST - /participants/{name}/limits + + + Message : + { + payload: { + currency: <string>, + limit: { + type: <string>, + value: <Id> + } + } + } + + + 2 + Ajuster la limite du participant + + + 3 + Récupérer participant/devise + Code d'erreur : + 3200 + + + 4 + Récupérer participant/devise + + participant + participantCurrency + + + 5 + Participant/devise récupéré + + + 6 + Renvoyer participant/devise + + + + + 7 + Valider le DFSP + + + alt + [Valider le participant (succès)] + + + 8 + (for ParticipantCurrency) Récupérer ParticipantLimit + Code d'erreur : + 3200 + + + 9 + Récupérer ParticipantLimit + + participantLimit + + + 10 + ParticipantLimit récupéré + + + 11 + Renvoyer ParticipantLimit + + + + + 12 + Valider ParticipantLimit + + + alt + [Valider participantLimit (succès)] + + + IMPLÉMENTATION TRANSACTION BD — verrou sur la table ParticipantLimit avec UPDATE + + + Si (enregistrement existe && isActive = 1) + oldIsActive.isActive = 0 + insérer l'enregistrement + Else + insérer l'enregistrement + End +   + + + 13 + (for ParticipantLimit) Insérer un nouveau ParticipantLimit + Code d'erreur : + 3200 + + + 14 + Insérer ParticipantLimit + + participantLimit + + + 15 + ParticipantLimit inséré + + + 16 + Renvoyer ParticipantLimit + + [Valider participantLimit (échec)] + + + Échec de validation ! + + + Message : + { + "errorInformation": { + "errorCode": 3200, + "errorDescription": "ParticipantLimit introuvable", + } + } + + + 17 + Renvoyer les nouvelles valeurs de limite et statut 200 + + + Message : + { + "currency": "EUR", + "limit": { + "participantLimitId": <number>, + "participantLimitTypeId": <number>, + "type": <string>, + "value": <string>, + "isActive": 1 + } + } + + + 18 + Renvoyer les nouvelles valeurs de limite et statut 200 + + [Valider le participant (échec)] + + + Échec de validation ! + + + Message : + { + "errorInformation": { + "errorCode": 3200, + "errorDescription": "Identifiant FSP introuvable", + } + } + + + 19 + Renvoyer + Code d'erreur : + 3200 + + + 20 + Renvoyer + Code d'erreur : + 3200 + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-participant-position-limits-1.0.0.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-participant-position-limits-1.0.0.plantuml new file mode 100644 index 000000000..9a452e493 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-participant-position-limits-1.0.0.plantuml @@ -0,0 +1,187 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Shashikant Hirugade + -------------- + ******'/ + +@startuml +' declate title +title 1.0.0 Créer la position initiale et les limites d'un participant + +autonumber + + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +actor "Opérateur HUB" as OPERATOR +boundary "API du service central" as CSAPI +control "Gestionnaire des participants" as PARTICIPANT_HANDLER +entity "API du service central" as CSAPI +entity "Façade participant" as PARTICIPANT_DAO +database "Stockage central" as DB + +box "Services centraux" #LightYellow +participant CSAPI +participant PARTICIPANT_HANDLER +participant PARTICIPANT_DAO +participant DB +end box + +' start flow + +activate OPERATOR +group Créer la position initiale et les limites + OPERATOR -> CSAPI: Demande de créer la position initiale et les limites — POST - /paticipants/{name}/initialPositionAndLimits + note right of OPERATOR #yellow + Message : + { + currency: , + limit: { + type: , + value: + }, + initialPosition: + } + end note + + activate CSAPI + CSAPI -> PARTICIPANT_HANDLER: Créer la position initiale et les limites pour le participant + activate PARTICIPANT_HANDLER + PARTICIPANT_HANDLER ->PARTICIPANT_DAO: Récupérer l'identifiant participant / devise \nCode d'erreur : 3200 + + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Récupérer l'identifiant participant/devise + activate DB + hnote over DB #lightyellow + participant + participantCurrency + end note + DB --> PARTICIPANT_DAO: Identifiant participant/devise récupéré + deactivate DB + PARTICIPANT_DAO --> PARTICIPANT_HANDLER: Renvoyer l'identifiant participant/devise + deactivate PARTICIPANT_DAO + PARTICIPANT_HANDLER ->PARTICIPANT_HANDLER: Valider le DFSP + alt Valider le participant (succès) + PARTICIPANT_HANDLER ->PARTICIPANT_DAO: Récupérer la limite pour participantCurrencyId + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Récupérer la limite pour participantCurrencyId + activate DB + hnote over DB #lightyellow + participantLimit + end note + DB --> PARTICIPANT_DAO: Limite participant récupérée + deactivate DB + PARTICIPANT_DAO --> PARTICIPANT_HANDLER: Renvoyer la limite participant + deactivate PARTICIPANT_DAO + + PARTICIPANT_HANDLER ->PARTICIPANT_DAO: Récupérer la position pour participantCurrencyId + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Récupérer la position pour participantCurrencyId + activate DB + hnote over DB #lightyellow + participantPosition + end note + DB --> PARTICIPANT_DAO: Position participant récupérée + deactivate DB + PARTICIPANT_DAO --> PARTICIPANT_HANDLER: Renvoyer la position participant + deactivate PARTICIPANT_DAO + + PARTICIPANT_HANDLER ->PARTICIPANT_HANDLER: Vérifier si position ou limite existe + + alt position ou limite inexistante (succès) + + + PARTICIPANT_HANDLER ->PARTICIPANT_DAO: créer la position initiale et les limites pour le participant \nCode d'erreur : 2003/Msg : Service unavailable \nCode d'erreur : 2001/Msg : Internal Server Error + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Persister les limites/position du participant + activate DB + hnote over DB #lightyellow + participantPosition + participantLimit + end note + deactivate DB + PARTICIPANT_DAO --> PARTICIPANT_HANDLER: Renvoyer le statut + deactivate PARTICIPANT_DAO + alt Détails enregistrés avec succès + PARTICIPANT_HANDLER -->CSAPI: Renvoyer le code statut 201 + deactivate PARTICIPANT_HANDLER + CSAPI -->OPERATOR: Renvoyer le code statut 201 + else Détails non enregistrés / erreur + note right of PARTICIPANT_HANDLER #red: Erreur ! + activate PARTICIPANT_HANDLER + note right of PARTICIPANT_HANDLER #yellow + Message : + { + "errorInformation": { + "errorCode": , + "errorDescription": , + } + } + end note + PARTICIPANT_HANDLER -->CSAPI: Renvoyer Code d'erreur + ' deactivate PARTICIPANT_HANDLER + CSAPI -->OPERATOR: Renvoyer Code d'erreur + + end + + else position ou limite existante (échec) + note right of PARTICIPANT_HANDLER #red: Erreur ! + activate PARTICIPANT_HANDLER + note right of PARTICIPANT_HANDLER #yellow + Message : + { + "errorInformation": { + "errorCode": 3200, + "errorDescription": "Limite participant ou position initiale déjà définie", + } + } + end note + PARTICIPANT_HANDLER -->CSAPI: Renvoyer Code d'erreur : 3200 + ' deactivate PARTICIPANT_HANDLER + CSAPI -->OPERATOR: Renvoyer Code d'erreur : 3200 + + end + + else Valider le participant (échec) + note right of PARTICIPANT_HANDLER #red: Échec de validation ! + activate PARTICIPANT_HANDLER + note right of PARTICIPANT_HANDLER #yellow + Message : + { + "errorInformation": { + "errorCode": 3200, + "errorDescription": "Identifiant FSP introuvable", + } + } + end note + PARTICIPANT_HANDLER -->CSAPI: Renvoyer Code d'erreur : 3200 + deactivate PARTICIPANT_HANDLER + CSAPI -->OPERATOR: Renvoyer Code d'erreur : 3200 + + end + deactivate CSAPI + deactivate OPERATOR +end +@enduml \ No newline at end of file diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-participant-position-limits-1.0.0.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-participant-position-limits-1.0.0.svg new file mode 100644 index 000000000..4d0ddc2eb --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-participant-position-limits-1.0.0.svg @@ -0,0 +1,283 @@ + + 1.0.0 Créer la position initiale et les limites d'un participant + + + 1.0.0 Créer la position initiale et les limites d'un participant + + Services centraux + + + + + + + + + + + + + + + + + + + + + + Opérateur HUB + + + Opérateur HUB + + + API du service central + + + API du service central + + + Gestionnaire des participants + + + Gestionnaire des participants + + + Façade participant + + + Façade participant + + + Stockage central + + + Stockage central + + + + + + + + + + + + + + + + + Créer la position initiale et les limites + + + 1 + Demande de créer la position initiale et les limites — POST - /paticipants/{name}/initialPositionAndLimits + + + Message : + { + currency: <currencyId>, + limit: { + type: <limitType>, + value: <limitValue> + }, + initialPosition: <positionValue> + } + + + 2 + Créer la position initiale et les limites pour le participant + + + 3 + Récupérer l'identifiant participant / devise + Code d'erreur : + 3200 + + + 4 + Récupérer l'identifiant participant/devise + + participant + participantCurrency + + + 5 + Identifiant participant/devise récupéré + + + 6 + Renvoyer l'identifiant participant/devise + + + + + 7 + Valider le DFSP + + + alt + [Valider le participant (succès)] + + + 8 + Récupérer la limite pour participantCurrencyId + + + 9 + Récupérer la limite pour participantCurrencyId + + participantLimit + + + 10 + Limite participant récupérée + + + 11 + Renvoyer la limite participant + + + 12 + Récupérer la position pour participantCurrencyId + + + 13 + Récupérer la position pour participantCurrencyId + + participantPosition + + + 14 + Position participant récupérée + + + 15 + Renvoyer la position participant + + + + + 16 + Vérifier si position ou limite existe + + + alt + [position ou limite inexistante (succès)] + + + 17 + créer la position initiale et les limites pour le participant + Code d'erreur : + 2003/ + Msg : + Service unavailable +   + Code d'erreur : + 2001/ + Msg : + Internal Server Error + + + 18 + Persister les limites/position du participant + + participantPosition + participantLimit + + + 19 + Renvoyer le statut + + + alt + [Détails enregistrés avec succès] + + + 20 + Renvoyer le code statut 201 + + + 21 + Renvoyer le code statut 201 + + [Détails non enregistrés / erreur] + + + Erreur ! + + + Message : + { + "errorInformation": { + "errorCode": <Error Code>, + "errorDescription": <Msg>, + } + } + + + 22 + Renvoyer + Code d'erreur + + + 23 + Renvoyer + Code d'erreur + + [position ou limite existante (échec)] + + + Erreur ! + + + Message : + { + "errorInformation": { + "errorCode": 3200, + "errorDescription": "Limite participant ou position initiale déjà définie", + } + } + + + 24 + Renvoyer + Code d'erreur : + 3200 + + + 25 + Renvoyer + Code d'erreur : + 3200 + + [Valider le participant (échec)] + + + Échec de validation ! + + + Message : + { + "errorInformation": { + "errorCode": 3200, + "errorDescription": "Identifiant FSP introuvable", + } + } + + + 26 + Renvoyer + Code d'erreur : + 3200 + + + 27 + Renvoyer + Code d'erreur : + 3200 + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-participants-positions-query-4.1.0.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-participants-positions-query-4.1.0.plantuml new file mode 100644 index 000000000..12919190b --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-participants-positions-query-4.1.0.plantuml @@ -0,0 +1,164 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Shashikant Hirugade + * Samuel Kummary + -------------- + ******'/ + +@startuml +' declate title +title 4.1.0 Détails de position d'un participant + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +entity "Opérateur HUB" as OPERATOR +boundary "API du service central" as CSAPI +control "Gestionnaire des participants" as PARTICIPANT_HANDLER +entity "API du service central" as CSAPI +entity "DAO participant" as PARTICIPANT_DAO +entity "Façade de position" as POSITION_DAO +database "Stockage central" as DB +box "Opérateur HUB" #LightBlue +participant OPERATOR +end box + +box "Service central" #LightYellow +participant CSAPI +participant PARTICIPANT_HANDLER +participant PARTICIPANT_DAO +participant POSITION_DAO +participant DB +end box + +' start flow + +activate OPERATOR +group Obtenir les détails de position + OPERATOR -> CSAPI: Demande d'obtenir les positions — GET — /participants/{name}/positions?currency={currencyId} + activate CSAPI + CSAPI -> PARTICIPANT_HANDLER: Récupérer les positions du participant + activate PARTICIPANT_HANDLER + PARTICIPANT_HANDLER ->PARTICIPANT_DAO: Récupérer le participant \nCode d'erreur : 2003,3201 + + activate PARTICIPANT_DAO + PARTICIPANT_DAO ->DB: Récupérer le participant + activate DB + hnote over DB #lightyellow + participant + end note + DB --> PARTICIPANT_DAO: Participant récupéré + deactivate DB + PARTICIPANT_DAO -->PARTICIPANT_HANDLER: Renvoyer le participant + deactivate PARTICIPANT_DAO + PARTICIPANT_HANDLER ->PARTICIPANT_HANDLER: Valider le DFSP \nCode d'erreur : 3201 + alt Valider le participant (succès) + PARTICIPANT_HANDLER ->PARTICIPANT_HANDLER: Paramètre currency fourni ? + + alt Paramètre currency fourni + + PARTICIPANT_HANDLER ->POSITION_DAO: Récupérer la position du participant pour un identifiant de devise\nCode d'erreur : 2003 + activate POSITION_DAO + POSITION_DAO ->DB: Récupérer la position du participant pour un identifiant de devise + activate DB + hnote over DB #lightyellow + participantCurrency + participantPosition + end note + DB --> POSITION_DAO: Position du participant récupérée pour un identifiant de devise + deactivate DB + POSITION_DAO -->PARTICIPANT_HANDLER: Renvoyer les positions du participant + deactivate POSITION_DAO + note right of PARTICIPANT_HANDLER #yellow + Message : + { + { + currency: , + value: , + updatedTime: + } + } + end note + PARTICIPANT_HANDLER -->CSAPI: Renvoyer la position du participant pour un identifiant de devise + CSAPI -->OPERATOR: Renvoyer la position du participant pour un identifiant de devise + else Paramètre currency non fourni + PARTICIPANT_HANDLER ->POSITION_DAO: Récupérer les positions du participant pour toutes les devises\nCode d'erreur : 2003 + activate POSITION_DAO + POSITION_DAO ->DB: Récupérer les positions du participant pour toutes les devises + activate DB + hnote over DB #lightyellow + participantCurrency + participantPosition + end note + DB --> POSITION_DAO: Positions du participant récupérées pour toutes les devises + deactivate DB + POSITION_DAO -->PARTICIPANT_HANDLER: Renvoyer les positions du participant pour toutes les devises + deactivate POSITION_DAO + note right of PARTICIPANT_HANDLER #yellow + Message : + { + [ + { + currency: , + value: , + updatedTime: + }, + { + currency: , + value: , + updatedTime: + } + ] + } + end note + PARTICIPANT_HANDLER -->CSAPI: Renvoyer les positions du participant pour toutes les devises + CSAPI -->OPERATOR: Renvoyer les positions du participant pour toutes les devises + end + else Valider le participant (échec) + note right of PARTICIPANT_HANDLER #red: Échec de validation ! + activate PARTICIPANT_HANDLER + note right of PARTICIPANT_HANDLER #yellow + Message : + { + "errorInformation": { + "errorCode": 3201, + "errorDescription": "Identifiant FSP introuvable", + } + } + end note + PARTICIPANT_HANDLER -->CSAPI: Renvoyer Code d'erreur : 3201 + deactivate PARTICIPANT_HANDLER + CSAPI -->OPERATOR: Renvoyer Code d'erreur : 3201 + end + +end + +deactivate CSAPI +deactivate OPERATOR + +@enduml \ No newline at end of file diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-participants-positions-query-4.1.0.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-participants-positions-query-4.1.0.svg new file mode 100644 index 000000000..71c8a7af8 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-participants-positions-query-4.1.0.svg @@ -0,0 +1,240 @@ + + 4.1.0 Détails de position d'un participant + + + 4.1.0 Détails de position d'un participant + + Opérateur HUB + + Service central + + + + + + + + + + + + + + + + + + + Opérateur HUB + + + Opérateur HUB + + + API du service central + + + API du service central + + + Gestionnaire des participants + + + Gestionnaire des participants + + + DAO participant + + + DAO participant + + + Façade de position + + + Façade de position + + + Stockage central + + + Stockage central + + + + + + + + + + + + + + Obtenir les détails de position + + + 1 + Demande d'obtenir les positions — GET — /participants/{name}/positions?currency={currencyId} + + + 2 + Récupérer les positions du participant + + + 3 + Récupérer le participant + Code d'erreur : + 2003,3201 + + + 4 + Récupérer le participant + + participant + + + 5 + Participant récupéré + + + 6 + Renvoyer le participant + + + + + 7 + Valider le DFSP + Code d'erreur : + 3201 + + + alt + [Valider le participant (succès)] + + + + + 8 + Paramètre currency fourni ? + + + alt + [Paramètre currency fourni] + + + 9 + Récupérer la position du participant pour un identifiant de devise + Code d'erreur : + 2003 + + + 10 + Récupérer la position du participant pour un identifiant de devise + + participantCurrency + participantPosition + + + 11 + Position du participant récupérée pour un identifiant de devise + + + 12 + Renvoyer les positions du participant + + + Message : + { + { + currency: <currencyId>, + value: <positionValue>, + updatedTime: <timeStamp1> + } + } + + + 13 + Renvoyer la position du participant pour un identifiant de devise + + + 14 + Renvoyer la position du participant pour un identifiant de devise + + [Paramètre currency non fourni] + + + 15 + Récupérer les positions du participant pour toutes les devises + Code d'erreur : + 2003 + + + 16 + Récupérer les positions du participant pour toutes les devises + + participantCurrency + participantPosition + + + 17 + Positions du participant récupérées pour toutes les devises + + + 18 + Renvoyer les positions du participant pour toutes les devises + + + Message : + { + [ + { + currency: <currencyId1>, + value: <positionValue1>, + updatedTime: <timeStamp1> + }, + { + currency: <currencyId2>, + value: <positionValue2>, + updatedTime: <timeStamp2> + } + ] + } + + + 19 + Renvoyer les positions du participant pour toutes les devises + + + 20 + Renvoyer les positions du participant pour toutes les devises + + [Valider le participant (échec)] + + + Échec de validation ! + + + Message : + { + "errorInformation": { + "errorCode": 3201, + "errorDescription": "Identifiant FSP introuvable", + } + } + + + 21 + Renvoyer + Code d'erreur : + 3201 + + + 22 + Renvoyer + Code d'erreur : + 3201 + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-participants-positions-query-all-4.2.0.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-participants-positions-query-all-4.2.0.plantuml new file mode 100644 index 000000000..e7edebc4d --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-participants-positions-query-all-4.2.0.plantuml @@ -0,0 +1,139 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Samuel Kummary + -------------- + ******'/ + +@startuml +' declate title +title 4.2.0 Positions de tous les participants + +autonumber + + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +entity "ML-API-ADAPTER" as MLAPI +boundary "API du service central" as CSAPI +control "Gestionnaire des participants" as PARTICIPANT_HANDLER +entity "API du service central" as CSAPI +entity "DAO participant" as PARTICIPANT_DAO +database "Stockage central" as DB +box "Service adaptateur ML API" #LightBlue + participant MLAPI +end box + +box "Service central" #LightYellow + participant CSAPI + participant PARTICIPANT_HANDLER + participant PARTICIPANT_DAO + participant DB +end box + +' start flow + +activate MLAPI +group Obtenir les détails de position +MLAPI -> CSAPI: Demande pour obtenir les positions — GET — /participants/positions + activate CSAPI + CSAPI -> PARTICIPANT_HANDLER: Récupérer les positions de tous les participants + activate PARTICIPANT_HANDLER + PARTICIPANT_HANDLER ->PARTICIPANT_DAO: Récupérer les positions de tous les participants actifs \nCodes erreur : 2003,3200 + activate PARTICIPANT_DAO + PARTICIPANT_DAO ->DB: Récupérer les positions pour :\n tous les participants actifs\n avec toutes les devises actives par participant + activate DB + hnote over DB #lightyellow + participant + participantPosition + participantCurrency + end note + DB --> PARTICIPANT_DAO: Positions récupérées pour les participants + deactivate DB + PARTICIPANT_DAO -->PARTICIPANT_HANDLER: Renvoyer les positions pour les participants + deactivate PARTICIPANT_DAO + note right of PARTICIPANT_HANDLER #yellow + Message : + { + snapshotAt: , + positions: + [ + { + participantId: , + participantPositions: + [ + { + currentPosition: { + currency: , + value: , + reservedValue: , + lastUpdated: + } + }, + { + currentPosition: { + currency: , + value: , + reservedValue: , + lastUpdated: + } + } + ] + }, + { + participantId: , + participantPositions: + [ + { + currentPosition: { + currency: , + value: , + reservedValue: , + lastUpdated: + } + }, + { + currentPosition: { + currency: , + value: , + reservedValue: , + lastUpdated: + } + } + ] + } + ] + } + end note + PARTICIPANT_HANDLER -->CSAPI: Renvoyer les positions pour les participants + deactivate PARTICIPANT_HANDLER +CSAPI -->MLAPI: Renvoyer les positions pour les participants + +end + deactivate CSAPI +deactivate MLAPI + +@enduml \ No newline at end of file diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-participants-positions-query-all-4.2.0.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-participants-positions-query-all-4.2.0.svg new file mode 100644 index 000000000..6aa61d95e --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-participants-positions-query-all-4.2.0.svg @@ -0,0 +1,153 @@ + + 4.2.0 Positions de tous les participants + + + 4.2.0 Positions de tous les participants + + Service adaptateur ML API + + Service central + + + + + + + + + + + + ML-API-ADAPTER + + + ML-API-ADAPTER + + + API du service central + + + API du service central + + + Gestionnaire des participants + + + Gestionnaire des participants + + + DAO participant + + + DAO participant + + + Stockage central + + + Stockage central + + + + + + + + + + Obtenir les détails de position + + + 1 + Demande pour obtenir les positions — GET — /participants/positions + + + 2 + Récupérer les positions de tous les participants + + + 3 + Récupérer les positions de tous les participants actifs + Codes erreur : + 2003,3200 + + + 4 + Récupérer les positions pour : + tous les participants actifs + avec toutes les devises actives par participant + + participant + participantPosition + participantCurrency + + + 5 + Positions récupérées pour les participants + + + 6 + Renvoyer les positions pour les participants + + + Message : + { + snapshotAt: <timestamp0>, + positions: + [ + { + participantId: <dfsp1>, + participantPositions: + [ + { + currentPosition: { + currency: <currency1>, + value: <amount1>, + reservedValue: <amount2>, + lastUpdated: <timeStamp1> + } + }, + { + currentPosition: { + currency: <currency2>, + value: <amount3>, + reservedValue: <amount4>, + lastUpdated: <timeStamp2> + } + } + ] + }, + { + participantId: <dfsp2>, + participantPositions: + [ + { + currentPosition: { + currency: <currency1>, + value: <amount1>, + reservedValue: <amount2>, + lastUpdated: <timeStamp1> + } + }, + { + currentPosition: { + currency: <currency2>, + value: <amount3>, + reservedValue: <amount4>, + lastUpdated: <timeStamp2> + } + } + ] + } + ] + } + + + 7 + Renvoyer les positions pour les participants + + + 8 + Renvoyer les positions pour les participants + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.0-v1.1.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.0-v1.1.plantuml new file mode 100644 index 000000000..965a74d33 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.0-v1.1.plantuml @@ -0,0 +1,116 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Rajiv Mothilal + * Miguel de Barros + * Valentin Genev + -------------- + ******'/ + +@startuml +' declate title +title 1.3.0. Consommation par le gestionnaire de position (message unique) v1.1 + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +collections "topic-transfer-position" as TOPIC_TRANSFER_POSITION +control "Gestionnaire de position" as POS_HANDLER +collections "Rubrique d'événements" as TOPIC_EVENTS +collections "Rubrique de notification" as TOPIC_NOTIFICATIONS + + +box "Service central" #LightYellow + participant TOPIC_TRANSFER_POSITION + participant POS_HANDLER + participant TOPIC_EVENTS + participant TOPIC_NOTIFICATIONS +end box + +' start flow +activate POS_HANDLER +group Consommation du gestionnaire de position + alt Consommer le message de préparation pour le payeur + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consommer le message d'événement de position pour le payeur + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + break + group Valider l'événement + POS_HANDLER <-> POS_HANDLER: Valider l'événement — règle : type == 'position' && action == 'prepare'\nCodes d'erreur : 2001 + end + end + group Persister les informations d'événement + ||| + POS_HANDLER -> TOPIC_EVENTS: Publier les informations d'événement + ref over POS_HANDLER, TOPIC_EVENTS : Consommation du gestionnaire d'événements\n + ||| + end + ||| + ref over POS_HANDLER: Consommation par le gestionnaire de position (préparation)\n + POS_HANDLER -> TOPIC_NOTIFICATIONS: Produire le message + else Consommer le message d'exécution pour le bénéficiaire + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consommer le message d'événement de position pour le bénéficiaire + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + break + group Valider l'événement + POS_HANDLER <-> POS_HANDLER: Valider l'événement — règle : type == 'position' && action IN ['commit', 'reserve']\nCodes d'erreur : 2001 + end + end + group Persister les informations d'événement + ||| + POS_HANDLER -> TOPIC_EVENTS: Publier les informations d'événement + ref over POS_HANDLER, TOPIC_EVENTS : Consommation du gestionnaire d'événements\n + ||| + end + ||| + ref over POS_HANDLER: Consommation par le gestionnaire de position (exécution)\n + POS_HANDLER -> TOPIC_NOTIFICATIONS: Produire le message + else Consommer le message d'abandon + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consommer le message d'événement de position + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + break + group Valider l'événement + POS_HANDLER <-> POS_HANDLER: Valider l'événement — règle : type == 'position' &&\naction IN ['timeout-reserved', 'reject', 'fail']\nCodes d'erreur : 2001 + end + end + group Persister les informations d'événement + ||| + POS_HANDLER -> TOPIC_EVENTS: Publier les informations d'événement + ref over POS_HANDLER, TOPIC_EVENTS : Consommation du gestionnaire d'événements\n + ||| + end + ||| + ref over POS_HANDLER: Consommation par le gestionnaire de position (abandon)\n + POS_HANDLER -> TOPIC_NOTIFICATIONS: Produire le message + end + +end +deactivate POS_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.0-v1.1.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.0-v1.1.svg new file mode 100644 index 000000000..8977d6010 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.0-v1.1.svg @@ -0,0 +1,188 @@ + + 1.3.0. Consommation par le gestionnaire de position (message unique) v1.1 + + + 1.3.0. Consommation par le gestionnaire de position (message unique) v1.1 + + Service central + + + + + + + + + + + + + + + + + + + + + + topic-transfer-position + + + topic-transfer-position + Gestionnaire de position + + + Gestionnaire de position + + + + + Rubrique d'événements + + + Rubrique d'événements + + + Rubrique de notification + + + Rubrique de notification + + + + + + + Consommation du gestionnaire de position + + + alt + [Consommer le message de préparation pour le payeur] + + + 1 + Consommer le message d'événement de position pour le payeur + + + break + + + Valider l'événement + + + + + + 2 + Valider l'événement — règle : type == 'position' && action == 'prepare' + Codes d'erreur : + 2001 + + + Persister les informations d'événement + + + 3 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements +   + + + ref + Consommation par le gestionnaire de position (préparation) +   + + + 4 + Produire le message + + [Consommer le message d'exécution pour le bénéficiaire] + + + 5 + Consommer le message d'événement de position pour le bénéficiaire + + + break + + + Valider l'événement + + + + + + 6 + Valider l'événement — règle : type == 'position' && action IN ['commit', 'reserve'] + Codes d'erreur : + 2001 + + + Persister les informations d'événement + + + 7 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements +   + + + ref + Consommation par le gestionnaire de position (exécution) +   + + + 8 + Produire le message + + [Consommer le message d'abandon] + + + 9 + Consommer le message d'événement de position + + + break + + + Valider l'événement + + + + + + 10 + Valider l'événement — règle : type == 'position' && + action IN ['timeout-reserved', 'reject', 'fail'] + Codes d'erreur : + 2001 + + + Persister les informations d'événement + + + 11 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements +   + + + ref + Consommation par le gestionnaire de position (abandon) +   + + + 12 + Produire le message + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.0.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.0.plantuml new file mode 100644 index 000000000..a893dcb08 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.0.plantuml @@ -0,0 +1,115 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Rajiv Mothilal + * Miguel de Barros + -------------- + ******'/ + +@startuml +' declate title +title 1.3.0. Consommation par le gestionnaire de position (message unique) + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +collections "topic-transfer-position" as TOPIC_TRANSFER_POSITION +control "Gestionnaire de position" as POS_HANDLER +collections "Rubrique d'événements" as TOPIC_EVENTS +collections "Rubrique de notification" as TOPIC_NOTIFICATIONS + + +box "Service central" #LightYellow + participant TOPIC_TRANSFER_POSITION + participant POS_HANDLER + participant TOPIC_EVENTS + participant TOPIC_NOTIFICATIONS +end box + +' start flow +activate POS_HANDLER +group Consommation du gestionnaire de position + alt Consommer le message de préparation pour le payeur + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consommer le message d'événement de position pour le payeur + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + break + group Valider l'événement + POS_HANDLER <-> POS_HANDLER: Valider l'événement — règle : type == 'position' && action == 'prepare'\nCodes d'erreur : 2001 + end + end + group Persister les informations d'événement + ||| + POS_HANDLER -> TOPIC_EVENTS: Publier les informations d'événement + ref over POS_HANDLER, TOPIC_EVENTS : Consommation du gestionnaire d'événements\n + ||| + end + ||| + ref over POS_HANDLER: Consommation par le gestionnaire de position (préparation)\n + POS_HANDLER -> TOPIC_NOTIFICATIONS: Produire le message + else Consommer le message d'exécution pour le bénéficiaire + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consommer le message d'événement de position pour le bénéficiaire + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + break + group Valider l'événement + POS_HANDLER <-> POS_HANDLER: Valider l'événement — règle : type == 'position' && action == 'commit'\nCodes d'erreur : 2001 + end + end + group Persister les informations d'événement + ||| + POS_HANDLER -> TOPIC_EVENTS: Publier les informations d'événement + ref over POS_HANDLER, TOPIC_EVENTS : Consommation du gestionnaire d'événements\n + ||| + end + ||| + ref over POS_HANDLER: Consommation par le gestionnaire de position (exécution)\n + POS_HANDLER -> TOPIC_NOTIFICATIONS: Produire le message + else Consommer le message d'abandon + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consommer le message d'événement de position + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + break + group Valider l'événement + POS_HANDLER <-> POS_HANDLER: Valider l'événement — règle : type == 'position' &&\naction IN ['timeout-reserved', 'reject', 'fail']\nCodes d'erreur : 2001 + end + end + group Persister les informations d'événement + ||| + POS_HANDLER -> TOPIC_EVENTS: Publier les informations d'événement + ref over POS_HANDLER, TOPIC_EVENTS : Consommation du gestionnaire d'événements\n + ||| + end + ||| + ref over POS_HANDLER: Consommation par le gestionnaire de position (abandon)\n + POS_HANDLER -> TOPIC_NOTIFICATIONS: Produire le message + end + +end +deactivate POS_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.0.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.0.svg new file mode 100644 index 000000000..b2ff14f38 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.0.svg @@ -0,0 +1,188 @@ + + 1.3.0. Consommation par le gestionnaire de position (message unique) + + + 1.3.0. Consommation par le gestionnaire de position (message unique) + + Service central + + + + + + + + + + + + + + + + + + + + + + topic-transfer-position + + + topic-transfer-position + Gestionnaire de position + + + Gestionnaire de position + + + + + Rubrique d'événements + + + Rubrique d'événements + + + Rubrique de notification + + + Rubrique de notification + + + + + + + Consommation du gestionnaire de position + + + alt + [Consommer le message de préparation pour le payeur] + + + 1 + Consommer le message d'événement de position pour le payeur + + + break + + + Valider l'événement + + + + + + 2 + Valider l'événement — règle : type == 'position' && action == 'prepare' + Codes d'erreur : + 2001 + + + Persister les informations d'événement + + + 3 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements +   + + + ref + Consommation par le gestionnaire de position (préparation) +   + + + 4 + Produire le message + + [Consommer le message d'exécution pour le bénéficiaire] + + + 5 + Consommer le message d'événement de position pour le bénéficiaire + + + break + + + Valider l'événement + + + + + + 6 + Valider l'événement — règle : type == 'position' && action == 'commit' + Codes d'erreur : + 2001 + + + Persister les informations d'événement + + + 7 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements +   + + + ref + Consommation par le gestionnaire de position (exécution) +   + + + 8 + Produire le message + + [Consommer le message d'abandon] + + + 9 + Consommer le message d'événement de position + + + break + + + Valider l'événement + + + + + + 10 + Valider l'événement — règle : type == 'position' && + action IN ['timeout-reserved', 'reject', 'fail'] + Codes d'erreur : + 2001 + + + Persister les informations d'événement + + + 11 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements +   + + + ref + Consommation par le gestionnaire de position (abandon) +   + + + 12 + Produire le message + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare.plantuml new file mode 100644 index 000000000..64c2efcb5 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare.plantuml @@ -0,0 +1,283 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Rajiv Mothilal + * Miguel de Barros + -------------- + ******'/ + +@startuml +' declate title +title 1.3.1. Consommation par le gestionnaire de position (préparation) + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistence Store + +' declare actors +control "Gestionnaire de position" as POS_HANDLER + +entity "Façade de gestion\nde position" as POS_MGMT +collections "Rubrique de notification" as TOPIC_NOTIFICATIONS +entity "DAO de position" as POS_DAO +database "Stockage central" as DB + +box "Service central" #LightYellow + participant POS_HANDLER + participant TOPIC_NOTIFICATIONS + participant POS_MGMT + participant POS_DAO + participant DB +end box + +' start flow +activate POS_HANDLER +group Consommation par le gestionnaire de position (préparation) + POS_HANDLER -> POS_MGMT: Demander le traitement des transferts + activate POS_MGMT + POS_MGMT -> POS_MGMT: Vérifier le 1er transfert pour sélectionner le participant et la devise + group TRANSACTION BD + ' Transaction BD : C'est ici que débuterait la 1re transaction BD dans le futur modèle à 2 transactions BD pour la mise à l'échelle horizontale + POS_MGMT -> POS_MGMT: Parcourir le lot et construire la liste des transferIds et calculer sumTransfersInBatch,\nen vérifiant que tous les éléments du lot concernent le bon participant et la bonne devise\nCode d'erreur : 2001, 3100 + POS_MGMT -> DB: Récupérer l'état actuel de tous les transferts du tableau depuis la BD avec select whereIn\n(Info : le modèle à 2 transactions BD doit ajouter une mini-étape d'état ici (RECEIVED_PREPARE => RECEIVED_PREPARE_PROCESSING) pour ne pas toucher aux transferts si le traitement a commencé) + activate DB + hnote over DB #lightyellow + transferStateChange + transferParticipant + end note + DB --> POS_MGMT: Renvoyer l'état actuel de tous les transferts sélectionnés depuis la BD + deactivate DB + POS_MGMT <-> POS_MGMT: Valider l'état actuel (transferStateChange.transferStateId == 'RECEIVED_PREPARE')\nCode d'erreur : 2001 pour les transferts en échec\nLe lot n'est pas rejeté dans son ensemble. + + note right of POS_MGMT #lightgray + Liste des transferts utilisés lors du traitement + **reservedTransfers** est la liste des transferts à traiter dans le lot + **abortedTransfers** est la liste des transferts dans un état incorrect avant le traitement. Actuellement, transferStateChange est défini à ABORTED — cela ne doit être fait que si l'état final n'est pas déjà atteint (idempotence) + **processedTransfers** est la liste des transferts ayant traversé l'algorithme de gestion des positions. Les transferts réussis et échoués apparaissent ici car l'ordre et la "position courante" de chacun sont nécessaires pour la réconciliation + + Valeurs scalaires intermédiaires utilisées dans l'algorithme + **transferAmount** = payload.amount.amount + **sumTransfersInBatch** = SOMME des montants de chaque transfert du lot + **currentPosition** = participantPosition.value + **reservedPosition** = participantPosition.{original}reservedValue + **effectivePosition** = currentPosition + reservedPosition + **heldPosition** = effectivePosition + sumTransfersInBatch + **availablePosition** = //si le délai du modèle de règlement est IMMÉDIAT :// settlementBalance + participantLimit(NetDebitCap) - effectivePosition, //sinon :// participantLimit(NetDebitCap) - effectivePosition + **sumReserved** = SOMME des transferts ayant satisfait les critères de règle et traités + end note + note over POS_MGMT,DB + Réserver la somme des transferts valides du lot par rapport à la position du participant dans la devise de ce lot + et calculer la position disponible pour le participant + end note + POS_MGMT -> DB: Sélectionner effectivePosition FOR UPDATE depuis la BD pour le payeur + activate DB + hnote over DB #lightyellow + participantPosition + end note + DB --> POS_MGMT: Renvoyer effectivePosition (currentPosition et reservedPosition) depuis la BD pour le payeur + deactivate DB + POS_MGMT -> POS_MGMT: Incrémenter reservedValue vers heldPosition\n(reservedValue = reservedPosition + sumTransfersInBatch) + POS_MGMT -> DB: Persister reservedValue + activate DB + hnote over DB #lightyellow + UPDATE **participantPosition** + SET reservedValue += sumTransfersInBatch + end note + deactivate DB + ' Transaction BD : C'est ici que se terminerait la 1re transaction BD dans le futur modèle à 2 transactions BD pour la mise à l'échelle horizontale + + + POS_MGMT -> DB: Demander les limites de position du participant payeur + activate DB + hnote over DB #lightyellow + FROM **participantLimit** + WHERE participantLimit.limitTypeId = 'NET-DEBIT-CAP' + AND participantLimit.participantId = payload.payerFsp + AND participantLimit.currencyId = payload.amount.currency + end note + DB --> POS_MGMT: Renvoyer les limites de position + deactivate DB + POS_MGMT <-> POS_MGMT: **availablePosition** = //si le délai du modèle de règlement est IMMÉDIAT ://\n settlementBalance + participantLimit(NetDebitCap) - effectivePosition\n //sinon ://\n participantLimit(NetDebitCap) - effectivePosition\n(équivalent à = (settlementBalance?) + netDebitCap - currentPosition - reservedPosition) + note over POS_MGMT,DB + Pour chaque transfert du lot, valider la disponibilité de la position pour couvrir le montant du transfert + conformément à l'algorithme de position documenté ci-dessous + end note + POS_MGMT <-> POS_MGMT: Valider availablePosition pour chaque transfert (voir algorithme ci-dessous)\nCode d'erreur : 4001 + note right of POS_MGMT #lightgray + 01: sumReserved = 0 // Enregistrer la somme des transferts autorisés à progresser vers RESERVED + 02: sumProcessed = 0 // Enregistrer la somme des transferts déjà traités dans ce lot + 03: processedTransfers = {} // La liste des transferts traités — pour stocker les informations supplémentaires liées à la décision. En particulier la position "courante" + 04: pour chaque transfert dans reservedTransfers + 05: sumProcessed += transfer.amount // le total traité jusqu'ici **(À METTRE À JOUR DANS LE CODE)** + 06: si availablePosition >= transfer.amount + 07: transfer.state = "RESERVED" + 08: availablePosition -= preparedTransfer.amount + 09: sumRESERVED += preparedTransfer.amount + 10: sinon + 11: preparedTransfer.state = "ABORTED" + 12: preparedTransfer.reason = "Plafond de débit net dépassé par cette demande, veuillez réessayer ultérieurement" + 13: fin si + 14: runningPosition = currentPosition + sumReserved // la valeur initiale de la position du participant plus la valeur totale acceptée dans le lot jusqu'ici + 15: runningReservedValue = sumTransfersInBatch - sumProcessed + reservedPosition **(À METTRE À JOUR DANS LE CODE)** // la réduction progressive de la valeur réservée totale au début du lot. + 16: Ajouter le transfert à la liste processedTransfer en enregistrant l'état et les positions courantes { transferState, transfer, rawMessage, transferAmount, runningPosition, runningReservedValue } + 16: fin pour + end note + note over POS_MGMT,DB + Une fois le résultat de tous les transferts connu, mettre à jour la position du participant et retirer le montant réservé associé au lot + (S'il existe des seuils d'alarme, les traiter en renvoyant les limites dont le seuil a été franchi) + Effectuer une insertion groupée des transferStateChanges liés au traitement, en utilisant le résultat pour compléter participantPositionChange et l'insérer en lot afin de persister la position courante + end note + POS_MGMT->POS_MGMT: Évaluer les seuils de limite sur la position finale\nen les ajoutant à la liste d'alarmes si déclenchés + + ' Transaction BD : C'est ici que débuterait la 2e transaction BD dans le futur modèle à 2 transactions BD pour la mise à l'échelle horizontale + POS_MGMT->DB: Persister la dernière **valeur** et **reservedValue** en BD pour le payeur + hnote over DB #lightyellow + UPDATE **participantPosition** + SET value += sumRESERVED, + reservedValue -= sumTransfersInBatch + end note + activate DB + deactivate DB + + POS_MGMT -> DB: Persister en lot les transferStateChange pour tous les processedTransfers + hnote over DB #lightyellow + batch INSERT **transferStateChange** + select for update from transfer table where transferId in ([transferBatch.transferId,...]) + build list of transferStateChanges from transferBatch + + end note + activate DB + deactivate DB + + POS_MGMT->POS_MGMT: Remplir batchParticipantPositionChange à partir du transferStateChange résultant et de la liste processedTransfer précédente + + note right of POS_MGMT #lightgray + En pratique : + SET transferStateChangeId = processedTransfer.transferStateChangeId, + participantPositionId = preparedTransfer.participantPositionId, + value = preparedTransfer.positionValue, + reservedValue = preparedTransfer.positionReservedValue + end note + POS_MGMT -> DB: Persister en lot le changement de position du participant pour tous les processedTransfers + hnote over DB #lightyellow + batch INSERT **participantPositionChange** + end note + activate DB + deactivate DB + ' Transaction BD : C'est ici que se terminerait la 2e transaction BD dans le futur modèle à 2 transactions BD pour la mise à l'échelle horizontale + end + POS_MGMT --> POS_HANDLER: Renvoyer une map des transferIds et leurs transferStateChanges + deactivate POS_MGMT + alt Calcul et validation dernière position préparation (succès) + note right of POS_HANDLER #yellow + Message : + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: transfer, + action: prepare, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + POS_HANDLER -> TOPIC_NOTIFICATIONS: Publier l'événement de notification\nCode d'erreur : 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + else Calcul et validation dernière position préparation (échec) + note right of POS_HANDLER #red: Échec de validation ! + + group Persister l'état du transfert (transferState='ABORTED' si contrôle de position échoué) + POS_HANDLER -> POS_DAO: Demande de persister le transfert\nCode d'erreur : 2003 + activate POS_DAO + note right of POS_HANDLER #lightgray + transferStateChange.state = "ABORTED", + transferStateChange.reason = "Net Debit Cap exceeded by this request at this time, please try again later" + end note + POS_DAO -> DB: Persister l'état du transfert + hnote over DB #lightyellow + transferStateChange + end note + activate DB + deactivate DB + POS_DAO --> POS_HANDLER: Renvoyer le succès + deactivate POS_DAO + end + + note right of POS_HANDLER #yellow + Message : + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": 4001, + "errorDescription": "Payer FSP insufficient liquidity", + "extensionList": + } + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: prepare, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + POS_HANDLER -> TOPIC_NOTIFICATIONS: Publier l'événement de notification (échec) pour le payeur\nCode d'erreur : 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + deactivate POS_HANDLER + end +end +deactivate POS_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare.svg new file mode 100644 index 000000000..a58d35f6c --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare.svg @@ -0,0 +1,408 @@ + + 1.3.1. Consommation par le gestionnaire de position (préparation) + + + 1.3.1. Consommation par le gestionnaire de position (préparation) + + Service central + + + + + + + + + + + + + + + + + + + + + + + Gestionnaire de position + + + Gestionnaire de position + + + + + Rubrique de notification + + + Rubrique de notification + Façade de gestion + de position + + + Façade de gestion + de position + + + DAO de position + + + DAO de position + + + Stockage central + + + Stockage central + + + + + + + + + + + + + + + + + + Consommation par le gestionnaire de position (préparation) + + + 1 + Demander le traitement des transferts + + + + + 2 + Vérifier le 1er transfert pour sélectionner le participant et la devise + + + TRANSACTION BD + + + + + 3 + Parcourir le lot et construire la liste des transferIds et calculer sumTransfersInBatch, + en vérifiant que tous les éléments du lot concernent le bon participant et la bonne devise + Code d'erreur : + 2001, 3100 + + + 4 + Récupérer l'état actuel de tous les transferts du tableau depuis la BD avec select whereIn + (Info : le modèle à 2 transactions BD doit ajouter une mini-étape d'état ici (RECEIVED_PREPARE => RECEIVED_PREPARE_PROCESSING) pour ne pas toucher aux transferts si le traitement a commencé) + + transferStateChange + transferParticipant + + + 5 + Renvoyer l'état actuel de tous les transferts sélectionnés depuis la BD + + + + + + 6 + Valider l'état actuel (transferStateChange.transferStateId == 'RECEIVED_PREPARE') + Code d'erreur : + 2001 + pour les transferts en échec + Le lot n'est pas rejeté dans son ensemble. + + + Liste des transferts utilisés lors du traitement + reservedTransfers + est la liste des transferts à traiter dans le lot + abortedTransfers + est la liste des transferts dans un état incorrect avant le traitement. Actuellement, transferStateChange est défini à ABORTED — cela ne doit être fait que si l'état final n'est pas déjà atteint (idempotence) + processedTransfers + est la liste des transferts ayant traversé l'algorithme de gestion des positions. Les transferts réussis et échoués apparaissent ici car l'ordre et la "position courante" de chacun sont nécessaires pour la réconciliation +   + Valeurs scalaires intermédiaires utilisées dans l'algorithme + transferAmount + = payload.amount.amount + sumTransfersInBatch + = SOMME des montants de chaque transfert du lot + currentPosition + = participantPosition.value + reservedPosition + = participantPosition.{original}reservedValue + effectivePosition + = currentPosition + reservedPosition + heldPosition + = effectivePosition + sumTransfersInBatch + availablePosition + = + si le délai du modèle de règlement est IMMÉDIAT : + settlementBalance + participantLimit(NetDebitCap) - effectivePosition, + sinon : + participantLimit(NetDebitCap) - effectivePosition + sumReserved + = SOMME des transferts ayant satisfait les critères de règle et traités + + + Réserver la somme des transferts valides du lot par rapport à la position du participant dans la devise de ce lot + et calculer la position disponible pour le participant + + + 7 + Sélectionner effectivePosition FOR UPDATE depuis la BD pour le payeur + + participantPosition + + + 8 + Renvoyer effectivePosition (currentPosition et reservedPosition) depuis la BD pour le payeur + + + + + 9 + Incrémenter reservedValue vers heldPosition + (reservedValue = reservedPosition + sumTransfersInBatch) + + + 10 + Persister reservedValue + + UPDATE + participantPosition + SET reservedValue += sumTransfersInBatch + + + 11 + Demander les limites de position du participant payeur + + FROM + participantLimit + WHERE participantLimit.limitTypeId = 'NET-DEBIT-CAP' + AND participantLimit.participantId = payload.payerFsp + AND participantLimit.currencyId = payload.amount.currency + + + 12 + Renvoyer les limites de position + + + + + + 13 + availablePosition + = + si le délai du modèle de règlement est IMMÉDIAT : + settlementBalance + participantLimit(NetDebitCap) - effectivePosition +   + sinon : + participantLimit(NetDebitCap) - effectivePosition + (équivalent à = (settlementBalance?) + netDebitCap - currentPosition - reservedPosition) + + + Pour chaque transfert du lot, valider la disponibilité de la position pour couvrir le montant du transfert + conformément à l'algorithme de position documenté ci-dessous + + + + + + 14 + Valider availablePosition pour chaque transfert (voir algorithme ci-dessous) + Code d'erreur : + 4001 + + + 01: sumReserved = 0 // Enregistrer la somme des transferts autorisés à progresser vers RESERVED + 02: sumProcessed = 0 // Enregistrer la somme des transferts déjà traités dans ce lot + 03: processedTransfers = {} // La liste des transferts traités — pour stocker les informations supplémentaires liées à la décision. En particulier la position "courante" + 04: pour chaque transfert dans reservedTransfers + 05: sumProcessed += transfer.amount // le total traité jusqu'ici + (À METTRE À JOUR DANS LE CODE) + 06: si availablePosition >= transfer.amount + 07: transfer.state = "RESERVED" + 08: availablePosition -= preparedTransfer.amount + 09: sumRESERVED += preparedTransfer.amount + 10: sinon + 11: preparedTransfer.state = "ABORTED" + 12: preparedTransfer.reason = "Plafond de débit net dépassé par cette demande, veuillez réessayer ultérieurement" + 13: fin si + 14: runningPosition = currentPosition + sumReserved // la valeur initiale de la position du participant plus la valeur totale acceptée dans le lot jusqu'ici + 15: runningReservedValue = sumTransfersInBatch - sumProcessed + reservedPosition + (À METTRE À JOUR DANS LE CODE) + // la réduction progressive de la valeur réservée totale au début du lot. + 16: Ajouter le transfert à la liste processedTransfer en enregistrant l'état et les positions courantes { transferState, transfer, rawMessage, transferAmount, runningPosition, runningReservedValue } + 16: fin pour + + + Une fois le résultat de tous les transferts connu, mettre à jour la position du participant et retirer le montant réservé associé au lot + (S'il existe des seuils d'alarme, les traiter en renvoyant les limites dont le seuil a été franchi) + Effectuer une insertion groupée des transferStateChanges liés au traitement, en utilisant le résultat pour compléter participantPositionChange et l'insérer en lot afin de persister la position courante + + + + + 15 + Évaluer les seuils de limite sur la position finale + en les ajoutant à la liste d'alarmes si déclenchés + + + 16 + Persister la dernière + valeur + et + reservedValue + en BD pour le payeur + + UPDATE + participantPosition + SET value += sumRESERVED, + reservedValue -= sumTransfersInBatch + + + 17 + Persister en lot les transferStateChange pour tous les processedTransfers + + batch INSERT + transferStateChange + select for update from transfer table where transferId in ([transferBatch.transferId,...]) + build list of transferStateChanges from transferBatch +   + + + + + 18 + Remplir batchParticipantPositionChange à partir du transferStateChange résultant et de la liste processedTransfer précédente + + + En pratique : + SET transferStateChangeId = processedTransfer.transferStateChangeId, + participantPositionId = preparedTransfer.participantPositionId, + value = preparedTransfer.positionValue, + reservedValue = preparedTransfer.positionReservedValue + + + 19 + Persister en lot le changement de position du participant pour tous les processedTransfers + + batch INSERT + participantPositionChange + + + 20 + Renvoyer une map des transferIds et leurs transferStateChanges + + + alt + [Calcul et validation dernière position préparation (succès)] + + + Message : + { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: transfer, + action: prepare, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 21 + Publier l'événement de notification + Code d'erreur : + 2003 + + [Calcul et validation dernière position préparation (échec)] + + + Échec de validation ! + + + Persister l'état du transfert (transferState='ABORTED' si contrôle de position échoué) + + + 22 + Demande de persister le transfert + Code d'erreur : + 2003 + + + transferStateChange.state = "ABORTED", + transferStateChange.reason = "Net Debit Cap exceeded by this request at this time, please try again later" + + + 23 + Persister l'état du transfert + + transferStateChange + + + 24 + Renvoyer le succès + + + Message : + { + id: <transferMessage.transferId> + from: <ledgerName>, + to: <transferMessage.payerFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": 4001, + "errorDescription": "Payer FSP insufficient liquidity", + "extensionList": <transferMessage.extensionList> + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: prepare, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 25 + Publier l'événement de notification (échec) pour le payeur + Code d'erreur : + 2003 + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1.plantuml new file mode 100644 index 000000000..2ce4dd167 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1.plantuml @@ -0,0 +1,141 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Rajiv Mothilal + * Miguel de Barros + * Valentin Genev + -------------- + ******'/ + +@startuml +' declate title +title 1.3.2. Consommation par le gestionnaire de position (exécution) v1.1 + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistence Store + +' declare actors +control "Gestionnaire de position" as POS_HANDLER +collections "Notifications-Topic" as TOPIC_NOTIFICATIONS +entity "Façade de position" as POS_FACADE +entity "DAO de position" as POS_DAO +database "Stockage central" as DB + +box "Service central" #LightYellow + participant POS_HANDLER + participant TOPIC_NOTIFICATIONS + participant POS_DAO + participant POS_FACADE + participant DB +end box + +' start flow +activate POS_HANDLER +group Consommation par le gestionnaire de position (exécution) + POS_HANDLER -> POS_DAO: Demander l'état actuel du transfert depuis la BD \nCode d'erreur : 2003 + activate POS_DAO + POS_DAO -> DB: Récupérer l'état actuel du transfert depuis la BD + activate DB + hnote over DB #lightyellow + transferStateChange + transferParticipant + end note + DB --> POS_DAO: Renvoyer l'état actuel du transfert depuis la BD + deactivate DB + POS_DAO --> POS_HANDLER: Renvoyer l'état actuel du transfert depuis la BD + deactivate POS_DAO + POS_HANDLER <-> POS_HANDLER: Valider l'état actuel (transferState est 'RECEIVED-FULFIL')\nCode d'erreur : 2001 + group Persister le changement de position et l'état du transfert (transferState='COMMITTED' si contrôle de position réussi) + POS_HANDLER -> POS_FACADE: Demande de persister la dernière position et l'état en BD\nCode d'erreur : 2003 + group TRANSACTION BD + activate POS_FACADE + POS_FACADE -> DB: Sélectionner participantPosition.value FOR UPDATE en BD pour le bénéficiaire + activate DB + hnote over DB #lightyellow + participantPosition + end note + DB --> POS_FACADE: Renvoyer participantPosition.value depuis la BD pour le bénéficiaire + deactivate DB + POS_FACADE <-> POS_FACADE: **latestPosition** = participantPosition.value - payload.amount.amount + POS_FACADE->DB: Persister latestPosition en BD pour le bénéficiaire + hnote over DB #lightyellow + UPDATE **participantPosition** + SET value = latestPosition + end note + activate DB + deactivate DB + POS_FACADE -> DB: Persister l'état du transfert et le changement de position du participant + hnote over DB #lightyellow + INSERT **transferStateChange** transferStateId = 'COMMITTED' + + INSERT **participantPositionChange** + SET participantPositionId = participantPosition.participantPositionId, + transferStateChangeId = transferStateChange.transferStateChangeId, + value = latestPosition, + reservedValue = participantPosition.reservedValue + createdDate = new Date() + end note + activate DB + deactivate DB + deactivate POS_DAO + end + POS_FACADE --> POS_HANDLER: Renvoyer le succès + deactivate POS_FACADE + end + + note right of POS_HANDLER #yellow + Message : + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: transfer, + action: commit || reserve, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + POS_HANDLER -> TOPIC_NOTIFICATIONS: Publier l'événement de transfert\nCode d'erreur : 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS +end +deactivate POS_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1.svg new file mode 100644 index 000000000..0a6b23c4e --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1.svg @@ -0,0 +1,186 @@ + + 1.3.2. Consommation par le gestionnaire de position (exécution) v1.1 + + + 1.3.2. Consommation par le gestionnaire de position (exécution) v1.1 + + Service central + + + + + + + + + + + + + + + + + Gestionnaire de position + + + Gestionnaire de position + + + + + Notifications-Topic + + + Notifications-Topic + DAO de position + + + DAO de position + + + Façade de position + + + Façade de position + + + Stockage central + + + Stockage central + + + + + + + + + + + + + Consommation par le gestionnaire de position (exécution) + + + 1 + Demander l'état actuel du transfert depuis la BD + Code d'erreur : + 2003 + + + 2 + Récupérer l'état actuel du transfert depuis la BD + + transferStateChange + transferParticipant + + + 3 + Renvoyer l'état actuel du transfert depuis la BD + + + 4 + Renvoyer l'état actuel du transfert depuis la BD + + + + + + 5 + Valider l'état actuel (transferState est 'RECEIVED-FULFIL') + Code d'erreur : + 2001 + + + Persister le changement de position et l'état du transfert (transferState='COMMITTED' si contrôle de position réussi) + + + 6 + Demande de persister la dernière position et l'état en BD + Code d'erreur : + 2003 + + + TRANSACTION BD + + + 7 + Sélectionner participantPosition.value FOR UPDATE en BD pour le bénéficiaire + + participantPosition + + + 8 + Renvoyer participantPosition.value depuis la BD pour le bénéficiaire + + + + + + 9 + latestPosition + = participantPosition.value - payload.amount.amount + + + 10 + Persister latestPosition en BD pour le bénéficiaire + + UPDATE + participantPosition + SET value = latestPosition + + + 11 + Persister l'état du transfert et le changement de position du participant + + INSERT + transferStateChange + transferStateId = 'COMMITTED' +   + INSERT + participantPositionChange + SET participantPositionId = participantPosition.participantPositionId, + transferStateChangeId = transferStateChange.transferStateChangeId, + value = latestPosition, + reservedValue = participantPosition.reservedValue + createdDate = new Date() + + + 12 + Renvoyer le succès + + + Message : + { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: transfer, + action: commit || reserve, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 13 + Publier l'événement de transfert + Code d'erreur : + 2003 + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil.plantuml new file mode 100644 index 000000000..a627ab88c --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil.plantuml @@ -0,0 +1,140 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Rajiv Mothilal + * Miguel de Barros + -------------- + ******'/ + +@startuml +' declate title +title 1.3.2. Consommation par le gestionnaire de position (exécution) + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistence Store + +' declare actors +control "Gestionnaire de position" as POS_HANDLER +collections "Notifications-Topic" as TOPIC_NOTIFICATIONS +entity "Façade de position" as POS_FACADE +entity "DAO de position" as POS_DAO +database "Stockage central" as DB + +box "Service central" #LightYellow + participant POS_HANDLER + participant TOPIC_NOTIFICATIONS + participant POS_DAO + participant POS_FACADE + participant DB +end box + +' start flow +activate POS_HANDLER +group Consommation par le gestionnaire de position (exécution) + POS_HANDLER -> POS_DAO: Demander l'état actuel du transfert depuis la BD \nCode d'erreur : 2003 + activate POS_DAO + POS_DAO -> DB: Récupérer l'état actuel du transfert depuis la BD + activate DB + hnote over DB #lightyellow + transferStateChange + transferParticipant + end note + DB --> POS_DAO: Renvoyer l'état actuel du transfert depuis la BD + deactivate DB + POS_DAO --> POS_HANDLER: Renvoyer l'état actuel du transfert depuis la BD + deactivate POS_DAO + POS_HANDLER <-> POS_HANDLER: Valider l'état actuel (transferState est 'RECEIVED-FULFIL')\nCode d'erreur : 2001 + group Persister le changement de position et l'état du transfert (transferState='COMMITTED' si contrôle de position réussi) + POS_HANDLER -> POS_FACADE: Demande de persister la dernière position et l'état en BD\nCode d'erreur : 2003 + group TRANSACTION BD + activate POS_FACADE + POS_FACADE -> DB: Sélectionner participantPosition.value FOR UPDATE en BD pour le bénéficiaire + activate DB + hnote over DB #lightyellow + participantPosition + end note + DB --> POS_FACADE: Renvoyer participantPosition.value depuis la BD pour le bénéficiaire + deactivate DB + POS_FACADE <-> POS_FACADE: **latestPosition** = participantPosition.value - payload.amount.amount + POS_FACADE->DB: Persister latestPosition en BD pour le bénéficiaire + hnote over DB #lightyellow + UPDATE **participantPosition** + SET value = latestPosition + end note + activate DB + deactivate DB + POS_FACADE -> DB: Persister l'état du transfert et le changement de position du participant + hnote over DB #lightyellow + INSERT **transferStateChange** transferStateId = 'COMMITTED' + + INSERT **participantPositionChange** + SET participantPositionId = participantPosition.participantPositionId, + transferStateChangeId = transferStateChange.transferStateChangeId, + value = latestPosition, + reservedValue = participantPosition.reservedValue + createdDate = new Date() + end note + activate DB + deactivate DB + deactivate POS_DAO + end + POS_FACADE --> POS_HANDLER: Renvoyer le succès + deactivate POS_FACADE + end + + note right of POS_HANDLER #yellow + Message : + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: transfer, + action: commit, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + POS_HANDLER -> TOPIC_NOTIFICATIONS: Publier l'événement de transfert\nCode d'erreur : 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS +end +deactivate POS_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil.svg new file mode 100644 index 000000000..6ff1b866a --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil.svg @@ -0,0 +1,186 @@ + + 1.3.2. Consommation par le gestionnaire de position (exécution) + + + 1.3.2. Consommation par le gestionnaire de position (exécution) + + Service central + + + + + + + + + + + + + + + + + Gestionnaire de position + + + Gestionnaire de position + + + + + Notifications-Topic + + + Notifications-Topic + DAO de position + + + DAO de position + + + Façade de position + + + Façade de position + + + Stockage central + + + Stockage central + + + + + + + + + + + + + Consommation par le gestionnaire de position (exécution) + + + 1 + Demander l'état actuel du transfert depuis la BD + Code d'erreur : + 2003 + + + 2 + Récupérer l'état actuel du transfert depuis la BD + + transferStateChange + transferParticipant + + + 3 + Renvoyer l'état actuel du transfert depuis la BD + + + 4 + Renvoyer l'état actuel du transfert depuis la BD + + + + + + 5 + Valider l'état actuel (transferState est 'RECEIVED-FULFIL') + Code d'erreur : + 2001 + + + Persister le changement de position et l'état du transfert (transferState='COMMITTED' si contrôle de position réussi) + + + 6 + Demande de persister la dernière position et l'état en BD + Code d'erreur : + 2003 + + + TRANSACTION BD + + + 7 + Sélectionner participantPosition.value FOR UPDATE en BD pour le bénéficiaire + + participantPosition + + + 8 + Renvoyer participantPosition.value depuis la BD pour le bénéficiaire + + + + + + 9 + latestPosition + = participantPosition.value - payload.amount.amount + + + 10 + Persister latestPosition en BD pour le bénéficiaire + + UPDATE + participantPosition + SET value = latestPosition + + + 11 + Persister l'état du transfert et le changement de position du participant + + INSERT + transferStateChange + transferStateId = 'COMMITTED' +   + INSERT + participantPositionChange + SET participantPositionId = participantPosition.participantPositionId, + transferStateChangeId = transferStateChange.transferStateChangeId, + value = latestPosition, + reservedValue = participantPosition.reservedValue + createdDate = new Date() + + + 12 + Renvoyer le succès + + + Message : + { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: transfer, + action: commit, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 13 + Publier l'événement de transfert + Code d'erreur : + 2003 + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort.plantuml new file mode 100644 index 000000000..3bf61a258 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort.plantuml @@ -0,0 +1,306 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Rajiv Mothilal + * Georgi Georgiev + * Sam Kummary + ------------- + ******'/ + +@startuml +' declate title +title 1.3.3. Consommation par le gestionnaire de position (abandon) + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistence Store + +' declare actors +control "Gestionnaire de position" as POS_HANDLER +entity "DAO de position" as POS_DAO +collections "Rubrique de notification" as TOPIC_NOTIFICATIONS +database "Stockage central" as DB + +box "Service central" #LightYellow + participant POS_HANDLER + participant TOPIC_NOTIFICATIONS + participant POS_DAO + participant DB +end box + +' start flow +activate POS_HANDLER +group Consommation par le gestionnaire de position (abandon) + opt type == 'position' && action == 'timeout-reserved' + POS_HANDLER -> POS_DAO: Demander l'état actuel du transfert depuis la BD\nCode d'erreur : 2003 + activate POS_DAO + POS_DAO -> DB: Récupérer l'état actuel du transfert depuis la BD + activate DB + hnote over DB #lightyellow + transferStateChange + transferParticipant + end note + DB --> POS_DAO: Renvoyer l'état actuel du transfert depuis la BD + deactivate DB + POS_DAO --> POS_HANDLER: Renvoyer l'état actuel du transfert depuis la BD + deactivate POS_DAO + POS_HANDLER <-> POS_HANDLER: Valider l'état actuel (transferStateChange.transferStateId == 'RESERVED_TIMEOUT')\nCode d'erreur : 2001 + + group Persister le changement de position et l'état du transfert + POS_HANDLER -> POS_HANDLER: **transferStateId** = 'EXPIRED_RESERVED' + POS_HANDLER -> POS_DAO: Demande de persister la dernière position et l'état en BD\nCode d'erreur : 2003 + group IMPLÉMENTATION TRANSACTION BD + activate POS_DAO + POS_DAO -> DB: Sélectionner participantPosition.value FOR UPDATE pour payerCurrencyId + activate DB + hnote over DB #lightyellow + participantPosition + end note + DB --> POS_DAO: Renvoyer participantPosition + deactivate DB + POS_DAO <-> POS_DAO: **latestPosition** = participantPosition - payload.amount.amount + POS_DAO->DB: Persister latestPosition en BD pour le payeur + hnote over DB #lightyellow + UPDATE **participantPosition** + SET value = latestPosition + end note + activate DB + deactivate DB + POS_DAO -> DB: Persister le changement de position du participant et le changement d'état + hnote over DB #lightyellow + INSERT **transferStateChange** + VALUES (transferStateId) + + INSERT **participantPositionChange** + SET participantPositionId = participantPosition.participantPositionId, + transferStateChangeId = transferStateChange.transferStateChangeId, + value = latestPosition, + reservedValue = participantPosition.reservedValue + createdDate = new Date() + end note + activate DB + deactivate DB + end + POS_DAO --> POS_HANDLER: Renvoyer le succès + deactivate POS_DAO + end + note right of POS_HANDLER #yellow + Message : { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": 3300, + "errorDescription": "Transfert expiré", + "extensionList": + } + } + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: abort, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + POS_HANDLER -> TOPIC_NOTIFICATIONS: Publier l'événement de notification\nCode d'erreur : 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end + opt type == 'position' && (action IN ['reject', 'abort']) + POS_HANDLER -> POS_DAO: Demander l'état actuel du transfert depuis la BD\nCode d'erreur : 2003 + activate POS_DAO + POS_DAO -> DB: Récupérer l'état actuel du transfert depuis la BD + activate DB + hnote over DB #lightyellow + transferStateChange + end note + DB --> POS_DAO: Renvoyer l'état actuel du transfert depuis la BD + deactivate DB + POS_DAO --> POS_HANDLER: Renvoyer l'état actuel du transfert depuis la BD + deactivate POS_DAO + POS_HANDLER <-> POS_HANDLER: Valider l'état actuel (transferStateChange.transferStateId IN ['RECEIVED_REJECT', 'RECEIVED_ERROR'])\nCode d'erreur : 2001 + + group Persister le changement de position et l'état du transfert + POS_HANDLER -> POS_HANDLER: **transferStateId** = (action == 'reject' ? 'ABORTED_REJECTED' : 'ABORTED_ERROR' ) + POS_HANDLER -> POS_DAO: Demande de persister la dernière position et l'état en BD\nCode d'erreur : 2003 + group Voir IMPLÉMENTATION TRANSACTION BD ci-dessus + activate POS_DAO + POS_DAO -> DB: Persister en base de données + activate DB + deactivate DB + hnote over DB #lightyellow + participantPosition + transferStateChange + participantPositionChange + end note + end + POS_DAO --> POS_HANDLER: Renvoyer le succès + deactivate POS_DAO + end + alt action == 'reject' + note right of POS_HANDLER #yellow + Message : { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: reject, + createdAt: , + state: { + status: "success", + code: 0, + description: "action successful" + } + } + } + } + end note + else action == 'abort' + note right of POS_HANDLER #yellow + Message : { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: abort, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + end + POS_HANDLER -> TOPIC_NOTIFICATIONS: Publier l'événement de notification\nCode d'erreur : 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end + + ' TODO: Nous ne voyons pas comment ce scénario pourrait être déclenché + opt type == 'position' && action == 'fail' (Impossible de déclencher ce scénario actuellement) + POS_HANDLER -> POS_DAO: Demander l'état actuel du transfert depuis la BD\nCode d'erreur : 2003 + activate POS_DAO + POS_DAO -> DB: Récupérer l'état actuel du transfert depuis la BD + activate DB + hnote over DB #lightyellow + transferStateChange + end note + DB --> POS_DAO: Renvoyer l'état actuel du transfert depuis la BD + deactivate DB + POS_DAO --> POS_HANDLER: Renvoyer l'état actuel du transfert depuis la BD + deactivate POS_DAO + POS_HANDLER <-> POS_HANDLER: Valider l'état actuel (transferStateChange.transferStateId == 'FAILED') + + group Persister le changement de position et l'état du transfert + POS_HANDLER -> POS_HANDLER: **transferStateId** = 'FAILED' + POS_HANDLER -> POS_DAO: Demande de persister la dernière position et l'état en BD\nCode d'erreur : 2003 + group Voir IMPLÉMENTATION TRANSACTION BD ci-dessus + activate POS_DAO + POS_DAO -> DB: Persister en base de données + activate DB + deactivate DB + hnote over DB #lightyellow + participantPosition + transferStateChange + participantPositionChange + end note + end + POS_DAO --> POS_HANDLER: Renvoyer le succès + deactivate POS_DAO + end + note right of POS_HANDLER #yellow + Message : { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": 3100, + "errorDescription": "Transfert échoué", + "extensionList": + } + } + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: abort, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + POS_HANDLER -> TOPIC_NOTIFICATIONS: Publier l'événement de notification\nCode d'erreur : 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end +end +deactivate POS_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort.svg new file mode 100644 index 000000000..39a5759aa --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort.svg @@ -0,0 +1,457 @@ + + 1.3.3. Consommation par le gestionnaire de position (abandon) + + + 1.3.3. Consommation par le gestionnaire de position (abandon) + + Service central + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gestionnaire de position + + + Gestionnaire de position + + + + + Rubrique de notification + + + Rubrique de notification + DAO de position + + + DAO de position + + + Stockage central + + + Stockage central + + + + + + + + + + + + + + + + + + + + + + + Consommation par le gestionnaire de position (abandon) + + + opt + [type == 'position' && action == 'timeout-reserved'] + + + 1 + Demander l'état actuel du transfert depuis la BD + Code d'erreur : + 2003 + + + 2 + Récupérer l'état actuel du transfert depuis la BD + + transferStateChange + transferParticipant + + + 3 + Renvoyer l'état actuel du transfert depuis la BD + + + 4 + Renvoyer l'état actuel du transfert depuis la BD + + + + + + 5 + Valider l'état actuel (transferStateChange.transferStateId == 'RESERVED_TIMEOUT') + Code d'erreur : + 2001 + + + Persister le changement de position et l'état du transfert + + + + + 6 + transferStateId + = 'EXPIRED_RESERVED' + + + 7 + Demande de persister la dernière position et l'état en BD + Code d'erreur : + 2003 + + + IMPLÉMENTATION TRANSACTION BD + + + 8 + Sélectionner participantPosition.value FOR UPDATE pour payerCurrencyId + + participantPosition + + + 9 + Renvoyer participantPosition + + + + + + 10 + latestPosition + = participantPosition - payload.amount.amount + + + 11 + Persister latestPosition en BD pour le payeur + + UPDATE + participantPosition + SET value = latestPosition + + + 12 + Persister le changement de position du participant et le changement d'état + + INSERT + transferStateChange +   + VALUES (transferStateId) +   + INSERT + participantPositionChange + SET participantPositionId = participantPosition.participantPositionId, + transferStateChangeId = transferStateChange.transferStateChangeId, + value = latestPosition, + reservedValue = participantPosition.reservedValue + createdDate = new Date() + + + 13 + Renvoyer le succès + + + Message : { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": 3300, + "errorDescription": "Transfert expiré", + "extensionList": <transferMessage.extensionList> + } + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: abort, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 14 + Publier l'événement de notification + Code d'erreur : + 2003 + + + opt + [type == 'position' && (action IN ['reject', 'abort'])] + + + 15 + Demander l'état actuel du transfert depuis la BD + Code d'erreur : + 2003 + + + 16 + Récupérer l'état actuel du transfert depuis la BD + + transferStateChange + + + 17 + Renvoyer l'état actuel du transfert depuis la BD + + + 18 + Renvoyer l'état actuel du transfert depuis la BD + + + + + + 19 + Valider l'état actuel (transferStateChange.transferStateId IN ['RECEIVED_REJECT', 'RECEIVED_ERROR']) + Code d'erreur : + 2001 + + + Persister le changement de position et l'état du transfert + + + + + 20 + transferStateId + = (action == 'reject' ? 'ABORTED_REJECTED' : 'ABORTED_ERROR' ) + + + 21 + Demande de persister la dernière position et l'état en BD + Code d'erreur : + 2003 + + + Voir + IMPLÉMENTATION TRANSACTION BD + ci-dessus + + + 22 + Persister en base de données + + participantPosition + transferStateChange + participantPositionChange + + + 23 + Renvoyer le succès + + + alt + [action == 'reject'] + + + Message : { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: reject, + createdAt: <timestamp>, + state: { + status: "success", + code: 0, + description: "action successful" + } + } + } + } + + [action == 'abort'] + + + Message : { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: abort, + createdAt: <timestamp>, + state: { + status: 'error', + code: <payload.errorInformation.errorCode || 5000> + description: <payload.errorInformation.errorDescription> + } + } + } + } + + + 24 + Publier l'événement de notification + Code d'erreur : + 2003 + + + opt + [type == 'position' && action == 'fail' (Impossible de déclencher ce scénario actuellement)] + + + 25 + Demander l'état actuel du transfert depuis la BD + Code d'erreur : + 2003 + + + 26 + Récupérer l'état actuel du transfert depuis la BD + + transferStateChange + + + 27 + Renvoyer l'état actuel du transfert depuis la BD + + + 28 + Renvoyer l'état actuel du transfert depuis la BD + + + + + + 29 + Valider l'état actuel (transferStateChange.transferStateId == 'FAILED') + + + Persister le changement de position et l'état du transfert + + + + + 30 + transferStateId + = 'FAILED' + + + 31 + Demande de persister la dernière position et l'état en BD + Code d'erreur : + 2003 + + + Voir + IMPLÉMENTATION TRANSACTION BD + ci-dessus + + + 32 + Persister en base de données + + participantPosition + transferStateChange + participantPositionChange + + + 33 + Renvoyer le succès + + + Message : { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": 3100, + "errorDescription": "Transfert échoué", + "extensionList": <transferMessage.extensionList> + } + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: abort, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 34 + Publier l'événement de notification + Code d'erreur : + 2003 + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.0.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.0.plantuml new file mode 100644 index 000000000..d927d3cbc --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.0.plantuml @@ -0,0 +1,163 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Miguel de Barros + -------------- + ******'/ + +@startuml +' declate title +title 1.1.0. DFSP1 envoie une demande de préparation de transfert à DFSP2 + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +actor "DFSP1\nPayeur" as DFSP1 +actor "DFSP2\nBénéficiaire" as DFSP2 +boundary "Adaptateur ML API" as MLAPI +control "Gestionnaire d'événements de notification ML API" as NOTIFY_HANDLER +boundary "API du service central" as CSAPI +collections "topic-transfer-prepare" as TOPIC_TRANSFER_PREPARE +control "Gestionnaire d'événements de préparation" as PREP_HANDLER +collections "topic-transfer-position" as TOPIC_TRANSFER_POSITION +control "Gestionnaire d'événements de position" as POS_HANDLER +collections "Rubrique de notification" as TOPIC_NOTIFICATIONS + +box "Fournisseurs de services financiers" #lightGray + participant DFSP1 + participant DFSP2 +end box + +box "Service adaptateur ML API" #LightBlue + participant MLAPI + participant NOTIFY_HANDLER +end box + +box "Service central" #LightYellow + participant CSAPI + participant TOPIC_TRANSFER_PREPARE + participant PREP_HANDLER + participant TOPIC_TRANSFER_POSITION + participant POS_HANDLER + participant TOPIC_NOTIFICATIONS +end box + +' start flow +activate NOTIFY_HANDLER +activate PREP_HANDLER +activate POS_HANDLER +group DFSP1 envoie une demande de préparation de transfert à DFSP2 + note right of DFSP1 #yellow + Headers - transferHeaders: { + Content-Length: , + Content-Type: , + Date: , + X-Forwarded-For: , + FSPIOP-Source: , + FSPIOP-Destination: , + FSPIOP-Encryption: , + FSPIOP-Signature: , + FSPIOP-URI: , + FSPIOP-HTTP-Method: + } + + Payload - transferMessage : + { + "transferId": , + "payeeFsp": dfsp2, + "payerFsp": dfsp1, + "amount": { + "currency": "AED", + "amount": "string" + }, + "ilpPacket": "string", + "condition": "string", + "expiration": "string", + "extensionList": { + "extension": [ + { + "key": "string", + "value": "string" + } + ] + } + } + end note + DFSP1 ->> MLAPI: POST - /transfers + activate MLAPI + MLAPI -> MLAPI: Valider le jeton entrant et l'initiateur correspondant au payeur\nCodes d'erreur : 3000-3002, 3100-3107 + note right of MLAPI #yellow + Message : + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + type: prepare, + action: prepare, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + MLAPI -> TOPIC_TRANSFER_PREPARE: Acheminer et publier l'événement de préparation pour le payeur\nCode d'erreur : 2003 + activate TOPIC_TRANSFER_PREPARE + TOPIC_TRANSFER_PREPARE <-> TOPIC_TRANSFER_PREPARE: S'assurer que l'événement est répliqué tel que configuré (ACKS=all)\nCode d'erreur : 2003 + TOPIC_TRANSFER_PREPARE --> MLAPI: Répondre que les accusés de réplication ont été reçus + deactivate TOPIC_TRANSFER_PREPARE + MLAPI -->> DFSP1: Répondre HTTP — 202 (Accepté) + deactivate MLAPI + ||| + TOPIC_TRANSFER_PREPARE <- PREP_HANDLER: Consommer le message + ref over TOPIC_TRANSFER_PREPARE, PREP_HANDLER, TOPIC_TRANSFER_POSITION : Consommation par le gestionnaire de préparation\n + PREP_HANDLER -> TOPIC_TRANSFER_POSITION: Produire le message + ||| + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consommer le message + ref over TOPIC_TRANSFER_POSITION, POS_HANDLER : Consommation par le gestionnaire de position\n + POS_HANDLER -> TOPIC_NOTIFICATIONS: Produire le message + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consommer le message + ref over DFSP2, TOPIC_NOTIFICATIONS : Envoyer une notification au participant (bénéficiaire)\n + NOTIFY_HANDLER -> DFSP2: Envoyer la notification de rappel (callback) + ||| +end +deactivate POS_HANDLER +deactivate PREP_HANDLER +deactivate NOTIFY_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.0.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.0.svg new file mode 100644 index 000000000..79f042f1f --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.0.svg @@ -0,0 +1,238 @@ + + 1.1.0. DFSP1 envoie une demande de préparation de transfert à DFSP2 + + + 1.1.0. DFSP1 envoie une demande de préparation de transfert à DFSP2 + + Fournisseurs de services financiers + + Service adaptateur ML API + + Service central + + + + + + + + + + + + + + + + + DFSP1 + Payeur + + + DFSP1 + Payeur + + + DFSP2 + Bénéficiaire + + + DFSP2 + Bénéficiaire + + + Adaptateur ML API + + + Adaptateur ML API + + + Gestionnaire d'événements de notification ML API + + + Gestionnaire d'événements de notification ML API + + + API du service central + + + API du service central + + + + + topic-transfer-prepare + + + topic-transfer-prepare + Gestionnaire d'événements de préparation + + + Gestionnaire d'événements de préparation + + + + + topic-transfer-position + + + topic-transfer-position + Gestionnaire d'événements de position + + + Gestionnaire d'événements de position + + + + + Rubrique de notification + + + Rubrique de notification + + + + + + + + DFSP1 envoie une demande de préparation de transfert à DFSP2 + + + Headers - transferHeaders: { + Content-Length: <Content-Length>, + Content-Type: <Content-Type>, + Date: <Date>, + X-Forwarded-For: <X-Forwarded-For>, + FSPIOP-Source: <FSPIOP-Source>, + FSPIOP-Destination: <FSPIOP-Destination>, + FSPIOP-Encryption: <FSPIOP-Encryption>, + FSPIOP-Signature: <FSPIOP-Signature>, + FSPIOP-URI: <FSPIOP-URI>, + FSPIOP-HTTP-Method: <FSPIOP-HTTP-Method> + } +   + Payload - transferMessage : + { + "transferId": <uuid>, + "payeeFsp": dfsp2, + "payerFsp": dfsp1, + "amount": { + "currency": "AED", + "amount": "string" + }, + "ilpPacket": "string", + "condition": "string", + "expiration": "string", + "extensionList": { + "extension": [ + { + "key": "string", + "value": "string" + } + ] + } + } + + + + 1 + POST - /transfers + + + + + 2 + Valider le jeton entrant et l'initiateur correspondant au payeur + Codes d'erreur : + 3000-3002, 3100-3107 + + + Message : + { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + type: prepare, + action: prepare, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 3 + Acheminer et publier l'événement de préparation pour le payeur + Code d'erreur : + 2003 + + + + + + 4 + S'assurer que l'événement est répliqué tel que configuré (ACKS=all) + Code d'erreur : + 2003 + + + 5 + Répondre que les accusés de réplication ont été reçus + + + + 6 + Répondre HTTP — 202 (Accepté) + + + 7 + Consommer le message + + + ref + Consommation par le gestionnaire de préparation +   + + + 8 + Produire le message + + + 9 + Consommer le message + + + ref + Consommation par le gestionnaire de position +   + + + 10 + Produire le message + + + 11 + Consommer le message + + + ref + Envoyer une notification au participant (bénéficiaire) +   + + + 12 + Envoyer la notification de rappel (callback) + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.1.a.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.1.a.plantuml new file mode 100644 index 000000000..57d986c3c --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.1.a.plantuml @@ -0,0 +1,257 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Shashikant Hirugade + * Georgi Georgiev + * Rajiv Mothilal + * Samuel Kummary + * Miguel de Barros + -------------- + ******'/ + +@startuml +' declate title +title 1.1.1.a. Consommation par le gestionnaire de préparation (message unique) + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +collections "topic-transfer-prepare" as TOPIC_TRANSFER_PREPARE +control "Gestionnaire d'événements de préparation" as PREP_HANDLER +collections "topic-transfer-position" as TOPIC_TRANSFER_POSITION +collections "Rubrique d'événements" as TOPIC_EVENTS +collections "Rubrique de notification" as TOPIC_NOTIFICATIONS +entity "DAO de position" as POS_DAO +entity "DAO participant" as PARTICIPANT_DAO +database "Stockage central" as DB + +box "Service central" #LightYellow + participant TOPIC_TRANSFER_PREPARE + participant PREP_HANDLER + participant TOPIC_TRANSFER_POSITION + participant TOPIC_EVENTS + participant TOPIC_NOTIFICATIONS + participant POS_DAO + participant PARTICIPANT_DAO + participant DB +end box + +' start flow +activate PREP_HANDLER +group Consommation du gestionnaire de préparation + TOPIC_TRANSFER_PREPARE <- PREP_HANDLER: Consommer le message d'événement de préparation + activate TOPIC_TRANSFER_PREPARE + deactivate TOPIC_TRANSFER_PREPARE + + break + group Valider l'événement + PREP_HANDLER <-> PREP_HANDLER: Valider l'événement — règle : type == 'prepare' && action == 'prepare'\nCodes d'erreur : 2001 + end + end + + group Persister les informations d'événement + ||| + PREP_HANDLER -> TOPIC_EVENTS: Publier les informations d'événement + ref over PREP_HANDLER, TOPIC_EVENTS: Consommation du gestionnaire d'événements\n + ||| + end + + group Valider la préparation du transfert + PREP_HANDLER <-> PREP_HANDLER: Validation du schéma du message entrant + PREP_HANDLER <-> PREP_HANDLER: Vérifier la signature du message (à confirmer dans une future exigence) + note right of PREP_HANDLER #lightgrey + Les étapes de validation ci-dessus sont déjà gérées par + l'adaptateur ML pour l'implémentation open source. + Elles pourront être ajoutées à l'avenir pour les adaptateurs personnalisés. + end note + + group Valider le contrôle de doublon + ||| + PREP_HANDLER -> DB: Demande de contrôle de doublon + ref over PREP_HANDLER, DB: Contrôle de doublon de requête\n + DB --> PREP_HANDLER: Renvoyer { hasDuplicateId: Boolean, hasDuplicateHash: Boolean } + end + + alt hasDuplicateId == TRUE && hasDuplicateHash == TRUE + break + PREP_HANDLER -> PREP_HANDLER: stateRecord = await getTransferState(transferId) + alt endStateList.includes(stateRecord.transferStateId) + ||| + ref over PREP_HANDLER, TOPIC_NOTIFICATIONS: Rappel (callback) getTransfer\n + PREP_HANDLER -> TOPIC_NOTIFICATIONS: Produire le message + else + note right of PREP_HANDLER #lightgrey + Ignorer — renvoi en cours + end note + end + end + else hasDuplicateId == TRUE && hasDuplicateHash == FALSE + note right of PREP_HANDLER #lightgrey + Validation préparation transfert (échec) — requête modifiée + end note + else hasDuplicateId == FALSE + group Valider le payeur + PREP_HANDLER -> PARTICIPANT_DAO: Demande de récupérer les détails participant payeur (s'il existe) + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Demander les détails du participant + hnote over DB #lightyellow + participant + participantCurrency + end note + activate DB + PARTICIPANT_DAO <-- DB: Renvoyer les détails du participant s'il existe + deactivate DB + PARTICIPANT_DAO --> PREP_HANDLER: Renvoyer les détails du participant s'il existe + deactivate PARTICIPANT_DAO + PREP_HANDLER <-> PREP_HANDLER: Valider le payeur\nCodes d'erreur : 3202 + end + group Valider le bénéficiaire + PREP_HANDLER -> PARTICIPANT_DAO: Demande de récupérer les détails participant bénéficiaire (s'il existe) + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Demander les détails du participant + hnote over DB #lightyellow + participant + participantCurrency + end note + activate DB + PARTICIPANT_DAO <-- DB: Renvoyer les détails du participant s'il existe + deactivate DB + PARTICIPANT_DAO --> PREP_HANDLER: Renvoyer les détails du participant s'il existe + deactivate PARTICIPANT_DAO + PREP_HANDLER <-> PREP_HANDLER: Valider le bénéficiaire\nCodes d'erreur : 3203 + end + + alt Validation préparation transfert (succès) + group Persister l'état du transfert (transferState='RECEIVED-PREPARE') + PREP_HANDLER -> POS_DAO: Demande de persister le transfert\nCodes d'erreur : 2003 + activate POS_DAO + POS_DAO -> DB: Persister le transfert + hnote over DB #lightyellow + transfer + transferParticipant + transferStateChange + transferExtension + ilpPacket + end note + activate DB + deactivate DB + POS_DAO --> PREP_HANDLER: Renvoyer le succès + deactivate POS_DAO + end + else Validation préparation transfert (échec) + group Persister l'état du transfert (transferState='INVALID') (Introduction d'un nouveau statut INVALID pour marquer ces entrées) + PREP_HANDLER -> POS_DAO: Demande de persister le transfert\n(lorsque la validation Bénéficiaire/Payeur/crypto-condition échoue)\nCodes d'erreur : 2003 + activate POS_DAO + POS_DAO -> DB: Persister le transfert + hnote over DB #lightyellow + transfer + transferParticipant + transferStateChange + transferExtension + transferError + ilpPacket + end note + activate DB + deactivate DB + POS_DAO --> PREP_HANDLER: Renvoyer le succès + deactivate POS_DAO + end + end + end + end + + alt Validation préparation transfert (succès) + note right of PREP_HANDLER #yellow + Message : + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: position, + action: prepare, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + PREP_HANDLER -> TOPIC_TRANSFER_POSITION: Acheminer et publier l'événement de position pour le payeur\nCodes d'erreur : 2003 + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + else Validation préparation transfert (échec) + note right of PREP_HANDLER #yellow + Message : + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": + "errorDescription": "", + "extensionList": + } + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: prepare, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + PREP_HANDLER -> TOPIC_NOTIFICATIONS: Publier l'événement de notification (échec) pour le payeur\nCodes d'erreur : 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end +end +deactivate PREP_HANDLER +@enduml + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.1.a.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.1.a.svg new file mode 100644 index 000000000..e7ecf78af --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.1.a.svg @@ -0,0 +1,405 @@ + + 1.1.1.a. Consommation par le gestionnaire de préparation (message unique) + + + 1.1.1.a. Consommation par le gestionnaire de préparation (message unique) + + Service central + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + topic-transfer-prepare + + + topic-transfer-prepare + Gestionnaire d'événements de préparation + + + Gestionnaire d'événements de préparation + + + + + topic-transfer-position + + + topic-transfer-position + + + Rubrique d'événements + + + Rubrique d'événements + + + Rubrique de notification + + + Rubrique de notification + DAO de position + + + DAO de position + + + DAO participant + + + DAO participant + + + Stockage central + + + Stockage central + + + + + + + + + + + + + + + + + Consommation du gestionnaire de préparation + + + 1 + Consommer le message d'événement de préparation + + + break + + + Valider l'événement + + + + + + 2 + Valider l'événement — règle : type == 'prepare' && action == 'prepare' + Codes d'erreur : + 2001 + + + Persister les informations d'événement + + + 3 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements +   + + + Valider la préparation du transfert + + + + + + 4 + Validation du schéma du message entrant + + + + + + 5 + Vérifier la signature du message (à confirmer dans une future exigence) + + + Les étapes de validation ci-dessus sont déjà gérées par + l'adaptateur ML pour l'implémentation open source. + Elles pourront être ajoutées à l'avenir pour les adaptateurs personnalisés. + + + Valider le contrôle de doublon + + + 6 + Demande de contrôle de doublon + + + ref + Contrôle de doublon de requête +   + + + 7 + Renvoyer { hasDuplicateId: Boolean, hasDuplicateHash: Boolean } + + + alt + [hasDuplicateId == TRUE && hasDuplicateHash == TRUE] + + + break + + + + + 8 + stateRecord = await getTransferState(transferId) + + + alt + [endStateList.includes(stateRecord.transferStateId)] + + + ref + Rappel (callback) getTransfer +   + + + 9 + Produire le message + + + + Ignorer — renvoi en cours + + [hasDuplicateId == TRUE && hasDuplicateHash == FALSE] + + + Validation préparation transfert (échec) — requête modifiée + + [hasDuplicateId == FALSE] + + + Valider le payeur + + + 10 + Demande de récupérer les détails participant payeur (s'il existe) + + + 11 + Demander les détails du participant + + participant + participantCurrency + + + 12 + Renvoyer les détails du participant s'il existe + + + 13 + Renvoyer les détails du participant s'il existe + + + + + + 14 + Valider le payeur + Codes d'erreur : + 3202 + + + Valider le bénéficiaire + + + 15 + Demande de récupérer les détails participant bénéficiaire (s'il existe) + + + 16 + Demander les détails du participant + + participant + participantCurrency + + + 17 + Renvoyer les détails du participant s'il existe + + + 18 + Renvoyer les détails du participant s'il existe + + + + + + 19 + Valider le bénéficiaire + Codes d'erreur : + 3203 + + + alt + [Validation préparation transfert (succès)] + + + Persister l'état du transfert (transferState='RECEIVED-PREPARE') + + + 20 + Demande de persister le transfert + Codes d'erreur : + 2003 + + + 21 + Persister le transfert + + transfer + transferParticipant + transferStateChange + transferExtension + ilpPacket + + + 22 + Renvoyer le succès + + [Validation préparation transfert (échec)] + + + Persister l'état du transfert (transferState='INVALID') (Introduction d'un nouveau statut INVALID pour marquer ces entrées) + + + 23 + Demande de persister le transfert + (lorsque la validation Bénéficiaire/Payeur/crypto-condition échoue) + Codes d'erreur : + 2003 + + + 24 + Persister le transfert + + transfer + transferParticipant + transferStateChange + transferExtension + transferError + ilpPacket + + + 25 + Renvoyer le succès + + + alt + [Validation préparation transfert (succès)] + + + Message : + { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: position, + action: prepare, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 26 + Acheminer et publier l'événement de position pour le payeur + Codes d'erreur : + 2003 + + [Validation préparation transfert (échec)] + + + Message : + { + id: <transferMessage.transferId> + from: <ledgerName>, + to: <transferMessage.payerFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": <possible codes: [2003, 3100, 3105, 3106, 3202, 3203, 3300, 3301]> + "errorDescription": "<refer to section 35.1.3 for description>", + "extensionList": <transferMessage.extensionList> + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: prepare, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 27 + Publier l'événement de notification (échec) pour le payeur + Codes d'erreur : + 2003 + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.1.b.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.1.b.plantuml new file mode 100644 index 000000000..89993b910 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.1.b.plantuml @@ -0,0 +1,186 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Miguel de Barros + -------------- + ******'/ + +@startuml +' declate title +title 1.1.1.b. Consommation par le gestionnaire de préparation (messages groupés) + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +collections "topic-transfer-prepare" as TOPIC_TRANSFER_PREPARE +control "Gestionnaire d'événements de préparation" as PREP_HANDLER +collections "topic-transfer-position" as TOPIC_TRANSFER_POSITION +collections "Rubrique d'événements" as TOPIC_EVENTS +collections "Rubrique de notification" as TOPIC_NOTIFICATIONS +entity "DAO de position" as POS_DAO +entity "DAO participant" as PARTICIPANT_DAO +database "Stockage central" as DB + +box "Service central" #LightYellow + participant TOPIC_TRANSFER_PREPARE + participant PREP_HANDLER + participant TOPIC_TRANSFER_POSITION + participant TOPIC_EVENTS + participant TOPIC_NOTIFICATIONS + participant POS_DAO + participant PARTICIPANT_DAO + participant DB +end box + +' start flow +activate PREP_HANDLER +group Consommation du gestionnaire de préparation + note over TOPIC_TRANSFER_PREPARE #LightSalmon + Ce flux n'a pas été implémenté + end note + + TOPIC_TRANSFER_PREPARE <- PREP_HANDLER: Consommer le lot de messages d'événement de préparation pour le payeur + activate TOPIC_TRANSFER_PREPARE + deactivate TOPIC_TRANSFER_PREPARE + group Persister les informations d'événement + ||| + PREP_HANDLER -> TOPIC_EVENTS: Publier les informations d'événement + ref over PREP_HANDLER, TOPIC_EVENTS : Consommation du gestionnaire d'événements\n + ||| + end + + group Récupérer les informations groupées du payeur + PREP_HANDLER -> PARTICIPANT_DAO: Demande de récupérer le lot de détails participant payeur (s'il existe) + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Demander les détails du participant + hnote over DB #lightyellow + participant + end note + activate DB + PARTICIPANT_DAO <-- DB: Renvoyer les détails du participant s'il existe + deactivate DB + PARTICIPANT_DAO --> PREP_HANDLER: Renvoyer les détails du participant s'il existe + deactivate PARTICIPANT_DAO + PREP_HANDLER <-> PREP_HANDLER: Valider le payeur + PREP_HANDLER -> PREP_HANDLER: stocker le résultat dans la variable : $LIST_PARTICIPANTS_DETAILS_PAYER + end + + group Récupérer les informations groupées du bénéficiaire + PREP_HANDLER -> PARTICIPANT_DAO: Demande de récupérer le lot de détails participant bénéficiaire (s'il existe) + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Demander les détails du participant + hnote over DB #lightyellow + participant + end note + activate DB + PARTICIPANT_DAO <-- DB: Renvoyer les détails du participant s'il existe + deactivate DB + PARTICIPANT_DAO --> PREP_HANDLER: Renvoyer les détails du participant s'il existe + deactivate PARTICIPANT_DAO + PREP_HANDLER <-> PREP_HANDLER: Valider le bénéficiaire + PREP_HANDLER -> PREP_HANDLER: stocker le résultat dans la variable : $LIST_PARTICIPANTS_DETAILS_PAYEE + end + + group Récupérer le lot de transferts + PREP_HANDLER -> POS_DAO: Demande de récupérer le lot de transferts (s'il existe) + activate POS_DAO + POS_DAO -> DB: Demander le lot de transferts + hnote over DB #lightyellow + transfer + end note + activate DB + POS_DAO <-- DB: Renvoyer le lot de transferts (s'il existe) + deactivate DB + POS_DAO --> PREP_HANDLER: Renvoyer le lot de transferts (s'il existe) + deactivate POS_DAO + PREP_HANDLER -> PREP_HANDLER: stocker le résultat dans la variable : $LIST_TRANSFERS + end + + loop for each message in batch + + group Valider la préparation du transfert + group Valider le payeur + PREP_HANDLER <-> PREP_HANDLER: Valider le payeur par rapport à la variable en mémoire $LIST_PARTICIPANTS_DETAILS_PAYER + end + group Valider le bénéficiaire + PREP_HANDLER <-> PREP_HANDLER: Valider le bénéficiaire par rapport à la variable en mémoire $LIST_PARTICIPANTS_DETAILS_PAYEE + end + group Contrôle de doublon + PREP_HANDLER <-> PREP_HANDLER: Valider le contrôle de doublon par rapport à la variable en mémoire $LIST_TRANSFERS + end + PREP_HANDLER <-> PREP_HANDLER: Valider le montant + PREP_HANDLER <-> PREP_HANDLER: Valider la crypto-condition + PREP_HANDLER <-> PREP_HANDLER: Valider la signature du message (à confirmer dans une future exigence) + end + + group Persister l'état du transfert (transferState='RECEIVED' si validation réussie) + PREP_HANDLER -> POS_DAO: Demande de persister le transfert + activate POS_DAO + POS_DAO -> DB: Persister le transfert + hnote over DB #lightyellow + transferStateChange + end note + activate DB + deactivate DB + POS_DAO --> PREP_HANDLER: Renvoyer le succès + deactivate POS_DAO + end + + note right of PREP_HANDLER #yellow + Message : + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: position, + action: prepare, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + PREP_HANDLER -> TOPIC_TRANSFER_POSITION: Acheminer et publier l'événement de position pour le payeur + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + end +end +deactivate PREP_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.1.b.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.1.b.svg new file mode 100644 index 000000000..201e26b07 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.1.b.svg @@ -0,0 +1,320 @@ + + 1.1.1.b. Consommation par le gestionnaire de préparation (messages groupés) + + + 1.1.1.b. Consommation par le gestionnaire de préparation (messages groupés) + + Service central + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + topic-transfer-prepare + + + topic-transfer-prepare + Gestionnaire d'événements de préparation + + + Gestionnaire d'événements de préparation + + + + + topic-transfer-position + + + topic-transfer-position + + + Rubrique d'événements + + + Rubrique d'événements + + + Rubrique de notification + + + Rubrique de notification + DAO de position + + + DAO de position + + + DAO participant + + + DAO participant + + + Stockage central + + + Stockage central + + + + + + + + + + + + + + + + Consommation du gestionnaire de préparation + + + Ce flux n'a pas été implémenté + + + 1 + Consommer le lot de messages d'événement de préparation pour le payeur + + + Persister les informations d'événement + + + 2 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements +   + + + Récupérer les informations groupées du payeur + + + 3 + Demande de récupérer le lot de détails participant payeur (s'il existe) + + + 4 + Demander les détails du participant + + participant + + + 5 + Renvoyer les détails du participant s'il existe + + + 6 + Renvoyer les détails du participant s'il existe + + + + + + 7 + Valider le payeur + + + + + 8 + stocker le résultat dans la variable : $LIST_PARTICIPANTS_DETAILS_PAYER + + + Récupérer les informations groupées du bénéficiaire + + + 9 + Demande de récupérer le lot de détails participant bénéficiaire (s'il existe) + + + 10 + Demander les détails du participant + + participant + + + 11 + Renvoyer les détails du participant s'il existe + + + 12 + Renvoyer les détails du participant s'il existe + + + + + + 13 + Valider le bénéficiaire + + + + + 14 + stocker le résultat dans la variable : $LIST_PARTICIPANTS_DETAILS_PAYEE + + + Récupérer le lot de transferts + + + 15 + Demande de récupérer le lot de transferts (s'il existe) + + + 16 + Demander le lot de transferts + + transfer + + + 17 + Renvoyer le lot de transferts (s'il existe) + + + 18 + Renvoyer le lot de transferts (s'il existe) + + + + + 19 + stocker le résultat dans la variable : $LIST_TRANSFERS + + + loop + [for each message in batch] + + + Valider la préparation du transfert + + + Valider le payeur + + + + + + 20 + Valider le payeur par rapport à la variable en mémoire $LIST_PARTICIPANTS_DETAILS_PAYER + + + Valider le bénéficiaire + + + + + + 21 + Valider le bénéficiaire par rapport à la variable en mémoire $LIST_PARTICIPANTS_DETAILS_PAYEE + + + Contrôle de doublon + + + + + + 22 + Valider le contrôle de doublon par rapport à la variable en mémoire $LIST_TRANSFERS + + + + + + 23 + Valider le montant + + + + + + 24 + Valider la crypto-condition + + + + + + 25 + Valider la signature du message (à confirmer dans une future exigence) + + + Persister l'état du transfert (transferState='RECEIVED' si validation réussie) + + + 26 + Demande de persister le transfert + + + 27 + Persister le transfert + + transferStateChange + + + 28 + Renvoyer le succès + + + Message : + { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: position, + action: prepare, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 29 + Acheminer et publier l'événement de position pour le payeur + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.2.a.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.2.a.plantuml new file mode 100644 index 000000000..5e072ba8b --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.2.a.plantuml @@ -0,0 +1,249 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Miguel de Barros + -------------- + ******'/ + +@startuml +' declate title +title 1.1.2.a. Consommation par le gestionnaire de position (message unique) + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +collections "topic-transfer-position" as TOPIC_TRANSFER_POSITION +control "Gestionnaire d'événements de position" as POS_HANDLER +entity "DAO de position" as POS_DAO +collections "Rubrique d'événements" as TOPIC_EVENTS +collections "Rubrique de notification" as TOPIC_NOTIFICATIONS +entity "DAO participant" as PARTICIPANT_DAO +database "Stockage central" as DB + +box "Service central" #LightYellow + participant TOPIC_TRANSFER_POSITION + participant POS_HANDLER + participant TOPIC_EVENTS + participant TOPIC_NOTIFICATIONS + participant POS_DAO + participant PARTICIPANT_DAO + participant DB +end box + +' start flow +activate POS_HANDLER +group Consommation du gestionnaire de position + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consommer le message d'événement de position pour le payeur + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + + break + group Valider l'événement + POS_HANDLER <-> POS_HANDLER: Valider l'événement — règle : type == 'position' && action == 'prepare' + end + end + + group Persister les informations d'événement + ||| + POS_HANDLER -> TOPIC_EVENTS: Publier les informations d'événement + ref over POS_HANDLER, TOPIC_EVENTS : Consommation du gestionnaire d'événements\n + ||| + end + + alt Calculer et valider la dernière position (succès) + group Calculer la position et persister le changement + POS_HANDLER -> POS_DAO: Demander la dernière position en BD pour le payeur + activate POS_DAO + POS_DAO -> DB: Récupérer la dernière position en BD pour le payeur + activate DB + hnote over DB #lightyellow + transferPosition + end note + DB --> POS_DAO: Récupérer la dernière position en BD pour le payeur + deactivate DB + POS_DAO --> POS_HANDLER: Renvoyer la dernière position + deactivate POS_DAO + + POS_HANDLER -> PARTICIPANT_DAO: Demander les limites de position du participant payeur + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Demander les limites de position du participant payeur + activate DB + hnote over DB #lightyellow + participant + participantLimit + end note + DB --> PARTICIPANT_DAO: Renvoyer les limites de position + deactivate DB + deactivate DB + PARTICIPANT_DAO --> POS_HANDLER: Renvoyer les limites de position + deactivate PARTICIPANT_DAO + + POS_HANDLER <-> POS_HANDLER: Calculer la dernière position (lpos) pour préparation + POS_HANDLER <-> POS_HANDLER: Valider la dernière position calculée par rapport au plafond de débit net (netcap) — règle : lpos < netcap + + POS_HANDLER -> POS_DAO: Demande de persister la dernière position pour le payeur + activate POS_DAO + POS_DAO -> DB: Persister la dernière position en BD pour le payeur + hnote over DB #lightyellow + transferPosition + end note + activate DB + deactivate DB + POS_DAO --> POS_HANDLER: Renvoyer le succès + deactivate POS_DAO + end + + group Persister l'état du transfert (transferState='RESERVED' si contrôle de position réussi) + POS_HANDLER -> POS_DAO: Demande de persister le transfert + activate POS_DAO + POS_DAO -> DB: Persister l'état du transfert + hnote over DB #lightyellow + transferStateChange + end note + activate DB + deactivate DB + POS_DAO --> POS_HANDLER: Renvoyer le succès + deactivate POS_DAO + end + + note right of POS_HANDLER #yellow + Message : + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: transfer, + action: prepare, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + POS_HANDLER -> TOPIC_NOTIFICATIONS: Publier l'événement de notification pour le bénéficiaire + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + else Calcul et validation de la dernière position (échec) + group Calculer la position et persister le changement + POS_HANDLER -> POS_DAO: Demander la dernière position en BD pour le payeur + activate POS_DAO + POS_DAO -> DB: Récupérer la dernière position en BD pour le payeur + activate DB + hnote over DB #lightyellow + transferPosition + end note + DB --> POS_DAO: Récupérer la dernière position en BD pour le payeur + deactivate DB + deactivate DB + POS_DAO --> POS_HANDLER: Renvoyer la dernière position + deactivate POS_DAO + + POS_HANDLER -> PARTICIPANT_DAO: Demander les limites de position du participant payeur + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Demander les limites de position du participant payeur + activate DB + hnote over DB #lightyellow + participant + participantLimit + end note + DB --> PARTICIPANT_DAO: Renvoyer les limites de position + deactivate DB + deactivate DB + PARTICIPANT_DAO --> POS_HANDLER: Renvoyer les limites de position + deactivate PARTICIPANT_DAO + + POS_HANDLER <-> POS_HANDLER: Calculer la dernière position (lpos) pour préparation + POS_HANDLER <-> POS_HANDLER: Valider la dernière position calculée par rapport au plafond de débit net (netcap) — règle : lpos < netcap + note right of POS_HANDLER #red: Échec de validation ! + end + + group Persister l'état du transfert (transferState='ABORTED' si contrôle de position réussi) + POS_HANDLER -> POS_DAO: Demande de persister le transfert + activate POS_DAO + POS_DAO -> DB: Persister l'état du transfert + hnote over DB #lightyellow + transferStateChange + end note + activate DB + deactivate DB + POS_DAO --> POS_HANDLER: Renvoyer le succès + deactivate POS_DAO + end + + note right of POS_HANDLER #yellow + Message : + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": 4001, + "errorDescription": "Payer FSP insufficient liquidity", + "extensionList": + } + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: prepare, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + POS_HANDLER -> TOPIC_NOTIFICATIONS: Publier l'événement de notification (échec) pour le payeur + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + deactivate POS_HANDLER + end +end +deactivate POS_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.2.a.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.2.a.svg new file mode 100644 index 000000000..57ea46ee8 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.2.a.svg @@ -0,0 +1,366 @@ + + 1.1.2.a. Consommation par le gestionnaire de position (message unique) + + + 1.1.2.a. Consommation par le gestionnaire de position (message unique) + + Service central + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + topic-transfer-position + + + topic-transfer-position + Gestionnaire d'événements de position + + + Gestionnaire d'événements de position + + + + + Rubrique d'événements + + + Rubrique d'événements + + + Rubrique de notification + + + Rubrique de notification + DAO de position + + + DAO de position + + + DAO participant + + + DAO participant + + + Stockage central + + + Stockage central + + + + + + + + + + + + + + + + + + + + + + + Consommation du gestionnaire de position + + + 1 + Consommer le message d'événement de position pour le payeur + + + break + + + Valider l'événement + + + + + + 2 + Valider l'événement — règle : type == 'position' && action == 'prepare' + + + Persister les informations d'événement + + + 3 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements +   + + + alt + [Calculer et valider la dernière position (succès)] + + + Calculer la position et persister le changement + + + 4 + Demander la dernière position en BD pour le payeur + + + 5 + Récupérer la dernière position en BD pour le payeur + + transferPosition + + + 6 + Récupérer la dernière position en BD pour le payeur + + + 7 + Renvoyer la dernière position + + + 8 + Demander les limites de position du participant payeur + + + 9 + Demander les limites de position du participant payeur + + participant + participantLimit + + + 10 + Renvoyer les limites de position + + + 11 + Renvoyer les limites de position + + + + + + 12 + Calculer la dernière position (lpos) pour préparation + + + + + + 13 + Valider la dernière position calculée par rapport au plafond de débit net (netcap) — règle : lpos < netcap + + + 14 + Demande de persister la dernière position pour le payeur + + + 15 + Persister la dernière position en BD pour le payeur + + transferPosition + + + 16 + Renvoyer le succès + + + Persister l'état du transfert (transferState='RESERVED' si contrôle de position réussi) + + + 17 + Demande de persister le transfert + + + 18 + Persister l'état du transfert + + transferStateChange + + + 19 + Renvoyer le succès + + + Message : + { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: transfer, + action: prepare, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 20 + Publier l'événement de notification pour le bénéficiaire + + [Calcul et validation de la dernière position (échec)] + + + Calculer la position et persister le changement + + + 21 + Demander la dernière position en BD pour le payeur + + + 22 + Récupérer la dernière position en BD pour le payeur + + transferPosition + + + 23 + Récupérer la dernière position en BD pour le payeur + + + 24 + Renvoyer la dernière position + + + 25 + Demander les limites de position du participant payeur + + + 26 + Demander les limites de position du participant payeur + + participant + participantLimit + + + 27 + Renvoyer les limites de position + + + 28 + Renvoyer les limites de position + + + + + + 29 + Calculer la dernière position (lpos) pour préparation + + + + + + 30 + Valider la dernière position calculée par rapport au plafond de débit net (netcap) — règle : lpos < netcap + + + Échec de validation ! + + + Persister l'état du transfert (transferState='ABORTED' si contrôle de position réussi) + + + 31 + Demande de persister le transfert + + + 32 + Persister l'état du transfert + + transferStateChange + + + 33 + Renvoyer le succès + + + Message : + { + id: <transferMessage.transferId> + from: <ledgerName>, + to: <transferMessage.payerFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": 4001, + "errorDescription": "Payer FSP insufficient liquidity", + "extensionList": <transferMessage.extensionList> + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: prepare, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 34 + Publier l'événement de notification (échec) pour le payeur + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.2.b.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.2.b.plantuml new file mode 100644 index 000000000..53c509099 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.2.b.plantuml @@ -0,0 +1,148 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Miguel de Barros + -------------- + ******'/ + +@startuml +' declate title +title 1.1.2.b. Consommation par le gestionnaire de position (messages groupés) + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +collections "topic-transfer-position" as TOPIC_TRANSFER_POSITION +control "Gestionnaire d'événements de position" as POS_HANDLER +collections "Transfer-Topic" as TOPIC_TRANSFERS +entity "DAO de position" as POS_DAO +entity "Event-Topic" as TOPIC_EVENTS +collections "Rubrique de notification" as TOPIC_NOTIFICATIONS +entity "DAO transfert" as TRANS_DAO +database "Stockage central" as DB + +box "Service central" #LightYellow + participant TOPIC_TRANSFER_POSITION + participant POS_HANDLER + participant TOPIC_TRANSFERS + participant TOPIC_EVENTS + participant TOPIC_NOTIFICATIONS + participant POS_DAO + participant TRANS_DAO + participant DB +end box + +' start flow +activate POS_HANDLER +group Consommation du gestionnaire de position + note over TOPIC_TRANSFER_POSITION #LightSalmon + Ce flux n'a pas été implémenté + end note + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consommer le lot de messages d'événement de position pour le payeur + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + + group Persister les informations d'événement + ||| + POS_HANDLER -> TOPIC_EVENTS: Publier les informations d'événement + ref over POS_HANDLER, TOPIC_EVENTS : Consommation du gestionnaire d'événements\n + ||| + end + + loop for each message in batch + group Calculer la position et persister le changement + POS_HANDLER -> POS_DAO: Demander la dernière position en BD pour le payeur + activate POS_DAO + POS_DAO -> DB: Récupérer la dernière position en BD pour le payeur + hnote over DB #lightyellow + transferPosition + end note + activate DB + deactivate DB + POS_DAO --> POS_HANDLER: Renvoyer la dernière position + deactivate POS_DAO + + POS_HANDLER <-> POS_HANDLER: Calculer la dernière position (lpos) en incrémentant le transfert pour préparation + POS_HANDLER <-> POS_HANDLER: Valider la dernière position calculée par rapport au plafond de débit net (netcap) — règle : lpos < netcap + + POS_HANDLER -> POS_DAO: Demande de persister la dernière position pour le payeur + activate POS_DAO + POS_DAO -> DB: Persister la dernière position en BD pour le payeur + hnote over DB #lightyellow + transferPosition + end note + activate DB + deactivate DB + POS_DAO --> POS_HANDLER: Renvoyer le succès + deactivate POS_DAO + end + group Persister l'état du transfert (transferState='RESERVED' si contrôle de position réussi) + POS_HANDLER -> TRANS_DAO: Demande de persister le lot de transferts + activate TRANS_DAO + TRANS_DAO -> DB: Persister le lot de transferts + hnote over DB #lightyellow + transferStateChange + end note + activate DB + deactivate DB + TRANS_DAO --> POS_HANDLER: Renvoyer le succès + deactivate TRANS_DAO + end + note right of POS_HANDLER #yellow + Message : + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: transfer, + action: prepare, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + POS_HANDLER -> TOPIC_TRANSFERS: Publier l'événement de transfert + activate TOPIC_TRANSFERS + deactivate TOPIC_TRANSFERS + end +end +deactivate POS_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.2.b.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.2.b.svg new file mode 100644 index 000000000..2add8e6d3 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.2.b.svg @@ -0,0 +1,206 @@ + + 1.1.2.b. Consommation par le gestionnaire de position (messages groupés) + + + 1.1.2.b. Consommation par le gestionnaire de position (messages groupés) + + Service central + + + + + + + + + + + + + + + + + + + + + + + + + topic-transfer-position + + + topic-transfer-position + Gestionnaire d'événements de position + + + Gestionnaire d'événements de position + + + + + Transfer-Topic + + + Transfer-Topic + Event-Topic + + + Event-Topic + + + + + Rubrique de notification + + + Rubrique de notification + DAO de position + + + DAO de position + + + DAO transfert + + + DAO transfert + + + Stockage central + + + Stockage central + + + + + + + + + + + + + + Consommation du gestionnaire de position + + + Ce flux n'a pas été implémenté + + + 1 + Consommer le lot de messages d'événement de position pour le payeur + + + Persister les informations d'événement + + + 2 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements +   + + + loop + [for each message in batch] + + + Calculer la position et persister le changement + + + 3 + Demander la dernière position en BD pour le payeur + + + 4 + Récupérer la dernière position en BD pour le payeur + + transferPosition + + + 5 + Renvoyer la dernière position + + + + + + 6 + Calculer la dernière position (lpos) en incrémentant le transfert pour préparation + + + + + + 7 + Valider la dernière position calculée par rapport au plafond de débit net (netcap) — règle : lpos < netcap + + + 8 + Demande de persister la dernière position pour le payeur + + + 9 + Persister la dernière position en BD pour le payeur + + transferPosition + + + 10 + Renvoyer le succès + + + Persister l'état du transfert (transferState='RESERVED' si contrôle de position réussi) + + + 11 + Demande de persister le lot de transferts + + + 12 + Persister le lot de transferts + + transferStateChange + + + 13 + Renvoyer le succès + + + Message : + { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: transfer, + action: prepare, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 14 + Publier l'événement de transfert + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.a-v1.1.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.a-v1.1.plantuml new file mode 100644 index 000000000..51f188d78 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.a-v1.1.plantuml @@ -0,0 +1,123 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Miguel de Barros + * Shashikant Hirugade + * Valentin Genev + -------------- + ******'/ + +@startuml +' declate title +title 1.1.4.a. Envoyer une notification au participant (payeur/bénéficiaire) (message unique) v1.1 + +autonumber + +' Actor Keys: +' actor - Payer DFSP, Payee DFSP +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +actor "Payer DFSP\nParticipant" as PAYER_DFSP +actor "Payee DFSP\nParticipant" as PAYEE_DFSP +control "Gestionnaire d'événements de notification ML API" as NOTIFY_HANDLER +boundary "API du service central" as CSAPI +collections "Rubrique de notification" as TOPIC_NOTIFICATIONS +collections "Rubrique d'événements" as TOPIC_EVENTS +entity "DAO participant" as PARTICIPANT_DAO +database "Stockage central" as DB + +box "Financial Service Provider (Payer)" #lightGray + participant PAYER_DFSP +end box + +box "Service adaptateur ML API" #LightBlue + participant NOTIFY_HANDLER +end box + +box "Service central" #LightYellow + participant TOPIC_NOTIFICATIONS + participant CSAPI + participant TOPIC_EVENTS + participant PARTICIPANT_DAO + participant DB +end box + +box "Financial Service Provider (Payee)" #lightGray + participant PAYEE_DFSP +end box + +' start flow +activate NOTIFY_HANDLER +group Envoyer une notification aux participants + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consommer l'événement de notification + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + + group Persister les informations d'événement + NOTIFY_HANDLER -> CSAPI: Demande de persister les informations d'événement — POST — /events + activate CSAPI + CSAPI -> TOPIC_EVENTS: Publier les informations d'événement + activate TOPIC_EVENTS + ||| + ref over TOPIC_EVENTS : Consommation du gestionnaire d'événements\n + ||| + TOPIC_EVENTS --> CSAPI: Renvoyer le succès + deactivate TOPIC_EVENTS + CSAPI --> NOTIFY_HANDLER: Renvoyer le succès + deactivate CSAPI + end + note right of NOTIFY_HANDLER #lightgray + Les détails du point de terminaison sont mis en cache ; à l'expiration du cache, + les détails sont récupérés à nouveau + end note + NOTIFY_HANDLER -> CSAPI: Demander les détails du point de terminaison du participant - GET - /participants/{{fsp}}/endpoints\nCode d'erreur : 2003 + + activate CSAPI + CSAPI -> PARTICIPANT_DAO: Récupérer les détails de point de terminaison du participant\nCode d'erreur : 2003 + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Récupérer les détails de point de terminaison du participant + activate DB + hnote over DB #lightyellow + participantEndpoint + end note + DB -> PARTICIPANT_DAO: Détails du point de terminaison du participant récupérés + deactivate DB + PARTICIPANT_DAO --> CSAPI: Renvoyer les détails de point de terminaison du participant + deactivate PARTICIPANT_DAO + CSAPI --> NOTIFY_HANDLER: Renvoyer les détails de point de terminaison du participant\nCodes d'erreur : 3202, 3203 + deactivate CSAPI + NOTIFY_HANDLER -> PAYER_DFSP: Notification avec résultat/erreur de préparation/exécution \nau DFSP payeur sur le point de terminaison spécifié - PUT \nCode d'erreur : 1001 + NOTIFY_HANDLER <-- PAYER_DFSP: HTTP 200 OK + alt event.action === 'reserve' + alt event.status === 'success' + NOTIFY_HANDLER -> PAYEE_DFSP: Notification avec résultat d'exécution réussi (validé) au DFSP bénéficiaire sur le point de terminaison spécifié - PATCH \nCode d'erreur : 1001 + ||| + NOTIFY_HANDLER <-- PAYEE_DFSP: HTTP 200 OK + end + end +end +deactivate NOTIFY_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.a-v1.1.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.a-v1.1.svg new file mode 100644 index 000000000..65c5f906c --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.a-v1.1.svg @@ -0,0 +1,189 @@ + + 1.1.4.a. Envoyer une notification au participant (payeur/bénéficiaire) (message unique) v1.1 + + + 1.1.4.a. Envoyer une notification au participant (payeur/bénéficiaire) (message unique) v1.1 + + Financial Service Provider (Payer) + + Service adaptateur ML API + + Service central + + Financial Service Provider (Payee) + + + + + + + + + + + + + + + + + + + + Payer DFSP + Participant + + + Payer DFSP + Participant + + + Gestionnaire d'événements de notification ML API + + + Gestionnaire d'événements de notification ML API + + + + + Rubrique de notification + + + Rubrique de notification + API du service central + + + API du service central + + + + + Rubrique d'événements + + + Rubrique d'événements + DAO participant + + + DAO participant + + + Stockage central + + + Stockage central + + + Payee DFSP + Participant + + + Payee DFSP + Participant + + + + + + + + + + + + Envoyer une notification aux participants + + + 1 + Consommer l'événement de notification + + + Persister les informations d'événement + + + 2 + Demande de persister les informations d'événement — POST — /events + + + 3 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements +   + + + 4 + Renvoyer le succès + + + 5 + Renvoyer le succès + + + Les détails du point de terminaison sont mis en cache ; à l'expiration du cache, + les détails sont récupérés à nouveau + + + 6 + Demander les détails du point de terminaison du participant - GET - /participants/{{fsp}}/endpoints + Code d'erreur : + 2003 + + + 7 + Récupérer les détails de point de terminaison du participant + Code d'erreur : + 2003 + + + 8 + Récupérer les détails de point de terminaison du participant + + participantEndpoint + + + 9 + Détails du point de terminaison du participant récupérés + + + 10 + Renvoyer les détails de point de terminaison du participant + + + 11 + Renvoyer les détails de point de terminaison du participant + Codes d'erreur : + 3202, 3203 + + + 12 + Notification avec résultat/erreur de préparation/exécution + au DFSP payeur sur le point de terminaison spécifié - PUT + Code d'erreur : + 1001 + + + 13 + HTTP 200 OK + + + alt + [event.action === 'reserve'] + + + alt + [event.status === 'success'] + + + 14 + Notification avec résultat d'exécution réussi (validé) au DFSP bénéficiaire sur le point de terminaison spécifié - PATCH + Code d'erreur : + 1001 + + + 15 + HTTP 200 OK + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.a.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.a.plantuml new file mode 100644 index 000000000..0c735e551 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.a.plantuml @@ -0,0 +1,120 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Miguel de Barros + * Shashikant Hirugade + -------------- + ******'/ + +@startuml +' declate title +title 1.1.4.a. Envoyer une notification au participant (payeur/bénéficiaire) (message unique) + +autonumber + +' Actor Keys: +' actor - Payer DFSP, Payee DFSP +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +actor "Payer DFSP\nParticipant" as PAYER_DFSP +actor "Payee DFSP\nParticipant" as PAYEE_DFSP +control "Gestionnaire d'événements de notification ML API" as NOTIFY_HANDLER +boundary "API du service central" as CSAPI +collections "Rubrique de notification" as TOPIC_NOTIFICATIONS +collections "Rubrique d'événements" as TOPIC_EVENTS +entity "DAO participant" as PARTICIPANT_DAO +database "Stockage central" as DB + +box "Financial Service Provider (Payer)" #lightGray + participant PAYER_DFSP +end box + +box "Service adaptateur ML API" #LightBlue + participant NOTIFY_HANDLER +end box + +box "Service central" #LightYellow + participant TOPIC_NOTIFICATIONS + participant CSAPI + participant TOPIC_EVENTS + participant PARTICIPANT_DAO + participant DB +end box + +box "Financial Service Provider (Payee)" #lightGray + participant PAYEE_DFSP +end box + +' start flow +activate NOTIFY_HANDLER +group Envoyer une notification aux participants + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consommer l'événement de notification + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + + group Persister les informations d'événement + NOTIFY_HANDLER -> CSAPI: Demande de persister les informations d'événement — POST — /events + activate CSAPI + CSAPI -> TOPIC_EVENTS: Publier les informations d'événement + activate TOPIC_EVENTS + ||| + ref over TOPIC_EVENTS : Consommation du gestionnaire d'événements\n + ||| + TOPIC_EVENTS --> CSAPI: Renvoyer le succès + deactivate TOPIC_EVENTS + CSAPI --> NOTIFY_HANDLER: Renvoyer le succès + deactivate CSAPI + end + note right of NOTIFY_HANDLER #lightgray + Les détails du point de terminaison sont mis en cache ; à l'expiration du cache, + les détails sont récupérés à nouveau + end note + NOTIFY_HANDLER -> CSAPI: Demander les détails du point de terminaison du participant - GET - /participants/{{fsp}}/endpoints\nCode d'erreur : 2003 + + activate CSAPI + CSAPI -> PARTICIPANT_DAO: Récupérer les détails de point de terminaison du participant\nCode d'erreur : 2003 + activate PARTICIPANT_DAO + PARTICIPANT_DAO -> DB: Récupérer les détails de point de terminaison du participant + activate DB + hnote over DB #lightyellow + participantEndpoint + end note + DB -> PARTICIPANT_DAO: Détails du point de terminaison du participant récupérés + deactivate DB + PARTICIPANT_DAO --> CSAPI: Renvoyer les détails de point de terminaison du participant + deactivate PARTICIPANT_DAO + CSAPI --> NOTIFY_HANDLER: Renvoyer les détails de point de terminaison du participant\nCodes d'erreur : 3202, 3203 + deactivate CSAPI + NOTIFY_HANDLER -> PAYER_DFSP: Notification avec résultat/erreur de préparation/exécution \nau DFSP payeur sur le point de terminaison spécifié - PUT \nCode d'erreur : 1001 + NOTIFY_HANDLER <-- PAYER_DFSP: HTTP 200 OK + alt Config.SEND_TRANSFER_CONFIRMATION_TO_PAYEE === true + NOTIFY_HANDLER -> PAYEE_DFSP: Notification avec résultat d'exécution (validé/annulé/rejeté) au DFSP bénéficiaire sur le point de terminaison spécifié - PUT \nCode d'erreur : 1001 + ||| + NOTIFY_HANDLER <-- PAYEE_DFSP: HTTP 200 OK + end +end +deactivate NOTIFY_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.a.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.a.svg new file mode 100644 index 000000000..0aa019efb --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.a.svg @@ -0,0 +1,184 @@ + + 1.1.4.a. Envoyer une notification au participant (payeur/bénéficiaire) (message unique) + + + 1.1.4.a. Envoyer une notification au participant (payeur/bénéficiaire) (message unique) + + Financial Service Provider (Payer) + + Service adaptateur ML API + + Service central + + Financial Service Provider (Payee) + + + + + + + + + + + + + + + + + + + Payer DFSP + Participant + + + Payer DFSP + Participant + + + Gestionnaire d'événements de notification ML API + + + Gestionnaire d'événements de notification ML API + + + + + Rubrique de notification + + + Rubrique de notification + API du service central + + + API du service central + + + + + Rubrique d'événements + + + Rubrique d'événements + DAO participant + + + DAO participant + + + Stockage central + + + Stockage central + + + Payee DFSP + Participant + + + Payee DFSP + Participant + + + + + + + + + + + + Envoyer une notification aux participants + + + 1 + Consommer l'événement de notification + + + Persister les informations d'événement + + + 2 + Demande de persister les informations d'événement — POST — /events + + + 3 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements +   + + + 4 + Renvoyer le succès + + + 5 + Renvoyer le succès + + + Les détails du point de terminaison sont mis en cache ; à l'expiration du cache, + les détails sont récupérés à nouveau + + + 6 + Demander les détails du point de terminaison du participant - GET - /participants/{{fsp}}/endpoints + Code d'erreur : + 2003 + + + 7 + Récupérer les détails de point de terminaison du participant + Code d'erreur : + 2003 + + + 8 + Récupérer les détails de point de terminaison du participant + + participantEndpoint + + + 9 + Détails du point de terminaison du participant récupérés + + + 10 + Renvoyer les détails de point de terminaison du participant + + + 11 + Renvoyer les détails de point de terminaison du participant + Codes d'erreur : + 3202, 3203 + + + 12 + Notification avec résultat/erreur de préparation/exécution + au DFSP payeur sur le point de terminaison spécifié - PUT + Code d'erreur : + 1001 + + + 13 + HTTP 200 OK + + + alt + [Config.SEND_TRANSFER_CONFIRMATION_TO_PAYEE === true] + + + 14 + Notification avec résultat d'exécution (validé/annulé/rejeté) au DFSP bénéficiaire sur le point de terminaison spécifié - PUT + Code d'erreur : + 1001 + + + 15 + HTTP 200 OK + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.b.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.b.plantuml new file mode 100644 index 000000000..95000764e --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.b.plantuml @@ -0,0 +1,108 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Miguel de Barros + -------------- + ******'/ + +@startuml +' declate title +title 1.1.4.b. Envoyer une notification au participant (payeur/bénéficiaire) (messages groupés) + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +actor "DFSP(n)\nParticipant" as DFSP +control "Gestionnaire d'événements de notification ML API" as NOTIFY_HANDLER +boundary "API du service central" as CSAPI +collections "Rubrique de notification" as TOPIC_NOTIFICATIONS +collections "Rubrique d'événements" as TOPIC_EVENTS +entity "Notification DAO" as NOTIFY_DAO +database "Stockage central" as DB + +box "Fournisseur de services financiers" #lightGray + participant DFSP +end box + +box "Service adaptateur ML API" #LightBlue + participant NOTIFY_HANDLER +end box + +box "Service central" #LightYellow +participant TOPIC_NOTIFICATIONS + participant CSAPI + participant TOPIC_EVENTS + participant EVENT_DAO + participant NOTIFY_DAO + participant DB +end box + +' start flow +activate NOTIFY_HANDLER +group Envoyer une notification au participant + note over DFSP #LightSalmon + Ce flux n'a pas été implémenté + end note + + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: **Consommer le lot de messages d'événement de notifications pour le participant** + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + loop for each message in batch + group Persister les informations d'événement + NOTIFY_HANDLER -> CSAPI: Demande de persister les informations d'événement — POST — /events + activate CSAPI + CSAPI -> TOPIC_EVENTS: Publier les informations d'événement + activate TOPIC_EVENTS + ||| + ref over TOPIC_EVENTS : Consommation du gestionnaire d'événements\n + ||| + TOPIC_EVENTS --> CSAPI: Renvoyer le succès + deactivate TOPIC_EVENTS + CSAPI --> NOTIFY_HANDLER: Renvoyer le succès + deactivate CSAPI + end + NOTIFY_HANDLER -> CSAPI: Demander les détails de notifications du participant - GET - /notifications/DFPS(n) + activate CSAPI + CSAPI -> NOTIFY_DAO: Récupérer les détails de notifications du participant + activate NOTIFY_DAO + NOTIFY_DAO -> DB: Récupérer les détails de notifications du participant + activate DB + hnote over DB #lightyellow + transferPosition + end note + DB --> NOTIFY_DAO: Détails de notifications récupérés pour le participant + 'deactivate DB + NOTIFY_DAO --> CSAPI: Renvoyer les détails de notifications du participant + deactivate NOTIFY_DAO + CSAPI --> NOTIFY_HANDLER: Renvoyer les détails de notifications du participant + deactivate CSAPI + NOTIFY_HANDLER --> DFSP: Rappel avec résultat de préparation au participant sur l'URL spécifiée - PUT - />/transfers + end +end +deactivate NOTIFY_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.b.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.b.svg new file mode 100644 index 000000000..8cf2cc590 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.b.svg @@ -0,0 +1,154 @@ + + 1.1.4.b. Envoyer une notification au participant (payeur/bénéficiaire) (messages groupés) + + + 1.1.4.b. Envoyer une notification au participant (payeur/bénéficiaire) (messages groupés) + + Fournisseur de services financiers + + Service adaptateur ML API + + Service central + + + + + + + + + + + + + + + + + + + DFSP(n) + Participant + + + DFSP(n) + Participant + + + Gestionnaire d'événements de notification ML API + + + Gestionnaire d'événements de notification ML API + + + + + Rubrique de notification + + + Rubrique de notification + API du service central + + + API du service central + + + + + Rubrique d'événements + + + Rubrique d'événements + + EVENT_DAO + + EVENT_DAO + Notification DAO + + + Notification DAO + + + Stockage central + + + Stockage central + + + + + + + + + + + + Envoyer une notification au participant + + + Ce flux n'a pas été implémenté + + + 1 + Consommer le lot de messages d'événement de notifications pour le participant + + + loop + [for each message in batch] + + + Persister les informations d'événement + + + 2 + Demande de persister les informations d'événement — POST — /events + + + 3 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements +   + + + 4 + Renvoyer le succès + + + 5 + Renvoyer le succès + + + 6 + Demander les détails de notifications du participant - GET - /notifications/DFPS(n) + + + 7 + Récupérer les détails de notifications du participant + + + 8 + Récupérer les détails de notifications du participant + + transferPosition + + + 9 + Détails de notifications récupérés pour le participant + + + 10 + Renvoyer les détails de notifications du participant + + + 11 + Renvoyer les détails de notifications du participant + + + 12 + Rappel avec résultat de préparation au participant sur l'URL spécifiée - PUT - /<dfsp-host>>/transfers + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0-v1.1.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0-v1.1.plantuml new file mode 100644 index 000000000..db6b0d279 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0-v1.1.plantuml @@ -0,0 +1,143 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Rajiv Mothilal + * Georgi Georgiev + -------------- + ******'/ + +@startuml +' declate title +title 2.2.0. DFSP2 envoie une demande de rejet d'exécution du transfert + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +actor "DFSP1\nPayeur" as DFSP1 +actor "DFSP2\nBénéficiaire" as DFSP2 +boundary "Adaptateur ML API" as MLAPI +control "Gestionnaire d'événements de notification ML API" as NOTIFY_HANDLER +boundary "API du service central" as CSAPI +collections "Fulfil-Topic" as TOPIC_FULFIL +control "Gestionnaire d'événements d'exécution" as FULF_HANDLER + +' collections "topic-transfer-position" as TOPIC_TRANSFER_POSITION +' control "Gestionnaire d'événements de position" as POS_HANDLER +' collections "Rubrique d'événements" as TOPIC_EVENTS +' collections "Rubrique de notification" as TOPIC_NOTIFICATIONS + +box "Fournisseurs de services financiers" #lightGray + participant DFSP1 + participant DFSP2 +end box + +box "Service adaptateur ML API" #LightBlue + participant MLAPI + participant NOTIFY_HANDLER +end box + +box "Service central" #LightYellow + participant CSAPI + participant TOPIC_FULFIL + participant FULF_HANDLER +end box + +' start flow +activate NOTIFY_HANDLER +activate FULF_HANDLER +group DFSP2 envoie un rappel d'erreur pour rejeter un transfert avec errorCode et description + note right of DFSP2 #yellow + Headers - transferHeaders: { + Content-Length: , + Content-Type: , + Date: , + X-Forwarded-For: , + FSPIOP-Source: , + FSPIOP-Destination: , + FSPIOP-Encryption: , + FSPIOP-Signature: , + FSPIOP-URI: , + FSPIOP-HTTP-Method: + } + + Payload - transferMessage : + { + "errorInformation": { + "errorCode": , + "errorDescription": , + "extensionList": { + "extension": [ + { + "key": , + "value": + } + ] + } + } + } + end note + DFSP2 ->> MLAPI: **PUT - /transfers//error** + + activate MLAPI + MLAPI -> MLAPI: Valider le jeton entrant et l'initiateur correspondant au bénéficiaire + note right of MLAPI #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + type: fulfil, + action: reject, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + MLAPI -> TOPIC_FULFIL: Acheminer et publier l'événement d'exécution pour le bénéficiaire + activate TOPIC_FULFIL + TOPIC_FULFIL <-> TOPIC_FULFIL: S'assurer que l'événement est répliqué selon la configuration (ACKS=all) + TOPIC_FULFIL --> MLAPI: Répondre que les accusés de réception de réplication ont été reçus + deactivate TOPIC_FULFIL + MLAPI -->> DFSP2: Répondre HTTP — 200 (OK) + deactivate MLAPI + TOPIC_FULFIL <- FULF_HANDLER: Consommer le message + FULF_HANDLER -> FULF_HANDLER: Consigner le message d'erreur + note right of FULF_HANDLER: (correspondant à un message d'exécution avec transferState='ABORTED')\nl'action REJECT n'est pas autorisée dans le gestionnaire d'exécution +end +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0-v1.1.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0-v1.1.svg new file mode 100644 index 000000000..636915761 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0-v1.1.svg @@ -0,0 +1,178 @@ + + 2.2.0. DFSP2 envoie une demande de rejet d'exécution du transfert + + + 2.2.0. DFSP2 envoie une demande de rejet d'exécution du transfert + + Fournisseurs de services financiers + + Service adaptateur ML API + + Service central + + + + + + + + + + + + + DFSP1 + Payeur + + + DFSP1 + Payeur + + + DFSP2 + Bénéficiaire + + + DFSP2 + Bénéficiaire + + + Adaptateur ML API + + + Adaptateur ML API + + + Gestionnaire d'événements de notification ML API + + + Gestionnaire d'événements de notification ML API + + + API du service central + + + API du service central + + + + + Fulfil-Topic + + + Fulfil-Topic + Gestionnaire d'événements d'exécution + + + Gestionnaire d'événements d'exécution + + + + + + + + + DFSP2 envoie un rappel d'erreur pour rejeter un transfert avec errorCode et description + + + Headers - transferHeaders: { + Content-Length: <Content-Length>, + Content-Type: <Content-Type>, + Date: <Date>, + X-Forwarded-For: <X-Forwarded-For>, + FSPIOP-Source: <FSPIOP-Source>, + FSPIOP-Destination: <FSPIOP-Destination>, + FSPIOP-Encryption: <FSPIOP-Encryption>, + FSPIOP-Signature: <FSPIOP-Signature>, + FSPIOP-URI: <FSPIOP-URI>, + FSPIOP-HTTP-Method: <FSPIOP-HTTP-Method> + } +   + Payload - transferMessage : + { + "errorInformation": { + "errorCode": <errorCode>, + "errorDescription": <errorDescription>, + "extensionList": { + "extension": [ + { + "key": <string>, + "value": <string> + } + ] + } + } + } + + + + 1 + PUT - /transfers/<ID>/error + + + + + 2 + Valider le jeton entrant et l'initiateur correspondant au bénéficiaire + + + Message : + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + type: fulfil, + action: reject, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 3 + Acheminer et publier l'événement d'exécution pour le bénéficiaire + + + + + + 4 + S'assurer que l'événement est répliqué selon la configuration (ACKS=all) + + + 5 + Répondre que les accusés de réception de réplication ont été reçus + + + + 6 + Répondre HTTP — 200 (OK) + + + 7 + Consommer le message + + + + + 8 + Consigner le message d'erreur + + + (correspondant à un message d'exécution avec transferState='ABORTED') + l'action REJECT n'est pas autorisée dans le gestionnaire d'exécution + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0.a-v1.1.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0.a-v1.1.plantuml new file mode 100644 index 000000000..a40762f21 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0.a-v1.1.plantuml @@ -0,0 +1,166 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Sam Kummary + -------------- +******'/ + +@startuml +' declate title +title 2.2.0.a. DFSP2 envoie un PUT sur le point de terminaison /error pour une demande de transfert + +autonumber +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +actor "DFSP1\nPayeur" as DFSP1 +actor "DFSP2\nBénéficiaire" as DFSP2 +boundary "Adaptateur ML API" as MLAPI +control "Gestionnaire d'événements de notification ML API" as NOTIFY_HANDLER +boundary "API du service central" as CSAPI +collections "Fulfil-Topic" as TOPIC_FULFIL +control "Gestionnaire d'événements d'exécution" as FULF_HANDLER +collections "topic-transfer-position" as TOPIC_TRANSFER_POSITION +control "Gestionnaire d'événements de position" as POS_HANDLER +collections "Rubrique de notification" as TOPIC_NOTIFICATIONS + +box "Fournisseurs de services financiers" #lightGray + participant DFSP1 + participant DFSP2 +end box + +box "Service adaptateur ML API" #LightBlue + participant MLAPI + participant NOTIFY_HANDLER +end box + +box "Service central" #LightYellow + participant CSAPI + participant TOPIC_FULFIL + participant FULF_HANDLER + participant TOPIC_TRANSFER_POSITION + participant POS_HANDLER + participant TOPIC_NOTIFICATIONS +end box + +' start flow +activate NOTIFY_HANDLER +activate FULF_HANDLER +activate POS_HANDLER +group DFSP2 envoie une demande d'exécution réussie du transfert + DFSP2 <-> DFSP2: Lors du traitement d'une demande\nPOST /transfers entrante, une erreur de traitement\ns'est produite et un rappel d'erreur est effectué + note right of DFSP2 #yellow + Headers - transferHeaders: { + Content-Length: , + Content-Type: , + Date: , + X-Forwarded-For: , + FSPIOP-Source: , + FSPIOP-Destination: , + FSPIOP-Encryption: , + FSPIOP-Signature: , + FSPIOP-URI: , + FSPIOP-HTTP-Method: + } + + Payload - errorMessage : + { + errorInformation + { + "errorCode": , + "errorDescription": + "extensionList": { + "extension": [ + { + "key": , + "value": + } + ] + } + } + } + end note + DFSP2 ->> MLAPI: PUT - /transfers//error + activate MLAPI + MLAPI -> MLAPI: Valider l'initiateur entrant correspondant au bénéficiaire\nCodes d'erreur : 3000-3002, 3100-3107 + note right of MLAPI #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + type: fulfil, + action: abort, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + MLAPI -> TOPIC_FULFIL: Acheminer et publier l'événement abandon pour le bénéficiaire\nCode d'erreur : 2003 + activate TOPIC_FULFIL + TOPIC_FULFIL <-> TOPIC_FULFIL: S'assurer que l'événement est répliqué selon la configuration (ACKS=all)\nCode d'erreur : 2003 + TOPIC_FULFIL --> MLAPI: Répondre que les accusés de réception de réplication ont été reçus + deactivate TOPIC_FULFIL + MLAPI -->> DFSP2: Répondre HTTP — 200 (OK) + deactivate MLAPI + TOPIC_FULFIL <- FULF_HANDLER: Consommer le message + ref over TOPIC_FULFIL, TOPIC_TRANSFER_POSITION: Consommation gestionnaire d'exécution (abandon)\n + FULF_HANDLER -> TOPIC_TRANSFER_POSITION: Produire le message + ||| + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consommer le message + ref over TOPIC_TRANSFER_POSITION, TOPIC_NOTIFICATIONS: Consommation gestionnaire de position (abandon)\n + POS_HANDLER -> TOPIC_NOTIFICATIONS: Produire le message + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consommer le message + opt action == 'abort' + ||| + ref over DFSP1, TOPIC_NOTIFICATIONS: Envoyer une notification au participant (payeur)\n + NOTIFY_HANDLER -> DFSP1: Envoyer la notification de rappel (callback) + end + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consommer le message + opt action == 'abort' + ||| + ref over DFSP2, TOPIC_NOTIFICATIONS: Envoyer une notification au participant (bénéficiaire)\n + NOTIFY_HANDLER -> DFSP2: Envoyer la notification de rappel (callback) + end + ||| +end +deactivate POS_HANDLER +deactivate FULF_HANDLER +deactivate NOTIFY_HANDLER +@enduml \ No newline at end of file diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0.a-v1.1.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0.a-v1.1.svg new file mode 100644 index 000000000..aa4b10f5e --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0.a-v1.1.svg @@ -0,0 +1,265 @@ + + 2.2.0.a. DFSP2 envoie un PUT sur le point de terminaison /error pour une demande de transfert + + + 2.2.0.a. DFSP2 envoie un PUT sur le point de terminaison /error pour une demande de transfert + + Fournisseurs de services financiers + + Service adaptateur ML API + + Service central + + + + + + + + + + + + + + + + + + + DFSP1 + Payeur + + + DFSP1 + Payeur + + + DFSP2 + Bénéficiaire + + + DFSP2 + Bénéficiaire + + + Adaptateur ML API + + + Adaptateur ML API + + + Gestionnaire d'événements de notification ML API + + + Gestionnaire d'événements de notification ML API + + + API du service central + + + API du service central + + + + + Fulfil-Topic + + + Fulfil-Topic + Gestionnaire d'événements d'exécution + + + Gestionnaire d'événements d'exécution + + + + + topic-transfer-position + + + topic-transfer-position + Gestionnaire d'événements de position + + + Gestionnaire d'événements de position + + + + + Rubrique de notification + + + Rubrique de notification + + + + + + + + DFSP2 envoie une demande d'exécution réussie du transfert + + + + + + 1 + Lors du traitement d'une demande + POST /transfers entrante, une erreur de traitement + s'est produite et un rappel d'erreur est effectué + + + Headers - transferHeaders: { + Content-Length: <Content-Length>, + Content-Type: <Content-Type>, + Date: <Date>, + X-Forwarded-For: <X-Forwarded-For>, + FSPIOP-Source: <FSPIOP-Source>, + FSPIOP-Destination: <FSPIOP-Destination>, + FSPIOP-Encryption: <FSPIOP-Encryption>, + FSPIOP-Signature: <FSPIOP-Signature>, + FSPIOP-URI: <FSPIOP-URI>, + FSPIOP-HTTP-Method: <FSPIOP-HTTP-Method> + } +   + Payload - errorMessage : + { + errorInformation + { + "errorCode": <errorCode>, + "errorDescription": <errorDescription> + "extensionList": { + "extension": [ + { + "key": <string>, + "value": <string> + } + ] + } + } + } + + + + 2 + PUT - /transfers/<ID>/error + + + + + 3 + Valider l'initiateur entrant correspondant au bénéficiaire + Codes d'erreur : + 3000-3002, 3100-3107 + + + Message : + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <errorMessage> + }, + metadata: { + event: { + id: <uuid>, + type: fulfil, + action: abort, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 4 + Acheminer et publier l'événement abandon pour le bénéficiaire + Code d'erreur : + 2003 + + + + + + 5 + S'assurer que l'événement est répliqué selon la configuration (ACKS=all) + Code d'erreur : + 2003 + + + 6 + Répondre que les accusés de réception de réplication ont été reçus + + + + 7 + Répondre HTTP — 200 (OK) + + + 8 + Consommer le message + + + ref + Consommation gestionnaire d'exécution (abandon) +   + + + 9 + Produire le message + + + 10 + Consommer le message + + + ref + Consommation gestionnaire de position (abandon) +   + + + 11 + Produire le message + + + 12 + Consommer le message + + + opt + [action == 'abort'] + + + ref + Envoyer une notification au participant (payeur) +   + + + 13 + Envoyer la notification de rappel (callback) + + + 14 + Consommer le message + + + opt + [action == 'abort'] + + + ref + Envoyer une notification au participant (bénéficiaire) +   + + + 15 + Envoyer la notification de rappel (callback) + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0.a.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0.a.plantuml new file mode 100644 index 000000000..68e8f997d --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0.a.plantuml @@ -0,0 +1,166 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Sam Kummary + -------------- +******'/ + +@startuml +' declate title +title 2.2.0.a. DFSP2 envoie un PUT sur le point de terminaison /error pour une demande de transfert + +autonumber +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +actor "DFSP1\nPayeur" as DFSP1 +actor "DFSP2\nBénéficiaire" as DFSP2 +boundary "Adaptateur ML API" as MLAPI +control "Gestionnaire d'événements de notification ML API" as NOTIFY_HANDLER +boundary "API du service central" as CSAPI +collections "Fulfil-Topic" as TOPIC_FULFIL +control "Gestionnaire d'événements d'exécution" as FULF_HANDLER +collections "topic-transfer-position" as TOPIC_TRANSFER_POSITION +control "Gestionnaire d'événements de position" as POS_HANDLER +collections "Rubrique de notification" as TOPIC_NOTIFICATIONS + +box "Fournisseurs de services financiers" #lightGray + participant DFSP1 + participant DFSP2 +end box + +box "Service adaptateur ML API" #LightBlue + participant MLAPI + participant NOTIFY_HANDLER +end box + +box "Service central" #LightYellow + participant CSAPI + participant TOPIC_FULFIL + participant FULF_HANDLER + participant TOPIC_TRANSFER_POSITION + participant POS_HANDLER + participant TOPIC_NOTIFICATIONS +end box + +' start flow +activate NOTIFY_HANDLER +activate FULF_HANDLER +activate POS_HANDLER +group DFSP2 envoie une demande d'exécution réussie du transfert + DFSP2 <-> DFSP2: Lors du traitement d'une demande\nPOST /transfers entrante, une erreur de traitement\ns'est produite et un rappel d'erreur est effectué + note right of DFSP2 #yellow + Headers - transferHeaders: { + Content-Length: , + Content-Type: , + Date: , + X-Forwarded-For: , + FSPIOP-Source: , + FSPIOP-Destination: , + FSPIOP-Encryption: , + FSPIOP-Signature: , + FSPIOP-URI: , + FSPIOP-HTTP-Method: + } + + Payload - errorMessage : + { + errorInformation + { + "errorCode": , + "errorDescription": + "extensionList": { + "extension": [ + { + "key": , + "value": + } + ] + } + } + } + end note + DFSP2 ->> MLAPI: PUT - /transfers//error + activate MLAPI + MLAPI -> MLAPI: Valider l'initiateur entrant correspondant au bénéficiaire\nCodes d'erreur : 3000-3002, 3100-3107 + note right of MLAPI #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + type: fulfil, + action: abort, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + MLAPI -> TOPIC_FULFIL: Acheminer et publier l'événement abandon/rejet pour le bénéficiaire\nCode d'erreur : 2003 + activate TOPIC_FULFIL + TOPIC_FULFIL <-> TOPIC_FULFIL: S'assurer que l'événement est répliqué selon la configuration (ACKS=all)\nCode d'erreur : 2003 + TOPIC_FULFIL --> MLAPI: Répondre que les accusés de réception de réplication ont été reçus + deactivate TOPIC_FULFIL + MLAPI -->> DFSP2: Répondre HTTP — 200 (OK) + deactivate MLAPI + TOPIC_FULFIL <- FULF_HANDLER: Consommer le message + ref over TOPIC_FULFIL, TOPIC_TRANSFER_POSITION: Consommation gestionnaire d'exécution (rejet/interruption)\n + FULF_HANDLER -> TOPIC_TRANSFER_POSITION: Produire le message + ||| + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consommer le message + ref over TOPIC_TRANSFER_POSITION, TOPIC_NOTIFICATIONS: Consommation gestionnaire de position (abandon)\n + POS_HANDLER -> TOPIC_NOTIFICATIONS: Produire le message + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consommer le message + opt action == 'abort' + ||| + ref over DFSP1, TOPIC_NOTIFICATIONS: Envoyer une notification au participant (payeur)\n + NOTIFY_HANDLER -> DFSP1: Envoyer la notification de rappel (callback) + end + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consommer le message + opt action == 'abort' + ||| + ref over DFSP2, TOPIC_NOTIFICATIONS: Envoyer une notification au participant (bénéficiaire)\n + NOTIFY_HANDLER -> DFSP2: Envoyer la notification de rappel (callback) + end + ||| +end +deactivate POS_HANDLER +deactivate FULF_HANDLER +deactivate NOTIFY_HANDLER +@enduml \ No newline at end of file diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0.a.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0.a.svg new file mode 100644 index 000000000..d4db9cdcd --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0.a.svg @@ -0,0 +1,265 @@ + + 2.2.0.a. DFSP2 envoie un PUT sur le point de terminaison /error pour une demande de transfert + + + 2.2.0.a. DFSP2 envoie un PUT sur le point de terminaison /error pour une demande de transfert + + Fournisseurs de services financiers + + Service adaptateur ML API + + Service central + + + + + + + + + + + + + + + + + + + DFSP1 + Payeur + + + DFSP1 + Payeur + + + DFSP2 + Bénéficiaire + + + DFSP2 + Bénéficiaire + + + Adaptateur ML API + + + Adaptateur ML API + + + Gestionnaire d'événements de notification ML API + + + Gestionnaire d'événements de notification ML API + + + API du service central + + + API du service central + + + + + Fulfil-Topic + + + Fulfil-Topic + Gestionnaire d'événements d'exécution + + + Gestionnaire d'événements d'exécution + + + + + topic-transfer-position + + + topic-transfer-position + Gestionnaire d'événements de position + + + Gestionnaire d'événements de position + + + + + Rubrique de notification + + + Rubrique de notification + + + + + + + + DFSP2 envoie une demande d'exécution réussie du transfert + + + + + + 1 + Lors du traitement d'une demande + POST /transfers entrante, une erreur de traitement + s'est produite et un rappel d'erreur est effectué + + + Headers - transferHeaders: { + Content-Length: <Content-Length>, + Content-Type: <Content-Type>, + Date: <Date>, + X-Forwarded-For: <X-Forwarded-For>, + FSPIOP-Source: <FSPIOP-Source>, + FSPIOP-Destination: <FSPIOP-Destination>, + FSPIOP-Encryption: <FSPIOP-Encryption>, + FSPIOP-Signature: <FSPIOP-Signature>, + FSPIOP-URI: <FSPIOP-URI>, + FSPIOP-HTTP-Method: <FSPIOP-HTTP-Method> + } +   + Payload - errorMessage : + { + errorInformation + { + "errorCode": <errorCode>, + "errorDescription": <errorDescription> + "extensionList": { + "extension": [ + { + "key": <string>, + "value": <string> + } + ] + } + } + } + + + + 2 + PUT - /transfers/<ID>/error + + + + + 3 + Valider l'initiateur entrant correspondant au bénéficiaire + Codes d'erreur : + 3000-3002, 3100-3107 + + + Message : + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <errorMessage> + }, + metadata: { + event: { + id: <uuid>, + type: fulfil, + action: abort, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 4 + Acheminer et publier l'événement abandon/rejet pour le bénéficiaire + Code d'erreur : + 2003 + + + + + + 5 + S'assurer que l'événement est répliqué selon la configuration (ACKS=all) + Code d'erreur : + 2003 + + + 6 + Répondre que les accusés de réception de réplication ont été reçus + + + + 7 + Répondre HTTP — 200 (OK) + + + 8 + Consommer le message + + + ref + Consommation gestionnaire d'exécution (rejet/interruption) +   + + + 9 + Produire le message + + + 10 + Consommer le message + + + ref + Consommation gestionnaire de position (abandon) +   + + + 11 + Produire le message + + + 12 + Consommer le message + + + opt + [action == 'abort'] + + + ref + Envoyer une notification au participant (payeur) +   + + + 13 + Envoyer la notification de rappel (callback) + + + 14 + Consommer le message + + + opt + [action == 'abort'] + + + ref + Envoyer une notification au participant (bénéficiaire) +   + + + 15 + Envoyer la notification de rappel (callback) + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0.plantuml new file mode 100644 index 000000000..6a394b1af --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0.plantuml @@ -0,0 +1,170 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Rajiv Mothilal + * Georgi Georgiev + -------------- + ******'/ + +@startuml +' declate title +title 2.2.0. DFSP2 envoie une demande de rejet d'exécution du transfert + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +actor "DFSP1\nPayeur" as DFSP1 +actor "DFSP2\nBénéficiaire" as DFSP2 +boundary "Adaptateur ML API" as MLAPI +control "Gestionnaire d'événements de notification ML API" as NOTIFY_HANDLER +boundary "API du service central" as CSAPI +collections "Fulfil-Topic" as TOPIC_FULFIL +control "Gestionnaire d'événements d'exécution" as FULF_HANDLER +collections "topic-transfer-position" as TOPIC_TRANSFER_POSITION +control "Gestionnaire d'événements de position" as POS_HANDLER +collections "Rubrique d'événements" as TOPIC_EVENTS +collections "Rubrique de notification" as TOPIC_NOTIFICATIONS + +box "Fournisseurs de services financiers" #lightGray + participant DFSP1 + participant DFSP2 +end box + +box "Service adaptateur ML API" #LightBlue + participant MLAPI + participant NOTIFY_HANDLER +end box + +box "Service central" #LightYellow + participant CSAPI + participant TOPIC_FULFIL + participant FULF_HANDLER + participant TOPIC_TRANSFER_POSITION + participant TOPIC_EVENTS + participant POS_HANDLER + participant TOPIC_NOTIFICATIONS +end box + +' start flow +activate NOTIFY_HANDLER +activate FULF_HANDLER +activate POS_HANDLER +group DFSP2 envoie une demande de rejet d'exécution du transfert + DFSP2 <-> DFSP2: Récupérer la chaîne d'exécution générée lors du\nprocessus de devis ou la régénérer avec\n**Local secret** et **ILP Packet** comme entrées + note right of DFSP2 #lightblue + **Remarque** : Dans le corps de la requête PUT /transfers/, + seul le champ **transferState** est **obligatoire** + end note + note right of DFSP2 #yellow + Headers - transferHeaders: { + Content-Length: , + Content-Type: , + Date: , + X-Forwarded-For: , + FSPIOP-Source: , + FSPIOP-Destination: , + FSPIOP-Encryption: , + FSPIOP-Signature: , + FSPIOP-URI: , + FSPIOP-HTTP-Method: + } + + Payload - transferMessage : + { + "fulfilment": , + "completedTimestamp": , + "transferState": "ABORTED", + "extensionList": { + "extension": [ + { + "key": , + "value": + } + ] + } + } + end note + note right of DFSP2 #lightgray + **Remarque** : Le motif de rejet du bénéficiaire doit être saisi + dans l'extensionList du corps de la requête. + end note + DFSP2 ->> MLAPI: **PUT - /transfers/** + + activate MLAPI + MLAPI -> MLAPI: Valider le jeton entrant et l'initiateur correspondant au bénéficiaire + note right of MLAPI #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + type: fulfil, + action: reject, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + MLAPI -> TOPIC_FULFIL: Acheminer et publier l'événement d'exécution pour le bénéficiaire + activate TOPIC_FULFIL + TOPIC_FULFIL <-> TOPIC_FULFIL: S'assurer que l'événement est répliqué selon la configuration (ACKS=all) + TOPIC_FULFIL --> MLAPI: Répondre que les accusés de réception de réplication ont été reçus + deactivate TOPIC_FULFIL + MLAPI -->> DFSP2: Répondre HTTP — 200 (OK) + deactivate MLAPI + TOPIC_FULFIL <- FULF_HANDLER: Consommer le message + ref over TOPIC_FULFIL, TOPIC_EVENTS: Consommation gestionnaire d'exécution (rejet/interruption)\n + FULF_HANDLER -> TOPIC_TRANSFER_POSITION: Produire le message + ||| + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consommer le message + ref over TOPIC_TRANSFER_POSITION, TOPIC_NOTIFICATIONS: Consommation gestionnaire de position (rejet)\n + POS_HANDLER -> TOPIC_NOTIFICATIONS: Produire le message + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consommer le message + opt action == 'reject' + ||| + ref over DFSP1, TOPIC_NOTIFICATIONS: Envoyer une notification au participant (payeur)\n + NOTIFY_HANDLER -> DFSP1: Envoyer la notification de rappel (callback) + end + ||| +end +activate POS_HANDLER +activate FULF_HANDLER +activate NOTIFY_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0.svg new file mode 100644 index 000000000..b49db9c57 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.0.svg @@ -0,0 +1,262 @@ + + 2.2.0. DFSP2 envoie une demande de rejet d'exécution du transfert + + + 2.2.0. DFSP2 envoie une demande de rejet d'exécution du transfert + + Fournisseurs de services financiers + + Service adaptateur ML API + + Service central + + + + + + + + + + + + + + + + + + + DFSP1 + Payeur + + + DFSP1 + Payeur + + + DFSP2 + Bénéficiaire + + + DFSP2 + Bénéficiaire + + + Adaptateur ML API + + + Adaptateur ML API + + + Gestionnaire d'événements de notification ML API + + + Gestionnaire d'événements de notification ML API + + + API du service central + + + API du service central + + + + + Fulfil-Topic + + + Fulfil-Topic + Gestionnaire d'événements d'exécution + + + Gestionnaire d'événements d'exécution + + + + + topic-transfer-position + + + topic-transfer-position + + + Rubrique d'événements + + + Rubrique d'événements + Gestionnaire d'événements de position + + + Gestionnaire d'événements de position + + + + + Rubrique de notification + + + Rubrique de notification + + + + + + + + DFSP2 envoie une demande de rejet d'exécution du transfert + + + + + + 1 + Récupérer la chaîne d'exécution générée lors du + processus de devis ou la régénérer avec + Local secret + et + ILP Packet + comme entrées + + + Remarque + : Dans le corps de la requête PUT /transfers/<ID>, + seul le champ + transferState + est + obligatoire + + + Headers - transferHeaders: { + Content-Length: <Content-Length>, + Content-Type: <Content-Type>, + Date: <Date>, + X-Forwarded-For: <X-Forwarded-For>, + FSPIOP-Source: <FSPIOP-Source>, + FSPIOP-Destination: <FSPIOP-Destination>, + FSPIOP-Encryption: <FSPIOP-Encryption>, + FSPIOP-Signature: <FSPIOP-Signature>, + FSPIOP-URI: <FSPIOP-URI>, + FSPIOP-HTTP-Method: <FSPIOP-HTTP-Method> + } +   + Payload - transferMessage : + { + "fulfilment": <IlpFulfilment>, + "completedTimestamp": <DateTime>, + "transferState": "ABORTED", + "extensionList": { + "extension": [ + { + "key": <string>, + "value": <string> + } + ] + } + } + + + Remarque + : Le motif de rejet du bénéficiaire doit être saisi + dans l'extensionList du corps de la requête. + + + + 2 + PUT - /transfers/<ID> + + + + + 3 + Valider le jeton entrant et l'initiateur correspondant au bénéficiaire + + + Message : + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + type: fulfil, + action: reject, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 4 + Acheminer et publier l'événement d'exécution pour le bénéficiaire + + + + + + 5 + S'assurer que l'événement est répliqué selon la configuration (ACKS=all) + + + 6 + Répondre que les accusés de réception de réplication ont été reçus + + + + 7 + Répondre HTTP — 200 (OK) + + + 8 + Consommer le message + + + ref + Consommation gestionnaire d'exécution (rejet/interruption) +   + + + 9 + Produire le message + + + 10 + Consommer le message + + + ref + Consommation gestionnaire de position (rejet) +   + + + 11 + Produire le message + + + 12 + Consommer le message + + + opt + [action == 'reject'] + + + ref + Envoyer une notification au participant (payeur) +   + + + 13 + Envoyer la notification de rappel (callback) + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.1-v1.1.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.1-v1.1.plantuml new file mode 100644 index 000000000..b64738137 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.1-v1.1.plantuml @@ -0,0 +1,225 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Rajiv Mothilal + * Georgi Georgiev + * Sam Kummary + -------------- + ******'/ + +@startuml +' declate title +title 2.2.1. Consommation par le gestionnaire d'exécution (interruption/rejet) +autonumber +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store +' declare actors +collections "Fulfil-Topic" as TOPIC_FULFIL +control "Gestionnaire d'événements d'exécution" as FULF_HANDLER +collections "Rubrique d'événements" as TOPIC_EVENT +collections "topic-transfer-position" as TOPIC_TRANSFER_POSITION +collections "Rubrique de notification" as TOPIC_NOTIFICATIONS +'entity "Transfer Duplicate Facade" as DUP_FACADE +entity "DAO transfert" as TRANS_DAO +database "Stockage central" as DB +box "Service central" #LightYellow + participant TOPIC_FULFIL + participant FULF_HANDLER + participant TOPIC_TRANSFER_POSITION + participant TOPIC_EVENT + participant TOPIC_NOTIFICATIONS + participant TRANS_DAO + participant DB +end box +' start flow +activate FULF_HANDLER +group Consommation du gestionnaire d'exécution (échec) + alt Consommer un message unique + TOPIC_FULFIL <- FULF_HANDLER: Consommer le message d'événement d'exécution pour le payeur + activate TOPIC_FULFIL + deactivate TOPIC_FULFIL + break + group Valider l'événement + FULF_HANDLER <-> FULF_HANDLER: Valider l'événement — règle : type == 'fulfil' && ( action IN ['reject','abort'] )\nCodes d'erreur : 2001 + end + end + group Persister les informations d'événement + FULF_HANDLER -> TOPIC_EVENT: Publier les informations d'événement + ref over FULF_HANDLER, TOPIC_EVENT: Consommation du gestionnaire d'événements + end + group Valider la signature FSPIOP + ||| + ref over FULF_HANDLER, TOPIC_NOTIFICATIONS: Valider message.content.headers.**FSPIOP-Signature**\nCodes d'erreur : 2001 + end + group Valider le contrôle de doublon d'exécution du transfert + FULF_HANDLER -> FULF_HANDLER: Générer l'uuid transferFulfilmentId + FULF_HANDLER -> TRANS_DAO: Demande de récupérer les hachages d'exécution par transferId\nCode d'erreur : 2003 + activate TRANS_DAO + TRANS_DAO -> DB: Demander les hachages de messages d'exécution en doublon + hnote over DB #lightyellow + SELET transferId, hash + FROM **transferFulfilmentDuplicateCheck** + WHERE transferId = request.params.id + end note + activate DB + TRANS_DAO <-- DB: Renvoyer les hachages existants + deactivate DB + TRANS_DAO --> FULF_HANDLER: Renvoyer la ou les empreintes des messages d'exécution + deactivate TRANS_DAO + FULF_HANDLER -> FULF_HANDLER: Parcourir la liste des hachages renvoyés et comparer chaque entrée au hachage du message calculé + alt Hachage correspondant + ' Need to check what respond with same results if finalised then resend, else ignore and wait for response + FULF_HANDLER -> TRANS_DAO: Demande de récupérer l'exécution du transfert et l'état\nCode d'erreur : 2003 + activate TRANS_DAO + TRANS_DAO -> DB: Demande de récupérer l'exécution du transfert et l'état + hnote over DB #lightyellow + transferFulfilment + transferStateChange + end note + activate DB + TRANS_DAO <-- DB: Renvoyer l'exécution du transfert et l'état + deactivate DB + TRANS_DAO --> FULF_HANDLER: Renvoyer l'exécution du transfert et l'état + deactivate TRANS_DAO + alt transferFulfilment.isValid == 0 + break + FULF_HANDLER <-> FULF_HANDLER: Gestion des erreurs : 3105 + end + else transferState IN ['COMMITTED', 'ABORTED'] + break + ref over FULF_HANDLER, TOPIC_NOTIFICATIONS: Envoyer une notification au participant (bénéficiaire)\n + end + else transferState NOT 'RESERVED' + break + FULF_HANDLER <-> FULF_HANDLER: Code d'erreur : 2001 + end + else + break + FULF_HANDLER <-> FULF_HANDLER: Laisser la requête précédente se terminer + end + end + else Hachage non correspondant + FULF_HANDLER -> TRANS_DAO: Demande de persister le hachage du transfert\nCodes d'erreur : 2003 + activate TRANS_DAO + TRANS_DAO -> DB: Persister le hachage + hnote over DB #lightyellow + transferFulfilmentDuplicateCheck + end note + activate DB + deactivate DB + TRANS_DAO --> FULF_HANDLER: Renvoyer le succès + deactivate TRANS_DAO + end + end + alt Appel action=='reject' effectué sur PUT /transfers/{ID} + FULF_HANDLER -> FULF_HANDLER: Consigner le message d'erreur + note right of FULF_HANDLER: l'action REJECT n'est pas autorisée dans le gestionnaire d'exécution + else action=='abort' Rappel d'erreur + alt Validation réussie + group Persister l'état du transfert (transferState='RECEIVED_ERROR') + FULF_HANDLER -> TRANS_DAO: Demande de persister le transfert state and Error\nCode d'erreur : 2003 + activate TRANS_DAO + TRANS_DAO -> DB: Persister l'état du transfert et les informations d'erreur + activate DB + hnote over DB #lightyellow + transferStateChange + transferError + transferExtension + end note + deactivate DB + TRANS_DAO --> FULF_HANDLER: Renvoyer le succès + end + + note right of FULF_HANDLER #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: position, + action: abort, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + + FULF_HANDLER -> TOPIC_TRANSFER_POSITION: Acheminer et publier l'événement de position pour le payeur + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + else Message d'erreur de transfert invalide + break + note right of FULF_HANDLER #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: position, + action: abort, + createdAt: , + state: { + status: "error", + code: 1 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_NOTIFICATIONS: Acheminer et publier l'événement de notification pour le bénéficiaire + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end + end + end + else Consommer des messages groupés + note left of FULF_HANDLER #lightblue + À livrer dans une future story + end note + end +end +deactivate FULF_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.1-v1.1.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.1-v1.1.svg new file mode 100644 index 000000000..172aedf6c --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.1-v1.1.svg @@ -0,0 +1,386 @@ + + 2.2.1. Consommation par le gestionnaire d'exécution (interruption/rejet) + + + 2.2.1. Consommation par le gestionnaire d'exécution (interruption/rejet) + + Service central + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Fulfil-Topic + + + Fulfil-Topic + Gestionnaire d'événements d'exécution + + + Gestionnaire d'événements d'exécution + + + + + topic-transfer-position + + + topic-transfer-position + + + Rubrique d'événements + + + Rubrique d'événements + + + Rubrique de notification + + + Rubrique de notification + DAO transfert + + + DAO transfert + + + Stockage central + + + Stockage central + + + + + + + + + + + + + + + + + Consommation du gestionnaire d'exécution (échec) + + + alt + [Consommer un message unique] + + + 1 + Consommer le message d'événement d'exécution pour le payeur + + + break + + + Valider l'événement + + + + + + 2 + Valider l'événement — règle : type == 'fulfil' && ( action IN ['reject','abort'] ) + Codes d'erreur : + 2001 + + + Persister les informations d'événement + + + 3 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements + + + Valider la signature FSPIOP + + + ref + Valider message.content.headers. + FSPIOP-Signature + Codes d'erreur : + 2001 + + + Valider le contrôle de doublon d'exécution du transfert + + + + + 4 + Générer l'uuid transferFulfilmentId + + + 5 + Demande de récupérer les hachages d'exécution par transferId + Code d'erreur : + 2003 + + + 6 + Demander les hachages de messages d'exécution en doublon + + SELET transferId, hash + FROM + transferFulfilmentDuplicateCheck + WHERE transferId = request.params.id + + + 7 + Renvoyer les hachages existants + + + 8 + Renvoyer la ou les empreintes des messages d'exécution + + + + + 9 + Parcourir la liste des hachages renvoyés et comparer chaque entrée au hachage du message calculé + + + alt + [Hachage correspondant] + + + 10 + Demande de récupérer l'exécution du transfert et l'état + Code d'erreur : + 2003 + + + 11 + Demande de récupérer l'exécution du transfert et l'état + + transferFulfilment + transferStateChange + + + 12 + Renvoyer l'exécution du transfert et l'état + + + 13 + Renvoyer l'exécution du transfert et l'état + + + alt + [transferFulfilment.isValid == 0] + + + break + + + + + + 14 + Gestion des erreurs : + 3105 + + [transferState IN ['COMMITTED', 'ABORTED']] + + + break + + + ref + Envoyer une notification au participant (bénéficiaire) +   + + [transferState NOT 'RESERVED'] + + + break + + + + + + 15 + Code d'erreur : + 2001 + + + + break + + + + + + 16 + Laisser la requête précédente se terminer + + [Hachage non correspondant] + + + 17 + Demande de persister le hachage du transfert + Codes d'erreur : + 2003 + + + 18 + Persister le hachage + + transferFulfilmentDuplicateCheck + + + 19 + Renvoyer le succès + + + alt + [Appel action=='reject' effectué sur PUT /transfers/{ID}] + + + + + 20 + Consigner le message d'erreur + + + l'action REJECT n'est pas autorisée dans le gestionnaire d'exécution + + [action=='abort' Rappel d'erreur] + + + alt + [Validation réussie] + + + Persister l'état du transfert (transferState='RECEIVED_ERROR') + + + 21 + Demande de persister le transfert state and Error + Code d'erreur : + 2003 + + + 22 + Persister l'état du transfert et les informations d'erreur + + transferStateChange + transferError + transferExtension + + + 23 + Renvoyer le succès + + + Message : + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: position, + action: abort, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 24 + Acheminer et publier l'événement de position pour le payeur + + [Message d'erreur de transfert invalide] + + + break + + + Message : + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: position, + action: abort, + createdAt: <timestamp>, + state: { + status: "error", + code: 1 + } + } + } + } + + + 25 + Acheminer et publier l'événement de notification pour le bénéficiaire + + [Consommer des messages groupés] + + + À livrer dans une future story + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.1.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.1.plantuml new file mode 100644 index 000000000..a91534c8c --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.1.plantuml @@ -0,0 +1,343 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Rajiv Mothilal + * Georgi Georgiev + * Sam Kummary + -------------- + ******'/ + +@startuml +' declate title +title 2.2.1. Consommation par le gestionnaire d'exécution (rejet/interruption) +autonumber +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store +' declare actors +collections "Fulfil-Topic" as TOPIC_FULFIL +control "Gestionnaire d'événements d'exécution" as FULF_HANDLER +collections "Rubrique d'événements" as TOPIC_EVENT +collections "topic-transfer-position" as TOPIC_TRANSFER_POSITION +collections "Rubrique de notification" as TOPIC_NOTIFICATIONS +'entity "Transfer Duplicate Facade" as DUP_FACADE +entity "DAO transfert" as TRANS_DAO +database "Stockage central" as DB +box "Service central" #LightYellow + participant TOPIC_FULFIL + participant FULF_HANDLER + participant TOPIC_TRANSFER_POSITION + participant TOPIC_EVENT + participant TOPIC_NOTIFICATIONS + participant TRANS_DAO + participant DB +end box +' start flow +activate FULF_HANDLER +group Consommation du gestionnaire d'exécution (échec) + alt Consommer un message unique + TOPIC_FULFIL <- FULF_HANDLER: Consommer le message d'événement d'exécution pour le payeur + activate TOPIC_FULFIL + deactivate TOPIC_FULFIL + break + group Valider l'événement + FULF_HANDLER <-> FULF_HANDLER: Valider l'événement — règle : type == 'fulfil' && ( action IN ['reject','abort'] )\nCodes d'erreur : 2001 + end + end + group Persister les informations d'événement + FULF_HANDLER -> TOPIC_EVENT: Publier les informations d'événement + ref over FULF_HANDLER, TOPIC_EVENT: Consommation du gestionnaire d'événements + end + group Valider la signature FSPIOP + ||| + ref over FULF_HANDLER, TOPIC_NOTIFICATIONS: Valider message.content.headers.**FSPIOP-Signature**\nCodes d'erreur : 2001 + end + group Valider le contrôle de doublon d'exécution du transfert + FULF_HANDLER -> FULF_HANDLER: Générer l'uuid transferFulfilmentId + FULF_HANDLER -> TRANS_DAO: Demande de récupérer les hachages d'exécution par transferId\nCode d'erreur : 2003 + activate TRANS_DAO + TRANS_DAO -> DB: Demander les hachages de messages d'exécution en doublon + hnote over DB #lightyellow + SELET transferId, hash + FROM **transferFulfilmentDuplicateCheck** + WHERE transferId = request.params.id + end note + activate DB + TRANS_DAO <-- DB: Renvoyer les hachages existants + deactivate DB + TRANS_DAO --> FULF_HANDLER: Renvoyer la ou les empreintes des messages d'exécution + deactivate TRANS_DAO + FULF_HANDLER -> FULF_HANDLER: Parcourir la liste des hachages renvoyés et comparer chaque entrée au hachage du message calculé + alt Hachage correspondant + ' Need to check what respond with same results if finalised then resend, else ignore and wait for response + FULF_HANDLER -> TRANS_DAO: Demande de récupérer l'exécution du transfert et l'état\nCode d'erreur : 2003 + activate TRANS_DAO + TRANS_DAO -> DB: Demande de récupérer l'exécution du transfert et l'état + hnote over DB #lightyellow + transferFulfilment + transferStateChange + end note + activate DB + TRANS_DAO <-- DB: Renvoyer l'exécution du transfert et l'état + deactivate DB + TRANS_DAO --> FULF_HANDLER: Renvoyer l'exécution du transfert et l'état + deactivate TRANS_DAO + alt transferFulfilment.isValid == 0 + break + FULF_HANDLER <-> FULF_HANDLER: Gestion des erreurs : 3105 + end + else transferState IN ['COMMITTED', 'ABORTED'] + break + ref over FULF_HANDLER, TOPIC_NOTIFICATIONS: Envoyer une notification au participant (bénéficiaire)\n + end + else transferState NOT 'RESERVED' + break + FULF_HANDLER <-> FULF_HANDLER: Code d'erreur : 2001 + end + else + break + FULF_HANDLER <-> FULF_HANDLER: Laisser la requête précédente se terminer + end + end + else Hachage non correspondant + FULF_HANDLER -> TRANS_DAO: Demande de persister le hachage du transfert\nCodes d'erreur : 2003 + activate TRANS_DAO + TRANS_DAO -> DB: Persister le hachage + hnote over DB #lightyellow + transferFulfilmentDuplicateCheck + end note + activate DB + deactivate DB + TRANS_DAO --> FULF_HANDLER: Renvoyer le succès + deactivate TRANS_DAO + end + end + alt Appel action=='reject' effectué sur PUT /transfers/{ID} + FULF_HANDLER -> TRANS_DAO: Demander les informations pour les contrôles de validation\nCode d'erreur : 2003 + activate TRANS_DAO + TRANS_DAO -> DB: Récupérer depuis la base de données + activate DB + hnote over DB #lightyellow + transfer + end note + DB --> TRANS_DAO + deactivate DB + FULF_HANDLER <-- TRANS_DAO: Renvoyer le transfert + deactivate TRANS_DAO + + alt Exécution présente dans le message PUT /transfers/{ID} + FULF_HANDLER ->FULF_HANDLER: Valider que Transfer.ilpCondition = SHA-256 (content.payload.fulfilment)\nCode d'erreur : 2001 + + group Persister l'exécution + FULF_HANDLER -> TRANS_DAO: Persister l'exécution avec le résultat du contrôle ci-dessus (transferFulfilment.isValid)\nCode d'erreur : 2003 + activate TRANS_DAO + TRANS_DAO -> DB: Persister en base de données + activate DB + deactivate DB + hnote over DB #lightyellow + transferFulfilment + transferExtension + end note + FULF_HANDLER <-- TRANS_DAO: Renvoyer le succès + deactivate TRANS_DAO + end + else Exécution NON présente dans le message PUT /transfers/{ID} + FULF_HANDLER ->FULF_HANDLER: Valider que le message d'exécution du transfert vers Abort est valide\nCode d'erreur : 2001 + group Persister les extensions + FULF_HANDLER -> TRANS_DAO: Persister les éléments extensionList\nCode d'erreur : 2003 + activate TRANS_DAO + TRANS_DAO -> DB: Persister en base de données + activate DB + deactivate DB + hnote over DB #lightyellow + transferExtension + end note + FULF_HANDLER <-- TRANS_DAO: Renvoyer le succès + deactivate TRANS_DAO + end + end + + alt Validation de Transfer.ilpCondition réussie OU validation générique réussie + group Persister l'état du transfert (transferState='RECEIVED_REJECT') + FULF_HANDLER -> TRANS_DAO: Demande de persister le transfert state\nCode d'erreur : 2003 + activate TRANS_DAO + TRANS_DAO -> DB: Persister l'état du transfert + activate DB + hnote over DB #lightyellow + transferStateChange + end note + deactivate DB + TRANS_DAO --> FULF_HANDLER: Renvoyer le succès + end + + note right of FULF_HANDLER #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: position, + action: reject, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + + FULF_HANDLER -> TOPIC_TRANSFER_POSITION: Acheminer et publier l'événement de position pour le payeur + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + else Validation d'exécution infructueuse ou échec générique + break + note right of FULF_HANDLER #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: position, + action: reject, + createdAt: , + state: { + status: "error", + code: 1 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_NOTIFICATIONS: Acheminer et publier l'événement de notification pour le bénéficiaire + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end + end + else action=='abort' Rappel d'erreur + alt Validation réussie + group Persister l'état du transfert (transferState='RECEIVED_ERROR') + FULF_HANDLER -> TRANS_DAO: Demande de persister le transfert state and Error\nCode d'erreur : 2003 + activate TRANS_DAO + TRANS_DAO -> DB: Persister l'état du transfert et les informations d'erreur + activate DB + hnote over DB #lightyellow + transferStateChange + transferError + transferExtension + end note + deactivate DB + TRANS_DAO --> FULF_HANDLER: Renvoyer le succès + end + + note right of FULF_HANDLER #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: position, + action: abort, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + + FULF_HANDLER -> TOPIC_TRANSFER_POSITION: Acheminer et publier l'événement de position pour le payeur + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + else Message d'erreur de transfert invalide + break + note right of FULF_HANDLER #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: position, + action: abort, + createdAt: , + state: { + status: "error", + code: 1 + } + } + } + } + end note + FULF_HANDLER -> TOPIC_NOTIFICATIONS: Acheminer et publier l'événement de notification pour le bénéficiaire + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end + end + end + else Consommer des messages groupés + note left of FULF_HANDLER #lightblue + À livrer dans une future story + end note + end +end +deactivate FULF_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.1.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.1.svg new file mode 100644 index 000000000..b31740cd2 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-reject-2.2.1.svg @@ -0,0 +1,572 @@ + + 2.2.1. Consommation par le gestionnaire d'exécution (rejet/interruption) + + + 2.2.1. Consommation par le gestionnaire d'exécution (rejet/interruption) + + Service central + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Fulfil-Topic + + + Fulfil-Topic + Gestionnaire d'événements d'exécution + + + Gestionnaire d'événements d'exécution + + + + + topic-transfer-position + + + topic-transfer-position + + + Rubrique d'événements + + + Rubrique d'événements + + + Rubrique de notification + + + Rubrique de notification + DAO transfert + + + DAO transfert + + + Stockage central + + + Stockage central + + + + + + + + + + + + + + + + + + + + + + + + + + + Consommation du gestionnaire d'exécution (échec) + + + alt + [Consommer un message unique] + + + 1 + Consommer le message d'événement d'exécution pour le payeur + + + break + + + Valider l'événement + + + + + + 2 + Valider l'événement — règle : type == 'fulfil' && ( action IN ['reject','abort'] ) + Codes d'erreur : + 2001 + + + Persister les informations d'événement + + + 3 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements + + + Valider la signature FSPIOP + + + ref + Valider message.content.headers. + FSPIOP-Signature + Codes d'erreur : + 2001 + + + Valider le contrôle de doublon d'exécution du transfert + + + + + 4 + Générer l'uuid transferFulfilmentId + + + 5 + Demande de récupérer les hachages d'exécution par transferId + Code d'erreur : + 2003 + + + 6 + Demander les hachages de messages d'exécution en doublon + + SELET transferId, hash + FROM + transferFulfilmentDuplicateCheck + WHERE transferId = request.params.id + + + 7 + Renvoyer les hachages existants + + + 8 + Renvoyer la ou les empreintes des messages d'exécution + + + + + 9 + Parcourir la liste des hachages renvoyés et comparer chaque entrée au hachage du message calculé + + + alt + [Hachage correspondant] + + + 10 + Demande de récupérer l'exécution du transfert et l'état + Code d'erreur : + 2003 + + + 11 + Demande de récupérer l'exécution du transfert et l'état + + transferFulfilment + transferStateChange + + + 12 + Renvoyer l'exécution du transfert et l'état + + + 13 + Renvoyer l'exécution du transfert et l'état + + + alt + [transferFulfilment.isValid == 0] + + + break + + + + + + 14 + Gestion des erreurs : + 3105 + + [transferState IN ['COMMITTED', 'ABORTED']] + + + break + + + ref + Envoyer une notification au participant (bénéficiaire) +   + + [transferState NOT 'RESERVED'] + + + break + + + + + + 15 + Code d'erreur : + 2001 + + + + break + + + + + + 16 + Laisser la requête précédente se terminer + + [Hachage non correspondant] + + + 17 + Demande de persister le hachage du transfert + Codes d'erreur : + 2003 + + + 18 + Persister le hachage + + transferFulfilmentDuplicateCheck + + + 19 + Renvoyer le succès + + + alt + [Appel action=='reject' effectué sur PUT /transfers/{ID}] + + + 20 + Demander les informations pour les contrôles de validation + Code d'erreur : + 2003 + + + 21 + Récupérer depuis la base de données + + transfer + + + 22 +   + + + 23 + Renvoyer le transfert + + + alt + [Exécution présente dans le message PUT /transfers/{ID}] + + + + + 24 + Valider que Transfer.ilpCondition = SHA-256 (content.payload.fulfilment) + Code d'erreur : + 2001 + + + Persister l'exécution + + + 25 + Persister l'exécution avec le résultat du contrôle ci-dessus (transferFulfilment.isValid) + Code d'erreur : + 2003 + + + 26 + Persister en base de données + + transferFulfilment + transferExtension + + + 27 + Renvoyer le succès + + [Exécution NON présente dans le message PUT /transfers/{ID}] + + + + + 28 + Valider que le message d'exécution du transfert vers Abort est valide + Code d'erreur : + 2001 + + + Persister les extensions + + + 29 + Persister les éléments extensionList + Code d'erreur : + 2003 + + + 30 + Persister en base de données + + transferExtension + + + 31 + Renvoyer le succès + + + alt + [Validation de Transfer.ilpCondition réussie OU validation générique réussie] + + + Persister l'état du transfert (transferState='RECEIVED_REJECT') + + + 32 + Demande de persister le transfert state + Code d'erreur : + 2003 + + + 33 + Persister l'état du transfert + + transferStateChange + + + 34 + Renvoyer le succès + + + Message : + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: position, + action: reject, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 35 + Acheminer et publier l'événement de position pour le payeur + + [Validation d'exécution infructueuse ou échec générique] + + + break + + + Message : + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: position, + action: reject, + createdAt: <timestamp>, + state: { + status: "error", + code: 1 + } + } + } + } + + + 36 + Acheminer et publier l'événement de notification pour le bénéficiaire + + [action=='abort' Rappel d'erreur] + + + alt + [Validation réussie] + + + Persister l'état du transfert (transferState='RECEIVED_ERROR') + + + 37 + Demande de persister le transfert state and Error + Code d'erreur : + 2003 + + + 38 + Persister l'état du transfert et les informations d'erreur + + transferStateChange + transferError + transferExtension + + + 39 + Renvoyer le succès + + + Message : + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: position, + action: abort, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 40 + Acheminer et publier l'événement de position pour le payeur + + [Message d'erreur de transfert invalide] + + + break + + + Message : + { + id: <ID>, + from: <transferHeaders.FSPIOP-Source>, + to: <transferHeaders.FSPIOP-Destination>, + type: application/json, + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: position, + action: abort, + createdAt: <timestamp>, + state: { + status: "error", + code: 1 + } + } + } + } + + + 41 + Acheminer et publier l'événement de notification pour le bénéficiaire + + [Consommer des messages groupés] + + + À livrer dans une future story + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-request-dup-check-9.1.1.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-request-dup-check-9.1.1.plantuml new file mode 100644 index 000000000..e9f1b0fa8 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-request-dup-check-9.1.1.plantuml @@ -0,0 +1,114 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + -------------- + ******'/ + +@startuml +' declate title +title 9.1.1. Contrôle de doublon de requête (incl. transferts, devis, transferts groupés, devis groupés) + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +collections "topic-source" as TOPIC_SOURCE +control "Gestionnaire de\ntraitement" as HANDLER +collections "topic-event" as TOPIC_EVENTS +collections "topic-notifcation" as TOPIC_NOTIFICATION +entity "DAO requête" as DAO +database "Stockage central" as DB + +box "Service central" #LightYellow + participant TOPIC_SOURCE + participant HANDLER + participant TOPIC_EVENTS + participant TOPIC_NOTIFICATION + participant DAO + participant DB +end box + +' start flow +activate HANDLER + +group Contrôle de doublon de requête + TOPIC_SOURCE <- HANDLER: Consommer le message + activate TOPIC_SOURCE + deactivate TOPIC_SOURCE + + HANDLER -> HANDLER: Générer le hachage : **generatedHash** + group Contrôle UUID (compareById) + HANDLER -> DAO: Interroger le hachage via getDuplicateDataFuncOverride(id)\nCode d'erreur : 2003 + activate DAO + note right of DAO #lightgrey + Le mot-clé //request// est à remplacer par + **transfer**, **transferFulfilment**, + **bulkTransfer** ou autre selon + la surcharge + end note + DAO -> DB: getDuplicateDataFuncOverride + hnote over DB #lightyellow + //request//DuplicateCheck + end note + activate DB + DB --> DAO: Renvoyer **duplicateHashRecord** + deactivate DB + DAO --> HANDLER: Renvoyer **hasDuplicateId** + deactivate DAO + end + + alt hasDuplicateId == TRUE + group Contrôle de hachage (compareByHash) + note right of HANDLER #lightgrey + generatedHash == duplicateHashRecord.hash + end note + HANDLER -> HANDLER: Renvoyer **hasDuplicateHash** + end + else hasDuplicateId == FALSE + group Enregistrer le hachage du message + HANDLER -> DAO: Persister le hachage via saveHashFuncOverride(id, generatedHash)\nCode d'erreur : 2003 + activate DAO + DAO -> DB: Persister **generatedHash** + activate DB + deactivate DB + hnote over DB #lightyellow + //request//DuplicateCheck + end note + DAO --> HANDLER: Renvoyer le succès + deactivate DAO + end + end + + note right of HANDLER #yellow + return { + hasDuplicateId: Boolean, + hasDuplicateHash: Boolean + } + end note +end + +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-request-dup-check-9.1.1.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-request-dup-check-9.1.1.svg new file mode 100644 index 000000000..5f63aee21 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-request-dup-check-9.1.1.svg @@ -0,0 +1,168 @@ + + 9.1.1. Contrôle de doublon de requête (incl. transferts, devis, transferts groupés, devis groupés) + + + 9.1.1. Contrôle de doublon de requête (incl. transferts, devis, transferts groupés, devis groupés) + + Service central + + + + + + + + + + + + + + + + + + + + topic-source + + + topic-source + Gestionnaire de + traitement + + + Gestionnaire de + traitement + + + + + topic-event + + + topic-event + + + topic-notifcation + + + topic-notifcation + DAO requête + + + DAO requête + + + Stockage central + + + Stockage central + + + + + + + + + + + Contrôle de doublon de requête + + + 1 + Consommer le message + + + + + 2 + Générer le hachage : + generatedHash + + + Contrôle UUID (compareById) + + + 3 + Interroger le hachage via getDuplicateDataFuncOverride(id) + Code d'erreur : + 2003 + + + Le mot-clé + request + est à remplacer par + transfer + , + transferFulfilment + , + bulkTransfer + ou autre selon + la surcharge + + + 4 + getDuplicateDataFuncOverride + + request + DuplicateCheck + + + 5 + Renvoyer + duplicateHashRecord + + + 6 + Renvoyer + hasDuplicateId + + + alt + [hasDuplicateId == TRUE] + + + Contrôle de hachage (compareByHash) + + + generatedHash == duplicateHashRecord.hash + + + + + 7 + Renvoyer + hasDuplicateHash + + [hasDuplicateId == FALSE] + + + Enregistrer le hachage du message + + + 8 + Persister le hachage via saveHashFuncOverride(id, generatedHash) + Code d'erreur : + 2003 + + + 9 + Persister + generatedHash + + request + DuplicateCheck + + + 10 + Renvoyer le succès + + + return { + hasDuplicateId: Boolean, + hasDuplicateHash: Boolean + } + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-setmodel-2.1.2.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-setmodel-2.1.2.plantuml new file mode 100644 index 000000000..566b44fb4 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-setmodel-2.1.2.plantuml @@ -0,0 +1,122 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * ModusBox + - Georgi Georgiev + -------------- + ******'/ + +@startuml +' declate title +title 2.1.2. Consommation par le gestionnaire de modèle de règlement +autonumber +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store +' declare actors +collections "topic-\nsettlement-model" as TOPIC_SETMODEL +control "Gestionnaire de modèle\nde règlement" as SETMODEL_HANDLER +collections "topic-event" as TOPIC_EVENT +entity "DAO de règlement" as SET_DAO +database "Stockage central" as DB + +box "Service central" #LightYellow + participant TOPIC_SETMODEL + participant SETMODEL_HANDLER + participant TOPIC_EVENT + participant SET_DAO + participant DB +end box + +' start flow +activate SETMODEL_HANDLER +group Consommation du gestionnaire de modèle de règlement + alt Consommer un message unique + TOPIC_SETMODEL <- SETMODEL_HANDLER: Consommer le message d'événement de modèle de règlement + activate TOPIC_SETMODEL + deactivate TOPIC_SETMODEL + break + group Valider l'événement + SETMODEL_HANDLER <-> SETMODEL_HANDLER: Valider l'événement — règle : type == 'setmodel' && action == 'commit'\nCodes d'erreur : 2001 + end + end + group Persister les informations d'événement + ||| + SETMODEL_HANDLER -> TOPIC_EVENT: Publier les informations d'événement + ref over SETMODEL_HANDLER, TOPIC_EVENT: Consommation du gestionnaire d'événements\n + ||| + end + + SETMODEL_HANDLER -> SET_DAO: Attribuer le(s) état(s) de transferParticipant\nCode d'erreur : 2003 + activate SET_DAO + group TRANSACTION BD + SET_DAO -> DB: Récupérer les entrées transferParticipant + activate DB + hnote over DB #lightyellow + transferParticipant + end note + DB --> SET_DAO: Renvoyer **transferParticipantRecords** + deactivate DB + + loop for each transferParticipant + note right of SET_DAO #lightgrey + La mise en cache des modèles de règlement est à considérer + end note + SET_DAO -> DB: Obtenir le modèle de règlement par devise et écriture de grand livre + activate DB + hnote over DB #lightyellow + settlementModel + end note + DB --> SET_DAO: Renvoyer **settlementModel** + deactivate DB + + opt settlementModel.delay == 'IMMEDIATE' && settlementModel.granularity == 'GROSS' + SET_DAO -> DB: Définir les états : CLOSED->PENDING_SETTLEMENT->SETTLED + activate DB + hnote over DB #lightyellow + transferParticipantStateChange + transferParticipant + end note + deactivate DB + else + SET_DAO -> DB: Définir l'état : OPEN + activate DB + hnote over DB #lightyellow + transferParticipantStateChange + transferParticipant + end note + deactivate DB + end + + end + end + SETMODEL_HANDLER <-- SET_DAO: Renvoyer le succès + deactivate SET_DAO + else Consommer des messages groupés + note left of SETMODEL_HANDLER #lightblue + À livrer dans une future story + end note + end +end +deactivate SETMODEL_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-setmodel-2.1.2.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-setmodel-2.1.2.svg new file mode 100644 index 000000000..a3792684f --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-setmodel-2.1.2.svg @@ -0,0 +1,174 @@ + + 2.1.2. Consommation par le gestionnaire de modèle de règlement + + + 2.1.2. Consommation par le gestionnaire de modèle de règlement + + Service central + + + + + + + + + + + + + + + + + + + + + + + topic- + settlement-model + + + topic- + settlement-model + Gestionnaire de modèle + de règlement + + + Gestionnaire de modèle + de règlement + + + + + topic-event + + + topic-event + DAO de règlement + + + DAO de règlement + + + Stockage central + + + Stockage central + + + + + + + + + + + + Consommation du gestionnaire de modèle de règlement + + + alt + [Consommer un message unique] + + + 1 + Consommer le message d'événement de modèle de règlement + + + break + + + Valider l'événement + + + + + + 2 + Valider l'événement — règle : type == 'setmodel' && action == 'commit' + Codes d'erreur : + 2001 + + + Persister les informations d'événement + + + 3 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements +   + + + 4 + Attribuer le(s) état(s) de transferParticipant + Code d'erreur : + 2003 + + + TRANSACTION BD + + + 5 + Récupérer les entrées transferParticipant + + transferParticipant + + + 6 + Renvoyer + transferParticipantRecords + + + loop + [for each transferParticipant] + + + La mise en cache des modèles de règlement est à considérer + + + 7 + Obtenir le modèle de règlement par devise et écriture de grand livre + + settlementModel + + + 8 + Renvoyer + settlementModel + + + opt + [settlementModel.delay == 'IMMEDIATE' && settlementModel.granularity == 'GROSS'] + + + 9 + Définir les états : CLOSED->PENDING_SETTLEMENT->SETTLED + + transferParticipantStateChange + transferParticipant + + + + 10 + Définir l'état : OPEN + + transferParticipantStateChange + transferParticipant + + + 11 + Renvoyer le succès + + [Consommer des messages groupés] + + + À livrer dans une future story + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-timeout-2.3.0.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-timeout-2.3.0.plantuml new file mode 100644 index 000000000..ec0b99d55 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-timeout-2.3.0.plantuml @@ -0,0 +1,107 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * ModusBox + - Georgi Georgiev + -------------- + ******'/ + +@startuml +' declate title +title 2.3.0. Temporisation du transfert + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +actor "DFSP1\nPayeur" as DFSP1 +actor "DFSP2\nBénéficiaire" as DFSP2 +boundary "Adaptateur\nML API" as MLAPI +control "Gestionnaire de\nnotification" as NOTIFY_HANDLER +control "Gestionnaire de\ntemporisation (préparation)" as TIMEOUT_PREP_HANDLER +collections "topic-\ntransfer-timeout" as TOPIC_TRANSFER_TIMEOUT +control "Gestionnaire de\ntemporisation" as TIMEOUT_HANDLER +collections "topic-\ntransfer-position" as TOPIC_TRANSFER_POSITION +control "Gestionnaire\nde position" as POS_HANDLER +collections "topic-notification" as TOPIC_NOTIFICATIONS + +box "Fournisseurs de services financiers" #lightgray + participant DFSP1 + participant DFSP2 +end box + +box "Service adaptateur ML API" #lightblue + participant MLAPI + participant NOTIFY_HANDLER +end box + +box "Service central" #lightyellow + participant TIMEOUT_PREP_HANDLER + participant TOPIC_TRANSFER_TIMEOUT + participant TIMEOUT_HANDLER + participant TOPIC_TRANSFER_POSITION + participant POS_HANDLER + participant TOPIC_NOTIFICATIONS +end box + +' start flow +activate TIMEOUT_PREP_HANDLER +activate NOTIFY_HANDLER +activate TIMEOUT_HANDLER +activate POS_HANDLER +group Expiration du transfert + ||| + ref over TIMEOUT_PREP_HANDLER, TOPIC_TRANSFER_TIMEOUT: Consommation du gestionnaire de temporisation\n + TIMEOUT_PREP_HANDLER -> TOPIC_TRANSFER_TIMEOUT: Produire le message + ||| + TOPIC_TRANSFER_TIMEOUT <- TIMEOUT_HANDLER: Consommer le message + ref over TOPIC_TRANSFER_TIMEOUT, TIMEOUT_HANDLER: Consommation du gestionnaire de temporisation\n + alt transferStateId == 'RECEIVED_PREPARE' + TIMEOUT_HANDLER -> TOPIC_NOTIFICATIONS: Produire le message + else transferStateId == 'RESERVED' + TIMEOUT_HANDLER -> TOPIC_TRANSFER_POSITION: Produire le message + TOPIC_TRANSFER_POSITION <- POS_HANDLER: Consommer le message + ref over TOPIC_TRANSFER_POSITION, TOPIC_NOTIFICATIONS: Consommation gestionnaire de position (temporisation)\n + POS_HANDLER -> TOPIC_NOTIFICATIONS: Produire le message + end + opt action IN ['timeout-received', 'timeout-reserved'] + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consommer le message + ref over DFSP1, TOPIC_NOTIFICATIONS : Envoyer une notification au participant (payeur)\n + NOTIFY_HANDLER -> DFSP1: Envoyer la notification de rappel (callback) + end + ||| + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER: Consommer le message + opt action == 'timeout-reserved' + ||| + ref over DFSP2, TOPIC_NOTIFICATIONS : Envoyer une notification au participant (bénéficiaire)\n + NOTIFY_HANDLER -> DFSP2: Envoyer la notification de rappel (callback) + end +end +deactivate POS_HANDLER +deactivate TIMEOUT_HANDLER +deactivate NOTIFY_HANDLER +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-timeout-2.3.0.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-timeout-2.3.0.svg new file mode 100644 index 000000000..cd123a985 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-timeout-2.3.0.svg @@ -0,0 +1,195 @@ + + 2.3.0. Temporisation du transfert + + + 2.3.0. Temporisation du transfert + + Fournisseurs de services financiers + + Service adaptateur ML API + + Service central + + + + + + + + + + + + + + + + + + + DFSP1 + Payeur + + + DFSP1 + Payeur + + + DFSP2 + Bénéficiaire + + + DFSP2 + Bénéficiaire + + + Adaptateur + ML API + + + Adaptateur + ML API + + + Gestionnaire de + notification + + + Gestionnaire de + notification + + + Gestionnaire de + temporisation (préparation) + + + Gestionnaire de + temporisation (préparation) + + + + + topic- + transfer-timeout + + + topic- + transfer-timeout + Gestionnaire de + temporisation + + + Gestionnaire de + temporisation + + + + + topic- + transfer-position + + + topic- + transfer-position + Gestionnaire + de position + + + Gestionnaire + de position + + + + + topic-notification + + + topic-notification + + + + + + + Expiration du transfert + + + ref + Consommation du gestionnaire de temporisation +   + + + 1 + Produire le message + + + 2 + Consommer le message + + + ref + Consommation du gestionnaire de temporisation +   + + + alt + [transferStateId == 'RECEIVED_PREPARE'] + + + 3 + Produire le message + + [transferStateId == 'RESERVED'] + + + 4 + Produire le message + + + 5 + Consommer le message + + + ref + Consommation gestionnaire de position (temporisation) +   + + + 6 + Produire le message + + + opt + [action IN ['timeout-received', 'timeout-reserved']] + + + 7 + Consommer le message + + + ref + Envoyer une notification au participant (payeur) +   + + + 8 + Envoyer la notification de rappel (callback) + + + 9 + Consommer le message + + + opt + [action == 'timeout-reserved'] + + + ref + Envoyer une notification au participant (bénéficiaire) +   + + + 10 + Envoyer la notification de rappel (callback) + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-timeout-2.3.1.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-timeout-2.3.1.plantuml new file mode 100644 index 000000000..dcb7dff4b --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-timeout-2.3.1.plantuml @@ -0,0 +1,132 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * ModusBox + - Georgi Georgiev + -------------- + ******'/ + +@startuml +' declare title +title 2.3.1. Gestionnaire de temporisation (préparation) + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +control "Gestionnaire de\ntemporisation (préparation)" as TIMEOUT_PREP_HANDLER +collections "topic-\ntransfer-timeout" as TOPIC_TRANSFER_TIMEOUT +collections "topic-event" as EVENT_TOPIC +entity "Timeout DAO" as TIMEOUT_DAO +database "Stockage central" as DB + +box "Service central" #lightyellow + participant TIMEOUT_PREP_HANDLER + participant TOPIC_TRANSFER_TIMEOUT + participant EVENT_TOPIC + participant TIMEOUT_DAO + participant DB +end box + +' start flow + +group Gestionnaire de temporisation (préparation) + activate TIMEOUT_PREP_HANDLER + group Persister les informations d'événement + TIMEOUT_PREP_HANDLER -> EVENT_TOPIC: Publier les informations d'événement + ref over TIMEOUT_PREP_HANDLER, EVENT_TOPIC : Consommation du gestionnaire d'événements\n + end + + group Nettoyage + TIMEOUT_PREP_HANDLER -> TIMEOUT_DAO: Nettoyer les transferts exécutés\nCode d'erreur : 2003 + activate TIMEOUT_DAO + TIMEOUT_DAO -> DB: Supprimer les enregistrements des transferts exécutés + activate DB + deactivate DB + hnote over DB #lightyellow + DELETE et + FROM **expiringTransfer** et + JOIN **transferFulfilment** tf + ON tf.transferId = et.transferId + end note + TIMEOUT_DAO --> TIMEOUT_PREP_HANDLER: Renvoyer le succès + deactivate TIMEOUT_DAO + end + + group Lister les expirés + TIMEOUT_PREP_HANDLER -> TIMEOUT_DAO: Récupérer les transferts expirés\nCode d'erreur : 2003 + activate TIMEOUT_DAO + TIMEOUT_DAO -> DB: Sélection via index + activate DB + hnote over DB #lightyellow + SELECT * + FROM **expiringTransfer** + WHERE expirationDate < currentTimestamp + end note + TIMEOUT_DAO <-- DB: Renvoyer les transferts expirés + deactivate DB + TIMEOUT_DAO --> TIMEOUT_PREP_HANDLER: Renvoyer **expiredTransfersList** + deactivate TIMEOUT_DAO + end + + + + loop for each transfer in the list + ||| + note right of TIMEOUT_PREP_HANDLER #yellow + Message : + { + id: + from: , + to: , + type: application/json + content: { + headers: null, + payload: + }, + metadata: { + event: { + id: , + responseTo: null, + type: transfer, + action: timeout, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + TIMEOUT_PREP_HANDLER -> TOPIC_TRANSFER_TIMEOUT: Publier l'événement de temporisation\nCode d'erreur : 2003 + activate TOPIC_TRANSFER_TIMEOUT + deactivate TOPIC_TRANSFER_TIMEOUT + end + + deactivate TIMEOUT_PREP_HANDLER +end +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-timeout-2.3.1.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-timeout-2.3.1.svg new file mode 100644 index 000000000..54989abf6 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-timeout-2.3.1.svg @@ -0,0 +1,169 @@ + + 2.3.1. Gestionnaire de temporisation (préparation) + + + 2.3.1. Gestionnaire de temporisation (préparation) + + Service central + + + + + + + + + + + + + + + + + Gestionnaire de + temporisation (préparation) + + + Gestionnaire de + temporisation (préparation) + + + + + topic- + transfer-timeout + + + topic- + transfer-timeout + + + topic-event + + + topic-event + Timeout DAO + + + Timeout DAO + + + Stockage central + + + Stockage central + + + + + + + + + + + Gestionnaire de temporisation (préparation) + + + Persister les informations d'événement + + + 1 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements +   + + + Nettoyage + + + 2 + Nettoyer les transferts exécutés + Code d'erreur : + 2003 + + + 3 + Supprimer les enregistrements des transferts exécutés + + DELETE et + FROM + expiringTransfer + et + JOIN + transferFulfilment + tf + ON tf.transferId = et.transferId + + + 4 + Renvoyer le succès + + + Lister les expirés + + + 5 + Récupérer les transferts expirés + Code d'erreur : + 2003 + + + 6 + Sélection via index + + SELECT * + FROM + expiringTransfer + WHERE expirationDate < currentTimestamp + + + 7 + Renvoyer les transferts expirés + + + 8 + Renvoyer + expiredTransfersList + + + loop + [for each transfer in the list] + + + Message : + { + id: <uuid> + from: <switch>, + to: <payerFsp>, + type: application/json + content: { + headers: null, + payload: <transfer> + }, + metadata: { + event: { + id: <uuid>, + responseTo: null, + type: transfer, + action: timeout, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 9 + Publier l'événement de temporisation + Code d'erreur : + 2003 + + diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-timeout-2.3.2.plantuml b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-timeout-2.3.2.plantuml new file mode 100644 index 000000000..5657be9f5 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-timeout-2.3.2.plantuml @@ -0,0 +1,227 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * ModusBox + - Georgi Georgiev + - Rajiv Mothilal + -------------- + ******'/ + +@startuml +' declare title +title 2.3.2. Gestionnaire de temporisation + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +control "Gestionnaire de temporisation du transfert" as TIMEOUT_HANDLER +collections "topic-\ntransfer-timeout" as TOPIC_TRANSFER_TIMEOUT +collections "topic-\ntransfer-position" as TOPIC_TRANSFER_POSITION +collections "topic-\nnotification" as NOTIFICATIONS_TOPIC +collections "topic-event" as EVENT_TOPIC +entity "Timeout DAO" as TIMEOUT_DAO +database "Stockage central" as DB + +box "Service central" #lightyellow + participant TOPIC_TRANSFER_TIMEOUT + participant TIMEOUT_HANDLER + participant TOPIC_TRANSFER_POSITION + participant NOTIFICATIONS_TOPIC + participant EVENT_TOPIC + participant TIMEOUT_DAO + participant DB +end box + +' start flow + +group Consommation du gestionnaire de temporisation + activate TIMEOUT_HANDLER + TOPIC_TRANSFER_TIMEOUT <- TIMEOUT_HANDLER: Consommer le message + activate TOPIC_TRANSFER_TIMEOUT + deactivate TOPIC_TRANSFER_TIMEOUT + + group Persister les informations d'événement + TIMEOUT_HANDLER -> EVENT_TOPIC: Publier les informations d'événement + ref over TIMEOUT_HANDLER, EVENT_TOPIC: Consommation du gestionnaire d'événements\n + end + + group Obtenir les infos du transfert + TIMEOUT_HANDLER -> TIMEOUT_DAO: Acquérir les informations du transfert\nCode d'erreur : 2003 + activate TIMEOUT_DAO + TIMEOUT_DAO -> DB: Obtenir les données et l'état du transfert + activate DB + hnote over DB #lightyellow + transfer + transferParticipant + participantCurrency + participant + transferStateChange + end note + TIMEOUT_DAO <-- DB: Renvoyer **transferInfo** + deactivate DB + TIMEOUT_HANDLER <-- TIMEOUT_DAO: Renvoyer **transferInfo** + deactivate TIMEOUT_DAO + end + + alt transferInfo.transferStateId == 'RECEIVED_PREPARE' + TIMEOUT_HANDLER -> TIMEOUT_DAO: Définir l'état EXPIRED_PREPARED\nCode d'erreur : 2003 + activate TIMEOUT_DAO + TIMEOUT_DAO -> DB: Insérer le changement d'état + activate DB + deactivate DB + hnote over DB #lightyellow + transferStateChange + end note + TIMEOUT_HANDLER <-- TIMEOUT_DAO: Renvoyer le succès + deactivate TIMEOUT_DAO + + note right of TIMEOUT_HANDLER #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + headers: { + Content-Length: , + Content-Type: , + Date: , + X-Forwarded-For: , + FSPIOP-Source: , + FSPIOP-Destination: , + FSPIOP-Encryption: , + FSPIOP-Signature: , + FSPIOP-URI: , + FSPIOP-HTTP-Method: + }, + payload: { + "errorInformation": { + "errorCode": 3303, + "errorDescription": "Transfert expiré", + "extensionList": + } + } + }, + metadata: { + event: { + id: , + type: notification, + action: timeout-received, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + TIMEOUT_HANDLER -> NOTIFICATIONS_TOPIC: Publier l'événement de notification + activate NOTIFICATIONS_TOPIC + deactivate NOTIFICATIONS_TOPIC + else transferInfo.transferStateId == 'RESERVED' + TIMEOUT_HANDLER -> TIMEOUT_DAO: Définir l'état RESERVED_TIMEOUT\nCode d'erreur : 2003 + activate TIMEOUT_DAO + TIMEOUT_DAO -> DB: Insérer le changement d'état + activate DB + deactivate DB + hnote over DB #lightyellow + transferStateChange + end note + TIMEOUT_HANDLER <-- TIMEOUT_DAO: Renvoyer le succès + deactivate TIMEOUT_DAO + + note right of TIMEOUT_HANDLER #yellow + Message : + { + id: , + from: , + to: , + type: application/json, + content: { + headers: { + Content-Length: , + Content-Type: , + Date: , + X-Forwarded-For: , + FSPIOP-Source: , + FSPIOP-Destination: , + FSPIOP-Encryption: , + FSPIOP-Signature: , + FSPIOP-URI: , + FSPIOP-HTTP-Method: + }, + payload: { + "errorInformation": { + "errorCode": 3303, + "errorDescription": "Transfert expiré", + "extensionList": + } + } + }, + metadata: { + event: { + id: , + type: position, + action: timeout-reserved, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + TIMEOUT_HANDLER -> TOPIC_TRANSFER_POSITION: Acheminer et publier l'événement de position\nCode d'erreur : 2003 + activate TOPIC_TRANSFER_POSITION + deactivate TOPIC_TRANSFER_POSITION + else + note right of TIMEOUT_HANDLER #lightgrey + Tout autre état est ignoré + end note + end + + group Nettoyage + TIMEOUT_HANDLER -> TIMEOUT_DAO: Nettoyer le transfert expirant traité\nCode d'erreur : 2003 + activate TIMEOUT_DAO + TIMEOUT_DAO -> DB: Supprimer l'enregistrement + activate DB + deactivate DB + hnote over DB #lightyellow + expiringTransfer + end note + TIMEOUT_HANDLER <-- TIMEOUT_DAO: Renvoyer le succès + deactivate TIMEOUT_DAO + end + + deactivate TIMEOUT_HANDLER +end +@enduml diff --git a/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-timeout-2.3.2.svg b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-timeout-2.3.2.svg new file mode 100644 index 000000000..5e88aa1f1 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/assets/diagrams/sequence/seq-timeout-2.3.2.svg @@ -0,0 +1,302 @@ + + 2.3.2. Gestionnaire de temporisation + + + 2.3.2. Gestionnaire de temporisation + + Service central + + + + + + + + + + + + + + + + + + + + + + + + + + + topic- + transfer-timeout + + + topic- + transfer-timeout + Gestionnaire de temporisation du transfert + + + Gestionnaire de temporisation du transfert + + + + + topic- + transfer-position + + + topic- + transfer-position + + + topic- + notification + + + topic- + notification + + + topic-event + + + topic-event + Timeout DAO + + + Timeout DAO + + + Stockage central + + + Stockage central + + + + + + + + + + + + + + + + + Consommation du gestionnaire de temporisation + + + 1 + Consommer le message + + + Persister les informations d'événement + + + 2 + Publier les informations d'événement + + + ref + Consommation du gestionnaire d'événements +   + + + Obtenir les infos du transfert + + + 3 + Acquérir les informations du transfert + Code d'erreur : + 2003 + + + 4 + Obtenir les données et l'état du transfert + + transfer + transferParticipant + participantCurrency + participant + transferStateChange + + + 5 + Renvoyer + transferInfo + + + 6 + Renvoyer + transferInfo + + + alt + [transferInfo.transferStateId == 'RECEIVED_PREPARE'] + + + 7 + Définir l'état EXPIRED_PREPARED + Code d'erreur : + 2003 + + + 8 + Insérer le changement d'état + + transferStateChange + + + 9 + Renvoyer le succès + + + Message : + { + id: <transferId>, + from: <payerParticipantId>, + to: <payeeParticipantId>, + type: application/json, + content: { +          + headers: + { + Content-Length: <Content-Length>, + Content-Type: <Content-Type>, + Date: <Date>, + X-Forwarded-For: <X-Forwarded-For>, + FSPIOP-Source: <FSPIOP-Source>, + FSPIOP-Destination: <FSPIOP-Destination>, + FSPIOP-Encryption: <FSPIOP-Encryption>, + FSPIOP-Signature: <FSPIOP-Signature>, + FSPIOP-URI: <FSPIOP-URI>, + FSPIOP-HTTP-Method: <FSPIOP-HTTP-Method> + }, + payload: { + "errorInformation": { + "errorCode": 3303, + "errorDescription": "Transfert expiré", + "extensionList": <transferMessage.extensionList> + } + } + }, + metadata: { + event: { + id: <uuid>, + type: notification, + action: timeout-received, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 10 + Publier l'événement de notification + + [transferInfo.transferStateId == 'RESERVED'] + + + 11 + Définir l'état RESERVED_TIMEOUT + Code d'erreur : + 2003 + + + 12 + Insérer le changement d'état + + transferStateChange + + + 13 + Renvoyer le succès + + + Message : + { + id: <transferId>, + from: <payerParticipantId>, + to: <payeeParticipantId>, + type: application/json, + content: { +          + headers: + { + Content-Length: <Content-Length>, + Content-Type: <Content-Type>, + Date: <Date>, + X-Forwarded-For: <X-Forwarded-For>, + FSPIOP-Source: <FSPIOP-Source>, + FSPIOP-Destination: <FSPIOP-Destination>, + FSPIOP-Encryption: <FSPIOP-Encryption>, + FSPIOP-Signature: <FSPIOP-Signature>, + FSPIOP-URI: <FSPIOP-URI>, + FSPIOP-HTTP-Method: <FSPIOP-HTTP-Method> + }, + payload: { + "errorInformation": { + "errorCode": 3303, + "errorDescription": "Transfert expiré", + "extensionList": <transferMessage.extensionList> + } + } + }, + metadata: { + event: { + id: <uuid>, + type: position, + action: timeout-reserved, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 14 + Acheminer et publier l'événement de position + Code d'erreur : + 2003 + + + + Tout autre état est ignoré + + + Nettoyage + + + 15 + Nettoyer le transfert expirant traité + Code d'erreur : + 2003 + + + 16 + Supprimer l'enregistrement + + expiringTransfer + + + 17 + Renvoyer le succès + + diff --git a/docs/fr/technical/technical/central-ledger/transfers/1.1.0-prepare-transfer-request.md b/docs/fr/technical/technical/central-ledger/transfers/1.1.0-prepare-transfer-request.md new file mode 100644 index 000000000..33f25e9d9 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/1.1.0-prepare-transfer-request.md @@ -0,0 +1,16 @@ +# Demande de préparation de transfert (Prepare) + +Diagramme de séquence pour le processus de demande de préparation de transfert. + +## Références dans le diagramme de séquence + +* [Consommation par le gestionnaire Prepare (1.1.1.a)](1.1.1.a-prepare-handler-consume.md) +* **Non implémenté** [Consommation par le gestionnaire Prepare (1.1.1.b)](1.1.1.b-prepare-handler-consume.md) +* [Consommation par le gestionnaire Position (1.1.2.a)](1.1.2.a-position-handler-consume.md) +* **Non implémenté** [Consommation par le gestionnaire Position (1.1.2.b)](1.1.2.b-position-handler-consume.md) +* [Envoi d’une notification au participant (1.1.4.a)](1.1.4.a-send-notification-to-participant.md) +* **Non implémenté** [Envoi d’une notification au participant (1.1.4.b)](1.1.4.b-send-notification-to-participant.md) + +## Diagramme de séquence + +![seq-prepare-1.1.0.svg](../assets/diagrams/sequence/seq-prepare-1.1.0.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/1.1.1.a-prepare-handler-consume.md b/docs/fr/technical/technical/central-ledger/transfers/1.1.1.a-prepare-handler-consume.md new file mode 100644 index 000000000..62173469c --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/1.1.1.a-prepare-handler-consume.md @@ -0,0 +1,11 @@ +# Consommation par le gestionnaire Prepare + +Diagramme de séquence pour le processus de consommation par le gestionnaire Prepare. + +## Références dans le diagramme de séquence + +* [Consommation par le gestionnaire d’événements (9.1.0)](../../central-event-processor/9.1.0-event-handler-placeholder.md) + +## Diagramme de séquence + +![seq-prepare-1.1.1.a.svg](../assets/diagrams/sequence/seq-prepare-1.1.1.a.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/1.1.1.b-prepare-handler-consume.md b/docs/fr/technical/technical/central-ledger/transfers/1.1.1.b-prepare-handler-consume.md new file mode 100644 index 000000000..fc20d8753 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/1.1.1.b-prepare-handler-consume.md @@ -0,0 +1,11 @@ +# Consommation par le gestionnaire Prepare + +Diagramme de séquence pour le processus de consommation par le gestionnaire Prepare. + +## Références dans le diagramme de séquence + +* [Consommation par le gestionnaire d’événements (9.1.0)](../../central-event-processor/9.1.0-event-handler-placeholder.md) + +## Diagramme de séquence + +![seq-prepare-1.1.1.b.svg](../assets/diagrams/sequence/seq-prepare-1.1.1.b.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/1.1.2.a-position-handler-consume.md b/docs/fr/technical/technical/central-ledger/transfers/1.1.2.a-position-handler-consume.md new file mode 100644 index 000000000..4eb87289b --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/1.1.2.a-position-handler-consume.md @@ -0,0 +1,11 @@ +# Consommation par le gestionnaire Position + +Diagramme de séquence pour le processus de consommation par le gestionnaire Position. + +## Références dans le diagramme de séquence + +* [Consommation par le gestionnaire d’événements (9.1.0)](../../central-event-processor/9.1.0-event-handler-placeholder.md) + +## Diagramme de séquence + +![seq-prepare-1.1.2.a.svg](../assets/diagrams/sequence/seq-prepare-1.1.2.a.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/1.1.2.b-position-handler-consume.md b/docs/fr/technical/technical/central-ledger/transfers/1.1.2.b-position-handler-consume.md new file mode 100644 index 000000000..4a4bc74ad --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/1.1.2.b-position-handler-consume.md @@ -0,0 +1,11 @@ +# Consommation par le gestionnaire Position + +Diagramme de séquence pour le processus de consommation par le gestionnaire Position. + +## Références dans le diagramme de séquence + +* [Consommation par le gestionnaire d’événements (9.1.0)](../../central-event-processor/9.1.0-event-handler-placeholder.md) + +## Diagramme de séquence + +![seq-prepare-1.1.2.b.svg](../assets/diagrams/sequence/seq-prepare-1.1.2.b.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/1.1.4.a-send-notification-to-participant-v1.1.md b/docs/fr/technical/technical/central-ledger/transfers/1.1.4.a-send-notification-to-participant-v1.1.md new file mode 100644 index 000000000..95633f16c --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/1.1.4.a-send-notification-to-participant-v1.1.md @@ -0,0 +1,11 @@ +# Envoi d’une notification au participant (v1.1) + +Diagramme de séquence pour la demande d’envoi d’une notification au participant. + +## Références dans le diagramme de séquence + +* [9.1.0 — Consommation par le gestionnaire d’événements](../../central-event-processor/9.1.0-event-handler-placeholder.md) + +## Diagramme de séquence + +![seq-prepare-1.1.4.a-v1.1.svg](../assets/diagrams/sequence/seq-prepare-1.1.4.a-v1.1.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/1.1.4.a-send-notification-to-participant.md b/docs/fr/technical/technical/central-ledger/transfers/1.1.4.a-send-notification-to-participant.md new file mode 100644 index 000000000..1c27e8b89 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/1.1.4.a-send-notification-to-participant.md @@ -0,0 +1,11 @@ +# Envoi d’une notification au participant + +Diagramme de séquence pour la demande d’envoi d’une notification au participant. + +## Références dans le diagramme de séquence + +* [9.1.0 — Consommation par le gestionnaire d’événements](../../central-event-processor/9.1.0-event-handler-placeholder.md) + +## Diagramme de séquence + +![seq-prepare-1.1.4.a.svg](../assets/diagrams/sequence/seq-prepare-1.1.4.a.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/1.1.4.b-send-notification-to-participant.md b/docs/fr/technical/technical/central-ledger/transfers/1.1.4.b-send-notification-to-participant.md new file mode 100644 index 000000000..ac827ecbb --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/1.1.4.b-send-notification-to-participant.md @@ -0,0 +1,11 @@ +# Envoi d’une notification au participant + +Diagramme de séquence pour la demande d’envoi d’une notification au participant. + +## Références dans le diagramme de séquence + +* [9.1.0 — Consommation par le gestionnaire d’événements](../../central-event-processor/9.1.0-event-handler-placeholder.md) + +## Diagramme de séquence + +![seq-prepare-1.1.4.b.svg](../assets/diagrams/sequence/seq-prepare-1.1.4.b.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/1.3.0-position-handler-consume-v1.1.md b/docs/fr/technical/technical/central-ledger/transfers/1.3.0-position-handler-consume-v1.1.md new file mode 100644 index 000000000..2fdfb9a72 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/1.3.0-position-handler-consume-v1.1.md @@ -0,0 +1,14 @@ +# Consommation par le gestionnaire Position (v1.1) + +Diagramme de séquence pour le processus de consommation par le gestionnaire Position. + +## Références dans le diagramme de séquence + +* [Consommation par le gestionnaire d’événements (9.1.0)](../../central-event-processor/9.1.0-event-handler-placeholder.md) +* [Consommation par le gestionnaire de position — Prepare (1.3.1)](1.3.1-prepare-position-handler-consume.md) +* [Consommation par le gestionnaire de position — Fulfil (1.3.2)](1.3.2-fulfil-position-handler-consume-v1.1.md) +* [Consommation par le gestionnaire de position — abandon (1.3.3)](1.3.3-abort-position-handler-consume.md) + +## Diagramme de séquence + +![seq-position-1.3.0-v1.1.svg](../assets/diagrams/sequence/seq-position-1.3.0-v1.1.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/1.3.0-position-handler-consume.md b/docs/fr/technical/technical/central-ledger/transfers/1.3.0-position-handler-consume.md new file mode 100644 index 000000000..d339bc7e9 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/1.3.0-position-handler-consume.md @@ -0,0 +1,14 @@ +# Consommation par le gestionnaire Position + +Diagramme de séquence pour le processus de consommation par le gestionnaire Position. + +## Références dans le diagramme de séquence + +* [Consommation par le gestionnaire d’événements (9.1.0)](../../central-event-processor/9.1.0-event-handler-placeholder.md) +* [Consommation par le gestionnaire de position — Prepare (1.3.1)](1.3.1-prepare-position-handler-consume.md) +* [Consommation par le gestionnaire de position — Fulfil (1.3.2)](1.3.2-fulfil-position-handler-consume.md) +* [Consommation par le gestionnaire de position — abandon (1.3.3)](1.3.3-abort-position-handler-consume.md) + +## Diagramme de séquence + +![seq-position-1.3.0.svg](../assets/diagrams/sequence/seq-position-1.3.0.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/1.3.1-prepare-position-handler-consume.md b/docs/fr/technical/technical/central-ledger/transfers/1.3.1-prepare-position-handler-consume.md new file mode 100644 index 000000000..042288d52 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/1.3.1-prepare-position-handler-consume.md @@ -0,0 +1,7 @@ +# Consommation par le gestionnaire de position — Prepare + +Diagramme de séquence pour le processus de consommation par le gestionnaire de position (Prepare). + +## Diagramme de séquence + +![seq-position-1.3.1-prepare.svg](../assets/diagrams/sequence/seq-position-1.3.1-prepare.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/1.3.2-fulfil-position-handler-consume-v1.1.md b/docs/fr/technical/technical/central-ledger/transfers/1.3.2-fulfil-position-handler-consume-v1.1.md new file mode 100644 index 000000000..04414d455 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/1.3.2-fulfil-position-handler-consume-v1.1.md @@ -0,0 +1,7 @@ +# Consommation par le gestionnaire de position — Fulfil (v1.1) + +Diagramme de séquence pour le processus de consommation par le gestionnaire de position (Fulfil). + +## Diagramme de séquence + +![seq-position-1.3.2-fulfil-v1.1.svg](../assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/1.3.2-fulfil-position-handler-consume.md b/docs/fr/technical/technical/central-ledger/transfers/1.3.2-fulfil-position-handler-consume.md new file mode 100644 index 000000000..27a72cbaf --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/1.3.2-fulfil-position-handler-consume.md @@ -0,0 +1,7 @@ +# Consommation par le gestionnaire de position — Fulfil + +Diagramme de séquence pour le processus de consommation par le gestionnaire de position (Fulfil). + +## Diagramme de séquence + +![seq-position-1.3.2-fulfil.svg](../assets/diagrams/sequence/seq-position-1.3.2-fulfil.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/1.3.3-abort-position-handler-consume.md b/docs/fr/technical/technical/central-ledger/transfers/1.3.3-abort-position-handler-consume.md new file mode 100644 index 000000000..3aa42d19d --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/1.3.3-abort-position-handler-consume.md @@ -0,0 +1,7 @@ +# Consommation par le gestionnaire de position — abandon + +Diagramme de séquence pour le processus de consommation par le gestionnaire de position (abandon). + +## Diagramme de séquence + +![seq-position-1.3.3-abort.svg](../assets/diagrams/sequence/seq-position-1.3.3-abort.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/2.1.0-fulfil-transfer-request-v1.1.md b/docs/fr/technical/technical/central-ledger/transfers/2.1.0-fulfil-transfer-request-v1.1.md new file mode 100644 index 000000000..ccac99839 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/2.1.0-fulfil-transfer-request-v1.1.md @@ -0,0 +1,13 @@ +# Demande de transfert Fulfil — succès (v1.1) + +Diagramme de séquence pour la demande de transfert Fulfil en cas de succès. + +## Références dans le diagramme de séquence + +* [Consommation par le gestionnaire Fulfil (succès) (2.1.1)](2.1.1-fulfil-handler-consume-v1.1.md) +* [Consommation par le gestionnaire de position — Fulfil (succès) (1.3.2)](1.3.2-fulfil-position-handler-consume-v1.1.md) +* [Envoi d’une notification au participant (1.1.4.a)](1.1.4.a-send-notification-to-participant-v1.1.md) + +## Diagramme de séquence + +![seq-fulfil-2.1.0-v1.1.svg](../assets/diagrams/sequence/seq-fulfil-2.1.0-v1.1.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/2.1.0-fulfil-transfer-request.md b/docs/fr/technical/technical/central-ledger/transfers/2.1.0-fulfil-transfer-request.md new file mode 100644 index 000000000..49d5ddaa6 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/2.1.0-fulfil-transfer-request.md @@ -0,0 +1,13 @@ +# Demande de transfert Fulfil — succès + +Diagramme de séquence pour la demande de transfert Fulfil en cas de succès. + +## Références dans le diagramme de séquence + +* [Consommation par le gestionnaire Fulfil (succès) (2.1.1)](2.1.1-fulfil-handler-consume.md) +* [Consommation par le gestionnaire de position — Fulfil (succès) (1.3.2)](1.3.2-fulfil-position-handler-consume.md) +* [Envoi d’une notification au participant (1.1.4.a)](1.1.4.a-send-notification-to-participant.md) + +## Diagramme de séquence + +![seq-fulfil-2.1.0.svg](../assets/diagrams/sequence/seq-fulfil-2.1.0.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/2.1.1-fulfil-handler-consume-v1.1.md b/docs/fr/technical/technical/central-ledger/transfers/2.1.1-fulfil-handler-consume-v1.1.md new file mode 100644 index 000000000..9aaa4433b --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/2.1.1-fulfil-handler-consume-v1.1.md @@ -0,0 +1,13 @@ +# Consommation par le gestionnaire Fulfil (succès) (v1.1) + +Diagramme de séquence pour le processus de consommation par le gestionnaire Fulfil. + +## Références dans le diagramme de séquence + +* [Consommation par le gestionnaire d’événements (9.1.0)](../../central-event-processor/9.1.0-event-handler-placeholder.md) +* [Validation de signature (seq-signature-validation)](../../central-event-processor/signature-validation.md) +* [Envoi d’une notification au participant (1.1.4.a)](1.1.4.a-send-notification-to-participant-v1.1.md) + +## Diagramme de séquence + +![seq-fulfil-2.1.1-v1.1.svg](../assets/diagrams/sequence/seq-fulfil-2.1.1-v1.1.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/2.1.1-fulfil-handler-consume.md b/docs/fr/technical/technical/central-ledger/transfers/2.1.1-fulfil-handler-consume.md new file mode 100644 index 000000000..47ab7a04e --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/2.1.1-fulfil-handler-consume.md @@ -0,0 +1,13 @@ +# Consommation par le gestionnaire Fulfil (succès) + +Diagramme de séquence pour le processus de consommation par le gestionnaire Fulfil. + +## Références dans le diagramme de séquence + +* [Consommation par le gestionnaire d’événements (9.1.0)](../../central-event-processor/9.1.0-event-handler-placeholder.md) +* [Validation de signature (seq-signature-validation)](../../central-event-processor/signature-validation.md) +* [Envoi d’une notification au participant (1.1.4.a)](1.1.4.a-send-notification-to-participant.md) + +## Diagramme de séquence + +![seq-fulfil-2.1.1.svg](../assets/diagrams/sequence/seq-fulfil-2.1.1.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/2.2.0-fulfil-reject-transfer-v1.1.md b/docs/fr/technical/technical/central-ledger/transfers/2.2.0-fulfil-reject-transfer-v1.1.md new file mode 100644 index 000000000..2a4cf8631 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/2.2.0-fulfil-reject-transfer-v1.1.md @@ -0,0 +1,7 @@ +# Le bénéficiaire envoie une demande d’abandon Fulfil pour le transfert (v1.1) + +Diagramme de séquence pour le processus de rejet Fulfil d’un transfert pour la version 1.1 de l’API. + +## Diagramme de séquence + +![seq-reject-2.2.0-v1.1.svg](../assets/diagrams/sequence/seq-reject-2.2.0-v1.1.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/2.2.0-fulfil-reject-transfer.md b/docs/fr/technical/technical/central-ledger/transfers/2.2.0-fulfil-reject-transfer.md new file mode 100644 index 000000000..05a23dd9c --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/2.2.0-fulfil-reject-transfer.md @@ -0,0 +1,13 @@ +# [Obsolète] Le bénéficiaire envoie une demande de rejet Fulfil pour le transfert + +Diagramme de séquence pour le processus de rejet Fulfil d’un transfert. + +## Références dans le diagramme de séquence + +* [Consommation par le gestionnaire Fulfil (rejet / abandon) (2.2.1)](2.2.1-fulfil-reject-handler.md) +* [Consommation par le gestionnaire de position — rejet (1.3.3)](1.3.3-abort-position-handler-consume.md) +* [Envoi d’une notification au participant (1.1.4.a)](1.1.4.a-send-notification-to-participant-v1.1.md) + +## Diagramme de séquence + +![seq-reject-2.2.0.svg](../assets/diagrams/sequence/seq-reject-2.2.0.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/2.2.0.a-fulfil-abort-transfer-v1.1.md b/docs/fr/technical/technical/central-ledger/transfers/2.2.0.a-fulfil-abort-transfer-v1.1.md new file mode 100644 index 000000000..9015f2af7 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/2.2.0.a-fulfil-abort-transfer-v1.1.md @@ -0,0 +1,13 @@ +# Le bénéficiaire envoie un appel PUT sur le point de terminaison /error pour une demande de transfert (v1.1) + +Diagramme de séquence pour le processus de rejet Fulfil d’un transfert pour la version 1.1 de l’API. + +## Références dans le diagramme de séquence + +* [Consommation par le gestionnaire Fulfil (abandon) (2.2.1)](2.2.1-fulfil-reject-handler-v1.1.md) +* [Consommation par le gestionnaire de position — rejet (1.3.3)](1.3.3-abort-position-handler-consume.md) +* [Envoi d’une notification au participant (1.1.4.a)](1.1.4.a-send-notification-to-participant-v1.1.md) + +## Diagramme de séquence + +![seq-reject-2.2.0.a-v1.1.svg](../assets/diagrams/sequence/seq-reject-2.2.0.a-v1.1.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/2.2.0.a-fulfil-abort-transfer.md b/docs/fr/technical/technical/central-ledger/transfers/2.2.0.a-fulfil-abort-transfer.md new file mode 100644 index 000000000..1a925258f --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/2.2.0.a-fulfil-abort-transfer.md @@ -0,0 +1,13 @@ +# Le bénéficiaire envoie un appel PUT sur le point de terminaison /error pour une demande de transfert + +Diagramme de séquence pour le processus de rejet Fulfil d’un transfert. + +## Références dans le diagramme de séquence + +* [Consommation par le gestionnaire Fulfil (rejet / abandon) (2.2.1)](2.2.1-fulfil-reject-handler.md) +* [Consommation par le gestionnaire de position — rejet (1.3.3)](1.3.3-abort-position-handler-consume.md) +* [Envoi d’une notification au participant (1.1.4.a)](1.1.4.a-send-notification-to-participant.md) + +## Diagramme de séquence + +![seq-reject-2.2.0.a.svg](../assets/diagrams/sequence/seq-reject-2.2.0.a.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/2.2.1-fulfil-reject-handler-v1.1.md b/docs/fr/technical/technical/central-ledger/transfers/2.2.1-fulfil-reject-handler-v1.1.md new file mode 100644 index 000000000..d17edd438 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/2.2.1-fulfil-reject-handler-v1.1.md @@ -0,0 +1,7 @@ +# Consommation par le gestionnaire Fulfil (rejet / abandon) (v1.1) + +Diagramme de séquence pour le processus de rejet ou d’abandon par le gestionnaire Fulfil pour la version 1.1 de l’API. + +## Diagramme de séquence + +![seq-reject-2.2.1-v1.1.svg](../assets/diagrams/sequence/seq-reject-2.2.1-v1.1.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/2.2.1-fulfil-reject-handler.md b/docs/fr/technical/technical/central-ledger/transfers/2.2.1-fulfil-reject-handler.md new file mode 100644 index 000000000..936cd852b --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/2.2.1-fulfil-reject-handler.md @@ -0,0 +1,13 @@ +# Consommation par le gestionnaire Fulfil (rejet / abandon) + +Diagramme de séquence pour le processus de rejet ou d’abandon par le gestionnaire Fulfil. + +## Références dans le diagramme de séquence + +* [Consommation par le gestionnaire d’événements (9.1.0)](../../central-event-processor/9.1.0-event-handler-placeholder.md) +* [Validation de signature (seq-signature-validation)](../../central-event-processor/signature-validation.md) +* [Envoi d’une notification au participant (1.1.4.a)](1.1.4.a-send-notification-to-participant.md) + +## Diagramme de séquence + +![seq-reject-2.2.1.svg](../assets/diagrams/sequence/seq-reject-2.2.1.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/2.3.0-transfer-timeout.md b/docs/fr/technical/technical/central-ledger/transfers/2.3.0-transfer-timeout.md new file mode 100644 index 000000000..52343b445 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/2.3.0-transfer-timeout.md @@ -0,0 +1,13 @@ +# Expiration du transfert (timeout) + +Diagramme de séquence pour le processus d’expiration d’un transfert. + +## Références dans le diagramme de séquence + +* [Consommation par le gestionnaire d’expiration (2.3.1)](2.3.1-timeout-handler-consume.md) +* [Consommation par le gestionnaire de position — expiration (1.3.3)](1.3.3-abort-position-handler-consume.md) +* [Envoi d’une notification au participant (1.1.4.a)](1.1.4.a-send-notification-to-participant.md) + +## Diagramme de séquence + +![seq-timeout-2.3.0.svg](../assets/diagrams/sequence/seq-timeout-2.3.0.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/2.3.1-timeout-handler-consume.md b/docs/fr/technical/technical/central-ledger/transfers/2.3.1-timeout-handler-consume.md new file mode 100644 index 000000000..c0bf756c1 --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/2.3.1-timeout-handler-consume.md @@ -0,0 +1,11 @@ +# Consommation par le gestionnaire d’expiration (timeout) + +Diagramme de séquence pour le processus de consommation par le gestionnaire d’expiration. + +## Références dans le diagramme de séquence + +* [Consommation par le gestionnaire d’événements (9.1.0)](../../central-event-processor/9.1.0-event-handler-placeholder.md) + +## Diagramme de séquence + +![seq-timeout-2.3.1.svg](../assets/diagrams/sequence/seq-timeout-2.3.1.svg) diff --git a/docs/fr/technical/technical/central-ledger/transfers/README.md b/docs/fr/technical/technical/central-ledger/transfers/README.md new file mode 100644 index 000000000..60f2cb08b --- /dev/null +++ b/docs/fr/technical/technical/central-ledger/transfers/README.md @@ -0,0 +1,8 @@ +# Opérations de transfert Mojaloop + +Processus opérationnels au cœur du traitement des transferts : + +- Processus *Prepare* +- Processus *Fulfil* +- Processus de notifications +- Processus de rejet / abandon (*Reject/Abort*) diff --git a/docs/fr/technical/technical/deployment-guide/README.md b/docs/fr/technical/technical/deployment-guide/README.md new file mode 100644 index 000000000..aa999db3e --- /dev/null +++ b/docs/fr/technical/technical/deployment-guide/README.md @@ -0,0 +1,495 @@ +# Déploiement Mojaloop + +Ce document s’adresse à un public disposant de solides connaissances techniques et souhaitant mettre en place un environnement pour le développement, les tests et la contribution au projet Mojaloop. + +## Déploiement et configuration + +- [Déploiement Mojaloop](#déploiement-mojaloop) + - [Déploiement et configuration](#déploiement-et-configuration) + - [1. Prérequis](#_1-prérequis) + - [2. Recommandations de déploiement](#_2-recommandations-de-déploiement) + - [3. Kubernetes](#_3-kubernetes) + - [3.1. Contrôleur d’entrée Kubernetes (Ingress)](#_3-1-contrôleur-dentrée-kubernetes-ingress) + - [3.2. Interfaces d’administration Kubernetes](#_3-2-interfaces-dadministration-kubernetes) + - [4. Helm](#_4-helm) + - [4.1. Configuration Helm](#_4-1-configuration-helm) + - [5. Mojaloop](#_5-mojaloop) + - [5.1. Déploiement Helm du backend (prérequis)](#_5-1-déploiement-helm-du-backend-prérequis) + - [5.2. Déploiement Helm Mojaloop](#_5-2-déploiement-helm-mojaloop) + - [5.3. Vérification des règles Ingress](#_5-3-vérification-des-règles-ingress) + - [5.4. Tester Mojaloop](#_5-4-tester-mojaloop) + - [5.5. Tester Mojaloop avec Postman](#_5-5-tester-mojaloop-avec-postman) + - [6. Services superposés / 3PPI](#_6-services-superposés--3ppi) + - [6.1 Configurer un déploiement pour la prise en charge de l’API tierce](#_61-configurer-un-déploiement-pour-la-prise-en-charge-de-lapi-tierce) + - [6.2 Valider et tester l’API tierce](#_62-valider-et-tester-lapi-tierce) + - [6.2.1 Déployer les simulateurs](#_621-déployer-les-simulateurs) + - [6.2.2 Provisionner l’environnement](#_622-provisionner-lenvironnement) + - [6.2.3 Exécuter la collection de tests de l’API tierce](#_623-exécuter-la-collection-de-tests-de-lapi-tierce) + + + +### 1. Prérequis + +Choisissez avec soin les versions des logiciels : une incompatibilité peut provoquer des erreurs ou des problèmes de compatibilité. + +Liste des outils prérequis pour le déploiement de Mojaloop : + +- **Kubernetes** — Système open source pour automatiser le déploiement, la mise à l’échelle et la gestion d’applications conteneurisées. En savoir plus sur [Kubernetes](https://kubernetes.io). + + - **Versions recommandées** + + | Version de publication du chart Helm Mojaloop | Version Kubernetes recommandée | + | ---------------------------------------------------------------- | ------------------------------ | + | [v16.0.0](https://github.com/mojaloop/helm/releases/tag/v16.0.0) | v1.29 | + | [v15.0.0](https://github.com/mojaloop/helm/releases/tag/v15.0.0) | v1.24 - v1.25 | + | [v14.1.1](https://github.com/mojaloop/helm/releases/tag/v14.1.1) | v1.20 - v1.24 | + | [v14.0.0](https://github.com/mojaloop/helm/releases/tag/v14.0.0) | v1.20 - v1.21 | + | [v13.x](https://github.com/mojaloop/helm/releases/tag/v13.1.1) | v1.13 - v1.21 | + | [v12.x](https://github.com/mojaloop/helm/releases/tag/v12.0.0) | v1.13 - v1.20 | + | [v11.x](https://github.com/mojaloop/helm/releases/tag/v11.0.0) | v1.13 - v1.17 | + | [v10.x](https://github.com/mojaloop/helm/releases/tag/v10.4.0) | v1.13 - v1.15 | + + > NOTES : + > + > - Les liens ci-dessus pointent vers la dernière version majeure (ex. v13.x → v13.1.1). + > - Consulter [https://github.com/mojaloop/helm/releases](https://github.com/mojaloop/helm/releases) pour les versions intermédiaires. + > - La colonne « Version Kubernetes recommandée » indique les versions de Kubernetes testées et validées avec la version correspondante du chart Helm Mojaloop. + + - **kubectl** — Interface en ligne de commande Kubernetes ; requise pour l’administration. En savoir plus sur [kubectl](https://kubernetes.io/docs/reference/kubectl/overview/) : + - [Installer kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) + +- **Helm** — Gestionnaire de paquets pour Kubernetes. En savoir plus sur [Helm](https://helm.sh) + + **Versions recommandées** + + - [Helm v3](https://helm.sh/docs/intro/install) + + > NOTES : + > + > - Consulter le guide [Migration de Helm v2 vers v3](https://docs.mojaloop.io/legacy/deployment-guide/helm-legacy-migration.html) pour migrer de Helm v2.x vers v3.x. + +### 2. Recommandations de déploiement + +Cette section présente des recommandations sur les ressources d’environnement et l’architecture d’infrastructure. + +**Besoins en ressources :** + +- Plan de contrôle (nœuds maîtres) + + [https://kubernetes.io/docs/setup/cluster-large/#size-of-master-and-master-components](https://kubernetes.io/docs/setup/cluster-large/#size-of-master-and-master-components) + + - 3 nœuds maîtres pour la montée en charge future et la haute disponibilité (HA) + +- Plan ETCd : + + [https://etcd.io/docs/latest/op-guide/hardware/](https://etcd.io/docs/latest/op-guide/hardware/) + + - 3 nœuds ETCd pour la HA (haute disponibilité) + +- Plan de calcul (nœuds workers) : + + À confirmer une fois les tests de charge terminés. Taille générale actuellement recommandée : + + - 3 nœuds workers, chacun avec : + - 4 vCPU, 16 Go de RAM et 40 Go de stockage + + **Remarque :** cela dépend aussi de votre infrastructure sous-jacente et **n’inclut pas** les besoins en volumes persistants / stockage. + +![Recommandations de déploiement Mojaloop — Architecture d’infrastructure](./assets/diagrams/deployment/KubeInfrastructureArch.svg) + +### 3. Kubernetes + +Si vous installez Kubernetes vous-même, nous recommandons l’une des distributions suivantes, en installant la version cible indiquée à la section [1. Prérequis](#_1-prérequis) : + +- [k3s](https://docs.k3s.io/installation) — Distribution Kubernetes légère et flexible, utilisable pour presque tout, du local à la production. +- [Minikube](https://minikube.sigs.k8s.io/docs/start) — Distribution Kubernetes mono-nœud, simple et multiplateforme, adaptée au local ou au développement. +- [Microk8s](https://microk8s.io/docs/install-alternatives) — Distribution Kubernetes simple, adaptée au local ou au développement. +- [Docker Desktop](https://docs.docker.com/desktop/kubernetes/) — Distribution Kubernetes simple, adaptée au local ou au développement (installez la version qui inclut votre version Kubernetes cible en consultant les [notes de version Docker Desktop](https://docs.docker.com/desktop/release-notes)). + +Nous ne prescrivons pas une distribution Kubernetes précise ; toute distribution certifiée [Cloud Native Computing Foundation (CNCF)](https://www.cncf.io/certification/software-conformance) ou solution managée (ex. Azure, AWS, GCP) convient pour tester les nouvelles versions Mojaloop. + +Si vous débutez avec Kubernetes, il est fortement conseillé de vous familiariser avec les concepts. [Concepts Kubernetes](https://kubernetes.io/docs/concepts/overview/) est un bon point de départ. + +Vérifiez que **kubectl** est installé. Les instructions complètes se trouvent [ici](https://kubernetes.io/docs/tasks/tools/install-kubectl/). + +#### 3.1. Contrôleur d’entrée Kubernetes (Ingress) + +Installez le contrôleur Ingress de votre choix pour l’équilibrage de charge et l’accès externe. + +Pour installer le contrôleur Nginx-Ingress utilisé dans ce guide, voir : . + +Liste d’autres contrôleurs Ingress : . + +Installez une version **prise en charge** du `Ingress Controller` compatible avec votre version cible de `Kubernetes`. + +> **DÉPANNAGE DU DÉPLOIEMENT — Mis à jour en mars 2023** +> +> - Si vous utilisez Mojaloop `v13.x` - `v14.0.x`, voir [Dépannage du déploiement — 1.1. Prise en charge du contrôleur Nginx-Ingress pour les versions Helm Mojaloop v13.x - v14.0.x et Kubernetes v1.20 - v1.21](./deployment-troubleshooting.md#11-nginx-ingress-controller-support-for-mojaloop-helm-release-v13x---v140xx-support-for-kubernetes-v120---v121). +> +> - Si vous utilisez Mojaloop `v12.x`, voir [Dépannage du déploiement — 1.2. Prise en charge du contrôleur Nginx-Ingress pour la version Helm Mojaloop v12.x](./deployment-troubleshooting.md#12-nginx-ingress-controller-support-for-mojaloop-helm-release-v12x). +> +> - Si vous utilisez Mojaloop `v10.x`, voir [Dépannage du déploiement — 1.4. La version Helm Mojaloop v10.x ou antérieure ne prend pas en charge Kubernetes v1.16 ou supérieur](./deployment-troubleshooting.md#14-mojaloop-helm-release-v10x-or-less-does-not-support-kubernetes-v116-or-greater). +> + +#### 3.2. Interfaces d’administration Kubernetes (facultatif) + +1. Tableaux de bord Kubernetes + + Interface web officielle d’administration Kubernetes. + + Instructions d’installation : [Web UI (Dashboard) — installation](https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/) (inutile si **MicroK8s** est installé). + + **IMPORTANT :** Configurez les rôles RBAC et un compte de service associé (inutile si **MicroK8s** est installé) ; exemple pour un utilisateur de test uniquement : [Créer un utilisateur d’exemple](https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md). + + Si vous avez installé MicroK8s, **activez le tableau de bord MicroK8s** : + + ```bash + microk8s.enable dashboard + ``` + + Plus d’informations : [Extension : dashboard](https://microk8s.io/docs/addon-dashboard). + + **Pensez** à préfixer toutes les commandes **kubectl** par **microk8s** si vous n’avez pas créé d’alias. + +2. k8sLens + + Alternative graphique locale à kubectl, simple à installer et à configurer. + + Plus d’informations : . + +### 4. Helm + +Consultez [Charts Helm Mojaloop](../repositories/helm.md) pour comprendre les relations entre les charts Helm déployés. + +Installation de la dernière version de Helm : . + +Si vous utilisez Helm v2 : [Déploiement avec Helm v2 (obsolète)](https://docs.mojaloop.io/legacy/deployment-guide/helm-legacy-deployment.html). + +Pour migrer un déploiement Helm v2 existant vers v3 : [Guide de migration Helm v2 vers v3](https://docs.mojaloop.io/legacy/deployment-guide/helm-legacy-migration.html). + +#### 4.1. Configuration Helm + +1. Ajoutez le dépôt mojaloop à la configuration Helm : + + ```bash + helm repo add mojaloop https://mojaloop.io/helm/repo/ + ``` + + Si le dépôt existe déjà, remplacez `add` par `apply` dans la commande ci-dessus. + +2. Mettez à jour les dépôts Helm : + + ```bash + helm repo update + ``` + +### 5. Mojaloop + +#### 5.1. Déploiement Helm du backend (prérequis) + +Mojaloop dépend de plusieurs backends externes. + +Nous recommandons de déployer ces dépendances dans un déploiement nommé distinct. + +Le chart backend d’exemple est fourni à titre indicatif et ne doit servir qu’à la preuve de concept, au développement et aux tests. + +Plus de détails [ici](https://github.com/mojaloop/helm/blob/master/README.md#deploying-backend-dependencies). + +1. Déployer le backend + + ```bash + helm --namespace demo install backend mojaloop/example-mojaloop-backend --create-namespace + ``` + + + +#### 5.2. Déploiement Helm Mojaloop + +1. Installer Mojaloop : + + 1.1. Installer la dernière version : + + ```bash + helm --namespace demo install moja mojaloop/mojaloop --create-namespace + ``` + + Ou avec une configuration personnalisée : + + ```bash + helm --namespace demo install moja mojaloop/mojaloop --create-namespace -f {custom-values.yaml} + ``` + + Plus de détails [ici](https://github.com/mojaloop/helm/blob/master/README.md#deploying-mojaloop-helm-charts). + + _Remarque : Téléchargez et adaptez le fichier [values.yaml](https://github.com/mojaloop/helm/blob/master/mojaloop/values.yaml). Utilisez le `values.yaml` correspondant à la bonne version (ex. `https://github.com/mojaloop/helm/blob/v/mojaloop/values.yaml`) via les [releases Helm](https://github.com/mojaloop/helm/releases). Pour vérifier la version installée : `helm --namespace demo list`. Sous la colonne **CHART**, vous devriez voir quelque chose comme `mojaloop-**{version}**`._ + + ```bash + $ helm -n demo list + NAME NAMESPACE REVISION UPDATED STATUS CHART + moja demo 1 2021-06-11 15:06:04.533094 +0200 SAST deployed mojaloop-{version} + ``` + + _Remarque : L’option `--create-namespace` n’est nécessaire que si l’espace de noms `demo` n’existe pas. Vous pouvez aussi le créer avec : `kubectl create namespace demo`._ + + 1.2. Installation d’une version précise : + + ```bash + helm --namespace demo install moja mojaloop/mojaloop --create-namespace --version {version} + ``` + + 1.3. Liste des versions Mojaloop : + + ```bash + $ helm search repo mojaloop/mojaloop -l + NAME CHART VERSION APP VERSION DESCRIPTION + mojaloop/mojaloop {version} {list of app-versions} Mojaloop Helm chart for Kubernetes + ... ... ... ... + ``` + +#### 5.3. Vérification des règles Ingress + +1. Mettez à jour `/etc/hosts` pour un déploiement local : + + _Remarque : Uniquement pour les déploiements locaux ; inutile si le DNS ou les règles Ingress sont définis dans un [values.yaml](https://github.com/mojaloop/helm/blob/master/mojaloop/values.yaml) personnalisé._ + + ```bash + vi /etc/hosts + ``` + + _Sous Windows, modifiez le fichier dans le Bloc-notes avec des droits administrateur. Emplacement : `C:\Windows\System32\drivers\etc\hosts`._ + + Ajoutez les lignes suivantes (ou combinez-les) à la configuration hôte. + + Configuration requise pour les versions du chart Helm >= 6.2.2 pour les services API Mojaloop : + + ```bash + # Mojaloop Demo + 127.0.0.1 ml-api-adapter.local central-ledger.local account-lookup-service.local account-lookup-service-admin.local quoting-service.local central-settlement-service.local transaction-request-service.local central-settlement.local bulk-api-adapter.local moja-simulator.local sim-payerfsp.local sim-payeefsp.local sim-testfsp1.local sim-testfsp2.local sim-testfsp3.local sim-testfsp4.local mojaloop-simulators.local finance-portal.local operator-settlement.local settlement-management.local testing-toolkit.local testing-toolkit-specapi.local + ``` + +2. Testez la santé du système dans le navigateur après installation. Cela ne fonctionne que si un déploiement Helm est actif. + + _Remarque : Les exemples ci-dessous concernent un déploiement local. Les entrées doivent correspondre au DNS ou aux règles Ingress du [values.yaml](https://github.com/mojaloop/helm/blob/master/mojaloop/values.yaml) ou à toute configuration Ingress personnalisée._ + + Test de santé **ml-api-adapter** : + + Test de santé **central-ledger** : + + + +#### 5.4. Tester Mojaloop + +Le [Mojaloop Testing Toolkit](../../documentation/mojaloop-technical-overview/ml-testing-toolkit/README.md) (**TTK**) sert à tester les déploiements ; il est intégré à Helm via son interface CLI pour tester facilement tout déploiement Mojaloop. + +1. Valider Mojaloop avec Helm + + ```bash + helm -n demo test moja + ``` + + Ou avec les journaux affichés dans la console : + + ```bash + helm -n demo test moja --logs + ``` + + Cela exécute automatiquement les [cas de test](https://github.com/mojaloop/testing-toolkit-test-cases) suivants via le CLI du [Mojaloop Testing Toolkit](../../documentation/mojaloop-technical-overview/ml-testing-toolkit/README.md) (**TTK**) : + + - [Collection de provisionnement du Hub et des simulateurs TTK](https://github.com/mojaloop/testing-toolkit-test-cases/tree/master/collections/hub/provisioning). + + Journaux de la collection de provisionnement : + + ```bash + kubectl -n demo logs pod/moja-ml-ttk-test-setup + ``` + + - [Collection de tests Golden Path TTK](https://github.com/mojaloop/testing-toolkit-test-cases/tree/master/collections/hub/golden_path). + + Journaux de la collection Golden Path : + + ```bash + kubectl -n demo logs pod/moja-ml-ttk-test-validation + ``` + + Exemple de résumé final dans les journaux de la collection Golden Path : + + ```bash + Test Suite:GP Tests + Environment:Development + ┌───────────────────────────────────────────────────┐ + │ SUMMARY │ + ├───────────────────┬───────────────────────────────┤ + │ Total assertions │ 1557 │ + ├───────────────────┼───────────────────────────────┤ + │ Passed assertions │ 1557 │ + ├───────────────────┼───────────────────────────────┤ + │ Failed assertions │ 0 │ + ├───────────────────┼───────────────────────────────┤ + │ Total requests │ 297 │ + ├───────────────────┼───────────────────────────────┤ + │ Total test cases │ 61 │ + ├───────────────────┼───────────────────────────────┤ + │ Passed percentage │ 100.00% │ + ├───────────────────┼───────────────────────────────┤ + │ Started time │ Fri, 11 Jun 2021 15:45:53 GMT │ + ├───────────────────┼───────────────────────────────┤ + │ Completed time │ Fri, 11 Jun 2021 15:47:25 GMT │ + ├───────────────────┼───────────────────────────────┤ + │ Runtime duration │ 91934 ms │ + └───────────────────┴───────────────────────────────┘ + TTK-Assertion-Report-multi-2021-06-11T15:47:25.656Z.html was generated + ``` + +2. Accéder à l’interface du Mojaloop Testing Toolkit + + Ouvrez dans le navigateur : . + + Vous pouvez charger et exécuter manuellement les collections du Testing Toolkit pour inspecter en détail requêtes, réponses et assertions. C’est une bonne façon d’apprendre Mojaloop. + + Voir la [documentation du Mojaloop Testing Toolkit](../../documentation/mojaloop-technical-overview/ml-testing-toolkit/README.md). + + + +#### 5.5. Tester Mojaloop avec Postman + +[Postman](https://www.postman.com/downloads) peut remplacer le [Mojaloop Testing Toolkit](../../documentation/mojaloop-technical-overview/ml-testing-toolkit/README.md). Voir le [Guide des tests automatisés](../contributors-guide/tools-and-technologies/automated-testing.md). + +Les [collections Postman Mojaloop](https://github.com/mojaloop/postman) correspondent aux [cas de test du Mojaloop Testing Toolkit](https://github.com/mojaloop/testing-toolkit-test-cases) comme suit : + +| Collection Postman | Mojaloop Testing Toolkit | Description | +|---------|----------|---------| +| [Collection Postman MojaloopHub_Setup](https://github.com/mojaloop/postman/blob/master/MojaloopHub_Setup.postman_collection.json) et [MojaloopSims_Onboarding](https://github.com/mojaloop/postman/blob/master/MojaloopSims_Onboarding.postman_collection.json) | [Collection de provisionnement du Hub et des simulateurs TTK](https://github.com/mojaloop/testing-toolkit-test-cases/tree/master/collections/hub/provisioning) | Configuration du Hub et provisionnement des simulateurs | +| [Golden_Path_Mojaloop](https://github.com/mojaloop/postman/blob/master/Golden_Path_Mojaloop.postman_collection.json) | [Collection de tests Golden Path TTK](https://github.com/mojaloop/testing-toolkit-test-cases/tree/master/collections/hub/golden_path) | Tests Golden Path | + +Prérequis : + +- Importer ou adapter l’environnement Postman suivant pour les collections ci-dessus : [Mojaloop-Local-MojaSims.postman_environment.json](https://github.com/mojaloop/postman/blob/master/environments/Mojaloop-Local-MojaSims.postman_environment.json). +- Téléchargez la **dernière version patch** depuis les [releases du dépôt Postman Mojaloop](https://github.com/mojaloop/postman/releases). Par exemple, si vous installez Mojaloop v12.0.**X**, assurez-vous d’avoir la dernière version patch des collections v12.0.**Y**. + +### 6. Services superposés / 3PPI + +À partir de la [R.C. v13.1.0](https://github.com/mojaloop/helm/tree/release/v13.1.0) de Mojaloop, l’API tierce est prise en charge et sera publiée avec la version officielle Mojaloop v13.1.0, +ce qui permet aux initiateurs de paiement tiers (3PPI) de demander un lien de compte auprès d’un DFSP et d’initier +des paiements pour le compte des utilisateurs. + +> En savoir plus sur les 3PPI : +> - [API tierce](https://github.com/mojaloop/mojaloop-specification/tree/master/thirdparty-api) Mojaloop +> - Cas d’usage tiers : +> - [Liaison de compte tiers](https://sandbox.mojaloop.io/usecases/3ppi-account-linking.html) +> - [Paiements initiés par un tiers](https://sandbox.mojaloop.io/usecases/3ppi-transfer.html) + + +#### 6.1 Configurer un déploiement pour la prise en charge de l’API tierce + +La prise en charge de l’API tierce est **désactivée** par défaut sur le déploiement Mojaloop. Vous pouvez l’activer en modifiant votre fichier `values.yaml` +avec les paramètres suivants : + +```yaml +... +account-lookup-service: + account-lookup-service: + config: + featureEnableExtendedPartyIdType: true # permet à l’ALS de prendre en charge le PartyIdType THIRD_PARTY_LINK plus récent + + account-lookup-service-admin: + config: + featureEnableExtendedPartyIdType: true # permet à l’ALS de prendre en charge le PartyIdType THIRD_PARTY_LINK plus récent + +... + +thirdparty: + enabled: true +... +``` + +De plus, l’API tierce a plusieurs dépendances à déployer manuellement pour que les services thirdparty +fonctionnent. [mojaloop/helm/thirdparty](https://github.com/mojaloop/helm/tree/master/thirdparty) décrit ces +dépendances et fournit des exemples de fichiers de configuration k8s pour les installer. + +```bash +# installer redis et mysql pour auth-service +kubectl apply --namespace demo -f https://raw.githubusercontent.com/mojaloop/helm/master/thirdparty/chart-auth-svc/example_dependencies.yaml +# installer mysql pour le consent oracle +kubectl apply --namespace demo -f https://raw.githubusercontent.com/mojaloop/helm/master/thirdparty/chart-consent-oracle/example_dependencies.yaml + +# appliquer les modifications ci-dessus à values.yaml, puis mettre à jour l’installation mojaloop pour déployer les services thirdparty : +helm upgrade --install --namespace demo moja mojaloop/mojaloop -f values.yaml +``` + +Une fois la mise à jour Helm terminée, vérifiez que les services tiers sont opérationnels : + +```bash +kubectl get po | grep tp-api +# tp-api-svc-b9bf78564-4g59d 1/1 Running 0 7m17s + +kubectl get po | grep auth-svc +# auth-svc-b75c954d4-9vq7w 1/1 Running 0 8m5s + +kubectl get po | grep consent-oracle +# consent-oracle-849cb69769-vq4rk 1/1 Running 0 8m31s + + +# vérifier aussi que l’ingress est correctement exposé +curl -H "Host: tp-api-svc.local" /health +# {"status":"OK","uptime":3545.77290063,"startTime":"2021-11-04T05:41:32.861Z","versionNumber":"11.21.0","services":[]} + +curl -H "Host: auth-service.local" /health + +# {"status":"OK","uptime":3682.48869561,"startTime":"2021-11-04T05:43:19.056Z","versionNumber":"11.10.1","services":[]} + +curl -H "Host: consent-oracle.local" /health +# {"status":"OK","uptime":3721.520096665,"startTime":"2021-11-04T05:43:48.382Z","versionNumber":"0.0.8","services":[]} +``` + +> Vous pouvez aussi ajouter les entrées suivantes à `/etc/hosts` pour faciliter l’accès aux services thirdparty +> +> ```bash +> tp-api-svc.local auth-service.local consent-oracle.local +> ``` + +#### 6.2 Valider et tester l’API tierce + +Une fois les services tiers déployés, déployez des simulateurs capables de reproduire +les scénarios tiers. + +##### 6.2.1 Déployer les simulateurs + +Modifiez à nouveau votre fichier `values.yaml`, cette fois sous l’entrée `mojaloop-simulator` : + +```yaml +... + +mojaloop-simulator: + simulators: + ... + pisp: + config: + thirdpartysdk: + enabled: true + dfspa: + config: + thirdpartysdk: + enabled: true + dfspb: {} +... +``` + +Cette configuration crée trois nouveaux jeux de simulateurs mojaloop : + +1. `pisp` — un PISP +2. `dfspa` — un DFSP prenant en charge l’API tierce +3. `dfspb` — un simulateur DFSP classique sans API tierce, pouvant recevoir des paiements + +##### 6.2.2 Provisionner l’environnement + +Une fois les simulateurs déployés et opérationnels, configurez le Hub Mojaloop +et les simulateurs pour tester l’API tierce. + +Utilisez la [collection de provisionnement tiers](https://github.com/mojaloop/testing-toolkit-test-cases#third-party-provisioning-collection) +du dépôt mojaloop/testing-toolkit-test-cases pour provisionner l’environnement tiers et les simulateurs +définis à l’étape précédente. + +##### 6.2.3 Exécuter la collection de tests de l’API tierce + +Une fois le provisionnement terminé, exécutez la [collection de tests tiers](https://github.com/mojaloop/testing-toolkit-test-cases#third-party-test-collection) +pour vérifier que les services tiers sont correctement déployés et configurés. diff --git a/docs/fr/technical/technical/deployment-guide/assets/diagrams/deployment/KubeInfrastructureArch.svg b/docs/fr/technical/technical/deployment-guide/assets/diagrams/deployment/KubeInfrastructureArch.svg new file mode 100644 index 000000000..26b8dcd92 --- /dev/null +++ b/docs/fr/technical/technical/deployment-guide/assets/diagrams/deployment/KubeInfrastructureArch.svg @@ -0,0 +1,2 @@ + + diff --git a/docs/fr/technical/technical/deployment-guide/assets/diagrams/repositoryUpdate/repository-update-sequence.mmd b/docs/fr/technical/technical/deployment-guide/assets/diagrams/repositoryUpdate/repository-update-sequence.mmd new file mode 100644 index 000000000..a5b07e79d --- /dev/null +++ b/docs/fr/technical/technical/deployment-guide/assets/diagrams/repositoryUpdate/repository-update-sequence.mmd @@ -0,0 +1,30 @@ +graph TD + step1["Étape 1 : Bibliothèques de base
    api-snippets
    ml-number
    central-services-logger
    central-services-metrics
    central-services-error-handling
    ml-testing-toolkit-shared-lib
    elastic-apm-node
    elastic-apm-node-opentracing"] + step2["Étape 2 : Dépendances de premier niveau
    object-store-lib
    central-services-stream
    central-services-health
    inter-scheme-proxy-cache-lib"] + step3["Étape 3 : Dépendances de second niveau
    event-sdk"] + step4["Étape 4 : Groupe à dépendances circulaires
    central-services-shared
    ml-schema-transformer-lib
    sdk-standard-components"] + step5["Étape 5 : Couche base de données
    central-services-db"] + step6["Étape 6 : Bibliothèques plateforme
    logging-bc-public-types-lib
    platform-shared-lib-messaging-types-lib
    platform-shared-lib-nodejs-kafka-client-lib
    logging-bc-client-lib"] + step7["Étape 7 : Services principaux
    central-ledger
    central-settlement"] + step8["Étape 8 : Services API
    sdk-scheme-adapter
    ml-api-adapter
    account-lookup-service
    auth-service"] + step9["Étape 9 : Autres services
    event-stream-processor
    event-sidecar
    central-event-processor
    bulk-api-adapter
    email-notifier
    ml-testing-toolkit
    ml-testing-toolkit-client-lib
    ml-testing-toolkit-ui
    quoting-service
    thirdparty-api-svc
    thirdparty-sdk
    transaction-requests-service
    als-oracle-pathfinder
    als-consent-oracle
    mojaloop-simulator
    simulator"] + note1["Remarque : les dépôts de l’étape 4
    ont des dépendances circulaires.
    Mettez-les à jour comme un ensemble."] + %% Flèches de la séquence de mise à jour + step1 --> step2 + step2 --> step3 + step3 --> step4 + step4 --> step5 + %% Dépendances pouvant être mises à jour en parallèle + step5 --> step7 + step6 --> step8 + %% Bibliothèques plateforme : traitement particulier + step4 --> step6 + %% Les services finaux dépendent de toutes les mises à jour précédentes + step7 --> step9 + step8 --> step9 + %% Lien vers la note + step4 --- note1 + %% Styles + classDef default fill:#f9f9f9,stroke:#333,stroke-width:1px; + classDef note fill:#ffffcc,stroke:#333,stroke-width:1px; + class note1 note; diff --git a/docs/fr/technical/technical/deployment-guide/assets/diagrams/repositoryUpdate/repository-update-sequence.svg b/docs/fr/technical/technical/deployment-guide/assets/diagrams/repositoryUpdate/repository-update-sequence.svg new file mode 100644 index 000000000..6d55a9b6c --- /dev/null +++ b/docs/fr/technical/technical/deployment-guide/assets/diagrams/repositoryUpdate/repository-update-sequence.svg @@ -0,0 +1 @@ +

    Step 1: Base Libraries
    api-snippets
    ml-number
    central-services-logger
    central-services-metrics
    central-services-error-handling
    ml-testing-toolkit-shared-lib
    elastic-apm-node
    elastic-apm-node-opentracing

    Step 2: First-level Dependencies
    object-store-lib
    central-services-stream
    central-services-health
    inter-scheme-proxy-cache-lib

    Step 3: Second-level Dependencies
    event-sdk

    Step 4: Circular Dependency Group
    central-services-shared
    ml-schema-transformer-lib
    sdk-standard-components

    Step 5: Database Layer
    central-services-db

    Step 6: Platform Libraries
    logging-bc-public-types-lib
    platform-shared-lib-messaging-types-lib
    platform-shared-lib-nodejs-kafka-client-lib
    logging-bc-client-lib

    Step 7: Core Services
    central-ledger
    central-settlement

    Step 8: API Services
    sdk-scheme-adapter
    ml-api-adapter
    account-lookup-service
    auth-service

    Step 9: Remaining Services
    event-stream-processor
    event-sidecar
    central-event-processor
    bulk-api-adapter
    email-notifier
    ml-testing-toolkit
    ml-testing-toolkit-client-lib
    ml-testing-toolkit-ui
    quoting-service
    thirdparty-api-svc
    thirdparty-sdk
    transaction-requests-service
    als-oracle-pathfinder
    als-consent-oracle
    mojaloop-simulator
    simulator

    Note: The Step 4 repositories
    have circular dependencies.
    Update them as a unit.

    \ No newline at end of file diff --git a/docs/fr/technical/technical/deployment-guide/assets/diagrams/upgradeStrategies/helm-blue-green-upgrade-strategy.svg b/docs/fr/technical/technical/deployment-guide/assets/diagrams/upgradeStrategies/helm-blue-green-upgrade-strategy.svg new file mode 100644 index 000000000..a5e597d9c --- /dev/null +++ b/docs/fr/technical/technical/deployment-guide/assets/diagrams/upgradeStrategies/helm-blue-green-upgrade-strategy.svg @@ -0,0 +1,3 @@ + + +
    Target Data-layer Runtime Environment
    Kubernetes Cluster(s)
    Target Data-layer Runtime Environment...
    Mojaloop Runtime Environment
    Kubernetes Cluster(s)
    Mojaloop Runtime Environment...
    Mojaloop Target
    Deployment

    (New Release)
    Mojaloop Target...
    Mojaloop DMZ
    Mojaloop DMZ
    API
    Gateway
    API...
    DFSP(s)
    DFSP(...
    Sync & Data Migration

    (Transform data to new Schema)
    Sync & Data M...
    Backend Dependencies

    (MySQL, Kafka, etc)
    Backend Dependencies...
    Mojaloop Current
    Deployment
    +
    Backed Dependencies
    (MySQL, Kafka, etc)

    (Old Release)
    Mojaloop Current...
    Viewer does not support full SVG 1.1
    \ No newline at end of file diff --git a/docs/fr/technical/technical/deployment-guide/assets/diagrams/upgradeStrategies/helm-canary-upgrade-strategy.svg b/docs/fr/technical/technical/deployment-guide/assets/diagrams/upgradeStrategies/helm-canary-upgrade-strategy.svg new file mode 100644 index 000000000..894431623 --- /dev/null +++ b/docs/fr/technical/technical/deployment-guide/assets/diagrams/upgradeStrategies/helm-canary-upgrade-strategy.svg @@ -0,0 +1,3 @@ + + +
    Shared Data-layer Runtime Environment
    Kubernetes Cluster(s)
    Shared Data-layer Runtime Environment...
    Mojaloop Runtime Environment
    Kubernetes Cluster(s)
    Mojaloop Runtime Environment...
    Backend Dependencies

    (MySQL, Kafka, etc)
    Backend Dependencies...
    Mojaloop Current
    Deployment

    (Old Release)
    Mojaloop Current...
    Mojaloop Target
    Deployment

    (New Release)
    Mojaloop Target...
    Mojaloop DMZ
    Mojaloop DMZ
    API
    Gateway
    API...
    DFSP(s)
    DFSP(...
    Viewer does not support full SVG 1.1
    \ No newline at end of file diff --git a/docs/fr/technical/technical/deployment-guide/assets/diagrams/vulnerabilityManagement/dependency-vulnerability-management-process.png b/docs/fr/technical/technical/deployment-guide/assets/diagrams/vulnerabilityManagement/dependency-vulnerability-management-process.png new file mode 100644 index 000000000..736a5190c Binary files /dev/null and b/docs/fr/technical/technical/deployment-guide/assets/diagrams/vulnerabilityManagement/dependency-vulnerability-management-process.png differ diff --git a/docs/fr/technical/technical/deployment-guide/assets/diagrams/vulnerabilityManagement/dependency-vulnerability-management-process.puml b/docs/fr/technical/technical/deployment-guide/assets/diagrams/vulnerabilityManagement/dependency-vulnerability-management-process.puml new file mode 100644 index 000000000..088f3c16d --- /dev/null +++ b/docs/fr/technical/technical/deployment-guide/assets/diagrams/vulnerabilityManagement/dependency-vulnerability-management-process.puml @@ -0,0 +1,107 @@ +@startuml dependency-vulnerability-management-process +!theme cerulean + +skinparam ActivityBackgroundColor #f0f0f0 +skinparam ActivityBorderColor #333333 +skinparam ArrowColor #333333 +skinparam backgroundColor white +skinparam ActivityFontColor black +skinparam ActivityFontSize 14 +skinparam noteFontColor black +skinparam ArrowFontColor black +skinparam PartitionFontColor #000000 +skinparam PartitionFontStyle bold +skinparam PartitionBorderColor #333333 +skinparam PartitionBackgroundColor #f8f8f8 + +title Processus de gestion des vulnérabilités des dépendances + +start + +partition "Outils de détection des vulnérabilités" { + :Identifier la vulnérabilité; + fork + :Alertes GitHub Dependabot; + fork again + :npm run audit:check; + note right: audit-ci.jsonc avec liste d’autorisation + fork again + :Analyse d’image Grype; + note right: .grype.yaml avec section d’ignorance + end fork +} + +partition "Processus de tri" { + :Trier la vulnérabilité; + :Évaluer le niveau de gravité; + fork + :Critique : 1 à 3 jours; + note right #FF6666: Action immédiate + fork again + :Élevé : 30 jours; + note right #FFCC66: Priorité élevée + fork again + :Moyen : 60 jours; + note right #FFFF66: Priorité moyenne + fork again + :Faible : 90 jours; + note right #99FF99: Priorité faible + end fork + :Agir selon la gravité\net les échéances de correction; +} + +partition "Processus de mise à jour" { + :Choisir un seul module à mettre à jour; + :Mettre à jour package.json; + :Exécuter les tests; + if (Tests OK ?) then (Oui) + :Créer une pull request; + else (Non) + if (Correction impossible ?) then (Oui) + fork + :Mettre à jour audit-ci.jsonc; + note right #F9E0FF: Pour les problèmes npm + fork again + :Mettre à jour .grype.yaml; + note right #F9E0FF: Pour les conteneurs + end fork + :Créer une pull request; + else (Non) + :Ajuster la mise à jour; + note right #F9E0FF + Envisager des solutions de repli + Contacter le mainteneur du paquet + end note + :Réexécuter les tests; + endif + endif + :Revue de code; + if (Résultat de la revue) then (Approuvé) + :Fusionner la PR; + else (Modifications demandées) + :Mettre à jour la PR; + endif +} + +partition "CI/CD" { + :Pipeline CI/CD; + :Contrôles de sécurité; + fork + :Contrôle audit-ci; + fork again + :Analyse Grype; + end fork + if (Contrôles OK ?) then (Oui) + :Publication / release; + else (Non) + :Corriger les problèmes de sécurité; + endif +} + +if (Autres vulnérabilités ?) then (Oui) + :Revenir au choix du module; +else (Non) + stop +endif + +@enduml diff --git a/docs/fr/technical/technical/deployment-guide/assets/diagrams/vulnerabilityManagement/dependency-vulnerability-management-process.svg b/docs/fr/technical/technical/deployment-guide/assets/diagrams/vulnerabilityManagement/dependency-vulnerability-management-process.svg new file mode 100644 index 000000000..a58b4cfa9 --- /dev/null +++ b/docs/fr/technical/technical/deployment-guide/assets/diagrams/vulnerabilityManagement/dependency-vulnerability-management-process.svg @@ -0,0 +1,305 @@ + + Processus de gestion des vulnérabilités des dépendances + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Processus de gestion des vulnérabilités des dépendances + + + + Outils de détection des vulnérabilités + + Identifier la vulnérabilité + + + Alertes GitHub Dependabot + + + audit-ci.jsonc avec liste d’autorisation + + npm run audit:check + + + .grype.yaml avec section d’ignorance + + Analyse d’image Grype + + + + Processus de tri + + Trier la vulnérabilité + + Évaluer le niveau de gravité + + + + Action immédiate + + Critique : 1 à 3 jours + + + Priorité élevée + + Élevé : 30 jours + + + Priorité moyenne + + Moyen : 60 jours + + + Priorité faible + + Faible : 90 jours + + + Agir selon la gravité + et les échéances de correction + + + Processus de mise à jour + + Choisir un seul module à mettre à jour + + Mettre à jour package.json + + Exécuter les tests + + Tests OK ? + Oui + Non + + Créer une pull request + + Correction impossible ? + Oui + Non + + + + Pour les problèmes npm + + Mettre à jour audit-ci.jsonc + + + Pour les conteneurs + + Mettre à jour .grype.yaml + + + Créer une pull request + + + Envisager des solutions de repli + Contacter le mainteneur du paquet + + Ajuster la mise à jour + + Réexécuter les tests + + + + Revue de code + + Résultat de la revue + Approuvé + Modifications demandées + + Fusionner la PR + + Mettre à jour la PR + + + + CI/CD + + Pipeline CI/CD + + Contrôles de sécurité + + + Contrôle audit-ci + + Analyse Grype + + + Contrôles OK ? + Oui + Non + + Publication / release + + Corriger les problèmes de sécurité + + + Revenir au choix du module + + Oui + Autres vulnérabilités ? + Non + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/fr/technical/technical/deployment-guide/assets/screenshots/vulnerabilityManagement/audit-check-script.png b/docs/fr/technical/technical/deployment-guide/assets/screenshots/vulnerabilityManagement/audit-check-script.png new file mode 100644 index 000000000..551ea6515 Binary files /dev/null and b/docs/fr/technical/technical/deployment-guide/assets/screenshots/vulnerabilityManagement/audit-check-script.png differ diff --git a/docs/fr/technical/technical/deployment-guide/assets/screenshots/vulnerabilityManagement/gh-dependabot-alert.png b/docs/fr/technical/technical/deployment-guide/assets/screenshots/vulnerabilityManagement/gh-dependabot-alert.png new file mode 100644 index 000000000..4c14b2661 Binary files /dev/null and b/docs/fr/technical/technical/deployment-guide/assets/screenshots/vulnerabilityManagement/gh-dependabot-alert.png differ diff --git a/docs/fr/technical/technical/deployment-guide/assets/screenshots/vulnerabilityManagement/gh-dependabot-alerts.png b/docs/fr/technical/technical/deployment-guide/assets/screenshots/vulnerabilityManagement/gh-dependabot-alerts.png new file mode 100644 index 000000000..a77a907b2 Binary files /dev/null and b/docs/fr/technical/technical/deployment-guide/assets/screenshots/vulnerabilityManagement/gh-dependabot-alerts.png differ diff --git a/docs/fr/technical/technical/deployment-guide/assets/screenshots/vulnerabilityManagement/grype-scan-vulnerabilities-ci.png b/docs/fr/technical/technical/deployment-guide/assets/screenshots/vulnerabilityManagement/grype-scan-vulnerabilities-ci.png new file mode 100644 index 000000000..d9d3a289b Binary files /dev/null and b/docs/fr/technical/technical/deployment-guide/assets/screenshots/vulnerabilityManagement/grype-scan-vulnerabilities-ci.png differ diff --git a/docs/fr/technical/technical/deployment-guide/assets/screenshots/vulnerabilityManagement/severity-id-allowed.png b/docs/fr/technical/technical/deployment-guide/assets/screenshots/vulnerabilityManagement/severity-id-allowed.png new file mode 100644 index 000000000..3a35c25b3 Binary files /dev/null and b/docs/fr/technical/technical/deployment-guide/assets/screenshots/vulnerabilityManagement/severity-id-allowed.png differ diff --git a/docs/fr/technical/technical/deployment-guide/assets/screenshots/vulnerabilityManagement/severity-level-allowed.png b/docs/fr/technical/technical/deployment-guide/assets/screenshots/vulnerabilityManagement/severity-level-allowed.png new file mode 100644 index 000000000..2c313578f Binary files /dev/null and b/docs/fr/technical/technical/deployment-guide/assets/screenshots/vulnerabilityManagement/severity-level-allowed.png differ diff --git a/docs/fr/technical/technical/deployment-guide/deployment-troubleshooting.md b/docs/fr/technical/technical/deployment-guide/deployment-troubleshooting.md new file mode 100644 index 000000000..569b3182a --- /dev/null +++ b/docs/fr/technical/technical/deployment-guide/deployment-troubleshooting.md @@ -0,0 +1,158 @@ +# Dépannage du déploiement + +## 1. Problèmes connus + +Consultez les notes de publication des **charts Helm Mojaloop** pour les problèmes connus : [https://github.com/mojaloop/helm/releases](https://github.com/mojaloop/helm/releases). + +### 1.1. Prise en charge du contrôleur Nginx-Ingress pour les versions Helm Mojaloop v13.x - v14.0.x et Kubernetes v1.20 - v1.21 + +Si vous utilisez Mojaloop `v13.x` - `v14.0.x` et souhaitez installer le contrôleur `Nginx-Ingress`, il est recommandé d’installer `Nginx-Ingress Controller v0.47.0` avec `Kubernetes v1.20 - v1.21`, en raison de changements cassants introduits dans `Kubernetes v1.22`. + +Avec Helm : + +```bash +helm install ingress-nginx ingress-nginx --version="3.33.0" --repo https://kubernetes.github.io/ingress-nginx +``` + +### 1.2. Prise en charge du contrôleur Nginx-Ingress pour la version Helm Mojaloop v12.x + +Si vous installez Mojaloop v12.x avec un contrôleur Nginx-Ingress plus récent que `v0.22.0`, créez une [configuration values Mojaloop v12.0.0](https://github.com/mojaloop/helm/blob/v12.0.0/mojaloop/values.yaml) personnalisée avec les modifications suivantes **avant l’installation** : + +```YAML +## **RECHERCHEZ CETTE LIGNE DANS LE FICHIER DE CONFIG mojaloop/values.yaml** +mojaloop-simulator: + ingress: + ## contrôleur nginx ingress >= v0.22.0 <-- **COMMENTEZ LES TROIS LIGNES CI-DESSOUS :** + # annotations: <-- COMMENTÉ + # nginx.ingress.kubernetes.io/rewrite-target: '/$2' <-- COMMENTÉ + # ingressPathRewriteRegex: (/|$)(.*) <-- COMMENTÉ + ## contrôleur nginx ingress < v0.22.0 <-- **DÉCOMMENTEZ LES TROIS LIGNES CI-DESSOUS :** + annotations: + nginx.ingress.kubernetes.io/rewrite-target: '/' + ingressPathRewriteRegex: "/" +``` + +**Remarque :** inutile si vous installez Mojaloop v13.x ou plus récent. + +### 1.3. Prise en charge de Kubernetes Docker Desktop pour Mojaloop v13.x - v14.0.x + +Si vous installez Mojaloop `v13.x` - `v14.0.x` sous Windows ou macOS, il est recommandé d’installer [Docker Desktop v4.2.0](https://docs.docker.com/desktop/release-notes/#420), livré avec Kubernetes v1.21.5, ce qui correspond aux recommandations Mojaloop `v13.x` - `v14.0.x` du [guide de déploiement (1. Prérequis)](README.md#_1-prérequis). + +### 1.4. La version Helm Mojaloop v10.x ou antérieure ne prend pas en charge Kubernetes v1.16 ou supérieur + +#### 1.4.1 Description + +_Remarque : applicable uniquement aux publications Helm Mojaloop v10.x ou antérieures._ + +Lors de l’installation des charts Helm Mojaloop, l’erreur suivante peut apparaître : + +```log +Error: validation failed: [unable to recognize "": no matches for kind "Deployment" in version "apps/v1beta2", unable to recognize "": no matches for kind "Deployment" in version "extensions/v1beta1", unable to recognize "": no matches for kind "StatefulSet" in version "apps/v1beta2", unable to recognize "": no matches for kind "StatefulSet" in version "apps/v1beta1"] +``` + +#### 1.4.2 Cause + +À partir de Kubernetes 1.16, des changements cassants ont été introduits (voir [« Deprecations and Removals » dans les notes de version Kubernetes](https://kubernetes.io/docs/setup/release/notes/#deprecations-and-removals)). Les versions d’API `apps/v1beta1` et `apps/v1beta2` ne sont plus prises en charge et ont été remplacées par `apps/v1`. + +Les charts Helm Mojaloop v10 ou antérieurs référencent encore des API dépréciées ; l’installation de v10- sur Kubernetes supérieur à 1.15 nécessite une modification manuelle. + +Voir le ticket [mojaloop/helm#219](https://github.com/mojaloop/helm/issues/219). + +#### 1.4.3 Correctifs + +Déployez les charts Helm Mojaloop v10.x ou antérieurs sur Kubernetes v1.15. + +## 2. Problèmes de déploiement + +### 2.1. Erreur `ERR_NAME_NOT_RESOLVED` + +#### 2.1.1 Description + +Cette erreur apparaît en accédant à un point de terminaison (ex. central-ledger.local) via le service Kubernetes directement dans un navigateur : `ERR_NAME_NOT_RESOLVED` + +#### 2.1.2 Correctifs + +1. Vérifiez que Mojaloop est correctement déployé (charts Helm installés) : + + ```bash + helm list + ``` + + Si les charts n’apparaissent pas, voir la section [Guide de déploiement — 5.2. Déploiement Helm Mojaloop](./README.md#_5-2-déploiement-helm-mojaloop). + +2. Vérifiez que tous les pods / conteneurs Mojaloop ont démarré et sont visibles dans le tableau de bord Kubernetes. + +3. Le premier démarrage après déploiement Helm peut prendre plusieurs minutes selon les ressources et la configuration (souvent entre 2 et 10 minutes). + +### 2.3. MicroK8s — problèmes de connectivité + +#### 2.3.1 Description + +Les pods n’atteignent pas Internet ni les autres pods (alors que la machine hôte MicroK8s y arrive). + +Exemple : les journaux Central-Ledger indiquent une erreur de transport du broker, par exemple : + +```log +2019-11-05T12:28:10.470Z - info: Server running at: +2019-11-05T12:28:10.474Z - info: Handler Setup - Registering {"type":"prepare","enabled":true}! +2019-11-05T12:28:10.476Z - info: CreateHandler::connect - creating Consumer for topics: [topic-transfer-prepare] +2019-11-05T12:28:10.515Z - info: CreateHandler::connect - successfully connected to topics: [topic-transfer-prepare] +2019-11-05T12:30:20.960Z - error: Consumer::onError()[topics='topic-transfer-prepare'] - Error: Local: Broker transport failure) +``` + +#### 2.3.2 Correctifs + +Assurez-vous que le trafic peut être acheminé entre l’interface réseau des pods et l’interface par défaut de l’hôte via iptables. Pour rendre ces règles persistantes, installez le paquet iptables-persistent : + +```bash +sudo iptables -P FORWARD ACCEPT +sudo apt-get install iptables-persistent +``` + +Ou, avec ufw : + +```bash +sudo ufw default allow routed +``` + +La commande d’inspection MicroK8s permet de vérifier la configuration du pare-feu : + +```bash +microk8s.inspect +``` + +## 3. Problèmes d’Ingress + +### 3.1. Les règles Ingress ne se résolvent pas avec Nginx Ingress v0.22 ou ultérieur et Mojaloop Helm v12.x ou antérieur + +#### 3.1.1 Description + +_Remarque : applicable uniquement aux publications Helm Mojaloop v12.x ou antérieures._ + +Les règles Ingress ne mènent pas au bon chemin selon les annotations du fichier [values.yaml](https://github.com/mojaloop/helm/blob/v12.0.0/mojaloop/values.yaml) avec les contrôleurs Nginx Ingress v0.22 ou ultérieurs. + +Cela est dû aux changements des contrôleurs Nginx Ingress v0.22+ : https://kubernetes.github.io/ingress-nginx/examples/rewrite/#rewrite-target. + +#### 3.1.2 Correctifs + +Modifiez les annotations Ingress (de → vers) dans les fichiers values.yaml : + +```yaml +nginx.ingress.kubernetes.io/rewrite-target: '/'` --> `nginx.ingress.kubernetes.io/rewrite-target: '/$1' +``` + +### 3.2. Les règles Ingress ne se résolvent pas avec Nginx Ingress antérieur à v0.22 + +#### 3.2.1 Description + +Les règles Ingress ne mènent pas au bon chemin selon les annotations du fichier [values.yaml](https://github.com/mojaloop/helm/blob/master/mojaloop/values.yaml) avec les contrôleurs Nginx Ingress **plus anciens** que v0.22. + +Voir : https://kubernetes.github.io/ingress-nginx/examples/rewrite/#rewrite-target. + +#### 3.2.2 Correctifs + +Appliquez la modification suivante à **toutes** les annotations Ingress (de → vers) dans chaque fichier values.yaml : + +```yaml +nginx.ingress.kubernetes.io/rewrite-target: '/$1'` --> `nginx.ingress.kubernetes.io/rewrite-target: '/' +``` diff --git a/docs/fr/technical/technical/deployment-guide/mojaloop-repository-update-guide.md b/docs/fr/technical/technical/deployment-guide/mojaloop-repository-update-guide.md new file mode 100644 index 000000000..5cf78f166 --- /dev/null +++ b/docs/fr/technical/technical/deployment-guide/mojaloop-repository-update-guide.md @@ -0,0 +1,176 @@ +# Ordre de mise à jour des dépôts (Repository) Mojaloop + +Ce document indique l’ordre dans lequel les dépôts NodeJS Mojaloop doivent être mis à jour lors de la publication de nouvelles fonctionnalités et/ou de la maintenance de Mojaloop. Cela garantit que chaque service d’une publication Mojaloop utilise les bonnes dépendances des dépôts Mojaloop. Document à jour pour Mojaloop RC v17 ; à actualiser au fil de l’évolution de Mojaloop (nouveaux composants, suppression des composants obsolètes). + +## Table des matières + +- [Ordre de mise à jour des dépôts Mojaloop](#ordre-de-mise-à-jour-des-dépôts-mojaloop) + - [Table des matières](#table-des-matières) + - [Catégories de dépôts](#catégories-de-dépôts) + - [Processus de mise à jour](#processus-de-mise-à-jour) + - [Exigences de test](#exigences-de-test) + - [Séquence des dépôts Mojaloop](#séquence-des-dépôts-mojaloop) + +## Catégories de dépôts + +Catégories des dépôts NodeJS Mojaloop : + +1. **Bibliothèques Central Services** + - `central-services-shared` + - `central-services-error-handling` + - `central-services-database` + - `central-services-stream` + - `central-services-metrics` + - `central-services-error` + - `central-services-logger` + - `sdk-standard-components` + +2. **Services principaux** + - `account-lookup-service` + - `quoting-service` + - `central-ledger` + - `central-settlement` + - `central-bulk-transfers` + - `transaction-requests-service` + - `ml-api-adapter` + +3. **Composants événementiels** + - `central-event-processor` + - `event-framework` + - `event-stream-processor` + - `elastic-apm-node` + - `elastic-apm-node-opentracing` + - `email-notifier` + - `event-sidecar` + +4. **Adaptateurs, SDK et API** + - `sdk-scheme-adapter` + - `event-sdk` + - `thirdparty-sdk` + - `bulk-api-adapter` + - `thirdparty-api-svc` + - `als-consent-oracle` + - `als-oracle-pathfinder` + +5. **Tests** + - `ml-testing-toolkit` + - `ml-testing-toolkit-client-lib` + - `ml-testing-toolkit-ui` + - `ml-testing-toolkit-shared-lib` + - `mojaloop-simulator` + - `simulator` + +6. **Autres bibliothèques** + - `api-snippets` + - `auth-service` + - `ml-number` + - `object-store-lib` + - `inter-scheme-proxy-cache-lib` + - `database-lib` + +## Processus de mise à jour + +1. **Identifier les dépendances** + - Utiliser `npm audit` pour repérer les vulnérabilités + - Examiner les fichiers `package.json` pour les dépendances obsolètes + - Vérifier les changements cassants lors des mises à jour majeures + +2. **Élaborer un plan de mise à jour** + - Lister tous les dépôts à mettre à jour + - Identifier les changements cassants potentiels + - Définir la stratégie de test pour chaque composant + +3. **Exécuter les mises à jour** + - Commencer par les bibliothèques de base + - Mettre à jour un dépôt à la fois + - Lancer les tests après chaque mise à jour + - Documenter les problèmes ou contournements + +4. **Tests d’intégration** + - Tester les composants mis à jour ensemble + - Vérifier le fonctionnement bout en bout + - Contrôler l’impact sur les performances (feuille de route, après v17) + +## Exigences de test + +Pour chaque dépôt, suivre les instructions de test du README et exécuter : + +1. **Tests unitaires** + - Exécuter la suite de tests existante + - Ajouter des tests pour les fonctionnalités modifiées + - Vérifier la couverture de tests + +2. **Tests d’intégration** + - Tester avec les services dépendants + - Vérifier la compatibilité des API + - Contrôler la gestion des événements + +3. **Tests de bout en bout** + - Passer par le testing toolkit Mojaloop + - Vérifier les flux de transaction + - Tester les scénarios d’erreur + + +## Séquence des dépôts Mojaloop + +Le tableau suivant détaille les dépôts Mojaloop et leurs dépendances. Ces informations sont essentielles pour respecter le bon ordre de mise à jour lors de changements de dépendances ou de correctifs de vulnérabilités. + +| Ordre | Dépôt | Dépendances | +|---|---|---| +| 1 | api-snippets | | +| 2 | ml-number | | +| 3 | database-lib | | +| 4 | central-services-logger | | +| 5 | central-services-metrics | | +| 6 | central-services-error-handling | | +| 7 | ml-testing-toolkit-shared-lib | | +| 8 | logging-bc-public-types-lib | | +| 9 | platform-shared-lib-messaging-types-lib | | +| 10 | elastic-apm-node | | +| 11 | elastic-apm-node-opentracing | | +| 12 | object-store-libp | central-services-logger | +| 13 | central-services-stream | | +| 14 | central-services-health | central-services-error-handling, central-services-logger | +| 15 | event-sdk | central-services-stream, central-services-logger, central-services-stream | +| 16 | inter-scheme-proxy-cache-lib | central-services-logger, central-services-shared, inter-scheme-proxy-cache-lib, central-services-error-handling, central-services-logger, central-services-metrics, event-sdk | +| 17 | ml-schema-transformer-lib | central-services-error-handling, central-services-logger, central-services-shared, sdk-standard-components, ml-schema-transformer-lib | +| 18 | sdk-standard-components | | +| 19 | central-services-shared | | +| 20 | platform-shared-lib-nodejs-kafka-client-lib | | +| 21 | logging-bc-client-lib | | +| 22 | **account-lookup-service** | central-services-error-handling, central-services-health, central-services-logger, central-services-metrics, central-services-shared, central-services-stream, database-lib, event-sdk, inter-scheme-proxy-cache-lib, sdk-standard-components, sdk-standard-components, central-services-logger, central-services-shared, central-services-stream | +| 23 | **als-consent-oracle** | api-snippets, central-services-health, central-services-shared, sdk-standard-components, central-services-error-handling, central-services-logger, central-services-metrics, event-sdk | +| 24 | **als-oracle-pathfinder** | central-services-logger, central-services-shared | +| 25 | **auth-service** | api-snippets, central-services-health, central-services-shared, event-sdk, sdk-standard-components, central-services-error-handling, central-services-logger, central-services-metrics, event-sdk | +| 26 | **bulk-api-adapter** | central-services-error-handling, central-services-health, central-services-logger, central-services-metrics, central-services-shared, central-services-stream, event-sdk, object-store-lib | +| 27 | **central-event-processor** | central-services-error-handling, central-services-health, central-services-logger, central-services-metrics, central-services-shared, central-services-stream, event-sdk | +| 28 | **central-ledger** | central-services-error-handling, central-services-health, central-services-logger, central-services-metrics, central-services-shared, central-services-stream, database-lib, event-sdk, inter-scheme-proxy-cache-lib, ml-number, object-store-lib | +| 29 | **central-settlement** | central-ledger, central-services-database, central-services-error-handling, central-services-health, central-services-logger, central-services-shared, central-services-stream, event-sdk, ml-number | +| 30 | **email-notifier** | central-services-error-handling, central-services-health, central-services-logger, central-services-metrics, central-services-shared, central-services-stream, event-sdk | +| 31 | **event-sidecar** | central-services-logger, central-services-metrics, central-services-stream, event-sdk | +| 32 | **event-stream-processor** | central-services-health, central-services-logger, central-services-metrics, central-services-shared, central-services-stream, elastic-apm-node, elastic-apm-node-opentracing, event-sdk | +| 33 | **mojaloop-simulator** | central-services-logger | +| 34 | **ml-api-adapter** | central-services-error-handling, central-services-health, central-services-logger, central-services-metrics, central-services-shared, central-services-stream, event-sdk, sdk-standard-components, database-lib, inter-scheme-proxy-cache-lib | +| 35 | **ml-testing-toolkit** | central-services-logger, central-services-metrics, ml-schema-transformer-lib, ml-testing-toolkit-shared-lib, sdk-standard-components | +| 36 | **ml-testing-toolkit-client-lib** | central-services-logger, ml-testing-toolkit-shared-lib, sdk-standard-components | +| 37 | **ml-testing-toolkit-ui** | ml-testing-toolkit-shared-lib | +| 38 | **quoting-service** | central-services-error-handling, central-services-health, central-services-logger, central-services-metrics, central-services-shared, central-services-stream, event-sdk, inter-scheme-proxy-cache-lib, ml-number, sdk-standard-components | +| 39 | **simulator** (hérité, oracle ALS) | central-services-error-handling, central-services-logger, central-services-metrics, central-services-shared, event-sdk, sdk-standard-components | +| 40 | **sdk-scheme-adapter** | api-snippets, central-services-error-handling, central-services-logger, central-services-metrics, central-services-shared, event-sdk, sdk-standard-components | +| 41 | **thirdparty-api-svc** | api-snippets, central-services-shared, central-services-stream, central-services-error-handling, central-services-logger, central-services-metrics, event-sdk | +| 42 | **thirdparty-sdk** | api-snippets, central-services-error-handling, central-services-metrics, central-services-shared, sdk-scheme-adapter, sdk-standard-components | +| 43 | **transaction-requests-service** | central-services-error-handling, central-services-health, central-services-logger, central-services-metrics, central-services-shared, event-sdk, ml-testing-toolkit-shared-lib | + +### Visualisation de la séquence de mise à jour + +Le diagramme suivant illustre la séquence de mise à jour recommandée pour les dépôts Mojaloop, compte tenu des dépendances et des relations : + +![Séquence de mise à jour des dépôts](./assets/diagrams/repositoryUpdate/repository-update-sequence.svg) + +Ce diagramme donne une représentation visuelle de la séquence de mise à jour et montre : + +1. Le regroupement logique des dépôts +2. Les dépendances entre groupes +3. Les cas particuliers comme les dépendances circulaires +4. Les possibilités de mises à jour en parallèle +5. Les différents types de dépendances à prendre en compte diff --git a/docs/fr/technical/technical/deployment-guide/nodejs-dependency-update-guide.md b/docs/fr/technical/technical/deployment-guide/nodejs-dependency-update-guide.md new file mode 100644 index 000000000..db0dbc993 --- /dev/null +++ b/docs/fr/technical/technical/deployment-guide/nodejs-dependency-update-guide.md @@ -0,0 +1,42 @@ +Le diagramme suivant illustre la séquence de mise à jour recommandée pour les dépôts Mojaloop, en tenant compte de leurs dépendances et relations : + +```mermaid +graph TD + step1["Étape 1 : Bibliothèques de base
    api-snippets
    ml-number
    central-services-logger
    central-services-metrics
    central-services-error-handling
    ml-testing-toolkit-shared-lib
    elastic-apm-node
    elastic-apm-node-opentracing"] + step2["Étape 2 : Dépendances de premier niveau
    object-store-lib
    central-services-stream
    central-services-health
    inter-scheme-proxy-cache-lib"] + step3["Étape 3 : Dépendances de second niveau
    event-sdk"] + step4["Étape 4 : Groupe à dépendances circulaires
    central-services-shared
    ml-schema-transformer-lib
    sdk-standard-components"] + step5["Étape 5 : Couche base de données
    central-services-db"] + step6["Étape 6 : Bibliothèques plateforme
    logging-bc-public-types-lib
    platform-shared-lib-messaging-types-lib
    platform-shared-lib-nodejs-kafka-client-lib
    logging-bc-client-lib"] + step7["Étape 7 : Services principaux
    central-ledger
    central-settlement"] + step8["Étape 8 : Services API
    sdk-scheme-adapter
    ml-api-adapter
    account-lookup-service
    auth-service"] + step9["Étape 9 : Autres services
    event-stream-processor
    event-sidecar
    central-event-processor
    bulk-api-adapter
    email-notifier
    ml-testing-toolkit
    ml-testing-toolkit-client-lib
    ml-testing-toolkit-ui
    quoting-service
    thirdparty-api-svc
    thirdparty-sdk
    transaction-requests-service
    als-oracle-pathfinder
    als-consent-oracle
    mojaloop-simulator
    simulator"] + note1["Remarque : les dépôts de l’étape 4
    ont des dépendances circulaires.
    Mettez-les à jour comme un ensemble."] + %% Clear update sequence arrows + step1 --> step2 + step2 --> step3 + step3 --> step4 + step4 --> step5 + %% Handle dependencies that can be updated in parallel + step5 --> step7 + step6 --> step8 + %% Platform libraries need special handling + step4 --> step6 + %% Final services depend on all previous updates + step7 --> step9 + step8 --> step9 + %% Connect notes + step4 --- note1 + %% Styling + classDef default fill:#f9f9f9,stroke:#333,stroke-width:1px; + classDef note fill:#ffffcc,stroke:#333,stroke-width:1px; + class note1 note; +``` + +Ce diagramme donne une représentation visuelle de la séquence de mise à jour et montre : + +1. Le regroupement logique des dépôts +2. Les dépendances entre groupes +3. Les cas particuliers comme les dépendances circulaires +4. Les possibilités de mises à jour en parallèle +5. Les différents types de dépendances à prendre en compte diff --git a/docs/fr/technical/technical/deployment-guide/upgrade-strategy-guide.md b/docs/fr/technical/technical/deployment-guide/upgrade-strategy-guide.md new file mode 100644 index 000000000..e118ba94a --- /dev/null +++ b/docs/fr/technical/technical/deployment-guide/upgrade-strategy-guide.md @@ -0,0 +1,187 @@ +# Guide des stratégies de mise à niveau + +Ce document explique comment mettre à niveau des installations Mojaloop existantes. Il part du principe que Mojaloop est déjà installé avec Helm, mais ces stratégies s’appliquent de façon générale. + +## Table des matières + +- [Guide des stratégies de mise à niveau](#guide-des-stratégies-de-mise-à-niveau) + - [Table des matières](#table-des-matières) + - [Mises à niveau Helm](#mises-à-niveau-helm) + - [Versions sans rupture de compatibilité](#versions-sans-rupture-de-compatibilité) + - [Versions avec rupture de compatibilité](#versions-avec-rupture-de-compatibilité) + - [Mojaloop installé sans dépendances backend](#mojaloop-installé-sans-dépendances-backend) + - [1. La version cible n’introduit pas de changements cassants sur le stockage de données](#1-la-version-cible-nintroduit-pas-de-changements-cassants-sur-le-stockage-de-données) + - [Exemple de déploiement de type canary](#exemple-de-déploiement-de-type-canary) + - [2. La version cible introduit des changements cassants sur le stockage de données](#2-la-version-cible-introduit-des-changements-cassants-sur-le-stockage-de-données) + - [Mojaloop installé avec dépendances backend](#mojaloop-installé-avec-dépendances-backend) + - [Exemple de déploiement blue-green](#exemple-de-déploiement-blue-green) + - [Commandes de mise à niveau](#commandes-de-mise-à-niveau) + - [Mise à niveau vers v17.0.0](#mise-à-niveau-vers-v1700) + - [Tester le scénario de mise à niveau de v16.0.0 vers v17.0.0](#tester-le-scénario-de-mise-à-niveau-de-v1600-vers-v1700) + +## Mises à niveau Helm + +Cette section décrit les stratégies applicables à un déploiement Helm Mojaloop existant utilisant les [charts Helm Mojaloop](https://github.com/mojaloop/helm). + +La portée des changements cassants décrits ci-dessous concerne le déploiement Helm de l’opérateur du switch sans impact direct (c’est-à-dire sans changement fonctionnel tel qu’une nouvelle version de la spécification API Mojaloop) sur les participants (par ex. fournisseurs de services financiers). De tels changements fonctionnels peuvent figurer dans une publication Helm, mais sortent du cadre de cette section. + +Recommandations : + +1. Toute mise à niveau doit être testée et validée dans un environnement préproduction (test ou QA). +2. Consultez toujours les notes de version : problèmes connus ou indications utiles pour la montée de version. +3. La commande [migrate:list](https://knexjs.org/#Migrations) permet de lister les changements de données en attente dans les dépôts suivants : + - + - + +### Versions sans rupture de compatibilité + +Les changements non cassants n’exigent aucune action supplémentaire ou particulière (sauf indication contraire dans les notes de version) hormis l’exécution d’une [mise à niveau Helm](https://helm.sh/docs/helm/helm_upgrade) standard. + +Paramètres optionnels utiles lors d’une mise à niveau : + +``` + -i, --install si aucune release de ce nom n’existe, exécuter une installation + --reuse-values lors d’une mise à niveau, réutiliser les valeurs de la dernière release et fusionner les surcharges de la ligne de commande via --set et -f. Si « --reset-values » est spécifié, cette option est ignorée + --version string contrainte de version du chart à utiliser (étiquette précise ex. 1.1.1 ou plage valide ex. ^2.0.0). Si omis, la dernière version est utilisée +``` + +Exemple d’utilisation : + +```bash +helm --namespace ${NAMESPACE} ${RELEASE_NAME} upgrade --install mojaloop/mojaloop --reuse-values --version ${RELEASE_VERSION} +``` + +Un retour en arrière est possible avec la commande [Helm rollback](https://helm.sh/docs/helm/helm_rollback/) si besoin. + +### Versions avec rupture de compatibilité + +Plusieurs stratégies existent selon la topologie de déploiement : + +1. Mojaloop installé **sans** dépendances backend (Kafka, MySQL, MongoDB, etc.), celles-ci étant gérées séparément — **préféré** et le plus souple en cas de changements cassants. + +2. Mojaloop installé **avec** dépendances backend couplées à l’installation Helm. + + > *REMARQUE : Ce mode sera déprécié à partir de Mojaloop v15.0.0 (y compris v15) ; un exemple de déploiement backend reste fourni pour les tests et la QA. Voir la section [5. BREAKING CHANGES](https://github.com/mojaloop/helm/blob/master/.changelog/release-v15.0.0.md#5-breaking-changes) des [notes de version v15.0.0](https://github.com/mojaloop/helm/blob/master/.changelog/release-v15.0.0.md).* + + +#### Mojaloop installé sans dépendances backend + +Topologie préférée : elle offre le plus de souplesse. En séparant les dépendances backend, vous pouvez déployer la version cible de Mojaloop comme **nouveau** déploiement. + +Ce nouveau déploiement peut soit réutiliser les dépendances backend existantes, soit en exiger de nouvelles selon les cas : + +##### 1. La version cible n’introduit pas de changements cassants sur le stockage de données + +Dans ce cas, on peut adopter une stratégie de type **canary** en pointant le nouveau déploiement vers les dépendances backend existantes. Par défaut, les schémas de données sont mis à niveau via les scripts de `migration` (voir [Central-ledger](https://github.com/mojaloop/central-ledger/tree/master/migrations), [Account-lookup-service](https://github.com/mojaloop/account-lookup-service/tree/master/migrations)). On peut aussi désactiver les migrations (ex. [central-ledger](https://github.com/mojaloop/helm/blob/master/mojaloop/values.yaml#L147), configuration analogue pour account-lookup-service) et préparer un script SQL manuel (voir [migrate:list](https://knexjs.org/#Migrations) pour la liste des changements en attente). + +Le déploiement Mojaloop actuel ne devrait pas être perturbé. + +Les dépendances backend étant partagées entre l’ancien et le nouveau déploiement, il est possible de router un sous-ensemble d’utilisateurs vers la cible afin de valider avec un impact limité et de permettre un retour rapide vers l’ancien déploiement. + +###### Exemple de déploiement de type canary + +![Stratégie de mise à niveau Helm canary](./assets/diagrams/upgradeStrategies/helm-canary-upgrade-strategy.svg) + +1. Adaptez le [values.yaml du chart Mojaloop](https://github.com/mojaloop/helm/blob/master/mojaloop/values.yaml) pour la version cible : + 1. Pointez la configuration backend vers les dépendances backend déjà déployées (partagées). + 2. Si besoin, évitez que les règles Ingress écrasent la configuration du déploiement courant. +2. Déployez la version cible Mojaloop (Bleu). + 1. Surveillez les journaux des conteneurs `run-migration` pour d’éventuelles erreurs : + - `kubectl -n ${NAMESPACE} logs -l app.kubernetes.io/name=centralledger-service -c run-migration` + - `kubectl -n ${NAMESPACE} logs -l app.kubernetes.io/name=account-lookup-service-admin -c run-migration` +3. Exécutez des tests de cohérence sur l’environnement **Vert** actuel (impact des changements de données, possibilité de rollback ou bascule partielle pour les DFSP, etc.). +4. Exécutez des tests de cohérence sur l’environnement cible **Bleu**. +5. Basculez la passerelle API (ou les règles Ingress) du **Vert** actuel vers le **Bleu** cible. + +##### 2. La version cible introduit des changements cassants sur le stockage de données + +Dans ce scénario (Mojaloop installé sans dépendances backend), on peut utiliser une **mise à niveau Helm sur place** des dépendances backend. +Une fenêtre de maintenance doit être planifiée pour arrêter les transactions « en direct » sur le déploiement courant afin de garantir la cohérence des données et une bascule sûre. Cela provoque une interruption, atténuable en planifiant la fenêtre aux heures les moins chargées. + +Il est **essentiel** de sauvegarder la base de données en cas de retour à la version précédente. + +1. Planifier la fenêtre de maintenance. +2. Sauvegarder les bases de données. +3. Adapter le [values.yaml du chart Mojaloop](https://github.com/mojaloop/helm/blob/master/mojaloop/values.yaml) pour la version cible. +4. Désinstaller les services Mojaloop. +5. Mettre à niveau les dépendances backend avec : +```bash +helm upgrade ${RELEASE_NAME} mojaloop/example-mojaloop-backend --namespace ${NAMESPACE} --version ${RELEASE_VERSION} +``` +6. Installer les services Mojaloop : +```bash +helm install ${RELEASE_NAME} mojaloop/mojaloop --namespace ${NAMESPACE} --version ${RELEASE_VERSION} -f {$VALUES_FILE} +``` +7. Exécuter les tests de cohérence. +8. En cas de retour en arrière (la sauvegarde de la base doit avoir été faite avant la montée de version) : + 1. Utiliser `helm rollback` pour revenir à la version précédente des dépendances backend. + 2. Restaurer la base à partir de la sauvegarde (pour un état cohérent du stockage). + 3. Réinstaller la version précédente des services Mojaloop. + +#### Mojaloop installé avec dépendances backend (version 15 ou antérieure) + +Dans ce scénario, on peut adopter une stratégie **blue-green** : déployer de nouvelles dépendances backend et la version cible Mojaloop séparément (avec l’avantage de se rapprocher de la topologie recommandée). + +Une **migration manuelle** des données des anciens magasins vers les nouveaux backends cibles sera nécessaire. Il faudra aussi maintenir les magasins ancien et nouveau synchronisés tant que des transactions en direct transitent encore par l’ancien déploiement. Planifiez une fenêtre de maintenance pour arrêter le trafic « live », garantir la cohérence et basculer en toute sécurité — avec interruption possible, à limiter en choisissant une plage horaire creuse. + +##### Exemple de déploiement blue-green + +![Stratégie de mise à niveau Helm blue-green](./assets/diagrams/upgradeStrategies/helm-blue-green-upgrade-strategy.svg) + +1. Adaptez le [values.yaml du chart Mojaloop](https://github.com/mojaloop/helm/blob/master/mojaloop/values.yaml) pour la version cible : + 1. Pointez la configuration backend vers les nouvelles dépendances backend cibles. + 2. Si besoin, évitez que les règles Ingress écrasent la configuration du déploiement courant. +2. Déployez la version cible Mojaloop (Bleu). +3. Mettez en place un processus de migration pour synchroniser et transformer les données du backend **Vert** vers le **Bleu**. +4. Planifiez la fenêtre de bascule. +5. Réalisez la bascule pendant la fenêtre : + 1. Passer les backends **Verts** en lecture seule lorsque c’est possible. + 2. Vider les connexions restantes sur le Vert. + 3. Vérifier que la migration est entièrement synchronisée de Vert vers Bleu. + 4. Exécuter les tests de cohérence sur l’environnement cible Bleu. + 5. Basculez la passerelle API (ou les règles Ingress) du Vert actuel vers le Bleu cible. + + +## Commandes de mise à niveau + +Ce document fournit des commandes pour mettre à niveau des installations Mojaloop existantes. Il suppose Mojaloop installé via Helm. + +### Mise à niveau vers v17.0.0 + +1. Mettre à niveau les dépendances backend : +```bash +helm upgrade backend mojaloop/example-mojaloop-backend --namespace ${NAMESPACE} --version v17.0.0 -f ${VALUES_FILE} +``` +2. Installer les services Mojaloop : +```bash +helm install moja mojaloop/mojaloop --namespace ${NAMESPACE} --version v17.0.0 -f ${VALUES_FILE} +``` + +#### Tester le scénario de mise à niveau de v16.0.0 vers v17.0.0 + +1. Installer les dépendances backend v16.0.0 avec persistance activée (créer les bases manuellement : les scripts initDb ne s’exécuteront pas) : +```bash +helm --namespace ${NAMESPACE} install ${RELEASE} mojaloop/example-mojaloop-backend --version 16.0.0 -f ${VALUES_FILE} +``` +2. Installer les services Mojaloop v16.0.0 et lancer les tests pour peupler les bases : +```bash +helm --namespace ${NAMESPACE} install ${RELEASE} mojaloop/mojaloop --version 16.0.0 -f ${VALUES_FILE} +``` +3. Désinstaller les services Mojaloop : +```bash +helm delete ${RELEASE} --namespace ${NAMESPACE} +``` +4. Mettre à niveau les dépendances backend vers v17.0.0 (met à niveau les versions MySQL/Kafka/MongoDB) : +```bash +helm --namespace ${NAMESPACE} upgrade ${RELEASE} mojaloop/example-mojaloop-backend --version 17.0.0 -f ${VALUES_FILE} +``` +5. Installer les services Mojaloop v17.0.0 (exécute les migrations Knex pour mettre à jour les schémas) : +```bash +helm --namespace ${NAMESPACE} install ${RELEASE} mojaloop/mojaloop --version 17.0.0 -f ${VALUES_FILE} +``` +6. Lancer les tests Golden Path : +```bash +helm test ${RELEASE} --namespace=${NAMESPACE} --logs +``` + + diff --git a/docs/fr/technical/technical/event-framework/README.md b/docs/fr/technical/technical/event-framework/README.md new file mode 100644 index 000000000..e42134c0f --- /dev/null +++ b/docs/fr/technical/technical/event-framework/README.md @@ -0,0 +1,233 @@ +# Cadre d’événements (Event Framework) + +Le **cadre d’événements** (*Event Framework*) vise à fournir une architecture unifiée et standard pour capturer tous les événements Mojaloop. + +_Avertissement : solution expérimentale mise en œuvre comme preuve de concept (PoC). La conception peut évoluer selon les apprentissages et l’avancement du PoC._ + + +## 1. Exigences + +- Les événements sont produits via une bibliothèque commune standard qui publie vers un composant *sidecar* sur un protocole léger et performant (p. ex. gRPC). +- Le module *sidecar* publie sur un topic Kafka unique, consommable par plusieurs gestionnaires selon les besoins. +- Le partitionnement Kafka repose sur le type d’événement (p. ex. *log*, *audit*, *trace*, *errors*). +- Chaque composant Mojaloop dispose de son *sidecar* couplé. +- Les messages utilisent le *Trace-Id* comme clé Kafka, afin de regrouper toutes les traces d’une même transaction dans une même partition. + + +## 2. Architecture + +### 2.1 Vue d’ensemble + +![Architecture du cadre d’événements](./assets/diagrams/architecture/architecture-event-framework.svg) + +### 2.2 *Pods* de microservices + +![Architecture des *pods* microservices](./assets/diagrams/architecture/architecture-event-sidecar.svg) + +### 2.3 Flux d’événements + +![Architecture de traçage des événements](./assets/diagrams/architecture/architecture-event-trace.svg) + + +## 3. Modèle d’enveloppe d’événement + +### 3.1 Exemple JSON + +```JSON +{ + "from": "noresponsepayeefsp", + "to": "payerfsp", + "id": "aa398930-f210-4dcd-8af0-7c769cea1660", + "content": { + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "noresponsepayeefsp", + "fspiop-destination": "payerfsp" + }, + "payload": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ewogICJmdWxmaWxtZW50IjogIlVObEo5OGhaVFlfZHN3MGNBcXc0aV9VTjN2NHV0dDdDWkZCNHlmTGJWRkEiLAogICJjb21wbGV0ZWRUaW1lc3RhbXAiOiAiMjAxOS0wNS0yOVQyMzoxODozMi44NTZaIiwKICAidHJhbnNmZXJTdGF0ZSI6ICJDT01NSVRURUQiCn0" + }, + "type": "application/json", + "metadata": { + "event": { + "id": "3920382d-f78c-4023-adf9-0d7a4a2a3a2f", + "type": "trace", + "action": "span", + "createdAt": "2019-05-29T23:18:32.935Z", + "state": { + "status": "success", + "code": 0, + "description": "action réussie" + }, + "responseTo": "1a396c07-47ab-4d68-a7a0-7a1ea36f0012" + }, + "trace": { + "service": "central-ledger-prepare-handler", + "traceId": "bbd7b2c7-3978-408e-ae2e-a13012c47739", + "parentSpanId": "4e3ce424-d611-417b-a7b3-44ba9bbc5840", + "spanId": "efeb5c22-689b-4d04-ac5a-2aa9cd0a7e87", + "startTimestamp": "2015-08-29T11:22:09.815479Z", + "finishTimestamp": "2015-08-29T11:22:09.815479Z", + "tags": { + "transctionId": "659ee338-c8f8-4c06-8aff-944e6c5cd694", + "transctionType": "transfer", + "parentEventType": "bulk-prepare", + "parentEventAction": "prepare" + } + } + } +} +``` + +### 3.2 Définition du schéma + +### 3.2.1 Définition d’objet : EventMessage + +| Nom | Type | Obligatoire (O/N) | Description | Exemple | +| --- | --- | --- | --- | --- | +| id | string | O | Identifiant lié au message associé. | | +| from | string | N | Si absent côté destination, la notification a été générée par le nœud connecté (serveur). | | +| to | string | O | Obligatoire côté émetteur, optionnel côté destination. L’émetteur peut omettre la valeur de domaine. | | +| pp | string | N | Optionnel côté émetteur lorsqu’il représente l’identité de session. Obligatoire côté destination si l’identité de l’émetteur diffère de la propriété `from`. | | +| metadata | object `` | N | Ne pas transporter d’informations de contenu via cette propriété — seulement le contexte de communication. Définir un nouveau type de contenu si nécessaire. | | +| type | string | O | Déclaration `MIME` du type de contenu du message. | | +| content | object \ | O | Représentation du contenu. | | + +##### 3.2.1.1 Définition d’objet : MessageMetadata + +| Nom | Type | Obligatoire (O/N) | Description | Exemple | +| --- | --- | --- | --- | --- | +| event | object `` | O | Informations d’événement. | | +| trace | object `` | O | Informations de trace. | | + +##### 3.2.1.2 Définition d’objet : EventMetadata + +| Nom | Type | Obligatoire (O/N) | Description | Exemple | +| --- | --- | --- | --- | --- | +| id | string | O | UUIDv4 généré pour l’événement. | 3920382d-f78c-4023-adf9-0d7a4a2a3a2f | +| type | enum `` | O | Type d’événement. | [`log`, `audit`, `error` `trace`] | +| action | enum `` | O | Type d’action. | [ `start`, `end` ] | +| createdAt | timestamp | O | Horodatage ISO. | 2019-05-29T23:18:32.935Z | +| responseTo | string | N | UUIDv4 de l’événement parent. | 2019-05-29T23:18:32.935Z | +| state | object `` | O | Objet d’état. | | + +##### 3.2.1.3 Définition d’objet : EventStateMetadata + +| Nom | Type | Obligatoire (O/N) | Description | Exemple | +| --- | --- | --- | --- | --- | +| status | enum `` | O | Statut de traitement. | success | +| code | number | N | Code d’erreur selon la spécification Mojaloop. | 2000 | +| description | string | N | Libellé du statut ; souvent utilisé pour les erreurs. | Erreur serveur générique pour ne pas divulguer d’informations sensibles. | + +##### 3.2.1.4 Définition d’objet : EventTraceMetaData + +| Nom | Type | Obligatoire (O/N) | Description | Exemple | +| --- | --- | --- | --- | --- | +| service | string | O | Nom du service produisant la trace. | central-ledger-prepare-handler | +| traceId | 32HEXDIGLC | O | Identifiant de transaction de bout en bout. | 664314d5b207d3ba722c6c0fdcd44c61 | +| spanId | 16HEXDIGLC | O | Identifiant de jambe de traitement pour un composant ou une fonction. | 81fa25e8d66d2e88 | +| parentSpanId | 16HEXDIGLC | N | Identifiant du span parent. | e457b5a2e4d86bd1 | +| sampled | number | N | Indique si le message doit entrer dans la trace (`1`). Sinon, l’échantillonnage est laissé au consommateur. | 1 | +| flags | number | N | Inclusion dans le flux de trace (*Debug* `1` — surcharge la valeur `sampled`). | 0 | +| startTimestamp | datetime | N | ISO 8601 `yyyy-MM-dd'T'HH:mm:ss.SSSSSSz`. Si absent, horodatage courant. Début du *span*.| 2015-08-29T11:22:09.815479Z | +| finishTimestamp | datetime | N | ISO 8601 au même format. Si absent, horodatage courant. Fin du *span*. | 2015-08-29T11:22:09.815479Z | +| tags | object `` | O | Métadonnées associées à la trace. | success | + +_Note : HEXDIGLC = chiffre / « a » … « f » (hex minuscule). Référence : [spécification W3C *trace-context*](https://www.w3.org/TR/trace-context/#field-value)._ + +##### 3.2.1.5 Définition d’objet : EventTraceMetaDataTags + +| Nom | Type | Obligatoire (O/N) | Description | Exemple | +| --- | --- | --- | --- | --- | +| transactionId | string | N | Identifiant de transaction (transfert, cotation, etc.). | 659ee338-c8f8-4c06-8aff-944e6c5cd694 | +| transactionType | string | N | Type représenté par `transactionId` (transfert, cotation, etc.). | transfer | +| parentEventType | string | N | Type d’événement du span parent. | bulk-prepare | +| parentEventAction | string | N | Action d’événement du span parent. | prepare | +| tracestate | string | N | Présent si la variable d’environnement EventSDK `EVENT_SDK_TRACESTATE_HEADER_ENABLED` vaut `true` ou si le contexte parent contient l’en-tête ou le tag `tracestate`. Valeur conforme W3C. [Détails](#411-wc3-http-headers). | `congo=t61rcWkgMzE,rojo=00f067aa0ba902b7` | +| `` | string | N | Paire clé-valeur arbitraire pour métadonnées de trace supplémentaires. | n/a | + +##### 3.2.1.6 Enum : EventStatusType + +| Enum | Description | +| --- | --- | +| success | Événement traité avec succès | +| fail | Événement traité avec échec ou erreur | + +##### 3.2.1.7 Enum : EventType + +| Enum | Description | +| --- | --- | +| log | Entrée de journal générale. | +| audit | Événement à signer et persister dans le magasin d’audit. | +| trace | Événement avec contexte de trace pour le magasin de traçage. | + +##### 3.2.1.8 Enum : LogEventAction + +| Enum | Description | +| --- | --- | +| info | Entrée de journal niveau `info`. | +| debug | Entrée de journal niveau `debug`. | +| error | Entrée de journal niveau `error`. | +| verbose | Entrée de journal niveau `verbose`. | +| warning | Entrée de journal niveau `warning`. | +| performance | Entrée de journal niveau `performance`. | + +##### 3.2.1.9 Enum : AuditEventAction + +| Enum | Description | +| --- | --- | +| default | Action d’audit standard. | +| start | Début d’un processus. | +| finish | Fin d’un processus. | +| ingress | Activité d’entrée. | +| egress | Activité de sortie. | + +##### 3.2.1.10 Enum : TraceEventAction + +| Enum | Description | +| --- | --- | +| span | Action représentant un *span* de trace. | + + +## 4. Conception du traçage + +### 4.1 Transports HTTP + +En-têtes HTTP proposés pour le traçage. + +Mojaloop n’a pas encore arbitré entre ces standards ni validé un support combiné. + +#### 4.1.1 En-têtes W3C {#411-wc3-http-headers} + +Référence : https://w3c.github.io/trace-context/ + +| En-tête | Description | Exemple | +| --- | --- | --- | +| traceparent | Chaîne délimitée par des tirets : \-\-\-\ | 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00 | +| tracestate | Format fabricant, délimité par des virgules : \=\<état encodé base64\>| congo=t61rcWkgMzE,rojo=00f067aa0ba902b7 | + +Note : certains traceurs historiques envoyaient X-B3-Sampled comme `true`/`false` plutôt que `1`/`0`. Une implémentation tolérante peut les accepter. + +Note : [Event-SDK](https://github.com/mojaloop/event-sdk) depuis v9.4.1 permet d’ajouter des tags clé-valeur dans `tracestate` ; depuis v9.5.2, `tracestate` est encodé en base64. Pour un comportement homogène, aligner les versions du SDK sur tous les services. + +#### 4.1.2 En-têtes B3 + +Référence : https://github.com/apache/incubator-zipkin-b3-propagation + +| En-tête | Description | Exemple | +| --- | --- | --- | +| X-B3-TraceId | 32 ou 16 caractères hex minuscules. | Ex. X-B3-TraceId: 463ac35c9f6413ad48485a3953bb6124. Requis sauf si seul l’état d’échantillonnage est propagé. | +| X-B3-SpanId | 16 caractères hex minuscules. | Ex. X-B3-SpanId: a2fb4a1d1a96d312. Requis sauf propagation de l’échantillonnage seul. | +| X-B3-ParentSpanId | Présent sur un span enfant, absent sur la racine. 16 caractères hex. | Ex. X-B3-ParentSpanId: 0020000000000001 | +| X-B3-Sampled | Acceptation `1`, refus `0`. Absent = décision différée au récepteur. | Ex. X-B3-Sampled: 1 | +| X-B3-Flags | *Debug* = `1` (implique acceptation ; ne pas envoyer aussi X-B3-Sampled). | | + +### 4.2 Transport Kafka + +Voir la section *Modèle d’enveloppe d’événement* : format du message Kafka. + +Le contexte de trace peut aussi être placé dans les en-têtes Kafka (v0.11+), ce qui exclut les versions antérieures. + +### 4.3 Limites connues + +- Le traçage des transferts reste limité à chaque jambe (*Prepare* / *Fulfil*) : la spécification API Mojaloop ne prévoit pas nativement les informations de trace. Le *Switch* peut les inclure dans les *callbacks*, mais les FSP ne sont pas tenus de répondre avec des en-têtes de trace réciproques. diff --git a/docs/fr/technical/technical/event-framework/assets/diagrams/architecture/architecture-event-framework.svg b/docs/fr/technical/technical/event-framework/assets/diagrams/architecture/architecture-event-framework.svg new file mode 100644 index 000000000..413c9746b --- /dev/null +++ b/docs/fr/technical/technical/event-framework/assets/diagrams/architecture/architecture-event-framework.svg @@ -0,0 +1,3 @@ + + +
    Central-Ledger
    (API)
    Central-Ledger<br>(API)<br>
    Central-Ledger
    Handler #
    Central-Ledger<br>Handler #<br>
    Central-Ledger
    Handler #
    Central-Ledger<br>Handler #<br>
    Central-Ledger
    (Handler #)
    Central-Ledger<br>(Handler #)<br>

    <div style="text-align: left ; font-size: 8px"><br></div>
    ML-API-Adapter
    (API)
    ML-API-Adapter<br>(API)<br>
    Central-Settlements
    (API)
    Central-Settlements<br>(API)<br>
    ML-API-Adapter
    (Handler)
    ML-API-Adapter<br>(Handler)<br>
    Quoting-Service
    (API)
    Quoting-Service<br>(API)<br>
    Account-Lookup-Service
    (API)
    Account-Lookup-Service<br>(API)<br>

    <div style="text-align: left"><br></div>
    Types de messages :
    - Traçage
    - Audit
    - Journaux
    [Not supported by viewer]
    <div style="text-align: center"></div>
    Kafka
    (flux d'événements)
    topic-events
    [Not supported by viewer]

    <div style="text-align: left ; font-size: 8px"><br></div>
    Sidecar
    Sidecar

    <div style="text-align: left ; font-size: 8px"><br></div>
    Sidecar
    Sidecar
    Sidecar
    Sidecar
    Sidecar
    Sidecar

    <div style="text-align: left ; font-size: 8px"><br></div>
    Sidecar
    Sidecar

    <div style="text-align: left ; font-size: 8px"><br></div>
    Sidecar
    Sidecar

    <div style="text-align: left ; font-size: 8px"><br></div>
    Sidecar
    Sidecar
    Sidecar
    Sidecar
    Sidecar
    Sidecar
    EFK
    (Elasticsearch, Fluentd, 
    Kibana & APM)
    [Not supported by viewer]
    Journalisation judiciaire
    (Évolution — extrait du sidecar vers un service pour audits par lots)
    [Not supported by viewer]
    Central-KMS
    Central-KMS
    Audits
    Audits
    Keys
    Keys
    Partitionné par identifiant de trace (Trace-Id)
    [Not supported by viewer]
    Processeur de flux d'événements
    (médiation, traduction)
    [Not supported by viewer]
    OpenTracing
    [Not supported by viewer]
    journal, trace, audit
    [Not supported by viewer]
    journal, trace, audit
    [Not supported by viewer]
    journal, trace, audit
    [Not supported by viewer]
    journal, trace, audit
    [Not supported by viewer]

    <div style="text-align: left ; font-size: 8px"><br></div>
    journal, trace, audit
    [Not supported by viewer]
    journal, trace, audit
    [Not supported by viewer]
    journal, trace, audit
    [Not supported by viewer]
    Approvisionnement des clés
    [Not supported by viewer]
    Approvisionnement des clés
    [Not supported by viewer]
    Types de messages :
    - Traçage
    - Audit
    - Journaux
    [Not supported by viewer]
    Types de messages :
    - Audits
    [Not supported by viewer]
    \ No newline at end of file diff --git a/docs/fr/technical/technical/event-framework/assets/diagrams/architecture/architecture-event-sidecar.svg b/docs/fr/technical/technical/event-framework/assets/diagrams/architecture/architecture-event-sidecar.svg new file mode 100644 index 000000000..3d2660cc7 --- /dev/null +++ b/docs/fr/technical/technical/event-framework/assets/diagrams/architecture/architecture-event-sidecar.svg @@ -0,0 +1,3 @@ + + +

    <div style="text-align: left"><br></div>
    Pod n°2
    Pod n°2
    Service n°2
    Service n°2<br>
    Pod n°1
    Pod n°1
    <div style="text-align: center"></div>
    Kafka
    (flux d'événements)
    topic-events
    [Not supported by viewer]
    Cluster Kubernetes
    [Not supported by viewer]
    Cadre d'événements
    Sidecar
    Cadre d'événements<br>Sidecar<br>
    Serveur gRPC
    Serveur gRPC
    Client gRPC
    Client gRPC
    Client
    Kafka
    [Not supported by viewer]
    Partitionné par Trace-Id
    [Not supported by viewer]
    Service n°1
    Service n°1<br>
    Cadre d'événements
    Sidecar
    Cadre d'événements<br>Sidecar<br>
    Serveur gRPC
    Serveur gRPC
    Client gRPC
    Client gRPC
    Client
    Kafka
    [Not supported by viewer]
    @mojaloop/
    event-sdk
    @mojaloop/<br>event-sdk
    Sidecar du cadre d'événements fourni dans le chart Helm de chaque composant
    [Not supported by viewer]
    \ No newline at end of file diff --git a/docs/fr/technical/technical/event-framework/assets/diagrams/architecture/architecture-event-trace.svg b/docs/fr/technical/technical/event-framework/assets/diagrams/architecture/architecture-event-trace.svg new file mode 100644 index 000000000..eadf3708a --- /dev/null +++ b/docs/fr/technical/technical/event-framework/assets/diagrams/architecture/architecture-event-trace.svg @@ -0,0 +1,3 @@ + + +
    Sidecar
    Sidecar
    Sidecar
    Sidecar
    Service
    consommateur 
    Service…
    Span parent
    Span parent
    Trace
    Trace
    Début
    Début
    Fin
    Fin
    Span enfant
    Span enfant
    Début
    Début
    Fin
    Fin
    Span enfant
    Span enfant
    Début
    Début
    Fin
    Fin
    Contexte de trace
    - traceId
    - spanId
    - parentId
    - sampled
    - flags
    - tracestate
    Contexte de trace…
    Service
    producteur 
    Service…
    Étiquettes : [ transactionId: transferId, transactionType: transfer, source: payerFsp, destination : payeeFsp, tracestate : mojaloop=f32c19568004ce8b ]
    Étiquettes : [ transactionId: transferId, transactionType: transfer, source: payerFsp, destination : payeeFsp, tracestate : mojaloop=f32c19568004ce...
    Span enfant
    Span enfant
    Début
    Début
    Fin
    Fin
    Transport des messages
    - HTTP
    - Kafka

    Transport des messages…
    Erreur
    Erreur
    Kafka
    (topic d'événements)
    Kafka…
    Sidecar d'événements
    Sidecar d'événements
    Sidecar d'événements
    Sidecar d'événements
    Enregistrer la trace
    Record...
    Service A
    Service A
    Service B
    Service B
    Message de trace
    - traceId
    - spanId
    - parentId
    - sampled
    - flags
    - tags
    - tracestate
    - contenu / erreur
    Trace Message...
    Enregistrer la trace
    Record...
    Enregistrer la trace
    Record...
    Enregistrer la trace
    Record...
    Enregistrer l'erreur
    Record...
    Audit
    Audit
    Enregistrer
    l'audit
    Record...
    Journal
    Journal
    Enregistrer le journal
    Record...
    Enregistrer
    l'audit
    Record...
    Enregistrer
    l'audit
    Record...
    Enregistrer
    l'audit
    Record...
    Enregistrer
    l'audit
    Record...
    \ No newline at end of file diff --git a/docs/fr/technical/technical/event-stream-processor/README.md b/docs/fr/technical/technical/event-stream-processor/README.md new file mode 100644 index 000000000..78925bddc --- /dev/null +++ b/docs/fr/technical/technical/event-stream-processor/README.md @@ -0,0 +1,21 @@ +# Service Event Stream Processor + +L’**Event Stream Processor** consomme les messages d’événements du topic `topic-events`, publiés par le service [event-sidecar](https://github.com/mojaloop/event-sidecar). Voir le [cadre d’événements](../event-framework/README.md) pour l’architecture globale. + +Le service envoie journaux (y compris audits) et traces vers une stack EFK avec le plugin APM activé. Selon le type de message, les données sont routées vers différents index Elasticsearch. + +## 1. Prérequis + +Tous les événements sont enregistrés dans une instance Elasticsearch avec APM. Un exemple *docker-compose* pour la stack Elastic est disponible [ici](https://github.com/mojaloop/event-stream-processor/blob/master/test/util/scripts/docker-efk/docker-compose.yml). Les journaux et audits utilisent un modèle d’index personnalisé ; les traces vont dans l’index par défaut `apm-*`. + +Assurez-vous d’avoir créé le modèle `mojatemplate` comme décrit dans la documentation du service [event-stream-processor](https://github.com/mojaloop/event-stream-processor#111-create-template). + +## 2. Vue d’ensemble de l’architecture + +### 2.1. Flux général + +![Vue d’ensemble du flux Event Stream Processor](./assets/diagrams/architecture/event-stream-processor-overview.svg) + +### 2.2 Diagramme de séquence du traitement des traces + +![](./assets/diagrams/sequence/process-flow.svg) diff --git a/docs/fr/technical/technical/event-stream-processor/assets/diagrams/architecture/event-stream-processor-overview.svg b/docs/fr/technical/technical/event-stream-processor/assets/diagrams/architecture/event-stream-processor-overview.svg new file mode 100644 index 000000000..9deb189e9 --- /dev/null +++ b/docs/fr/technical/technical/event-stream-processor/assets/diagrams/architecture/event-stream-processor-overview.svg @@ -0,0 +1,3 @@ + + +
    topic-event
    topic-event
    Event Stream Processor
    Send to Elasticsearch mojaloop custom schema via Elasticsearch API
    [Not supported by viewer]
    Yes
    Yes
    Is it trace?
    Is it trace?
    No
    No
    Should create master span?
    Should create master span?
    exit
    exit
    No
    No
    APM Agent
    APM Agent
    Create cache for the trace
    Create cache for the trace
    Yes
    Yes
    No
    No
    Is last span?
    Is last span?
    Recreate trace
    Recreate trace
    exit
    exit
    EFK Stack (Elasticsearch, Kibana, APM)
    EFK Stack (Elasticsearch, Kibana, APM)
    \ No newline at end of file diff --git a/docs/fr/technical/technical/event-stream-processor/assets/diagrams/sequence/process-flow.plantuml b/docs/fr/technical/technical/event-stream-processor/assets/diagrams/sequence/process-flow.plantuml new file mode 100644 index 000000000..9817a79d8 --- /dev/null +++ b/docs/fr/technical/technical/event-stream-processor/assets/diagrams/sequence/process-flow.plantuml @@ -0,0 +1,280 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Valentin Genev + -------------- + ******'/ + +@startuml +' declate title +title Event Streaming Processor flow + +autonumber + +' Actor Keys: + +' declare actors + +collections "Notification topic" as TOPIC_NOTIFICATIONS +control "Topic Observable" as TOPIC_OBSERVABLE +control "Tracing Observable" as TRACING_OBSERVABLE +control "Caching Observable" as CACHING_OBSERVABLE +control "Check For Last Span Observable" as LASTSPAN_OBSERVABLE +control "Create Trace Observable" as CREATETRACE_OBSERVABLE +control "Cache Handler" as CACHE_HANDLER +control "Send Trace Handler" as TRACE_HANDLER +control "Send Span Handler" as SPAN_SENDER +database "Cache Storage" as CACHE +boundary "APM" as APM +boundary "Elasticsearch API" as ELASTIC + +box "Central Services" #lightGray + participant TOPIC_NOTIFICATIONS +end box + +box "Event Stream Processor" #LightBlue + participant TOPIC_OBSERVABLE + participant TRACING_OBSERVABLE + participant CACHING_OBSERVABLE + participant LASTSPAN_OBSERVABLE + participant CREATETRACE_OBSERVABLE + participant TRACE_HANDLER + participant SPAN_SENDER + participant CACHE_HANDLER +end box + +box "Cache" #LightSteelBlue + participant CACHE +end box + +box "Elasticsearch" #LightYellow + participant APM + participant ELASTIC +end box + +' start flow + +group New Event Message Received + TOPIC_NOTIFICATIONS -> TOPIC_OBSERVABLE: Consume Event Message + activate TOPIC_OBSERVABLE + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + note over TOPIC_OBSERVABLE #yellow + Message: + { + "from": "payeefsp", + "to": "payerfsp", + "id": "659ee338-c8f8-4c06-8aff-944e6c5cd694", + "content": { + "headers": { + "content-type": "applicationvnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "payeefsp", + "fspiop-destination": "payerfsp" + }, + "payload": + }, + "type": "application/json", + "metadata": { + "event": { + "id": "3920382d-f78c-4023-adf9-0d7a4a2a3a2f", + "type": "trace", + "action": "span", + "createdAt": "2019-05-29T23:18:32.935Z", + "state": { + "status": "success", + "code": 0, + "description": "action successful" + }, + "responseTo": "1a396c07-47ab-4d68-a7a0-7a1ea36f0012" + }, + "trace": { + "service": "central-ledger-prepare-handler", + "traceId": "bbd7b2c7bbd7b2c7", + "parentSpanId": "44ba9bbc5840", + "spanId": "2aa9cd0a7e87", + "startTimestamp": "2015-08-29T11:22:09.815479Z", + "finishTimestamp": "2015-08-29T11:22:09.815479Z", + "tags": { + "transctionId": "659ee338-c8f8-4c06-8aff-944e6c5cd694", + "transctionType": "transfer", + "parentEventType": "bulk-prepare", + "parentEventAction": "prepare" + } + } + } + } + end note + TOPIC_OBSERVABLE -> ELASTIC: Send message for log purposes to custom index + TOPIC_OBSERVABLE -> TOPIC_OBSERVABLE: Verify its tracing event Message + TOPIC_OBSERVABLE -> TRACING_OBSERVABLE: Send Message to Tracing Observable + deactivate TOPIC_OBSERVABLE + activate TRACING_OBSERVABLE + group Cache Span + TRACING_OBSERVABLE -> CACHING_OBSERVABLE: Send Span Context, \nmetadata.State and Content\nfrom Message + note right of TRACING_OBSERVABLE #yellow + { + spanContext: { + service: "central-ledger-prepare-handler", + traceId: "bbd7b2c7bbd7b2c7", + parentSpanId: "44ba9bbc5840", + spanId: "2aa9cd0a7e87", + startTimestamp: "2015-08-29T11:22:09.815479Z", + finishTimestamp: "2015-08-29T11:22:09.815479Z", + tags: { + transctionId: "659ee338-c8f8-4c06-8aff-944e6c5cd694", + transctionType: "transfer", + parentEventType: "bulk-prepare", + parentEventAction: "prepare" + }, + state: metadata.state, + content + } + end note + deactivate TRACING_OBSERVABLE + activate CACHING_OBSERVABLE + CACHING_OBSERVABLE <- CACHE: Get cachedTrace by traceId + alt the span should not be cached + CACHING_OBSERVABLE -> SPAN_SENDER: currentSpan + SPAN_SENDER -> APM: store to APM + CACHING_OBSERVABLE -> CACHING_OBSERVABLE: Complete + else + CACHING_OBSERVABLE <-> CACHING_OBSERVABLE: Validate transactionType, TransactionAction and service to match Config.START_CRITERIA && !parentSpandId + alt !cachedTrace + CACHING_OBSERVABLE -> CACHING_OBSERVABLE: Create new cachedTrace + note right of CACHING_OBSERVABLE #yellow + { + spans: {}, + masterSpan: null, + lastSpan: null + } + end note + end + alt !parentSpan + CACHING_OBSERVABLE <-> CACHING_OBSERVABLE: Generate MasterSpanId + CACHING_OBSERVABLE <-> CACHING_OBSERVABLE: Make received span child of masterSpan \nmerge({ parentSpanId: MasterSpanId }, { ...spanContext }) + CACHING_OBSERVABLE <-> CACHING_OBSERVABLE: Create MasterSpanContext merge({ tags: { ...tags, masterSpan: MasterSpanId } }, \n{ ...spanContext }, \n{ spanId: MasterSpanId, service: `master-${tags.transactionType}` }) + CACHING_OBSERVABLE <-> CACHING_OBSERVABLE: Add masterSpan to cachedTrace + end + CACHING_OBSERVABLE <-> CACHE_HANDLER: Add span to cachedTrace + note right of CACHING_OBSERVABLE #yellow + { + spans: { + 2aa9cd0a7e87: { + state, + content + spanContext: { + "service": "central-ledger-prepare-handler", + "traceId": "bbd7b2c7bbd7b2c7", + "parentSpanId": MasterSpanId, + "spanId": "2aa9cd0a7e87", + "startTimestamp": "2015-08-29T11:22:09.815479Z", + "finishTimestamp": "2015-08-29T11:22:09.815479Z", + "tags": { + "transctionId": "659ee338-c8f8-4c06-8aff-944e6c5cd694", + "transctionType": "transfer", + "parentEventType": "bulk-prepare", + "parentEventAction": "prepare" + } + } + }, + MasterSpanId: { + state, + content, + MasterSpanContext + } + }, + masterSpan: MasterSpanContext, + lastSpan: null + } + end note + CACHING_OBSERVABLE -> CACHE_HANDLER: Update cachedTrace to Cache + alt cachedTrace not staled or expired + CACHE_HANDLER -> CACHE_HANDLER: unsubscribe from Scheduler + CACHE_HANDLER -> CACHE: record cachedTrace + CACHE_HANDLER <-> CACHE_HANDLER: Reschedule scheduler for handling stale traces + end + end + CACHING_OBSERVABLE -> LASTSPAN_OBSERVABLE: Send traceId to check if last span has been received\nand cached + deactivate CACHING_OBSERVABLE + activate LASTSPAN_OBSERVABLE + end + group Check for last span + LASTSPAN_OBSERVABLE <- CACHE: Get cachedTrace by traceId + LASTSPAN_OBSERVABLE -> LASTSPAN_OBSERVABLE: Sort spans by startTimestamp + loop for currentSpan of SortedSpans + alt parentSpan + LASTSPAN_OBSERVABLE -> LASTSPAN_OBSERVABLE: isError = (errorCode in parentSpan \nOR parentSpan status === failed \nOR status === failed) + LASTSPAN_OBSERVABLE -> LASTSPAN_OBSERVABLE: apply masterSpan and error tags from parent to current span in cachedTrace + alt !isLastSpan + LASTSPAN_OBSERVABLE -> CACHE_HANDLER: Update cachedTrace to Cache + alt cachedTrace not staled or expired + CACHE_HANDLER -> CACHE_HANDLER: unsubscribe from Scheduler + CACHE_HANDLER -> CACHE: record cachedTrace + CACHE_HANDLER <-> CACHE_HANDLER: Reschedule scheduler for handling stale traces + end + else + LASTSPAN_OBSERVABLE -> LASTSPAN_OBSERVABLE: Validate transactionType, TransactionAction, service and isError \nto match Config.START_CRITERIA && !parentSpandId + LASTSPAN_OBSERVABLE -> LASTSPAN_OBSERVABLE: cachedTrace.lastSpan = currentSpan.spanContext + LASTSPAN_OBSERVABLE -> CACHE_HANDLER: Update cachedTrace to Cache + alt cachedTrace not staled or expired + CACHE_HANDLER -> CACHE_HANDLER: unsubscribe from Scheduler + CACHE_HANDLER -> CACHE: record cachedTrace + CACHE_HANDLER <-> CACHE_HANDLER: Reschedule scheduler for handling stale traces + end + LASTSPAN_OBSERVABLE -> CREATETRACE_OBSERVABLE: Send traceId + deactivate LASTSPAN_OBSERVABLE + activate CREATETRACE_OBSERVABLE + end + end + end + end + group Recreate Trace from Cached Trace + CREATETRACE_OBSERVABLE <- CACHE: get cachedTrace by TraceId + alt cachedTrace.lastSpan AND cachedTrace.masterSpan + CREATETRACE_OBSERVABLE -> CREATETRACE_OBSERVABLE: currentSpan = lastSpan + CREATETRACE_OBSERVABLE -> CREATETRACE_OBSERVABLE: resultTrace = [lastSpan] + loop for i = 0; i < cachedTrace.spans.length; i++ + CREATETRACE_OBSERVABLE -> CREATETRACE_OBSERVABLE: get parentSpan of currentSpan + alt parentSpan + CREATETRACE_OBSERVABLE -> CREATETRACE_OBSERVABLE: insert parent span in resultTrace in front + else + CREATETRACE_OBSERVABLE -> CREATETRACE_OBSERVABLE: break loop + end + end + alt cachedTrace.masterSpan === currentSpan.spanId + CREATETRACE_OBSERVABLE -> CREATETRACE_OBSERVABLE: masterSpan.finishTimestamp = resultTrace[resultTrace.length - 1].finishTimestamp + CREATETRACE_OBSERVABLE -> TRACE_HANDLER: send resultTrace + deactivate CREATETRACE_OBSERVABLE + activate TRACE_HANDLER + end + end + end + group send Trace + loop trace elements + TRACE_HANDLER -> SPAN_SENDER: send each span + SPAN_SENDER -> APM: send span to APM + end + TRACE_HANDLER -> TRACE_HANDLER: unsubscribe scheduler for traceId + TRACE_HANDLER -> CACHE: drop cachedTrace + + end + end +@enduml \ No newline at end of file diff --git a/docs/fr/technical/technical/event-stream-processor/assets/diagrams/sequence/process-flow.svg b/docs/fr/technical/technical/event-stream-processor/assets/diagrams/sequence/process-flow.svg new file mode 100644 index 000000000..a85cf2bb6 --- /dev/null +++ b/docs/fr/technical/technical/event-stream-processor/assets/diagrams/sequence/process-flow.svg @@ -0,0 +1,577 @@ + + Event Streaming Processor flow + + + Event Streaming Processor flow + + Central Services + + Event Stream Processor + + Cache + + Elasticsearch + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Notification topic + + + Notification topic + Topic Observable + + + Topic Observable + + + Tracing Observable + + + Tracing Observable + + + Caching Observable + + + Caching Observable + + + Check For Last Span Observable + + + Check For Last Span Observable + + + Create Trace Observable + + + Create Trace Observable + + + Send Trace Handler + + + Send Trace Handler + + + Send Span Handler + + + Send Span Handler + + + Cache Handler + + + Cache Handler + + + Cache Storage + + + Cache Storage + + + APM + + + APM + + + Elasticsearch API + + + Elasticsearch API + + + + + + + + + + + + New Event Message Received + + + 1 + Consume Event Message + + + Message: + { + "from": "payeefsp", + "to": "payerfsp", + "id": "659ee338-c8f8-4c06-8aff-944e6c5cd694", + "content": { + "headers": { + "content-type": "applicationvnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "payeefsp", + "fspiop-destination": "payerfsp" + }, + "payload": <payload> + }, + "type": "application/json", + "metadata": { + "event": { + "id": "3920382d-f78c-4023-adf9-0d7a4a2a3a2f", + "type": "trace", + "action": "span", + "createdAt": "2019-05-29T23:18:32.935Z", + "state": { + "status": "success", + "code": 0, + "description": "action successful" + }, + "responseTo": "1a396c07-47ab-4d68-a7a0-7a1ea36f0012" + }, + "trace": { + "service": "central-ledger-prepare-handler", + "traceId": "bbd7b2c7bbd7b2c7", + "parentSpanId": "44ba9bbc5840", + "spanId": "2aa9cd0a7e87", + "startTimestamp": "2015-08-29T11:22:09.815479Z", + "finishTimestamp": "2015-08-29T11:22:09.815479Z", + "tags": { + "transctionId": "659ee338-c8f8-4c06-8aff-944e6c5cd694", + "transctionType": "transfer", + "parentEventType": "bulk-prepare", + "parentEventAction": "prepare" + } + } + } + } + + + 2 + Send message for log purposes to custom index + + + + + 3 + Verify its tracing event Message + + + 4 + Send Message to Tracing Observable + + + Cache Span + + + 5 + Send Span Context, + metadata.State and Content + from Message + + + { + spanContext: { + service: "central-ledger-prepare-handler", + traceId: "bbd7b2c7bbd7b2c7", + parentSpanId: "44ba9bbc5840", + spanId: "2aa9cd0a7e87", + startTimestamp: "2015-08-29T11:22:09.815479Z", + finishTimestamp: "2015-08-29T11:22:09.815479Z", + tags: { + transctionId: "659ee338-c8f8-4c06-8aff-944e6c5cd694", + transctionType: "transfer", + parentEventType: "bulk-prepare", + parentEventAction: "prepare" + }, + state: metadata.state, + content + } + + + 6 + Get cachedTrace by traceId + + + alt + [the span should not be cached] + + + 7 + currentSpan + + + 8 + store to APM + + + + + 9 + Complete + + + + + + + 10 + Validate transactionType, TransactionAction and service to match Config.START_CRITERIA && !parentSpandId + + + alt + [!cachedTrace] + + + + + 11 + Create new cachedTrace + + + { + spans: {}, + masterSpan: null, + lastSpan: null + } + + + alt + [!parentSpan] + + + + + + 12 + Generate MasterSpanId + + + + + + 13 + Make received span child of masterSpan + merge({ parentSpanId: MasterSpanId }, { ...spanContext }) + + + + + + 14 + Create MasterSpanContext merge({ tags: { ...tags, masterSpan: MasterSpanId } }, + { ...spanContext }, + { spanId: MasterSpanId, service: `master-${tags.transactionType}` }) + + + + + + 15 + Add masterSpan to cachedTrace + + + + 16 + Add span to cachedTrace + + + { + spans: { + 2aa9cd0a7e87: { + state, + content + spanContext: { + "service": "central-ledger-prepare-handler", + "traceId": "bbd7b2c7bbd7b2c7", + "parentSpanId": + MasterSpanId + , + "spanId": "2aa9cd0a7e87", + "startTimestamp": "2015-08-29T11:22:09.815479Z", + "finishTimestamp": "2015-08-29T11:22:09.815479Z", + "tags": { + "transctionId": "659ee338-c8f8-4c06-8aff-944e6c5cd694", + "transctionType": "transfer", + "parentEventType": "bulk-prepare", + "parentEventAction": "prepare" + } + } + }, +    + MasterSpanId: + { + state, + content, + MasterSpanContext + } + }, + masterSpan: + MasterSpanContext + , + lastSpan: null + } + + + 17 + Update cachedTrace to Cache + + + alt + [cachedTrace not staled or expired] + + + + + 18 + unsubscribe from Scheduler + + + 19 + record cachedTrace + + + + + + 20 + Reschedule scheduler for handling stale traces + + + 21 + Send traceId to check if last span has been received + and cached + + + Check for last span + + + 22 + Get cachedTrace by traceId + + + + + 23 + Sort spans by startTimestamp + + + loop + [for currentSpan of SortedSpans] + + + alt + [parentSpan] + + + + + 24 + isError = (errorCode in parentSpan + OR parentSpan status === failed + OR status === failed) + + + + + 25 + apply masterSpan and error tags from parent to current span in cachedTrace + + + alt + [!isLastSpan] + + + 26 + Update cachedTrace to Cache + + + alt + [cachedTrace not staled or expired] + + + + + 27 + unsubscribe from Scheduler + + + 28 + record cachedTrace + + + + + + 29 + Reschedule scheduler for handling stale traces + + + + + + 30 + Validate transactionType, TransactionAction, service and isError + to match Config.START_CRITERIA && !parentSpandId + + + + + 31 + cachedTrace.lastSpan = currentSpan.spanContext + + + 32 + Update cachedTrace to Cache + + + alt + [cachedTrace not staled or expired] + + + + + 33 + unsubscribe from Scheduler + + + 34 + record cachedTrace + + + + + + 35 + Reschedule scheduler for handling stale traces + + + 36 + Send traceId + + + Recreate Trace from Cached Trace + + + 37 + get cachedTrace by TraceId + + + alt + [cachedTrace.lastSpan AND cachedTrace.masterSpan] + + + + + 38 + currentSpan = lastSpan + + + + + 39 + resultTrace = [lastSpan] + + + loop + [for i = 0; i < cachedTrace.spans.length; i++] + + + + + 40 + get parentSpan of currentSpan + + + alt + [parentSpan] + + + + + 41 + insert parent span in resultTrace in front + + + + + + 42 + break loop + + + alt + [cachedTrace.masterSpan === currentSpan.spanId] + + + + + 43 + masterSpan.finishTimestamp = resultTrace[resultTrace.length - 1].finishTimestamp + + + 44 + send resultTrace + + + send Trace + + + loop + [trace elements] + + + 45 + send each span + + + 46 + send span to APM + + + + + 47 + unsubscribe scheduler for traceId + + + 48 + drop cachedTrace + + diff --git a/docs/fr/technical/technical/fraud-services/README.md b/docs/fr/technical/technical/fraud-services/README.md new file mode 100644 index 000000000..e286cf1ad --- /dev/null +++ b/docs/fr/technical/technical/fraud-services/README.md @@ -0,0 +1,5 @@ +# Services anti-fraude + +Présentation des mesures de surveillance et de prévention envisagées pour limiter et décourager les activités frauduleuses au sein d’un schéma Mojaloop. + +Les artefacts pertinents mis à disposition du public sont regroupés dans la section [documents associés](./related-documents/documentation.md). diff --git a/docs/fr/technical/technical/fraud-services/related-documents/documentation.md b/docs/fr/technical/technical/fraud-services/related-documents/documentation.md new file mode 100644 index 000000000..eea9c8f0e --- /dev/null +++ b/docs/fr/technical/technical/fraud-services/related-documents/documentation.md @@ -0,0 +1,7 @@ +# Services anti-fraude + +Artefacts de référence publique liés aux mesures de prévention et de limitation de la fraude au sein de l’écosystème. + +## Liste des artefacts actuels + +#### [Document de synthèse fraude — écosystème Mojaloop](https://github.com/mojaloop/documentation-artifacts/blob/master/presentations/April%202019%20PI-6_OSS_community%20session/Mojaloop-Fraud-20190410.pdf) diff --git a/docs/fr/technical/technical/ml-testing-toolkit/README.md b/docs/fr/technical/technical/ml-testing-toolkit/README.md new file mode 100644 index 000000000..dacda2c82 --- /dev/null +++ b/docs/fr/technical/technical/ml-testing-toolkit/README.md @@ -0,0 +1,14 @@ +# Mojaloop Testing Toolkit + +Le **Mojaloop Testing Toolkit** a été conçu pour aider les schémas Mojaloop à monter en charge en simplifiant l’intégration des DFSP. Les schémas peuvent y publier des règles et des tests ; les DFSP s’en servent pour l’auto-test (voire l’auto-certification). Cela garantit que les implémentations sont prêtes à se brancher au schéma et accélère l’intégration aux Hubs Mojaloop. + +L’outil visait d’abord les FSP / participants rejoignant un schéma Mojaloop. Aujourd’hui, il peut être utilisé par les DFSP et les **Hubs Mojaloop** pour vérifier l’interopérabilité entre les deux. Conçu comme outil d’intégration standard entre un **fournisseur de services financiers numériques (DFSP)** et le **switch Mojaloop** (Hub), il facilite les tests. + +Pour le contexte du *Self Testing Toolkit*, voir [Mojaloop Testing Toolkit](https://github.com/mojaloop/ml-testing-toolkit/blob/master/documents/Mojaloop-Testing-Toolkit.md). Il est recommandé de consulter le [diagramme d’architecture](https://github.com/mojaloop/ml-testing-toolkit/blob/master/documents/Mojaloop-Testing-Toolkit.md#7-architecture), qui présente les composants et flux. + +## Guides d’utilisation + +* Interface web : [guide d’utilisation](https://github.com/mojaloop/ml-testing-toolkit/blob/master/documents/User-Guide.md) +* Ligne de commande : [guide CLI](https://github.com/mojaloop/ml-testing-toolkit/blob/master/documents/User-Guide-CLI.md) + +**Si vous avez votre propre implémentation DFSP, vous pouvez pointer le *peer endpoint* vers Mojaloop Testing Toolkit sur le port 5000 et envoyer les requêtes depuis votre implémentation au lieu de *mojaloop-simulator*.** diff --git a/docs/fr/technical/technical/overview/README.md b/docs/fr/technical/technical/overview/README.md new file mode 100644 index 000000000..4d618f5ed --- /dev/null +++ b/docs/fr/technical/technical/overview/README.md @@ -0,0 +1,24 @@ +# Hub Mojaloop + +Plusieurs composants constituent l’écosystème Mojaloop. Le Hub Mojaloop est le conteneur principal et la référence que nous utilisons pour décrire les composants centraux de Mojaloop. + +Le diagramme de composants suivant présente la décomposition des services Mojaloop et son architecture microservices : + +![Vue d’ensemble actuelle de l’architecture Mojaloop](./assets/diagrams/architecture/Arch-Mojaloop-overview-PI18.svg) + +_Note : le code couleur indique les relations entre le stockage de données, la messagerie en flux et les interconnexions d’adaptateurs. Par exemple, les `Central-Services` utilisent `MySQL` comme base de données et s’appuient sur `Kafka` pour la messagerie._ + +Il comprend notamment : + +* Les **adaptateurs d’API Mojaloop** (**ML-API-Adapter**) fournissent l’ensemble standard d’interfaces qu’un DFSP peut mettre en œuvre pour se connecter au système pour les transferts. Un DFSP qui souhaite se raccorder peut s’appuyer sur notre code d’exemple ou implémenter les interfaces standard dans son propre logiciel. L’objectif est de rendre la connexion au réseau interopérable aussi simple que possible pour un DFSP. +* Les **Central Services** (**CS**) regroupent les composants nécessaires pour déplacer des fonds d’un DFSP à un autre via les adaptateurs d’API Mojaloop. C’est analogue à la façon dont les fonds transitent par une banque centrale ou une chambre de compensation dans les pays développés. Les Central Services contiennent la logique centrale du registre (Central Ledger) pour déplacer les fonds, et pourront être étendus pour la gestion de la fraude et l’application des règles du schéma. +* Le **Account Lookup Service** (**ALS**) permet de résoudre les informations de routage des FSP via l’API Participant ou d’orchestrer une requête Party à partir d’une recherche interne de Participant. La recherche interne de Participant est assurée par plusieurs adaptateurs ou services Oracle standard. Un exemple d’adaptateur ou de service Oracle consiste à rechercher les informations de Participant dans Pathfinder ou un registre marchand. Ces adaptateurs ou services Oracle peuvent être ajoutés facilement selon les exigences du schéma. +* Le **Quoting Service** (**QA**) : le devis est le processus qui détermine les éventuels frais et commissions nécessaires pour réaliser une opération financière entre deux FSP. Il est toujours initié par le FSP payeur vers le FSP bénéficiaire ; le flux du devis suit donc le même sens qu’une opération financière. +* Le **simulateur** (**SIM**) simule plusieurs fonctions DFSP, notamment : + * des points de terminaison Oracle pour les opérations CRUD sur les Participants Oracle avec cache en mémoire ; + * des points de terminaison Participant pour les Oracles avec prise en charge des `partyIdTypes` paramétrables ; + * des points de terminaison Parties pour les FSP payeur et bénéficiaire avec réponses de rappel associées ; + * des points de terminaison de transfert pour les FSP payeur et bénéficiaire avec réponses de rappel associées ; et + * des API d’interrogation pour vérifier les transactions (requêtes, réponses, rappels, etc.) afin de soutenir les tests et la vérification (assurance qualité). + +De part et d’autre du Hub Mojaloop, du code open source d’exemple illustre comment un DFSP peut envoyer et recevoir des paiements, ainsi que le client qu’un DFSP existant pourrait héberger pour se connecter au réseau. diff --git a/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI11.svg b/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI11.svg new file mode 100644 index 000000000..df9396cae --- /dev/null +++ b/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI11.svg @@ -0,0 +1,3 @@ + + +
    Operational Monitoring
    Operational Monitoring
    Quality Assurance
    Quality Assurance
    Core Components
    Core Components
    API - Security / Policy / Ingress / Egress
    API - Security / Policy / Ingress / Egress
    Continuous Integration & Delivery
    Continuous Integration & Delivery
    Container Management & Orchestration
    Container Management & Orchestration
    Supporting Components
    Supporting Components
    Helm
    (Package Manager for K8s, Templatized Deployments and Configuration)
    Helm...
    Kubernetes
    (Abstraction layer for Infrastructure, Infrastructure as a Policy, Container Orchestration)
    Kubernetes...
    Docker
    (Container Engine)
    Docker...
    Infrastructure
    (AWS, Azure, On-Prem)
    Infrastructure...
    EFK - ElasticSearch / Fluentd / Kibana
    (Log Search / Collection / Monitoring / Tracing)
    EFK - ElasticSearch / Fluentd / Kibana...
    Promfana - Prometheus / Grafana
    (Log Search / Collection / Monitoring)
    Promfana - Prometheus / Grafana...
    Open Tracing
    (Distributed Tracing)
    Open Tracing...
    Rancher
    (Infrastructure Management)
    Rancher...
    Mojaloop API Adapter
    (API - Transfers)
    Mojaloop API Adapter...
    Central-Services
    (API - Operational Admin)
    Central-Services...
    Central-Services
    (Handler - Prepare)
    Central-Services...
    Central-Services
    (Handler - Position)
    Central-Services...
    Central-Services
    (Handler - Fulfil)
    Central-Services...
    Central-Services
    (Handler - Get Transfers)
    Central-Services...
    Central-Services
    (Handler - Timeout)
    Central-Services...
    Central-KMS
    (Future - Key Management Store)
    Central-KMS...
    ALS - Account-Lookup-Service
    (API - Parties, Participant)
    ALS - Account-Lookup-Service...
    ALS-Oracle-Pathfinder
    (MSISDN Lookup)
    ALS-Oracle-Pathfinder...
    Central-Event-Processor
    (CEP)
    Central-Event-Processor...
    Email-Notifier
    (Handler - Email)
    Email-Notifier...
    Central-Services
    (Handler - Admin)
    Central-Services...
    Circle-CI
    (Test, Build, Deploy)
    Circle-CI...
    Docker Hub
    (Container Repository)
    Docker Hub...
    NPM Org
    (NPM Repository)
    NPM Org...
    GitBooks
    (Documetation)
    GitBooks...
    API Gateway
    (Future - API - Parties, Participants, Quotes, Transfers, Bulk Transfers)
    API Gateway...
    Central-Services
    (Handler - Bulk Prepare)
    Central-Services...
    Central-Services
    (Handler - Bulk Fulfil)
    Central-Services...
    Central-Services
    (Handler - Bulk Process)
    Central-Services...
    Mojaloop API Adapter
    (API - Bulk Transfers)
    Mojaloop API Adapter...
    Forensic-Logging
    (Future - Auditing)
    Forensic-Logging...
    Central-Settlements
    (API - Settlement)
    Central-Settlements...
    Event-Stream-Processor
    Logs, Error, Audits, Tracing)
    Event-Stream-Processor...
    Simulators
    (API, SDK, FSP & Oracle)
    Simulators...
    On-boarding
    (Postman - Scripts)
    On-boarding...
    Functional Tests
    (Postman - Scripts)
    Functional Tests...
    Self Testing Toolkit
    (
    POC UI)
    Self Testing Toolkit...
    License, Security & Audit
    (Dependencies)
    License, Security & Audit...
    Persistence
    Persistence
    Redis
    (SDK - Cache)
    Redis...
    MongoDB
    (CEP - Data)
    MongoDB...
    MySQL
    (Percona - Data)
    MySQL...
    Kafka
    (Message - Streaming)
    Kafka...
    Transaction Request Service
    (API - Transaction)
    Transaction Request Service...
    Software Dev Kits
    Software Dev Kits
    Oracle SDK
    (Participant Store)
    Oracle SDK...
    Mojaloop SDK 
    (FSP Payer/Payee)
    Mojaloop SDK...
    Event SDK
    (Audit, Log, Trace - Client/Server)
    Event SDK...
    Event-Sidecar
    (Logs, Error, Audits, Tracing)
    Event-Sidecar...
    Mojaloop API Adapter
    (Handler - Notifications)
    Mojaloop API Adapter...
    Quoting-Service
    (API - Quotes)
    Quoting-Service...
    Finance-Portal-UI
    (API - Bulk Transfers)
    Finance-Portal-UI...
    Settlement-Management
    (Closing, Recon report, Cronjob)
    Settlement-Management...
    Schema-Adapter
    (SDK - Parties, Participants, Quotes, Transfers)
    Schema-Adapter...
    IaC (Infra as Code) Tools
    (Future - Automated
    Prov / Depl / Upgrades)
    IaC (Infra as Code) Tools...
    Third Party API Adapter
    (PoC - API - Transfers)
    Third Party API Adapter...
    Third Party API Adapter
    (PoC - Handler - Notifications)
    Third Party API Adapter...
    Viewer does not support full SVG 1.1
    \ No newline at end of file diff --git a/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI12.svg b/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI12.svg new file mode 100644 index 000000000..763c5697e --- /dev/null +++ b/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI12.svg @@ -0,0 +1,3 @@ + + +
    Operational Monitoring
    Operational Monitoring
    Quality Assurance
    Quality Assurance
    Core Components
    Core Components
    API - Security / Policy / Ingress / Egress
    API - Security / Policy / Ingress / Egress
    Continuous Integration & Delivery
    Continuous Integration & Delivery
    Container Management & Orchestration
    Container Management & Orchestration
    Supporting Components
    Supporting Components
    Helm
    (Package Manager for K8s, Templatized Deployments and Configuration)
    Helm...
    Kubernetes
    (Abstraction layer for Infrastructure, Infrastructure as a Policy, Container Orchestration)
    Kubernetes...
    Docker
    (Container Engine)
    Docker...
    Infrastructure
    (AWS, Azure, On-Prem)
    Infrastructure...
    EFK - ElasticSearch / Fluentd / Kibana
    (Log Search / Collection / Monitoring / Tracing)
    EFK - ElasticSearch / Fluentd / Kibana...
    Promfana - Prometheus / Grafana
    (Metrics - Collection / Monitoring)
    Promfana - Prometheus / Grafana...
    Open Tracing
    (Distributed Tracing)
    Open Tracing...
    Rancher
    (Infrastructure Management)
    Rancher...
    Mojaloop API Adapter
    (API - Transfers)
    Mojaloop API Adapter...
    Central-Services
    (API - Operational Admin)
    Central-Services...
    Central-Services
    (Handler - Prepare)
    Central-Services...
    Central-Services
    (Handler - Position)
    Central-Services...
    Central-Services
    (Handler - Fulfil)
    Central-Services...
    Central-Services
    (Handler - Get Transfers)
    Central-Services...
    Central-Services
    (Handler - Timeout)
    Central-Services...
    Central-KMS
    (Future - Key Management Store)
    Central-KMS...
    ALS - Account-Lookup-Service
    (API - Parties, Participant)
    ALS - Account-Lookup-Service...
    ALS-Oracle-Pathfinder
    (MSISDN Lookup)
    ALS-Oracle-Pathfinder...
    Central-Event-Processor
    (CEP)
    Central-Event-Processor...
    Email-Notifier
    (Handler - Email)
    Email-Notifier...
    Central-Services
    (Handler - Admin)
    Central-Services...
    Circle-CI
    (Test, Build, Deploy)
    Circle-CI...
    Docker Hub
    (Container Repository)
    Docker Hub...
    NPM Org
    (NPM Repository)
    NPM Org...
    GitBooks
    (Documetation)
    GitBooks...
    API Gateway (IaC)
    (API - Parties, Participants, Quotes, Transfers, Bulk Transfers; OAuth; MTLS)
    API Gateway (IaC)...
    Central-Services
    (Handler - Bulk Prepare)
    Central-Services...
    Central-Services
    (Handler - Bulk Fulfil)
    Central-Services...
    Central-Services
    (Handler - Bulk Process)
    Central-Services...
    Mojaloop API Adapter
    (API - Bulk Transfers)
    Mojaloop API Adapter...
    Forensic-Logging
    (Future - Auditing)
    Forensic-Logging...
    Central-Settlements
    (API - Settlements)
    Central-Settlements...
    Event-Stream-Processor
    (Logs, Error, Audits, Tracing)
    Event-Stream-Processor...
    Simulators
    (API, SDK, FSP & Oracle)
    Simulators...
    On-boarding
    (Postman - Scripts)
    On-boarding...
    Functional Tests
    (Postman - Scripts)
    Functional Tests...
    Testing Toolkit
    (
    UI, CLI & Backend)
    Testing Toolkit...
    License, Security & Audit
    (Dependencies)
    License, Security & Audit...
    Persistence
    Persistence
    Redis
    (SDK - Cache)
    Redis...
    MongoDB
    (CEP - Data)
    MongoDB...
    MySQL
    (Percona - Data)
    MySQL...
    Kafka
    (Message - Streaming)
    Kafka...
    Transaction Request Service
    (API - Transaction)
    Transaction Request Service...
    Software Dev Kits
    Software Dev Kits
    Oracle SDK
    (Participant Store)
    Oracle SDK...
    Mojaloop SDK 
    (FSP Payer/Payee)
    Mojaloop SDK...
    Event SDK
    (Audit, Log, Trace - Client/Server)
    Event SDK...
    Event-Sidecar
    (Logs, Error, Audits, Tracing)
    Event-Sidecar...
    Mojaloop API Adapter
    (Handler - Notifications)
    Mojaloop API Adapter...
    Quoting-Service
    (API - Quotes)
    Quoting-Service...
    Finance-Portal-UI
    (API - Bulk Transfers)
    Finance-Portal-UI...
    Settlement-Management
    (Closing, Recon report, Cronjob)
    Settlement-Management...
    Schema-Adapter
    (SDK - Parties, Participants, Quotes, Transfers)
    Schema-Adapter...
    IaC (Infra as Code) Tools
    (Automated Lab/Env Setup & Configuration)
    IaC (Infra as Code) Tools...
    Third Party API Adapter
    (PoC - API - Transfers)
    Third Party API Adapter...
    Third Party API Adapter
    (PoC - Handler - Notifications)
    Third Party API Adapter...
    Central-Settlements
    (Handler - Settlement Windows)
    Central-Settlements...
    Central-Settlements
    (Handler - Transfer Settlements)
    Central-Settlements...
    Viewer does not support full SVG 1.1
    diff --git a/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI14.svg b/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI14.svg new file mode 100644 index 000000000..06680fbae --- /dev/null +++ b/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI14.svg @@ -0,0 +1,3 @@ + + +
    Operational Monitoring
    Operational Monitoring
    Quality Assurance
    Quality Assurance
    Core Components
    Core Components
    API - Security / Policy / Ingress / Egress
    API - Security / Policy / Ingress / Egress
    Continuous Integration & Delivery
    Continuous Integration & Delivery
    Container Management & Orchestration
    Container Management & Orchestration
    Supporting Components
    Supporting Components
    Helm
    (Package Manager for K8s, Templatized Deployments and Configuration)
    Helm...
    Kubernetes
    (Abstraction layer for Infrastructure, Infrastructure as a Policy, Container Orchestration)
    Kubernetes...
    Docker
    (Container Engine)
    Docker...
    Infrastructure
    (AWS, Azure, On-Prem)
    Infrastructure...
    EFK - ElasticSearch / Fluentd / Kibana
    (Log Search / Collection / Monitoring / Tracing)
    EFK - ElasticSearch / Fluentd / Kibana...
    Promfana - Prometheus / Grafana
    (Metrics - Collection / Monitoring)
    Promfana - Prometheus / Grafana...
    Open Tracing
    (Distributed Tracing)
    Open Tracing...
    Rancher
    (Infrastructure Management)
    Rancher...
    Mojaloop API Adapter
    (API - Transfers)
    Mojaloop API Adapter...
    Central-Services
    (API - Operational Admin)
    Central-Services...
    Central-Services
    (Handler - Prepare)
    Central-Services...
    Central-Services
    (Handler - Position)
    Central-Services...
    Central-Services
    (Handler - Fulfil)
    Central-Services...
    Central-Services
    (Handler - Get Transfers)
    Central-Services...
    Central-Services
    (Handler - Timeout)
    Central-Services...
    ALS - Account-Lookup-Service
    (API - Parties, Participant)
    ALS - Account-Lookup-Service...
    ALS-Oracle-Pathfinder
    (MSISDN Lookup)
    ALS-Oracle-Pathfinder...
    Central-Event-Processor
    (CEP)
    Central-Event-Processor...
    Email-Notifier
    (Handler - Email)
    Email-Notifier...
    Central-Services
    (Handler - Admin)
    Central-Services...
    Circle-CI
    (Test, Build, Deploy)
    Circle-CI...
    Docker Hub
    (Container Repository)
    Docker Hub...
    NPM Org
    (NPM Repository)
    NPM Org...
    GitBooks
    (Documetation)
    GitBooks...
    API Gateway (IaC)
    (API - Parties, Participants, Quotes, Transfers, Bulk Transfers; OAuth; MTLS)
    API Gateway (IaC)...
    Central-Services
    (Handler - Bulk Prepare)
    Central-Services...
    Central-Services
    (Handler - Bulk Fulfil)
    Central-Services...
    Central-Services
    (Handler - Bulk Process)
    Central-Services...
    Mojaloop API Adapter
    (API - Bulk Transfers)
    Mojaloop API Adapter...
    Central-Settlements
    (API - Settlements)
    Central-Settlements...
    Event-Stream-Processor
    (Logs, Error, Audits, Tracing)
    Event-Stream-Processor...
    Simulators
    (API, SDK, FSP & Oracle)
    Simulators...
    On-boarding
    (Postman - Scripts)
    On-boarding...
    Functional Tests
    (Postman - Scripts)
    Functional Tests...
    Testing Toolkit
    (
    UI, CLI & Backend)
    Testing Toolkit...
    License, Security & Audit
    (Dependencies)
    License, Security & Audit...
    Persistence
    Persistence
    Redis
    (SDK - Cache)
    Redis...
    MongoDB
    (CEP - Data)
    MongoDB...
    MySQL
    (Percona - Data)
    MySQL...
    Kafka
    (Message - Streaming)
    Kafka...
    Transaction Request Service
    (API - Transaction)
    Transaction Request Service...
    Software Dev Kits
    Software Dev Kits
    Oracle SDK
    (Participant Store)
    Oracle SDK...
    Mojaloop SDK 
    (FSP Payer/Payee)
    Mojaloop SDK...
    Event SDK
    (Audit, Log, Trace - Client/Server)
    Event SDK...
    Event-Sidecar
    (Logs, Error, Audits, Tracing)
    Event-Sidecar...
    Mojaloop API Adapter
    (Handler - Notifications)
    Mojaloop API Adapter...
    Quoting-Service
    (API - Quotes)
    Quoting-Service...
    Finance-Portal-UI
    (API - Bulk Transfers)
    Finance-Portal-UI...
    Settlement-Management
    (Closing, Recon report, Cronjob)
    Settlement-Management...
    Schema-Adapter
    (SDK - Parties, Participants, Quotes, Transfers)
    Schema-Adapter...
    IaC (Infra as Code) Tools
    (Automated Lab/Env Setup & Configuration)
    IaC (Infra as Code) Tools...
    Third Party API Adapter
    (PoC - API - Transfers)
    Third Party API Adapter...
    Third Party API Adapter
    (PoC - Handler - Notifications)
    Third Party API Adapter...
    Central-Settlements
    (Handler - Deferred)
    Central-Settlements...
    Central-Settlements
    (Handler - Gross)
    Central-Settlements...
    Central-Settlements
    (Handler - Rules)
    Central-Settlements...
    Viewer does not support full SVG 1.1
    \ No newline at end of file diff --git a/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI18.svg b/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI18.svg new file mode 100644 index 000000000..6e753c75d --- /dev/null +++ b/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI18.svg @@ -0,0 +1,4 @@ + + + +
    Operational Monitoring
    Operational Monitoring
    Quality Assurance
    Quality Assurance
    Core Components
    Core Components
    API - Security / Policy / Ingress / Egress
    API - Security / Policy / Ingress / Egress
    Continuous Integration & Delivery
    Continuous Integration & Delivery
    Container Management & Orchestration
    Container Management & Orchestration
    Supporting Components
    Supporting Components
    Helm
    (Package Manager for K8s, Templatized Deployments and Configuration)
    Helm...
    Kubernetes
    (Abstraction layer for Infrastructure, Infrastructure as a Policy, Container Orchestration)
    Kubernetes...
    Docker
    (Container Engine)
    Docker...
    Infrastructure
    (AWS, Azure, On-Prem)
    Infrastructure...
    EFK - ElasticSearch / Fluentd / Kibana
    (Log Search / Collection / Monitoring / Tracing)
    EFK - ElasticSearch / Fluentd / Kibana...
    Promfana - Prometheus / Grafana
    (Metrics - Collection / Monitoring)
    Promfana - Prometheus / Grafana...
    Open Tracing
    (Distributed Tracing)
    Open Tracing...
    Infra management
    (IaC, Miniloop)
    Infra management...
    Mojaloop API Adapter
    (FSPIOP API - Transfers)
    Mojaloop API Adapter...
    Central-Services
    (API - Operational Admin)
    Central-Services...
    Central-Services
    (Handler - Prepare)
    Central-Services...
    Central-Services
    (Handler - Position)
    Central-Services...
    Central-Services
    (Handler - Fulfil)
    Central-Services...
    Central-Services
    (Handler - Get Transfers)
    Central-Services...
    Central-Services
    (Handler - Timeout)
    Central-Services...
    ALS - Account-Lookup-Service
    (API - Parties, Participant)
    ALS - Account-Lookup-Service...
    ALS-Oracle-Pathfinder
    (MSISDN Lookup)
    ALS-Oracle-Pathfinder...
    Central-Event-Processor
    (CEP)
    Central-Event-Processor...
    Email-Notifier
    (Handler - Email)
    Email-Notifier...
    Central-Services
    (Handler - Admin)
    Central-Services...
    Circle-CI
    (Test, Build, Deploy)
    Circle-CI...
    Docker Hub
    (Container Repository)
    Docker Hub...
    NPM Org
    (NPM Repository)
    NPM Org...
    GitBooks
    (Documetation)
    GitBooks...
    API Gateway (IaC)
    (FSPIOP API - Parties, Participants, Quotes, Transfers, Bulk Transfers; OAuth; MTLS)
    API Gateway (IaC)...
    Central-Services
    (Handler - Bulk Prepare)
    Central-Services...
    Central-Services
    (Handler - Bulk Fulfil)
    Central-Services...
    Central-Services
    (Handler - Bulk Process)
    Central-Services...
    Mojaloop API Adapter
    (API - Bulk Transfers)
    Mojaloop API Adapter...
    Central-Settlements
    (API - Settlements)
    Central-Settlements...
    Event-Stream-Processor
    (Logs, Error, Audits, Tracing)
    Event-Stream-Processor...
    Simulators
    (API, SDK, FSP & Oracle)
    Simulators...
    On-boarding
    (Postman - Scripts)
    On-boarding...
    Functional Tests
    (Postman - Scripts)
    Functional Tests...
    Testing Toolkit
    (Functional
    UI, CLI & Backend)
    Testing Toolkit...
    License, Security & Audit
    (Dependencies)
    License, Security & Audit...
    Persistence
    Persistence
    Redis
    (SDK - Cache)
    Redis...
    MongoDB
    (CEP - Data)
    MongoDB...
    MySQL
    (Percona - Data)
    MySQL...
    Kafka
    (Message - Streaming)
    Kafka...
    Transaction Request Service
    (API - Transaction)
    Transaction Request Service...
    Software Accelerators
    Software Accelerators
    Oracle SDK
    (Participant Store)
    Oracle SDK...
    Mojaloop SDK 
    (FSP Payer/Payee)
    Mojaloop SDK...
    Event SDK
    (Audit, Log, Trace - Client/Server)
    Event SDK...
    Event-Sidecar
    (Logs, Error, Audits, Tracing)
    Event-Sidecar...
    Mojaloop API Adapter
    (Handler - Notifications)
    Mojaloop API Adapter...
    Quoting-Service
    (API - Quotes)
    Quoting-Service...
    Finance-Portal-UI
    (micro-frontends)
    Finance-Portal-UI...
    Settlement-Management
    (Closing, Recon report, Cronjob)
    Settlement-Management...
    Schema-Adapter
    (SDK - Parties, Participants, Quotes, Transfers)
    Schema-Adapter...
    IaC (Infra as Code) Tools
    (Automated Lab/Env Setup & Configuration)
    IaC (Infra as Code) Tools...
    Third Party API Adapter
    (3PPI - API - Transfers)
    Third Party API Adapter...
    Third Party API Adapter
    (3PPI Handler - Notifications)
    Third Party API Adapter...
    Central-Settlements
    (Handler - Deferred)
    Central-Settlements...
    Central-Settlements
    (Handler - Gross)
    Central-Settlements...
    Central-Settlements
    (Handler - Rules)
    Central-Settlements...
    Business Operations Framework for 
    (Reporting
    )
    (Operations)
    (Monitoring)
    (self-service portals)
    Business Operations Frame...
    IAM, RBAC
    (Administration APIs; Ory - Keto, Kratos, Oathkeeper)
    IAM, RBAC...
    Text is not SVG - cannot display
    \ No newline at end of file diff --git a/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI3.svg b/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI3.svg new file mode 100644 index 000000000..4a658b897 --- /dev/null +++ b/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI3.svg @@ -0,0 +1,3 @@ + + +
    Helm
    (Package Manager for K8s, Templatized Deployments and Configuration)
    [Not supported by viewer]
    Kubernetes
    (Abstraction layer for Infrastructure, Infrastructure as a Policy, Container Orchestration)
    [Not supported by viewer]
    Docker
    (Container Engine)
    [Not supported by viewer]
    Infrastructure
    (AWS, Azure, On-Prem)
    [Not supported by viewer]
    EFK - ElasticSearch / Fluentd / Kabana
    (Log Search / Collection / Monitoring)
    [Not supported by viewer]
    Promfana - Prometheus / Grafana
    (Log Search / Collection / Monitoring)
    [Not supported by viewer]
    Zipkin
    (Future - Distributed Tracing)
    [Not supported by viewer]
    Rancher
    (Infrastructure Management)
    [Not supported by viewer]
    PostgreSQL
    (Deprecated - Data)
    [Not supported by viewer]
    MongoDB
    (CEP - Data)
    [Not supported by viewer]
    MySQL
    (Percona - Data)
    [Not supported by viewer]
    Kafka
    (Message - Streaming)
    [Not supported by viewer]
    Mojaloop API Adapter
    (API - Transfers)
    [Not supported by viewer]
    Mojaloop API Adapter
    (Handler - Notifications)
    [Not supported by viewer]
    Central-Services
    (API - Operational Admin)
    [Not supported by viewer]
    Central-Services
    (Handler - Prepare)
    [Not supported by viewer]
    Central-Services
    (Handler - Position)
    [Not supported by viewer]
    Central-Services
    (Handler - Fulfil)
    [Not supported by viewer]
    Central-Services
    (Handler - Get Transfers)
    [Not supported by viewer]
    Central-Services
    (Handler - Timeout)
    [Not supported by viewer]
    Simulator
    (API - QA FSP Simulator)
    [Not supported by viewer]
    Forensic-Logging-Sidecar
    (Auditing)
    [Not supported by viewer]
    Central-KMS
    (Key Management Store)
    [Not supported by viewer]
    Central-Directory
    (Participant Lookup)
    [Not supported by viewer]
    Central-End-User-Registry
    (Custom Participant Store)
    [Not supported by viewer]
    Mock-Pathfinder
    (Mocked Pathfinder)
    [Not supported by viewer]
    Central-Event-Processor
    (CEP)
    [Not supported by viewer]
    Email-Notifier
    (Handler - Email)
    [Not supported by viewer]
    Central-Services
    (Handler - Admin)
    [Not supported by viewer]
    Central-Hub
    (Retired - Operational Web Interface)
    [Not supported by viewer]
    Interop-Switch
    (To be Retired - Transfers, Quotes, Parties, Participants)
    [Not supported by viewer]
    Circle-CI
    (Test, Build, Deploy)
    [Not supported by viewer]
    Docker Hub
    (Container Repository)
    [Not supported by viewer]
    NPM Org
    (NPM Repository)
    [Not supported by viewer]
    \ No newline at end of file diff --git a/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI5.svg b/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI5.svg new file mode 100644 index 000000000..ac0b21621 --- /dev/null +++ b/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI5.svg @@ -0,0 +1,3 @@ + + +
    Helm
    (Package Manager for K8s, Templatized Deployments and Configuration)
    [Not supported by viewer]
    Kubernetes
    (Abstraction layer for Infrastructure, Infrastructure as a Policy, Container Orchestration)
    [Not supported by viewer]
    Docker
    (Container Engine)
    [Not supported by viewer]
    Infrastructure
    (AWS, Azure, On-Prem)
    [Not supported by viewer]
    EFK - ElasticSearch / Fluentd / Kabana
    (Log Search / Collection / Monitoring)
    [Not supported by viewer]
    Promfana - Prometheus / Grafana
    (Log Search / Collection / Monitoring)
    [Not supported by viewer]
    Zipkin
    (Future - Distributed Tracing)
    [Not supported by viewer]
    Rancher
    (Infrastructure Management)
    [Not supported by viewer]
    PostgreSQL
    (Deprecated - Data)
    [Not supported by viewer]
    MongoDB
    (CEP - Data)
    [Not supported by viewer]
    MySQL
    (Percona - Data)
    [Not supported by viewer]
    Kafka
    (Message - Streaming)
    [Not supported by viewer]
    Mojaloop API Adapter
    (API - Transfers)
    [Not supported by viewer]
    Mojaloop API Adapter
    (Handler - Notifications)
    [Not supported by viewer]
    Central-Services
    (API - Operational Admin)
    [Not supported by viewer]
    Central-Services
    (Handler - Prepare)
    [Not supported by viewer]
    Central-Services
    (Handler - Position)
    [Not supported by viewer]
    Central-Services
    (Handler - Fulfil)
    [Not supported by viewer]
    Central-Services
    (Handler - Get Transfers)
    [Not supported by viewer]
    Central-Services
    (Handler - Timeout)
    [Not supported by viewer]
    Simulator
    (API - QA FSP Simulator)
    [Not supported by viewer]
    Forensic-Logging-Sidecar
    (Auditing)
    [Not supported by viewer]
    Central-KMS
    (Key Management Store)
    [Not supported by viewer]
    ALS - Account-Lookup-Service
    (API - Parties, Participant)
    [Not supported by viewer]
    ALS-Oracle-Msisdn-Service
    (Pathfinder Lookup Adapter)
    [Not supported by viewer]
    Mock-Pathfinder
    (Mocked Pathfinder)
    [Not supported by viewer]
    Central-Event-Processor
    (CEP)
    [Not supported by viewer]
    Email-Notifier
    (Handler - Email)
    [Not supported by viewer]
    Central-Services
    (Handler - Admin)
    [Not supported by viewer]
    Moja-Hub
    (Future - Operational Web Interface)
    [Not supported by viewer]
    Interop-Switch
    (To be Retired - Transfers, Quotes, Parties, Participants)
    [Not supported by viewer]
    Circle-CI
    (Test, Build, Deploy)
    [Not supported by viewer]
    Docker Hub
    (Container Repository)
    [Not supported by viewer]
    NPM Org
    (NPM Repository)
    [Not supported by viewer]
    GitBooks
    (Documetation)
    [Not supported by viewer]
    \ No newline at end of file diff --git a/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI6.svg b/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI6.svg new file mode 100644 index 000000000..9697dfc5b --- /dev/null +++ b/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI6.svg @@ -0,0 +1,3 @@ + + +
    Operational Monitoring
    <b>Operational Monitoring</b>
    Quality Assurance
    <b>Quality Assurance</b>
    Core
    <b>Core</b>
    API - Security / Policy / Ingress / Egress
    <b>API - Security / Policy / Ingress / Egress</b>
    Continuous Integration & Delivery
    <b>Continuous Integration & Delivery</b>
    Container Management & Orchestration
    <b>Container Management & Orchestration</b>
    Persistence
    <b>Persistence</b>
    Scaffolding
    [Not supported by viewer]
    Helm
    (Package Manager for K8s, Templatized Deployments and Configuration)
    [Not supported by viewer]
    Kubernetes
    (Abstraction layer for Infrastructure, Infrastructure as a Policy, Container Orchestration)
    [Not supported by viewer]
    Docker
    (Container Engine)
    [Not supported by viewer]
    Infrastructure
    (AWS, Azure, On-Prem)
    [Not supported by viewer]
    EFK - ElasticSearch / Fluentd / Kabana
    (Log Search / Collection / Monitoring / PoC - Tracing)
    [Not supported by viewer]
    Promfana - Prometheus / Grafana
    (Log Search / Collection / Monitoring)
    [Not supported by viewer]
    Open Tracing
    (POC - Distributed Tracing)
    [Not supported by viewer]
    Rancher
    (Infrastructure Management)
    [Not supported by viewer]
    PostgreSQL
    (Deprecated - Data)
    [Not supported by viewer]
    MongoDB
    (CEP - Data)
    [Not supported by viewer]
    MySQL
    (Percona - Data)
    [Not supported by viewer]
    Kafka
    (Message - Streaming)
    [Not supported by viewer]
    Mojaloop API Adapter
    (API - Transfers)
    [Not supported by viewer]
    Mojaloop API Adapter
    (Handler - Notifications)
    [Not supported by viewer]
    Central-Services
    (API - Operational Admin)
    [Not supported by viewer]
    Central-Services
    (Handler - Prepare)
    [Not supported by viewer]
    Central-Services
    (Handler - Position)
    [Not supported by viewer]
    Central-Services
    (Handler - Fulfil)
    [Not supported by viewer]
    Central-Services
    (Handler - Get Transfers)
    [Not supported by viewer]
    Central-Services
    (Handler - Timeout)
    [Not supported by viewer]
    Event-Logging-Sidecar
    (POC - Logs, Error, Audits, Tracing)
    [Not supported by viewer]
    Central-KMS
    (Key Management Store)
    [Not supported by viewer]
    ALS - Account-Lookup-Service
    (API - Parties, Participant)
    [Not supported by viewer]
    ALS-Oracle-Pathfinder-Service
    (Future - MSISDN Lookup)
    [Not supported by viewer]
    Quoting-Service
    (API - Quotes)
    [Not supported by viewer]
    Central-Event-Processor
    (CEP, POCLogs, Error, Audits, Tracing)
    [Not supported by viewer]
    Email-Notifier
    (Handler - Email)
    [Not supported by viewer]
    Central-Services
    (Handler - Admin)
    [Not supported by viewer]
    Moja-Hub
    (Future - Operational UI)
    [Not supported by viewer]
    Circle-CI
    (Test, Build, Deploy)
    [Not supported by viewer]
    Docker Hub
    (Container Repository)
    [Not supported by viewer]
    NPM Org
    (NPM Repository)
    [Not supported by viewer]
    GitBooks
    (Documetation)
    [Not supported by viewer]
    API Gateway
    (POC - API - Parties, Participants, Quotes, Transfers, Bulk Transfers)
    <b>API Gateway<br></b>(<b><font color="#ff1b0a">POC</font></b> - API - Parties, Participants, Quotes, Transfers, Bulk Transfers)<br>
    Central-Services
    (Handler - Bulk Prepare)
    [Not supported by viewer]
    Central-Services
    (Handler - Bulk Fulfil)
    [Not supported by viewer]
    Central-Services
    (Handler - Bulk Process)
    [Not supported by viewer]
    Mojaloop API Adapter
    (API - Bulk Transfers)
    [Not supported by viewer]
    Forensic-Logging-Sidecar
    (Deprecated - Auditing)
    [Not supported by viewer]
    Simulator
    (API - FSP Simulator /
    API - Oracle Simulator)

    [Not supported by viewer]
    Central-Settlements
    (API - Settlement)
    [Not supported by viewer]
    On-boarding
    (Postman - Scripts)
    [Not supported by viewer]
    Functional Tests
    (Postman - Scripts)
    [Not supported by viewer]
    \ No newline at end of file diff --git a/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI7.svg b/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI7.svg new file mode 100644 index 000000000..2fedecbc1 --- /dev/null +++ b/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI7.svg @@ -0,0 +1,3 @@ + + +
    Operational Monitoring
    <b>Operational Monitoring</b>
    Quality Assurance
    <b>Quality Assurance</b>
    Core Components
    <b>Core Components</b>
    API - Security / Policy / Ingress / Egress
    <b>API - Security / Policy / Ingress / Egress</b>
    Continuous Integration & Delivery
    <b>Continuous Integration & Delivery</b>
    Container Management & Orchestration
    <b>Container Management & Orchestration</b>
    Supporting Components
    <b style="line-height: 0%">Supporting Components</b>
    Helm
    (Package Manager for K8s, Templatized Deployments and Configuration)
    [Not supported by viewer]
    Kubernetes
    (Abstraction layer for Infrastructure, Infrastructure as a Policy, Container Orchestration)
    [Not supported by viewer]
    Docker
    (Container Engine)
    [Not supported by viewer]
    Infrastructure
    (AWS, Azure, On-Prem)
    [Not supported by viewer]
    EFK - ElasticSearch / Fluentd / Kabana
    (Log Search / Collection / Monitoring / PoC - Tracing)
    [Not supported by viewer]
    Promfana - Prometheus / Grafana
    (Log Search / Collection / Monitoring)
    [Not supported by viewer]
    Open Tracing
    (POC - Distributed Tracing)
    [Not supported by viewer]
    Rancher
    (Infrastructure Management)
    [Not supported by viewer]
    Mojaloop API Adapter
    (API - Transfers)
    [Not supported by viewer]
    Central-Services
    (API - Operational Admin)
    [Not supported by viewer]
    Central-Services
    (Handler - Prepare)
    [Not supported by viewer]
    Central-Services
    (Handler - Position)
    [Not supported by viewer]
    Central-Services
    (Handler - Fulfil)
    [Not supported by viewer]
    Central-Services
    (Handler - Get Transfers)
    [Not supported by viewer]
    Central-Services
    (Handler - Timeout)
    [Not supported by viewer]
    Central-KMS
    (Key Management Store)
    [Not supported by viewer]
    ALS - Account-Lookup-Service
    (API - Parties, Participant)
    [Not supported by viewer]
    ALS-Oracle-Pathfinder-Service
    (Future - MSISDN Lookup)
    [Not supported by viewer]
    Central-Event-Processor
    (CEP)
    [Not supported by viewer]
    Email-Notifier
    (Handler - Email)
    [Not supported by viewer]
    Central-Services
    (Handler - Admin)
    [Not supported by viewer]
    Circle-CI
    (Test, Build, Deploy)
    [Not supported by viewer]
    Docker Hub
    (Container Repository)
    [Not supported by viewer]
    NPM Org
    (NPM Repository)
    [Not supported by viewer]
    GitBooks
    (Documetation)
    [Not supported by viewer]
    API Gateway
    (POC - API - Parties, Participants, Quotes, Transfers, Bulk Transfers)
    <b>API Gateway<br></b>(<b><font color="#ff1b0a">POC</font></b> - API - Parties, Participants, Quotes, Transfers, Bulk Transfers)<br>
    Central-Services
    (Handler - Bulk Prepare)
    [Not supported by viewer]
    Central-Services
    (Handler - Bulk Fulfil)
    [Not supported by viewer]
    Central-Services
    (Handler - Bulk Process)
    [Not supported by viewer]
    Mojaloop API Adapter
    (API - Bulk Transfers)
    [Not supported by viewer]
    Forensic-Logging
    (Future - Auditing)
    [Not supported by viewer]
    Central-Settlements
    (API - Settlement)
    [Not supported by viewer]
    Event-Stream-Processor
    Logs, Error, Audits, Tracing)
    [Not supported by viewer]
    Simulator
    (API - FSP & Oracle Simulator)
    [Not supported by viewer]
    On-boarding
    (Postman - Scripts)
    [Not supported by viewer]
    Functional Tests
    (Postman - Scripts)
    [Not supported by viewer]
    Mojaloop-Simulator
    (SDK)
    [Not supported by viewer]
    License & Audit
    (Dependencies)
    [Not supported by viewer]
    Persistence
    <b>Persistence</b>
    PostgreSQL
    (Deprecated - Data)
    [Not supported by viewer]
    MongoDB
    (CEP - Data)
    [Not supported by viewer]
    MySQL
    (Percona - Data)
    [Not supported by viewer]
    Kafka
    (Message - Streaming)
    [Not supported by viewer]
    Transaction Request Service
    (API - Transaction)
    <b>Transaction Request Service</b><br>(API - Transaction)
    Software Dev Kits
    <b>Software Dev Kits</b>
    Oracle SDK
    (Participant Store)
    [Not supported by viewer]
    Mojaloop SDK 
    (FSP Payer/Payee)
    [Not supported by viewer]
    Event SDK
    (Audit, Log, Trace - Client/Server)
    [Not supported by viewer]
    Event-Sidecar
    (Logs, Error, Audits, Tracing)
    <b>Event-Sidecar</b><br>(Logs, Error, Audits, Tracing)
    Mojaloop API Adapter
    (Handler - Notifications)
    [Not supported by viewer]
    Quoting-Service
    (API - Quotes)
    [Not supported by viewer]
    \ No newline at end of file diff --git a/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI8.svg b/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI8.svg new file mode 100644 index 000000000..3e5b75f13 --- /dev/null +++ b/docs/fr/technical/technical/overview/assets/diagrams/architecture/Arch-Mojaloop-overview-PI8.svg @@ -0,0 +1,3 @@ + + +
    Operational Monitoring
    Operational Monitoring
    Quality Assurance
    Quality Assurance
    Core Components
    Core Components
    API - Security / Policy / Ingress / Egress
    API - Security / Policy / Ingress / Egress
    Continuous Integration & Delivery
    Continuous Integration & Delivery
    Container Management & Orchestration
    Container Management & Orchestration
    Supporting Components
    Supporting Components
    Helm
    (Package Manager for K8s, Templatized Deployments and Configuration)
    Helm...
    Kubernetes
    (Abstraction layer for Infrastructure, Infrastructure as a Policy, Container Orchestration)
    Kubernetes...
    Docker
    (Container Engine)
    Docker...
    Infrastructure
    (AWS, Azure, On-Prem)
    Infrastructure...
    EFK - ElasticSearch / Fluentd / Kibana
    (Log Search / Collection / Monitoring / Tracing)
    EFK - ElasticSearch / Fluentd / Kibana...
    Promfana - Prometheus / Grafana
    (Log Search / Collection / Monitoring)
    Promfana - Prometheus / Grafana...
    Open Tracing
    (Distributed Tracing)
    Open Tracing...
    Rancher
    (Infrastructure Management)
    Rancher...
    Mojaloop API Adapter
    (API - Transfers)
    Mojaloop API Adapter...
    Central-Services
    (API - Operational Admin)
    Central-Services...
    Central-Services
    (Handler - Prepare)
    Central-Services...
    Central-Services
    (Handler - Position)
    Central-Services...
    Central-Services
    (Handler - Fulfil)
    Central-Services...
    Central-Services
    (Handler - Get Transfers)
    Central-Services...
    Central-Services
    (Handler - Timeout)
    Central-Services...
    Central-KMS
    (Future - Key Management Store)
    Central-KMS...
    ALS - Account-Lookup-Service
    (API - Parties, Participant)
    ALS - Account-Lookup-Service...
    ALS-Oracle-Pathfinder
    (MSISDN Lookup)
    ALS-Oracle-Pathfinder...
    Central-Event-Processor
    (CEP)
    Central-Event-Processor...
    Email-Notifier
    (Handler - Email)
    Email-Notifier...
    Central-Services
    (Handler - Admin)
    Central-Services...
    Circle-CI
    (Test, Build, Deploy)
    Circle-CI...
    Docker Hub
    (Container Repository)
    Docker Hub...
    NPM Org
    (NPM Repository)
    NPM Org...
    GitBooks
    (Documetation)
    GitBooks...
    API Gateway
    (Future - API - Parties, Participants, Quotes, Transfers, Bulk Transfers)
    API Gateway...
    Central-Services
    (Handler - Bulk Prepare)
    Central-Services...
    Central-Services
    (Handler - Bulk Fulfil)
    Central-Services...
    Central-Services
    (Handler - Bulk Process)
    Central-Services...
    Mojaloop API Adapter
    (API - Bulk Transfers)
    Mojaloop API Adapter...
    Forensic-Logging
    (Future - Auditing)
    Forensic-Logging...
    Central-Settlements
    (API - Settlement)
    Central-Settlements...
    Event-Stream-Processor
    Logs, Error, Audits, Tracing)
    Event-Stream-Processor...
    Simulators
    (API, SDK, FSP & Oracle)
    Simulators...
    On-boarding
    (Postman - Scripts)
    On-boarding...
    Functional Tests
    (Postman - Scripts)
    Functional Tests...
    Self Testing Toolkit
    (
    POC UI)
    Self Testing Toolkit...
    License, Security & Audit
    (Dependencies)
    License, Security & Audit...
    Persistence
    Persistence
    Redis
    (SDK - Cache)
    Redis...
    MongoDB
    (CEP - Data)
    MongoDB...
    MySQL
    (Percona - Data)
    MySQL...
    Kafka
    (Message - Streaming)
    Kafka...
    Transaction Request Service
    (API - Transaction)
    Transaction Request Service...
    Software Dev Kits
    Software Dev Kits
    Oracle SDK
    (Participant Store)
    Oracle SDK...
    Mojaloop SDK 
    (FSP Payer/Payee)
    Mojaloop SDK...
    Event SDK
    (Audit, Log, Trace - Client/Server)
    Event SDK...
    Event-Sidecar
    (Logs, Error, Audits, Tracing)
    Event-Sidecar...
    Mojaloop API Adapter
    (Handler - Notifications)
    Mojaloop API Adapter...
    Quoting-Service
    (API - Quotes)
    Quoting-Service...
    Finance-Portal-UI
    (API - Bulk Transfers)
    Finance-Portal-UI...
    Settlement-Management
    (Closing, Recon report, Cronjob)
    Settlement-Management...
    Schema-Adapter
    (SDK - Parties, Participants, Quotes, Transfers)
    Schema-Adapter...
    IaC (Infra as Code) Tools
    (Future - Automated
    Prov / Depl / Upgrades)
    IaC (Infra as Code) Tools...
    \ No newline at end of file diff --git a/docs/fr/technical/technical/overview/components-PI11.md b/docs/fr/technical/technical/overview/components-PI11.md new file mode 100644 index 000000000..36631f461 --- /dev/null +++ b/docs/fr/technical/technical/overview/components-PI11.md @@ -0,0 +1,7 @@ +# Composants actuels du Hub Mojaloop — PI11 + +Le schéma de composants suivant présente la décomposition des services Mojaloop et leur architecture microservices pour PI11 : + +![Vue d’ensemble de l’architecture Mojaloop PI11](./assets/diagrams/architecture/Arch-Mojaloop-overview-PI11.svg) + +_Note : le code couleur indique les relations entre le stockage de données, la messagerie en flux et les interconnexions d’adaptateurs. Par exemple, les `Central-Services` utilisent `MySQL` comme base de données et s’appuient sur `Kafka` pour la messagerie._ diff --git a/docs/fr/technical/technical/overview/components-PI12.md b/docs/fr/technical/technical/overview/components-PI12.md new file mode 100644 index 000000000..6b7c4c7b6 --- /dev/null +++ b/docs/fr/technical/technical/overview/components-PI12.md @@ -0,0 +1,7 @@ +# Composants actuels du Hub Mojaloop — PI12 + +Le schéma de composants suivant présente la décomposition des services Mojaloop et leur architecture microservices pour PI12 : + +![Vue d’ensemble de l’architecture Mojaloop PI12](./assets/diagrams/architecture/Arch-Mojaloop-overview-PI12.svg) + +_Note : le code couleur indique les relations entre le stockage de données, la messagerie en flux et les interconnexions d’adaptateurs. Par exemple, les `Central-Services` utilisent `MySQL` comme base de données et s’appuient sur `Kafka` pour la messagerie._ diff --git a/docs/fr/technical/technical/overview/components-PI14.md b/docs/fr/technical/technical/overview/components-PI14.md new file mode 100644 index 000000000..65c360580 --- /dev/null +++ b/docs/fr/technical/technical/overview/components-PI14.md @@ -0,0 +1,7 @@ +# Composants actuels du Hub Mojaloop — PI14 + +Le schéma de composants suivant présente la décomposition des services Mojaloop et leur architecture microservices pour PI14 : + +![Vue d’ensemble de l’architecture Mojaloop PI14](./assets/diagrams/architecture/Arch-Mojaloop-overview-PI14.svg) + +_Note : le code couleur indique les relations entre le stockage de données, la messagerie en flux et les interconnexions d’adaptateurs. Par exemple, les `Central-Services` utilisent `MySQL` comme base de données et s’appuient sur `Kafka` pour la messagerie._ diff --git a/docs/fr/technical/technical/overview/components-PI18.md b/docs/fr/technical/technical/overview/components-PI18.md new file mode 100644 index 000000000..2994a62b7 --- /dev/null +++ b/docs/fr/technical/technical/overview/components-PI18.md @@ -0,0 +1,7 @@ +# Composants actuels du Hub Mojaloop — PI18 + +Le schéma de composants suivant présente la décomposition des services Mojaloop et leur architecture microservices pour PI18 : + +![Vue d’ensemble de l’architecture Mojaloop PI18](./assets/diagrams/architecture/Arch-Mojaloop-overview-PI18.svg) + +_Note : le code couleur indique les relations entre le stockage de données, la messagerie en flux et les interconnexions d’adaptateurs. Par exemple, les `Central-Services` utilisent `MySQL` comme base de données et s’appuient sur `Kafka` pour la messagerie._ diff --git a/docs/fr/technical/technical/overview/components-PI3.md b/docs/fr/technical/technical/overview/components-PI3.md new file mode 100644 index 000000000..bce02cad4 --- /dev/null +++ b/docs/fr/technical/technical/overview/components-PI3.md @@ -0,0 +1,7 @@ +# Composants hérités du Hub Mojaloop — PI3 + +Le schéma de composants suivant présente la décomposition des services Mojaloop et leur architecture microservices pour PI3 : + +![Vue d’ensemble de l’architecture Mojaloop PI3](./assets/diagrams/architecture/Arch-Mojaloop-overview-PI3.svg) + +_Note : le code couleur indique les relations entre le stockage de données, la messagerie en flux et les interconnexions d’adaptateurs. Par exemple, les `Central-Services` utilisent `MySQL` comme base de données et s’appuient sur `Kafka` pour la messagerie._ diff --git a/docs/fr/technical/technical/overview/components-PI5.md b/docs/fr/technical/technical/overview/components-PI5.md new file mode 100644 index 000000000..8153d99b0 --- /dev/null +++ b/docs/fr/technical/technical/overview/components-PI5.md @@ -0,0 +1,7 @@ +# Composants hérités du Hub Mojaloop — PI5 + +Le schéma de composants suivant présente la décomposition des services Mojaloop et leur architecture microservices pour PI5 : + +![Vue d’ensemble de l’architecture Mojaloop PI5](./assets/diagrams/architecture/Arch-Mojaloop-overview-PI5.svg) + +_Note : le code couleur indique les relations entre le stockage de données, la messagerie en flux et les interconnexions d’adaptateurs. Par exemple, les `Central-Services` utilisent `MySQL` comme base de données et s’appuient sur `Kafka` pour la messagerie._ diff --git a/docs/fr/technical/technical/overview/components-PI6.md b/docs/fr/technical/technical/overview/components-PI6.md new file mode 100644 index 000000000..b26d72117 --- /dev/null +++ b/docs/fr/technical/technical/overview/components-PI6.md @@ -0,0 +1,7 @@ +# Composants hérités du Hub Mojaloop — PI6 + +Le schéma de composants suivant présente la décomposition des services Mojaloop et leur architecture microservices pour PI6 : + +![Vue d’ensemble de l’architecture Mojaloop PI6](./assets/diagrams/architecture/Arch-Mojaloop-overview-PI6.svg) + +_Note : le code couleur indique les relations entre le stockage de données, la messagerie en flux et les interconnexions d’adaptateurs. Par exemple, les `Central-Services` utilisent `MySQL` comme base de données et s’appuient sur `Kafka` pour la messagerie._ diff --git a/docs/fr/technical/technical/overview/components-PI7.md b/docs/fr/technical/technical/overview/components-PI7.md new file mode 100644 index 000000000..406de5983 --- /dev/null +++ b/docs/fr/technical/technical/overview/components-PI7.md @@ -0,0 +1,7 @@ +# Composants hérités du Hub Mojaloop — PI7 + +Le schéma de composants suivant présente la décomposition des services Mojaloop et leur architecture microservices pour PI7 : + +![Vue d’ensemble de l’architecture Mojaloop PI7](./assets/diagrams/architecture/Arch-Mojaloop-overview-PI7.svg) + +_Note : le code couleur indique les relations entre le stockage de données, la messagerie en flux et les interconnexions d’adaptateurs. Par exemple, les `Central-Services` utilisent `MySQL` comme base de données et s’appuient sur `Kafka` pour la messagerie._ diff --git a/docs/fr/technical/technical/overview/components-PI8.md b/docs/fr/technical/technical/overview/components-PI8.md new file mode 100644 index 000000000..8cde7bc06 --- /dev/null +++ b/docs/fr/technical/technical/overview/components-PI8.md @@ -0,0 +1,7 @@ +# Composants hérités du Hub Mojaloop — PI8 + +Le schéma de composants suivant présente la décomposition des services Mojaloop et leur architecture microservices pour PI8 : + +![Vue d’ensemble de l’architecture Mojaloop PI8](./assets/diagrams/architecture/Arch-Mojaloop-overview-PI8.svg) + +_Note : le code couleur indique les relations entre le stockage de données, la messagerie en flux et les interconnexions d’adaptateurs. Par exemple, les `Central-Services` utilisent `MySQL` comme base de données et s’appuient sur `Kafka` pour la messagerie._ diff --git a/docs/fr/technical/technical/quoting-service/README.md b/docs/fr/technical/technical/quoting-service/README.md new file mode 100644 index 000000000..72efc4999 --- /dev/null +++ b/docs/fr/technical/technical/quoting-service/README.md @@ -0,0 +1,23 @@ +--- +version: 1.1 +--- + +# Vue d’ensemble du service de cotation + +Le **Quoting Service** (**QS**) — *(voir la section `5.1`)* de la [spécification Mojaloop {{ $page.frontmatter.version }}](/api) — prend en charge la phase de cotation des différents cas d’usage. + +_Note : outre les cotations individuelles, le service de cotation prend aussi en charge les cotations groupées (*bulk quotes*)._ + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-quotes-1.0.0.svg) + +## Cotations individuelles + +- [GET — obtenir une cotation par identifiant](qs-get-quotes.md) +- [POST — demande de cotation](qs-post-quotes.md) + +## Cotations groupées (*bulk*) + +- [GET — obtenir une cotation groupée par identifiant](qs-get-bulk-quotes.md) +- [POST — demande de cotation groupée](qs-post-bulk-quotes.md) diff --git a/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-get-bulk-quotes-2.1.0.plantuml b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-get-bulk-quotes-2.1.0.plantuml new file mode 100644 index 000000000..fe55e6771 --- /dev/null +++ b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-get-bulk-quotes-2.1.0.plantuml @@ -0,0 +1,92 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Sam Kummary + -------------- +******'/ + +@startuml +Title Obtenir les informations d’une cotation groupée +participant "FSP payeur" as PayerFSP +participant "Switch\n[Service de cotation]" as Switch +participant "FSP bénéficiaire" as PayeeFSP + +autonumber +note right of PayerFSP: Le FSP payeur demande le détail d’une cotation groupée\nau FSP bénéficiaire via le Switch +PayerFSP -\ Switch: GET /bulkQuotes/{ID} +note right of Switch #aaa + Valider la requête selon la + spécification d’interface Mojaloop + **Codes d’erreur : 300x, 310x** + **Codes HTTP d’erreur : 4xx** +end note +Switch -> Switch: Validation de schéma +PayerFSP \-- Switch: 202 Accepted +Switch -> Switch: Récupérer le point de terminaison « bulk quotes » du FSP bénéficiaire +alt point de terminaison « bulk quotes » du FSP bénéficiaire trouvé + note right of Switch: Le Switch transmet la requête au FSP bénéficiaire (mode pass-through) + Switch -\ PayeeFSP: GET /bulkQuotes/{ID} + PayeeFSP --/ Switch: 202 Accepted + PayeeFSP -> PayeeFSP: Le FSP bénéficiaire récupère la cotation groupée + alt le FSP bénéficiaire récupère la cotation avec succès + note left of PayeeFSP: Le FSP bénéficiaire répond à la demande de cotation + PayeeFSP -\ Switch: PUT /quotes/{ID} + note right of Switch #aaa + Valider la requête selon la + spécification d’interface Mojaloop + **Codes d’erreur : 300x, 310x** + **Codes HTTP d’erreur : 4xx** + end note + Switch --/ PayeeFSP: 200 Ok + alt réponse valide + Switch -> Switch: Récupérer le point de terminaison « bulk quotes » du FSP payeur + alt point de terminaison de callback « bulk quotes » trouvé + note left of Switch: Le Switch transmet la réponse de cotation groupée au FSP payeur + Switch -\ PayerFSP: PUT /bulkQuotes/{ID} + PayerFSP --/ Switch: 200 Ok + else point de terminaison de callback « bulk quotes » introuvable + note right of Switch: Le Switch renvoie une erreur au FSP bénéficiaire + Switch -\ PayeeFSP: PUT /bulkQuotes/{ID}/error + PayeeFSP --/ Switch : 200 Ok + end + else réponse invalide + note right of Switch: Le Switch renvoie une erreur au FSP bénéficiaire + Switch -\ PayeeFSP: PUT /bulkQuotes/{ID}/error + PayeeFSP --/ Switch : 200 Ok + note over Switch, PayeeFSP #ec7063: Dans ce scénario, le FSP payeur\npeut ne pas recevoir de réponse + end + + else bulkQuote introuvable + note left of PayeeFSP: Le FSP bénéficiaire renvoie une erreur au Switch\n **Code d’erreur : 3205** + PayeeFSP -\ Switch: PUT /bulkQuotes/{ID}/error + Switch --/ PayeeFSP: 200 OK + note left of Switch: Le Switch renvoie une erreur au FSP payeur\n **Code d’erreur : 3205** + Switch -\ PayerFSP: PUT /bulkQuotes/{ID}/error + PayerFSP --/ Switch: 200 OK + end +else point de terminaison « bulk quotes » du FSP bénéficiaire introuvable + note left of Switch + Le Switch renvoie une erreur au FSP payeur + **Code d’erreur : 3201** + end note + PayerFSP /- Switch: PUT /bulkQuotes/{ID}/error + PayerFSP --/ Switch: 200 OK +end +@enduml diff --git a/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-get-bulk-quotes-2.1.0.svg b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-get-bulk-quotes-2.1.0.svg new file mode 100644 index 000000000..5f9802c59 --- /dev/null +++ b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-get-bulk-quotes-2.1.0.svg @@ -0,0 +1,197 @@ + + Obtenir les informations d’une cotation groupée + + + Obtenir les informations d’une cotation groupée + + + + + + + + + FSP payeur + + FSP payeur + + Switch + [Service de cotation] + + Switch + [Service de cotation] + + FSP bénéficiaire + + FSP bénéficiaire + + + Le FSP payeur demande le détail d’une cotation groupée + au FSP bénéficiaire via le Switch + + + 1 + GET /bulkQuotes/{ID} + + + Valider la requête selon la + spécification d’interface Mojaloop + Codes d’erreur : 300x, 310x + Codes HTTP d’erreur : 4xx + + + + + 2 + Validation de schéma + + + 3 + 202 Accepted + + + + + 4 + Récupérer le point de terminaison « bulk quotes » du FSP bénéficiaire + + + alt + [point de terminaison « bulk quotes » du FSP bénéficiaire trouvé] + + + Le Switch transmet la requête au FSP bénéficiaire (mode pass-through) + + + 5 + GET /bulkQuotes/{ID} + + + 6 + 202 Accepted + + + + + 7 + Le FSP bénéficiaire récupère la cotation groupée + + + alt + [le FSP bénéficiaire récupère la cotation avec succès] + + + Le FSP bénéficiaire répond à la demande de cotation + + + 8 + PUT /quotes/{ID} + + + Valider la requête selon la + spécification d’interface Mojaloop + Codes d’erreur : 300x, 310x + Codes HTTP d’erreur : 4xx + + + 9 + 200 Ok + + + alt + [réponse valide] + + + + + 10 + Récupérer le point de terminaison « bulk quotes » du FSP payeur + + + alt + [point de terminaison de callback « bulk quotes » trouvé] + + + Le Switch transmet la réponse de cotation groupée au FSP payeur + + + 11 + PUT /bulkQuotes/{ID} + + + 12 + 200 Ok + + [point de terminaison de callback « bulk quotes » introuvable] + + + Le Switch renvoie une erreur au FSP bénéficiaire + + + 13 + PUT /bulkQuotes/{ID}/error + + + 14 + 200 Ok + + [réponse invalide] + + + Le Switch renvoie une erreur au FSP bénéficiaire + + + 15 + PUT /bulkQuotes/{ID}/error + + + 16 + 200 Ok + + + Dans ce scénario, le FSP payeur + peut ne pas recevoir de réponse + + [bulkQuote introuvable] + + + Le FSP bénéficiaire renvoie une erreur au Switch +   + Code d’erreur : 3205 + + + 17 + PUT /bulkQuotes/{ID}/error + + + 18 + 200 OK + + + Le Switch renvoie une erreur au FSP payeur +   + Code d’erreur : 3205 + + + 19 + PUT /bulkQuotes/{ID}/error + + + 20 + 200 OK + + [point de terminaison « bulk quotes » du FSP bénéficiaire introuvable] + + + Le Switch renvoie une erreur au FSP payeur + Code d’erreur : 3201 + + + 21 + PUT /bulkQuotes/{ID}/error + + + 22 + 200 OK + + diff --git a/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-get-quotes-1.1.0.plantuml b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-get-quotes-1.1.0.plantuml new file mode 100644 index 000000000..958042e0e --- /dev/null +++ b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-get-quotes-1.1.0.plantuml @@ -0,0 +1,86 @@ +@startuml +Title Obtenir les informations d’une cotation +participant "FSP payeur" as PayerFSP +participant "Switch\n[Service de\ncotation]" as Switch +database "Référentiel central" as DB +participant "FSP bénéficiaire" as PayeeFSP +autonumber +note right of PayerFSP: Le FSP payeur demande le détail d’une cotation\nau FSP bénéficiaire via le Switch +PayerFSP -\ Switch: GET /quotes/{ID} +note right of Switch #aaa + Valider la requête selon la + spécification d’interface Mojaloop + **Codes d’erreur : 300x, 310x** + **Codes HTTP d’erreur : 4xx** +end note +Switch -> Switch: Validation de schéma +PayerFSP \-- Switch: 202 Accepted +Switch -> Switch: Récupérer le point de terminaison « quotes » du FSP bénéficiaire +alt point de terminaison « quotes » du FSP bénéficiaire trouvé + note right of Switch: Le Switch transmet la requête au FSP bénéficiaire (mode pass-through)\n + Switch -\ PayeeFSP: GET /quotes/{ID} + PayeeFSP --/ Switch: 202 Accepted + PayeeFSP -> PayeeFSP: Le FSP bénéficiaire récupère la cotation + alt le FSP bénéficiaire récupère la cotation avec succès + note left of PayeeFSP: Le FSP bénéficiaire répond à la demande de cotation + PayeeFSP -\ Switch: PUT /quotes/{ID} + Switch --/ PayeeFSP: 200 Ok + Switch -> Switch: Valider la réponse (schéma, en-têtes (**Code d’erreur : 3100**)) + alt réponse valide + alt SimpleRoutingMode est FALSE + Switch -> Switch: Valider la réponse (contrôle de doublon, scénario renvoi (**Code d’erreur : 3106**)) + alt validation réussie + Switch -\ DB: Persister la réponse de cotation + activate DB + hnote over DB + quoteResponse + quoteResponseDuplicateCheck + quoteResponseIlpPacket + quoteExtensions + geoCode + end hnote + Switch \-- DB: Réponse de cotation enregistrée + deactivate DB + end + end + alt SimpleRoutingMode est TRUE + Switch -> Switch: Récupérer le point de terminaison « quotes » du FSP payeur + else SimpleRoutingMode est FALSE + Switch -> Switch: Récupérer le point de terminaison « quote party » (PAYER) + end + alt point de terminaison de callback « quotes » trouvé + note left of Switch: Le Switch transmet la réponse au FSP payeur\n + Switch -\ PayerFSP: PUT /quotes/{ID} + PayerFSP --/ Switch: 200 Ok + else point de terminaison de callback « quotes » introuvable + note right of Switch: Le Switch renvoie une erreur au FSP bénéficiaire + Switch -\ PayeeFSP: PUT /quotes/{ID}/error + PayeeFSP --/ Switch : 200 Ok + end + else réponse invalide + note right of Switch: Le Switch renvoie une erreur au FSP bénéficiaire + Switch -\ PayeeFSP: PUT /quotes/{ID}/error + PayeeFSP --/ Switch : 200 Ok + note over Switch, PayeeFSP #ec7063: Dans ce scénario, le FSP payeur\npeut ne pas recevoir de réponse + end + + else cotation introuvable + note left of PayeeFSP: Le FSP bénéficiaire renvoie une erreur au Switch\n **Code d’erreur : 3205** + PayeeFSP -\ Switch: PUT /quotes/{ID}/error + Switch --/ PayeeFSP: 200 OK + alt SimpleRoutingMode est FALSE + Switch -> Switch: Persister les données d’erreur + end + note left of Switch: Le Switch renvoie une erreur au FSP payeur\n **Code d’erreur : 3205** + Switch -\ PayerFSP: PUT /quotes/{ID}/error + PayerFSP --/ Switch: 200 OK + end +else point de terminaison « quotes » du FSP bénéficiaire introuvable + note left of Switch + Le Switch renvoie une erreur au FSP payeur + **Code d’erreur : 3201** + end note + PayerFSP /- Switch: PUT /quotes/{ID}/error + PayerFSP --/ Switch: 200 OK +end +@enduml diff --git a/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-get-quotes-1.1.0.svg b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-get-quotes-1.1.0.svg new file mode 100644 index 000000000..b5e70bd10 --- /dev/null +++ b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-get-quotes-1.1.0.svg @@ -0,0 +1,268 @@ + + Obtenir les informations d’une cotation + + + Obtenir les informations d’une cotation + + + + + + + + + + + + + + + FSP payeur + + FSP payeur + + Switch + [Service de + cotation] + + Switch + [Service de + cotation] + Référentiel central + + + Référentiel central + + + + FSP bénéficiaire + + FSP bénéficiaire + + + + Le FSP payeur demande le détail d’une cotation + au FSP bénéficiaire via le Switch + + + 1 + GET /quotes/{ID} + + + Valider la requête selon la + spécification d’interface Mojaloop + Codes d’erreur : 300x, 310x + Codes HTTP d’erreur : 4xx + + + + + 2 + Validation de schéma + + + 3 + 202 Accepted + + + + + 4 + Récupérer le point de terminaison « quotes » du FSP bénéficiaire + + + alt + [point de terminaison « quotes » du FSP bénéficiaire trouvé] + + + Le Switch transmet la requête au FSP bénéficiaire (mode pass-through) + <Règles côté payeur> + + + 5 + GET /quotes/{ID} + + + 6 + 202 Accepted + + + + + 7 + Le FSP bénéficiaire récupère la cotation + + + alt + [le FSP bénéficiaire récupère la cotation avec succès] + + + Le FSP bénéficiaire répond à la demande de cotation + + + 8 + PUT /quotes/{ID} + + + 9 + 200 Ok + + + + + 10 + Valider la réponse (schéma, en-têtes ( + Code d’erreur : 3100 + )) + + + alt + [réponse valide] + + + alt + [SimpleRoutingMode est FALSE] + + + + + 11 + Valider la réponse (contrôle de doublon, scénario renvoi ( + Code d’erreur : 3106 + )) + + + alt + [validation réussie] + + + 12 + Persister la réponse de cotation + + quoteResponse + quoteResponseDuplicateCheck + quoteResponseIlpPacket + quoteExtensions + geoCode + + + 13 + Réponse de cotation enregistrée + + + alt + [SimpleRoutingMode est TRUE] + + + + + 14 + Récupérer le point de terminaison « quotes » du FSP payeur + + [SimpleRoutingMode est FALSE] + + + + + 15 + Récupérer le point de terminaison « quote party » (PAYER) + + + alt + [point de terminaison de callback « quotes » trouvé] + + + Le Switch transmet la réponse au FSP payeur + <Règle bénéficiaire — requête complète> + + + 16 + PUT /quotes/{ID} + + + 17 + 200 Ok + + [point de terminaison de callback « quotes » introuvable] + + + Le Switch renvoie une erreur au FSP bénéficiaire + + + 18 + PUT /quotes/{ID}/error + + + 19 + 200 Ok + + [réponse invalide] + + + Le Switch renvoie une erreur au FSP bénéficiaire + + + 20 + PUT /quotes/{ID}/error + + + 21 + 200 Ok + + + Dans ce scénario, le FSP payeur + peut ne pas recevoir de réponse + + [cotation introuvable] + + + Le FSP bénéficiaire renvoie une erreur au Switch +   + Code d’erreur : 3205 + + + 22 + PUT /quotes/{ID}/error + + + 23 + 200 OK + + + alt + [SimpleRoutingMode est FALSE] + + + + + 24 + Persister les données d’erreur + + + Le Switch renvoie une erreur au FSP payeur +   + Code d’erreur : 3205 + + + 25 + PUT /quotes/{ID}/error + + + 26 + 200 OK + + [point de terminaison « quotes » du FSP bénéficiaire introuvable] + + + Le Switch renvoie une erreur au FSP payeur + Code d’erreur : 3201 + + + 27 + PUT /quotes/{ID}/error + + + 28 + 200 OK + + diff --git a/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-post-bulk-quotes-2.2.0.plantuml b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-post-bulk-quotes-2.2.0.plantuml new file mode 100644 index 000000000..c1d00651a --- /dev/null +++ b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-post-bulk-quotes-2.2.0.plantuml @@ -0,0 +1,99 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Sam Kummary + -------------- +******'/ + +@startuml +Title Demander la création d’une cotation groupée +participant "FSP payeur" as PayerFSP +participant "Switch\n[Service de cotation]" as Switch +participant "FSP bénéficiaire" as PayeeFSP +autonumber + +note over PayerFSP, Switch: Le FSP payeur envoie une demande de cotation groupée\nau FSP bénéficiaire via le Switch +PayerFSP -\ Switch: POST /bulkQuotes +note right of Switch #aaa + Valider la requête selon la + spécification d’interface Mojaloop + **Codes d’erreur : 300x, 310x** + **Codes HTTP d’erreur : 4xx** +end note +Switch -> Switch: Validation de schéma +PayerFSP \-- Switch: 202 Accepted +||| +Switch -> Switch: Validation de la demande de cotation groupée (moteur de règles, etc.) +||| +Switch -> Switch: Contrôle de doublon +||| +alt la requête est un doublon mais pas un renvoi +||| + note left of Switch + Le Switch renvoie une erreur au FSP payeur + **Code d’erreur : 3106** + end note + PayerFSP /- Switch: PUT /bulkQuotes/{ID}/error + PayerFSP --/ Switch: 200 OK +||| +else la requête est un doublon et un renvoi + Switch -> Switch: Le Switch gère le scénario de renvoi +end +||| +Switch -> Switch: Utiliser l’en-tête fspiop-destination pour obtenir\nle point de terminaison « bulk quotes » du DFSP bénéficiaire +alt point de terminaison « bulk quotes » du bénéficiaire trouvé + note right of Switch: Le Switch transmet la demande de cotation groupée au FSP bénéficiaire + Switch -\ PayeeFSP: POST /bulkQuotes + Switch \-- PayeeFSP: 202 OK + + PayeeFSP -> PayeeFSP: Le FSP bénéficiaire calcule les cotations individuelles\net répond avec un résultat de cotation groupée + alt traitement bulkQuotes réussi côté bénéficiaire + note over PayeeFSP, Switch: Le FSP bénéficiaire envoie la réponse au FSP payeur via le Switch + Switch /- PayeeFSP: PUT /bulkQuotes/{ID} + Switch --/ PayeeFSP: 200 OK + + Switch -> Switch: Valider la réponse de cotation groupée + Switch -> Switch: Contrôle de doublon + alt la réponse est un doublon mais pas un renvoi + Switch -\ PayeeFSP: PUT /bulkQuotes/{ID}/error + Switch \-- PayeeFSP: 200 OK + end + alt la réponse est un doublon et un renvoi + Switch -> Switch: Le Switch gère le scénario de renvoi + end + + note left of Switch: Le Switch transmet la réponse au FSP payeur + PayerFSP /- Switch: PUT /bulkQuotes/{ID} + PayerFSP --/ Switch: 200 OK + else le bénéficiaire rejette la cotation groupée ou rencontre une erreur + note left of PayeeFSP: Le FSP bénéficiaire envoie un callback d’erreur au FSP payeur via le Switch + Switch /- PayeeFSP: PUT /bulkQuotes/{ID}/error + Switch --/ PayeeFSP: 200 OK + note left of Switch: Le Switch transmet le callback d’erreur au FSP payeur + PayerFSP /- Switch: PUT /bulkQuotes/{ID}/error + PayerFSP --/ Switch: 200 OK + end +else point de terminaison « quotes » du FSP bénéficiaire introuvable + note left of Switch: Le Switch envoie un callback d’erreur au FSP payeur \n **Code d’erreur : 3201** + PayerFSP /- Switch: PUT /bulkQuotes/{ID}/error + PayerFSP --\ Switch: 200 OK +end + +@enduml diff --git a/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-post-bulk-quotes-2.2.0.svg b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-post-bulk-quotes-2.2.0.svg new file mode 100644 index 000000000..484cc86ce --- /dev/null +++ b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-post-bulk-quotes-2.2.0.svg @@ -0,0 +1,217 @@ + + Demander la création d’une cotation groupée + + + Demander la création d’une cotation groupée + + + + + + + + + + FSP payeur + + FSP payeur + + Switch + [Service de cotation] + + Switch + [Service de cotation] + + FSP bénéficiaire + + FSP bénéficiaire + + + Le FSP payeur envoie une demande de cotation groupée + au FSP bénéficiaire via le Switch + + + 1 + POST /bulkQuotes + + + Valider la requête selon la + spécification d’interface Mojaloop + Codes d’erreur : 300x, 310x + Codes HTTP d’erreur : 4xx + + + + + 2 + Validation de schéma + + + 3 + 202 Accepted + + + + + 4 + Validation de la demande de cotation groupée (moteur de règles, etc.) + + + + + 5 + Contrôle de doublon + + + alt + [la requête est un doublon mais pas un renvoi] + + + Le Switch renvoie une erreur au FSP payeur + Code d’erreur : 3106 + + + 6 + PUT /bulkQuotes/{ID}/error + + + 7 + 200 OK + + [la requête est un doublon et un renvoi] + + + + + 8 + Le Switch gère le scénario de renvoi + + + + + 9 + Utiliser l’en-tête fspiop-destination pour obtenir + le point de terminaison « bulk quotes » du DFSP bénéficiaire + + + alt + [point de terminaison « bulk quotes » du bénéficiaire trouvé] + + + Le Switch transmet la demande de cotation groupée au FSP bénéficiaire + + + 10 + POST /bulkQuotes + + + 11 + 202 OK + + + + + 12 + Le FSP bénéficiaire calcule les cotations individuelles + et répond avec un résultat de cotation groupée + + + alt + [traitement bulkQuotes réussi côté bénéficiaire] + + + Le FSP bénéficiaire envoie la réponse au FSP payeur via le Switch + + + 13 + PUT /bulkQuotes/{ID} + + + 14 + 200 OK + + + + + 15 + Valider la réponse de cotation groupée + + + + + 16 + Contrôle de doublon + + + alt + [la réponse est un doublon mais pas un renvoi] + + + 17 + PUT /bulkQuotes/{ID}/error + + + 18 + 200 OK + + + alt + [la réponse est un doublon et un renvoi] + + + + + 19 + Le Switch gère le scénario de renvoi + + + Le Switch transmet la réponse au FSP payeur + + + 20 + PUT /bulkQuotes/{ID} + + + 21 + 200 OK + + [le bénéficiaire rejette la cotation groupée ou rencontre une erreur] + + + Le FSP bénéficiaire envoie un callback d’erreur au FSP payeur via le Switch + + + 22 + PUT /bulkQuotes/{ID}/error + + + 23 + 200 OK + + + Le Switch transmet le callback d’erreur au FSP payeur + + + 24 + PUT /bulkQuotes/{ID}/error + + + 25 + 200 OK + + [point de terminaison « quotes » du FSP bénéficiaire introuvable] + + + Le Switch envoie un callback d’erreur au FSP payeur +   + Code d’erreur : 3201 + + + 26 + PUT /bulkQuotes/{ID}/error + + + 27 + 200 OK + + diff --git a/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-post-quotes-1.2.0.plantuml b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-post-quotes-1.2.0.plantuml new file mode 100644 index 000000000..6ea5a5833 --- /dev/null +++ b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-post-quotes-1.2.0.plantuml @@ -0,0 +1,117 @@ +@startuml +Title Demander la création d’une cotation +participant "FSP payeur" as PayerFSP +participant "Switch\n[Service de\ncotation]" as Switch +database "Référentiel central" as DB +participant "FSP bénéficiaire" as PayeeFSP +autonumber + +note over PayerFSP, Switch: Le FSP payeur envoie une demande de cotation\nau FSP bénéficiaire via le Switch +PayerFSP -\ Switch: POST /quotes +note right of Switch #aaa + Valider la requête selon la + spécification d’interface Mojaloop + **Codes d’erreur : 300x, 310x** + **Codes HTTP d’erreur : 4xx** +end note +Switch -> Switch: Validation de schéma +PayerFSP \-- Switch: 202 Accepted +||| +Switch -> Switch: Validation de la demande de cotation (moteur de règles, etc.) +||| +alt SimpleRoutingMode === FALSE + Switch -> Switch: Contrôle de doublon + ||| + alt la requête est un doublon mais pas un renvoi + ||| + note left of Switch + Le Switch renvoie une erreur au FSP payeur + **Code d’erreur : 3106** + end note + PayerFSP /- Switch: PUT /quotes/{ID}/error + PayerFSP --/ Switch: 200 OK + ||| + else la requête est un doublon et un renvoi + Switch -> Switch: Le Switch gère le scénario de renvoi + end + ||| + Switch -\ DB: Persister la demande de cotation + activate DB + hnote over DB + quoteDuplicateCheck + transactionReference + quote + quoteParty + quoteExtension + geoCode + end hnote + Switch \-- DB: Demande de cotation enregistrée + deactivate DB +end +||| +alt SimpleRoutingMode === TRUE + Switch -> Switch: Utiliser l’en-tête fspiop-destination pour obtenir le point de terminaison « quotes » du FSP bénéficiaire +else SimpleRoutingMode === FALSE + Switch -> Switch: Récupérer le point de terminaison du FSP bénéficiaire via les informations « quote party » +end +||| +alt point de terminaison « quotes » du bénéficiaire trouvé + note right of Switch: Le Switch transmet la demande au FSP bénéficiaire + Switch -\ PayeeFSP: POST /quotes + Switch \-- PayeeFSP: 202 OK + + PayeeFSP -> PayeeFSP: Le FSP bénéficiaire persiste et calcule la cotation + alt traitement de la cotation réussi côté bénéficiaire + note left of PayeeFSP: Le FSP bénéficiaire envoie la réponse au FSP payeur via le Switch + Switch /- PayeeFSP: PUT /quotes/{ID} + Switch --/ PayeeFSP: 200 OK + + Switch -> Switch: Valider la réponse de cotation + alt SimpleRoutingMode === FALSE + Switch -> Switch: Contrôle de doublon + alt la réponse est un doublon mais pas un renvoi + Switch -\ PayeeFSP: PUT /quotes/{ID}/error + Switch \-- PayeeFSP: 200 OK + end + alt la réponse est un doublon et un renvoi + Switch -> Switch: Le Switch gère le scénario de renvoi + end + Switch -\ DB: Persister la réponse de cotation + activate DB + hnote over DB + quoteResponse + quoteDuplicateCheck + quoteResponseIlpPacket + geoCode + quoteExtension + end hnote + Switch \-- DB: Réponse de cotation enregistrée + deactivate DB + end + note left of Switch: Le Switch transmet la réponse au FSP payeur + PayerFSP /- Switch: PUT /quotes/{ID} + PayerFSP --/ Switch: 200 OK + else le bénéficiaire rejette ou rencontre une erreur + note left of PayeeFSP: Le FSP bénéficiaire envoie un callback d’erreur au FSP payeur via le Switch + Switch /- PayeeFSP: PUT /quotes/{ID}/error + Switch --/ PayeeFSP: 200 OK + alt SimpleRoutingMode === FALSE + Switch -\ DB: Enregistrer l’erreur de cotation + activate DB + hnote over DB + quoteError + end hnote + Switch \-- DB: Erreur de cotation enregistrée + deactivate DB + end + note left of Switch: Le Switch transmet le callback d’erreur au FSP payeur + PayerFSP /- Switch: PUT /quotes/{ID}/error + PayerFSP --/ Switch: 200 OK + end +else point de terminaison « quotes » du FSP bénéficiaire introuvable + note left of Switch: Le Switch envoie un callback d’erreur au FSP payeur \n **Code d’erreur : 3201** + PayerFSP /- Switch: PUT /quotes/{ID}/error + PayerFSP --\ Switch: 200 OK +end + +@enduml diff --git a/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-post-quotes-1.2.0.svg b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-post-quotes-1.2.0.svg new file mode 100644 index 000000000..87785e2e2 --- /dev/null +++ b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-post-quotes-1.2.0.svg @@ -0,0 +1,297 @@ + + Demander la création d’une cotation + + + Demander la création d’une cotation + + + + + + + + + + + + + + + + + + FSP payeur + + FSP payeur + + Switch + [Service de + cotation] + + Switch + [Service de + cotation] + Référentiel central + + + Référentiel central + + + + FSP bénéficiaire + + FSP bénéficiaire + + + + + + Le FSP payeur envoie une demande de cotation + au FSP bénéficiaire via le Switch + + + 1 + POST /quotes + + + Valider la requête selon la + spécification d’interface Mojaloop + Codes d’erreur : 300x, 310x + Codes HTTP d’erreur : 4xx + + + + + 2 + Validation de schéma + + + 3 + 202 Accepted + + + + + 4 + Validation de la demande de cotation (moteur de règles, etc.) + + + alt + [SimpleRoutingMode === FALSE] + + + + + 5 + Contrôle de doublon + + + alt + [la requête est un doublon mais pas un renvoi] + + + Le Switch renvoie une erreur au FSP payeur + Code d’erreur : 3106 + + + 6 + PUT /quotes/{ID}/error + + + 7 + 200 OK + + [la requête est un doublon et un renvoi] + + + + + 8 + Le Switch gère le scénario de renvoi + + + 9 + Persister la demande de cotation + + quoteDuplicateCheck + transactionReference + quote + quoteParty + quoteExtension + geoCode + + + 10 + Demande de cotation enregistrée + + + alt + [SimpleRoutingMode === TRUE] + + + + + 11 + Utiliser l’en-tête fspiop-destination pour obtenir le point de terminaison « quotes » du FSP bénéficiaire + + [SimpleRoutingMode === FALSE] + + + + + 12 + Récupérer le point de terminaison du FSP bénéficiaire via les informations « quote party » + + + alt + [point de terminaison « quotes » du bénéficiaire trouvé] + + + Le Switch transmet la demande au FSP bénéficiaire + + + 13 + POST /quotes + + + 14 + 202 OK + + + + + 15 + Le FSP bénéficiaire persiste et calcule la cotation + + + alt + [traitement de la cotation réussi côté bénéficiaire] + + + Le FSP bénéficiaire envoie la réponse au FSP payeur via le Switch + + + 16 + PUT /quotes/{ID} + + + 17 + 200 OK + + + + + 18 + Valider la réponse de cotation + + + alt + [SimpleRoutingMode === FALSE] + + + + + 19 + Contrôle de doublon + + + alt + [la réponse est un doublon mais pas un renvoi] + + + 20 + PUT /quotes/{ID}/error + + + 21 + 200 OK + + + alt + [la réponse est un doublon et un renvoi] + + + + + 22 + Le Switch gère le scénario de renvoi + + + 23 + Persister la réponse de cotation + + quoteResponse + quoteDuplicateCheck + quoteResponseIlpPacket + geoCode + quoteExtension + + + 24 + Réponse de cotation enregistrée + + + Le Switch transmet la réponse au FSP payeur + + + 25 + PUT /quotes/{ID} + + + 26 + 200 OK + + [le bénéficiaire rejette ou rencontre une erreur] + + + Le FSP bénéficiaire envoie un callback d’erreur au FSP payeur via le Switch + + + 27 + PUT /quotes/{ID}/error + + + 28 + 200 OK + + + alt + [SimpleRoutingMode === FALSE] + + + 29 + Enregistrer l’erreur de cotation + + quoteError + + + 30 + Erreur de cotation enregistrée + + + Le Switch transmet le callback d’erreur au FSP payeur + + + 31 + PUT /quotes/{ID}/error + + + 32 + 200 OK + + [point de terminaison « quotes » du FSP bénéficiaire introuvable] + + + Le Switch envoie un callback d’erreur au FSP payeur +   + Code d’erreur : 3201 + + + 33 + PUT /quotes/{ID}/error + + + 34 + 200 OK + + diff --git a/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-quotes-1.0.0.plantuml b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-quotes-1.0.0.plantuml new file mode 100644 index 000000000..d0bdf3d8d --- /dev/null +++ b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-quotes-1.0.0.plantuml @@ -0,0 +1,68 @@ +@startuml +Title Séquences du service de cotation +participant "DFSP payeur" +participant "Switch\nService de\ncotation" as Switch +participant "DFSP bénéficiaire" + +autonumber +note over "DFSP payeur", Switch: Le DFSP payeur demande une cotation au DFSP bénéficiaire +"DFSP payeur" -\ Switch: POST /quotes +Switch --/ "DFSP payeur": 202 Accepted +Switch -> Switch: Valider la demande de cotation + +alt cotation valide + + Switch -> Switch: Persister les données de cotation + note over Switch, "DFSP bénéficiaire": Le Switch transmet la demande au DFSP bénéficiaire\n + Switch -\ "DFSP bénéficiaire": POST /quotes + "DFSP bénéficiaire" --/ Switch: 202 Accepted + "DFSP bénéficiaire" -> "DFSP bénéficiaire": Calculer frais et commissions + + alt le DFSP bénéficiaire calcule la cotation avec succès + + note over "DFSP bénéficiaire", Switch: Le DFSP bénéficiaire répond à la demande de cotation + "DFSP bénéficiaire" -\ Switch: PUT /quotes/{ID} + Switch --/ "DFSP bénéficiaire": 200 Ok + + Switch -> Switch: Valider la réponse de cotation + + alt réponse valide + + Switch -> Switch: Persister les données de réponse + + note over Switch, "DFSP payeur": Le Switch transmet la réponse au DFSP payeur\n + + Switch -\ "DFSP payeur": PUT /quotes/{ID} + "DFSP payeur" --/ Switch: 200 Ok + + note over "DFSP payeur" #3498db: Le DFSP payeur poursuit\nle transfert si la cotation\nest acceptable… + else réponse invalide + + note over Switch, "DFSP bénéficiaire": Le Switch renvoie une erreur au DFSP bénéficiaire + + Switch -\ "DFSP bénéficiaire": PUT /quotes/{ID}/error + "DFSP bénéficiaire" --/ Switch : 200 Ok + + note over Switch, "DFSP bénéficiaire" #ec7063: Dans ce scénario, le DFSP payeur\npeut ne pas recevoir de réponse + + end + else échec du calcul ou rejet par le DFSP bénéficiaire + + note over "DFSP bénéficiaire", Switch: Le DFSP bénéficiaire renvoie une erreur au Switch + + "DFSP bénéficiaire" -\ Switch: PUT /quotes/{ID}/error + Switch --/ "DFSP bénéficiaire": 200 OK + Switch -> Switch: Persister les données d’erreur + + note over "DFSP payeur", Switch: Le Switch renvoie une erreur au DFSP payeur + + Switch -\ "DFSP payeur": PUT /quotes/{ID}/error + "DFSP payeur" --/ Switch: 200 OK + + end +else cotation invalide + note over "DFSP payeur", Switch: Le Switch renvoie une erreur au DFSP payeur + Switch -\ "DFSP payeur": PUT /quotes/{ID}/error + "DFSP payeur" --/ Switch: 200 OK +end +@enduml diff --git a/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-quotes-1.0.0.svg b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-quotes-1.0.0.svg new file mode 100644 index 000000000..4fb3f5eeb --- /dev/null +++ b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-quotes-1.0.0.svg @@ -0,0 +1,182 @@ + + Séquences du service de cotation + + + Séquences du service de cotation + + + + + + + + DFSP payeur + + DFSP payeur + + Switch + Service de + cotation + + Switch + Service de + cotation + + DFSP bénéficiaire + + DFSP bénéficiaire + + + Le DFSP payeur demande une cotation au DFSP bénéficiaire + + + 1 + POST /quotes + + + 2 + 202 Accepted + + + + + 3 + Valider la demande de cotation + + + alt + [cotation valide] + + + + + 4 + Persister les données de cotation + + + Le Switch transmet la demande au DFSP bénéficiaire + <Règles côté payeur> + + + 5 + POST /quotes + + + 6 + 202 Accepted + + + + + 7 + Calculer frais et commissions + + + alt + [le DFSP bénéficiaire calcule la cotation avec succès] + + + Le DFSP bénéficiaire répond à la demande de cotation + + + 8 + PUT /quotes/{ID} + + + 9 + 200 Ok + + + + + 10 + Valider la réponse de cotation + + + alt + [réponse valide] + + + + + 11 + Persister les données de réponse + + + Le Switch transmet la réponse au DFSP payeur + <Règle bénéficiaire — requête complète> + + + 12 + PUT /quotes/{ID} + + + 13 + 200 Ok + + + Le DFSP payeur poursuit + le transfert si la cotation + est acceptable… + + [réponse invalide] + + + Le Switch renvoie une erreur au DFSP bénéficiaire + + + 14 + PUT /quotes/{ID}/error + + + 15 + 200 Ok + + + Dans ce scénario, le DFSP payeur + peut ne pas recevoir de réponse + + [échec du calcul ou rejet par le DFSP bénéficiaire] + + + Le DFSP bénéficiaire renvoie une erreur au Switch + + + 16 + PUT /quotes/{ID}/error + + + 17 + 200 OK + + + + + 18 + Persister les données d’erreur + + + Le Switch renvoie une erreur au DFSP payeur + + + 19 + PUT /quotes/{ID}/error + + + 20 + 200 OK + + [cotation invalide] + + + Le Switch renvoie une erreur au DFSP payeur + + + 21 + PUT /quotes/{ID}/error + + + 22 + 200 OK + + diff --git a/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-quotes-overview-1.0.0.plantuml b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-quotes-overview-1.0.0.plantuml new file mode 100644 index 000000000..90a298ec0 --- /dev/null +++ b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-quotes-overview-1.0.0.plantuml @@ -0,0 +1,67 @@ +@startuml +Title Séquences du service de cotation +participant "FSP payeur" +participant "Switch\nService de\ncotation" as Switch +participant "FSP bénéficiaire" + +autonumber +note over "FSP payeur", Switch: Le FSP payeur demande une cotation au FSP bénéficiaire +"FSP payeur" -\ Switch: POST /quotes +Switch --/ "FSP payeur": 202 Accepted +Switch -> Switch: Valider la demande de cotation + +alt cotation valide + + Switch -> Switch: Persister les données de cotation + note over Switch, "FSP bénéficiaire": Le Switch transmet la demande au FSP bénéficiaire\n + Switch -\ "FSP bénéficiaire": POST /quotes + "FSP bénéficiaire" --/ Switch: 202 Accepted + "FSP bénéficiaire" -> "FSP bénéficiaire": Calculer frais et commissions + + alt le FSP bénéficiaire calcule la cotation avec succès + + note over "FSP bénéficiaire", Switch: Le FSP bénéficiaire répond à la demande de cotation + "FSP bénéficiaire" -\ Switch: PUT /quotes/{ID} + Switch --/ "FSP bénéficiaire": 200 Ok + + Switch -> Switch: Valider la réponse de cotation + + alt réponse valide + Switch -> Switch: Persister les données de réponse + + note over Switch, "FSP payeur": Le Switch transmet la réponse au FSP payeur\n + + Switch -\ "FSP payeur": PUT /quotes/{ID} + "FSP payeur" --/ Switch: 200 Ok + + note over "FSP payeur" #3498db: Le FSP payeur poursuit\nle transfert si la cotation\nest acceptable… + else réponse invalide + + note over Switch, "FSP bénéficiaire": Le Switch renvoie une erreur au FSP bénéficiaire + + Switch -\ "FSP bénéficiaire": PUT /quotes/{ID}/error + "FSP bénéficiaire" --/ Switch : 200 Ok + + note over Switch, "FSP bénéficiaire" #ec7063: Dans ce scénario, le FSP payeur\npeut ne pas recevoir de réponse + + end + else échec du calcul ou rejet par le FSP bénéficiaire + + note over "FSP bénéficiaire", Switch: Le FSP bénéficiaire renvoie une erreur au Switch + + "FSP bénéficiaire" -\ Switch: PUT /quotes/{ID}/error + Switch --/ "FSP bénéficiaire": 200 OK + Switch -> Switch: Persister les données d’erreur + + note over "FSP payeur", Switch: Le Switch renvoie une erreur au FSP payeur + + Switch -\ "FSP payeur": PUT /quotes/{ID}/error + "FSP payeur" --/ Switch: 200 OK + + end +else cotation invalide + note over "FSP payeur", Switch: Le Switch renvoie une erreur au FSP payeur + Switch -\ "FSP payeur": PUT /quotes/{ID}/error + "FSP payeur" --/ Switch: 200 OK +end +@enduml diff --git a/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-quotes-overview-1.0.0.svg b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-quotes-overview-1.0.0.svg new file mode 100644 index 000000000..5a13011ab --- /dev/null +++ b/docs/fr/technical/technical/quoting-service/assets/diagrams/sequence/seq-quotes-overview-1.0.0.svg @@ -0,0 +1,182 @@ + + Séquences du service de cotation + + + Séquences du service de cotation + + + + + + + + FSP payeur + + FSP payeur + + Switch + Service de + cotation + + Switch + Service de + cotation + + FSP bénéficiaire + + FSP bénéficiaire + + + Le FSP payeur demande une cotation au FSP bénéficiaire + + + 1 + POST /quotes + + + 2 + 202 Accepted + + + + + 3 + Valider la demande de cotation + + + alt + [cotation valide] + + + + + 4 + Persister les données de cotation + + + Le Switch transmet la demande au FSP bénéficiaire + <Règles côté payeur> + + + 5 + POST /quotes + + + 6 + 202 Accepted + + + + + 7 + Calculer frais et commissions + + + alt + [le FSP bénéficiaire calcule la cotation avec succès] + + + Le FSP bénéficiaire répond à la demande de cotation + + + 8 + PUT /quotes/{ID} + + + 9 + 200 Ok + + + + + 10 + Valider la réponse de cotation + + + alt + [réponse valide] + + + + + 11 + Persister les données de réponse + + + Le Switch transmet la réponse au FSP payeur + <Règle bénéficiaire — requête complète> + + + 12 + PUT /quotes/{ID} + + + 13 + 200 Ok + + + Le FSP payeur poursuit + le transfert si la cotation + est acceptable… + + [réponse invalide] + + + Le Switch renvoie une erreur au FSP bénéficiaire + + + 14 + PUT /quotes/{ID}/error + + + 15 + 200 Ok + + + Dans ce scénario, le FSP payeur + peut ne pas recevoir de réponse + + [échec du calcul ou rejet par le FSP bénéficiaire] + + + Le FSP bénéficiaire renvoie une erreur au Switch + + + 16 + PUT /quotes/{ID}/error + + + 17 + 200 OK + + + + + 18 + Persister les données d’erreur + + + Le Switch renvoie une erreur au FSP payeur + + + 19 + PUT /quotes/{ID}/error + + + 20 + 200 OK + + [cotation invalide] + + + Le Switch renvoie une erreur au FSP payeur + + + 21 + PUT /quotes/{ID}/error + + + 22 + 200 OK + + diff --git a/docs/fr/technical/technical/quoting-service/qs-get-bulk-quotes.md b/docs/fr/technical/technical/quoting-service/qs-get-bulk-quotes.md new file mode 100644 index 000000000..47a006b53 --- /dev/null +++ b/docs/fr/technical/technical/quoting-service/qs-get-bulk-quotes.md @@ -0,0 +1,7 @@ +# GET — obtenir une cotation groupée par identifiant + +Conception de la récupération d’une cotation groupée (*bulk quote*) par un FSP. + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-get-bulk-quotes-2.1.0.svg) diff --git a/docs/fr/technical/technical/quoting-service/qs-get-quotes.md b/docs/fr/technical/technical/quoting-service/qs-get-quotes.md new file mode 100644 index 000000000..6d60563cc --- /dev/null +++ b/docs/fr/technical/technical/quoting-service/qs-get-quotes.md @@ -0,0 +1,7 @@ +# GET — obtenir une cotation par identifiant + +Conception de la récupération d’une cotation par un FSP. + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-get-quotes-1.1.0.svg) diff --git a/docs/fr/technical/technical/quoting-service/qs-post-bulk-quotes.md b/docs/fr/technical/technical/quoting-service/qs-post-bulk-quotes.md new file mode 100644 index 000000000..9760af3df --- /dev/null +++ b/docs/fr/technical/technical/quoting-service/qs-post-bulk-quotes.md @@ -0,0 +1,7 @@ +# POST — demande de cotation groupée + +Conception d’une demande de cotation groupée émise par un FSP. + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-post-bulk-quotes-2.2.0.svg) diff --git a/docs/fr/technical/technical/quoting-service/qs-post-quotes.md b/docs/fr/technical/technical/quoting-service/qs-post-quotes.md new file mode 100644 index 000000000..0118b67d7 --- /dev/null +++ b/docs/fr/technical/technical/quoting-service/qs-post-quotes.md @@ -0,0 +1,7 @@ +# POST — demande de cotation + +Conception d’une demande de cotation émise par un FSP. + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-post-quotes-1.2.0.svg) diff --git a/docs/fr/technical/technical/releases.md b/docs/fr/technical/technical/releases.md new file mode 100644 index 000000000..5b95ad116 --- /dev/null +++ b/docs/fr/technical/technical/releases.md @@ -0,0 +1,194 @@ +# Processus de publication Mojaloop + +Le processus de publication de Mojaloop suit une approche menée par la communauté, en particulier par les workstreams techniques, en collaboration et consultation avec le Conseil Produit et l’Autorité de Conception (DA). + +La DA définit les politiques, lignes directrices et critères techniques pour les releases (tels que les métriques de qualité), tandis que le Produit définit les exigences fonctionnelles et celles liées au produit, lorsque cela s'applique. Cela est mis en œuvre par le(s) workstream(s) concerné(s). + +## 1. Processus de publication Mojaloop +![YM8f9iPhGU1jAfr-dQUk4e34QMGPG1ZWnbmC4ERGpsqp70GJH2he2Nje4poq_dii642B82j-Cj-2-HuYTkEF4poIBg8rJSfWYagBVOMyt6PQs5_P2YRE9magU_jE](https://github.com/mojaloop/design-authority-project/assets/10507686/075e528c-d4b2-4100-a2b9-6d06d77155d0) + +Événement communautaire (planification au niveau PI), workstreams, fonctionnalités, qualité de la release, tests, checklist, release candidate, exemple d’epic, publication + +Le processus de release Mojaloop suit une : +- démarche menée par la communauté +- menée précisément par les workstreams techniques +- en collaboration et consultation avec le Conseil Produit +- et l’Autorité de Conception (DA) + +Critères, directives : +La DA définit les politiques, lignes directrices et critères techniques pour les releases tandis que le Produit spécifie les exigences fonctionnelles et produit. +Exemple de notes de version et critères de la v17.0.0, [v17.0.0](https://github.com/mojaloop/helm/releases/tag/v17.0.0) + +Les tests continuent après la sortie de la release : des tâches planifiées (cron jobs) journalières continuent à tourner jusqu'à la publication suivante, afin d'assurer la stabilité. + +**Tâches actuelles et critères d'acceptation pour les releases Mojaloop (helm) :** + +Exemple de story : [3122](https://github.com/mojaloop/project/issues/3122) , [3847](https://github.com/mojaloop/project/issues/3847) + +Les décisions concernant les fonctionnalités à inclure, celles jugées prêtes et retenues, ne sont pas listées ici car elles interviennent en phases de planification (et selon les livrables attendus) + +- [x] S’assurer que tous les services cœur et les services inclus dans la release respectent les standards concernant : + - [x] Alertes Dependabot + - [x] Fichiers de licence + - [x] Entêtes de licence dans les sources + - [x] Alertes Snyk + - [x] Fichiers codeowners + - [x] Règles de protection des branches principales vérifiées + - [x] Revue des issues ouvertes + - [x] Revue des pull requests ouvertes + - [x] Revue des exceptions d’audit fournies et clarification / réduction de la liste +- [x] Mise à jour des manifests pour le workflow Github "Release Pull Request (PR)" +- [x] Valider le PR de release ainsi que le processus associé +- [x] Déployer les valeurs par défaut avec le RC dans l'environnement AWS moja* + - [x] Valider que la collection GP passe à 100 % + - [x] Valider que les tests FX et inter-schéma fonctionnent à 100 % +- [x] Déployer et valider le RC sur un second environnement + - [x] Valider que la collection GP passe à 100 % + - [x] Valider que les tests FX et inter-schéma fonctionnent à 100 % +- [x] Identifier les problèmes éventuels avec les scripts QA ; les corriger et re-tester +- [x] QA pour bugs, régressions, les consigner +- [x] Corriger les bugs remontés si critique +- [x] Valider avec la collection GP de TTK +- [x] Tester l’option de configuration "on-us" (changement en déploiement) et vérifier que les tests on-us passent +- [x] Publication du dépôt de scénarios de tests TTK +- [x] Notes de version pour le RC Helm rédigées + - [x] Guide de migration depuis une version publiée (peut nécessiter une story séparée si suffisamment important / complexe) +- [x] Mise à jour des notes de version avec le lien du guide de stratégie de mise à jour +- [x] Release Helm publiée +- [x] Déploiement du Helm publié sur un environnement de dev + - [x] Release Helm déployée sur dev avec succès + - [x] Tests de régression sur dev avec collections TTK + - [x] Collection GP + - [x] Collection Core Bulk + - [x] Collection Third-party + - [x] Collection SDK Bulk + - [x] Collection SDK R2P + - [x] Tests mode ISO 20022 + - [x] Collection (ou tests) FX + - [x] Collection tests inter-schéma + - [x] Validation avec les tests de régression "Golden Path" de CGS + - [x] Test de la capacité de mise à jour depuis la version précédente (v16.0.4 / v16.0.0) +- [x] Déploiement du Helm publié sur un environnement QA + - [x] Release Helm déployée sur QA avec succès + - [x] Validation avec tests de régression "Golden Path" sur QA + - [x] Collection GP + - [x] Collection Core Bulk + - [x] Collection Third-party + - [x] Collection SDK Bulk + - [x] Collection SDK R2P + - [x] Collection FX (ou tests) + - [x] Tests mode ISO 20022 + - [x] Collection tests inter-schéma +- [x] Valider les cronJobs quotidiens de GP sur dev/qa et les scripts de nettoyage +- Valider la capacité à réaliser une mise à niveau depuis la version stable précédente, et en profiter pour identifier tout "piège" à gérer dans la release ou dans la documentation de mise à niveau (à la charge de la personne qui effectue la montée de version). + + +## 2. Processus de publication Mojaloop – évolutions proposées : + +Proposer un calendrier de release et des échéances + +1. Exemple : le gel des fonctionnalités pour une release majeure doit précéder d'au moins six semaines le prochain kick-off PI (ou événement communautaire) +1. Le gel des corrections de bugs (non critiques) doit intervenir quatre semaines avant la date de publication +1. Le RC doit être validé par au moins un intégrateur / utilisateur aval : Mini-loop, IaC, Core-test-harness ou un autre +1. La release peut être publiée dans les temps si aucun bug majeur ou moyen n'est ouvert dans le RC et si les validations sont faites sur un environnement de dev et par une équipe downstream +1. Harmoniser la numérotation des versions entre les différents composants de la plateforme Mojaloop, tel que le Finance Portal +1. Inclure des mesures de performance et des détails sur l'environnement de référence utilisé pour ces mesures +1. Ressources : capturer l'empreinte ressources d'une publication de base +1. Documenter les mécanismes de support pour les releases Mojaloop + +## 3. Contenu de la release Helm Mojaloop + +Services Mojaloop prenant en charge les fonctionnalités cœur de la plateforme ainsi que d'autres services clés, sans oublier les outils nécessaires aux tests comme les simulateurs + +Fonctionnalité principale avec options de configuration : +1. Recherche de comptes (Account Lookup) + - Admin de recherche de comptes + - Oracles + - ALS (Account Lookup Service) +2. Cote (Quoting) + - Prise en charge des modes persistant/passe-plat (paramétrable) +3. Transferts (Clearing) + - Prise en charge des transferts on-us (paramétrable) +4. Règlement (Settlement) + - Support de plusieurs types, granularités, fréquences +5. Requêtes de transaction (fonctionnalité Request-to-pay) +6. Services 3PPI (Interface Fournisseur Tier-Parti) +7. Couche API — pour parties, cotations, transferts et requêtes de transaction +8. Notifications + - ML-API-Adapter +9. Conversion de devises +10. Fonctionnalités étendues + - Central Event Processor + - Email Notifier (avant la version 15) + - Suivi et surveillance (Traceability & Monitoring) + - Instrumentation +11. Audit + - Capacités d’audit étendues +12. Services de support & outils pour tests + - ML TTK (Testing Toolkit) + - ML Simulator + - SDK-Scheme-Adapters + - Instances Payment Manager +13. Adapteurs de schéma tiers + - Intégration avec des schémas tiers +14. Gestion du cycle de vie des participants + - Création de participants + - Mise à jour de participants +15. Support aux participants + - Outils simples d'utilisation pour les adoptants (Exemple : [SDK-Scheme-Adapter](https://github.com/mojaloop/sdk-scheme-adapter), [Integration Toolkit](https://github.com/mojaloop/integration-toolkit/tree/main)) + - Fonctionnalités et support d'intégration + +## 4. Plateforme Mojaloop +1. Release principale Mojaloop (helm) et configuration avec : + - Moteur de compensation cœur incluant le support du Bulk + - Quoting + - Recherche de comptes et ses composants associés + - Moteur de règlement + - Couche API + - Support pour request-to-pay (requêtes de transaction) + - Gestion du cycle de vie des participants + - Réf : Release Helm Mojaloop (exemple : v15.1.0) +2. Fonctionnalité PISP / 3PPI +3. Gateway(s) API + - Assurer une couche API sécurisée + - Fournir entrée, sortie (Ingress/Egress), filtrage IP, pare-feux + - Support des mécanismes de sécurité : JWS, mTLS + - Référence : WSO2 +4. Composants de sécurité : + - HSM si utilisé/requis + - Gestion des identités & accès + - Gestion des certificats + - Gestion des connexions +5. Portail Finance, Reporting + - Portails pour les équipes d’Ops Hub, Ops métier + - Portails et capacités pour équipes techniques d’Ops + - Réf : FP v3 basé sur le Business Operations Framework +6. Support de monitoring : + - Support opérationnel et traçabilité (ex : EFK, Prometheus, Grafana, Loki) + - IaC utilise Grafana, Prometheus et Loki +7. Utiliser IaC comme référence, exemple : https://github.com/mojaloop/iac-modules/releases/tag/v5.7.0 + + + +## Releases actuelles + +> *Remarque : Les versions ci-dessous sont les dernières versions publiées pour chaque artefact de release distinct, à titre de référence. Consultez les notes de version de la release Helm pour savoir quelles versions sont incluses dans la version [Helm Charts Packaged Release](#helm-charts-packaged-releases).* + +* Helm : [![Git Releases](https://img.shields.io/github/release/mojaloop/helm.svg?style=flat)](https://github.com/mojaloop/helm/releases) +* Central-Ledger : [![Git Releases](https://img.shields.io/github/release/mojaloop/central-ledger.svg?style=flat)](https://github.com/mojaloop/central-ledger/releases) +* Ml-API-Adapter : [![Git Releases](https://img.shields.io/github/release/mojaloop/ml-api-adapter.svg?style=flat)](https://github.com/mojaloop/ml-api-adapter/releases) +* Account-Lookup-Service : [![Git Releases](https://img.shields.io/github/release/mojaloop/account-lookup-service.svg?style=flat)](https://github.com/mojaloop/account-lookup-service/releases) +* Quoting-Service : [![Git Releases](https://img.shields.io/github/release/mojaloop/quoting-service.svg?style=flat)](https://github.com/mojaloop/quoting-service/releases) +* Transaction-Request-Service : [![Git Releases](https://img.shields.io/github/release/mojaloop/transaction-requests-service.svg?style=flat)](https://github.com/mojaloop/transaction-requests-service/releases) +* Bulk-API-Adapter : [![Git Releases](https://img.shields.io/github/release/mojaloop/bulk-api-adapter.svg?style=flat)](https://github.com/mojaloop/bulk-api-adapter/releases) +* Central-Settlement : [![Git Releases](https://img.shields.io/github/release/mojaloop/central-settlement.svg?style=flat)](https://github.com/mojaloop/central-settlement/releases) +* Central-Event-Processor : [![Git Releases](https://img.shields.io/github/release/mojaloop/central-event-processor.svg?style=flat)](https://github.com/mojaloop/central-event-processor/releases) +* Email-Notifier : [![Git Releases](https://img.shields.io/github/release/mojaloop/email-notifier.svg?style=flat)](https://github.com/mojaloop/email-notifier/releases) +* SDK-Scheme-Adapter : [![Git Releases](https://img.shields.io/github/release/mojaloop/sdk-scheme-adapter.svg?style=flat)](https://github.com/mojaloop/sdk-scheme-adapter/releases) +* Thirdparty-SDK : [![Git Releases](https://img.shields.io/github/release/mojaloop/thirdparty-sdk.svg?style=flat)](https://github.com/mojaloop/thirdparty-sdk/releases) +* Thirdparty-Api-Svc : [![Git Releases](https://img.shields.io/github/release/mojaloop/thirdparty-api-svc.svg?style=flat)](https://github.com/mojaloop/thirdparty-api-svc/releases) +* Auth-Svc : [![Git Releases](https://img.shields.io/github/release/mojaloop/auth-service.svg?style=flat)](https://github.com/mojaloop/auth-service/releases) +* ML-Testing-Toolkit : [![Git Releases](https://img.shields.io/github/release/mojaloop/ml-testing-toolkit.svg?style=flat)](https://github.com/mojaloop/ml-testing-toolkit/releases) +* ML-Testing-Toolkit-Ui : [![Git Releases](https://img.shields.io/github/release/mojaloop/ml-testing-toolkit-ui.svg?style=flat)](https://github.com/mojaloop/ml-testing-toolkit-ui/releases) + +Pour une liste exhaustive des releases helm, veuillez consulter la [page des releases Helm](https://github.com/mojaloop/helm/releases). diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/BulkEnhancements/Readme.md b/docs/fr/technical/technical/sdk-scheme-adapter/BulkEnhancements/Readme.md new file mode 100644 index 000000000..7b6400604 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/BulkEnhancements/Readme.md @@ -0,0 +1,63 @@ +# Prise en charge des transferts groupés par le SDK — vue d’ensemble + +Ce document décrit les évolutions du SDK Scheme Adapter pour le cas d’usage des transferts groupés. + +## Pourquoi ? — Contourner les limites des *bulk* Mojaloop + +L’implémentation des transferts groupés dans Mojaloop présente les limites suivantes, que cette évolution du SDK vise à atténuer. + +1. Seuls les transferts individuels adressés au même DFSP payeur peuvent figurer dans un appel de cotations groupées ou de transferts groupés. +2. Le nombre de cotations et de transferts individuels par appel `bulkQuotes` / `bulkTransfers` est plafonné à 1000. +3. Pour activer les *bulk*, chaque DFSP bénéficiaire doit intégrer la messagerie groupée — en pratique, tous les DFSP connectés devraient mettre à jour leurs intégrations vers leurs systèmes *core banking*. +4. Il n’existe pas aujourd’hui d’appel de découverte (*discovery*) groupé. + +## Exigences de l’évolution *bulk* du SDK Scheme Adapter + +Les évolutions permettent notamment : + +1. Des transferts sans phase de découverte préalable. +2. Aucune limite stricte sur le nombre de transferts (bornée par l’infrastructure et le réseau, au-delà du plafond ~1k de ML FSPIOP). +3. L’intégration *bulk* côté bénéficiaire devient optionnelle. +4. En option : prise en charge de scénarios tels qu’un appel unique combinant découverte, accord et transfert ; acceptation indépendante des recherches de partie ; acceptation indépendante des cotations ; plafond de frais pour l’acceptation automatique des cotations ; saut de la phase de découverte ; exécution de la seule phase de découverte ; expiration du message groupé ; identifiants de transaction *home* pour le message groupé et pour chaque transfert ; appels API synchrones et asynchrones. + +## Fonctionnalités implémentées + +L’implémentation actuelle ne couvre pas encore toutes les capacités prévues ; les éléments livrés sont opérationnels. D’autres fonctions peuvent être ajoutées selon les priorités produit et communauté (approche MVP agile). + +| Fonctionnalité | Statut d’implémentation | Version | +|---|---|---| +| Mode asynchrone | publié | v14.1.0 RC | +| Mode synchrone | non démarré | | +| Acceptation auto des parties | non démarré | | +| Acceptation auto des cotations (avec plafond de frais) | non démarré | | +| Validation des parties uniquement | non démarré | | +| Ignorer la recherche de partie | non démarré | | +| Expiration du lot | non démarré | | +| SDK bénéficiaire — démultiplexage des cotations groupées | non démarré | | +| SDK bénéficiaire — démultiplexage des transferts groupés | non démarré | | +| Mojaloop — notification *bulk patch* | non démarré | | +| SDK bénéficiaire — démultiplexage *bulk patch* | non démarré | | + +### Diagramme fonctionnel + +![Diagramme fonctionnel](../assets/BulkSDKEnhancements.drawio.svg) + +## Diagramme d’architecture + +L’architecture par *event sourcing* répartit l’implémentation en quatre composants : + +1. **Backend API** : reçoit les appels API, produit les événements de domaine correspondants et, en réaction aux événements, déclenche les *callbacks* API. +2. **Domain Event Handler** : consomme les événements de domaine et produit des événements de commande. +3. **Command Event Handler** : consomme les événements de commande et produit des événements de domaine. +4. **FSPIOP API** : surveille les événements de domaine pour produire les appels FSPIOP, et les *callbacks* API pour produire à nouveau des événements de domaine. + +![Diagramme d’architecture](../assets/BulkSDKEnhancements-Architecture.drawio.svg) + + +## Diagramme de séquence — vue d’ensemble + +Diagramme de séquence décrivant le rôle du SDK Scheme Adapter lors d’un appel groupé, côté DFSP payeur et DFSP bénéficiaire. + +![Vue d’ensemble du diagramme de séquence des transferts groupés](../assets/sequence/SDKBulkSequenceDiagram.svg) + + diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/BulkEnhancements/SDKBulk-API-Design.md b/docs/fr/technical/technical/sdk-scheme-adapter/BulkEnhancements/SDKBulk-API-Design.md new file mode 100644 index 000000000..86c2cc67f --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/BulkEnhancements/SDKBulk-API-Design.md @@ -0,0 +1,161 @@ +# Prise en charge des transferts groupés par le SDK — API + +Les évolutions du SDK Scheme Adapter côté payeur sont exposées dans l’API sous le point de terminaison `BulkTransactions` : + +- **POST** `/bulkTransactions` +- **PUT** `/bulkTransactions` +- **PUT** `/bulkTransactions` (*callback*) + +La définition OpenAPI sortante (*outbound*) se trouve [ici](https://github.com/mojaloop/api-snippets/blob/master/sdk-scheme-adapter/v2_0_0/outbound/openapi.yaml). +La définition OpenAPI entrante (*inbound*) se trouve [ici](https://github.com/mojaloop/api-snippets/blob/master/sdk-scheme-adapter/v2_0_0/inbound/openapi.yaml). + + +## Diagramme de séquence technique + +![Diagramme de séquence technique des transferts groupés](https://raw.githubusercontent.com/mojaloop/sdk-scheme-adapter/master/docs/design-bulk-transfers/assets/api-sequence-diagram.svg) + +## Tableaux d’erreurs pour les transferts groupés + +[Table des codes d’erreur](../assets/sequence/BULK-ERRORCODES.md) + +### Phase de découverte + +Toutes les erreurs rencontrées pendant cette phase sont agrégées dans le *mojaloop-connector*, ajoutées à l’objet `lastError` et renvoyées au FSP payeur avec l’ensemble des transferts réussis ou en échec inclus dans la requête de transfert groupé. + +Le *mojaloop-connector* relaie les erreurs renvoyées par le commutateur. + +``` + "lastError": { + "httpStatusCode": 202, + "mojaloopError": { + "errorInformation": { + "errorCode": "3204", + "errorDescription": "Party not found", + "extensionList": {"extension": [{"key": "string","value": "string"}]} + } + } + } +``` + +**Codes d’erreur — recherche de partie** + +| Description de l’erreur | Code erreur | Code HTTP | Catégorie | +|------------------------------------------------------------------------|-------------|------------------|----------------------------------------------------------| +| Erreur de communication | 1000 | 503 | Erreur technique | +| Erreur de communication vers la destination | 1001 | 503 | Erreur technique | +| Erreur serveur générique | 2000 | 503 | Erreur de traitement | +| Erreur interne du serveur | 2001 | 503 | Erreur de traitement | +| Délai d’attente dépassé lors de la résolution de la partie | 2004 | 503 | Erreur de traitement | +| Erreur de validation générique | 3100 | 400 | Erreur de validation de la requête | +| Partie introuvable | 3204 | 202 | Erreur de traitement | + +### Phase d’accord + +Toutes les erreurs rencontrées pendant cette phase sont agrégées dans le *mojaloop-connector*, ajoutées à l’objet `lastError` et renvoyées au FSP payeur avec l’ensemble des transferts réussis ou en échec inclus dans la requête de transfert groupé. + +Le *mojaloop-connector* relaie les erreurs renvoyées par le commutateur. + +``` + "lastError": { + "httpStatusCode": 202, + "mojaloopError": { + "errorInformation": { + "errorCode": "3204", + "errorDescription": "Party not found", + "extensionList": {"extension": [{"key": "string","value": "string"}]} + } + } + } +``` + +**Codes d’erreur — cotations** + +| Description de l’erreur | Code erreur | Code HTTP | Catégorie | +|------------------------------------------------------------------------|-------------|------------------|----------------------------------------------------------| +| Erreur de communication | 1000 | 503 | Erreur technique | +| Erreur de communication vers la destination | 1001 | 503 | Erreur technique | +| Erreur serveur générique | 2000 | 503 | Erreur technique | +| Erreur interne du serveur | 2001 | 503 | Erreur technique | +| Non implémenté | 2002 | 501 | Erreur de traitement | +| Service actuellement indisponible | 2003 | 503 | Erreur de traitement | +| Délai d’attente du serveur dépassé | 2004 | 503 | Erreur de traitement | +| Serveur occupé | 2005 | 503 | Erreur de traitement | +| Erreur client générique | 3000 | 400 | Erreur de validation de la requête | +| Version demandée inacceptable | 3001 | 406 | Erreur « non acceptable » | +| URI inconnue | 3002 | 404 | Erreur « introuvable » | +| Erreur de validation générique | 3100 | 400 | Erreur de validation de la requête | +| Syntaxe incorrecte | 3101 | 400 | Erreur de validation de la requête | +| Élément obligatoire manquant | 3102 | 400 | Erreur de validation de la requête | +| Trop d’éléments | 3103 | 400 | Erreur de validation de la requête | +| Charge utile trop volumineuse | 3104 | 400 | Erreur de validation de la requête | +| Signature invalide | 3105 | 403 | Erreur « interdit » | +| Erreur FSP destinataire | 3201 | 404 | Erreur « introuvable » | +| Identifiant FSP payeur introuvable | 3202 | 404 | Erreur « introuvable » | +| Identifiant FSP bénéficiaire introuvable | 3203 | 404 | Erreur « introuvable » | +| Identifiant de cotation introuvable | 3205 | 404 | Erreur « introuvable » | +| Identifiant de cotation groupée introuvable | 3209 | 404 | Erreur « introuvable » | +| Erreur d’expiration générique | 3300 | 503 | Erreur de traitement | +| Cotation expirée | 3302 | 503 | Erreur de traitement | +| Erreur payeur générique | 4000 | 400 | Erreur de validation de la requête | +| Rejet payeur générique | 4100 | 403 | Erreur « interdit » | +| Erreur de plafond payeur | 4200 | 400 | Erreur de validation de la requête | +| Erreur d’autorisation payeur | 4300 | 403 | Erreur « interdit » | +| Erreur de blocage payeur générique | 4400 | 403 | Erreur « interdit » | +| Erreur bénéficiaire générique | 5000 | 503 | Erreur de traitement | +| Liquidité insuffisante côté FSP bénéficiaire | 5001 | 503 | Erreur de traitement | +| Rejet bénéficiaire générique | 5100 | 403 | Erreur « interdit » | +| Cotation rejetée par le bénéficiaire | 5101 | 503 | Erreur de traitement | +| Type de transaction non pris en charge par le FSP bénéficiaire | 5102 | 503 | Erreur de traitement | +| Cotation rejetée par le bénéficiaire | 5103 | 503 | Erreur de traitement | +| Devise non prise en charge par le bénéficiaire | 5106 | 503 | Erreur de traitement | +| Erreur de plafond bénéficiaire | 5200 | 503 | Erreur de traitement | +| Erreur d’autorisation bénéficiaire | 5300 | 403 | Erreur « interdit » | +| Erreur de blocage bénéficiaire générique | 5400 | 403 | Erreur « interdit » | + + + +### Phase de transfert + +Toutes les erreurs rencontrées pendant cette phase sont agrégées dans le *mojaloop-connector*, ajoutées à l’objet `lastError` et renvoyées au FSP payeur avec l’ensemble des transferts réussis ou en échec inclus dans la requête de transfert groupé. + +Le *mojaloop-connector* relaie les erreurs renvoyées par le commutateur. + +``` + "lastError": { + "httpStatusCode": 404, + "mojaloopError": { + "errorInformation": { + "errorCode": "3210", + "errorDescription": "Bulk transfer ID not found", + "extensionList": {"extension": [{"key": "string","value": "string"}]} + } + } + } +``` + +**Codes d’erreur — transfert** + +| Description de l’erreur | Code erreur | Code HTTP | Catégorie | +|------------------------------------------------------------------------|-------------|------------------|----------------------------------------------------------| +| Erreur de communication | 1000 | 503 | Erreur technique | +| Erreur de communication vers la destination | 1001 | 503 | Erreur technique | +| Erreur serveur générique | 2000 | 503 | Erreur de traitement | +| Erreur interne du serveur | 2001 | 503 | Erreur de traitement | +| Délai d’attente du serveur dépassé | 2004 | 503 | Erreur de traitement | +| Erreur de validation générique | 3100 | 400 | Erreur de validation de la requête | +| Identifiant de transfert groupé introuvable | 3210 | 404 | Erreur de traitement | +| Erreur d’expiration générique | 3300 | 503 | Erreur de traitement | +| Demande de transaction expirée | 3301 | 503 | Erreur de traitement | +| Transfert expiré | 3303 | 503 | Erreur de traitement | +| Erreur bénéficiaire générique | 5000 | 400 | Erreur de traitement | +| Liquidité insuffisante côté FSP bénéficiaire | 5001 | 400 | Erreur de traitement | +| Rejet bénéficiaire générique | 5100 | 400 | Erreur de traitement | +| Cotation rejetée par le bénéficiaire | 5101 | 400 | Erreur de traitement | +| Type de transaction non pris en charge par le FSP bénéficiaire | 5102 | 400 | Erreur de traitement | +| Cotation rejetée par le FSP bénéficiaire | 5103 | 400 | Erreur de traitement | +| Transaction rejetée par le bénéficiaire | 5104 | 400 | Erreur de traitement | +| Transaction rejetée par le FSP bénéficiaire | 5105 | 400 | Erreur de traitement | +| Devise non prise en charge par le bénéficiaire | 5106 | 400 | Erreur de traitement | +| Erreur de plafond bénéficiaire | 5200 | 400 | Erreur de traitement | +| Erreur d’autorisation bénéficiaire | 5300 | 403 | Erreur de traitement | +| Erreur de blocage bénéficiaire générique | 5400 | 400 | Erreur de traitement | diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/BulkEnhancements/SDKBulk-EventSourcing-Design.md b/docs/fr/technical/technical/sdk-scheme-adapter/BulkEnhancements/SDKBulk-EventSourcing-Design.md new file mode 100644 index 000000000..14f51bb67 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/BulkEnhancements/SDKBulk-EventSourcing-Design.md @@ -0,0 +1,191 @@ +# Prise en charge des transferts groupés par le SDK — conception DDD et *event sourcing* + +## Vue d’ensemble de la conception + +Ce diagramme présente une vue d’ensemble de la conception du SDK. + +![Vue d’ensemble de la conception](../assets/overview-drawio.png) + +Une réponse HTTP 202 lors de la soumission d’une requête asynchrone signifie que le SDK a **accepté** la requête, qu’elle sera traitée et qu’une réponse sera fournie. Compte tenu des délais potentiellement longs pour traiter un grand nombre de paiements groupés de façon asynchrone, une nouvelle approche de conception du SDK était nécessaire pour respecter les attentes liées à la réponse 202. + +## Conception DDD et *event sourcing* + +Un modèle fondé sur le *event sourcing* et le domain‑driven design a été retenu : il répond aux exigences de fiabilité et d’évolutivité tout en s’appuyant sur les bibliothèques et outils construits pour l’architecture Mojaloop vNext. + +## SDK Scheme Adapter DFSP payeur (groupé sortant) + +### Diagramme de séquence *event sourcing* sortant + +![Diagramme de séquence sortant](../assets/sequence/outbound-sequence.svg) + +## SDK Scheme Adapter DFSP bénéficiaire + +### Diagramme de séquence *event sourcing* — cotations groupées entrantes + +![Séquence des cotations groupées entrantes](../assets/sequence/inbound-bulk-quotes-sequence.svg) + +### Diagramme de séquence *event sourcing* — transferts groupés entrants + +![Séquence des transferts groupés entrants](../assets/sequence/inbound-bulk-transfers-sequence.svg) + + +## Mappage des données Redis pour le transfert groupé sortant + +### 1. États (global et par élément) + +#### Commande : +``` +HSET +``` +#### Clé : +``` +outboundBulkTransaction_< bulkTransactionId > +``` + +#### Attributs : +- **bulkTransactionId** : identifiant de transaction groupée +- **bulkHomeTransactionID** : identifiant de transaction *home* +- **request** : { + options: Options, + extensionList: liste d’extensions *bulk* +} +- **individualItem_< transactionId >** : sérialisation de ({ + id: transactionId + request: {} + state: état individuel + batchId: `` + partyRequest: {} + quotesRequest: {} + transfersRequest: {} + partyResponse: {} + quotesResponse: {} + transfersResponse: {} + lastError: {} + acceptParty: bool + acceptQuotes: bool +}) +- **state** : état global + - RECEIVED + - DISCOVERY_PROCESSING +- **bulkBatch_< batchId >** : sérialisation de ({ + id: batchId + state: état individuel + - AGREEMENT_PROCESSING + - TRANSFER_PROCESSING + bulkQuoteId: `` + bulkTransferId: `` (peut être batchId) +}) +- **partyLookupTotalCount** : nombre total de demandes de recherche de partie +- **partyLookupSuccessCount** : nombre de recherches de partie réussies +- **partyLookupFailedCount** : nombre de recherches de partie en échec +- **bulkQuotesTotalCount** : nombre total de demandes de cotations groupées +- **bulkQuotesSuccessCount** : nombre de demandes de cotation réussies +- **bulkQuotesFailedCount** : nombre de demandes de cotation en échec +- **bulkTransfersTotalCount** : nombre total de demandes de transferts groupés +- **bulkTransfersSuccessCount** : nombre de demandes de transfert réussies +- **bulkTransfersFailedCount** : nombre de demandes de transfert en échec + +::: tip Remarques +- Les messages Kafka doivent contenir le *bulkID*. +- Pour mettre à jour l’état global, utiliser la commande `HSET bulkTransaction_< bulkTransactionId > state < stateValue >` +::: + +### 2. Mappage des *callbacks* individuels avec les éléments du lot + +#### Commande : +``` +HSET outboundBulkCorrelationMap +``` + +#### Attributs : +- partyLookup_``_``(_``) : "{ bulkTransactionId: ``, transactionId: `` }" +- bulkQuotes_`` : "{ bulkTransactionId: ``, batchId: `` }" +- bulkTransfers_`` : "{ bulkTransactionId: ``, batchId: ``, bulkQuoteId: `` }" +- bulkHomeTransactionId_`` : "{ bulkTransactionId: `` }" + +::: tip Remarques +- On peut utiliser la commande `HKEYS` pour récupérer tous les identifiants de transferts individuels d’un lot et itérer +::: + +## Format des messages Redis pour le transfert groupé entrant + +### 1. Cotations groupées + +#### Commande : +``` +HSET +``` +#### Clé : +``` +inboundBulkQuotes_< bulkQuotesId > +``` + +#### Attributs : +- **bulkQuotesId** : identifiant des cotations groupées +- **individualItem_< quotesId >** : sérialisation de ({ + id: quotesId + request: {} + state: état individuel + quotesRequest: {} + quotesResponse: {} + lastError: {} +}) +- **state** : état global + - RECEIVED + - PROCESSING +- **bulkQuotesTotalCount** : nombre total de demandes de cotations groupées +- **bulkQuotesSuccessCount** : nombre de demandes de cotation réussies +- **bulkQuotesFailedCount** : nombre de demandes de cotation en échec + +::: tip Remarques +- Les messages Kafka doivent contenir le *bulkQuotesId*. +- Pour mettre à jour l’état global, utiliser la commande `HSET bulkQuotes_< bulkQuotesId > state < stateValue >` +::: + +### 2. Transferts groupés + +#### Commande : +``` +HSET +``` +#### Clé : +``` +inboundBulkTransfer_< bulkTransferId > +``` + +#### Attributs : +- **bulkTransferId** : identifiant du transfert groupé +- **individualItem_< transferId >** : sérialisation de ({ + id: transferId + request: {} + state: état individuel + transfersRequest: {} + transfersResponse: {} + lastError: {} +}) +- **state** : état global + - RECEIVED + - PROCESSING +- **bulkTransferTotalCount** : nombre total de demandes de transferts groupés +- **bulkTransferSuccessCount** : nombre de demandes de transfert réussies +- **bulkTransferFailedCount** : nombre de demandes de transfert en échec + +::: tip Remarques +- Les messages Kafka doivent contenir le *bulkTransferId*. +- Pour mettre à jour l’état global, utiliser la commande `HSET bulkTransfer_< bulkTransferId > state < stateValue >` +::: + +### 3. Mappage des *callbacks* individuels avec les éléments du lot + +#### Commande : +``` +HSET inboundBulkCorrelationMap +``` + +#### Attributs : +- quotes_`` : "{ bulkQuoteId: `` }" +- transfers_`` : "{ bulkTransferId: ``, bulkQuoteId: `` }" + +::: tip Remarques +- On peut utiliser la commande `HKEYS` pour récupérer tous les identifiants de transferts individuels d’un lot et itérer +::: diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/BulkEnhancements/SDKBulk-Tests.md b/docs/fr/technical/technical/sdk-scheme-adapter/BulkEnhancements/SDKBulk-Tests.md new file mode 100644 index 000000000..dbfa2cada --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/BulkEnhancements/SDKBulk-Tests.md @@ -0,0 +1,207 @@ +# Prise en charge des transferts groupés par le SDK — tests + +## Stratégie de test + +La qualité de la solution livrée dépend de la qualité des tests et de la stratégie de test adoptée. La nature distribuée de cette solution fondée sur l’*event sourcing* a influé sur la stratégie retenue. Plusieurs types de tests ont été créés, se renforçant mutuellement et visant à détecter les défauts le plus tôt possible. + +Le gestionnaire d’événements de commande et le gestionnaire d’événements de domaine disposent tous deux de tests unitaires et de tests d’intégration ciblés comme socle. Les composants API FSPIOP et API *backend* n’ont que des tests unitaires. + +Une forte insistance a été mise sur les tests fonctionnels, qui vérifient les quatre composants ensemble, sur des scénarios nominaux et d’échec. + +### Tests d’intégration ciblés + +Ces tests sont écrits avec Jest et vérifient par exemple le magasin d’état mis à jour et les événements produits à partir d’un événement de commande généré. + +**Banc d’essai d’intégration du gestionnaire de commandes** + +![Configuration de test locale](../assets/CHIntegrationTestHarness.drawio.svg) + +### Banc d’essai des tests fonctionnels + +Le test fonctionnel s’appuie sur le TTK (*Testing Toolkit*), qui simule les *backends* DFSP payeur et bénéficiaire. + +:::tip Remarque +Ce banc d’essai couvre à la fois le SDK payeur et le SDK bénéficiaire. +::: + +![Configuration de test locale](../assets/bulk-functional-local-test-setup.drawio.svg) + +:::tip Remarque +Ces tests peuvent être exécutés sur le dépôt *monorepo* extrait en local ; ils sont lancés dans le pipeline CI et inclus dans Helm comme tests Helm pour valider le déploiement. +::: + +## Matrice des tests d’intégration DFSP payeur + +
    + +|Cas de test|C1|C2|C3|C4|C5|C6|C7|C8|C9|C10|C11|C12| +|---|---|---|---|---|---|---|---|---|---|---|---|---| +|INT D-1||||x||||||||| +|INT D-2||x||||||||||| +|INT D-3||x||||||||||| +|INT D-4|x|||||||||||| +|INT D-5|||x|||||||||| +|INT D-6|||x|||||||||| +|INT A-1||||||x||||||| +|INT A-2|||||x|||||||| +|INT T-1|||||||||||x|| +|INT T-2||||||||||x||| +|INT T-3|||||||||x|||| +|INT T-4|||||||||||x|| +|INT T-5|||||||x|||||| +|INT T-6||||||||||||x| + +
    + +## Matrice des tests fonctionnels DFSP payeur + +
    + +|Cas de test|B1|B2|B3|B4|B5|F1|F2|F3|F4|F5|F6|F7|F8|F9|D1|D2|D3|D4|D5|D6|D7|D8|D9|D10|D11|D12|D13|D14|D15|D16|D17|D18|D19|D20|C1|C2|C3|C4|C5|C6|C7|C8|C9|C10|C11|C12| +|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| +|FUNC 1|x|x|x|x|x|x|x||x|x||x|x||x|x|x|x|x|x|x|x|x|x|x|x|x|||x|x|x|x|x|x|x|x|x|x|x|x||x|x|x|x +|FUNC 2|x|x||||x||x|||||||x|x|x|x|x||||||||||||||||x|x|x||||||||| +|FUNC 3|x|x||||x||x|||||||x|x|x|x|x||||||||||||||||x|x|x||||||||| +|FUNC 4|x|x||||x||x|||||||x|x|x|x|x||||||||||||||||x|x|x||||||||| +|FUNC 5|x|x||||x||x|||||||x|x|x|x|x||||||||||||||||x|x|x||||||||| +|FUNC 6|x|x||||x||x|||||||x|x|x|x|x||||||||||||||||x|x|x||||||||| +|TC-BQ1|x|x|x|||x|x||x||x||||x|x|x|x|x|x|x|x|x|x|||||||||||x|x|x|x|x|x|||||x|x +|TC-BQ2|x|x|x|||x|x||x|x|||||x|x|x|x|x|x|x|x|x|x|||||||||||x|x|x|x|x|x|||||x|x +|TC-BQ3|x|x|x|||x|x||x|x|||||x|x|x|x|x|x|x|x|x|x|x||||||||||x|x|x|x|x|x|||||| +|TC-BQ4|x|x|x|||x|x||x|x|||||x|x|x|x|x|x|x|x|x|x|x||||||||||x|x|x|x|x|x|||||| +|TC-BQ5|x|x|x|||x|x||x|x|||||x|x|x|x|x|x|x|x|x|x|x||||||||||x|x|x|x|x|x|||||| +|TC-BQ6|x|x|x|||x|x||x|x|||||x|x|x|x|x|x|x|x|x|x|x||||||||||x|x|x|x|x|x|||||| +|TC-BQ7|x|x|x|||x|x||x|x|||||x|x|x|x|x|x|x|x|x|x|x||||||||||x|x|x|x|x|x|||||| +|TC-BQ8|x|x|x|||x|x||x|x|||||x|x|x|x|x|x|x|x|x|x|x||||||||||x|x|x|x|x|x|||||| +|TC-BQ9|x|x|x|||x|x||x|x|x||||x|x|x|x|x|x|x|x|x|x|x||||||||||x|x|x|x|x|x|||||| +|TC-BQ10|x|x|x|||x|x||x||x||||x|x|x|x|x|x|x|x|x|x|||||||||||x|x|x|x|x|x|||||x|x| +|TC-BQ11|x|x|x|||x|x||x|x|||||x|x|x|x|x|x|x|x|x|x|x||||||||||x|x|x|x|x|x||||||| +|TC-BQ13|x|x|x|||x|x||x|x|||||x|x|x|x|x|x|x|x|x|x|x||||||||||x|x|x|x|x|x||||||| +|TC-BT1|x|x|x|x|x|x|x||x|x||x||x|x|x|x|x|x|x|x|x|x|x|x|x|x|||x|x||||x|x|x|x|x|x|x||x|x|x|x| +|TC-BT2|x|x|x|x|x|x|x||x|x||x||x|x|x|x|x|x|x|x|x|x|x|x|x|x|||x|x||||x|x|x|x|x|x|x||x|x|x|x| +|TC-BT3|x|x|x|x|x|x|x||x|x|x|x||x|x|x|x|x|x|x|x|x|x|x|x|x|x|||x|x||||x|x|x|x|x|x|x||x|x|x|x| +|TC-BT4|x|x|x|x|x|x|x||x|x|x|x||x|x|x|x|x|x|x|x|x|x|x|x|x|x|||x|x||||x|x|x|x|x|x|x||x|x|x|x| +|TC-BT5|x|x|x|x|x|x|x||x|x||x||x|x|x|x|x|x|x|x|x|x|x|x|x|x|||x|x||||x|x|x|x|x|x|x||x|x|x|x| +|TC-BT6|x|x|x|x|x|x|x||x|x||x||x|x|x|x|x|x|x|x|x|x|x|x|x|x|||x|x||||x|x|x|x|x|x|x||x|x|x|x| +|TC-BT7|x|x|x|x|x|x|x||x|x||x||x|x|x|x|x|x|x|x|x|x|x|x|x|x|||x|x||||x|x|x|x|x|x|x||x|x|x|x| +|TC-BT8|x|x|x|x|x|x|x||x|x||x||x|x|x|x|x|x|x|x|x|x|x|x|x|x|||x|x||||x|x|x|x|x|x|x||x|x|x|x| + +
    + +## Référence des fonctionnalités DFSP payeur + +|#|Fonctionnalité sortante|Détail| +|---|---|---| +|B1|API *backend*|POST /bulkTransactions SDKBulkRequest| +|B2|API *backend*|Événement SDKOutboundBulkAcceptPartyInfoRequested| +|B3|API *backend*|PUT /bulkTransactions/{bulkTransactionId} Acceptation de partie| +|B4|API *backend*|PUT /bulkTransactions/{bulkTransactionId} Acceptation de cotation| +|B5|API *backend*|PUT /bulkTransactions/{bulkTransactionId} Résultats| +|F1|API FSPIOP|GET /parties| +|F2|API FSPIOP|PUT /parties/{Type}/{ID}| +|F3|API FSPIOP|PUT /parties/{Type}/{ID}/error| +|F4|API FSPIOP|POST /bulkQuotes| +|F5|API FSPIOP|PUT /bulkQuotes/{ID}| +|F6|API FSPIOP|PUT /bulkQuotes/{ID}/error| +|F7|API FSPIOP|POST /bulkTransfers| +|F8|API FSPIOP|PUT /bulkTransfers/{ID}| +|F9|API FSPIOP|PUT /bulkTransfers/{ID}/error| +|D1|Gestionnaire d’événements de domaine|SDKOutboundBulkRequestReceived| +|D2|Gestionnaire d’événements de domaine|SDKOutboundBulkPartyInfoRequested| +|D3|Gestionnaire d’événements de domaine|PartyInfoCallbackReceived| +|D4|Gestionnaire d’événements de domaine|PartyInfoCallbackProcessed| +|D5|Gestionnaire d’événements de domaine|SDKOutboundBulkPartyInfoRequestProcessed| +|D6|Gestionnaire d’événements de domaine|SDKOutboundBulkAcceptPartyInfoReceived| +|D7|Gestionnaire d’événements de domaine|SDKOutboundBulkAutoAcceptPartyInfoRequested| +|D8|Gestionnaire d’événements de domaine|SDKOutboundBulkAcceptPartyInfoProcessed| +|D9|Gestionnaire d’événements de domaine|BulkQuotesCallbackReceived| +|D10|Gestionnaire d’événements de domaine|BulkQuotesCallbackProcessed| +|D11|Gestionnaire d’événements de domaine|SDKOutboundBulkQuotesRequestProcessed| +|D12|Gestionnaire d’événements de domaine|SDKOutboundBulkAcceptQuoteReceived| +|D13|Gestionnaire d’événements de domaine|SDKOutboundBulkAcceptQuoteProcessed| +|D14|Gestionnaire d’événements de domaine|SDKOutboundBulkAutoAcceptQuoteRequested| +|D15|Gestionnaire d’événements de domaine|SDKOutboundBulkAutoAcceptQuoteProcessed| +|D16|Gestionnaire d’événements de domaine|BulkTransfersCallbackReceived| +|D17|Gestionnaire d’événements de domaine|BulkTransfersCallbackProcessed| +|D18|Gestionnaire d’événements de domaine|SDKOutboundBulkTransfersRequestProcessed| +|D19|Gestionnaire d’événements de domaine|SDKOutboundBulkResponseSent| +|D20|Gestionnaire d’événements de domaine|SDKOutboundBulkResponseSentProcessed| +|C1|Gestionnaire d’événements de commande|ProcessSDKOutboundBulkRequest| +|C2|Gestionnaire d’événements de commande|ProcessSDKOutboundBulkPartyInfoRequest| +|C3|Gestionnaire d’événements de commande|ProcessPartyInfoCallback| +|C4|Gestionnaire d’événements de commande|ProcessSDKOutboundBulkAcceptPartyInfo| +|C5|Gestionnaire d’événements de commande|ProcessSDKOutboundBulkQuotesRequest| +|C6|Gestionnaire d’événements de commande|ProcessBulkQuotesCallback| +|C7|Gestionnaire d’événements de commande|ProcessSDKOutboundBulkAcceptQuote| +|C8|Gestionnaire d’événements de commande|ProcessSDKOutboundBulkAutoAcceptQuote| +|C9|Gestionnaire d’événements de commande|ProcessSDKOutboundBulkTransfersRequest| +|C10|Gestionnaire d’événements de commande|ProcessBulkTransfersCallback| +|C11|Gestionnaire d’événements de commande|PrepareSDKOutboundBulkResponse| +|C12|Gestionnaire d’événements de commande|ProcessSDKOutboundBulkResponseSent| + +## Référence des cas de test + +|Groupe|N° cas de test|Type de test|Statut|Détail| +|--- |--- |--- |--- |--- | +|**Découverte** — tests d’intégration du gestionnaire de commandes||||| +|(process_bulk_accept_party_info.test.ts)|INT D-1|Intégration|Réussi|Étant donné la réception de l’événement de commande entrant ProcessSDKOutboundBulkAcceptPartyInfo, la logique doit parcourir chaque transfert individuel de la requête groupée, mettre à jour l’état de chaque transfert en DISCOVERY_ACCEPTED ou DISCOVERY_REJECTED selon la valeur de l’événement entrant, mettre l’état global à DISCOVERY_ACCEPTANCE_COMPLETED et publier l’événement sortant SDKOutboundBulkAcceptPartyInfoProcessed.| +|(process_bulk_party_info_request.test.ts)|INT D-2|Intégration|Réussi|Étant donné qu’aucune information de partie n’existe encore pour les transferts individuels et que la recherche de partie n’est pas ignorée, à la réception de ProcessSDKOutboundBulkPartyInfoRequest, l’état global doit passer à DISCOVERY_PROCESSING, un événement Kafka PartyInfoRequested doit être publié pour chaque transfert individuel, et l’état de chaque transfert doit passer à DISCOVERY_PROCESSING.| +|(process_bulk_party_info_request.test.ts)|INT D-3|Intégration|Réussi|Étant donné que les informations de partie existent pour les transferts individuels et que la recherche de partie n’est pas ignorée, à la réception de ProcessSDKOutboundBulkPartyInfoRequest, l’état global doit passer à DISCOVERY_PROCESSING, aucun événement sortant PartyInfoRequested ne doit être publié pour chaque transfert individuel, et l’état de chaque transfert doit passer à RECEIVED.| +|(process_bulk_request.test.ts)|INT D-4|Intégration|Réussi|À la réception de ProcessSDKOutboundBulkRequest, l’événement sortant SDKOutboundBulkPartyInfoRequested doit être publié et l’état global doit passer à RECEIVED.| +|(process_party_info_callback.test.ts)|INT D-5|Intégration|Réussi|Étant donné que les informations de partie reçues n’existent pas et que la recherche de partie a réussi, à la réception de ProcessPartyInfoCallback, l’état des recherches réussies doit passer à DISCOVERY_SUCCESS, les données Redis de chaque transfert concerné doivent être mises à jour avec les informations reçues, l’événement PartyInfoCallbackProcessed doit être publié ; si toutes les recherches ne sont pas terminées, ProcessSDKOutboundBulkPartyInfoRequestProcessed ne doit pas être publié, et SDKOutboundBulkAutoAcceptPartyInfoRequested ne doit pas non plus l’être.| +|(process_party_info_callback.test.ts)|INT D-6|Intégration|Réussi|Étant donné que les informations de partie reçues n’existent pas et que la recherche de partie a réussi, à la réception de ProcessPartyInfoCallback, l’état des recherches réussies doit passer à DISCOVERY_SUCCESS, les données Redis doivent être mises à jour, PartyInfoCallbackProcessed doit être publié ; si toutes les recherches sont terminées, SDKOutboundBulkPartyInfoRequestProcessed doit être publié ; si l’acceptation automatique de partie est fausse, SDKOutboundBulkAcceptPartyInfoRequested doit être publié.| +|**Accord** — tests d’intégration du gestionnaire de commandes||||| +|(process_bulk_quotes_callback.test.ts)|INT A-1|Intégration|Réussi|Étant donné une BulkTransaction avec les options { synchronous: false, onlyValidateParty: true, skipPartyLookup: false, autoAcceptParty: false, autoAcceptQuote: false }, un *callback* de lot de cotations réussi et un mélange de réponses réussies et échouées par cotation individuelle, à la réception de ProcessBulkQuotesCallback, la logique doit mettre l’état du lot à AGREEMENT_COMPLETED ou AGREEMENT_FAILED, chaque transfert du lot à AGREEMENT_SUCCESS ou AGREEMENT_FAILED selon le cas, mettre à jour les données de cotation dans Redis, l’état global de la BulkTransaction à AGREEMENT_ACCEPTANCE_PENDING, et publier les événements de domaine BulkQuotesCallbackProcessed et SDKOutboundBulkQuotesRequestProcessed.| +|(process_bulk_quotes_callback.test.ts)|INT A-2|Intégration|Réussi|À la réception de ProcessSDKOutboundBulkQuotesRequest, la logique doit mettre l’état global à AGREEMENT_PROCESSING, créer des lots par FSP en état DISCOVERY_ACCEPTED selon maxEntryConfigPerBatch, publier BulkQuotesRequested pour chaque lot et mettre l’état de chaque lot à AGREEMENT_PROCESSING.| +|**Transferts** — tests d’intégration du gestionnaire de commandes||||| +|(prepare_sdk_outbound_bulk_response.test.ts)|INT T-1|Intégration|Réussi|Étant donné une BulkTransaction avec les options { synchronous: false, onlyValidateParty: true, skipPartyLookup: false, autoAcceptParty: false, autoAcceptQuote: false }, à la réception de PrepareSDKOutboundBulkResponseCmdEvt, SDKOutboundBulkResponsePreparedDmEvt doit être publié pour chaque lot de transferts et l’état global de la transaction groupée doit passer à RESPONSE_PROCESSING.| +|(process_bulk_transfers_callback.test.ts )|INT T-2|Intégration|Réussi|Étant donné une BulkTransaction avec les mêmes options, à la réception de ProcessBulkTransfersCallbackCmdEvt, l’état du lot de transferts doit passer à TRANSFERS_COMPLETED, les cotations en échec restent AGREEMENT_FAILED, la logique doit parcourir les transferts et mettre à jour TRANSFER_SUCCESS ou TRANSFER_FAILED, publier BulkTransferProcessedDmEvt pour chaque lot ainsi que BulkQuotesCallbackProcessed, SDKOutboundBulkQuotesRequestProcessed, SDKOutboundBulkAutoAcceptQuoteProcessedDmEvt, BulkTransfersRequestedDmEvt, BulkTransfersCallbackProcessed et SDKOutboundBulkTransfersRequestProcessed.| +|(process_bulk_transfers_request.test.ts)|INT T-3|Intégration|Réussi|Étant donné une BulkTransaction avec les mêmes options, un *callback* de cotations réussi et un mélange de réponses par cotation, à la réception de ProcessSDKOutboundBulkTransfersRequestCmdEvt, l’état global doit passer à TRANSFERS_PROCESSING, l’état de chaque lot à TRANSFERS_PROCESSING ou TRANSFERS_FAILED, chaque transfert à AGREEMENT_ACCEPTED ou AGREEMENT_REJECTED selon acceptQuotes TRUE/FALSE, sans modifier les transferts déjà en AGREEMENT_FAILED, mettre à jour Redis et publier BulkQuotesCallbackProcessed, SDKOutboundBulkQuotesRequestProcessed, SDKOutboundBulkAutoAcceptQuoteProcessedDmEvt et BulkTransfersRequestedDmEvt.| +|(process_prepare_bulk_response.test.ts)|INT T-4|Intégration|Réussi|À la réception de PrepareSDKOutboundBulkResponseCmdEvt, SDKOutboundBulkResponsePreparedDmEvnt doit être publié.| +|(process_sdk_outbound_bulk_accept_quote.test.ts)|INT T-5|Intégration|Réussi|Étant donné une BulkTransaction avec les mêmes options et un *callback* de cotations avec succès et échecs mixtes, à la réception de ProcessSDKOutboundBulkAcceptQuote, l’état global doit passer à AGREEMENT_ACCEPTANCE_COMPLETED, l’état de chaque lot à AGREEMENT_COMPLETED ou AGREEMENT_FAILED, les transferts à AGREEMENT_ACCEPTED ou AGREEMENT_REJECTED selon acceptQuotes, mettre à jour Redis et publier BulkQuotesCallbackProcessed, SDKOutboundBulkQuotesRequestProcessed, SDKOutboundBulkAutoAcceptQuoteProcessedDmEvt et BulkTransfersRequestedDmEvt.| +|(process_sdk_outbound_bulk_response_sent.test.ts)#|INT T-6|Intégration|Réussi|Étant donné une BulkTransaction avec les mêmes options, à la réception de ProcessSDKOutboundBulkResponseSentCmdEvt, SDKOutboundBulkResponseSentProcessedDmEvt doit être publié pour chaque lot et l’état global doit passer à RESPONSE_SENT.| +|**Chemin nominal :** (bulk-happy-path.json)||||| +|- 1 transfert avec acceptParty et acceptQuote à true||||| +||TC-BHP1|Fonctionnel|Réussi|4 transferts vers 2 DFSP, avec acceptParty et acceptQuote à true| +||TC-BHP2|Validation|Réussi|Transaction groupée avec une erreur de format| +|**Erreurs parties :** (bulk-parties-error-cases.json)||||| +|- 1 transfert dans la requête||||| +||TC-BP1|Fonctionnel|Réussi|Le récepteur renvoie une erreur dans la réponse *parties*| +||TC-BP2|Fonctionnel|Réussi|Délai dépassé côté récepteur| +||TC-BP3|Fonctionnel|Réussi|skipPartyLookup est false et les informations du récepteur sont déjà présentes dans la requête.| +|- 2 transferts dans la requête||||| +||TC-BP4|Fonctionnel|Réussi|Le récepteur renvoie une erreur pour l’un des transferts| +||TC-BP5|Fonctionnel|Réussi|Le récepteur dépasse le délai pour l’un des transferts| +||TC-BP6|Fonctionnel|Réussi|Aucune réponse du récepteur pour les deux transferts| +|**Erreurs cotations :** (bulk-quotes-error-cases.json)||||| +|- 2 transferts avec le même FSP bénéficiaire ||||| +|- acceptParty pour tous les transferts||||| +||TC-BQ1|Fonctionnel|Réussi|Le FSP récepteur fait échouer tout le lot| +||TC-BQ2|Fonctionnel|Réussi|Le FSP récepteur dépasse le délai sur tout le lot| +||TC-BQ3|Fonctionnel|Réussi|Le FSP récepteur n’envoie qu’une réponse et ignore l’autre| +||TC-BQ4|Fonctionnel|Hors périmètre MVP|Le FSP récepteur envoie une réponse de succès et une d’échec (non implémenté — issue 3015)| +|- acceptParty variable||||| +||TC-BQ5|Fonctionnel|Réussi|Un true, un false| +||TC-BQ6|Fonctionnel|Hors périmètre MVP|Acceptation de partie false pour toutes les réponses — alors seuls les détails de partie, pas de cotation, état final COMPLETED (non implémenté — issue 3015)| +||TC-BQ7|Fonctionnel|Hors périmètre MVP|True envoyé pour une seule cotation dans PUT /bulkTxn acceptParty, la seconde ignorée (non implémenté — issue 3015)| +||TC-BQ8|Fonctionnel|Hors périmètre MVP|False envoyé pour une seule cotation dans PUT /bulkTxn acceptParty, la seconde ignorée (non implémenté — issue 3015)| +|- 2 transferts avec des FSP bénéficiaires différents — acceptParty pour tous||||| +||TC-BQ9|Fonctionnel|Réussi|Un lot renvoie une erreur| +||TC-BQ10|Fonctionnel|Réussi|Les deux lots renvoient une erreur| +||TC-BQ11|Fonctionnel|Réussi|Un lot dépasse le délai| +|- 3 transferts : 2 partagent un FSP bénéficiaire, le 3e un autre||||| +||TC-BQ12|Fonctionnel|Hors périmètre MVP|Le lot à 2 transferts n’envoie qu’une réponse de transfert et l’autre lot envoie le succès (non implémenté — issue 3015)| +||TC-BQ13|Fonctionnel|Hors périmètre MVP|Erreur sur le commutateur pour devise non prise en charge — (issue —| +|**Erreurs transferts :** (bulk-transfer-errors.json)||||| +|- Un bulkTransfer avec 2 transferts ||||| +|- acceptQuote pour tous les transferts||||| +||TC-BT1|Fonctionnel|Réussi|Le récepteur fait échouer tout le lot| +||TC-BT2|Fonctionnel|Réussi|Le récepteur dépasse le délai sur tout le lot| +||TC-BT3|Fonctionnel|Hors périmètre MVP|Le FSP récepteur n’envoie qu’une réponse et ignore l’autre (non implémenté — issue 3015)| +||TC-BT4|Fonctionnel|Défauts intermittents|Le FSP récepteur envoie une réponse de succès et une d’échec — (issue : 3019)| +|- acceptQuote variable||||| +||TC-BT5|Fonctionnel|Hors périmètre MVP|Un true et un false — TC2 — bug 2958| +||TC-BT6|Fonctionnel|Hors périmètre MVP|Acceptation de cotation — tous à false (non implémenté — issue 3015)| +||TC-BT7|Fonctionnel|Hors périmètre MVP|True envoyé pour un seul transfert dans PUT /bulkTxn acceptParty, le second ignoré (non implémenté — issue 3015)| +||TC-BT8|Fonctionnel|Hors périmètre MVP|False envoyé pour un seul transfert dans PUT /bulkTxn acceptParty, le second ignoré (non implémenté — issue 3015)| + diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/IntegrationBulkFlowPatterns.md b/docs/fr/technical/technical/sdk-scheme-adapter/IntegrationBulkFlowPatterns.md new file mode 100644 index 000000000..72e124842 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/IntegrationBulkFlowPatterns.md @@ -0,0 +1,38 @@ +# Intégration des systèmes *core banking* via les transferts groupés + +Il existe trois modèles pour construire l’intégration du DFSP payeur dans le cadre des transferts groupés. + +1. Intégration de transfert en **trois phases**. Aligné sur les trois phases de transaction Mojaloop : découverte, accord et transfert. +1. **Intégration double API**. Ce modèle est détaillé dans le diagramme de séquence ci‑dessous. Il regroupe les phases Découverte et Accord en une première phase ; les résultats sont présentés au payeur pour confirmation ; la phase Transfert s’exécute ensuite en seconde phase. + +![Modèle de flux d’intégration double API — transferts groupés, DFSP payeur](./assets/sequence/PayerDFSPBulkDoubleIntegrationApiPattern.svg) + +1. **Intégration API unique**. Ce modèle est détaillé dans le diagramme de séquence ci‑dessous. Les trois phases sont regroupées en un seul appel de transfert synchrone. + +![Modèle de flux d’intégration API unique — transferts groupés, DFSP payeur](./assets/sequence/PayerDFSPBulkSingleIntegrationApiPattern.svg) + + +::: tip Validation en deux temps +Tous les modèles d’intégration DFSP payeur prennent en charge une validation en deux temps (phase de réservation puis phase d’engagement). +::: + +## Exigences côté DFSP bénéficiaire + +Les évolutions du SDK Scheme Adapter garantissent que les DFSP ayant déjà intégré Mojaloop **n’ont pas** à modifier leur intégration pour **recevoir** des transferts groupés : le SDK Scheme Adapter reçoit les messages de transfert groupé et les convertit en messages de transfert individuels. Si un DFSP bénéficiaire souhaite tirer parti du message de transfert groupé, une intégration dédiée aux messages *bulk* peut être mise en œuvre au cas par cas. + + +## Modèle de flux idéal côté bénéficiaire (groupé) + +Ici, les contrôles LBC/FT et les frais sont traités en phase d’accord, et la phase de transfert comporte une réservation puis un engagement. + +![Modèle d’intégration idéal — transferts groupés, DFSP bénéficiaire](./assets/sequence/PayeeDFSPBulkIdealPattern.svg) + +## API éditeur limitée à un seul appel + +Si le système *core banking* ne propose qu’un **seul** appel API pour toutes les vérifications et phases du transfert, c’est le modèle le plus couramment supporté. + +### Appel du transfert sur la notification PATCH + +![Intégration DFSP bénéficiaire lors de la notification PATCH (groupé)](./assets/sequence/PayeeDFSPBulkSingleIntegrationApiOnPatch.svg) + +Toute défaillance **après** la notification PATCH (étape **19**) peut entraîner une erreur de réconciliation. On peut y remédier en prévoyant des mécanismes de compensation (par exemple initier un transfert de remboursement en cas d’erreur après l’étape 19). diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/IntegrationFlowPatterns.md b/docs/fr/technical/technical/sdk-scheme-adapter/IntegrationFlowPatterns.md new file mode 100644 index 000000000..2bb803a9b --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/IntegrationFlowPatterns.md @@ -0,0 +1,56 @@ +# Intégration des systèmes *core banking* à Mojaloop — modèles + +L’intégration d’un système *core banking* dans un flux de transaction temps réel de type *push* peut poser des difficultés, en grande partie selon les API d’intégration fournies par l’éditeur. Ce document décrit à quoi devrait ressembler une intégration idéale, certaines limitations typiques des API éditeurs, les modèles de flux utilisés pour pallier ces limitations, et les risques associés. + +## Modèles d’intégration côté DFSP payeur + +Trois modèles peuvent être utilisés pour construire l’intégration du DFSP payeur : + +1. Intégration de transfert en **trois phases**. Aligné sur les trois phases de transaction Mojaloop : découverte, accord et transfert. +1. **Intégration double API**. Ce modèle est détaillé dans le diagramme de séquence ci‑dessous. Il regroupe les phases Découverte et Accord en une première phase ; les résultats sont présentés au payeur pour confirmation ; la phase Transfert s’exécite ensuite en seconde phase. + +![Modèle de flux d’intégration double API — DFSP payeur](./assets/sequence/PayerDFSPDoubleIntegrationApiPattern.svg) + +1. **Intégration API unique**. Ce modèle est détaillé dans le diagramme de séquence ci‑dessous. Les trois phases sont regroupées en un seul appel de transfert synchrone. + +![Modèle de flux d’intégration API unique — DFSP payeur](./assets/sequence/PayerDFSPSingleIntegrationApiPattern.svg) + +::: tip Validation en deux temps +Tous les modèles d’intégration DFSP payeur prennent en charge une validation en deux temps (phase de réservation puis phase d’engagement). +::: + +## Modèle idéal d’intégration côté DFSP bénéficiaire + +Idéalement, les API de l’éditeur permettent : + +1. D’effectuer les contrôles LBC/FT **avant** et **indépendamment** du transfert. +1. De calculer les frais d’un transfert **avant** et **indépendamment** du transfert. +1. D’exécuter le transfert en **deux phases** : une phase de réservation, puis une phase d’engagement. + +Lorsque ces capacités existent dans l’API éditeur, une intégration « idéale » peut réduire les écarts de réconciliation lors d’erreurs inattendues et limiter le risque pour le DFSP. + +### Modèle de flux idéal côté bénéficiaire + +Ici, les contrôles LBC/FT et les frais sont traités en phase d’accord, et la phase de transfert comporte une réservation puis un engagement. + +![Modèle d’intégration idéal — DFSP bénéficiaire](./assets/sequence/PayeeDFSPIdealPattern.svg) + +::: warning Limitation fréquente +Une limitation courante des API éditeurs est de regrouper toutes ces opérations en un **seul** appel, en une **seule** phase, pour effectuer le transfert. +::: + +## API éditeur limitée à un seul appel + +Si le système *core banking* ne propose qu’un **seul** appel API pour toutes les vérifications et phases du transfert, deux modèles méritent d’être envisagés. + +1. Appeler le transfert sur la notification PATCH + +![Intégration DFSP bénéficiaire lors de la notification PATCH](./assets/sequence/PayeeDFSPSingleIntegrationApiOnPatchPattern.svg) + +Toute défaillance **après** la notification PATCH (étape **17**) peut entraîner une erreur de réconciliation. On peut y remédier en prévoyant des mécanismes de compensation (par exemple initier un transfert de remboursement en cas d’erreur après l’étape 17). + +1. Appeler le transfert pendant la phase de transfert + +![Intégration DFSP bénéficiaire pendant la phase de transfert](./assets/sequence/PayeeDFSPSingleIntegrationApiOnTransferPattern.svg) + +Ce modèle est en général déconseillé, car l’annulation d’un transfert est souvent impossible. Il devient pertinent lorsque le transfert porte sur un compte interne (par exemple remboursement de prêt). diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/README.md b/docs/fr/technical/technical/sdk-scheme-adapter/README.md new file mode 100644 index 000000000..0a7dbcde3 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/README.md @@ -0,0 +1,56 @@ +# SDK Scheme Adapter + +Un *scheme adapter* est un service qui fait l’interface entre un *switch* conforme à l’API Mojaloop et une plateforme backend DFSP qui n’implémente pas nativement l’API Mojaloop. + +L’API entre le *scheme adapter* et le backend DFSP est du HTTP synchrone, tandis que l’interface entre le *scheme adapter* et le *switch* est l’API Mojaloop native. Exception : les intégrations *bulk*, configurables en synchrone ou asynchrone. + +Le **SDK-Scheme-Adapter** est maintenu par la communauté Mojaloop et sert de référence pour les bonnes pratiques de connexion d’un DFSP à l’API Mojaloop. Il est le plus souvent déployé directement dans la solution. Ci-dessous, les principaux modes d’adoption. + +## Modèles d’adoption du SDK + +Selon les règles du schéma, les DFSP interagissent avec le Hub Mojaloop central selon quatre modes courants. Ce qui suit résume le rôle du SDK-Scheme-Adapter dans chaque mode et les avantages pour les DFSP. + +### 1. DFSP utilisant une solution tierce (ex. Payment Manager) intégrant le SDK Scheme Adapter + +Plusieurs solutions tierces proposent support, outillage et intégrations vers les backends en s’appuyant sur le SDK-Scheme-Adapter pour une intégration synchrone (selon les pratiques recommandées Mojaloop) vers l’API Mojaloop. + +*Payment Manager*, outil *open source*, en est un exemple. D’autres informations sont disponibles [ici](https://rtplex.io/). *Payment Manager* peut être déployé en SaaS ou en auto-hébergement. + +![SDK-Scheme-Adapter Mode 1](./assets/SDKSchemeAdapterMode1.svg) + +- Le SDK Scheme Adapter est intégré directement à l’implémentation personnalisée. +- Maintenu par la communauté, il offre une trajectoire de montée de version vers les nouvelles versions de l’API Mojaloop. +- Solution normalisée pour une intégration rapide +- *Core Connector* co-développé avec des intégrateurs ou éditeurs bancaires +- L’UX *Payment Manager* couvre aussi les opérations métier et l’accueil sécurité avec automatisation de la maintenance + +:::tip Composants open source +Ils sont sous licence Apache v2.0, choisie pour limiter les conflits avec les politiques d’entreprise. Sans contrainte « copy-left », les adoptants peuvent personnaliser des éléments (comme les *core connectors*) sans obligation de publication vers la communauté. +::: + + +### 2. DFSP avec son propre Core Connector et le SDK Scheme Adapter + +Le DFSP développe un *Core Connector* sur mesure entre son backend et le SDK Scheme Adapter Mojaloop, en s’appuyant sur les guides open source. + +![SDK-Scheme-Adapter Mode 2](./assets/SDKSchemeAdapterMode2.svg) + +- SDK Scheme Adapter intégré directement à l’implémentation personnalisée. +- Trajectoire de montée de version grâce à la maintenance communautaire. +- Développement selon les guides *Core Connector* open source +- Support de la communauté Mojaloop +- Exploitation par les équipes techniques du DFSP + +### 3. Solution de connexion Mojaloop entièrement développée par le DFSP + +Aucune connexion standard imposée : le DFSP élabore sa propre connexion au Hub Mojaloop. + +![SDK-Scheme-Adapter Mode 3](./assets/SDKSchemeAdapterMode3.svg) + +- Basé sur la documentation de conception open source +- Support de la communauté Mojaloop +- Exploitation par les équipes techniques du DFSP +- Le SDK Scheme Adapter peut servir uniquement de référence +- Cette implémentation dialogue directement avec les API asynchrones Mojaloop + + diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/RequestToPay.md b/docs/fr/technical/technical/sdk-scheme-adapter/RequestToPay.md new file mode 100644 index 000000000..a0d9e0374 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/RequestToPay.md @@ -0,0 +1,28 @@ +# Demande de paiement (R2P) — prise en charge du cas d’usage + +Cette documentation décrit comment le SDK Scheme Adapter prend en charge le cas d’usage *request to pay* (demande de paiement). Ce cas d’usage est à la base de tous les transferts initiés par le bénéficiaire. La prise en charge exige que chaque DFSP sur un commutateur Mojaloop traite automatiquement un transfert dès qu’une demande de transfert est reçue et validée. L’intégration de ce cas dans le SDK Scheme Adapter est importante car elle réduit l’effort de développement de chaque DFSP lorsqu’un schéma impose le support par les participants. Ce cas d’usage est particulièrement pertinent pour les tests, car il permet des tests à distance en tant que DFSP payeur et DFSP bénéficiaire. + +> Points importants : +> +> 1. Toutes les fonctionnalités n’ont pas été entièrement testées ni alignées sur la spécification FSPIOP ; consulter l’épique suivante pour l’avancement : [#3344 — Améliorer le SDK Scheme Adapter pour le cas Request to Pay](https://github.com/mojaloop/project/issues/3344) ; +> 2. Il n’existe actuellement pas de tests de bout en bout couvrant l’ensemble des fonctionnalités, y compris l’authentification par OTP. Voir la [publication de la collection de cas de test du Testing Toolkit](https://github.com/mojaloop/testing-toolkit-test-cases/releases) pour ce qui est testé aujourd’hui : [testing-toolkit-test-cases@v15.0.1](https://github.com/mojaloop/testing-toolkit-test-cases/releases/tag/v15.0.1) ; et +> 3. Tous les cas d’échec n’ont peut‑être pas été entièrement implémentés. Se reporter à nouveau à l’épique [#3344](https://github.com/mojaloop/project/issues/3344). +> + +## Diagramme de séquence + +1. Le DFSP bénéficiaire démarre le cas R2P par un appel API **POST** `/RequestToPay`. +2. Le DFSP bénéficiaire peut, en option, valider le payeur. +3. Le DFSP payeur exécute la demande R2P par un appel **POST** `/requestToPayTransfer`. Si le type d’authentification n’est pas fourni dans cet appel, le flux suppose que le payeur confirmera le transfert et les conditions via un **PUT** `/requestToPayTransfer` ; sinon, le flux d’authentification approprié est exécuté. + +Le diagramme suivant résume ce flux. + + +![Diagramme de séquence R2P](./assets/sequence/requestToPaySDK-R2P-SequenceDiagram.svg) + +## Diagramme de séquence détaillé + +Ci‑dessous, un diagramme de séquence plus détaillé pour le cas demande de paiement et les appels API du SDK Scheme Adapter. + +![Diagramme de séquence détaillé R2P](./assets/sequence/SDKrequestToPay.svg) + diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/BulkSDKEnhancements-Architecture.drawio.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/BulkSDKEnhancements-Architecture.drawio.svg new file mode 100644 index 000000000..579441a56 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/BulkSDKEnhancements-Architecture.drawio.svg @@ -0,0 +1,3 @@ + + +
    SDK-Scheme-Adapter with Bulk Enabled
    SDK-Scheme-Adapter with Bulk Enabled
    Payer DFSP

    Core banking system / Beneficiary Management System
    Payer DFSP...
    Mojaloop FSPIOP
    Mojaloop FSPIOP
    Backend API
    Backend API
    Domain Event Handler
    Domain Ev...
    Command Event Handler
    Command Event...
    FSPIOP API
    FSPIOP API
    Producer
    Producer
    Consumer
    Consumer
    Producer
    Producer
    Consumer
    Consumer
    Producer
    Producer
    Consumer
    Consumer
    Producer
    Producer
    Consumer
    Consumer
    State
    Store
    State...
    State
    Store
    State...
    Infrastructure
    Infrastructure
    State
    Store
    State...
    Producer
    Producer
    Consumer
    Consumer
    Dependency Injection
    Dependency Injection
    Kafka
    Kafka
    Domain Events 
    Domain...
    Command Events 
    Command...
    Redis
    Redis
    Text is not SVG - cannot display
    \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/BulkSDKEnhancements.drawio b/docs/fr/technical/technical/sdk-scheme-adapter/assets/BulkSDKEnhancements.drawio new file mode 100644 index 000000000..b308a656b --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/BulkSDKEnhancements.drawio @@ -0,0 +1 @@ +7Vxtc6M2EP41nmk/xAMSrx+TOLnMtJmmzc302m8yCKMLRj4hkri/vhIIDAi/JdhxcsnNZZAQAvbZZ3e1KzKCl/PnLwwt4lsa4mQEjBkj4QhORgCY4r/oWKAZbnXIEffkv6rTUL05CXHWGsgpTThZtDsDmqY44K0+xBh9ag+LaKI/xn2AEqz1/k1CHpe9HnBX/TeYzOLqRqbjl2fmqBqsHjyLUUifGl3wagQvGaW8PJo/X+JESqaSS3nd9Zqz9YMxnPJdLsj/DazfEP6GF06ef7m8QR78ceaUszyiJFcvfIeWmImuyfX9nXpwvqykwWiehlhOaIzgxVNMOL5foECefRLgir6YzxPRMsVhiLK4GCsbEU25AtP0ZJskySVNKCsmhlEUgSAQ/Y+YcSLEf56QWSrOcbqorlaPIWfLOKMPuHF96Ewd2xFn1PuIWfDzWkGZtfiFUmI6x5wtxZD2Bcuy5Sj4nlboW6bCOG4gD301ECkFm9UTr0ARBwqXPTCqNL8B0i39jhIqRAOMm3z6OpikbK/RnCTyhW9w8oglAG3IgKlDFiLsRUEfGE7g4WnUA1s/uANAZpvuNtBgJcbjgAY1zLLw4SwLYjzHZyhECy5Z9hrcGOWIE5qq0bsRp0s7W/5T4xr95U8vtsVPh9DWMCgCt00909BhNK0+7tkH456t4fjl6utImtpr8WKcCFfURRGHwoOoZkpTXGDVBJYyHtMZTVHyu+Rwicx3zPlSCRTlnLbBFhJky2/q+qLxj2yM7ao5eW6enCxVq8Sv8lzOjnQ3y4nCc+kvRXua0OCh7LomSdKvS6GNvdDq0xkPTGGhMwma4uQCBQ+zQiDVECWkTKg6SWfqyUuxSlm+UJuMsQEMr61QVtlkOBHUeWzP3Kc7avI7SsQ965mhZ7Sndez2FBnNWYDVVU2X3JnIhm5nIjjuTMURm2G+YapqII2iDHNN4Wu5vJwDrkaBLYbrBfrdVD7Y1PczASO0O0pv+FvUfn/V1ImyVf/xM+EFJceGD1VbPqA5NjzVXD2ebCwbjTvMiAAGs+bzdzs382VXhgikCn3c5K0UpKW2bRhYxr1rOSfQMqvgSOk0NAbhnOm1fUO9HtiXcxBaY9fezN8TIJ3pHMevKB02G/qrvMpa9X2ZTwHmC3xKFGEn6I0xQ9efGvv4iR1Y4Pfr9is11+tENTUjtmjbUJrk95hvJxGiuRALB2cmDyYkC6gI3ZbVGXGj+mQ9mlU9f+GMCozlKxS3X1AuZE1QUggrIAsimpmM22ISxHItXIRqwJgW1xQESqVkaSRtTozVclNeIuLZqivD7JEIwLo8EAEmb2vxerO+zhEgFSUH4kmludXC5zkJQ3nD3ii8Tbum77IHWs90AwNQBwaNWBi4PUsa71ChcI/bf98WSawZ97dI2BQ65PbpnO+4EDnDWiRzjZoMbZK6SnNgk2Sa223S+YxhsVaWD7CLTbpChaUps1YGkaZkwegjkbpYGRS6WAiFzFPCpQyF4okxmEWUzcXR+e3v4rdYnwcPWWGg5HUolL8DmhXmjMq8WChtZV7at2IKXN6ZM5RmUc+ifgdzVavOOmV7Z+YKWPrC/cjGCn4aq53WPUMaK3AYY9WJ/OGR4ycTbDdWX2vyv9BWMfwjxxkvjRUtjVeAi+YT4XFtwiorMxbHIgzLk8IOCbAKM5UIQRfXlNZL3uCX7FdxlFJOIoLD8WcwJbOF9psHU6anKdXdH/cqsTjNk4c/cxFUHym3WOcxfKdlxxzobLRk7yApuUO4tjnJ0perGdBmAqUHWxMv6yLBVeLFcKsIvU6fj4bIvFhGO9upkWJr5uUI2RJ9kdumU2Wgj8soc2yAdmTggffOqFen+Q/MqCo62M6oNeFKXT4wLcNqE8oehFDQ1TKQNcdOiVN63l/uDaiSNRqRshgtCjoEXMK9rXzZjRGmlHM6H9VloAvVnpxZ3qr3a8FAy+oJjtulzteHDX5nIwCw9UWN1RMzHKwWWW0k2VSI+XAgdCp4fSvL44LQl7r44CB4/poM9puBoFflj+PXm1VJ0HHR1oGcNDyMkz5owXGr84XGRo2Tzhe2mV+vw1+bTmhHs3Bvz7u+jqh58ROoIwJLo8olTSPC5uXmIVWEkXtZpPxJKtOh6tQxGXXihHr9OrKPbgMSCjgbCSUMFtB2wwwTznYIBdx9N8McIZTVOCDwwBEJCCqEdItSNFPFBuM+n2bLjOP58fy6CzS/7nWU1tL0HRzA08OOo3/zaEvfnzxFvFVv6VnRJwlZZJJ0FWD5XHBZEJAm21HbeeHctBDVDjYNoEEw6RDM0pOXdh8o9qFA0ReGUVEa21YJ+2jAAF/bSQSdN8ZGzyu3sFHs+eDAOCfGGKiv3H9CVGAn8nbgG6OyfheC8MVpCwznR05VMW91VBTzOtH0muKdXh8sb1GVCDvQb6vKKZx6oBuyFtcfb+wUXzc+TgDGMPrjdqp4ph6b1N9atT4OONgnHmAI/bnIkwcxdEKyac6yKggtisKckdkMM6lIP5/anA1W/u18VOK9ud7skL068Q31O+zL/cAb6t9g+7vrjw3Tsmzg+Z7nGG4nKw6tse+ZruM4ru0b/gs/R4GgkyBw4NjvTnYCOS2orwo/P8oa9eatdiDq50dZ7/GjLNj3VdbJbuvfM05pquc6hX5nm84Ou4NfNFd/SKBUsdXfWoBX/wM=7V3blpu4Ev0aP7YXQkjAY1/SmT6ZrOlMP0xy3jDINmkMPhj35Xz9SIDMRcLQNhho21lJTCEEVG1tVRVWMYG3q7evobVefg8c4k1UZRG6zgTeTVQV0L9UsLYWpCBgLZ7c/3Ohkkq3rkM2hYZREHiRuy4K7cD3iR0VZFYYBq/FZvPAEy/jybY8Ikj/cZ1omUgNVc/kfxB3seQnAthM9qws3ji98M3ScoLXnAh+mcDbMAii5Nvq7ZZ4TDNcL8lx9xV7dxcWEj9qcoD+nx//De6dHw/fyOzX5ufXV/frjytDS7p5sbxtesdPd9+unuwlWZGra8daRySk+19dejeqcrP1nul/X3xr5hEnva/onSsrDLa+Q9j5lAm8eV26EXlaWzbb+0ptT2XLaOXRLUC/OtZmGbdlG5soDJ53Gqa6uZkHfpRaHyC6/ULCyKV2ufbchU+FUbDmrdILSDXCGpK3SiWBneopIEmwIlH4TpvwA4zUWu/Jtpluvma21/RUtszZHXGhlcJrses6Mwn9klrlIxbSBTUTh0I03QzCaBksAt/yvmTSm6IhsjZ/BkxrscZ/kyh6TxVsbaOgaBzy5kY/c99/sa6mKN26e0t7jjfe+YZP75cddKVMFQC4JDlUQyoXZEfHW4XDH0noUr1RzCXCIi6gBBebyAqjazawqWTmBfYzF9673u52fIc38QOfJJJ0PztNomKm1/24oWYItqFN9tiLc5IVLki0px2U4zAknhW5L8XraB1UfKhko36iYi9io9J9oV8XUayURMQ0zu6cUzH+35Zx1g3IvpYPmRUAy1uxjq6Sbq5pA4DXb8kxpV4erfeYdO7unx4njNXSTsPyaei9zySy5IIFseTWhnC3p7m92yAk9Cpmlv/s+gt2we+biKxi9d4zZic+mbu2a8Uo/G75dGJbkVgVT2lL+ZmOmQLmdATeBl4QxsfCOWJ/UtXl5Mlnxwa5PTj+7K7jKOrXiswPsEj9QJFQP+iM+tVBj9LvwW/LY/OJqtBx+vDXYwuwbRFMjkWMuS0FjW2Q2bwd0GBjcKgxjD4dBu4VJLO+3tBjAFMFFv0FA6NP4C8cMb+nhz4GbjyuU7ypilnAm6ozr6zQSeKhpMfl44FSV0CDQleKZmafUr+JRyP0S/VkveearVmDTfUd7EZIdtr9l7m/Pf2SXEE2YHbaPnwMQYF5byz7mWKACq8fH44kqhwisWQWnBNsS4nL0c2ZorRDXGUgASQSlynhrV0c3jpviZHoXbCyXJ/Fmy+JJ/KH5Tsecw07Vf9crVA/nmHUkrMB1Xr1y+LM7tSPBPXfBquVFUP+pPo3bCLX/8xAGmoJ/ho9dZ3+ATipAbBgAO5WdU45BDiI6DKdm1iHVkuYR7AB5sFJKUfkHEHPC6ro9SSfUmS5r0k+s3ccEavGVNVz065eUBKkuzUV6UBTDfYvFFSmaVPVyB2PNYkK4ZR3EP+L9a40qpxCo3uMKer5g6oCp1IVNOpVtVlaa/bVfvdcOtpDWD/UZwkv/DnbCajnsojZ4q9tRLshqTyNFDV6u9kNYwVJ6CIMIuq0BiztairdhVp7EFWdsC0OlyuApkjPhotqGiKvK1M+++YNz8BhdmVrU7D1Yxg4W1symVINRUWTFtWaBiR5G6QiK02N21SjLCIScuYr13HicE+GoeKEkoNAY/o/xH7a1DQhUk0NAB1rOlAFc0FmrnS3ggyDD5N9g1ZTu+I3Wea0X37js6nkScWQ6I6b5EJ3+61c83xqFHSnifHzbeBvtqszoLuauGNkdCcGJR3QXU2oDKmDbBRgPzanWO9v0sBy3Q52lrg4xY3Mqn+GWeKMneL99hvZLIF6DPor+G0kTjFqEE5c6C4F2MjpDokB0Lk4xTX2GxvdidFNB3RXE0fENFaA/cicYnSS3PseA47HKUbis7nLLFGFqLHPEmLEfS5OcY39xjZL9Bf0V/HbWJziSw6gkZU/Qw4AiTmAs3GKP1UOAJ8kB1DzAxNt7Jli3N/jRVwRow11lsBiOH2ZJaoQNfJZAosR97k4xTX2G9ss0V/QX8VvI3GK8SUH0MjKnyEHgMUcwLk4xTX2GxvdyXIAuRV89avvqhbfPdEhRhos/jzmDPGK0Ubr9E5APHhaMJgKDkRdzXSKwRQWVwaoJpjyXE6eFsxdqJGHFuxsdYAsKXKB0nChBJE2UCjpjYPM9ldod7OEorSWTZMsLNFki3l21T7aH65iXuvBn4cW1c/WjrZsOJQ0fuh6HrXsYqXTe5PyKrvCKVXlVQ6fyPUKk/VnEtEiktX0TclwkMQGZN54+ybko44vD01HnWTluyEzsNKVgbk32ENwWaMqqNdpCsgWe0LUlaYaJGv7wmuf0WOCoEozYp2vtefxYybJhyBIgvrOyj0AcTYfT27sSIaqsRcsEpTMVkCBorFU2JWtTvLLoRYYCkjSYcCQqEpTy+Un2lNWg1zhWZJUxdP9QZOUrLrAWDJax5LUfnsNjqR00Tm4I2tCdePb7Lof/N+UlBj4h2m5D9aVbJ9S95WCwhI3T+1q1BniqPtmzZ+tz2G4j5f+PGRiNNXC8ISiTWUm7S53I4tx8kk6bpAsC+eReSTm5Iq1dTZUbK2YSfzZJgn895dd3BfpisWzcsCqZlkkSTfVl0Iq4iQb0IfU5kpNfqVMDZ4jy9kZSezMZUdW9ULFOQCaJfg0LemlKzUdVdTwyjriDYP5fEMKbdoqraXL3LpDEFwqTzRQCDcorfMpIFyq0qaVJ7VDIawBc2rmP8MDdK8FmrOizL8muQqL8nKLdOPjBRNzY4GXS8yKIcqquDatX9dKueWkio44EI6EMyw9UmjKpK2Bqt8ingVQgW5BJS2w2ahKZ6/A0ypyT0cCD5g9A88cDvC6YLMCsFLo5XGlHMB4jcvntQO8bhhPKz9ELc/gHQOPPysaAvC6YLxW6g73yniom5LGEPTLeAYYDvDGwngnBh7qBHiIPzDuC3ji84wL8AYFPNyNj4f7Zjw4HOCNZao9rY+HOvLx1CLjndzHE3/Y/jdx3I0AxzN5IFGznBEUU2EIiBm9kz58MHqNDS+vIuv21SKYw4v/Wlk78MUiWDep0kt9aVMT5NdSNeKdj75bBJffFZLeQuWV7m8/6eTdIma/gW5hFF3ez9P2ICq9D+qI9/Ng/gOo076fB0NQPu3+y9zf/qNjiG5mr0RNmmdvjYVf/gU=5Vrdc+I2EP9reAxjSf58TAJcM3eZ0iG93j11HFsB94zl2uKA/vVd25KxJZMQaiBDH2Cs1Vof+/Hb1coDcr/cfMr8dPHIQhoPsDHPonBARgOMEfyAkPpz2iIUHLPoH0k0BHUVhTRvMXLGYh6lbWLAkoQGvEXzs4yt22wvLNaXMQv8mGrUP6KQLyqqi50d/RcazRdyImR7Vc/Sl8xi4fnCD9m6QSLjAbnPGOPV03JzT+NCMlIu1XuTPb31wjKa8ENecKbf53/dPnz98uckHbvh42NKnm7EKD/9eCU2PPW3NAPSbPRZrJtvpTAytkpCWoxnDMjdehFxOkv9oOhdg26BtuDLGFoIHl+iOL5nMcvKd8lkMrY8D+hiRppxutm7FVQLCMyGsiXl2RZYxAvYsapXtoJbyni9U1FNWzTVI4m+sIJ5PfZOcvAghPcOQeJOQdKTCPJ+7E36EaRlGB9NkEQTZK/SG9sjYzTuR3qEtM2QIF162D6r9My3pUeT8LbAQWglLKFtaVXcNJyr8PemTBp7tjq2LGkZjX0e/WwP3yUGMcOURTBxLXLTaRusSRRJ5myVBVS81UTDNwaqdScH4n42p1wbqNRKve3jFWXtB96HR01nYKO8raicZ+wHlYYtFNm0dUHy42ieQDMA/cHw5K6w+Aji263oWEZhWEzT6UdtT+vDZRTkJrbuMmaH+ZzMYez9uH3NejC9D6YHpwO47LgQ9jM8zHm57YrwwkpH3qnF/nvFZMdNXmaMt8CA3HSz65SjPD19lgPBQqux2uMDuTHn1VoAaluAaeoW4J7TAtx3ha4g9vM8CtqqoJuIf4PnG2NowPYqwvdCZkPXxKI92gghlo1tozGlWQR7KZRT0kI/X5Qif09khAWXIeitFOdSERQbSu7sGEMTIceGiGi5Lib4uICq5eSOsrQ9ARUU6m8bbGnBkO9fP7IUu0Xo1XWp/HJdO1OtVtBrdPc0W0ZDaE9/nT0NCgeaPK/iH0+b5HrhBeG22HEHvJw1wMj8rg98QUPDcFvwgiz3w8DLhRN0Re+qQg/FE+1oStyh5xHLMkzbsTwkw9eZ8nWkV0pw4dKfxsKjQVM8ovn1erSpBo6O065zVo/Way7v9uhD3e5S7mRjLVof6U5qwq8enHsKz7aWBhivrkvll+s6aXhGepGJ/L+c2Tb3wPSlsn/0vspVd3hOYCXfmo0qOBNLtnfBuWxtm62ewnPlRx82PCswgOwj031LBSb7MDzpzYX1AppZpti/qy48eRhdrx+rp3hkXTrN1gtqVksv9cnnqvWiXg3gDr10JUvEPZVeugpsRx5/5IGmQlcsCy17Tj4SlI02KDtvgfJJqy8fHafVKg1WryeOxmk1gewp78MKEBHz9bxP5ZcbPG3ep9cY7VfAyfCDlE/5tq5EZ7Is7AfQ89uKcXq9EIbV282Lp4h6Vc1fcXYbBBTUBOF+W9X9X/w4px06q3krxTV5r1WHRC2Wdlzvd6GYmsz195lEj1U4GUNEJEIHhqEhQl4zFBWXBficJ4TDCngHRKiL3iNohT6vpwhVG+mZThJYr+wdddNYXiAql413EE8KTdKcR8kcnm7g94UBHhTDUr5KBxhWbSQM/mbriAcLeHimfE1pUlrPlmYveVpIIwkFgZaEfVeY/rJAkuQ5Tw+7vswo7MN/LhkMAZPVzsruwwFNZAgwjXU3sEbd+NiJo23YK/YjPvtDrmyLHUhV/aebCfXIpGOi3fXJk2qWB2AiNHff91X2uvsEkoz/BQ==7Vpbd5s4EP41fkwOIMD4MXbSJtm0zTZ7afuyRwbZVg3IFXJs59evZCRAIN8S3/ZsHhKjYRAw8803oxEt0EvmHymcjD6RCMUtxxpSHLXAdctxbP7HBRM4RJpAaDzhFyW0pHSKI5RpioyQmOGJLgxJmqKQaTJIKZnpagMSNx/jKYQxakj/xhEb5dLAaZfyW4SHI3Uj2+/kZxKolOWDZyMYkVlFBG5aoEcJYflRMu+hWFhG2SW/7sOKs8WDUZSybS6YfOz+ShP848vt4CrLfo5/BJ27CznLM4yn8oXv0gGFGaPTkE0pko/OFsoelEzTCIkprRbozkaYoacJDMXZGXcvl41YEvORzQ8HJGXSg45QH+A47pGYUC5IScrl3Qhmo+V0Qp/flowLOztqBnl3ofGMKMPcO1cxHqZcxoi4pXwJfg7NV1rHLmzOkYhIghhdcBV5gWNJvy3ysetJt81Kr7sKg6OqxwMphBJYw2Lu0hn8QPrD7Jtf7t38MXpIX7qzC/j4D5xR9tdFAZzS+iji4JRDQtmIDEkK45tS2tX9U+o8EGGppQ1/IsYW0i1wyojuMzTH7Fvl+LucShxfz6sDYSngXHpy/Igo5i+OqNJJuRGKmcTge3VQzrUcLaqj+lQ6LoCOLNtbakDKrkR4l9Bayj5gYXQ5daQ0+jEJx7lIKtg1eLYcMAhCFIbF7Stn+oEn8KGAJ7yyHnbciWRKQ6l1/Xv46etn8OJ+/vP+no5Y79tkrCKRP/MQsTWoAGYYUxRDhp/15zBBcnkptwNcVBQmBKcsq8z8KARldPgqGmR0eC7QuWaDvoqcMhzyJyiDo3iVN8RLk8w40XFS4DKS8n9PDDK0/CWC2azeCKZDlBmj7AH2eZrSIgNKzgm5bwU0G2SU4CjKgxBl+AX2l/MJmEjz8sm9bsu7NuA3FrfrwnA8XAZwjSS1jCbnLRPLBt5bwy0r2dC6BG3fz+faDVkNKNgaEC7sGluSwSDjeK9z5W5wWBdQFTS0HD9mIufgZ344FIcSErmc36Zyyqi9BI5ZuwYinu4n4jBcxJgzMgWb02U/5+6HfiEoAPFlyvg0KgtmFeRUkeTvJxe6HT0XenYzFwamVGjtIRUafekYfFmzt7DT5E2BsqFAcF3dKJ5IfXWz2G2DXYB3ILOAzWY5FQwp4ZGFiaDFTr304xk0gigYGHOrHwaoP9gWyKvRstKRflv5TXFSKal4UjlNA3j7UAB3G558pCSahjzP1D3KzcF0h+k2lDnDUGtvn8BMCNEry1fRziu8BfRCwuQp2wJNVzngQJ7yzoGK/I38bAcGo7gFZe3dLP47Fa1Ey3+LitoNT/ZImk2T/wEVrffW2VFRp+GpryjCzfXMebhpm05PPYqLzs/bSbMgyYI07Yb7fFPxdqj2TnN98hscjOG798yxp68j3aCZ8o7rvaDhvrsUM8yXkzwArT9QxhqePEL37jSdsshDQeSaUmjg9IHvb9ng2LWPtkt/TOLowrr0PF9fyRU9iTd2Ohy3xjD1znDe25NXlfjbtRln+/p9QLvW+N+gr57L2Iwrr95rh8YcQ80EpjfsJCFaCcqyVY26Q7fDVRfbyhvdx+xjq9irhqeth6eMnzI6DQXuFn1s1fRXx8UbGpv+alB/vePGuN4rX70oWccFTsdf0Z88bD+dJys9ndnrQ7iu7znBeYRwswN1v8x8MgFaTyHFk2YmVEvBaRJfhYxUa5Nl4/2RZFgu2fqEMZIYipd8668SqiRfEfaKjd9myBlLlWbhtI+CJdCTDDDsJwJDweIfrGBxz4k+rSPQ576Km237A3uhNm9LajvJNqBbryTaayqJvVUJ3kmAqzLiZVttcK/fCX8HqGH77dgA9YC+c+WvK3X3BdBmR7hHkgSmERfe8p9YdM4sgUfxy0wrw52+qjlVSnNrm/q+YQ1uO4acto9WpZkawGmpYXtmMJXLZ7tWfx1brNsW2PhVy4rO64HTWVBLZ+uq6s1swYfl13y5evnBI7j5Fw==vVfbctowEP0aHtvxNcBjuCSZaUjpOJ2kecko9mIrCMsjCzD9+kpY8gWbQFInD8xoj1aLdHb3SO7Z41V2zVASzWgApGcZIcNBz570LMsUPwEkKIQaID08/FeDhkLXOIC05sgpJRwnddCncQw+r2GIMbqtuy0oaW7D8xGBBvqAAx7l6MDql/gN4DDSf2ReDPOZFdLOauNphAK6rUD2tGePGaU8H62yMRDJjObFvU+my2fr1+3iCe6oO/x992x/y4NdvWdJcQQGMe82tJWH3iCyVnxNrry5Oi/faRIZXccByEBmzx5tI8zBS5AvZ7eiJgQW8RVR0xtgHIsEXBIcxgLjVDosaMw9FfHcAyk/GRCySjrVAa+BroCznXBRs32Vqp0uOWVvy8w7jsKiatZ1jpEqrrAIXTIqBorUdoKHwfJ+Zv4c3D5la8/DlMUkVTmpEtyzLoj421GAN2IYyuEc7VaSCbmLfPKF6TmNiH+vrGgJMkOxqGV2zP9oRo3TGT2ShnMzeDRdtuHU82U382WaLfkadJCu1v3aDaIgEHKiTMp4REMaIzIt0VGdytLnlsrC3xP4CpzvlBSiNad1eiHD/LEy/iNDfXeVNclU5L2x00YsjvtYNSqrpFku21t6XcoR45dSRgXgE5Sm2NfwFSZ6SylndFkIplXUwLktm9I18+ENP5V4ye6bjc2AII43dTFvS7taOqd430iqwiz3QBH6B5Ujzh0CV6sOiqfYxsfryTmir8YI+UuIg0a5iUsmkcMIMiSqSBCfAMNiG6KzC3SuIet07y5wBvoWNt+dx/Old3hAtOOe18ruZ7Vyv0H9jL4iIpvSMm7WL81OJ0S8QeAMSr/iKnMP77I2bbS+UhsHLVfZkepdEMiUyAj9CY7oTROukFxX1eLttTeWwP2oELRDpfqoNH5EhjtWRfX0zEXpdG2fVM9qrRht7x4N/qfMuk69WAs10CHykzdkthHIOdBr2/havR42atyb/BCA50ewAjG4DFAitbiD91T3mmGfIcID93M0uPX1azboHFMmaRznH3e0EyK7f5g2ng0tRPa7ucyEWX5C5mVcfmXb038=3VjbcpswEP0aP7aDuTjOY2znMpOk4w6Tado3FdagRCAihI379ZWMuFngYI+TmfYhE/awWqOze46FR9Y8ym8ZSsJH6gMZmUbAsD+yFiPTHIs/ASQogBYgM1z8pwQNhWbYh7SVyCklHCdt0KNxDB5vYYgxummnrSjRH8P1EAEN/YF9Hhbo1Lyo8TvAQVh+0HhyWdyJUJmsHjwNkU83Dci6HllzRikvrqJ8DkQyU/IydfntNyOdrd/Qr8VYMLF0yZei2M0xS6otMIj5eUubRek1Ipnia3HjLtV++bYkkdEs9kEWGo+s2SbEHNwEefLuRsyEwEIeEXV7DYxj0YArgoNYYJzKhBWNuasqDt2QypMFIW+0U23wFmgEnG1Firp7oVq1LZup4k3dedtWWNjqugKRGq6gKl0zKi4UqUcQbGlcgi/mU4WU8ZAGNEbkukZnNduGiOqcByqZ3HH8ApxvlbZQxmm7A5Bj/ty4/ilLfXVUtMhV5V2wLYNYbPe5GTRWybBetovKdSlHjF9JXQrAIyhNsVfCN5iUj5RyRl8rBYoWzo6bgZRmzIMDebayEsQCOFTPKfJkFw5OFAOCOF63XeTs42H36M+YIe8VYl+bHmFCibwMIUdiKASPCTAsHgZYjS5LyHxfrSucQ+nS46PbMlyal3vStB1NmpUKm9J0zqDMh7URfyfrJ/fpjdzb7sSZvcTVYJ2uzPQVuBf+IzItv7yMTjEOVLGYSD1JgI2UTnmdUeeOrvPO9hrd0/g5snY0Wc+zlNNIYHPKYPdvd7qh7P9ReCXVQxI3PkjinVuYaG14pC+ISH2axl32W3cAQsQxFAZw+hmnGWf/OGPpx5mx2UHo9KMIvdAI7R3fFYFceUW3bfRYToPkPbdtOVjTenU7O9UlT3Hk0/2t37cGnGMmA88x74mvAgc7o/qMJcViw/Ww2u1hrb7wyxLFztWq5nvKXiF7z0YsY69QQY1WaDfQ1cZPPxcY2oy7i3sBuF4IkbTuKx8l0oz7X5KM9w2kxwuGDlKvZ1gDzllT5yweLML65bdgv/59wLr+Cw==1VZLc9owEP41HNsxFo/0GF5hJk2GKYekR8VebAVhMfIaTH9911jyEyhtSWd68Iz202q9+valDhtv0gfNt+GT8kF2XCfQwu+wScd1u/QRsOUB1IBMYyl+WNAxaCJ8iGuKqJREsa2Dnooi8LCGca3Vvq62UrLtxtLjElroi/AxzNE7d1jicxBBaH/UHXzJdzbcKhvH45D7al+B2LTDxlopzFebdAwyY8bykp+bndktHNMQ4TUHvu2fHx5XjzDnXff5hYvJ8N75ZKzsuEzMhSez5cI4jAfLglZJ5ENmqNtho30oEJZb7mW7ewoqYSFupNnegUZBDN5LEUSEocoUVirCpbFo/0qKkJ69TrcgiVIH1AZQH0jFHrC8HizzRt6XYWIDg4W1EBmQm0wICtsle7QwBP4Gmf0Wb+BTMhlRaQxVoCIupyU6Kpl1SCp1vqqMtSOf74B4MIXAE1R1tiEV+FpZf89Mfe4baZIay0fhYIWIrvtaFSqnMrE8dpTsuRi5xvusiAjwJI9j4Vl4JqR1KUat1kW5UAxHOTEZG5ejTeSpRHtwgWTX1DzXAeAFPXY6ezRIjmJX9+PmmeCeKStnxL01RH4rUag5bLNlCCmn+BNlW9CCnAFdogsLub8uwpVIwXbPbhGBv6u4fqPiev1WxRXFVa24/kcVHGvRPE5iVBvCntQ7l1kNuc44nwSCaHWdpZJJvvwPI8CaPe9UBNi/jECvFYEK8fPkrd0RpaRJDVfQd+N50R80uGPteVHMlCp3dx/F3bDF3dmkXElITd+lluyfacFtuMJnfdAUj5GjsAb0wqLHN5v3n06LGzZ9dmXT751OgWqInVNPAgtePR3MPxZK0FXK+mx0yJ7TyJ38ouZU9a3WMNRrGGJNQzkTLUPHPCwufio1SSyfnLl6+Spn058= \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/BulkSDKEnhancements.drawio.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/BulkSDKEnhancements.drawio.svg new file mode 100644 index 000000000..728a19418 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/BulkSDKEnhancements.drawio.svg @@ -0,0 +1,3 @@ + + +
    Payer DFSP
    Payer DFSP
    Mojaloop Hub
    Mojaloop Hub
    sdk-scheme-adapter
    sdk-scheme-adapter
    GET /parties
    GET /parties
    Discovery
    Resolve all potential recipients which might be at any of the DFSPs on the service
    Discovery...
    Agreement
    Each DFSP is provided the opportunity to perform AML checks and add costs or discounts to each transfer
    Agreement...
    Transfer
    Each DFSP is requested to proceed with the transfer. Results are collated and DFSP(s) notified.
    Transfer...
    POST /bulkQuotes
    POST /bulkQuotes
    POST /bulkTransfers
    POST /bulkTransfers
    Payee DFSP
    Payee...
    Confirmation of party information
    Confirmation of party information
    Beneficiary Management Subsystem
    Benefi...
    batch transfers
    batch tran...
    for each transfer
    for each t...
    for each batch
    for each b...
    for each batch
    for each b...
    Confirmation to proceed with transfer
    Confirmation to proceed with trans...
    Bulk Disbursement is triggered
    Bulk Disbursement is triggered
    GET /parties
    GET /parties
    Discovery
    Resolve all potential recipients which might be at any of the DFSPs
    Discovery...
    Text is not SVG - cannot display
    \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/CHIntegrationTestHarness.drawio.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/CHIntegrationTestHarness.drawio.svg new file mode 100644 index 000000000..d139c9f6c --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/CHIntegrationTestHarness.drawio.svg @@ -0,0 +1,3 @@ + + +
    Infrastructure
    Infrastructure
    Assert on State Store Changes
    Assert on State Store Changes
    State
    Store
    State...
    Producer
    Producer
    Consumer
    Consumer
    Redis
    Redis
    Kafka
    Kafka
    Initiates Test
    Initiates Test
    Assert on Kafka messges
    Assert on Kafka messges
    Jest Test Script
    Jest...
    Command Handler under test
    Command Handler...
    Text is not SVG - cannot display
    \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/SDKSchemeAdapterMode1.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/SDKSchemeAdapterMode1.svg new file mode 100644 index 000000000..483b2dc7c --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/SDKSchemeAdapterMode1.svg @@ -0,0 +1,3 @@ + + +
    DFSP
    DFSP
    Payment
    Manager
    Payment...
    DFSP Backend
    DFSP Backend
    Mojaloop Hub
    Mojaloop Hub
    SDK Scheme Adapter
    SDK Scheme Ada...
    Core Connector
    Core Connec...
    Text is not SVG - cannot display
    \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/SDKSchemeAdapterMode2.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/SDKSchemeAdapterMode2.svg new file mode 100644 index 000000000..b3143177b --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/SDKSchemeAdapterMode2.svg @@ -0,0 +1,3 @@ + + +
    DFSP
    DFSP
    DFSP Backend
    DFSP Backend
    Custom Core Connector
    Custom Core Conn...
    Mojaloop Hub
    Mojaloop Hub
    SDK Scheme Adapter
    SDK Scheme Ada...
    Text is not SVG - cannot display
    \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/SDKSchemeAdapterMode3.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/SDKSchemeAdapterMode3.svg new file mode 100644 index 000000000..814b57fa0 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/SDKSchemeAdapterMode3.svg @@ -0,0 +1,3 @@ + + +
    DFSP
    DFSP
    DFSP Backend
    DFSP Backend
    Custom Mojaloop Connection Solution
    Custom Mojaloop Conne...
    Mojaloop Hub
    Mojaloop Hub
    Text is not SVG - cannot display
    \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/bulk-functional-local-test-setup.drawio.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/bulk-functional-local-test-setup.drawio.svg new file mode 100644 index 000000000..ab1c426df --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/bulk-functional-local-test-setup.drawio.svg @@ -0,0 +1,3 @@ + + +
    Payer SDK
    Payer SDK
    Payee SDK
    Payee SDK
    Payer SIM
    Payer...
    Payee SIM
    Payee...
    TTK
    TTK
    1. POST /bulkTxn
    1. POS...
    2. GET /parties
    2. GET /par...
    3. GET /parties
    3. GET /parti...
    4. PUT /parties/ID
    4. PUT...
    5. PUT /bulkTxn/ID
    5. PUT /bul...
    6. PUT /bulkTxn/ID acptPty
    accptQuote
    6. PUT /bulkT...
    autoAcceptParty: false
    autoAcceptQuote: false
    autoAcceptParty: false...
    Bulk testing - Local setup, no Switch between payerfsp and payeefsp 
    Bulk testing - Local setup, no Switch between payerfsp and payeefsp 
    Text is not SVG - cannot display
    \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/overview-drawio.png b/docs/fr/technical/technical/sdk-scheme-adapter/assets/overview-drawio.png new file mode 100644 index 000000000..855dcba55 Binary files /dev/null and b/docs/fr/technical/technical/sdk-scheme-adapter/assets/overview-drawio.png differ diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/BULK-ERRORCODES.md b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/BULK-ERRORCODES.md new file mode 100644 index 000000000..32672dff9 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/BULK-ERRORCODES.md @@ -0,0 +1,145 @@ +# Transferts groupés + +## Cas d’erreur + +### Phase de découverte + +Toutes les erreurs rencontrées pendant cette phase sont agrégées dans le *mojaloop-connector*, ajoutées à l’objet `lastError` et renvoyées au FSP payeur avec l’ensemble des transferts réussis ou en échec inclus dans la requête de transfert groupé. + +Le *mojaloop-connector* relaie les erreurs renvoyées par le commutateur (*pass-through*). + +``` + "lastError": { + "httpStatusCode": 202, + "mojaloopError": { + "errorInformation": { + "errorCode": "3204", + "errorDescription": "Party not found", + "extensionList": {"extension": [{"key": "string","value": "string"}]} + } + } + } +``` + +**Codes d’erreur — recherche de partie** + +| Description de l’erreur | Code erreur | Code HTTP | Catégorie | +|------------------------------------------------------------------------|-------------|------------------|----------------------------------------------------------| +| Erreur de communication | 1000 | 503 | Erreur technique | +| Erreur de communication vers la destination | 1001 | 503 | Erreur technique | +| Erreur serveur générique | 2000 | 503 | Erreur de traitement | +| Erreur interne du serveur | 2001 | 503 | Erreur de traitement | +| Délai d’attente dépassé lors de la résolution de la partie | 2004 | 503 | Erreur de traitement | +| Erreur de validation générique | 3100 | 400 | Erreur de validation de la requête | +| Partie introuvable | 3204 | 202 | Erreur de traitement | + +### Phase d’accord + +Toutes les erreurs rencontrées pendant cette phase sont agrégées dans le *mojaloop-connector*, ajoutées à l’objet `lastError` et renvoyées au FSP payeur avec l’ensemble des transferts réussis ou en échec inclus dans la requête de transfert groupé. + +Le *mojaloop-connector* relaie les erreurs renvoyées par le commutateur. + +``` + "lastError": { + "httpStatusCode": 202, + "mojaloopError": { + "errorInformation": { + "errorCode": "3204", + "errorDescription": "Party not found", + "extensionList": {"extension": [{"key": "string","value": "string"}]} + } + } + } +``` + +**Codes d’erreur — cotations** + +| Description de l’erreur | Code erreur | Code HTTP | Catégorie | +|------------------------------------------------------------------------|-------------|------------------|----------------------------------------------------------| +| Erreur de communication | 1000 | 503 | Erreur technique | +| Erreur de communication vers la destination | 1001 | 503 | Erreur technique | +| Erreur serveur générique | 2000 | 503 | Erreur technique | +| Erreur interne du serveur | 2001 | 503 | Erreur technique | +| Non implémenté | 2002 | 501 | Erreur de traitement | +| Service actuellement indisponible | 2003 | 503 | Erreur de traitement | +| Délai d’attente du serveur dépassé | 2004 | 503 | Erreur de traitement | +| Serveur occupé | 2005 | 503 | Erreur de traitement | +| Erreur client générique | 3000 | 400 | Erreur de validation de la requête | +| Version demandée inacceptable | 3001 | 406 | Erreur « non acceptable » | +| URI inconnue | 3002 | 404 | Erreur « introuvable » | +| Erreur de validation générique | 3100 | 400 | Erreur de validation de la requête | +| Syntaxe incorrecte | 3101 | 400 | Erreur de validation de la requête | +| Élément obligatoire manquant | 3102 | 400 | Erreur de validation de la requête | +| Trop d’éléments | 3103 | 400 | Erreur de validation de la requête | +| Charge utile trop volumineuse | 3104 | 400 | Erreur de validation de la requête | +| Signature invalide | 3105 | 403 | Erreur « interdit » | +| Erreur FSP destinataire | 3201 | 404 | Erreur « introuvable » | +| Identifiant FSP payeur introuvable | 3202 | 404 | Erreur « introuvable » | +| Identifiant FSP bénéficiaire introuvable | 3203 | 404 | Erreur « introuvable » | +| Identifiant de cotation introuvable | 3205 | 404 | Erreur « introuvable » | +| Identifiant de cotation groupée introuvable | 3209 | 404 | Erreur « introuvable » | +| Erreur d’expiration générique | 3300 | 503 | Erreur de traitement | +| Cotation expirée | 3302 | 503 | Erreur de traitement | +| Erreur payeur générique | 4000 | 400 | Erreur de validation de la requête | +| Rejet payeur générique | 4100 | 403 | Erreur « interdit » | +| Erreur de plafond payeur | 4200 | 400 | Erreur de validation de la requête | +| Erreur d’autorisation payeur | 4300 | 403 | Erreur « interdit » | +| Erreur de blocage payeur générique | 4400 | 403 | Erreur « interdit » | +| Erreur bénéficiaire générique | 5000 | 503 | Erreur de traitement | +| Liquidité insuffisante côté FSP bénéficiaire | 5001 | 503 | Erreur de traitement | +| Rejet bénéficiaire générique | 5100 | 403 | Erreur « interdit » | +| Cotation rejetée par le bénéficiaire | 5101 | 503 | Erreur de traitement | +| Type de transaction non pris en charge par le FSP bénéficiaire | 5102 | 503 | Erreur de traitement | +| Cotation rejetée par le bénéficiaire | 5103 | 503 | Erreur de traitement | +| Devise non prise en charge par le bénéficiaire | 5106 | 503 | Erreur de traitement | +| Erreur de plafond bénéficiaire | 5200 | 503 | Erreur de traitement | +| Erreur d’autorisation bénéficiaire | 5300 | 403 | Erreur « interdit » | +| Erreur de blocage bénéficiaire générique | 5400 | 403 | Erreur « interdit » | + + + +### Phase de transfert + +Toutes les erreurs rencontrées pendant cette phase sont agrégées dans le *mojaloop-connector*, ajoutées à l’objet `lastError` et renvoyées au FSP payeur avec l’ensemble des transferts réussis ou en échec inclus dans la requête de transfert groupé. + +Le *mojaloop-connector* relaie les erreurs renvoyées par le commutateur. + +``` + "lastError": { + "httpStatusCode": 404, + "mojaloopError": { + "errorInformation": { + "errorCode": "3210", + "errorDescription": "Bulk transfer ID not found", + "extensionList": {"extension": [{"key": "string","value": "string"}]} + } + } + } +``` + +**Codes d’erreur — transfert** + +| Description de l’erreur | Code erreur | Code HTTP | Catégorie | +|------------------------------------------------------------------------|-------------|------------------|----------------------------------------------------------| +| Erreur de communication | 1000 | 503 | Erreur technique | +| Erreur de communication vers la destination | 1001 | 503 | Erreur technique | +| Erreur serveur générique | 2000 | 503 | Erreur de traitement | +| Erreur interne du serveur | 2001 | 503 | Erreur de traitement | +| Délai d’attente du serveur dépassé | 2004 | 503 | Erreur de traitement | +| Erreur de validation générique | 3100 | 400 | Erreur de validation de la requête | +| Identifiant de transfert groupé introuvable | 3210 | 404 | Erreur de traitement | +| Erreur d’expiration générique | 3300 | 503 | Erreur de traitement | +| Demande de transaction expirée | 3301 | 503 | Erreur de traitement | +| Transfert expiré | 3303 | 503 | Erreur de traitement | +| Erreur bénéficiaire générique | 5000 | 400 | Erreur de traitement | +| Liquidité insuffisante côté FSP bénéficiaire | 5001 | 400 | Erreur de traitement | +| Rejet bénéficiaire générique | 5100 | 400 | Erreur de traitement | +| Cotation rejetée par le bénéficiaire | 5101 | 400 | Erreur de traitement | +| Type de transaction non pris en charge par le FSP bénéficiaire | 5102 | 400 | Erreur de traitement | +| Cotation rejetée par le FSP bénéficiaire | 5103 | 400 | Erreur de traitement | +| Transaction rejetée par le bénéficiaire | 5104 | 400 | Erreur de traitement | +| Transaction rejetée par le FSP bénéficiaire | 5105 | 400 | Erreur de traitement | +| Devise non prise en charge par le bénéficiaire | 5106 | 400 | Erreur de traitement | +| Erreur de plafond bénéficiaire | 5200 | 400 | Erreur de traitement | +| Erreur d’autorisation bénéficiaire | 5300 | 403 | Erreur de traitement | +| Erreur de blocage bénéficiaire générique | 5400 | 400 | Erreur de traitement | diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPBulkIdealPattern.PlantUML b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPBulkIdealPattern.PlantUML new file mode 100644 index 000000000..8f7e09906 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPBulkIdealPattern.PlantUML @@ -0,0 +1,89 @@ +@startuml PayeeDFSPBulkIdealPattern +/'***** +-------------- +******'/ + +skinparam activityFontSize 4 +skinparam activityDiamondFontSize 30 +skinparam activityArrowFontSize 22 +skinparam defaultFontSize 22 +skinparam noteFontSize 22 +skinparam monochrome true +' declare title +' title PayeeDFSPBulkIdealPattern +' declare actors +participant "Mojaloop\nSwitch" as Switch +box "Payment Manager\nPayee DFSP" #LightGrey +participant "SDK Scheme Adapter" as MC +participant "Core\nConnector" as CC +end box +participant "Core banking solution" as CBS +autonumber 1 1 "[0]" + +== Payee DFSP integration - Discovery == + +Switch->MC: **GET** /parties/{Type}/{Id} +MC-->Switch: HTTP 202 Response +MC->CC: **GET** /parties/{Type}/{Id} +activate MC +CC->CBS: **GET** [account lookup] +CBS-->CC: Response +CC-->MC: Response +deactivate MC +alt If Success response +MC-->Switch: **PUT** /parties/{Type}/{Id} (or /parties/{Type}/{Id}/{SubId}) +else if Error response +MC-->Switch: **PUT** /parties/{Type}/{Id}/error (or /parties/{Type}/{Id}/{SubId}/error) +end + +== Payee DFSP integration - Quote and Transfer - 2 phase commit with prior AML check == + +Switch->MC: **POST** /bulkquotes +MC-->Switch: HTTP 202 Response +loop X times for each transfer in bulk message + MC->CC: **POST** /quoterequest + activate MC + CC->CBS: **AML** checks + CBS-->CC: Response + CC->CBS: **Calculate Fees** + CBS-->CC: Response + CC-->MC: Response + deactivate MC + MC->MC: Update transaction status \nand attach quote response +end Loop +MC-->Switch: **PUT** /bulkquotes/{Id} +Switch->Switch: Pass Quote to Payer +note left +Obtain consent to +proceed with the transfer +Via **POST** /bulktransfers +end note + Switch-> Switch: Perform liquidity(NDC)check + Switch->Switch: Reserve Funds at indivial transfer level + Switch->MC: **POST** /bulktransfers + loop X times for each transfer in bulk message + MC->CC: Create & Reserve Transfer\n **POST** /transfers + activate MC + CC->CBS: Reserve funds + CBS-->CC: response (homeTransactionId) + CC-->MC: response (homeTransactionId) + deactivate MC + MC->MC: Generate Fulfilment + MC -> MC:Update transaction status \nand attach transfer response + end Loop + MC-->Switch: **PUT** /bulktransfers/{id} (BulkStatus='PROCESSING') + Switch-->Switch: Commit funds at indivial transfer level in DFSP ledgers + Switch -> MC: **PATCH** /bulktransfers/{id} (BulkStatus='COMPLETED') + loop X times for each transfer in bulk message + MC->CC: Commit Transfer\n **PATCH** /transfers/{id} \n(TransferStatus='COMMITTED', homeTransactionId) + activate MC + CC->CBS: Commit funds + CBS->CBS: Release funds to Payee + CBS-->CC: response + CC-->MC: response + deactivate MC + end loop + + + +@enduml \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPBulkIdealPattern.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPBulkIdealPattern.svg new file mode 100644 index 000000000..f4c0069b0 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPBulkIdealPattern.svg @@ -0,0 +1,183 @@ +Payment ManagerPayee DFSPMojaloopSwitchMojaloopSwitchSDK Scheme AdapterSDK Scheme AdapterCoreConnectorCoreConnectorCore banking solutionCore banking solutionPayee DFSP integration - Discovery[1]GET/parties/{Type}/{Id}[2]HTTP 202 Response[3]GET/parties/{Type}/{Id}[4]GET[account lookup][5]Response[6]Responsealt[If Success response][7]PUT/parties/{Type}/{Id} (or /parties/{Type}/{Id}/{SubId})[if Error response][8]PUT/parties/{Type}/{Id}/error (or /parties/{Type}/{Id}/{SubId}/error)Payee DFSP integration - Quote and Transfer - 2 phase commit with prior AML check[9]POST/bulkquotes[10]HTTP 202 Responseloop[X times for each transfer in bulk message][11]POST/quoterequest[12]AMLchecks[13]Response[14]Calculate Fees[15]Response[16]Response[17]Update transaction statusand attach quote response[18]PUT/bulkquotes/{Id}[19]Pass Quote to PayerObtain consent toproceed with the transferViaPOST/bulktransfers[20]Perform liquidity(NDC)check[21]Reserve Funds at indivial transfer level[22]POST/bulktransfersloop[X times for each transfer in bulk message][23]Create & Reserve Transfer POST/transfers[24]Reserve funds[25]response (homeTransactionId)[26]response (homeTransactionId)[27]Generate Fulfilment[28]Update transaction statusand attach transfer response[29]PUT/bulktransfers/{id} (BulkStatus='PROCESSING')[30]Commit funds at indivial transfer level in DFSP ledgers[31]PATCH/bulktransfers/{id} (BulkStatus='COMPLETED')loop[X times for each transfer in bulk message][32]Commit Transfer PATCH/transfers/{id}(TransferStatus='COMMITTED', homeTransactionId)[33]Commit funds[34]Release funds to Payee[35]response[36]response \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPBulkSingleIntegrationApiOnPatch.PlantUML b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPBulkSingleIntegrationApiOnPatch.PlantUML new file mode 100644 index 000000000..438ef1779 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPBulkSingleIntegrationApiOnPatch.PlantUML @@ -0,0 +1,84 @@ +@startuml PayeeDFSPBulkSingleIntegrationApiOnPatch +/'***** +-------------- +******'/ + +skinparam activityFontSize 4 +skinparam activityDiamondFontSize 30 +skinparam activityArrowFontSize 22 +skinparam defaultFontSize 22 +skinparam noteFontSize 22 +skinparam monochrome true +' declare title +' title PayeeDFSPBulkSingleIntegrationApiOnPatch +' declare actors +participant "Mojaloop\nSwitch" as Switch +box "Payment Manager\nPayee DFSP" #LightGrey +participant "SDK Scheme Adapter" as MC +participant "Core\nConnector" as CC +end box +participant "Core banking solution" as CBS +autonumber 1 1 "[0]" + +== Payee DFSP integration - Quote and Transfer - single AML check & transfer during PATCH == + +Switch->MC: **POST** /bulkquotes +MC-->Switch: HTTP 202 Response +loop X times for each transfer in bulk message + MC->CC: **POST** /quoterequest + activate MC + CC->CC: Do nothing + CC-->MC: Response + deactivate MC + MC->MC: Update transaction status \nand attach quote response +end Loop +MC-->Switch: **PUT** /bulkquotes/{Id} + +Switch->Switch: Pass Quote to Payer DFSP +note left +Obtain consent to +proceed with the transfer +Via **POST** /bulktransfers +end note + Switch-> Switch: Perform liquidity(NDC)check + Switch->Switch: Reserve Funds at indivial transfer level + Switch->MC: **POST** /bulktransfers + loop X times for each transfer in bulk message + MC->CC: **POST** /transfers + activate MC + CC->CC: Do Nothing + CC-->MC: response + deactivate MC + MC->MC: Generate Fulfilment + MC -> MC:Update transaction status \nand attach transfer response + end Loop + MC-->Switch: **PUT** /bulktransfers/{id} (BulkStatus='PROCESSING') + Switch-->Switch: Commit funds at indivial transfer level in DFSP ledgers + Switch -> MC: **PATCH** /bulktransfers/{id} (BulkStatus='COMPLETED') + loop X times for each transfer in bulk message + MC->CC: Commit Transfer\n **PATCH** /transfers/{id} (TransferStatus='COMMITTED') + activate MC + CC->CBS: Performn AML checks and transfer funds + alt if (AML checks pass) + CBS->CBS: Release funds to Payee + CBS-->CC: response + CC-->MC: response + else if (AML checks fail) + CBS->CBS: Compensation action for AML failure. \n Return error response. + CBS-->CC: response + CC-->MC: response + deactivate MC + rnote left MC + Payee DFSP AML checks / other errors result in: + + **Reconciliation Error** + Payer has sent funds + Payer DFSP has sent funds + Hub considers that the Payee DFSP has received funds + Payee DFSP has rejected the transaction + Payee has not received funds + endrnote + end + end Loop + +@enduml \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPBulkSingleIntegrationApiOnPatch.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPBulkSingleIntegrationApiOnPatch.svg new file mode 100644 index 000000000..5fe598782 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPBulkSingleIntegrationApiOnPatch.svg @@ -0,0 +1,173 @@ +Payment ManagerPayee DFSPMojaloopSwitchMojaloopSwitchSDK Scheme AdapterSDK Scheme AdapterCoreConnectorCoreConnectorCore banking solutionCore banking solutionPayee DFSP integration - Quote and Transfer - single AML check & transfer during PATCH[1]POST/bulkquotes[2]HTTP 202 Responseloop[X times for each transfer in bulk message][3]POST/quoterequest[4]Do nothing[5]Response[6]Update transaction statusand attach quote response[7]PUT/bulkquotes/{Id}[8]Pass Quote to Payer DFSPObtain consent toproceed with the transferViaPOST/bulktransfers[9]Perform liquidity(NDC)check[10]Reserve Funds at indivial transfer level[11]POST/bulktransfersloop[X times for each transfer in bulk message][12]POST/transfers[13]Do Nothing[14]response[15]Generate Fulfilment[16]Update transaction statusand attach transfer response[17]PUT/bulktransfers/{id} (BulkStatus='PROCESSING')[18]Commit funds at indivial transfer level in DFSP ledgers[19]PATCH/bulktransfers/{id} (BulkStatus='COMPLETED')loop[X times for each transfer in bulk message][20]Commit Transfer PATCH/transfers/{id} (TransferStatus='COMMITTED')[21]Performn AML checks and transfer fundsalt[if (AML checks pass)][22]Release funds to Payee[23]response[24]response[if (AML checks fail)][25]Compensation action for AML failure.Return error response.[26]response[27]responsePayee DFSP AML checks / other errors result in: Reconciliation ErrorPayer has sent fundsPayer DFSP has sent fundsHub considers that the Payee DFSP has received fundsPayee DFSP has rejected the transactionPayee has not received funds \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPIdealPattern.PlantUML b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPIdealPattern.PlantUML new file mode 100644 index 000000000..dace0ab8b --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPIdealPattern.PlantUML @@ -0,0 +1,80 @@ +@startuml PayeeDFSPIdealPattern +/'***** +-------------- +******'/ + +skinparam activityFontSize 4 +skinparam activityDiamondFontSize 30 +skinparam activityArrowFontSize 22 +skinparam defaultFontSize 22 +skinparam noteFontSize 22 +skinparam monochrome true +' declare title +' title PayeeDFSPIdealPattern +' declare actors +participant "Mojaloop\nSwitch" as Switch +box "Payment Manager\nPayee DFSP" #LightGrey +participant "SDK Scheme Adapter" as MC +participant "Core\nConnector" as CC +end box +participant "Core banking solution" as CBS +autonumber 1 1 "[0]" + +== Payee DFSP integration - Discovery == + +Switch->MC: **GET** /parties/{Type}/{Id} +MC-->Switch: HTTP 202 Response +MC->CC: **GET** /parties/{Type}/{Id} +activate MC +CC->CBS: **GET** [account lookup] +CBS-->CC: Response +CC-->MC: Response +deactivate MC +alt If Success response +MC-->Switch: **PUT** /parties/{Type}/{Id} (or /parties/{Type}/{Id}/{SubId}) +else if Error response +MC-->Switch: **PUT** /parties/{Type}/{Id}/error (or /parties/{Type}/{Id}/{SubId}/error) +end + +== Payee DFSP integration - Quote and Transfer - 2 phase commit with prior AML check == + +Switch->MC: **POST** /quotes +MC-->Switch: HTTP 202 Response +MC->CC: **POST** /quoterequest +activate MC +CC->CBS: **AML** checks (velocity,etc...) +CBS-->CC: Response +CC->CBS: **Calculate Fees** +CBS-->CC: Response +CC-->MC: Response +deactivate MC +MC-->Switch: **PUT** /quotes/{Id} +Switch->Switch: Pass Quote to Payer +note left +Obtain consent to +proceed with the transfer +Via **POST** /transfers +end note + Switch-> Switch: Perform liquidity(NDC)check + Switch->Switch: Reserve Funds + Switch->MC: **POST** /transfers + MC->CC: Create & Reserve Transfer\n **POST** /transfers + activate MC + CC->CBS: Reserve funds + CBS-->CC: response (homeTransactionId) + CC-->MC: response (homeTransactionId) + deactivate MC + MC->MC: Generate Fulfilment + MC->Switch: **PUT** /transfers/{id} (TransferStatus='RESERVED', fulfullment) + Switch->Switch: Commit funds in DFSP ledgers + Switch->MC: **PATCH** /transfers/{id} (TransferStatus='COMMITTED') + MC->CC: Commit Transfer\n **PATCH** /transfers/{id} \n(TransferStatus='COMMITTED', homeTransactionId) + activate MC + CC->CBS: Commit funds + CBS->CBS: Release funds to Payee + CBS-->CC: response + CC-->MC: response + deactivate MC + + +@enduml \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPIdealPattern.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPIdealPattern.svg new file mode 100644 index 000000000..577ff3030 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPIdealPattern.svg @@ -0,0 +1,165 @@ +Payment ManagerPayee DFSPMojaloopSwitchMojaloopSwitchSDK Scheme AdapterSDK Scheme AdapterCoreConnectorCoreConnectorCore banking solutionCore banking solutionPayee DFSP integration - Discovery[1]GET/parties/{Type}/{Id}[2]HTTP 202 Response[3]GET/parties/{Type}/{Id}[4]GET[account lookup][5]Response[6]Responsealt[If Success response][7]PUT/parties/{Type}/{Id} (or /parties/{Type}/{Id}/{SubId})[if Error response][8]PUT/parties/{Type}/{Id}/error (or /parties/{Type}/{Id}/{SubId}/error)Payee DFSP integration - Quote and Transfer - 2 phase commit with prior AML check[9]POST/quotes[10]HTTP 202 Response[11]POST/quoterequest[12]AMLchecks (velocity,etc...)[13]Response[14]Calculate Fees[15]Response[16]Response[17]PUT/quotes/{Id}[18]Pass Quote to PayerObtain consent toproceed with the transferViaPOST/transfers[19]Perform liquidity(NDC)check[20]Reserve Funds[21]POST/transfers[22]Create & Reserve Transfer POST/transfers[23]Reserve funds[24]response (homeTransactionId)[25]response (homeTransactionId)[26]Generate Fulfilment[27]PUT/transfers/{id} (TransferStatus='RESERVED', fulfullment)[28]Commit funds in DFSP ledgers[29]PATCH/transfers/{id} (TransferStatus='COMMITTED')[30]Commit Transfer PATCH/transfers/{id}(TransferStatus='COMMITTED', homeTransactionId)[31]Commit funds[32]Release funds to Payee[33]response[34]response \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPSingleIntegrationApiOnPatch.PlantUML b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPSingleIntegrationApiOnPatch.PlantUML new file mode 100644 index 000000000..1f12dce39 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPSingleIntegrationApiOnPatch.PlantUML @@ -0,0 +1,76 @@ +@startuml PayeeDFSPSingleIntegrationApiOnPatchPattern +/'***** +-------------- +******'/ + +skinparam activityFontSize 4 +skinparam activityDiamondFontSize 30 +skinparam activityArrowFontSize 22 +skinparam defaultFontSize 22 +skinparam noteFontSize 22 +skinparam monochrome true +' declare title +' title PayeeDFSPSingleIntegrationApiOnPatch +' declare actors +participant "Mojaloop\nSwitch" as Switch +box "Payment Manager\nPayee DFSP" #LightGrey +participant "SDK Scheme Adapter" as MC +participant "Core\nConnector" as CC +end box +participant "Core banking solution" as CBS +autonumber 1 1 "[0]" +== Payee DFSP integration - Quote and Transfer - single AML check & transfer during PATCH == + +Switch->MC: **POST** /quotes +MC-->Switch: HTTP 202 Response +MC->CC: **POST** /quoterequest +activate MC +CC->CC: Do nothing +CC-->MC: Response +deactivate MC +MC-->Switch: **PUT** /quotes/{Id} + +Switch->Switch: Pass Quote to Payer +note left +Obtain consent to +proceed with the transfer +Via **POST** /transfers +end note + Switch-> Switch: Perform liquidity(NDC)check + Switch->Switch: Reserve Funds + Switch->MC: **POST** /transfers + MC->CC: **POST** /transfers + activate MC + CC->CC: Do Nothing + CC-->MC: response + deactivate MC + MC->MC: Generate Fulfilment + MC-->Switch: **PUT** /transfers/{id} (TransferStatus='RESERVED', fulfullment) + Switch-->Switch: Commit funds in DFSP ledgers + + Switch->MC: **PATCH** /transfers/{id} (TransferStatus='COMMITTED') + MC->CC: Commit Transfer\n **PATCH** /transfers/{id} (TransferStatus='COMMITTED') + activate MC + CC->CBS: Perform AML checks and transfer funds + alt if (AML checks pass) + CBS->CBS: Release funds to Payee + CBS-->CC: response + CC-->MC: response + else if (AML checks fail) + CBS->CBS: Compensation action for AML failure. \n Return error response. + CBS-->CC: response + CC-->MC: response + rnote left MC + Payee DFSP AML error checks (and other errors) result in: + + **Reconciliation Error** + Payer has sent funds + Payer DFSP has sent funds + Hub considers that the Payee DFSP has received funds + Payee DFSP has rejected the transaction + Payee has not received funds + endrnote + end + deactivate MC + +@enduml \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPSingleIntegrationApiOnPatchPattern.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPSingleIntegrationApiOnPatchPattern.svg new file mode 100644 index 000000000..ed8a23a77 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPSingleIntegrationApiOnPatchPattern.svg @@ -0,0 +1,157 @@ +Payment ManagerPayee DFSPMojaloopSwitchMojaloopSwitchSDK Scheme AdapterSDK Scheme AdapterCoreConnectorCoreConnectorCore banking solutionCore banking solutionPayee DFSP integration - Quote and Transfer - single AML check & transfer during PATCH[1]POST/quotes[2]HTTP 202 Response[3]POST/quoterequest[4]Do nothing[5]Response[6]PUT/quotes/{Id}[7]Pass Quote to PayerObtain consent toproceed with the transferViaPOST/transfers[8]Perform liquidity(NDC)check[9]Reserve Funds[10]POST/transfers[11]POST/transfers[12]Do Nothing[13]response[14]Generate Fulfilment[15]PUT/transfers/{id} (TransferStatus='RESERVED', fulfullment)[16]Commit funds in DFSP ledgers[17]PATCH/transfers/{id} (TransferStatus='COMMITTED')[18]Commit Transfer PATCH/transfers/{id} (TransferStatus='COMMITTED')[19]Perform AML checks and transfer fundsalt[if (AML checks pass)][20]Release funds to Payee[21]response[22]response[if (AML checks fail)][23]Compensation action for AML failure.Return error response.[24]response[25]responsePayee DFSP AML error checks (and other errors) result in: Reconciliation ErrorPayer has sent fundsPayer DFSP has sent fundsHub considers that the Payee DFSP has received fundsPayee DFSP has rejected the transactionPayee has not received funds \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPSingleIntegrationApiOnTransfer.PlantUML b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPSingleIntegrationApiOnTransfer.PlantUML new file mode 100644 index 000000000..c9e8b2a41 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPSingleIntegrationApiOnTransfer.PlantUML @@ -0,0 +1,67 @@ +@startuml PayeeDFSPSingleIntegrationApiOnTransferPattern +/'***** +-------------- +******'/ + +skinparam activityFontSize 4 +skinparam activityDiamondFontSize 30 +skinparam activityArrowFontSize 22 +skinparam defaultFontSize 22 +skinparam noteFontSize 22 +skinparam monochrome true +' declare title +' title PayeeDFSPSingleIntegrationApiOnTransfer +' declare actors +participant "Mojaloop\nSwitch" as Switch +box "Payment Manager\nPayee DFSP" #LightGrey +participant "SDK Scheme Adapter" as MC +participant "Core\nConnector" as CC +end box +participant "Core banking solution" as CBS +autonumber 1 1 "[0]" + +== Payee DFSP integration - Quote and Transfer - single AML check & transfer during POST transfer == + +Switch->MC: **POST** /quotes +MC-->Switch: HTTP 202 Response +MC->CC: **POST** /quoterequest +activate MC +CC->CC: Do nothing +CC-->MC: Response +deactivate MC +MC-->Switch: **PUT** /quotes/{Id} + +Switch->Switch: Pass Quote to Payer +note left +Obtain consent to +proceed with the transfer +Via **POST** /transfers +end note + Switch-> Switch: Perform liquidity(NDC)check + Switch->Switch: Reserve Funds + Switch->MC: **POST** /transfers + MC->CC: **POST** /transfers + activate MC + CC->CBS: Perform AML checks and transfer funds + CBS->CBS: Release of funds to Payee + CBS-->CC: response (homeTransactionId) + CC-->MC: response (homeTransactionId) + deactivate MC + MC->MC: Generate Fulfilment + MC-->Switch: **PUT** /transfers/{id} (TransferStatus='RESERVED', fulfullment) + Switch->Switch: Commit funds in DFSP ledgers + alt if (Transfer status == 'ABORTED') + Switch->MC: **PATCH** /transfers/{id} (TransferStatus='ABORTED', homeTransactionId) + MC->CC: Abort Transfer\n **PATCH** /transfers/{id} (TransferStatus='ABORTED') + CC->CBS: Abort Transfer + CBS->CBS: Compensate action for abort + CBS-->CC: response + else if (Transfer status == 'COMMITTED') + Switch->MC: **PATCH** /transfers/{id} (TransferStatus='COMMITTED', homeTransactionId) + MC->CC: **PATCH** /transfers/{id} (TransferStatus='COMMITTED') + CC->CC: Do nothing + CC-->MC: response + end + + +@enduml \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPSingleIntegrationApiOnTransferPattern.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPSingleIntegrationApiOnTransferPattern.svg new file mode 100644 index 000000000..811cbdc15 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayeeDFSPSingleIntegrationApiOnTransferPattern.svg @@ -0,0 +1,139 @@ +Payment ManagerPayee DFSPMojaloopSwitchMojaloopSwitchSDK Scheme AdapterSDK Scheme AdapterCoreConnectorCoreConnectorCore banking solutionCore banking solutionPayee DFSP integration - Quote and Transfer - single AML check & transfer during POST transfer[1]POST/quotes[2]HTTP 202 Response[3]POST/quoterequest[4]Do nothing[5]Response[6]PUT/quotes/{Id}[7]Pass Quote to PayerObtain consent toproceed with the transferViaPOST/transfers[8]Perform liquidity(NDC)check[9]Reserve Funds[10]POST/transfers[11]POST/transfers[12]Perform AML checks and transfer funds[13]Release of funds to Payee[14]response (homeTransactionId)[15]response (homeTransactionId)[16]Generate Fulfilment[17]PUT/transfers/{id} (TransferStatus='RESERVED', fulfullment)[18]Commit funds in DFSP ledgersalt[if (Transfer status == 'ABORTED')][19]PATCH/transfers/{id} (TransferStatus='ABORTED', homeTransactionId)[20]Abort Transfer PATCH/transfers/{id} (TransferStatus='ABORTED')[21]Abort Transfer[22]Compensate action for abort[23]response[if (Transfer status == 'COMMITTED')][24]PATCH/transfers/{id} (TransferStatus='COMMITTED', homeTransactionId)[25]PATCH/transfers/{id} (TransferStatus='COMMITTED')[26]Do nothing[27]response \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPBulkDoubleIntegrationApi.PlantUML b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPBulkDoubleIntegrationApi.PlantUML new file mode 100644 index 000000000..7d193ae2c --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPBulkDoubleIntegrationApi.PlantUML @@ -0,0 +1,100 @@ +@startuml PayerDFSPBulkDoubleIntegrationApiPattern +/'***** +-------------- +******'/ + +skinparam activityFontSize 4 +skinparam activityDiamondFontSize 30 +skinparam activityArrowFontSize 22 +skinparam defaultFontSize 22 +skinparam noteFontSize 22 +skinparam monochrome true +' declare title +' title PayerDFSPBulkDoubleIntegrationApi +' declare actors +participant "Core banking solution" as CBS +box "Payment Manager\nPayer DFSP" #LightGrey +participant "Core\nConnector" as CC +participant "Mojaloop\nConnector" as MC +end box +participant "Mojaloop\nSwitch" as Switch +autonumber 1 1 "[0]" + +== Payer DFSP integration - 2 phase commit - with user confirmation == + +CBS->CC: **POST** /bulkTransactions\n(AUTO_ACCEPT_PARTY = true, AUTO_ACCEPT_QUOTES = **false**, synchronous = false) +Loop n times (in parallel) + hnote left of CC + For each individual transfer + in bulk message + end hnote + CC -> CC: validate MSISDN & Prefix +end Loop +CC->MC: **POST** /bulkTransactions\n(AUTO_ACCEPT_PARTY = true, AUTO_ACCEPT_QUOTES = **false**, synchronous = false) +activate MC +loop N times & within bulkExpiration timelimit (in parallel) +hnote left of MC + For each transfer + in bulk message +end hnote + activate MC + MC->Switch: **GET** /parties/{Type}/{ID}/{SubId} + Switch-->MC: HTTP 202 response + Switch->Switch: Determine Payee DFSP using oracle + Switch->Switch: Lookup Payee Information from Payee DFSP\n using **GET** /parties + Switch->MC: **PUT** /parties/{Type}/{ID}/{SubId} + MC-->Switch: HTTP 200 Response +end Loop + +rnote left MC + Accept Party +endrnote + +loop Quote Processing (M times & within bulkExpiration timelimit in parallel) + hnote left of MC + For each payee DFSP + in bulk message + end hnote + MC->MC: Check bulkExpiration + MC->MC: Create bulkTransactionId + MC -> MC: Calculate bulk expiry \nbased on both expirySeconds config and \nbulkExpiration + MC->Switch: **POST** /bulkquotes + Switch-->MC: HTTP 202 response + Switch->Switch: Pass on quote to Payee DFSP\n using **POST** /bulkquotes + Switch->MC: **PUT** /bulkquotes/{Id} + MC-->Switch: HTTP 200 Response +end loop + MC->CC: **PUT** /bulkTransactions/{Id} + + deactivate MC + CC->CBS: **PUT** /bulkTransactions/{Id} + + +CBS->CBS: Obtain concent from Payer on Fees and Payee Info +CBS->CBS: Reserve funds +CBS->CC: **PUT** /bulkTransactions/{bulkhometransferId} +CC->MC: **PUT** /bulkTransactions/{bulktransactionId} + +loop Transfer Processing (M times & within bulkExpiration timelimit in parallel) + hnote left of MC + For each payee DFSP + in bulk message + end hnote + + activate MC + MC->Switch: **POST** /bulktransfers + Switch-->MC: HTTP 202 response + Switch->Switch: Reserve Payer DFSP funds + Switch->Switch: Pass on transfer to Payee DFSP\n using **POST** /bulktransfers + Switch->Switch: Commit Payer DFSP funds + Switch->MC: **PUT** /bulktransfers/{Id} + MC-->Switch: HTTP 200 Response +end loop + +MC->CC: **PUT** /bulkTransactions/{Id} + +deactivate MC +CC->CBS: **PUT** /bulkTransactions/{Id} +CBS->CBS: Commit funds + +@enduml \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPBulkDoubleIntegrationApiPattern.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPBulkDoubleIntegrationApiPattern.svg new file mode 100644 index 000000000..19e336a0a --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPBulkDoubleIntegrationApiPattern.svg @@ -0,0 +1,205 @@ +Payment ManagerPayer DFSPCore banking solutionCore banking solutionCoreConnectorCoreConnectorMojaloopConnectorMojaloopConnectorMojaloopSwitchMojaloopSwitchPayer DFSP integration - 2 phase commit - with user confirmation[1]POST/bulkTransactions(AUTO_ACCEPT_PARTY = true, AUTO_ACCEPT_QUOTES =false, synchronous = false)loop[n times (in parallel)]For each individual transferin bulk message[2]validate MSISDN & Prefix[3]POST/bulkTransactions(AUTO_ACCEPT_PARTY = true, AUTO_ACCEPT_QUOTES =false, synchronous = false)loop[N times & within bulkExpiration timelimit (in parallel)]For each transferin bulk message[4]GET/parties/{Type}/{ID}/{SubId}[5]HTTP 202 response[6]Determine Payee DFSP using oracle[7]Lookup Payee Information from Payee DFSPusingGET/parties[8]PUT/parties/{Type}/{ID}/{SubId}[9]HTTP 200 ResponseAccept Partyloop[Quote Processing (M times & within bulkExpiration timelimit in parallel)]For each payee DFSPin bulk message[10]Check bulkExpiration[11]Create bulkTransactionId[12]Calculate bulk expirybased on both expirySeconds config andbulkExpiration[13]POST/bulkquotes[14]HTTP 202 response[15]Pass on quote to Payee DFSPusingPOST/bulkquotes[16]PUT/bulkquotes/{Id}[17]HTTP 200 Response[18]PUT/bulkTransactions/{Id}[19]PUT/bulkTransactions/{Id}[20]Obtain concent from Payer on Fees and Payee Info[21]Reserve funds[22]PUT/bulkTransactions/{bulkhometransferId}[23]PUT/bulkTransactions/{bulktransactionId}loop[Transfer Processing (M times & within bulkExpiration timelimit in parallel)]For each payee DFSPin bulk message[24]POST/bulktransfers[25]HTTP 202 response[26]Reserve Payer DFSP funds[27]Pass on transfer to Payee DFSPusingPOST/bulktransfers[28]Commit Payer DFSP funds[29]PUT/bulktransfers/{Id}[30]HTTP 200 Response[31]PUT/bulkTransactions/{Id}[32]PUT/bulkTransactions/{Id}[33]Commit funds \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPBulkSingleIntegrationApi.PlantUML b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPBulkSingleIntegrationApi.PlantUML new file mode 100644 index 000000000..38e3d8d6c --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPBulkSingleIntegrationApi.PlantUML @@ -0,0 +1,95 @@ +@startuml PayerDFSPBulkSingleIntegrationApiPattern +/'***** +-------------- +******'/ + +skinparam activityFontSize 4 +skinparam activityDiamondFontSize 30 +skinparam activityArrowFontSize 22 +skinparam defaultFontSize 22 +skinparam noteFontSize 22 +skinparam monochrome true +' declare title +' title PayerDFSPBulkSingleIntegrationApi +' declare actors +participant "Core banking solution" as CBS +box "Payment Manager\nPayer DFSP" #LightGrey +participant "Core\nConnector" as CC +participant "SDK Scheme Adapter" as MC +end box +participant "Mojaloop\nSwitch" as Switch +autonumber 1 1 "[0]" + +== Payer DFSP integration - 2 phase commit - single phase == + +CBS->CBS: Reserve funds +CBS->CC: **POST** /bulkTransactions \n(AUTO_ACCEPT_PARTY = true, AUTO_ACCEPT_QUOTES = true, synchronous = false) +Loop n times (in parallel) + hnote left of CC + For each individual transfer + in bulk message + end hnote + CC -> CC: validate MSISDN & Prefix +end Loop +CC->MC: **POST** /bulkTransactions \n(AUTO_ACCEPT_PARTY = true, AUTO_ACCEPT_QUOTES = true, synchronous = false) +activate MC +loop N times & within bulkExpiration timelimit (in parallel) +hnote left of MC + For each transfer + in bulk message +end hnote + MC->Switch: **GET** /parties/{Type}/{ID}/{SubId} + Switch-->MC: HTTP 202 response + Switch->Switch: Determine Payee DFSP using oracle + Switch->Switch: Lookup Payee Information from Payee DFSP\n using **GET** /parties + Switch->MC: **PUT** /parties/{Type}/{ID}/{SubId} + MC-->Switch: HTTP 200 Response + MC -> MC: Update transaction status and\n attach get parties response + MC -> MC: Add to next phase FSP bulk call +end Loop + +rnote left MC + Accept Party +endrnote + +loop Quote Processing (M times & within bulkExpiration timelimit in parallel) + hnote left of MC + For each payee DFSP + in bulk message + end hnote + MC->MC: Check bulkExpiration + MC->MC: Create bulkTransactionId + MC -> MC: Calculate bulk expiry \nbased on both expirySeconds config and \nbulkExpiration + MC->Switch: **POST** /bulkquotes + Switch-->MC: HTTP 202 response + Switch->Switch: Pass on bulkquote to Payee DFSP\n using **POST** /bulkquotes + Switch->MC: **PUT** /bulkquotes/{Id} + MC-->Switch: HTTP 200 Response +end loop + +rnote left MC + Accept Quote +endrnote +loop Transfer Processing (M times & within bulkExpiration timelimit in parallel) + hnote left of MC + For each payee DFSP + in bulk message + end hnote + MC -> MC: Confirm Fees meets auto accept levels\n and bulkExpiration timelimit not reached \n-> Update Transfer Status + + MC->Switch: **POST** /bulktransfers + Switch-->MC: HTTP 202 response + Switch->Switch: Reserve Payer DFSP funds + Switch->Switch: Pass on transfer to Payee DFSP\n using **POST** /bulktransfers + Switch->Switch: Commit Payer DFSP funds + Switch->MC: **PUT** /bulktransfers/{Id} + MC-->Switch: HTTP 200 Response +end loop + +MC->CC: **PUT** /bulkTransactions/{Id} + +deactivate MC +CC->CBS: **PUT** /bulkTransactions/{Id} +CBS->CBS: Commit funds + +@enduml \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPBulkSingleIntegrationApiPattern.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPBulkSingleIntegrationApiPattern.svg new file mode 100644 index 000000000..e136c59bd --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPBulkSingleIntegrationApiPattern.svg @@ -0,0 +1,195 @@ +Payment ManagerPayer DFSPCore banking solutionCore banking solutionCoreConnectorCoreConnectorSDK Scheme AdapterSDK Scheme AdapterMojaloopSwitchMojaloopSwitchPayer DFSP integration - 2 phase commit - single phase[1]Reserve funds[2]POST/bulkTransactions(AUTO_ACCEPT_PARTY = true, AUTO_ACCEPT_QUOTES = true, synchronous = false)loop[n times (in parallel)]For each individual transferin bulk message[3]validate MSISDN & Prefix[4]POST/bulkTransactions(AUTO_ACCEPT_PARTY = true, AUTO_ACCEPT_QUOTES = true, synchronous = false)loop[N times & within bulkExpiration timelimit (in parallel)]For each transferin bulk message[5]GET/parties/{Type}/{ID}/{SubId}[6]HTTP 202 response[7]Determine Payee DFSP using oracle[8]Lookup Payee Information from Payee DFSPusingGET/parties[9]PUT/parties/{Type}/{ID}/{SubId}[10]HTTP 200 Response[11]Update transaction status andattach get parties response[12]Add to next phase FSP bulk callAccept Partyloop[Quote Processing (M times & within bulkExpiration timelimit in parallel)]For each payee DFSPin bulk message[13]Check bulkExpiration[14]Create bulkTransactionId[15]Calculate bulk expirybased on both expirySeconds config andbulkExpiration[16]POST/bulkquotes[17]HTTP 202 response[18]Pass on bulkquote to Payee DFSPusingPOST/bulkquotes[19]PUT/bulkquotes/{Id}[20]HTTP 200 ResponseAccept Quoteloop[Transfer Processing (M times & within bulkExpiration timelimit in parallel)]For each payee DFSPin bulk message[21]Confirm Fees meets auto accept levelsand bulkExpiration timelimit not reached-> Update Transfer Status[22]POST/bulktransfers[23]HTTP 202 response[24]Reserve Payer DFSP funds[25]Pass on transfer to Payee DFSPusingPOST/bulktransfers[26]Commit Payer DFSP funds[27]PUT/bulktransfers/{Id}[28]HTTP 200 Response[29]PUT/bulkTransactions/{Id}[30]PUT/bulkTransactions/{Id}[31]Commit funds \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPDoubleIntegrationApiPattern.PlantUML b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPDoubleIntegrationApiPattern.PlantUML new file mode 100644 index 000000000..540789924 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPDoubleIntegrationApiPattern.PlantUML @@ -0,0 +1,66 @@ +@startuml PayerDFSPDoubleIntegrationApiPattern +/'***** +-------------- +******'/ + +skinparam activityFontSize 4 +skinparam activityDiamondFontSize 30 +skinparam activityArrowFontSize 22 +skinparam defaultFontSize 22 +skinparam noteFontSize 22 +skinparam monochrome true +' declare title +' title Core-Connector transactional flow patterns +' declare actors +participant "Core banking solution" as CBS +box "Payment Manager\nPayer DFSP" #LightGrey +participant "Core\nConnector" as CC +participant "SDK Scheme Adapter" as MC +end box +participant "Mojaloop\nSwitch" as Switch +autonumber 1 1 "[0]" + +== Payer DFSP integration - 2 phase commit - with user confirmation == + +CBS->CC: **POST** /sendMoney \n(AUTO_ACCEPT_PARTY = true, AUTO_ACCEPT_QUOTES = **false**) +CC->MC: **POST** /transfers +activate MC +MC->Switch: **GET** /parties/{Type}/{ID}/{SubId} +Switch-->MC: HTTP 202 response +Switch->Switch: Determine Payee DFSP using oracle +Switch->Switch: Lookup Payee Information from Payee DFSP\n using **GET** /parties +Switch->MC: **PUT** /parties/{Type}/{ID}/{SubId} +MC-->Switch: HTTP 200 Response +rnote left MC + Accept Party +endrnote +MC->Switch: **POST** /quotes +Switch-->MC: HTTP 202 response +Switch->Switch: Pass on quote to Payee DFSP\n using **POST** /quotes +Switch->MC: **PUT** /quotes/{Id} +MC-->Switch: HTTP 200 Response +MC-->CC: Response +deactivate MC +CC-->CBS: Response +CBS->CBS: Obtain concent from Payer on Fees and Payee Info +CBS->CBS: Reserve funds +CBS->CC: **PUT** /sendmoney/{transferId} +CC->MC: **PUT** /transfers + +activate MC +MC->Switch: **POST** /transfers +Switch-->MC: HTTP 202 response +Switch->Switch: Reserve Payer DFSP funds +Switch->Switch: Pass on transfer to Payee DFSP\n using **POST** /transfers +Switch->Switch: Commit Payer DFSP funds +Switch->MC: **PUT** /transfers/{Id} +MC-->Switch: HTTP 200 Response +MC-->CC: response +deactivate MC +CC-->CBS: response +alt if (transferStatus== 'COMMITTED') +CBS->CBS: Finalise transfer +else else +CBS->CBS: Rollback transfer +end +@enduml \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPDoubleIntegrationApiPattern.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPDoubleIntegrationApiPattern.svg new file mode 100644 index 000000000..175a64e31 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPDoubleIntegrationApiPattern.svg @@ -0,0 +1,137 @@ +Payment ManagerPayer DFSPCore banking solutionCore banking solutionCoreConnectorCoreConnectorSDK Scheme AdapterSDK Scheme AdapterMojaloopSwitchMojaloopSwitchPayer DFSP integration - 2 phase commit - with user confirmation[1]POST/sendMoney(AUTO_ACCEPT_PARTY = true, AUTO_ACCEPT_QUOTES =false)[2]POST/transfers[3]GET/parties/{Type}/{ID}/{SubId}[4]HTTP 202 response[5]Determine Payee DFSP using oracle[6]Lookup Payee Information from Payee DFSPusingGET/parties[7]PUT/parties/{Type}/{ID}/{SubId}[8]HTTP 200 ResponseAccept Party[9]POST/quotes[10]HTTP 202 response[11]Pass on quote to Payee DFSPusingPOST/quotes[12]PUT/quotes/{Id}[13]HTTP 200 Response[14]Response[15]Response[16]Obtain concent from Payer on Fees and Payee Info[17]Reserve funds[18]PUT/sendmoney/{transferId}[19]PUT/transfers[20]POST/transfers[21]HTTP 202 response[22]Reserve Payer DFSP funds[23]Pass on transfer to Payee DFSPusingPOST/transfers[24]Commit Payer DFSP funds[25]PUT/transfers/{Id}[26]HTTP 200 Response[27]response[28]responsealt[if (transferStatus== 'COMMITTED')][29]Finalise transfer[else][30]Rollback transfer \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPSingleIntegrationApiPattern.PlantUML b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPSingleIntegrationApiPattern.PlantUML new file mode 100644 index 000000000..4884dec9c --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPSingleIntegrationApiPattern.PlantUML @@ -0,0 +1,63 @@ +@startuml PayerDFSPSingleIntegrationApiPattern +/'***** +-------------- +******'/ + +skinparam activityFontSize 4 +skinparam activityDiamondFontSize 30 +skinparam activityArrowFontSize 22 +skinparam defaultFontSize 22 +skinparam noteFontSize 22 +skinparam monochrome true +' declare title +' title Payer DFSP Single Phase Integration Pattern +' declare actors +participant "Core banking solution" as CBS +box "Payment Manager" #LightGrey +participant "Core\nConnector" as CC +participant "SDK Scheme Adapter" as MC +end box +participant "Mojaloop\nSwitch" as Switch +autonumber 1 1 "[0]" + +== Payer DFSP integration - 2 phase commit - single phase == + +CBS->CBS: Reserve funds +CBS->CC: **POST** /sendMoney \n(AUTO_ACCEPT_PARTY = true, AUTO_ACCEPT_QUOTES = true) +CC->MC: **POST** /transfers +activate MC +MC->Switch: **GET** /parties/{Type}/{ID}/{SubId} +Switch-->MC: HTTP 202 response +Switch->Switch: Determine Payee DFSP using oracle +Switch->Switch: Lookup Payee Information from Payee DFSP\n using **GET** /parties +Switch->MC: **PUT** /parties/{Type}/{ID}/{SubId} +MC-->Switch: HTTP 200 Response +rnote left MC + Accept Party +endrnote +MC->Switch: **POST** /quotes +Switch-->MC: HTTP 202 response +Switch->Switch: Pass on quote to Payee DFSP\n using **POST** /quotes +Switch->MC: **PUT** /quotes/{Id} +MC-->Switch: HTTP 200 Response +rnote left MC + Accept Quote +endrnote +MC->Switch: **POST** /transfers +Switch-->MC: HTTP 202 response +Switch->Switch: Reserve Payer DFSP funds +Switch->Switch: Pass on transfer to Payee DFSP\n using **POST** /transfers +Switch->Switch: Calculate fees +Switch->Switch: Commit Payer DFSP funds +Switch->MC: **PUT** /transfers/{Id} +MC-->Switch: HTTP 200 Response +MC-->CC: response +deactivate MC +CC-->CBS: response +alt if (transferStatus== 'COMMITTED') +CBS->CBS: Finalise transfer +else else +CBS->CBS: Rollback transfer +end + +@enduml \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPSingleIntegrationApiPattern.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPSingleIntegrationApiPattern.svg new file mode 100644 index 000000000..8c3b55365 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/PayerDFSPSingleIntegrationApiPattern.svg @@ -0,0 +1,131 @@ +Payment ManagerCore banking solutionCore banking solutionCoreConnectorCoreConnectorSDK Scheme AdapterSDK Scheme AdapterMojaloopSwitchMojaloopSwitchPayer DFSP integration - 2 phase commit - single phase[1]Reserve funds[2]POST/sendMoney(AUTO_ACCEPT_PARTY = true, AUTO_ACCEPT_QUOTES = true)[3]POST/transfers[4]GET/parties/{Type}/{ID}/{SubId}[5]HTTP 202 response[6]Determine Payee DFSP using oracle[7]Lookup Payee Information from Payee DFSPusingGET/parties[8]PUT/parties/{Type}/{ID}/{SubId}[9]HTTP 200 ResponseAccept Party[10]POST/quotes[11]HTTP 202 response[12]Pass on quote to Payee DFSPusingPOST/quotes[13]PUT/quotes/{Id}[14]HTTP 200 ResponseAccept Quote[15]POST/transfers[16]HTTP 202 response[17]Reserve Payer DFSP funds[18]Pass on transfer to Payee DFSPusingPOST/transfers[19]Calculate fees[20]Commit Payer DFSP funds[21]PUT/transfers/{Id}[22]HTTP 200 Response[23]response[24]responsealt[if (transferStatus== 'COMMITTED')][25]Finalise transfer[else][26]Rollback transfer \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/SDKBulkSequenceDiagram.plantuml b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/SDKBulkSequenceDiagram.plantuml new file mode 100644 index 000000000..362d9c085 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/SDKBulkSequenceDiagram.plantuml @@ -0,0 +1,132 @@ +@startuml +/'******** +-------------- +*********'/ + +skinparam activityFontSize 4 +skinparam activityDiamondFontSize 30 +skinparam activityArrowFontSize 22 +skinparam defaultFontSize 22 +skinparam noteFontSize 22 +skinparam monochrome true +' declare title +' title Bulk Transactions pattern using the Mojaloop Connector +' declare actors + +box "Payer DFSP" #LightGrey + participant "Backend System" as MFICC + participant "sdk-scheme-adapter" as MFIMC +end box +participant "Mojaloop\nSwitch" as MJW +box "Payee DFSP" #LightGrey + participant "sdk-scheme-adapter" as PayeeFSPMC + participant "Backend System" as PayeeFSPCC +end box + +== MVP Bulk Transfers using SDK-Scheme-Adapter == + +autonumber 1 1 "[0]" +MFICC->>MFIMC: **POST** /bulkTransactions +note left +Bulk Disbursement is triggerd +by beneficiary management sub-system +end note + +loop Discovery Processing: For each individualTransfer in bulk message +hnote left of MFIMC + Resolving all potential recipients + which might be at any of the DFSPs + on the service. +end hnote + MFIMC ->> MJW: **GET** /parties/* + activate MFIMC + MJW->MJW: query oracle to \ndetermine Payee DFSP + MJW->>PayeeFSPMC: **GET** /parties/* + PayeeFSPMC->PayeeFSPCC: **GET** /parties/* + note right + Lookup / validate party information + end note + PayeeFSPMC-->>MJW: **PUT** /parties/{type}/{id} + MJW-->>MFIMC: **PUT** /parties/{type}/{id} + deactivate MFIMC + +end Loop + MFIMC-->>MFICC: **PUT** /bulkTransactions/{bulkTransactionId} + MFICC->>MFIMC: **PUT** /bulkTransactions/{bulkTransactionId} + note left + Confirmation of party integration + end note + +MFIMC->MFIMC: Group Valid Transfers into batches +loop Agreement Processing: For each batch in bulk message +hnote left of MFIMC + Each DFSP is provided the opportunity to + perform AML checks and add costs + or discounts to each transfer. +end hnote + MFIMC ->> MJW: **POST** /bulkquotes + activate MFIMC + MJW->>PayeeFSPMC: **POST** /bulkquotes + alt if (HasSupportForBulkQuotes) + PayeeFSPMC->PayeeFSPCC: **POST** /bulkquotes + note right + Bulk AML checks + Bulk Fee calculations + end note + else if (!HasSupportForBulkQuotes) + loop X times for each transfer in bulk message + PayeeFSPMC->PayeeFSPCC: **POST** /quoterequests + note right + AML checks + Fee calculations + end note + end Loop + end + PayeeFSPMC-->>MJW: **PUT** /bulkquotes/{id) + MJW-->>MFIMC: **PUT** /bulkquotes/{id) + deactivate MFIMC +end loop + + MFIMC-->>MFICC: **PUT** /bulkTransactions/{bulkTransactionId} + MFICC->>MFIMC: **PUT** /bulkTransactions/{bulkTransactionId} + note left + confirmation of quote integration + end note + +loop Transfer Processing: For each batch in bulk message + hnote left of MFIMC + Each DFSP is messaged to proceed + with the transfer. Results + are captured and returned. + end hnote + MFIMC ->> MJW: **POST** /bulktransfers + activate MFIMC + MJW-> MJW: Perform liquidity(NDC) check\n at individual transfer level + MJW->MJW: Reserve Funds + MJW ->> PayeeFSPMC: **POST** /bulktransfers + alt if (HasSupportForBulkTransfers) + PayeeFSPMC->PayeeFSPCC: **POST** /bulktransfers + note right + Bulk Transfer integration + end note + else if (!HasSupportForBulkTransfers) + loop X times for each transfer in bulk message + PayeeFSPMC->PayeeFSPCC: **POST** /transfers + note right + Single Transfer integration + end note + end Loop + end + PayeeFSPMC -->> MJW: **PUT** /bulktransfers/{id} (BulkStatus) + MJW->MJW: Commit funds at indivial transfer level + MJW-->>MFIMC:**PUT** /bulktransfers/{id} + + deactivate MFIMC +end loop +MFIMC-->>MFICC:Callback Response \n**PUT** /bulkTransactions/{bulkTransactionId}\nTransfer Response (success & fail) +note left + Result of bulk disbursement received. +end note + + +@enduml \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/SDKBulkSequenceDiagram.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/SDKBulkSequenceDiagram.svg new file mode 100644 index 000000000..a6fc96ca3 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/SDKBulkSequenceDiagram.svg @@ -0,0 +1,295 @@ + + + + + Payer DFSP + + Payee DFSP + + + + + + + + + + + + + + + + + Backend System + + Backend System + + sdk-scheme-adapter + + sdk-scheme-adapter + + Mojaloop + Switch + + Mojaloop + Switch + + sdk-scheme-adapter + + sdk-scheme-adapter + + Backend System + + Backend System + + + + + + + + MVP Bulk Transfers using SDK-Scheme-Adapter + + + + [1] + POST + /bulkTransactions + + + Bulk Disbursement is triggerd + by beneficiary management sub-system + + + loop + [Discovery Processing: For each individualTransfer in bulk message] + + Resolving all potential recipients + which might be at any of the DFSPs + on the service. + + + + [2] + GET + /parties/* + + + + + [3] + query oracle to + determine Payee DFSP + + + + [4] + GET + /parties/* + + + [5] + GET + /parties/* + + + Lookup / validate party information + + + + [6] + PUT + /parties/{type}/{id} + + + + [7] + PUT + /parties/{type}/{id} + + + + [8] + PUT + /bulkTransactions/{bulkTransactionId} + + + + [9] + PUT + /bulkTransactions/{bulkTransactionId} + + + Confirmation of party integration + + + + + [10] + Group Valid Transfers into batches + + + loop + [Agreement Processing: For each batch in bulk message] + + Each DFSP is provided the opportunity to + perform AML checks and add costs + or discounts to each transfer. + + + + [11] + POST + /bulkquotes + + + + [12] + POST + /bulkquotes + + + alt + [if (HasSupportForBulkQuotes)] + + + [13] + POST + /bulkquotes + + + Bulk AML checks + Bulk Fee calculations + + [if (!HasSupportForBulkQuotes)] + + + loop + [X times for each transfer in bulk message] + + + [14] + POST + /quoterequests + + + AML checks + Fee calculations + + + + [15] + PUT + /bulkquotes/{id) + + + + [16] + PUT + /bulkquotes/{id) + + + + [17] + PUT + /bulkTransactions/{bulkTransactionId} + + + + [18] + PUT + /bulkTransactions/{bulkTransactionId} + + + confirmation of quote integration + + + loop + [Transfer Processing: For each batch in bulk message] + + Each DFSP is messaged to proceed + with the transfer. Results + are captured and returned. + + + + [19] + POST + /bulktransfers + + + + + [20] + Perform liquidity(NDC) check + at individual transfer level + + + + + [21] + Reserve Funds + + + + [22] + POST + /bulktransfers + + + alt + [if (HasSupportForBulkTransfers)] + + + [23] + POST + /bulktransfers + + + Bulk Transfer integration + + [if (!HasSupportForBulkTransfers)] + + + loop + [X times for each transfer in bulk message] + + + [24] + POST + /transfers + + + Single Transfer integration + + + + [25] + PUT + /bulktransfers/{id} (BulkStatus) + + + + + [26] + Commit funds at indivial transfer level + + + + [27] + PUT + /bulktransfers/{id} + + + + [28] + Callback Response + PUT + /bulkTransactions/{bulkTransactionId} + Transfer Response (success & fail) + + + Result of bulk disbursement received. + + diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/SDKrequestToPay.plantuml b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/SDKrequestToPay.plantuml new file mode 100644 index 000000000..2485c6f54 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/SDKrequestToPay.plantuml @@ -0,0 +1,195 @@ +@startuml + +actor "Payer" as Payer +box Payer DFSP +participant "Core Banking System" as PayerDFSP +participant "SDK" as PayerSDK +end box +participant "Mojaloop" as Mojaloop #d4f2f9 + +box Payee DFSP +participant "SDK" as PayeeSDK +participant "Core Banking System" as PayeeDFSP +end box +actor "Payee" as Payee +autonumber 1 "[0]" + +alt if (User Initiated OTP) +Payer->PayerDFSP: Generate an OTP for me +PayerDFSP->PayerDFSP:Generate +PayerDFSP-->Payer: Here is your OTP +end +=== Payee initiated request to pay (R2P) == +Payee->PayeeDFSP: I would like \nto receive 1000 TZS\n from +1234567890 +PayeeDFSP->PayeeDFSP: Payer not within Payee System + +PayeeDFSP->PayeeSDK: **POST** /requestToPayTransfer +note right +{ + "requestToPayTransactionId": "string", + "from": { + "type": "CONSUMER", + "idType": "MSISDN", + "idValue": "+1234567890", + "idSubValue": "string" + }, + "to": {...}, + "amountType": "RECEIVE", + "currency": "TZS", + "amount": "1000.0", + "scenario": {...}, + "initiator": "PAYEE", + "initiatorType": "CONSUMER", + "note": "Note sent to Payee." +} +end note +activate PayeeSDK + +PayeeSDK->>Mojaloop: **GET** /parties +Mojaloop->>PayerSDK: **GET** /parties +PayerSDK->PayerDFSP: **GET** /parties +PayerDFSP->PayerDFSP: Lookup Validate Payer Account +PayerDFSP-->PayerSDK: return Payer information +note left +Payer information +end note +PayerSDK->>Mojaloop: **PUT** /parties +Mojaloop->>PayeeSDK: **PUT** /parties + +alt If AutoAcceptParty = false + PayeeSDK-->PayeeDFSP: **POST**\n /requestToPayTransfer \n(synchronous return) + note left +{ + "requestToPayTransactionId": "string", + "from": { + "type": "CONSUMER", + "idType": "MSISDN", + "idValue": "1234567890", + "idSubValue": "string", + "displayName": "ryZ037pWP'lHu,Tu9,Tjl MRMbdMSpRGAHt4m6 2jk5L4'ePRWT", + "firstName": "Henrik", + "middleName": "Johannes", + "lastName": "Karlsson", + "dateOfBirth": "1966-06-16", + "fspId": "string", + "extensionList": [] + }, + "to": {...}, + "amountType": "RECEIVE", + "currency": "TZS", + "amount": "1000.0", + "transactionType": "TRANSFER", + "note": "Note sent to Payee.", + "currentState": "WAITING_FOR_PARTY_ACCEPTANCE", +} + end note +PayeeDFSP->PayeeSDK: **PUT** /requestToPay/\n{requestToPayId} +note right + { + acceptParty: true + } +end note +else +PayeeSDK->PayeeSDK: Automatically \nAcceptParty by updating\n status +end + +PayeeSDK->>Mojaloop: **POST** /transactionRequests +Mojaloop->>PayerSDK: **POST** /transactionRequests +PayerSDK->PayerDFSP: **POST** /transactionRequests +PayerDFSP->PayerDFSP: Validate request\n to pay request +PayerDFSP-->PayerSDK: return +PayerSDK->>Mojaloop: **PUT** /transactionRequests/{ID} +note left +{ + "transactionId": "b51ec534-ee48-4575-b6a9-ead2955b8069", + "transactionRequestState": "RECEIVED", + "AuthenticationType": {} + "extensionList": {extension:[]} +} +end note +Mojaloop->>PayeeSDK: **PUT** /transactionRequests +PayeeSDK-->PayeeDFSP: return +deactivate PayeeSDK + +=== Payer DFSP executes R2P request == + +PayerDFSP->PayerSDK: **POST** /RequestToPayTransfer +note left +Initiate R2P with AuthType +end note +activate PayerSDK +PayerSDK->>Mojaloop: **POST** /quotes +Mojaloop->>PayeeSDK: **POST** /quotes +PayeeSDK->PayeeDFSP: **POST** /quoterequest +PayeeDFSP->PayeeSDK: return quote +PayeeSDK->>Mojaloop: **PUT** /quotes +Mojaloop->>PayerSDK: **PUT** /quotes + +PayerSDK-->PayerDFSP: return \n(**POST** /RequestToPayTransfer) +deactivate PayerSDK + +alt if AuthenticateType is null +PayerDFSP->Payer: Present payment terms\n to Payer for acceptance +Payer->PayerDFSP: I accept the payment terms +else if AuthenticateType is OTP +alt if (Automatic generated OTP) + +PayerDFSP->PayerDFSP: Generate OTP +PayerDFSP->Payer: Present OTP to Payer +end + +loop x retries +PayerDFSP->PayerSDK: **PUT** /RequestToPayTransfer +note left + accept quote = true + retries left = x +end note + +PayerSDK->>Mojaloop: **GET** \n/authorizations/\n{transactionRequestID} +Mojaloop->>PayeeSDK: **GET** \n/authorizations/\n{transactionRequestID} +PayeeSDK->PayeeDFSP: **GET** \n/auth/{authtype}/{requestToPayId} +PayeeDFSP->Payee: Get Payee to get\n Payer to enter OTP\n on POS +Payer->PayeeDFSP: Enter OTP +PayeeDFSP-->PayeeSDK: return OTP +note right +{ + "otpValue": "string" +} +end note +PayeeSDK->>Mojaloop: **PUT** /authorizations/{ID} +Mojaloop->>PayerSDK: **PUT** /authorizations/{ID} +PayerSDK-->PayerDFSP: synchronous return \n **POST** /requestToPayTransfer/\n{requestToPayTransactionId} +PayerDFSP->PayerDFSP: Validate OTP + +end loop + +end + + + +alt if can proceed with transfer +PayerDFSP->PayerDFSP: Reserve funds against \nPayer's account +PayerDFSP-->PayerSDK: **PUT** \n/requestToPayTransfer/\n{requestToPayTransactionId} + +PayerSDK->>Mojaloop: **POST** /transfers +activate PayerSDK +Mojaloop->>PayeeSDK: **POST** /transfers +PayeeSDK-->PayeeDFSP: **PUT** / **POST**\n /requestToPayTransfer/\n{requestToPayTransactionId}\n return +PayeeDFSP->Payee: Notify user +PayeeSDK->>Mojaloop: **PUT** /transfers \nreturn fulfilment +Mojaloop->>PayerSDK: **PUT** /transfers +deactivate PayerSDK +PayerSDK->PayerDFSP: **POST** \n/newAPI \nNotify payer of transfer +PayerDFSP->PayerDFSP: Commit transfer \nto Payer's account +PayerDFSP->Payer: Notify Payer + +else if rejected + +PayerDFSP-->PayerSDK: return +PayerSDK->>Mojaloop: **PUT** \n/requestToPayTransfer/\n{requestToPayTransactionId}\n rejected +Mojaloop->>PayeeSDK: **PUT**\n /requestToPayTransfer/\n{requestToPayTransactionId}\n rejected +PayeeSDK-->X PayeeDFSP: return rejected +end + + +@enduml \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/SDKrequestToPay.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/SDKrequestToPay.svg new file mode 100644 index 000000000..f734170e5 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/SDKrequestToPay.svg @@ -0,0 +1,532 @@ + + + + + Payer DFSP + + Payee DFSP + + + + + + + + + + + + + + + + + Payer + + + Payer + + + + Core Banking System + + Core Banking System + + SDK + + SDK + + Mojaloop + + Mojaloop + + SDK + + SDK + + Core Banking System + + Core Banking System + Payee + + + Payee + + + + + + + + alt + [if (User Initiated OTP)] + + + [1] + Generate an OTP for me + + + + + [2] + Generate + + + [3] + Here is your OTP + + + + + Payee initiated request to pay (R2P) + + + [4] + I would like + to receive 1000 TZS + from +1234567890 + + + + + [5] + Payer not within Payee System + + + [6] + POST + /requestToPayTransfer + + + { + "requestToPayTransactionId": "string", + "from": { + "type": "CONSUMER", + "idType": "MSISDN", + "idValue": "+1234567890", + "idSubValue": "string" + }, + "to": {...}, + "amountType": "RECEIVE", + "currency": "TZS", + "amount": "1000.0", + "scenario": {...}, + "initiator": "PAYEE", + "initiatorType": "CONSUMER", + "note": "Note sent to Payee." + } + + + + [7] + GET + /parties + + + + [8] + GET + /parties + + + [9] + GET + /parties + + + + + [10] + Lookup Validate Payer Account + + + [11] + return Payer information + + + Payer information + + + + [12] + PUT + /parties + + + + [13] + PUT + /parties + + + alt + [If AutoAcceptParty = false] + + + [14] + POST + /requestToPayTransfer + (synchronous return) + + + { + "requestToPayTransactionId": "string", + "from": { + "type": "CONSUMER", + "idType": "MSISDN", + "idValue": "1234567890", + "idSubValue": "string", + "displayName": "ryZ037pWP'lHu,Tu9,Tjl MRMbdMSpRGAHt4m6 2jk5L4'ePRWT", + "firstName": "Henrik", + "middleName": "Johannes", + "lastName": "Karlsson", + "dateOfBirth": "1966-06-16", + "fspId": "string", + "extensionList": [] + }, + "to": {...}, + "amountType": "RECEIVE", + "currency": "TZS", + "amount": "1000.0", + "transactionType": "TRANSFER", + "note": "Note sent to Payee.", + "currentState": "WAITING_FOR_PARTY_ACCEPTANCE", + } + + + [15] + PUT + /requestToPay/ + {requestToPayId} + + + { + acceptParty: true + } + + + + + + [16] + Automatically + AcceptParty by updating + status + + + + [17] + POST + /transactionRequests + + + + [18] + POST + /transactionRequests + + + [19] + POST + /transactionRequests + + + + + [20] + Validate request + to pay request + + + [21] + return + + + + [22] + PUT + /transactionRequests/{ID} + + + { + "transactionId": "b51ec534-ee48-4575-b6a9-ead2955b8069", + "transactionRequestState": "RECEIVED", + "AuthenticationType": {} + "extensionList": {extension:[]} + } + + + + [23] + PUT + /transactionRequests + + + [24] + return + + + + + Payer DFSP executes R2P request + + + [25] + POST + /RequestToPayTransfer + + + Initiate R2P with AuthType + + + + [26] + POST + /quotes + + + + [27] + POST + /quotes + + + [28] + POST + /quoterequest + + + [29] + return quote + + + + [30] + PUT + /quotes + + + + [31] + PUT + /quotes + + + [32] + return + ( + POST + /RequestToPayTransfer) + + + alt + [if AuthenticateType is null] + + + [33] + Present payment terms + to Payer for acceptance + + + [34] + I accept the payment terms + + [if AuthenticateType is OTP] + + + alt + [if (Automatic generated OTP)] + + + + + [35] + Generate OTP + + + [36] + Present OTP to Payer + + + loop + [x retries] + + + [37] + PUT + /RequestToPayTransfer + + + accept quote = true + retries left = x + + + + [38] + GET +   + /authorizations/ + {transactionRequestID} + + + + [39] + GET +   + /authorizations/ + {transactionRequestID} + + + [40] + GET +   + /auth/{authtype}/{requestToPayId} + + + [41] + Get Payee to get + Payer to enter OTP + on POS + + + [42] + Enter OTP + + + [43] + return OTP + + + { + "otpValue": "string" + } + + + + [44] + PUT + /authorizations/{ID} + + + + [45] + PUT + /authorizations/{ID} + + + [46] + synchronous return +   + POST + /requestToPayTransfer/ + {requestToPayTransactionId} + + + + + [47] + Validate OTP + + + alt + [if can proceed with transfer] + + + + + [48] + Reserve funds against + Payer's account + + + [49] + PUT +   + /requestToPayTransfer/ + {requestToPayTransactionId} + + + + [50] + POST + /transfers + + + + [51] + POST + /transfers + + + [52] + PUT + / + POST + /requestToPayTransfer/ + {requestToPayTransactionId} + return + + + [53] + Notify user + + + + [54] + PUT + /transfers + return fulfilment + + + + [55] + PUT + /transfers + + + [56] + POST +   + /newAPI + Notify payer of transfer + + + + + [57] + Commit transfer + to Payer's account + + + [58] + Notify Payer + + [if rejected] + + + [59] + return + + + + [60] + PUT +   + /requestToPayTransfer/ + {requestToPayTransactionId} + rejected + + + + [61] + PUT + /requestToPayTransfer/ + {requestToPayTransactionId} + rejected + + + + [62] + return rejected + + diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/inbound-bulk-quotes-sequence.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/inbound-bulk-quotes-sequence.svg new file mode 100644 index 000000000..c395e3caa --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/inbound-bulk-quotes-sequence.svg @@ -0,0 +1 @@ +Mojaloop SwitchSDK FSPIOP APISDK Inbound Domain Event HandlerSDK Inbound Command Event HandlerSDK Backend APICore Connector Payeetopic-sdk-inbound-domain-eventstopic-sdk-inbound-command-eventstopic-sdk-inbound-domain-eventstopic-sdk-inbound-domain-eventstopic-sdk-inbound-domain-eventstopic-sdk-inbound-domain-eventstopic-sdk-inbound-command-eventstopic-sdk-inbound-domain-eventsloop[for each transfer in bulk]alt[Bulk quotes supported][Bulk quotes NOT supported]topic-sdk-inbound-command-eventstopic-sdk-inbound-domain-eventstopic-sdk-inbound-domain-eventstopic-sdk-inbound-command-eventsPOST /bulkquotesProcess Trace HeadersInboundBulkQuotesRequestReceivedAcceptedProcessInboundBulkQuotesRequestUpdate the bulk state: RECEIVEDCheck if bulkQuotes supported by payeeSDKBulkQuotesRequestedUpdate the bulk state: PROCESSINGProcess outbound Trace HeadersPOST /bulkQuotesAcceptedPUT /bulkQuotesProcess inbound Trace HeadersSDKBulkQuotesCallbackReceivedAcceptedQuoteRequestedUpdate the individual state: QUOTES_PROCESSINGProcess outbound Trace HeadersPOST /quotesSynchronous responseProcess Inbound Trace HeadersQuotesResponseReceivedProcessQuotesResponseUpdate the individual state: QUOTES_SUCCESS / QUOTES_FAILEDQuotesResponseProcessedCheck the status of the remaining items in the bulkProcessInboundBulkQuotesRequestCompleteUpdate the bulk state: COMPLETEDInboundBulkQuotesRequestProcessedUpdate the bulk state: RESPONSE_PROCESSINGProcess Outbound Trace HeadersPUT /bulkQuotes/{bulkQuoteId}AcceptedInboundBulkQuotesReponseSentProcessInboundBulkQuotesReponseSentUpdate bulk state "RESPONSE_SENT"Mojaloop SwitchSDK FSPIOP APISDK Inbound Domain Event HandlerSDK Inbound Command Event HandlerSDK Backend APICore Connector Payee \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/inbound-bulk-transfers-sequence.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/inbound-bulk-transfers-sequence.svg new file mode 100644 index 000000000..6deaf1f7a --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/inbound-bulk-transfers-sequence.svg @@ -0,0 +1 @@ +Mojaloop SwitchSDK FSPIOP APISDK Inbound Domain Event HandlerSDK Inbound Command Event HandlerSDK Backend APICore Connector Payeetopic-sdk-inbound-domain-eventstopic-sdk-inbound-command-eventstopic-sdk-inbound-domain-eventstopic-sdk-inbound-domain-eventstopic-sdk-inbound-domain-eventstopic-sdk-inbound-domain-eventstopic-sdk-command-eventstopic-sdk-domain-eventsloop[for each transfer in bulk]alt[Bulk transfers supported][Bulk transfers NOT supported]topic-sdk-inbound-command-eventstopic-sdk-inbound-domain-eventstopic-sdk-domain-eventstopic-sdk-inbound-command-eventstopic-sdk-inbound-domain-eventstopic-sdk-inbound-command-eventstopic-sdk-inbound-domain-eventstopic-sdk-inbound-domain-eventstopic-sdk-inbound-domain-eventstopic-sdk-inbound-domain-eventstopic-sdk-command-eventstopic-sdk-domain-eventsloop[for each transfer in bulk]alt[Bulk transfers supported][Bulk transfers NOT supported]topic-sdk-inbound-command-eventstopic-sdk-inbound-domain-eventstopic-sdk-inbound-domain-eventstopic-sdk-inbound-command-eventsalt[bulkStatus == 'ACCEPTED']POST /bulkTransfersProcess Trace HeadersInboundBulkTransfersRequestReceivedAcceptedProcessInboundBulkTransfersRequestUpdate the bulk state: RECEIVEDCheck if bulkQuotes supported by payeeSDKBulkTransfersRequestedUpdate the bulk state: PROCESSINGProcess outbound Trace HeadersPOST /bulkTransfersAcceptedPUT /bulkTransfersProcess inbound Trace HeadersSDKBulkTransfersCallbackReceivedAcceptedTransferRequestedUpdate the individual state: TRANSFERS_PROCESSINGProcess outbound Trace HeadersPOST /transfersSynchronous ResponseProcess Inbound Trace HeadersTransfersCallbackReceivedProcessTransfersCallbackUpdate the individual state: TRANSFERS_SUCCESS / TRANSFERS_FAILEDTransfersCallbackProcessedCheck the status of the remaining items in the bulkProcessInboundBulkTransfersRequestCompleteUpdate the bulk state: COMPLETED?InboundBulkTransfersRequestProcessedUpdate the bulk state: RESPONSE_PROCESSINGProcess Outbound Trace HeadersPUT /bulkTransfers/{bulkTransferId}AcceptedInboundBulkTransfersResponseSentProcessInboundBulkTransfersResponseSentUpdate bulk state "RESPONSE_SENT"Check bulkStatusPATCH /bulkTransfers/{bulkTransferId}AcceptedProcess Trace HeadersInboundBulkTransfersPatchRequestReceivedAcceptedProcessInboundBulkTransfersPatchRequestUpdate the bulk state: PATCH_RECEIVEDCheck if bulkTransfers supported by payeeSDKBulkTransfersPatchRequestedUpdate the bulk state: PATCH_PROCESSINGProcess outbound Trace HeadersPATCH /bulkTransfers/{bulkTransferId}AcceptedResponse to Patch /bulkTransfersProcess inbound Trace HeadersSDKBulkTransfersPatchCallbackReceivedAcceptedTransfersPatchRequestedUpdate the individual state: TRANSFERS_PATCH_PROCESSINGProcess outbound Trace HeadersPATCH /transfers/{transferId}AcceptedProcess Inbound Trace HeadersTransfersPatchCallbackReceivedAcceptedProcessTransfersPatchCallbackUpdate the individual state: TRANSFERS_PATCH_SUCCESS / TRANSFERS_PATCH_FAILEDTransfersPatchCallbackProcessedCheck the status of the remaining items in the bulkProcessInboundBulkTransfersPatchRequestCompleteUpdate the bulk state: COMPLETEDInboundBulkTransfersPatchRequestProcessedUpdate the bulk state: RESPONSE_PROCESSINGProcess Outbound Trace HeadersPUT /bulkTransfers/{bulkTransferId}AcceptedInboundBulkTransfersPatchResponseSentProcessInboundBulkTransfersPatchResponseSentUpdate bulk state "PATCH_RESPONSE_SENT"Mojaloop SwitchSDK FSPIOP APISDK Inbound Domain Event HandlerSDK Inbound Command Event HandlerSDK Backend APICore Connector Payee \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/outbound-sequence.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/outbound-sequence.svg new file mode 100644 index 000000000..d611c2057 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/outbound-sequence.svg @@ -0,0 +1 @@ +Core ConnectorSDK Backend APISDK Outbound Domain Event HandlerSDK Outbound Command Event HandlerSDK FSPIOP APIMojaloop Switchtopic-sdk-outbound-domain-eventstopic-sdk-outbound-command-eventstopic-sdk-outbound-domain-eventstopic-sdk-outbound-command-eventstopic-sdk-outbound-domain-eventstopic-sdk-outbound-domain-eventsalt[party info already exists][party info doesn't exist]topic-sdk-outbound-command-eventstopic-sdk-outbound-domain-eventsloop[Party Lookup per transfer]topic-sdk-outbound-domain-eventstopic-sdk-outbound-domain-eventstopic-sdk-outbound-domain-eventstopic-sdk-outbound-command-eventstopic-sdk-outbound-domain-eventstopic-sdk-outbound-command-eventsalt[autoAcceptParty == false][autoAcceptParty == true (In future we can make this optional and an external service can handle this)]loop[for each transfer in bulk]topic-sdk-outbound-domain-eventstopic-sdk-outbound-command-eventstopic-sdk-outbound-domain-eventstopic-sdk-outbound-domain-eventstopic-sdk-outbound-command-eventsloop[through items in batch]topic-sdk-outbound-domain-eventsloop[BulkQuotes requests per batch]topic-sdk-outbound-domain-eventstopic-sdk-outbound-domain-eventstopic-sdk-outbound-domain-eventstopic-sdk-outbound-command-eventsloop[for each individual transfer in bulk]topic-sdk-outbound-domain-eventstopic-sdk-outbound-domain-eventstopic-sdk-outbound-command-eventsloop[for each individual transfer in bulk]topic-sdk-outbound-domain-eventsalt[autoAcceptQuote == false][autoAcceptQuote == true]topic-sdk-outbound-command-eventstopic-sdk-outbound-domain-eventstopic-sdk-outbound-domain-eventstopic-sdk-outbound-command-eventsloop[through items in batch]topic-sdk-outbound-domain-eventsloop[BulkTransfers requests per each batch and include only items with AGREEMENT_ACCEPTED]topic-sdk-outbound-domain-eventstopic-sdk-outbound-command-eventstopic-sdk-outbound-domain-eventstopic-sdk-outbound-domain-eventstopic-sdk-outbound-command-eventsSDKBulkRequest1Scheme Validation2Process Trace Headers3SDKOutboundBulkRequestReceived4Accepted5ProcessSDKOutboundBulkRequest6Store initial data into redis (Generate UUIDs and map to persistent model, break the JSON into smaller parts)7Update global state "RECEIVED"8SDKOutboundBulkPartyInfoRequested9ProcessSDKOutboundBulkPartyInfoRequest10Update global state "DISCOVERY_PROCESSING"11Update the global state to DISCOVERY_RECEIVED12PartyInfoCallbackReceived13Update the party request14PartyInfoRequested (includes info for SDK for making a party call)15Set individual state: DISCOVERY_PROCESSING16Process outbound Trace Headers17GET /parties18PUT /parties19Process Inbound Trace Headers20PartyInfoCallbackReceived21ProcessPartyInfoCallback22Update the individual state: DISCOVERY_SUCCESS / DISCOVERY_FAILED23Update the party response24PartyInfoCallbackProcessed25Check the status of the remaining items in the bulk26Update global state "DISCOVERY_COMPLETED"27SDKOutboundBulkPartyInfoRequestProcessed28check options.autoAcceptParty in redis29SDKOutboundBulkAcceptPartyInfoRequested30Update global state "DISCOVERY_ACCEPTANCE_PENDING"31Process outbound Trace Headers32PUT /bulkTransactions/{bulkTransactionId}33Accepted34PUT /bulkTransactions/{bulkTransactionId}35Process inbound Trace Headers36SDKOutboundBulkAcceptPartyInfoReceived37Accepted38ProcessSDKOutboundBulkAcceptPartyInfo39SDKOutboundBulkAutoAcceptPartyInfoRequested40Create SDKOutboundBulkAcceptPartyInfo with acceptParty=true for individual items with DISCOVERY_SUCCESS state41ProcessSDKOutboundBulkAcceptPartyInfo42Update the individual state: DISCOVERY_ACCEPTED / DISCOVERY_REJECTED43Update global state "DISCOVERY_ACCEPTANCE_COMPLETED"44SDKOutboundBulkAcceptPartyInfoProcessed45ProcessSDKOutboundBulkQuotesRequest46Update global state "AGREEMENT_PROCESSING"47Create bulkQuotes batches from individual items with DISCOVERY_ACCEPTED state per FSP and maxEntryConfigPerBatch48Update bulkQuotes request49BulkQuotesRequested50Update the batch state: AGREEMENT_PROCESSING51Process outbound Trace Headers52POST /bulkQuotes53Accepted54PUT /bulkQuotes55Process inbound Trace Headers56BulkQuotesCallbackReceived57Accepted58ProcessBulkQuotesCallback59Update the batch state: AGREEMENT_COMPLETED / AGREEMENT_FAILED60Update the individual state: AGREEMENT_SUCCESS / AGREEMENT_FAILED61Update the quote response62BulkQuotesCallbackProcessed63Check the status of the remaining items in the bulk64Update global state "AGREEMENT_COMPLETED"65SDKOutboundBulkQuotesRequestProcessed66check autoAcceptQuote67SDKOutboundBulkAcceptQuoteRequested68Update global state "AGREEMENT_ACCEPTANCE_PENDING"69Process outbound Trace Headers70PUT /bulkTransactions/{bulkTransactionId}71Accepted72PUT /bulkTransactions/{bulkTransactionId}73Process inbound Trace Headers74SDKOutboundBulkAcceptQuoteReceived75Accepted76ProcessSDKOutboundBulkAcceptQuote77Update the individual state: AGREEMENT_ACCEPTED / AGREEMENT_REJECTED78Update global state "AGREEMENT_ACCEPTANCE_COMPLETED"79SDKOutboundBulkAcceptQuoteProcessed80SDKOutboundBulkAutoAcceptQuoteRequested81ProcessSDKOutboundBulkAutoAcceptQuote82Check fee limits83Update the individual state: AGREEMENT_ACCEPTED / AGREEMENT_REJECTED84Update global state "AGREEMENT_ACCEPTANCE_COMPLETED"85SDKOutboundBulkAutoAcceptQuoteProcessed86ProcessSDKOutboundBulkTransfersRequest87Update global state "TRANSFERS_PROCESSING"88Update the request89BulkTransfersRequested90Update the batch state: TRANSFERS_PROCESSING91Process outbound Trace Headers92POST /bulkTransfers93Accepted94PUT /bulkTransfers95Process inbound Trace Headers96BulkTransfersCallbackReceived97Accepted98ProcessBulkTransfersCallback99Update the batch state: TRANSFERS_COMPLETED / TRANSFERS_FAILED100Update the individual state: TRANSFERS_SUCCESS / TRANSFERS_FAILED101Update the transfer response102BulkTransfersCallbackProcessed103Check the status of the remaining items in the bulk104Update global state "TRANSFERS_COMPLETED"105SDKOutboundBulkTransfersRequestProcessed106PrepareSDKOutboundBulkResponse107Build response from redis state108SDKOutboundBulkResponsePrepared109Update global state "RESPONSE_PROCESSING"110Process outbound Trace Headers111Send the response as callback112Accepted113SDKOutboundBulkResponseSent114ProcessSDKOutboundBulkResponseSent115Update global state "RESPONSE_SENT"116SDKOutboundBulkResponseSentProcessed117Core ConnectorSDK Backend APISDK Outbound Domain Event HandlerSDK Outbound Command Event HandlerSDK FSPIOP APIMojaloop Switch \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/requestToPaySDK-R2P-SequenceDiagram.svg b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/requestToPaySDK-R2P-SequenceDiagram.svg new file mode 100644 index 000000000..998a7145b --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/assets/sequence/requestToPaySDK-R2P-SequenceDiagram.svg @@ -0,0 +1,4 @@ + + + +
    Payee
    Core
    Payee...
    POST /transactionRequest
    POST /transactionRequest
    (Add authenticationType)
    (Add authenticationType)
    PUT /transactionRequest
    PUT /transactionRequest
    Payer SDK
    Payer...
    Payee SDK
    Payee...
    POST /transactionRequest
    POST /transactionRequest
    PUT /transactionRequest
    PUT /transactionRequest
    Switch
    Switch
    Payer
    Core
    Payer...
    POST /RequestToPay
    POST /RequestToPay
    (Add authenticationType,
    rename homeTxId to homeR2PTrxId
    )
    (Add authenticationType,...
    POST /transactionRequest
    POST /transactionRequest
    RES: POST /RequestToPay
    RES: POST /RequestToPay
    POST /quotes
    POST /quotes
    POST /quotes
    POST /quotes
    POST /quotesrequest
    POST /quotesrequest
    (Add homeR2PTrxId)
    (Add homeR2PTrxId)
    PUT /quotes
    PUT /quotes
    PUT /quotes
    PUT /quotes
    PUT /RequestToPay
    PUT /RequestToPay
    RES: PUT /RequestToPay
    RES: PUT /RequestToPay
    RES: PUT /requestToPayTransfer
    RES: PUT /requestToPayTransfer
    (Add authResponse)
    (Add authResponse)
    RES: POST /transactionRequest
    RES: POST /transactionRequest
    (Add homeR2PTxId (optional),
    rename transferAmount to 
    transactionRequestState 
    )
    (Add homeR2PTxId (optional),...
    POST /requestToPayTransfer
    POST /requestToPayTransfer
    (Add homeR2PTxId,
    Add authenticationType,
    Rename rTPayTrxId to tReqId)
    (Add homeR2PTxId,...
    GET /authorizations
    GET /authorizations
    (authenticationType hardcoded,
    retriesLeft hardcoded
    )
    (authenticationType hardcoded,...
    Accept payment and terms
    and generate OTP
    Accept pay...
    GET /authorizations
    GET /authorizations
    GET /otp
    GET /otp
    (rename rtpId to
    tRequestId,
    Add homeR2PTrxId,
    Add retriesLeft
    )
    (rename rtpId to...
    PUT /authorizations
    PUT /authorizations
    PUT /authorizations
    PUT /authorizations
    If OTP
    If OTP
    RES: POST /requestToPayTransfer
    RES: POST /requestToPayTransfer
    PUT /requestToPayTransfer
    PUT /requestToPayTransfer
    (accept quote,
    Add retriesLeft)
    (accept quote,...
    PUT /requestToPayTransfer
    PUT /requestToPayTransfer
    (accept quote/auth)
    (accept quote/auth)
    RES: PUT /requestToPayTransfer
    RES: PUT /requestToPayTransfer
    Payer
    Payer
    POST /transfers
    POST /transfers
    POST /transfers
    POST /transfers
    PUT /transfers
    PUT /transfers
    PUT /transfers
    PUT /transfers
    Payer provides OTP
    Payer prov...
    Payer
    Payer
    POST /transfers
    POST /transfers
    (Add transactionRequestId, 
    Add homeR2PTrxId
    )
    (Add transactionRequestId,...
    Validate Payer Details
    Validate P...
    Payer
    Payer
    Calculate fees and set terms.
    Present to Payer to validate.
    Calculate...
    Payer
    Payer
    PoS - Point of Sale device at Merchant
    PoS - Point of Sale devic...
    Payee PoS
    Payee PoS
    Payee Pos
    Payee Pos
    Payee PoS
    Payee PoS
    PUT /parties
    PUT /parties
    GET /parties
    GET /parties
    PUT /Parties
    PUT /Parties
    GET /parties
    GET /parties
    GET /parties
    GET /parties
    PoS displays
    Payment Confirmation
    PoS displa...
    Payer
    Payer
    Payee PoS
    Payee PoS
    Validate RTP
    Validate R...
    Initiate RTP with
    AuthType
    Initiate R...
    Validate OTP
    Validate O...
    Retry on
    OTP Failure
    Retry...
    PUT /requestToPayTransfer
    PUT /requestToPayTransfer
    (reject)
    (reject)
    RES: PUT /requestToPayTransfer
    RES: PUT /requestToPayTransfer
    PUT /transactionRequest
    PUT /transactionRequest
    (rejected state)
    (rejected state)
    PUT /RequestToPay
    PUT /RequestToPay
    (rejected state)
    (rejected state)
    If Rejected
    If Rejected
    PUT /transactionRequest
    PUT /transactionRequest
    (rejected state)
    (rejected state)
    If Accepted
    If Accepted
    Payer Receives
    Payment Confirmation
    Payer Rece...
    Payer
    Payer
    Payer Receives
    Rejection Notification
    Payer Rece...
    Payer
    Payer
    PoS displays
    Rejection Notification
    PoS displa...
    Payer
    Payer
    Payee PoS
    Payee PoS
    Text is not SVG - cannot display
    \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/usage/README.md b/docs/fr/technical/technical/sdk-scheme-adapter/usage/README.md new file mode 100644 index 000000000..dcaa55dc5 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/usage/README.md @@ -0,0 +1,46 @@ +# Vue d’ensemble des scénarios d’usage testés du SDK + +Un *scheme adapter* est un service qui fait l’interface entre un *switch* conforme à l’API Mojaloop et une plateforme backend DFSP qui n’implémente pas nativement l’API Mojaloop. + +L’API entre le *scheme adapter* et le backend DFSP est du HTTP synchrone ; l’interface avec le *switch* est l’API Mojaloop native. + +Ce document présente différentes configurations qu’un DFSP peut tester avec le *scheme adapter*. + +# Scénarios + +Scénarios testés et documentés : + +* [[Scheme Adapter + Mock DFSP Backend] → [Scheme Adapter + Mojaloop Simulator]](./scheme-adapter-to-scheme-adapter/README.md) +* [[Scheme Adapter + Mock DFSP Backend] → [Cluster K8s local]](./scheme-adapter-and-local-k8s/README.md) +* [[Scheme Adapter + Mojaloop Simulator] → [Switch Mojaloop public avec passerelle WSO2]](./scheme-adapter-and-wso2-api-gateway/README.md) + +## [Scheme Adapter + Mock DFSP Backend] → [Scheme Adapter + Mojaloop Simulator] + +Le *scheme adapter* peut être combiné aux implémentations fournies : *Mock DFSP Backend* et *Mojaloop Simulator*. Dépôts : + +https://github.com/mojaloop/sdk-mock-dfsp-backend.git + +https://github.com/mojaloop/mojaloop-simulator.git + +L’idée est d’associer le *scheme adapter* et le backend simulé DFSP d’un côté, et le simulateur Mojaloop de l’autre — par exemple payeur et bénéficiaire. En suivant cet exemple, il est possible d’envoyer et de recevoir des fonds d’un DFSP à l’autre. + +Voir la [documentation détaillée](./scheme-adapter-to-scheme-adapter/README.md). + +![SchemeAdapterToSchemeAdapter](./scheme-adapter-to-scheme-adapter/scheme-adapter-to-scheme-adapter-overview.png) + +## [Scheme Adapter + Mock DFSP Backend] → [Cluster K8s local] + +Pour intercaler un *switch* entre les DFSP, on peut simuler l’environnement avec un cluster Kubernetes local. Suivre le guide de déploiement : https://mojaloop.io/documentation/deployment-guide/ + +Voir la [documentation](./scheme-adapter-and-local-k8s/README.md). + +![SchemeAdapterAndK8S](./scheme-adapter-and-local-k8s/scheme-adapter-and-local-k8s-overview.png) + +## [Scheme Adapter + Mojaloop Simulator] → [Switch Mojaloop public avec passerelle WSO2] + +Avec accès à l’API Mojaloop WSO2, les tests décrits ici utilisent l’authentification par jeton et le chiffrement TLS du *scheme adapter* (contrairement aux deux scénarios précédents). + +Voir la [documentation](./scheme-adapter-and-wso2-api-gateway/README.md). + + +![SchemeAdapterAndWSO2APIGateway](./scheme-adapter-and-wso2-api-gateway/scheme-adapter-and-wso2-api-gateway-overview.png) diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-and-local-k8s/README.md b/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-and-local-k8s/README.md new file mode 100644 index 000000000..c8124cc1d --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-and-local-k8s/README.md @@ -0,0 +1,208 @@ +# SDK Scheme Adapter et cluster Kubernetes local + +Documentation pour tester un déploiement Mojaloop sur cluster Kubernetes avec le *scheme adapter* et un *mock backend* DFSP. + +![Vue d’ensemble](scheme-adapter-and-local-k8s-overview.png) + +## Prérequis + +* Cluster Kubernetes Mojaloop opérationnel (local ou cloud) +* Service *DFSP mock backend* +* `sdk-scheme-adapter` > 8.6.0 + +## Configuration et démarrage des services + +### Déploiement Mojaloop sur Kubernetes local + +Suivre : https://mojaloop.io/documentation/deployment-guide/ + +Linux est recommandé ; prévoir au moins 16 Go de RAM et 4 cœurs. + +Après installation, exécuter la collection Postman `OSS-New-Deployment-FSP-Setup.postman_collection` depuis https://github.com/mojaloop/postman + +Vérifier la configuration des *oracles* et des points de terminaison, et l’exécution réussie de la *Golden Path Collection*. + +### *Mock backend* DFSP et SDK Scheme Adapter + +Utiliser une version du SDK *scheme adapter* supérieure à 8.6.0. +L’étape suivante démarre le *scheme adapter* via `docker-compose`. + +Cloner : https://github.com/mojaloop/sdk-mock-dfsp-backend + +Vérifier `docker-compose.yml` : + +``` +version: '3' +services: + redis2: + image: "redis:5.0.4-alpine" + container_name: redis2 + backend: + image: "mojaloop/sdk-mock-dfsp-backend" + env_file: ./backend.env + container_name: dfsp_mock_backend2 + ports: + - "23000:3000" + depends_on: + - scheme-adapter2 + + scheme-adapter2: + image: "mojaloop/sdk-scheme-adapter:latest" + env_file: ./scheme-adapter.env + container_name: sa_sim2 + ports: + - "4000:4000" + depends_on: + - redis2 +``` + +Mettre à jour `backend.env` : +``` +OUTBOUND_ENDPOINT=http://sa_sim2:4001 +``` + +Mettre à jour `scheme-adapter.env` avec les hôtes adaptés (fichier `/etc/hosts` ou `extra_hosts`, voir ci-dessous) : + +``` +DFSP_ID=safsp +CACHE_HOST=redis2 +ALS_ENDPOINT=account-lookup-service.local +QUOTES_ENDPOINT=quoting-service.local +TRANSFERS_ENDPOINT=ml-api-adapter.local +BACKEND_ENDPOINT=dfsp_mock_backend2:3000 +AUTO_ACCEPT_PARTY=true +AUTO_ACCEPT_QUOTES=true +VALIDATE_INBOUND_JWS=false +VALIDATE_INBOUND_PUT_PARTIES_JWS=false +JWS_SIGN=true +JWS_SIGN_PUT_PARTIES=true +``` + +### Résolution de noms — macOS uniquement + +Ajouter à `/etc/hosts` (remplacer l’IP par celle de la machine) : +``` +192.168.5.101 ml-api-adapter.local account-lookup-service.local central-ledger.local central-settlement.local account-lookup-service-admin.local quoting-service.local moja-simulator.local central-ledger central-settlement ml-api-adapter account-lookup-service account-lookup-service-admin quoting-service simulator host.docker.internal moja-account-lookup-mysql +``` + +Remplacer `192.168.5.101` par votre adresse IP réelle accessible depuis les conteneurs si besoin. + +### Résolution de noms — Linux uniquement + +Ajouter `extra_hosts` sous `scheme-adapter2` dans `docker-compose.yml` pour résoudre `account-lookup-service.local`, `quoting-service.local` et `ml-api-adapter.local`, par exemple : + +``` + scheme-adapter2: + image: "mojaloop/sdk-scheme-adapter:latest" + env_file: ./scheme-adapter.env + container_name: sa_sim2 + ports: + - "4000:4000" + depends_on: + - redis2 + extra_hosts: + - "account-lookup-service.local:172.17.0.1" + - "quoting-service.local:172.17.0.1" + - "ml-api-adapter.local:172.17.0.1" +``` + +`172.17.0.1` est l’interface `docker0` par défaut ; vérifier qu’elle convient à votre installation. + +### Démarrage + +``` +cd src +docker-compose up -d +``` + +## Tests + +### Configurer un nouveau FSP + +Télécharger : + +* [Mojaloop-Local.postman_environment_modified.json](assets/postman_files/Mojaloop-Local.postman_environment_modified.json) — variables d’environnement pointant vers votre installation locale +* [OSS-Custom-FSP-Onboaring-SchemeAdapter-Setup.postman_collection.json](assets/postman_files/OSS-Custom-FSP-Onboaring-SchemeAdapter-Setup.postman_collection.json) — provisionnement d’un nouveau FSP + +`SCHEME_ADAPTER_ENDPOINT` doit cibler votre *scheme adapter* local. Sous macOS, `http://host.docker.internal:4000` est souvent correct. Sous Linux, utiliser l’interface `docker0` (souvent `172.17.0.1`), comme indiqué plus haut. + +Dans Postman, sélectionner l’environnement et exécuter la collection pour créer un FSP `safsp`. Les points de terminaison de `safsp` correspondront à l’URL du *scheme adapter* définie dans l’environnement. + +### Ajouter le MSISDN cible au simulateur bénéficiaire (dans le cluster) + +``` +curl -X POST \ + http://moja-simulator.local/payeefsp/parties/MSISDN/27713803912 \ + -H 'Accept: */*' \ + -H 'Accept-Encoding: gzip, deflate' \ + -H 'Cache-Control: no-cache' \ + -H 'Connection: keep-alive' \ + -H 'Content-Length: 406' \ + -H 'Content-Type: application/json' \ + -H 'Host: moja-simulator.local' \ + -H 'User-Agent: PostmanRuntime/7.20.1' \ + -H 'cache-control: no-cache' \ + -d '{ + "party": { + "partyIdInfo": { + "partyIdType": "MSISDN", + "partyIdentifier": "27713803912", + "fspId": "payeefsp" + }, + "name": "Siabelo Maroka", + "personalInfo": { + "complexName": { + "firstName": "Siabelo", + "lastName": "Maroka" + }, + "dateOfBirth": "1974-01-01" + } + } +}' + +curl -X POST \ + http://account-lookup-service.local/participants/MSISDN/27713803912 \ + -H 'Accept: application/vnd.interoperability.participants+json;version=1' \ + -H 'Connection: keep-alive' \ + -H 'Content-Length: 50' \ + -H 'Content-Type: application/vnd.interoperability.participants+json;version=1.0' \ + -H 'Date: Fri, 21 Dec 2018 12:17:01 GMT' \ + -H 'FSPIOP-Source: payeefsp' \ + -H 'Host: account-lookup-service.local' \ + -H 'User-Agent: PostmanRuntime/7.11.0' \ + -H 'accept-encoding: gzip, deflate' \ + -H 'cache-control: no-cache,no-cache' \ + -d '{ + "fspId": "payeefsp", + "currency": "USD" +}' +``` + +### Essayer un envoi de fonds + +Envoyer des fonds depuis `safsp` (*Mock DFSP*) vers un MSISDN enregistré chez `payeefsp` (simulateur dans le cluster). + +``` +curl -X POST \ + http://localhost:23000/send \ + -H 'Content-Type: application/json' \ + -d '{ + "from": { + "displayName": "John Doe", + "idType": "MSISDN", + "idValue": "123456789" + }, + "to": { + "idType": "MSISDN", + "idValue": "27713803912" + }, + "amountType": "SEND", + "currency": "USD", + "amount": "100", + "transactionType": "TRANSFER", + "note": "testpayment", + "homeTransactionId": "123ABC" +}' +``` + +La réponse doit indiquer `currentState` à **COMPLETED**. diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-and-local-k8s/assets/postman_files/Mojaloop-Local.postman_environment_modified.json b/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-and-local-k8s/assets/postman_files/Mojaloop-Local.postman_environment_modified.json new file mode 100644 index 000000000..eddcac266 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-and-local-k8s/assets/postman_files/Mojaloop-Local.postman_environment_modified.json @@ -0,0 +1,1012 @@ +{ + "id": "a9937c8b-0281-4128-8b53-1f1f913ff2aa", + "name": "Mojaloop-Local", + "values": [ + { + "key": "payeefsp", + "value": "payeefsp", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "payerfsp", + "value": "payerfsp", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "transferExpiration", + "value": "2019-05-27T15:44:53.292Z", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "transactionRequestId", + "value": "25a00155-c777-4629-a6b7-61cf0d16f499", + "enabled": true + }, + { + "key": "transferDate", + "value": "Fri, 21 Dec 2018 12:17:01 GMT", + "enabled": true + }, + { + "key": "currentTimestamp", + "value": "2018-12-06T17:09:56.386Z", + "enabled": true + }, + { + "key": "quoteDate", + "value": "Fri, 21 Dec 2018 12:19:49 GMT", + "enabled": true + }, + { + "key": "quoteExpiration", + "value": "2018-11-08T21:31:00.534+01:00", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "HOST_MOJALOOP", + "value": "localhost:4000", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "BASE_MOJALOOP", + "value": "", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "HOST_CENTRAL_LEDGER", + "value": "http://central-ledger.local", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "BASE_CENTRAL_LEDGER_API", + "value": "", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "BASE_CENTRAL_LEDGER_ADMIN", + "value": "", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "HOST_ML_API", + "value": "http://ml-api-adapter.local", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "BASE_ML_API", + "value": "", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "HOST_CENTRAL_SETTLEMENT", + "value": "http://central-settlement.local", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "BASE_CENTRAL_SETTLEMENT", + "value": "/v1", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "CONFIG_GENERATE_NEW_TRANSFER_UUID_ON_PREPARE", + "value": "true", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "CONFIG_GENERATE_NEW_TRANSFER_UUID_ON_QUOTE\n", + "value": "true", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "CONFIG_GENERATE_NEW_QUOTE_UUID_ON_QUOTE", + "value": "true", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "CONFIG_GENERATE_NEW_TIMESTAMP", + "value": "true", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "CONFIG_GENERATE_NEW_PREPARE_DATE", + "value": "true", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "CONFIG_GENERATE_NEW_QUOTE_DATE", + "value": "true", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "CONFIG_GENERATE_NEW_TRANSACTION_UUID_ON_QUOTE", + "value": "true", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "transferExpiredExpiration", + "value": "2018-08-31T15:26:01.870Z", + "enabled": true + }, + { + "key": "condition", + "value": "HOr22-H3AfTDHrSkPjJtVPRdKouuMkDXTR4ejlQa8Ks", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "fulfilment", + "value": "uU0nuZNNPgilLlLX2n2r-sSE7-N6U4DukIj3rOLvzek", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "HOST_SIMULATOR", + "value": "http://moja-simulator.local", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "SCHEME_ADAPTER_ENDPOINT", + "value": "http://host.docker.internal:4000", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "quoteId", + "value": "ddaa67b3-5bf8-45c1-bfcf-1e8781177c37", + "enabled": true + }, + { + "key": "ilpPacket", + "value": "AQAAAAAAAADIEHByaXZhdGUucGF5ZWVmc3CCAiB7InRyYW5zYWN0aW9uSWQiOiIyZGY3NzRlMi1mMWRiLTRmZjctYTQ5NS0yZGRkMzdhZjdjMmMiLCJxdW90ZUlkIjoiMDNhNjA1NTAtNmYyZi00NTU2LThlMDQtMDcwM2UzOWI4N2ZmIiwicGF5ZWUiOnsicGFydHlJZEluZm8iOnsicGFydHlJZFR5cGUiOiJNU0lTRE4iLCJwYXJ0eUlkZW50aWZpZXIiOiIyNzcxMzgwMzkxMyIsImZzcElkIjoicGF5ZWVmc3AifSwicGVyc29uYWxJbmZvIjp7ImNvbXBsZXhOYW1lIjp7fX19LCJwYXllciI6eyJwYXJ0eUlkSW5mbyI6eyJwYXJ0eUlkVHlwZSI6Ik1TSVNETiIsInBhcnR5SWRlbnRpZmllciI6IjI3NzEzODAzOTExIiwiZnNwSWQiOiJwYXllcmZzcCJ9LCJwZXJzb25hbEluZm8iOnsiY29tcGxleE5hbWUiOnt9fX0sImFtb3VudCI6eyJjdXJyZW5jeSI6IlVTRCIsImFtb3VudCI6IjIwMCJ9LCJ0cmFuc2FjdGlvblR5cGUiOnsic2NlbmFyaW8iOiJERVBPU0lUIiwic3ViU2NlbmFyaW8iOiJERVBPU0lUIiwiaW5pdGlhdG9yIjoiUEFZRVIiLCJpbml0aWF0b3JUeXBlIjoiQ09OU1VNRVIiLCJyZWZ1bmRJbmZvIjp7fX19", + "enabled": true + }, + { + "key": "payerFspId", + "value": "3", + "enabled": true + }, + { + "key": "payerFspAccountId", + "value": "3", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "payeeFspId", + "value": "4", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "payeeFspAccountId", + "value": "5", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "openWindowID", + "value": 1, + "enabled": true + }, + { + "key": "newOpenWindowID", + "value": 2, + "enabled": true + }, + { + "key": "closedWindowID", + "value": 1, + "enabled": true + }, + { + "key": "settlementId", + "value": 1, + "enabled": true + }, + { + "key": "expectedFullName", + "value": "Siabelo Maroka", + "enabled": true + }, + { + "key": "expectedFirstName", + "value": "Siabelo", + "enabled": true + }, + { + "key": "expectedLastName", + "value": "Maroka", + "enabled": true + }, + { + "key": "expectedDOB", + "value": "3/3/1973", + "enabled": true + }, + { + "key": "pathfinderMSISDN", + "value": "27713803912", + "enabled": true + }, + { + "key": "fullName", + "value": "Siabelo Maroka", + "enabled": true + }, + { + "key": "firstName", + "value": "Siabelo", + "enabled": true + }, + { + "key": "lastName", + "value": "Maroka", + "enabled": true + }, + { + "key": "dob", + "value": "3/3/1973", + "enabled": true + }, + { + "key": "HOST_ML_API_ADAPTER", + "value": "http://ml-api-adapter.local", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "dateHeader", + "value": "Thu, 24 Jan 2019 10:22:12 GMT", + "enabled": true + }, + { + "key": "participant", + "value": "testfsp4", + "enabled": true + }, + { + "key": "payerfspBeforePosition", + "value": -1782, + "enabled": true + }, + { + "key": "HOST_SWITCH_TRANSFERS", + "value": "http://ml-api-adapter.local", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "BASE_PATH_SWITCH_TRANSFERS", + "value": "", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "HOST_SIMULATOR_K8S_CLUSTER", + "value": "http://moja-simulator", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "payerfspPositionBeforeTransfer", + "value": 0, + "enabled": true + }, + { + "key": "payerNDC", + "value": 1000, + "enabled": true + }, + { + "key": "payeefspPositionBeforeTransfer", + "value": 0, + "enabled": true + }, + { + "key": "blockTransferAmount", + "value": 7494, + "enabled": true + }, + { + "key": "payeeNDC", + "value": 1000, + "enabled": true + }, + { + "key": "payerfspPositionAfterTransfer", + "value": 0, + "enabled": true + }, + { + "key": "transferAmount", + "value": "99", + "enabled": true + }, + { + "key": "payeefspPositionAfterTransfer", + "value": 0, + "enabled": true + }, + { + "key": "payerfspPositionAfterTransferBeforeExpiry", + "value": 1596, + "enabled": true + }, + { + "key": "fspName", + "value": "payerfsp", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "settlementAccountId", + "value": "3", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "reportEndDate", + "value": "2018-10-31", + "enabled": true + }, + { + "key": "reportFSPID", + "value": "payerfsp", + "enabled": true + }, + { + "key": "reportStartDate", + "value": "2018-10-01", + "enabled": true + }, + { + "key": "transactionId", + "value": "97f3f215-37a0-4755-a17c-c39313aa2f98", + "enabled": true + }, + { + "key": "payerfspSettlementAccountId", + "value": 8, + "enabled": true + }, + { + "key": "payeefspSettlementAccountId", + "value": 4, + "enabled": true + }, + { + "key": "fundsInPrepareTransferId", + "value": "b79a979e-9605-4db4-a052-85bc948be414", + "enabled": true + }, + { + "key": "HUBOPERATOR_BEARER_TOKEN", + "value": "NOT_APPLICABLE", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "hub_operator", + "value": "NOT_APPLICABLE", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "payeefspNetSettlementAmount", + "value": -198, + "enabled": true + }, + { + "key": "payerfspNetSettlementAmount", + "value": 198, + "enabled": true + }, + { + "key": "fundsInPrepareAmount", + "value": 500, + "enabled": true + }, + { + "key": "payerfspSettlementAccountBalance", + "value": -4800, + "enabled": true + }, + { + "key": "hubReconAccountBalance", + "value": 4800, + "enabled": true + }, + { + "key": "payerfspAccountBalanceBeforeSettlement", + "value": 0, + "enabled": true + }, + { + "key": "payeefspAccountBalanceBeforeSettlement", + "value": 0, + "enabled": true + }, + { + "key": "fundsOutPrepareTransferId", + "value": "f60c555f-72a7-44c7-a3a8-1f4a4df4b100", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "hubReconAccountBalanceBeforeFundsIn", + "value": "", + "enabled": true + }, + { + "key": "payerfspSettlementAccountBalanceBeforeFundsIn", + "value": "", + "enabled": true + }, + { + "key": "fundsOutPrepareAmount", + "value": "", + "enabled": true + }, + { + "key": "payerfspNDCBeforePrepare", + "value": "", + "enabled": true + }, + { + "key": "payeefspNDCBeforePrepare", + "value": "", + "enabled": true + }, + { + "key": "payeefspPositionAccountId", + "value": 3, + "enabled": true + }, + { + "key": "payerfspPositionAccountId", + "value": 7, + "enabled": true + }, + { + "key": "testfsp1", + "value": "testfsp1", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "testfsp2", + "value": "testfsp2", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "testfsp1PositionAccountId", + "value": 25, + "enabled": true + }, + { + "key": "testfsp1SettlementAccountId", + "value": 26, + "enabled": true + }, + { + "key": "testfsp2PositionAccountId", + "value": 29, + "enabled": true + }, + { + "key": "testfsp2SettlementAccountId", + "value": 30, + "enabled": true + }, + { + "key": "testfsp1Id", + "value": "13", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "testfsp2Id", + "value": "14", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "hubReconAccountBalanceBeforeFundsOutPrepare", + "value": "", + "enabled": true + }, + { + "key": "payerfspSettlementAccountBalanceBeforeFundsOutPrepare", + "value": "", + "enabled": true + }, + { + "key": "fundsOutCommitAmount", + "value": "", + "enabled": true + }, + { + "key": "fundsOutCommitTransferId", + "value": "", + "enabled": true + }, + { + "key": "hubReconAccountBalanceBeforeFundsOutCommit", + "value": "", + "enabled": true + }, + { + "key": "payerfspSettlementAccountBalanceBeforeFundsOutCommit", + "value": "", + "enabled": true + }, + { + "key": "transfer_ID", + "value": "e7b43799-e69e-4578-bd26-2a4b9a22e92e", + "enabled": true + }, + { + "key": "get_transfer_ID", + "value": "7e19ae5f-7db6-4612-ab99-7538a56b4c25", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "env_prefix", + "value": "test", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "hubReconAccountBalanceBeforeFundsInReserve", + "value": "", + "enabled": true + }, + { + "key": "payerfspSettlementAccountBalanceBeforeFundsInReserve", + "value": "", + "enabled": true + }, + { + "key": "validCondition", + "value": "GRzLaTP7DJ9t4P-a_BA0WA9wzzlsugf00-Tn6kESAfM", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "validFulfillment", + "value": "UNlJ98hZTY_dsw0cAqw4i_UN3v4utt7CZFB4yfLbVFA", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "currency", + "value": "USD", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "testfsp1PositionAccountBalance", + "value": "", + "enabled": true + }, + { + "key": "testfsp1SettleAccountBalance", + "value": "", + "enabled": true + }, + { + "key": "testfsp2PositionAccountBalance", + "value": "", + "enabled": true + }, + { + "key": "testfsp2SettleAccountBalance", + "value": "", + "enabled": true + }, + { + "key": "testfsp3PositionAccountBalance", + "value": "", + "enabled": true + }, + { + "key": "testfsp3SettleAccountBalance", + "value": "", + "enabled": true + }, + { + "key": "testfsp4PositionAccountBalance", + "value": "", + "enabled": true + }, + { + "key": "testfsp4SettleAccountBalance", + "value": "", + "enabled": true + }, + { + "key": "testfspId3", + "value": "15", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "testfspId4", + "value": "16", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "invalidFulfillment", + "value": "_3cco-YN5OGpRKVWV3n6x6uNpBTH9tYUdOYmHA", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "completedTimestamp", + "value": "", + "enabled": true + }, + { + "key": "payerfspPositionBeforePrepare", + "value": "", + "enabled": true + }, + { + "key": "payeefspPositionBeforePrepare", + "value": "", + "enabled": true + }, + { + "key": "payerfspPositionAfterPrepare", + "value": "", + "enabled": true + }, + { + "key": "fundsOutPrepareReserveAmount", + "value": "", + "enabled": true + }, + { + "key": "fundsOutPrepareReserveTransferId", + "value": "", + "enabled": true + }, + { + "key": "testfsp1PositionAccountBalanceBeforeTransfer", + "value": "", + "enabled": true + }, + { + "key": "testfsp1SettleAccountBalanceBeforeTransfer", + "value": "", + "enabled": true + }, + { + "key": "fspiop-signature", + "value": "{\"signature\":\"iU4GBXSfY8twZMj1zXX1CTe3LDO8Zvgui53icrriBxCUF_wltQmnjgWLWI4ZUEueVeOeTbDPBZazpBWYvBYpl5WJSUoXi14nVlangcsmu2vYkQUPmHtjOW-yb2ng6_aPfwd7oHLWrWzcsjTF-S4dW7GZRPHEbY_qCOhEwmmMOnE1FWF1OLvP0dM0r4y7FlnrZNhmuVIFhk_pMbEC44rtQmMFv4pm4EVGqmIm3eyXz0GkX8q_O1kGBoyIeV_P6RRcZ0nL6YUVMhPFSLJo6CIhL2zPm54Qdl2nVzDFWn_shVyV0Cl5vpcMJxJ--O_Zcbmpv6lxqDdygTC782Ob3CNMvg\\\",\\\"protectedHeader\\\":\\\"eyJhbGciOiJSUzI1NiIsIkZTUElPUC1VUkkiOiIvdHJhbnNmZXJzIiwiRlNQSU9QLUhUVFAtTWV0aG9kIjoiUE9TVCIsIkZTUElPUC1Tb3VyY2UiOiJPTUwiLCJGU1BJT1AtRGVzdGluYXRpb24iOiJNVE5Nb2JpbGVNb25leSIsIkRhdGUiOiIifQ\"}", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "testfsp3SettlementAccountId", + "value": "", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "testfsp4SettlementAccountId", + "value": "", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "testfsp3SettlementAccountBalanceBeforeFundsIn", + "value": "", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "testfsp4SettlementAccountBalanceBeforeFundsIn", + "value": "", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "testfsp3", + "value": "testfsp3", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "testfsp4", + "value": "testfsp4", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "testfsp1PositionAccountBalanceAfterTransfer", + "value": "", + "enabled": true + }, + { + "key": "testfsp1SettleAccountBalanceAfterTransfer", + "value": "", + "enabled": true + }, + { + "key": "testfsp2PositionAccountBalanceAfterTransfer", + "value": "", + "enabled": true + }, + { + "key": "testfsp2SettleAccountBalanceAfterTransfer", + "value": "", + "enabled": true + }, + { + "key": "testfsp3PositionAccountBalanceAfterTransfer", + "value": "", + "enabled": true + }, + { + "key": "testfsp3SettleAccountBalanceAfterTransfer", + "value": "", + "enabled": true + }, + { + "key": "testfsp4PositionAccountBalanceAfterTransfer", + "value": "", + "enabled": true + }, + { + "key": "testfsp4SettleAccountBalanceAfterTransfer", + "value": "", + "enabled": true + }, + { + "key": "hubReconAccountBalanceBeforeFundsOutAbort", + "value": "", + "enabled": true + }, + { + "key": "payerfspSettlementAccountBalanceBeforeFundsOutAbort", + "value": "", + "enabled": true + }, + { + "key": "payeefsp_fspiop_signature", + "value": "{\"signature\":\"abcJjvNrkyK2KBieDUbGfhaBUn75aDUATNF4joqA8OLs4QgSD7i6EO8BIdy6Crph3LnXnTM20Ai1Z6nt0zliS_qPPLU9_vi6qLb15FOkl64DQs9hnfoGeo2tcjZJ88gm19uLY_s27AJqC1GH1B8E2emLrwQMDMikwQcYvXoyLrL7LL3CjaLMKdzR7KTcQi1tCK4sNg0noIQLpV3eA61kess\",\"protectedHeader\":\"eyJhbGciOiJSUzI1NiIsIkZTUElPUC1Tb3VyY2UiOiJwYXllZWZzcCIsIkZTUElPUC1EZXN0aW5hdGlvbiI6InBheWVyZnNwIiwiRlNQSU9QLVVSSSI6Ii90cmFuc2ZlcnMvZDY3MGI1OTAtZjc5ZC00YWU5LThjNmUtMTVjZjZjNWMzODk5IiwiRlNQSU9QLUhUVFAtTWV0aG9kIjoiUFVUIiwiRGF0ZSI6IiJ9\"}", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "HOST_ACCOUNT_LOOKUP_SERVICE", + "value": "http://account-lookup-service.local", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "HOST_ACCOUNT_LOOKUP_ADMIN", + "value": "http://account-lookup-service-admin.local", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "HOST_QUOTING_SERVICE", + "value": "http://quoting-service.local", + "description": { + "content": "", + "type": "text/plain" + }, + "enabled": true + }, + { + "key": "payeefsp_signature", + "value": "abcJjvNrkyK2KBieDUbGfhaBUn75aDUATNF4joqA8OLs4QgSD7i6EO8BIdy6Crph3LnXnTM20Ai1Z6nt0zliS_qPPLU9_vi6qLb15FOkl64DQs9hnfoGeo2tcjZJ88gm19uLY_s27AJqC1GH1B8E2emLrwQMDMikwQcYvXoyLrL7LL3CjaLMKdzR7KTcQi1tCK4sNg0noIQLpV3eA61kess", + "type": "text", + "description": "", + "enabled": true + } + ], + "_postman_variable_scope": "environment", + "_postman_exported_at": "2019-05-30T00:29:41.827Z", + "_postman_exported_using": "Postman/6.7.4" +} diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-and-local-k8s/assets/postman_files/OSS-Custom-FSP-Onboaring-SchemeAdapter-Setup.postman_collection.json b/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-and-local-k8s/assets/postman_files/OSS-Custom-FSP-Onboaring-SchemeAdapter-Setup.postman_collection.json new file mode 100644 index 000000000..70e2b3599 --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-and-local-k8s/assets/postman_files/OSS-Custom-FSP-Onboaring-SchemeAdapter-Setup.postman_collection.json @@ -0,0 +1,1072 @@ +{ + "info": { + "_postman_id": "52f405c0-bec3-4915-8c43-c250208623aa", + "name": "OSS-Custom-FSP-Onboaring-SchemeAdapter-Setup", + "description": "Author: Sridevi Miriyala\nPurpose: Used to add new FSP and relevant Callback Information", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "FSP Onboarding", + "item": [ + { + "name": "safsp (p2p transfers)", + "item": [ + { + "name": "Add payerfsp - TRANSFERS", + "event": [ + { + "listen": "test", + "script": { + "id": "76c222f4-969b-4081-b4d7-133ebe48f50f", + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\"name\": \"safsp\",\"currency\": \"{{currency}}\"}" + }, + "url": { + "raw": "{{HOST_CENTRAL_LEDGER}}/participants", + "host": [ + "{{HOST_CENTRAL_LEDGER}}" + ], + "path": [ + "participants" + ] + } + }, + "response": [] + }, + { + "name": "Add initial position and limits - payerfsp", + "event": [ + { + "listen": "test", + "script": { + "id": "d767079d-a9dd-401a-8d6a-5f94654c4259", + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"currency\": \"{{currency}}\",\n\t\"limit\": {\n\t \"type\": \"NET_DEBIT_CAP\",\n\t \"value\": 1000000\n\t},\n\t\"initialPosition\": 0\n}" + }, + "url": { + "raw": "{{HOST_CENTRAL_LEDGER}}/participants/safsp/initialPositionAndLimits", + "host": [ + "{{HOST_CENTRAL_LEDGER}}" + ], + "path": [ + "participants", + "safsp", + "initialPositionAndLimits" + ] + } + }, + "response": [] + }, + { + "name": "Add payerfsp callback - PARTICIPANT PUT", + "event": [ + { + "listen": "test", + "script": { + "id": "bb928ca3-8904-4cff-94fa-9629ccf2418d", + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"type\": \"FSPIOP_CALLBACK_URL_PARTICIPANT_PUT\",\n \"value\": \"{{SCHEME_ADAPTER_ENDPOINT}}/participants/{{partyIdType}}/{{partyIdentifier}}\"\n}" + }, + "url": { + "raw": "{{HOST_CENTRAL_LEDGER}}/participants/safsp/endpoints", + "host": [ + "{{HOST_CENTRAL_LEDGER}}" + ], + "path": [ + "participants", + "safsp", + "endpoints" + ] + } + }, + "response": [] + }, + { + "name": "Add payerfsp callback - PARTICIPANT PUT Error", + "event": [ + { + "listen": "test", + "script": { + "id": "bb928ca3-8904-4cff-94fa-9629ccf2418d", + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"type\": \"FSPIOP_CALLBACK_URL_PARTICIPANT_PUT_ERROR\",\n \"value\": \"{{SCHEME_ADAPTER_ENDPOINT}}/participants/{{partyIdType}}/{{partyIdentifier}}/error\"\n}" + }, + "url": { + "raw": "{{HOST_CENTRAL_LEDGER}}/participants/safsp/endpoints", + "host": [ + "{{HOST_CENTRAL_LEDGER}}" + ], + "path": [ + "participants", + "safsp", + "endpoints" + ] + } + }, + "response": [] + }, + { + "name": "Add payerfsp callback - PARTICIPANT PUT Batch", + "event": [ + { + "listen": "test", + "script": { + "id": "bb928ca3-8904-4cff-94fa-9629ccf2418d", + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"type\": \"FSPIOP_CALLBACK_URL_PARTICIPANT_BATCH_PUT\",\n \"value\": \"{{SCHEME_ADAPTER_ENDPOINT}}/participants/{{requestId}}\"\n}" + }, + "url": { + "raw": "{{HOST_CENTRAL_LEDGER}}/participants/safsp/endpoints", + "host": [ + "{{HOST_CENTRAL_LEDGER}}" + ], + "path": [ + "participants", + "safsp", + "endpoints" + ] + } + }, + "response": [] + }, + { + "name": "Add payerfsp callback - PARTICIPANT PUT Batch Error", + "event": [ + { + "listen": "test", + "script": { + "id": "bb928ca3-8904-4cff-94fa-9629ccf2418d", + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"type\": \"FSPIOP_CALLBACK_URL_PARTICIPANT_BATCH_PUT_ERROR\",\n \"value\": \"{{SCHEME_ADAPTER_ENDPOINT}}/participants/{{requestId}}/error\"\n}" + }, + "url": { + "raw": "{{HOST_CENTRAL_LEDGER}}/participants/safsp/endpoints", + "host": [ + "{{HOST_CENTRAL_LEDGER}}" + ], + "path": [ + "participants", + "safsp", + "endpoints" + ] + } + }, + "response": [] + }, + { + "name": "Add payerfsp callback - PARTIES GET", + "event": [ + { + "listen": "test", + "script": { + "id": "bb928ca3-8904-4cff-94fa-9629ccf2418d", + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"type\": \"FSPIOP_CALLBACK_URL_PARTIES_GET\",\n \"value\": \"{{SCHEME_ADAPTER_ENDPOINT}}/parties/{{partyIdType}}/{{partyIdentifier}}\"\n}" + }, + "url": { + "raw": "{{HOST_CENTRAL_LEDGER}}/participants/safsp/endpoints", + "host": [ + "{{HOST_CENTRAL_LEDGER}}" + ], + "path": [ + "participants", + "safsp", + "endpoints" + ] + } + }, + "response": [] + }, + { + "name": "Add payerfsp callback - PARTIES PUT", + "event": [ + { + "listen": "test", + "script": { + "id": "bb928ca3-8904-4cff-94fa-9629ccf2418d", + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"type\": \"FSPIOP_CALLBACK_URL_PARTIES_PUT\",\n \"value\": \"{{SCHEME_ADAPTER_ENDPOINT}}/parties/{{partyIdType}}/{{partyIdentifier}}\"\n}" + }, + "url": { + "raw": "{{HOST_CENTRAL_LEDGER}}/participants/safsp/endpoints", + "host": [ + "{{HOST_CENTRAL_LEDGER}}" + ], + "path": [ + "participants", + "safsp", + "endpoints" + ] + } + }, + "response": [] + }, + { + "name": "Add payerfsp callback - PARTIES PUT Error", + "event": [ + { + "listen": "test", + "script": { + "id": "bb928ca3-8904-4cff-94fa-9629ccf2418d", + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"type\": \"FSPIOP_CALLBACK_URL_PARTIES_PUT_ERROR\",\n \"value\": \"{{SCHEME_ADAPTER_ENDPOINT}}/parties/{{partyIdType}}/{{partyIdentifier}}/error\"\n}" + }, + "url": { + "raw": "{{HOST_CENTRAL_LEDGER}}/participants/safsp/endpoints", + "host": [ + "{{HOST_CENTRAL_LEDGER}}" + ], + "path": [ + "participants", + "safsp", + "endpoints" + ] + } + }, + "response": [] + }, + { + "name": "Add payerfsp callback - QUOTES PUT", + "event": [ + { + "listen": "test", + "script": { + "id": "bb928ca3-8904-4cff-94fa-9629ccf2418d", + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"type\": \"FSPIOP_CALLBACK_URL_QUOTES\",\n \"value\": \"{{SCHEME_ADAPTER_ENDPOINT}}\"\n}" + }, + "url": { + "raw": "{{HOST_CENTRAL_LEDGER}}/participants/safsp/endpoints", + "host": [ + "{{HOST_CENTRAL_LEDGER}}" + ], + "path": [ + "participants", + "safsp", + "endpoints" + ] + } + }, + "response": [] + }, + { + "name": "Add payerfsp callback - TRANSFER POST", + "event": [ + { + "listen": "test", + "script": { + "id": "bb928ca3-8904-4cff-94fa-9629ccf2418d", + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"type\": \"FSPIOP_CALLBACK_URL_TRANSFER_POST\",\n \"value\": \"{{SCHEME_ADAPTER_ENDPOINT}}/transfers\"\n}" + }, + "url": { + "raw": "{{HOST_CENTRAL_LEDGER}}/participants/safsp/endpoints", + "host": [ + "{{HOST_CENTRAL_LEDGER}}" + ], + "path": [ + "participants", + "safsp", + "endpoints" + ] + } + }, + "response": [] + }, + { + "name": "Add payerfsp callback - TRANSFER PUT", + "event": [ + { + "listen": "test", + "script": { + "id": "bb928ca3-8904-4cff-94fa-9629ccf2418d", + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"type\": \"FSPIOP_CALLBACK_URL_TRANSFER_PUT\",\n \"value\": \"{{SCHEME_ADAPTER_ENDPOINT}}/transfers/{{transferId}}\"\n}" + }, + "url": { + "raw": "{{HOST_CENTRAL_LEDGER}}/participants/safsp/endpoints", + "host": [ + "{{HOST_CENTRAL_LEDGER}}" + ], + "path": [ + "participants", + "safsp", + "endpoints" + ] + } + }, + "response": [] + }, + { + "name": "Add payerfsp callback - TRANSFER ERROR", + "event": [ + { + "listen": "test", + "script": { + "id": "bb928ca3-8904-4cff-94fa-9629ccf2418d", + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"type\": \"FSPIOP_CALLBACK_URL_TRANSFER_ERROR\",\n \"value\": \"{{SCHEME_ADAPTER_ENDPOINT}}/transfers/{{transferId}}/error\"\n}" + }, + "url": { + "raw": "{{HOST_CENTRAL_LEDGER}}/participants/safsp/endpoints", + "host": [ + "{{HOST_CENTRAL_LEDGER}}" + ], + "path": [ + "participants", + "safsp", + "endpoints" + ] + } + }, + "response": [] + }, + { + "name": "9. Set Endpoint-NET_DEBIT_CAP_ADJUSTMENT_EMAIL Copy", + "event": [ + { + "listen": "test", + "script": { + "id": "83984619-0430-4a4c-87ec-671bf97894de", + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{BEARER_TOKEN}}", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Cache-Control", + "value": "no-cache" + }, + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"type\": \"NET_DEBIT_CAP_ADJUSTMENT_EMAIL\",\n \"value\": \"sridevi.miriyala@modusbox.com\"\n}" + }, + "url": { + "raw": "{{HOST_CENTRAL_LEDGER}}/participants/safsp/endpoints", + "host": [ + "{{HOST_CENTRAL_LEDGER}}" + ], + "path": [ + "participants", + "safsp", + "endpoints" + ] + }, + "description": "Generated from a curl request: \ncurl -i -X POST {{HOST_CENTRAL_LEDGER}}/participants/testfsp2/initialPositionAndLimits -H 'Cache-Control: no-cache' -H 'Content-Type: application/json' -d '{\n \\\"currency\\\": \\\"USD\\\",\n \\\"limit\\\": {\n \\\"type\\\": \\\"NET_DEBIT_CAP\\\",\n \\\"value\\\": 1000\n },\n \\\"initialPosition\\\": 0\n }'" + }, + "response": [ + { + "name": "2. Create Initial Position and Limits", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Cache-Control", + "value": "no-cache" + }, + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"currency\": \"USD\",\n \"limit\": {\n \"type\": \"NET_DEBIT_CAP\",\n \"value\": 1000\n },\n \"initialPosition\": 0\n }" + }, + "url": { + "raw": "http://{{HOST_CENTRAL_LEDGER}}/participants/testfsp/initialPositionAndLimits", + "protocol": "http", + "host": [ + "{{HOST_CENTRAL_LEDGER}}" + ], + "path": [ + "participants", + "testfsp", + "initialPositionAndLimits" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "Text", + "header": [], + "cookie": [], + "body": "" + } + ] + }, + { + "name": "Set Endpoint-SETTLEMENT_TRANSFER_POSITION_CHANGE_EMAIL Copy", + "event": [ + { + "listen": "test", + "script": { + "id": "16f8d261-3f2d-470b-986b-c8e23602605b", + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{BEARER_TOKEN}}", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Cache-Control", + "value": "no-cache" + }, + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"type\": \"SETTLEMENT_TRANSFER_POSITION_CHANGE_EMAIL\",\n \"value\": \"sridevi.miriyala@modusbox.com\"\n}" + }, + "url": { + "raw": "{{HOST_CENTRAL_LEDGER}}/participants/safsp/endpoints", + "host": [ + "{{HOST_CENTRAL_LEDGER}}" + ], + "path": [ + "participants", + "safsp", + "endpoints" + ] + }, + "description": "Generated from a curl request: \ncurl -i -X POST {{HOST_CENTRAL_LEDGER}}/participants/testfsp2/initialPositionAndLimits -H 'Cache-Control: no-cache' -H 'Content-Type: application/json' -d '{\n \\\"currency\\\": \\\"USD\\\",\n \\\"limit\\\": {\n \\\"type\\\": \\\"NET_DEBIT_CAP\\\",\n \\\"value\\\": 1000\n },\n \\\"initialPosition\\\": 0\n }'" + }, + "response": [ + { + "name": "2. Create Initial Position and Limits", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Cache-Control", + "value": "no-cache" + }, + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"currency\": \"USD\",\n \"limit\": {\n \"type\": \"NET_DEBIT_CAP\",\n \"value\": 1000\n },\n \"initialPosition\": 0\n }" + }, + "url": { + "raw": "http://{{HOST_CENTRAL_LEDGER}}/participants/testfsp/initialPositionAndLimits", + "protocol": "http", + "host": [ + "{{HOST_CENTRAL_LEDGER}}" + ], + "path": [ + "participants", + "testfsp", + "initialPositionAndLimits" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "Text", + "header": [], + "cookie": [], + "body": "" + } + ] + }, + { + "name": "DFSP Endpoint-NET_DEBIT_CAP_THRESHOLD_BREACH_EMAIL Copy", + "event": [ + { + "listen": "test", + "script": { + "id": "67082524-b658-4f1c-90c4-af6fc24adb3e", + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{BEARER_TOKEN}}", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Cache-Control", + "value": "no-cache" + }, + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"type\": \"NET_DEBIT_CAP_THRESHOLD_BREACH_EMAIL\",\n \"value\": \"sridevi.miriyala@modusbox.com\"\n}" + }, + "url": { + "raw": "{{HOST_CENTRAL_LEDGER}}/participants/safsp/endpoints", + "host": [ + "{{HOST_CENTRAL_LEDGER}}" + ], + "path": [ + "participants", + "safsp", + "endpoints" + ] + }, + "description": "Generated from a curl request: \ncurl -i -X POST {{HOST_CENTRAL_LEDGER}}/participants/testfsp2/initialPositionAndLimits -H 'Cache-Control: no-cache' -H 'Content-Type: application/json' -d '{\n \\\"currency\\\": \\\"USD\\\",\n \\\"limit\\\": {\n \\\"type\\\": \\\"NET_DEBIT_CAP\\\",\n \\\"value\\\": 1000\n },\n \\\"initialPosition\\\": 0\n }'" + }, + "response": [ + { + "name": "2. Create Initial Position and Limits", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Cache-Control", + "value": "no-cache" + }, + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"currency\": \"USD\",\n \"limit\": {\n \"type\": \"NET_DEBIT_CAP\",\n \"value\": 1000\n },\n \"initialPosition\": 0\n }" + }, + "url": { + "raw": "http://{{HOST_CENTRAL_LEDGER}}/participants/testfsp/initialPositionAndLimits", + "protocol": "http", + "host": [ + "{{HOST_CENTRAL_LEDGER}}" + ], + "path": [ + "participants", + "testfsp", + "initialPositionAndLimits" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "Text", + "header": [], + "cookie": [], + "body": "" + } + ] + }, + { + "name": "Record Funds In - payerfsp ", + "event": [ + { + "listen": "test", + "script": { + "id": "802139ed-ec95-40f8-99a7-d88f0e77e49d", + "exec": [ + "pm.test(\"Status code is 202\", function () {", + " pm.response.to.have.status(202);", + "});" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "id": "461d34bc-33f6-4031-bbc4-b26489ff1953", + "exec": [ + "var uuid = require('uuid');", + "var generatedUUID = uuid.v4();", + "pm.environment.set('fundsInPrepareTransferId', generatedUUID);", + "pm.environment.set('fundsInPrepareAmount', 5000);", + "", + "", + "const payerfspGetStatusRequest = {", + " url: pm.environment.get(\"HOST_CENTRAL_LEDGER\")+pm.environment.get(\"BASE_CENTRAL_LEDGER_ADMIN\")+'/participants/'+pm.environment.get(\"payerfsp\")+'/accounts',", + " method: 'GET',", + " header: {", + " \"Authorization\":\"Bearer \"+pm.environment.get(\"HUB_OPERATOR_BEARER_TOKEN\"),", + " \"FSPIOP-Source\": pm.environment.get(\"hub_operator\"),", + " \"Content-Type\": \"application/json\"", + " }", + "};", + "pm.sendRequest(payerfspGetStatusRequest, function (err, response) {", + " console.log(response.json())", + " var jsonData = response.json()", + " for(var i in jsonData) {", + " if((jsonData[i].ledgerAccountType === 'SETTLEMENT') && (jsonData[i].currency === pm.environment.get(\"currency\"))) {", + " pm.environment.set(\"payerfspSettlementAccountId\",jsonData[i].id)", + " pm.environment.set(\"payerfspSettlementAccountBalanceBeforeFundsIn\",jsonData[i].value)", + " }", + " }", + "});", + "", + "const hubGetStatusRequest = {", + " url: pm.environment.get(\"HOST_CENTRAL_LEDGER\")+pm.environment.get(\"BASE_CENTRAL_LEDGER_ADMIN\")+'/participants/hub/accounts',", + " method: 'GET',", + " header: {", + " \"Authorization\":\"Bearer \"+pm.environment.get(\"BEARER_TOKEN\"),", + " \"FSPIOP-Source\": pm.environment.get(\"payerfsp\"),", + " \"Content-Type\": \"application/json\"", + " }", + "};", + "pm.sendRequest(hubGetStatusRequest, function (err, response) {", + " console.log(response.json())", + " var jsonData = response.json()", + " for(var i in jsonData) {", + " if((jsonData[i].ledgerAccountType === 'HUB_RECONCILIATION') && (jsonData[i].currency === pm.environment.get(\"currency\"))) {", + " pm.environment.set(\"hubReconAccountBalanceBeforeFundsIn\",jsonData[i].value)", + " }", + " }", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{BEARER_TOKEN}}", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "FSPIOP-Source", + "value": "{{payerfsp}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"transferId\": \"{{fundsInPrepareTransferId}}\",\n \"externalReference\": \"string\",\n \"action\": \"recordFundsIn\",\n \"reason\": \"string\",\n \"amount\": {\n \"amount\":\"{{fundsInPrepareAmount}}\" ,\n \"currency\": \"{{currency}}\"\n },\n \"extensionList\": {\n \"extension\": [\n {\n \"key\": \"string\",\n \"value\": \"string\"\n }\n ]\n }\n}" + }, + "url": { + "raw": "{{HOST_CENTRAL_LEDGER}}/participants/safsp/accounts/{{payerfspSettlementAccountId}}", + "host": [ + "{{HOST_CENTRAL_LEDGER}}" + ], + "path": [ + "participants", + "safsp", + "accounts", + "{{payerfspSettlementAccountId}}" + ] + } + }, + "response": [] + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "id": "e5ffaeb6-241f-4b10-af63-b52b064ff44f", + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "id": "efb91eb5-c6c5-460c-89b0-a424f39dcf9a", + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "protocolProfileBehavior": {}, + "_postman_isSubFolder": true + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "id": "a29d64a2-7a89-4cc9-ac33-2a630283471d", + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "id": "7bcf1b8c-ce85-4b11-ac83-899cc81ce501", + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "protocolProfileBehavior": {} + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "id": "402cb439-04ee-4add-9a65-f4b3f9dafa58", + "type": "text/javascript", + "exec": [ + "", + "// Ensure that the following variables are not set in the environment", + "// This is a fix for the following issue: https://github.com/mojaloop/project/issues/903", + "// This will ensure that templates are not replaced in the endpoint configs:", + "pm.environment.unset('partyIdType')", + "pm.environment.unset('partyIdentifier')", + "pm.environment.unset('requestId')", + "pm.environment.unset('transferId')", + "", + "pm.globals.unset('partyIdType')", + "pm.globals.unset('partyIdentifier')", + "pm.globals.unset('requestId')", + "pm.globals.unset('transferId')" + ] + } + }, + { + "listen": "test", + "script": { + "id": "e73fb24a-c94a-4551-ac31-fb7ceb250579", + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "protocolProfileBehavior": {} +} \ No newline at end of file diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-and-local-k8s/scheme-adapter-and-local-k8s-overview.png b/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-and-local-k8s/scheme-adapter-and-local-k8s-overview.png new file mode 100644 index 000000000..4d6282c3c Binary files /dev/null and b/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-and-local-k8s/scheme-adapter-and-local-k8s-overview.png differ diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-and-wso2-api-gateway/README.md b/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-and-wso2-api-gateway/README.md new file mode 100644 index 000000000..1e55096ad --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-and-wso2-api-gateway/README.md @@ -0,0 +1,215 @@ +# SDK Scheme Adapter et passerelle API WSO2 + +Guide pour tester le *scheme adapter* contre une passerelle WSO2 publique avec TLS et authentification par jeton *bearer*. + + +![Vue d’ensemble](scheme-adapter-and-wso2-api-gateway-overview.png) + +## Prérequis + +* Accès à l’API de production WSO2 avec jeton généré +* `sdk-scheme-adapter` +* `mojaloop-simulator` + +## Générer le jeton d’accès et les URL WSO2 + +* Se connecter au *store* WSO2, menu *Applications* : créer une application et des clés d’accès si nécessaire. +* Menu *APIs* : s’abonner aux deux API ci-dessous (application et *tier* depuis la page de chaque API). + * **Central Ledger Admin API** — création de FSP et configuration des points de terminaison (demander à l’équipe infra les URL HTTPS correctes sur le Hub). + * **FSPIOP API** — recherche de compte, cotations et transferts. +* Tester des requêtes dans l’onglet *API Console* avec le jeton généré. +* Noter les URL des deux API et le jeton d’accès. + + +## Côté infrastructure + +Points généralement gérés par l’équipe infrastructure (les contacter pour le détail) : + +* Machine avec IP publique fixe et nom de domaine pointant vers cette IP pour recevoir les réponses. +* Certificats client/serveur (portail MCM, outil de *keychain*) pour la communication en *mutual* TLS. +* Publication des points de terminaison vers votre adresse HTTPS dans WSO2 / HAProxy. +* Mise en place de l’authentification JWS. +* **Déploiement AWS** (exemple) + * Créer une instance EC2 (**t2.micro**, **Ubuntu 18.04**), connexion SSH avec la clé fournie par la console. + * Installer Docker et Docker Compose sur l’instance. + * Ouvrir le port TCP **4000** dans le groupe de sécurité ; associer une *Elastic IP* pour une adresse statique. + * Associer un nom DNS (Route 53 ou autre) à cette IP — nécessaire car Let’s Encrypt ne délivre pas de certificats pour une IP seule. + + +## Configurer le Scheme Adapter avec Mojaloop Simulator + +Cloner le simulateur : +``` +git clone https://github.com/mojaloop/mojaloop-simulator.git +``` +* Remplacer les certificats et clés dans `src/secrets` par ceux générés précédemment. + +* Adapter `src/docker-compose.yml`, par exemple : + + ``` + version: '3' + services: + redis: + image: "redis:5.0.4-alpine" + container_name: redis + backend: + image: "mojaloop/mojaloop-simulator-backend" + env_file: ./sim-backend.env + container_name: ml_simulator + ports: + - "3000:3000" + - "3001:3001" + - "3003:3003" + depends_on: + - scheme-adapter + + scheme-adapter: + image: "mojaloop/sdk-scheme-adapter:latest" + env_file: ./scheme-adapter.env + container_name: sa_sim2 + volumes: + - ./secrets:/src/secrets + ports: + - "3500:3000" + - "4000:4000" + depends_on: + - redis + ``` + +* `src/sim-backend.env` : + + ``` + OUTBOUND_ENDPOINT=http://src_scheme-adapter_1:4001 + DFSP_ID=extpayerfsp + ``` + +* `src/scheme-adapter.env` : + + ``` + MUTUAL_TLS_ENABLED=true + CACHE_HOST=redis + DFSP_ID=extpayerfsp + BACKEND_ENDPOINT=ml_simulator:3000 + PEER_ENDPOINT= + AUTO_ACCEPT_QUOTES=true + ``` + +Démarrer : +``` +cd src/ +docker-compose up -d +``` + +L’API de test du simulateur est sur le port **3003**. + +## Provisionner le DFSP `extpayerfsp` avec les bons points de terminaison + +Créer un FSP (nom libre, ex. `extpayerfsp`). + +Utiliser la section d’intégration FSP de la collection Postman `OSS-New-Deployment-FSP-Setup` — dépôt https://github.com/mojaloop/postman. + +* Dupliquer l’environnement `Mojaloop-Local` et ajuster : + * `payerfsp` → `extpayerfsp` + * `HOST_ML_API_ADAPTER`, `HOST_ML_API`, `HOST_SWITCH_TRANSFERS`, `HOST_ACCOUNT_LOOKUP_SERVICE`, `HOST_QUOTING_SERVICE` → point de terminaison FSPIOP WSO2 + * `HOST_CENTRAL_LEDGER` → API d’administration des services centraux WSO2 + * `HOST_CENTRAL_SETTLEMENT` → règlement central WSO2 (optionnel pour ces tests) + * `HOST_SIMULATOR` et `HOST_SIMULATOR_K8S_CLUSTER` → `https://:4000` +* Dans *FSP Onboarding*, remplacer les URL `payerfsp` par `extpayerfsp`. +* Pour tout le dossier *Payer FSP Onboarding* : authentification *Bearer Token* avec le jeton WSO2 ; URL en HTTPS fournies par l’infra. +* Exécuter le dossier *Payer FSP Onboarding* avec le nouvel environnement. + +Un passage à 100 % valide la création du FSP et la configuration des points de terminaison. + +## Provisionner `payeefsp` et enregistrer un participant (simulateur MSISDN) + +Le simulateur côté *switch* inclut généralement `payeefsp` ; enregistrer un participant (numéro) au choix. + +Référence Postman : `p2p_happy_path SEND QUOTE / Register Participant {{pathfinderMSISDN}} against MSISDN Simulator for PayeeFSP` dans la collection `Golden_Path`. + +La requête envoie un `POST` sur `/participants/MSISDN/` avec le corps et les en-têtes requis, par exemple : +``` +{ + "fspId": "payeefsp", + "currency": "USD" +} +``` + +## Envoyer des fonds + +### En une étape + +Activer `AUTO_ACCEPT_QUOTES` et `AUTO_ACCEPT_PARTY` dans `scheme_adapter.env`. + +``` +curl -X POST \ + "http://localhost:3003/scenarios" \ + -H 'Content-Type: application/json' \ + -d '[ + { + "name": "scenario1", + "operation": "postTransfers", + "body": { + "from": { + "displayName": "From some person name", + "idType": "MSISDN", + "idValue": "44123456789" + }, + "to": { + "idType": "MSISDN", + "idValue": "919848123456" + }, + "amountType": "SEND", + "currency": "USD", + "amount": "100", + "transactionType": "TRANSFER", + "note": "testpayment", + "homeTransactionId": "123ABC" + } + } +]' + +``` + +### En deux étapes + +Demander d’abord une cotation, puis accepter après vérification des frais et de la partie : + +``` +curl -X POST \ + "http://localhost:3003/scenarios" \ + -H 'Content-Type: application/json' \ + -d '[ + { + "name": "scenario1", + "operation": "postTransfers", + "body": { + "from": { + "displayName": "From some person name", + "idType": "MSISDN", + "idValue": "44123456789" + }, + "to": { + "idType": "MSISDN", + "idValue": "9848123456" + }, + "amountType": "SEND", + "currency": "USD", + "amount": "100", + "transactionType": "TRANSFER", + "note": "testpayment", + "homeTransactionId": "123ABC" + } + }, + { + "name": "scenario2", + "operation": "putTransfers", + "params": { + "transferId": "{{scenario1.result.transferId}}" + }, + "body": { + "acceptQuote": true + } + } +]' + +``` diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-and-wso2-api-gateway/scheme-adapter-and-wso2-api-gateway-overview.png b/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-and-wso2-api-gateway/scheme-adapter-and-wso2-api-gateway-overview.png new file mode 100644 index 000000000..206d31d45 Binary files /dev/null and b/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-and-wso2-api-gateway/scheme-adapter-and-wso2-api-gateway-overview.png differ diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-to-scheme-adapter/README.md b/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-to-scheme-adapter/README.md new file mode 100644 index 000000000..41dc9aadb --- /dev/null +++ b/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-to-scheme-adapter/README.md @@ -0,0 +1,183 @@ +# Test Scheme Adapter vers Scheme Adapter + +Documentation pour les DFSP qui souhaitent tester un transfert d’un *scheme adapter* vers un autre, en s’appuyant sur le *mock backend* et les services du simulateur Mojaloop. + +![Vue d’ensemble](scheme-adapter-to-scheme-adapter-overview.png) + +## Prérequis + +* Mojaloop Simulator +* Service *DFSP mock backend* +* Le *scheme adapter* est déjà inclus dans les deux *docker-compose* ci-dessous + +## Configuration et démarrage des services + +L’idée est d’exécuter en parallèle les deux *docker-compose*. Pour éviter les conflits, éditez chaque `docker-compose.yml` et fixez explicitement les noms de conteneurs. + +### Service Mojaloop Simulator + +Cloner le dépôt du simulateur Mojaloop : +``` +git clone https://github.com/mojaloop/mojaloop-simulator.git +``` +* Modifier `src/docker-compose.yml` et ajouter les `container_name` pour tous les services — voir l’exemple : + +``` +version: '3' +services: + redis1: + image: "redis:5.0.4-alpine" + container_name: redis1 + sim: + image: "mojaloop-simulator-backend" + build: ../ + env_file: ./sim-backend.env + container_name: ml_sim1 + ports: + - "13000:3000" + - "3001:3001" + - "3003:3003" + depends_on: + - scheme-adapter + scheme-adapter: + image: "mojaloop/sdk-scheme-adapter:latest" + env_file: ./scheme-adapter.env + container_name: sa_sim1 + ports: + - "13500:3000" + - "14000:4000" + depends_on: + - redis1 +``` + +* Modifier `src/sim-backend.env` et pointer vers le bon nom de conteneur du *scheme adapter* : + +``` +OUTBOUND_ENDPOINT=http://sa_sim1:4001 +``` + +* Modifier `src/scheme-adapter.env` avec les noms du second *scheme adapter* et du simulateur, par exemple : + +``` +DFSP_ID=payeefsp +CACHE_HOST=redis1 +PEER_ENDPOINT=sa_sim2:4000 +BACKEND_ENDPOINT=ml_sim1:3000 +AUTO_ACCEPT_PARTY=true +AUTO_ACCEPT_QUOTES=true +VALIDATE_INBOUND_JWS=false +VALIDATE_INBOUND_PUT_PARTIES_JWS=false +JWS_SIGN=true +JWS_SIGN_PUT_PARTIES=true + +``` + +Puis lancer : +``` +cd src/ +docker-compose up -d +``` + +L’API de test du simulateur est alors disponible sur le port **3003**. + +Ajouter une partie au simulateur (adapter les champs si besoin) : +``` +curl -X POST "http://localhost:3003/repository/parties" -H "accept: */*" -H "Content-Type: application/json" -d "{\"displayName\":\"Test Payee1\",\"firstName\":\"Test\",\"middleName\":\"\",\"lastName\":\"Payee1\",\"dateOfBirth\":\"1970-01-01\",\"idType\":\"MSISDN\",\"idValue\":\"9876543210\"}" +``` + +Vérifier les parties : +``` +curl -X GET "http://localhost:3003/repository/parties" -H "accept: */*" +``` + +Ensuite, configurer la seconde instance (*scheme adapter* + *mock DFSP*). + +### Service DFSP Mock Backend + +Le *mock backend* est une implémentation minimale d’exemple ; seules des fonctions de base sont prises en charge. + +Cloner : +``` +git clone https://github.com/mojaloop/sdk-mock-dfsp-backend.git +``` + +Éditer `src/docker-compose.yml`, `src/backend.env` et `src/scheme-adapter.env` et définir les noms de conteneurs — voir : + +docker-compose.yml +``` +version: '3' +services: + redis2: + image: "redis:5.0.4-alpine" + container_name: redis2 + backend: + image: "mojaloop/sdk-mock-dfsp-backend" + env_file: ./backend.env + container_name: dfsp_mock_backend2 + ports: + - "23000:3000" + depends_on: + - scheme-adapter2 + + scheme-adapter2: + image: "mojaloop/sdk-scheme-adapter:latest" + env_file: ./scheme-adapter.env + container_name: sa_sim2 + depends_on: + - redis2 +``` +scheme-adapter.env +``` +DFSP_ID=payerfsp +CACHE_HOST=redis2 +PEER_ENDPOINT=sa_sim1:4000 +BACKEND_ENDPOINT=dfsp_mock_backend2:3000 +AUTO_ACCEPT_PARTY=true +AUTO_ACCEPT_QUOTES=true +VALIDATE_INBOUND_JWS=false +VALIDATE_INBOUND_PUT_PARTIES_JWS=false +JWS_SIGN=true +JWS_SIGN_PUT_PARTIES=true + +``` + +backend.env +``` +OUTBOUND_ENDPOINT=http://sa_sim2:4001 +``` + +Démarrer : +``` +cd src/ +docker-compose up -d +``` + +## Essayer un envoi de fonds + +Envoyer des fonds depuis `payerfsp` (*Mock DFSP*) vers un MSISDN présent chez `payeefsp` (simulateur Mojaloop), via le *scheme adapter*. + +Exemple d’appel vers le *Mock DFSP* : +``` +curl -X POST \ + http://localhost:23000/send \ + -H 'Content-Type: application/json' \ + -d '{ + "from": { + "displayName": "John Doe", + "idType": "MSISDN", + "idValue": "123456789" + }, + "to": { + "idType": "MSISDN", + "idValue": "9876543210" + }, + "amountType": "SEND", + "currency": "USD", + "amount": "100", + "transactionType": "TRANSFER", + "note": "test payment", + "homeTransactionId": "123ABC" +}' +``` + +La réponse doit indiquer un `currentState` à **COMPLETED**. diff --git a/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-to-scheme-adapter/scheme-adapter-to-scheme-adapter-overview.png b/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-to-scheme-adapter/scheme-adapter-to-scheme-adapter-overview.png new file mode 100644 index 000000000..35702294c Binary files /dev/null and b/docs/fr/technical/technical/sdk-scheme-adapter/usage/scheme-adapter-to-scheme-adapter/scheme-adapter-to-scheme-adapter-overview.png differ diff --git a/docs/fr/technical/technical/security/assets/diagrams/vulnerabilityManagement/dependency-vulnerability-management-process.png b/docs/fr/technical/technical/security/assets/diagrams/vulnerabilityManagement/dependency-vulnerability-management-process.png new file mode 100644 index 000000000..736a5190c Binary files /dev/null and b/docs/fr/technical/technical/security/assets/diagrams/vulnerabilityManagement/dependency-vulnerability-management-process.png differ diff --git a/docs/fr/technical/technical/security/assets/diagrams/vulnerabilityManagement/dependency-vulnerability-management-process.puml b/docs/fr/technical/technical/security/assets/diagrams/vulnerabilityManagement/dependency-vulnerability-management-process.puml new file mode 100644 index 000000000..088f3c16d --- /dev/null +++ b/docs/fr/technical/technical/security/assets/diagrams/vulnerabilityManagement/dependency-vulnerability-management-process.puml @@ -0,0 +1,107 @@ +@startuml dependency-vulnerability-management-process +!theme cerulean + +skinparam ActivityBackgroundColor #f0f0f0 +skinparam ActivityBorderColor #333333 +skinparam ArrowColor #333333 +skinparam backgroundColor white +skinparam ActivityFontColor black +skinparam ActivityFontSize 14 +skinparam noteFontColor black +skinparam ArrowFontColor black +skinparam PartitionFontColor #000000 +skinparam PartitionFontStyle bold +skinparam PartitionBorderColor #333333 +skinparam PartitionBackgroundColor #f8f8f8 + +title Processus de gestion des vulnérabilités des dépendances + +start + +partition "Outils de détection des vulnérabilités" { + :Identifier la vulnérabilité; + fork + :Alertes GitHub Dependabot; + fork again + :npm run audit:check; + note right: audit-ci.jsonc avec liste d’autorisation + fork again + :Analyse d’image Grype; + note right: .grype.yaml avec section d’ignorance + end fork +} + +partition "Processus de tri" { + :Trier la vulnérabilité; + :Évaluer le niveau de gravité; + fork + :Critique : 1 à 3 jours; + note right #FF6666: Action immédiate + fork again + :Élevé : 30 jours; + note right #FFCC66: Priorité élevée + fork again + :Moyen : 60 jours; + note right #FFFF66: Priorité moyenne + fork again + :Faible : 90 jours; + note right #99FF99: Priorité faible + end fork + :Agir selon la gravité\net les échéances de correction; +} + +partition "Processus de mise à jour" { + :Choisir un seul module à mettre à jour; + :Mettre à jour package.json; + :Exécuter les tests; + if (Tests OK ?) then (Oui) + :Créer une pull request; + else (Non) + if (Correction impossible ?) then (Oui) + fork + :Mettre à jour audit-ci.jsonc; + note right #F9E0FF: Pour les problèmes npm + fork again + :Mettre à jour .grype.yaml; + note right #F9E0FF: Pour les conteneurs + end fork + :Créer une pull request; + else (Non) + :Ajuster la mise à jour; + note right #F9E0FF + Envisager des solutions de repli + Contacter le mainteneur du paquet + end note + :Réexécuter les tests; + endif + endif + :Revue de code; + if (Résultat de la revue) then (Approuvé) + :Fusionner la PR; + else (Modifications demandées) + :Mettre à jour la PR; + endif +} + +partition "CI/CD" { + :Pipeline CI/CD; + :Contrôles de sécurité; + fork + :Contrôle audit-ci; + fork again + :Analyse Grype; + end fork + if (Contrôles OK ?) then (Oui) + :Publication / release; + else (Non) + :Corriger les problèmes de sécurité; + endif +} + +if (Autres vulnérabilités ?) then (Oui) + :Revenir au choix du module; +else (Non) + stop +endif + +@enduml diff --git a/docs/fr/technical/technical/security/assets/diagrams/vulnerabilityManagement/dependency-vulnerability-management-process.svg b/docs/fr/technical/technical/security/assets/diagrams/vulnerabilityManagement/dependency-vulnerability-management-process.svg new file mode 100644 index 000000000..a58b4cfa9 --- /dev/null +++ b/docs/fr/technical/technical/security/assets/diagrams/vulnerabilityManagement/dependency-vulnerability-management-process.svg @@ -0,0 +1,305 @@ + + Processus de gestion des vulnérabilités des dépendances + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Processus de gestion des vulnérabilités des dépendances + + + + Outils de détection des vulnérabilités + + Identifier la vulnérabilité + + + Alertes GitHub Dependabot + + + audit-ci.jsonc avec liste d’autorisation + + npm run audit:check + + + .grype.yaml avec section d’ignorance + + Analyse d’image Grype + + + + Processus de tri + + Trier la vulnérabilité + + Évaluer le niveau de gravité + + + + Action immédiate + + Critique : 1 à 3 jours + + + Priorité élevée + + Élevé : 30 jours + + + Priorité moyenne + + Moyen : 60 jours + + + Priorité faible + + Faible : 90 jours + + + Agir selon la gravité + et les échéances de correction + + + Processus de mise à jour + + Choisir un seul module à mettre à jour + + Mettre à jour package.json + + Exécuter les tests + + Tests OK ? + Oui + Non + + Créer une pull request + + Correction impossible ? + Oui + Non + + + + Pour les problèmes npm + + Mettre à jour audit-ci.jsonc + + + Pour les conteneurs + + Mettre à jour .grype.yaml + + + Créer une pull request + + + Envisager des solutions de repli + Contacter le mainteneur du paquet + + Ajuster la mise à jour + + Réexécuter les tests + + + + Revue de code + + Résultat de la revue + Approuvé + Modifications demandées + + Fusionner la PR + + Mettre à jour la PR + + + + CI/CD + + Pipeline CI/CD + + Contrôles de sécurité + + + Contrôle audit-ci + + Analyse Grype + + + Contrôles OK ? + Oui + Non + + Publication / release + + Corriger les problèmes de sécurité + + + Revenir au choix du module + + Oui + Autres vulnérabilités ? + Non + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/fr/technical/technical/security/assets/screenshots/vulnerabilityManagement/audit-check-script.png b/docs/fr/technical/technical/security/assets/screenshots/vulnerabilityManagement/audit-check-script.png new file mode 100644 index 000000000..551ea6515 Binary files /dev/null and b/docs/fr/technical/technical/security/assets/screenshots/vulnerabilityManagement/audit-check-script.png differ diff --git a/docs/fr/technical/technical/security/assets/screenshots/vulnerabilityManagement/gh-dependabot-alert.png b/docs/fr/technical/technical/security/assets/screenshots/vulnerabilityManagement/gh-dependabot-alert.png new file mode 100644 index 000000000..4c14b2661 Binary files /dev/null and b/docs/fr/technical/technical/security/assets/screenshots/vulnerabilityManagement/gh-dependabot-alert.png differ diff --git a/docs/fr/technical/technical/security/assets/screenshots/vulnerabilityManagement/gh-dependabot-alerts.png b/docs/fr/technical/technical/security/assets/screenshots/vulnerabilityManagement/gh-dependabot-alerts.png new file mode 100644 index 000000000..a77a907b2 Binary files /dev/null and b/docs/fr/technical/technical/security/assets/screenshots/vulnerabilityManagement/gh-dependabot-alerts.png differ diff --git a/docs/fr/technical/technical/security/assets/screenshots/vulnerabilityManagement/grype-scan-vulnerabilities-ci.png b/docs/fr/technical/technical/security/assets/screenshots/vulnerabilityManagement/grype-scan-vulnerabilities-ci.png new file mode 100644 index 000000000..d9d3a289b Binary files /dev/null and b/docs/fr/technical/technical/security/assets/screenshots/vulnerabilityManagement/grype-scan-vulnerabilities-ci.png differ diff --git a/docs/fr/technical/technical/security/assets/screenshots/vulnerabilityManagement/severity-id-allowed.png b/docs/fr/technical/technical/security/assets/screenshots/vulnerabilityManagement/severity-id-allowed.png new file mode 100644 index 000000000..3a35c25b3 Binary files /dev/null and b/docs/fr/technical/technical/security/assets/screenshots/vulnerabilityManagement/severity-id-allowed.png differ diff --git a/docs/fr/technical/technical/security/assets/screenshots/vulnerabilityManagement/severity-level-allowed.png b/docs/fr/technical/technical/security/assets/screenshots/vulnerabilityManagement/severity-level-allowed.png new file mode 100644 index 000000000..2c313578f Binary files /dev/null and b/docs/fr/technical/technical/security/assets/screenshots/vulnerabilityManagement/severity-level-allowed.png differ diff --git a/docs/fr/technical/technical/security/dependency-vulnerability-management.md b/docs/fr/technical/technical/security/dependency-vulnerability-management.md new file mode 100644 index 000000000..d8ca993e7 --- /dev/null +++ b/docs/fr/technical/technical/security/dependency-vulnerability-management.md @@ -0,0 +1,605 @@ +# Guide de gestion des vulnérabilités de dépendances Mojaloop + +Ce guide décrit le processus de gestion des vulnérabilités de sécurité dans les dépendances des dépôts GitHub de l'organisation Mojaloop. + +Ce guide se concentre principalement sur les vulnérabilités des dépendances. Pour les vulnérabilités découvertes dans le code source propre à Mojaloop (et non dans les dépendances), veuillez envoyer des informations détaillées par email à security@mojaloop.io et suivre la politique de Divulgation Coordonnée des Vulnérabilités (CVD). + +La politique CVD de Mojaloop prévoit un processus structuré pour le signalement, la validation et la remédiation des vulnérabilités dans le code Mojaloop. Elle garantit une divulgation responsable qui équilibre le besoin de protéger les utilisateurs tout en fournissant des informations transparentes sur les problèmes de sécurité. Cette politique inclut des délais clairs pour la réponse, la validation, la remédiation et la divulgation publique, permettant à l’équipe Sécurité de Mojaloop de traiter les vulnérabilités de façon coordonnée et d’en minimiser le risque pour les adoptants et utilisateurs du logiciel. + +## Table des matières + +- [Résumé exécutif](#executive-summary) +- [Vue d'ensemble](#overview) +- [Guide de démarrage rapide](#quickstart-guide) +- [Guide détaillé](#detailed-guide) + - [1. Comprendre ce qu’est une vulnérabilité et où les trouver](#1-understanding-what-is-a-vulnerability-and-where-to-find-them) + - [2. Flux de gestion pour les mises à jour de vulnérabilités de dépendances](#2-processflow-for-handling-dependency-vulnerability-updates) + - [3. Guide pratique pour les mises à jour de package.json](#3-practical-guide-to-packagejson-updates) + - [4. Bonnes pratiques de revue de code pour les PRs de sécurité](#4-code-review-best-practices-for-security-prs) + - [5. Intégration des développeurs et formation sur la gestion des vulnérabilités de dépendances](#5-developer-onboarding-and-dependency-vulnerability-management-education) + - [6. Amélioration continue](#6-continuous-improvement) + - [7. Conclusion](#7-conclusion) +- [Outils et ressources](#tools-and-resources) +- [Documentation associée](#related-documentation) + +## Résumé exécutif + +Ce guide propose une approche structurée pour le traitement des vulnérabilités de sécurité dans les dépendances des dépôts Mojaloop. Il répond au besoin actuel d’un processus standardisé pouvant aider les développeurs à comprendre les rapports de vulnérabilités (notamment les alertes GitHub Dependabot, résultats de npx audit et des scans grype), à appliquer les correctifs appropriés et à prioriser les mises à jour de sécurité dans l’ensemble du code. + +## Vue d’ensemble + +Le processus de gestion des vulnérabilités des dépendances de Mojaloop vise à : +- Identifier les vulnérabilités de sécurité dans les dépendances et le code +- Évaluer l’impact et la sévérité des vulnérabilités +- Prioriser les efforts de remédiation +- Suivre et vérifier les correctifs +- Maintenir la conformité en matière de sécurité + +## Guide de démarrage rapide + +Ce guide de démarrage rapide fournit les étapes essentielles pour la gestion des vulnérabilités dans les dépôts Mojaloop sans informations préalables. Pour des explications détaillées, voir les sections complètes ci-après. + +### 1. Détecter les vulnérabilités + +- Lancez `npm run audit:check` pour identifier les vulnérabilités des packages npm +- Vérifiez les alertes GitHub Dependabot dans l’onglet Sécurité de votre dépôt (si vous avez accès à l’onglet Sécurité) +- Utilisez Grype pour analyser les images de conteneurs, déclenché automatiquement si vous utilisez Mojaloop orb pour CircleCI et le rapport peut être consulté sur CircleCI (si vous avez accès à CircleCI) + +### 2. Évaluer et Prioriser + +- **Critique** : Corrigez sous 1 à 3 jours ouvrés +- **Élevé** : Corrigez sous 30 jours +- **Moyenne** : Corrigez sous 60 jours +- **Faible** : Corrigez sous 90 jours + +### 3. Processus de correction + +1. Agir selon la sévérité et les dates cibles de correction +2. Sélectionnez un seul module à mettre à jour +3. Mettez à jour la dépendance vulnérable dans package.json +4. Exécutez les tests comme indiqué dans le README du dépôt pour vérifier la fonctionnalité +5. Si les tests passent, créez une pull request +6. Si les tests échouent et que vous ne pouvez pas corriger : + - Ajoutez à la allowlist dans audit-ci.jsonc (pour les packages npm) + - Ajoutez à la section ignore dans .grype.yaml (pour les vulnérabilités en conteneur) +7. Incluez tous les détails sur la vulnérabilité corrigée dans la PR + +### 4. Modèle de PR + +```markdown +## Correction de sécurité : [GHSA-ID ou CVE-ID] + +### Détails de la vulnérabilité +- Sévérité : [Critique/Élevé/Moyenne/Faible] +- Package affecté : [nom du package] +- Versions vulnérables : [plage de versions] +- Version corrigée : [numéro de version] + +### Description +Brève description de la vulnérabilité et de son impact potentiel. + +### Modifications +- Mise à jour de [nom du package] de [ancienne version] à [nouvelle version] + +### Tests +- [X] Tests unitaires réussis +- [X] Tests d’intégration réussis +- [X] Tests manuels effectués +``` + +### 5. Revue et fusion + +- Veillez à ce que la mise à jour corrige correctement la vulnérabilité +- Vérifiez que les modifications dans package.json sont minimales +- Confirmez que tous les tests passent +- Contrôlez l’absence d’effets de bord inattendus +- Fusionnez après approbation + +## Guide détaillé + +Les sections suivantes apportent des explications complètes, des informations contextuelles et des procédures détaillées pour la gestion des vulnérabilités dans les dépôts Mojaloop. + +## 1. Comprendre ce qu’est une vulnérabilité et où les trouver + +Une vulnérabilité est identifiée par un identifiant CVE (Common Vulnerabilities and Exposures), qui est un identifiant standardisé pour les vulnérabilités de sécurité connues publiquement. + +### Systèmes d’identifiants de vulnérabilité : CVE et GHSA + +#### CVE (Common Vulnerabilities and Exposures) +Les CVE sont des identifiants standardisés pour les vulnérabilités de cybersécurité connues publiquement, maintenus par la société MITRE et financés par le département américain de la Sécurité intérieure. Chaque CVE a un identifiant unique au format CVE-YYYY-NNNNN (année-numéro). + +#### GHSA (GitHub Security Advisory) +Les identifiants GHSA sont des identifiants spécifiques à GitHub utilisés dans la base de conseils de sécurité GitHub. Ils suivent le format GHSA-XXXX-YYYY-ZZZZ, où X, Y et Z sont des caractères alphanumériques. + +#### Relation entre CVE et GHSA +- Un GHSA peut référencer un ou plusieurs CVE, car GitHub peut regrouper plusieurs vulnérabilités liées +- Tous les GHSAs n'ont pas un CVE correspondant, en particulier pour les vulnérabilités nouvellement découvertes +- GitHub assigne souvent un identifiant GHSA avant qu’un CVE ne soit attribué par MITRE +- Les deux systèmes décrivent les mêmes vulnérabilités mais peuvent contenir des informations légèrement différentes : + - Les CVE sont la norme utilisée dans les outils et bases de données de sécurité + - Les GHSAs contiennent souvent plus d’informations propres à l'écosystème et des conseils de remédiation pour les utilisateurs GitHub + +#### Appartion des identifiants dans les outils + +- **Alertes GitHub Dependabot** : Affichent à la fois les identifiants GHSA et CVE (lorsqu’un CVE est attribué) + + ![Liste des alertes GitHub Dependabot](./assets/screenshots/vulnerabilityManagement/gh-dependabot-alerts.png) + *Vue des alertes Dependabot dans GitHub Sécurité* + + ![Détail d'une alerte GitHub Dependabot](./assets/screenshots/vulnerabilityManagement/gh-dependabot-alert.png) + *Alerte dependabot détaillée* + +- **npm run audit:check** : Les résultats affichent les identifiants GHSA pour les vulnérabilités + + ![Script Audit Check](./assets/screenshots/vulnerabilityManagement/audit-check-script.png) + *Exécution du script npm run audit:check* + + ![Niveau de sévérité autorisé](./assets/screenshots/vulnerabilityManagement/severity-level-allowed.png) + *Augmentation du niveau de vulnérabilité accepté à low, précédemment moderate* + + ![ID de sévérité autorisé](./assets/screenshots/vulnerabilityManagement/severity-id-allowed.png) + *Allowlist d'un identifiant de vulnérabilité à ignorer lors de npm run audit:check* + +- **Scan Grype** : Affiche les vulnérabilités portant des identifiants GHSA + + ![Vulnérabilités Grype Scan](./assets/screenshots/vulnerabilityManagement/grype-scan-vulnerabilities-ci.png) + *Vulnérabilités détectées par Grype dans CircleCI* + +#### Accéder aux informations détaillées d’une vulnérabilité + +Les identifiants GHSA peuvent être utilisés comme URLs directes pour accéder à plus d’informations. Il suffit d’ajouter l’ID GHSA à l’URL de base des avis de sécurité GitHub : + +``` +https://github.com/[owner]/[repo]/security/advisories/[GHSA-ID] +``` + +ou utilisez l’URL générique de la base d’avis GitHub : + +``` +https://github.com/advisories/[GHSA-ID] +``` + +Par exemple, une vulnérabilité du package multer est accessible via : +https://github.com/expressjs/multer/security/advisories/GHSA-44fp-w29j-9vj5 + +De même, lorsqu’un CVE est attribué à une vulnérabilité, vous pouvez consulter son dossier officiel via : + +``` +https://www.cve.org/CVERecord?id=[CVE-ID] +``` + +Pour le même exemple multer, l’information CVE correspondante se trouve sur : +https://www.cve.org/CVERecord?id=CVE-2025-47935 + +#### Sources d’information sur les vulnérabilités + +**Pages d’avis de sécurité GitHub :** +- Descriptions détaillées des vulnérabilités +- Versions affectées et corrigées +- ID CVE (lorsqu’attribués) +- Scores de sévérité (généralement CVSS) +- Conseils de remédiation +- Références à des issues et commits liés + +**Pages d’enregistrement CVE :** +- Descriptions officielles des vulnérabilités +- Références vers des ressources liées +- Produits et versions affectés +- Informations standardisées sur la sévérité +- Informations d’attribution + +Il est souvent pertinent de consulter les deux sources car elles peuvent donc être complémentaires. + +En travaillant sur des vulnérabilités Mojaloop, vous pouvez rencontrer les deux types d’identifiants : +- CVE dans les bulletins et outils généraux (npm audit) +- GHSA dans les alertes GitHub Dependabot et dans les fichiers de configuration .grype.yaml + +La section des alertes Dependabot d’un dépôt GitHub est accessible dans l’onglet Sécurité > Alertes de vulnérabilité. Cliquez sur Dependabot pour obtenir la liste des alertes, puis sur une alerte pour voir le détail. + +Note : Votre compte GitHub doit disposer de l’autorisation d’accès à l’onglet Sécurité et Dependabot doit être activé sur le dépôt en question. Contactez un administrateur GitHub Mojaloop si besoin. + +### 1.1 Niveaux de sévérité des vulnérabilités + +Les vulnérabilités sont classées selon quatre niveaux de sévérité : + +- **Critique** : Nécessite une attention immédiate. Généralement exécution de code à distance, contournement d’authentification ou autres failles graves menant à la compromission du système. +- **Élevé** : Vulnérabilités sérieuses à corriger avant la fin d’un incrément de programme (PI), cible de 30 jours. +- **Moyenne** : Risques modérés à corriger dans le PI en cours si possible, cible de 60 jours. +- **Faible** : Problèmes mineurs à faible risque à traiter si possible sous 90 jours. + +**Note sur les identifiants CVE :** Quand un rapport de vulnérabilité ne mentionne pas de CVE, cela peut signifier : +1. La vulnérabilité vient d’être découverte (pas encore de CVE attribué) +2. Il s’agit d’un problème dû à l’implémentation spécifique dans projet +3. C’est une dépendance de développement qui n’affecte pas la production + +L’absence de CVE ne signifie pas que la vulnérabilité n’est pas importante – elle doit tout de même être évaluée selon sa sévérité et son impact potentiel. + +### 1.2 Comprendre les plages de versions dans les alertes Dependabot + +Les plages de versions dans les alertes Dependabot indiquent quelles versions d’un package/dépendance sont affectées. Notez que dans une alerte Dependabot, le "package" correspond à une dépendance du package.json d’un projet NodeJS. Les dépendances et leurs packages suivent la gestion sémantique de version. Comprendre ces notations est crucial : + +- **`<=M.m.p`** : Toutes les versions inférieures ou égales à la version spécifiée sont vulnérables. + - Exemple : `<=1.2.3` signifie toutes les versions jusqu’à 1.2.3 inclus. + +- **Plage `>M.m.p 1.0.0 <1.2.0` signifie toutes les versions après 1.0.0 et avant 1.2.0. + +Autres spécificateurs fréquents : + +- **Caret (`^`)** : Permet les changements ne modifiant pas le chiffre non nul le plus à gauche. + - Exemple : `^1.2.3` autorise toutes les versions à partir de 1.2.3 jusqu’à 2.0.0 non inclus. + - Pour `^0.2.3`, versions de 0.2.3 à 0.3.0 non inclus. + - Pour `^0.0.3`, versions de 0.0.3 à 0.0.4 non inclus. + +- **Tilde (`~`)** : Permet les mises à jour du patch si une version mineure est spécifiée. + - Exemple : `~1.2.3` autorise toute version de 1.2.3 jusqu’à 1.3.0 non inclus. + +## Sources de vulnérabilité + +Les vulnérabilités peuvent être introduites via : +1. Dépendances directes +2. Dépendances transitives +3. Environnements d’exécution +4. Composants d’infrastructure +5. Code personnalisé + +## Détection et Évaluation + +### Outils de détection des vulnérabilités + +Mojaloop utilise plusieurs outils pour détecter les vulnérabilités : + +1. **Alertes GitHub Dependabot** + - Détection automatique des vulnérabilités dans GitHub + - Informations détaillées sur les versions affectées et les correctifs + - Disponible sous l’onglet Sécurité de GitHub + - **Assets scannés :** dépendances NodeJS déclarées dans les package.json des dépôts GitHub + +2. **npm audit via audit-ci** + - S’exécute localement via `npm run audit:check` + - Configurable via `audit-ci.jsonc` avec allowlist pour les problèmes connus + - Intégré dans les pipelines CI/CD pour éviter le déploiement de code vulnérable + - **Assets scannés :** dépendances NodeJS directes et transitives (package.json et package-lock.json) + +3. **Scan d’images Grype** + - Scanner de vulnérabilités d’images de conteneur + - Configurable par `.grype.yaml` avec section d’ignorés pour soucis connus + - Analyse les vulnérabilités dans les images conteneur et leurs dépendances + - **Assets scannés :** images Docker, incluant les images de base, paquets OS installés et dépendances applicatives + - NOTE : Grype scanne aussi les images Docker si le dépôt en produit, des vulnérabilités peuvent y figurer ; si oui, une mise à jour de l’image de base dans le Mojaloop CircleCI orb est nécessaire. + +### Fichiers de configuration pour la gestion des vulnérabilités + +1. **audit-ci.jsonc** + - Contient une liste d’autorisation des vulnérabilités à ignorer temporairement + - À utiliser si une vulnérabilité ne peut pas être corrigée immédiatement + - Utilise les ID GHSA pour identifier les vulnérabilités à ignorer + - Doit inclure une justification et un suivi pour chaque vulnérabilité autorisée + - Exemple : + ```json + { + "allowlist": [ + { + "id": "GHSA-XXXX-YYYY-ZZZZ", + "reason": "Pas encore de correctif, plan B en place, suivi sur issue #123" + } + ] + } + ``` + +2. **.grype.yaml** + - Fichier de configuration pour le scan Grype + - Contient une section ignore avec des ID GHSA + - Utilisé pour les vulnérabilités spécifiques au conteneur non traitables immédiatement + - Exemple : + ```yaml + ignore: + - vulnerability: GHSA-XXXX-YYYY-ZZZZ + package: + name: nom-package + version: 1.2.3 + until: "2023-12-31" + reason: "Étude de solutions alternatives, pas exploitable dans notre contexte" + ``` + +### Scan automatisé +- Scan régulier des dépendances via npm audit +- Scan des images conteneur +- Scan de vulnérabilités de l’infrastructure +- Analyse statique du code + +### Revue manuelle +- Revues de code de sécurité +- Tests d’intrusion (pentest) +- Modélisation de menace +- Audits de conformité + +## 2. Flux de gestion pour les mises à jour de vulnérabilités de dépendances + +Le schéma suivant illustre le processus de gestion des vulnérabilités de dépendances pour les dépôts Mojaloop : + +![Processus de gestion des vulnérabilités de dépendances](./assets/diagrams/vulnerabilityManagement/dependency-vulnerability-management-process.png) + +### 2.1 Processus standard + +1. **Triage** + - Révision régulière des alertes GitHub Dependabot. + - Classification selon la sévérité (Critique, Élevé, Moyenne, Faible). + - Suivi des vulnérabilités dans un projet GitHub privé dédié aux issues de sécurité. Accès restreint, sur demande : contactez le comité Sécurité Mojaloop si besoin d’accès. + +2. **Processus de mise à jour** + - **Étape 1** : Choisissez un seul module (service Mojaloop ou librairie) avec vulnérabilité signalée. + - **Étape 2** : Mettez à jour la dépendance incriminée dans le package.json. + - **Étape 3** : Effectuez des tests de fumée pour garantir que la fonctionnalité n’est pas rompue. Voir le README du dépôt. + - **Étape 4** : Si les tests sont OK, créez une pull request. + - **Étape 5** : Proposez une PR pour chaque module avec un seul patch correctif de sécurité. + - **Étape 6** : Ajoutez dans la PR les détails de la vulnérabilité corrigée : ID CVE, dépendances mises à jour dans package.json, et toute information contextuelle utile. + +3. **Principes importants** + - **Isolation** : Un correctif de vulnérabilité à la fois. + - **Pas d’agrégation** : Aucun regroupement de correctifs de sécurité non liés. + - **Historique propre** : Rebasez les commits pour garder l’historique propre. + - **Tests systématiques** : Lancez systématiquement les tests requis (voir README). + +### 2.2 Cadre de priorisation + +- **Sévérité critique** : Attention immédiate ; objectif : 1 à 3 jours ouvrés. +- **Sévérité élevée** : Corriger avant la fin du PI actuel, cible 30 jours. +- **Sévérité moyenne** : Corriger avant la fin du PI actuel si possible, cible 60 jours. +- **Sévérité faible** : Traiter lors des cycles de maintenance courants, cible 90 jours. + +### 2.3 Critères d’évaluation des vulnérabilités + +Mojaloop suit les bonnes pratiques OpenSSF et OWASP. Les décisions finales relèvent du comité Sécurité Mojaloop. + +Pour décider de corriger ou d’ignorer : +- Si un correctif existe, il doit être appliqué. +- N’ignorer qu’en cas de rupture de fonctionnalité avérée : échec des tests automatisés/manuels (voir README). +- Pour les failles « zero-day », le comité Sécurité Mojaloop précisera la marche à suivre au cas par cas. + +## 3. Guide pratique pour la mise à jour de package.json + +### 3.1 Outils recommandés + +- **npm run audit:check** : Pour rechercher les vulnérabilités ; le script doit aider à identifier les vulnérabilités et doit correspondre à celles listées dans Dependabot + ```bash + npm run audit:check + ``` + +- **npm run dep:check & npm run dep:update** : Pour gérer les mises à jour de dépendances, attention aux modifications massives +- **.ncurc.yaml** : Pour déclarer les dépendances à exclure des upgrades (dernier recours) + +### 3.2 Étapes pas à pas + +1. **Identifier le package vulnérable** : + ```bash + npm audit + ``` + +2. **Mettre à jour un package unique** : + ```bash + # Pour les dépendances directes + npm update [nom-du-package] + + # Pour corriger une vulnérabilité spécifique + npm run audit:fix + + # Pour les cas complexes qui cassent la compatibilité + npm audit fix --force # À utiliser avec précaution + ``` + +3. **Tester la mise à jour :** + ```bash + npm test + # Lancez aussi les autres tests projet + ``` + +4. **Commit et création de PR :** + ```bash + git checkout -b fix/security-vulnerability-[CVE-ID] + git add package.json package-lock.json + git commit -m "fix: mise à jour [package] pour [CVE-ID]" + git push origin fix/security-vulnerability-[CVE-ID] + ``` + +### 3.3 Gestion des cas complexes + +Quand `npm run audit:fix` ne résout pas : + +1. **Dépendances sans correctifs disponibles :** + - Vérifiez si la faille est réellement exploitable dans votre contexte. + - Étudiez un remplacement. + - Contactez le mainteneur du package. + - Documentez la faille et l’évaluation du risque. + +2. **Si la correction casse la fonctionnalité :** + - Si les tests échouent, aucune solution immédiate : + - Pour npm : Ajouter à la allowlist `audit-ci.jsonc` + - Pour les conteneurs : Ajouter à la section ignore de `.grype.yaml` + - Documentez la raison, le numéro d’issue, explication du risque, date cible de résolution et toute mesure compensatoire. + +3. **Intégration CI/CD :** + - Les contrôles de sécurité sont intégrés aux pipelines + - Les vulnérabilités critiques font échouer le pipeline sauf si correctement ignorées + - Toutes les vulnérabilités ignorées doivent être revues régulièrement + - Les scans doivent détecter en continu de nouvelles vulnérabilités + +### 3.4 Gestion des vulnérabilités des conteneurs + +Pour les images Docker : + +1. **Configuration Grype :** + - Grype est utilisé pour scanner les images conteneur + - Pour la configuration détaillée, voir [documentation Mojaloop CI Config Orb](https://github.com/mojaloop/ci-config-orb-build?tab=readme-ov-file#vulnerability-image-scan-configuration) + +2. **Sécurité de l’image de base :** + - Les services Mojaloop utilisent généralement les images Node.js Alpine + - L’image de base courante : [node:22.15.1-alpine3.21](https://hub.docker.com/layers/library/node/22.15.1-alpine3.21/images/sha256-d1068d8b737ffed2b8e9d0e9313177a2e2786c36780c5467ac818232e603ccd0) + - Cette page liste les vulnérabilités de l’image de base et le scan grype les détecte aussi. + +## Stratégie de mise à jour + +Pour corriger les vulnérabilités : +1. Suivez la séquence de mise à jour du dépôt ([Guide de mise à jour Mojaloop](./mojaloop-repository-update-guide.md)) +2. Priorisez les failles critiques et à haute sévérité +3. Considérez l’impact sur les services dépendants +4. Testez en profondeur hors production +5. Planifiez des mises à jour coordonnées entre les services concernés + +## 4. Bonnes pratiques de revue de code pour les PRs de sécurité + +1. **PR focalisées** : Chaque PR doit traiter une seule vulnérabilité. + +2. **Informations requises dans les PRs** : + - ID CVE ou identifiant de vulnérabilité + - Niveau de sévérité + - Description de la vulnérabilité + - Description du correctif + - Tests effectués + - Évaluation de l’impact potentiel + +3. **Checklist de review** : + - Vérifiez que la mise à jour corrige effectivement la faille + - Vérifiez que les modifs à package.json sont minimales + - Vérifiez que tous les tests passent + - Confirmez que les tests de fumée décrits dans le README ont été suivis + - Vérifiez qu’il n’y a pas d’effets de bord inattendus + +4. **Modèle de description de PR** : + ```markdown + ## Correction de sécurité : [CVE-ID] + + ### Détails de la vulnérabilité + - Sévérité : [Critique/Élevé/Moyenne/Faible] + - Package concerné : [nom-du-package] + - Plages de versions vulnérables : [plage] + - Version corrigée : [numéro] + + ### Description + Brève description de la vulnérabilité et de son impact potentiel. + + ### Modifications + - Mise à jour de [nom-du-package] de [ancienne version] à [nouvelle version] + + ### Tests + - [X] Tests unitaires réussis + - [X] Tests d’intégration réussis + - [X] Tests manuels réalisés + - [X] Utilisation du test code harness sur l’ordi du dev + - [X] Harness de tests CI/CD ou tests Golden Path effectifs + + ### Notes additionnelles + Toutes autres informations pertinentes. + ``` + +## Signalement et communication + +- Centralisez le suivi des vulnérabilités et limitez l’accès aux besoins +- Documentez tous les problèmes identifiés +- Suivez l’avancée des corrections +- Communiquez sur l’état aux parties prenantes +- Respectez les principes de divulgation responsable + +## 5. Intégration des développeurs et formation gestion des vulnérabilités + +Pour utiliser la gestion des vulnérabilités comme point de départ pour les nouveaux devs de Mojaloop : + +### 5.1 Ressources pédagogiques + +- Créer une section dédiée dans la doc pour la gestion des vulnérabilités +- Inclure des exemples pratiques et des tutoriels pas-à-pas +- Proposer des liens vers les ressources Node.js sécurité + +### 5.2 Processus de mentorat + +1. **Vulnérabilités simples assignées** : Débutez les nouveaux devs par la correction de failles à faible priorité. +2. **Reviews en binôme** : Les PRs des nouveaux sont relues par des développeurs expérimentés. +3. **Montée en autonomie** : Confiez progressivement des tâches de sécurité plus complexes. + +### 5.3 Mise à jour de la documentation + +- Maintenir une base de connaissances sur les vulnérabilités fréquentes dans le code +- Documenter les leçons apprises lors des corrections précédentes +- Mettre à jour ce guide de gestion des vulnérabilités au fil de l’évolution des processus + +### 5.4 La sécurité dans le développement quotidien + +Lors de l’intégration, ce document sera partagé et la conformité vérifiée lors des revues de code (PRs). Plusieurs outils open source d’analyse de sécurité IDE sont à l’étude pour améliorer encore le flux de travail des développeurs. + +## Meilleures pratiques + +1. **Prévention** + - Mises à jour régulières des dépendances + - Pratiques de développement centrées sur la sécurité + - Tests de sécurité automatisés + - Bonnes pratiques de codage sécurisé + +2. **Réponse** + - Voies d’escalade claires + - Délais de réponse définis + - Revues de sécurité régulières + - Supervision continue + +3. **Documentation** + - Suivi des vulnérabilités + - Procédures de remédiation + - Rapports d’incidents de sécurité + - Leçons apprises + +## 6. Amélioration continue + +### 6.1 Revues de sécurité régulières + +- Revues hebdomadaires des nouveaux rapports de vulnérabilités +- Suivi des métriques de délai de résolution par sévérité +- Comparatif avec les standards du secteur + +### 6.2 Automatisation + +- Étudier l’adoption de DefectDojo (open source) pour centraliser et automatiser la gestion du cycle de vie des vulnérabilités + - [Communauté DefectDojo](https://defectdojo.com/community) + - [Dépôt GitHub DefectDojo](https://github.com/DefectDojo/django-DefectDojo) + - [Projet OWASP DefectDojo](https://owasp.org/www-project-defectdojo/) + - [Documentation DefectDojo](https://docs.defectdojo.com/en/about_defectdojo/about_docs/) +- Implémenter des hooks pre-commit pour la vérification des dépendances +- Planifier des jobs réguliers d’audits de sécurité + +### 6.3 Partage de connaissances + +- Rédiger et maintenir documentation et formation sur la gestion des vulnérabilités +- Créer des vidéos pas-à-pas pour corriger les failles courantes +- Établir un programme de ‘security champions’ dans la communauté + +## 7. Conclusion + +En appliquant cette approche structurée, la communauté Mojaloop assure une gestion cohérente, rapide et efficace des problèmes de sécurité. Ce processus renforce la sécurité du code tout en offrant une excellente porte d’entrée pour intégrer de nouveaux développeurs et renforcer la culture sécurité. + +La gestion des vulnérabilités de dépendances ne se limite pas à corriger : il s’agit de bâtir un état d’esprit sécurité. + +## Outils et ressources + +- [Qu’est-ce qu’un CVE ?](https://www.ibm.com/think/topics/cve) +- [Documentation Mojaloop](https://docs.mojaloop.io/) +- [Node.js – Bonnes pratiques de sécurité](https://nodejs.org/en/learn/getting-started/security-best-practices) +- [Documentation npm Audit](https://docs.npmjs.com/cli/v10/commands/npm-audit) +- [Spécification SemVer](https://semver.org/) +- [Calculateur npm Semver](https://semver.npmjs.com/) +- [Fonctionnalités de sécurité GitHub](https://docs.github.com/en/code-security) +- [Guide rapide GitHub Dependabot](https://docs.github.com/en/code-security/getting-started/dependabot-quickstart-guide) +- [Mojaloop CI Config - Configuration du scan de vulnérabilité image](https://github.com/mojaloop/ci-config-orb-build?tab=readme-ov-file#vulnerability-image-scan-configuration) +- [Communauté DefectDojo](https://defectdojo.com/community) +- [Dépôt GitHub DefectDojo](https://github.com/DefectDojo/django-DefectDojo) +- [Projet OWASP DefectDojo](https://owasp.org/www-project-defectdojo/) +- [Documentation DefectDojo](https://docs.defectdojo.com/en/about_defectdojo/about_docs/) +- npm audit +- GitHub Security Advisories +- Outils de scan de conteneur +- Outils d’analyse statique +- Systèmes de surveillance de sécurité + +## Documentation associée + +- [Guide de stratégie de mise à niveau](./upgrade-strategy-guide.md) +- [Guide de mise à jour des dépôts Mojaloop](./mojaloop-repository-update-guide.md) +- [Dépannage du déploiement](./deployment-troubleshooting.md) +- [Politique de Divulgation Coordonnée des Vulnérabilités Mojaloop](https://docs.mojaloop.io/community/contributing/cvd.html) \ No newline at end of file diff --git a/docs/fr/technical/technical/security/security-overview.md b/docs/fr/technical/technical/security/security-overview.md new file mode 100644 index 000000000..e3029bf21 --- /dev/null +++ b/docs/fr/technical/technical/security/security-overview.md @@ -0,0 +1,180 @@ + +

    Processus de Gestion des Vulnérabilités Mojaloop

    + +Contenu : +1. [Introduction](#1-introduction) +2. [Comité de sécurité](#2-commité-de-sécurité) +3. [Gestion d’une vulnérabilité potentielle](#3-gestion-d-une-vulnérabilité-potentielle) +4. [Processus de gestion des vulnérabilités Mojaloop en place](#4-processus-de-gestion-des-vulnérabilités-mojaloop-en-place) +5. [Périmètre](#5-périmètre) + +

    1. Introduction

    + +Ce document décrit le Processus de Gestion des Vulnérabilités Mojaloop et fournit des lignes directrices à la communauté Mojaloop pour identifier, signaler, évaluer et traiter les vulnérabilités de sécurité dans les logiciels Mojaloop. En respectant les normes de sécurité reconnues, telles que l’ISO 27001, Mojaloop garantit une approche cohérente pour maintenir la sécurité et la résilience. + +Ce processus s’appuie sur les pratiques déjà établies par Mojaloop, garantissant un périmètre clair et des directives fiables pour les adoptants. Il met l'accent sur une gestion responsable des vulnérabilités jusqu’à ce que des correctifs vérifiés soient disponibles et correctement communiqués. + +Un processus de gestion des vulnérabilités structuré, transparent et efficace est essentiel pour maintenir la confiance et la protection de l’écosystème Mojaloop. + +

    2. Comité de sécurité

    + +Le processus de gestion des vulnérabilités de Mojaloop est soutenu par un "Comité de sécurité" désigné, groupe central chargé de coordonner tous les aspects de la gestion des vulnérabilités. Ce comité supervise notamment : + +1. La révision et la validation des signalements de vulnérabilités. +2. La décision d’accepter ou de rejeter les vulnérabilités signalées. +3. La définition des correctifs appropriés et la planification des annonces. +4. La coordination des versions intégrant des correctifs de sécurité. + +Le comité de sécurité est composé de contributeurs principaux et de leaders de la communauté, garantissant une gestion efficace et sécurisée des vulnérabilités. Sa structure et ses responsabilités sont conçues pour préserver la sécurité et l’intégrité de l’écosystème Mojaloop. + +

    3. Gestion d’une vulnérabilité potentielle

    + +Politique de divulgation des vulnérabilités Mojaloop (CVD) : [https://docs.mojaloop.io/community/contributing/cvd.html](https://docs.mojaloop.io/community/contributing/cvd.html) + +Le processus par défaut pour gérer une éventuelle vulnérabilité de sécurité dans Mojaloop est décrit dans le lien ci-dessus. Les projets requérant un processus différent doivent le documenter clairement et publiquement. + +Le processus concernant les dépendances tierces générales et autres modules open source est détaillé dans le guide [gestion des vulnérabilités de dépendances](dependency-vulnerability-management.md). + +

    Sécurité pour les membres de la communauté Mojaloop

    + +Les membres de la communauté Mojaloop et les organisations membres jouent un rôle clé dans la gestion des vulnérabilités, en particulier pour le respect des procédures établies en cas de découverte de vulnérabilités. Voici les étapes attendues : + +* Évitez d’entrer les détails des vulnérabilités dans des suivis de bugs publics, sauf si l’accès y est strictement limité. +* Les communications concernant la sécurité doivent être limitées à des canaux privés dédiés. Ces canaux ne servent pas à notifier le grand public. + +

    Travailler en privé

    + +Les informations sur une vulnérabilité ne doivent pas être rendues publiques avant qu'une annonce officielle n'ait été faite à la fin du processus. Cela signifie : + +* **Ne créez pas de tickets dans des suivis publics (par ex. GitHub/Zenhub) pour suivre l’incident**, car cela le rendrait public. +* **Les messages liés aux commits ne doivent pas révéler la nature sécuritaire du commit.** +* **Les discussions autour de la vulnérabilité, des corrections potentielles et des annonces doivent avoir lieu sur des canaux privés**, tels qu’une liste de diffusion sécurité du projet ou un canal dédié aux mainteneurs. +* Travaillez avec l’équipe sécurité Mojaloop (security at mojaloop dot io) pour suivre le processus CVD : https://docs.mojaloop.io/community/contributing/cvd.html + +

    Déclarer

    + +La personne ayant identifié la vulnérabilité (le rapporteur) doit remplir le rapport et l’envoyer par email à : **[security@mojaloop.io](mailto:security@mojaloop.io)**. +Des modèles de rapports peuvent s’inspirer du modèle de bug ici : https://github.com/mojaloop/project/issues . + +Liste des problèmes jugés pertinents : +1. Problèmes/vulnérabilités de sécurité dans les services principaux Mojaloop (code applicatif) +2. Problèmes/vulnérabilités de sécurité dans les services de support Mojaloop +3. Vulnérabilités larges ou "jours zéro" dans les dernières versions des dépendances critiques utilisées par les services principaux ou de support (ex : nodejs, kafka, mysql) + +Liste des problèmes non critiques ou à faible priorité (réponses pouvant être différées) : + +1. Vulnérabilités concernant le site [mojaloop.io](mojaloop.io) +2. Vulnérabilités concernant le site [docs.mojaloop.io](docs.mojaloop.io) + +

    Accuser réception

    + +L’équipe sécurité Mojaloop doit envoyer un email d’accusé de réception au rapporteur initial. L’accusé de réception inclura idéalement une copie à la liste de diffusion sécurité privée concernée. + +

    Analyser et répondre

    + +L’équipe analyse le rapport et le rejette ou l’accepte. + +1. L’information peut être partagée avec des experts du domaine en privé, à condition qu’ils comprennent qu’elle n’est pas destinée à être rendue publique. +2. En cas de rejet, l’équipe explique sa décision au rapporteur, avec copie à la liste de diffusion sécurité concernée. +3. En cas d’acceptation, l’équipe notifie au rapporteur que le rapport est en cours de traitement. + +

    Résoudre

    + +* L’équipe convient d’un correctif, généralement sur une liste privée. +* Les détails de la vulnérabilité et du correctif doivent être documentés pour générer des annonces préliminaires. +* Le rapporteur peut recevoir une copie du correctif et de l’annonce en projet pour commentaire. +* Le correctif est intégré sans mention du caractère sécurité dans le message du commit. +* Une version intégrant le correctif est publiée. Plus de détails dans la politique CVD Mojaloop. + +

    Annonce

    + +* Après la publication, la vulnérabilité et son correctif sont annoncés publiquement. +* L’annonce doit être envoyée aux destinataires concernés : rapporteur de la vulnérabilité, listes sécurité du projet et éventuellement listes publiques dédiées à la sécurité. + +

    Clôturer

    + +Les pages publiques de sécurité du projet doivent être mises à jour avec l’information sur la vulnérabilité afin d’assurer la transparence vis-à-vis des utilisateurs. + +

    4. Processus de gestion des vulnérabilités Mojaloop en place

    + +Mojaloop a mis en place une série de processus et outils robustes permettant de gérer les vulnérabilités tout au long du cycle de vie du développement logiciel, en conformité avec les meilleures pratiques du secteur et notamment la norme ISO 27001. + +

    Gestion des vulnérabilités

    + +La surveillance continue des composants open source pour les vulnérabilités est intégrée au pipeline CI/CD. Ce processus est automatisé pour évaluer chaque version, commit et pull request, en s’appuyant sur Node Package Manager (NPM) pour l’évaluation des vulnérabilités des dépendances. + +

    Test de sécurité applicatif statique (SAST)

    + +Mojaloop utilise plusieurs outils de SAST, offrant une vision détaillée des vulnérabilités dans le code, via l’usage de bases de données publiques de vulnérabilités, parmi lesquelles : + +1. **Outils de sécurité GitHub** : dont Dependabot pour le scan de dépendances (basé sur la base de données GitHub Advisory), CodeQL pour l’analyse du code, et Secret Scanning pour éviter l’introduction d’informations sensibles. +2. **SonarCloud** : analyse chaque commit, pull request et version pour la qualité du code et les failles de sécurité, en utilisant notamment les données publiques telles que CVE (Common Vulnerabilities and Exposures). + +

    SBOM (Software Bill of Materials) et gestion des dépendances

    + +Un outil SBOM est utilisé pour générer un inventaire des dépendances tierces, permettant : + +1. L’identification des vulnérabilités et des questions de conformité de licences ; +2. La génération de rapports réguliers pour les besoins réglementaires et d’audit ; +3. La surveillance permanente des versions de bibliothèques sur tous les dépôts ; +4. L’assurance que seuls les paquets/dépendances bien maintenus sont utilisés et que les obsolètes sont gérés de façon appropriée. + +Plus d’informations sur le SBOM dans Mojaloop : https://github.com/mojaloop/ml-depcheck-utility?tab=readme-ov-file#sbom-generation-tool-for-mojaloop-repositories + +

    Sécurité des conteneurs

    + +Les images des conteneurs sont analysées pour les vulnérabilités via Grype avant chaque publication. Grype est configuré selon les meilleures pratiques, et des configurations encore plus strictes sont recommandées pour les adoptants. Configuration Grype de l’Orb CI utilisée par Mojaloop : https://github.com/mojaloop/ci-config-orb-build?tab=readme-ov-file#vulnerability-image-scan-configuration . + +

    Conformité des licences

    + +Un outil automatisé de scan de licences s’assure que seules les composantes à licence compatible soient utilisées. Les contrôles de conformité sont intégrés au processus CI/CD, bloquant la fusion ou le déploiement du code non conforme. + +

    Provenance des images

    + +Depuis la version Mojaloop v17.1.0, les chart helm Mojaloop sont signés lors de la publication et peuvent être vérifiés lors de l’installation/le déploiement (cette fonctionnalité est supportée nativement par Helm), ce qui assure la provenance des artefacts associés. À l’avenir, cela pourra être étendu à d’autres artefacts comme les images. + +

    Processus sécurité CI/CD de Mojaloop

    + +Mojaloop dispose d’un pipeline CI/CD intégrant automatiquement des contrôles de sécurité à toutes les étapes du développement, garantissant ainsi une application systématique de la sécurité sans intervention manuelle. Des règles de protection des branches imposent des contrôles continus à chaque commit, pull request et version. + +Intégration sécurité CI/CD : + +1. **Sécurité des conteneurs** : … +2. **Conformité des licences** : … +3. **Analyse des vulnérabilités des dépendances** : … + +Toutes les vulnérabilités critiques sont consignées et le pipeline bloque la publication des images ou paquets concernés tant que ces problèmes ne sont pas résolus. Ces mécanismes automatisés dans le pipeline garantissent un code testé en continu, sécurisé et conforme, maintenant ainsi un haut niveau de sécurité au sein du processus de développement. + +

    Divulgation coordonnée des vulnérabilités (CVD)

    + +Mojaloop applique une démarche CVD, garantissant aux parties concernées un délai suffisant pour traiter et corriger les vulnérabilités avant toute divulgation publique. + +Politique de divulgation Mojaloop (CVD) : [https://docs.mojaloop.io/community/contributing/cvd.html](https://docs.mojaloop.io/community/contributing/cvd.html) + +

    Rapport et conformité

    + +Des rapports complets sont générés après chaque analyse, détaillant les résultats, actions correctives et leur efficacité. + +Tous les rapports sont archivés pour audit et conformité, garantissant la transparence et la responsabilité. + +Le rapport provenant du scan de licences au niveau helm est intégré aux notes de version Mojaloop (ce qui confirme le contrôle réussi des licences et garantit la présence de licences autorisées uniquement). Le fichier résumé des licences est joint aux notes de version (en bas de page) : [https://github.com/mojaloop/helm/releases/tag/v17.0.0](https://github.com/mojaloop/helm/releases/tag/v17.0.0) en fournit un exemple. + +Les rapports d’analyse d’images sont disponibles pour consultation dans l’outil CI (CircleCI), permettant d’enregistrer la réussite ou l’échec du contrôle (le pipeline ne poursuit que si cette étape est validée). Par exemple, un résultat Grype est consultable ici : [https://app.circleci.com/pipelines/github/mojaloop/account-lookup-service/2165/workflows/d420ef53-85a7-46d3-af1e-1527baf3a207/jobs/16509/artifacts](https://app.circleci.com/pipelines/github/mojaloop/account-lookup-service/2165/workflows/d420ef53-85a7-46d3-af1e-1527baf3a207/jobs/16509/artifacts) (à titre d’exemple : cette référence peut devenir obsolète avec le temps). + +

    5. Périmètre

    + +Le processus de gestion des vulnérabilités Mojaloop s’applique à tous les composants faisant partie de la publication Helm Mojaloop. + +Cela inclut : + +1. Tous les composants et services principaux explicitement définis dans les charts Helm Mojaloop. +2. Les dépendances comprises dans la release Helm Mojaloop, automatiquement scannées dans le cadre du processus de gestion des vulnérabilités. + +Exclusions : + +1. Les dépôts ne faisant pas partie de la release principale Mojaloop sont considérés comme non production et exclus du processus de gestion des vulnérabilités. +2. Les composants externes requis pour un déploiement Mojaloop typique (par ex. MySQL, Redis, MongoDB, Kafka) ne sont pas maintenus par la Fondation Mojaloop et sont exclus du processus de gestion des vulnérabilités spécifique au code applicatif Mojaloop, bien qu’ils relèvent de la gestion générale des vulnérabilités (en tant que dépendances OSS tierces). + +Cette approche garantit la sécurité constante des composants de base Mojaloop, tout en définissant clairement la limite de responsabilité autour des dépendances externes et en fournissant des lignes directrices concernant tous les autres paquets OSS (internes ou tiers), dépendances et outils. + +

    diff --git a/docs/fr/technical/technical/transaction-requests-service/README.md b/docs/fr/technical/technical/transaction-requests-service/README.md new file mode 100644 index 000000000..f67b1db7a --- /dev/null +++ b/docs/fr/technical/technical/transaction-requests-service/README.md @@ -0,0 +1,8 @@ +# Service des demandes de transaction + +## Diagramme de séquence + +![](./assets/diagrams/sequence/trx-service-overview-spec.svg) + +* Le **transaction-requests-service** est un service cœur Mojaloop qui permet les cas d’usage initiés par le bénéficiaire, tels que la « demande de paiement marchande » (*Merchant Request to Pay*). +* Il s’agit d’un service de relais qui inclut également les **autorisations**. diff --git a/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/seq-trx-req-authorizations-3.0.0.plantuml b/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/seq-trx-req-authorizations-3.0.0.plantuml new file mode 100644 index 000000000..55568c471 --- /dev/null +++ b/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/seq-trx-req-authorizations-3.0.0.plantuml @@ -0,0 +1,64 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Sam Kummary + -------------- + ******'/ + + +@startuml +Title Service des demandes de transaction — Autorisations +participant "FSP payeur" +participant "Commutateur\ntransaction-requests-service" as Switch +participant "FSP bénéficiaire" + +autonumber +"FSP bénéficiaire" --\ "FSP bénéficiaire": Recherche, demande de transaction,\ntraitement non illustré ici +note over "FSP bénéficiaire", Switch: Le FSP bénéficiaire génère une demande de transaction vers le FSP payeur +"FSP payeur" --> "FSP payeur": Offre de change, génération d'OTP,\nnotification utilisateur (non illustré) +"FSP payeur" -\ Switch: GET /authorizations/{TransactionRequestID} +Switch --/ "FSP payeur": 202 Accepted + +alt la demande d'autorisation est valide + + Switch -> Switch: Valider GET /authorizations/{TransactionRequestID} (validation interne) + Switch -> Switch: Récupérer les points de terminaison du FSP bénéficiaire + note over Switch, "FSP bénéficiaire": Le commutateur transmet GET /authorizations au FSP bénéficiaire + Switch -\ "FSP bénéficiaire": GET /authorizations/{TransactionRequestID} + "FSP bénéficiaire" --/ Switch: 202 Accepted + "FSP bénéficiaire" -> "FSP bénéficiaire": Traiter la demande d'autorisation\n(le payeur approuve ou rejette la transaction\nvia l'OTP) + + note over Switch, "FSP bénéficiaire": Le FSP bénéficiaire répond avec PUT /authorizations/{TransactionRequestID} + "FSP bénéficiaire" -\ Switch: PUT /authorizations/{TransactionRequestID} + Switch --/ "FSP bénéficiaire": 200 Ok + + note over "FSP payeur", Switch: Le commutateur transmet PUT /authorizations/{TransactionRequestID} au FSP payeur + Switch -> Switch: Récupérer les points de terminaison du FSP payeur + Switch -\ "FSP payeur": PUT /authorizations/{TransactionRequestID} + "FSP payeur" --/ Switch: 200 Ok + + +else la demande d'autorisation est invalide + note over "FSP payeur", Switch: Le commutateur renvoie un rappel d'erreur au FSP payeur + Switch -\ "FSP payeur": PUT /authorizations/{TransactionRequestID}/error + "FSP payeur" --/ Switch: 200 OK + "FSP payeur" --> "FSP payeur": Valider l'OTP envoyé par le FSP bénéficiaire +end +@enduml diff --git a/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/seq-trx-req-authorizations-3.0.0.svg b/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/seq-trx-req-authorizations-3.0.0.svg new file mode 100644 index 000000000..61d940b07 --- /dev/null +++ b/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/seq-trx-req-authorizations-3.0.0.svg @@ -0,0 +1,132 @@ + + Service des demandes de transaction — Autorisations + + + Service des demandes de transaction — Autorisations + + + + + + FSP payeur + + FSP payeur + + Commutateur + transaction-requests-service + + Commutateur + transaction-requests-service + + FSP bénéficiaire + + FSP bénéficiaire + + + + + 1 + Recherche, demande de transaction, + traitement non illustré ici + + + Le FSP bénéficiaire génère une demande de transaction vers le FSP payeur + + + + + 2 + Offre de change, génération d'OTP, + notification utilisateur (non illustré) + + + 3 + GET /authorizations/{TransactionRequestID} + + + 4 + 202 Accepted + + + alt + [la demande d'autorisation est valide] + + + + + 5 + Valider GET /authorizations/{TransactionRequestID} (validation interne) + + + + + 6 + Récupérer les points de terminaison du FSP bénéficiaire + + + Le commutateur transmet GET /authorizations au FSP bénéficiaire + + + 7 + GET /authorizations/{TransactionRequestID} + + + 8 + 202 Accepted + + + + + 9 + Traiter la demande d'autorisation + (le payeur approuve ou rejette la transaction + via l'OTP) + + + Le FSP bénéficiaire répond avec PUT /authorizations/{TransactionRequestID} + + + 10 + PUT /authorizations/{TransactionRequestID} + + + 11 + 200 Ok + + + Le commutateur transmet PUT /authorizations/{TransactionRequestID} au FSP payeur + + + + + 12 + Récupérer les points de terminaison du FSP payeur + + + 13 + PUT /authorizations/{TransactionRequestID} + + + 14 + 200 Ok + + [la demande d'autorisation est invalide] + + + Le commutateur renvoie un rappel d'erreur au FSP payeur + + + 15 + PUT /authorizations/{TransactionRequestID}/error + + + 16 + 200 OK + + + + + 17 + Valider l'OTP envoyé par le FSP bénéficiaire + + diff --git a/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/seq-trx-req-service-1.0.0.plantuml b/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/seq-trx-req-service-1.0.0.plantuml new file mode 100644 index 000000000..7fa680f06 --- /dev/null +++ b/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/seq-trx-req-service-1.0.0.plantuml @@ -0,0 +1,93 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Sam Kummary + -------------- + ******'/ + + +@startuml +Title Service des demandes de transaction — Création +participant "FSP payeur" +participant "Commutateur\ntransaction-requests-service" as Switch +participant "FSP bénéficiaire" + +autonumber +"FSP bénéficiaire" -\ "FSP bénéficiaire": Processus de recherche\n(non illustré ici) +note over "FSP bénéficiaire", Switch: Le FSP bénéficiaire génère une demande de transaction vers le FSP payeur +"FSP bénéficiaire" -\ Switch: POST /transactionRequests +Switch -> Switch: Valider le schéma POST /transactionRequests +Switch --/ "FSP bénéficiaire": 202 Accepted + +alt la demande de transaction est valide + + Switch -> Switch: Valider POST /transactionRequests (validation interne) + Switch -> Switch: Récupérer les points de terminaison du FSP payeur + note over Switch, "FSP payeur": Le commutateur transmet la requête POST /transactionRequests au FSP payeur + Switch -\ "FSP payeur": POST /transactionRequests + "FSP payeur" --/ Switch: 202 Accepted + "FSP payeur" -> "FSP payeur": Traiter la demande de transaction + + alt le FSP payeur traite avec succès la demande de transaction + + note over "FSP payeur", Switch: Le FSP payeur répond au POST /transactionRequests + "FSP payeur" -\ Switch: PUT /transactionRequests/{ID} + Switch --/ "FSP payeur": 200 Ok + + Switch -> Switch: Valider PUT /transactionRequests/{ID} + + alt la réponse est valide + + note over Switch, "FSP bénéficiaire": Le commutateur relaie la réponse au FSP bénéficiaire + Switch -> Switch: Récupérer les points de terminaison du FSP bénéficiaire + + Switch -\ "FSP bénéficiaire": PUT /transactionRequests/{ID} + "FSP bénéficiaire" --/ Switch: 200 Ok + + note over "FSP bénéficiaire" #3498db: Attente d'une offre de change, d'un transfert par le FSP payeur\nou d'une demande de transaction rejetée + else réponse invalide + + note over Switch, "FSP payeur": Le commutateur renvoie une erreur au FSP payeur + + Switch -\ "FSP payeur": PUT /transactionRequests/{ID}/error + "FSP payeur" --/ Switch : 200 Ok + + note over Switch, "FSP payeur" #ec7063: Dans ce scénario, le FSP bénéficiaire\npeut ne pas recevoir de réponse + + end + else échec du traitement ou rejet par le FSP payeur + + note over "FSP payeur", Switch: Le FSP payeur renvoie une erreur au commutateur + + "FSP payeur" -\ Switch: PUT /transactionRequests/{ID}/error + Switch --/ "FSP payeur": 200 OK + + note over "FSP bénéficiaire", Switch: Le commutateur renvoie une erreur au FSP bénéficiaire + + Switch -\ "FSP bénéficiaire": PUT /transactionRequests/{ID}/error + "FSP bénéficiaire" --/ Switch: 200 OK + + end +else la demande de transaction est invalide + note over "FSP bénéficiaire", Switch: Le commutateur renvoie une erreur au FSP bénéficiaire + Switch -\ "FSP bénéficiaire": PUT /transactionRequests/{ID}/error + "FSP bénéficiaire" --/ Switch: 200 OK +end +@enduml diff --git a/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/seq-trx-req-service-1.0.0.svg b/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/seq-trx-req-service-1.0.0.svg new file mode 100644 index 000000000..849c17bfb --- /dev/null +++ b/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/seq-trx-req-service-1.0.0.svg @@ -0,0 +1,184 @@ + + Service des demandes de transaction — Création + + + Service des demandes de transaction — Création + + + + + + + + FSP payeur + + FSP payeur + + Commutateur + transaction-requests-service + + Commutateur + transaction-requests-service + + FSP bénéficiaire + + FSP bénéficiaire + + + + + 1 + Processus de recherche + (non illustré ici) + + + Le FSP bénéficiaire génère une demande de transaction vers le FSP payeur + + + 2 + POST /transactionRequests + + + + + 3 + Valider le schéma POST /transactionRequests + + + 4 + 202 Accepted + + + alt + [la demande de transaction est valide] + + + + + 5 + Valider POST /transactionRequests (validation interne) + + + + + 6 + Récupérer les points de terminaison du FSP payeur + + + Le commutateur transmet la requête POST /transactionRequests au FSP payeur + + + 7 + POST /transactionRequests + + + 8 + 202 Accepted + + + + + 9 + Traiter la demande de transaction + + + alt + [le FSP payeur traite avec succès la demande de transaction] + + + Le FSP payeur répond au POST /transactionRequests + + + 10 + PUT /transactionRequests/{ID} + + + 11 + 200 Ok + + + + + 12 + Valider PUT /transactionRequests/{ID} + + + alt + [la réponse est valide] + + + Le commutateur relaie la réponse au FSP bénéficiaire + + + + + 13 + Récupérer les points de terminaison du FSP bénéficiaire + + + 14 + PUT /transactionRequests/{ID} + + + 15 + 200 Ok + + + Attente d'une offre de change, d'un transfert par le FSP payeur + ou d'une demande de transaction rejetée + + [réponse invalide] + + + Le commutateur renvoie une erreur au FSP payeur + + + 16 + PUT /transactionRequests/{ID}/error + + + 17 + 200 Ok + + + Dans ce scénario, le FSP bénéficiaire + peut ne pas recevoir de réponse + + [échec du traitement ou rejet par le FSP payeur] + + + Le FSP payeur renvoie une erreur au commutateur + + + 18 + PUT /transactionRequests/{ID}/error + + + 19 + 200 OK + + + Le commutateur renvoie une erreur au FSP bénéficiaire + + + 20 + PUT /transactionRequests/{ID}/error + + + 21 + 200 OK + + [la demande de transaction est invalide] + + + Le commutateur renvoie une erreur au FSP bénéficiaire + + + 22 + PUT /transactionRequests/{ID}/error + + + 23 + 200 OK + + diff --git a/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/seq-trx-req-service-get-2.0.0.plantuml b/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/seq-trx-req-service-get-2.0.0.plantuml new file mode 100644 index 000000000..61c0bdfca --- /dev/null +++ b/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/seq-trx-req-service-get-2.0.0.plantuml @@ -0,0 +1,90 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Sam Kummary + -------------- + ******'/ + + +@startuml +Title Service des demandes de transaction — Consultation +participant "FSP payeur" +participant "Commutateur\ntransaction-requests-service" as Switch +participant "FSP bénéficiaire" + +autonumber +note over "FSP bénéficiaire", Switch: Le FSP bénéficiaire demande le statut d'une demande de transaction au FSP payeur.\nL'ID est celui d'une demande de transaction créée précédemment +"FSP bénéficiaire" -\ Switch: GET /transactionRequests/{ID} +Switch -> Switch: Valider GET /transactionRequests/{ID} +Switch --/ "FSP bénéficiaire": 202 Accepted + +alt la requête de consultation est valide + + Switch -> Switch: Récupérer les points de terminaison du FSP payeur + note over Switch, "FSP payeur": Le commutateur transmet GET /transactionRequests/{ID} au FSP payeur + Switch -\ "FSP payeur": GET /transactionRequests/{ID} + "FSP payeur" --/ Switch: 202 Accepted + "FSP payeur" -> "FSP payeur": Récupérer la demande de transaction + + alt le FSP payeur récupère avec succès la demande de transaction + + note over "FSP payeur", Switch: Le FSP payeur répond par le rappel\nPUT /transactionRequests/{ID} + "FSP payeur" -\ Switch: PUT /transactionRequests/{ID} + Switch --/ "FSP payeur": 200 Ok + + Switch -> Switch: Valider PUT /transactionRequests/{ID} + + alt la réponse est valide + + note over Switch, "FSP bénéficiaire": Le commutateur relaie la réponse au FSP bénéficiaire + Switch -> Switch: Récupérer les points de terminaison du FSP bénéficiaire + + Switch -\ "FSP bénéficiaire": PUT /transactionRequests/{ID} + "FSP bénéficiaire" --/ Switch: 200 Ok + + else réponse invalide + + note over Switch, "FSP payeur": Le commutateur renvoie une erreur au FSP payeur + + Switch -\ "FSP payeur": PUT /transactionRequests/{ID}/error + "FSP payeur" --/ Switch : 200 Ok + + note over Switch, "FSP payeur" #ec7063: Dans ce scénario, le FSP bénéficiaire\npeut ne pas recevoir de réponse + + end + else le FSP payeur ne peut pas récupérer la demande de transaction + + note over "FSP payeur", Switch: Le FSP payeur renvoie une erreur au commutateur + + "FSP payeur" -\ Switch: PUT /transactionRequests/{ID}/error + Switch --/ "FSP payeur": 200 OK + + note over "FSP bénéficiaire", Switch: Le commutateur renvoie une erreur au FSP bénéficiaire + + Switch -\ "FSP bénéficiaire": PUT /transactionRequests/{ID}/error + "FSP bénéficiaire" --/ Switch: 200 OK + + end +else la demande de transaction est invalide + note over "FSP bénéficiaire", Switch: Le commutateur renvoie une erreur au FSP bénéficiaire + Switch -\ "FSP bénéficiaire": PUT /transactionRequests/{ID}/error + "FSP bénéficiaire" --/ Switch: 200 OK +end +@enduml diff --git a/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/seq-trx-req-service-get-2.0.0.svg b/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/seq-trx-req-service-get-2.0.0.svg new file mode 100644 index 000000000..e292af453 --- /dev/null +++ b/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/seq-trx-req-service-get-2.0.0.svg @@ -0,0 +1,169 @@ + + Service des demandes de transaction — Consultation + + + Service des demandes de transaction — Consultation + + + + + + + + FSP payeur + + FSP payeur + + Commutateur + transaction-requests-service + + Commutateur + transaction-requests-service + + FSP bénéficiaire + + FSP bénéficiaire + + + Le FSP bénéficiaire demande le statut d'une demande de transaction au FSP payeur. + L'ID est celui d'une demande de transaction créée précédemment + + + 1 + GET /transactionRequests/{ID} + + + + + 2 + Valider GET /transactionRequests/{ID} + + + 3 + 202 Accepted + + + alt + [la requête de consultation est valide] + + + + + 4 + Récupérer les points de terminaison du FSP payeur + + + Le commutateur transmet GET /transactionRequests/{ID} au FSP payeur + + + 5 + GET /transactionRequests/{ID} + + + 6 + 202 Accepted + + + + + 7 + Récupérer la demande de transaction + + + alt + [le FSP payeur récupère avec succès la demande de transaction] + + + Le FSP payeur répond par le rappel + PUT /transactionRequests/{ID} + + + 8 + PUT /transactionRequests/{ID} + + + 9 + 200 Ok + + + + + 10 + Valider PUT /transactionRequests/{ID} + + + alt + [la réponse est valide] + + + Le commutateur relaie la réponse au FSP bénéficiaire + + + + + 11 + Récupérer les points de terminaison du FSP bénéficiaire + + + 12 + PUT /transactionRequests/{ID} + + + 13 + 200 Ok + + [réponse invalide] + + + Le commutateur renvoie une erreur au FSP payeur + + + 14 + PUT /transactionRequests/{ID}/error + + + 15 + 200 Ok + + + Dans ce scénario, le FSP bénéficiaire + peut ne pas recevoir de réponse + + [le FSP payeur ne peut pas récupérer la demande de transaction] + + + Le FSP payeur renvoie une erreur au commutateur + + + 16 + PUT /transactionRequests/{ID}/error + + + 17 + 200 OK + + + Le commutateur renvoie une erreur au FSP bénéficiaire + + + 18 + PUT /transactionRequests/{ID}/error + + + 19 + 200 OK + + [la demande de transaction est invalide] + + + Le commutateur renvoie une erreur au FSP bénéficiaire + + + 20 + PUT /transactionRequests/{ID}/error + + + 21 + 200 OK + + diff --git a/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/trx-service-overview-spec.plantuml b/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/trx-service-overview-spec.plantuml new file mode 100644 index 000000000..e8f8fe453 --- /dev/null +++ b/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/trx-service-overview-spec.plantuml @@ -0,0 +1,138 @@ +/'***** +License +-------------- +Copyright © 2017 Bill & Melinda Gates Foundation +The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Contributors +-------------- +This is the official list of the Mojaloop project contributors for this file. +Names of the original copyright holders (individuals or organizations) +should be listed with a '*' in the first column. People who have +contributed from an organization can be listed under the organization +that actually holds the copyright for their contributions (see the +Gates Foundation organization for an example). Those individuals should have +their names indented and be marked with a '-'. Email address can be added +optionally within square brackets . +* Gates Foundation +- Name Surname + +* Henk Kodde +-------------- +******'/ + +@startuml transactionRequests + +' define actor image +sprite $actor [25x48/16] { + 0000000000010000000000000 + 0000000006CAC910000000000 + 0000000095101292000000000 + 0000000651000119000000000 + 0000000B10000018400000000 + 0000001A10000016600000000 + 0000000B10000017510000000 + 000000083100001A210000000 + 0000000191000176110000000 + 000000003A866A61100000000 + 0000000000466211100000000 + 0003333333334443333310000 + 0088888888888888888892000 + 0821111111111111111118200 + 8311111111111111111111A00 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111111111111111111111A20 + A111551111111111138111A20 + A111661111111111139111A20 + A211661111111111139111A20 + A211661111111111139111A20 + A211661111161111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A2116611111A2111139111A20 + A7669611111A211113A666B20 + 36669611111A211113A666610 + 00016611111A2111139111110 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006611111A2111139100000 + 00006966666B7666679100000 + 0000266666666666664100000 + 0000000111111111111100000 + 0000000000000000000000000 +} + +' declaring skinparam +skinparam sequenceMessageAlign center +skinparam shadowing false +skinparam defaultFontName Verdana +skinparam monochrome true +skinparam SequenceLifeLineBackgroundColor WhiteSmoke +skinparam SequenceLifeLineBorderColor Black +skinparam ActorFontStyle Bold +skinparam ActorFontSize 20 +skinparam ParticipantFontStyle Bold +skinparam ParticipantFontSize 20 +skinparam ParticipantBackgroundColor WhiteSmoke +skinparam ArrowColor Black + +skinparam actor { + Bordercolor none + Backgroundcolor none + shadowing false +} + +skinparam participant { + shadowing true +} + +hide footbox + +' declare title +' title How to use the /transactionRequests service + +' Actor Keys: +' participant - FSP(Payer/Payee) and Switch +' actor - Payee + +' declare actors +participant "FSP\npayeur" as payerfsp +participant "Commutateur\n(optionnel)" as Switch +participant "FSP\nbénéficiaire" as payeefsp +actor "<$actor>\nBénéficiaire" as Payee + +' start flow +payeefsp <- Payee: Je souhaite recevoir des fonds\nen provenance du +123456789 +activate payeefsp +payeefsp <- payeefsp: Recherche du +123456789\n(processus non illustré ici) +Switch <<- payeefsp: **POST /transactionRequest/**\n(Informations bénéficiaire,\ndétails de la transaction) +activate Switch +Switch -->> payeefsp: **HTTP 202** (Accepté) +payerfsp <<- Switch: **POST /transactionRequests/**\n(Informations bénéficiaire,\ndétails de la transaction) +activate payerfsp +payerfsp -->> Switch: **HTTP 202** (Accepté) +payeefsp -> payeefsp: Effectuer une validation facultative +payerfsp ->> Switch: **PUT /transactionRequests/**\n(statut reçu) +payerfsp <<-- Switch: **HTTP 200** (OK) +deactivate payerfsp +Switch ->> payeefsp: **PUT /transactionRequests/**\n(statut reçu) +Switch <<-- payeefsp: **HTTP 200** (OK) +deactivate Switch +payeefsp -> payeefsp: Attendre une offre de change et\nun transfert, ou une demande\nde transaction rejetée par le payeur +payeefsp <[hidden]- payeefsp +deactivate payeefsp +@enduml diff --git a/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/trx-service-overview-spec.svg b/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/trx-service-overview-spec.svg new file mode 100644 index 000000000..2c8bea0fc --- /dev/null +++ b/docs/fr/technical/technical/transaction-requests-service/assets/diagrams/sequence/trx-service-overview-spec.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + FSP + payeur + + Commutateur + (optionnel) + + FSP + bénéficiaire + + Bénéficiaire + + + + + + + + Je souhaite recevoir des fonds + en provenance du +123456789 + + + + + Recherche du +123456789 + (processus non illustré ici) + + + + POST /transactionRequest/ + (Informations bénéficiaire, + détails de la transaction) + + + + HTTP 202 + (Accepté) + + + + POST /transactionRequests/ + (Informations bénéficiaire, + détails de la transaction) + + + + HTTP 202 + (Accepté) + + + + + Effectuer une validation facultative + + + + PUT /transactionRequests/ + <ID> + (statut reçu) + + + + HTTP 200 + (OK) + + + + PUT /transactionRequests/ + <ID> + (statut reçu) + + + + HTTP 200 + (OK) + + + + + Attendre une offre de change et + un transfert, ou une demande + de transaction rejetée par le payeur + + diff --git a/docs/fr/technical/technical/transaction-requests-service/authorizations.md b/docs/fr/technical/technical/transaction-requests-service/authorizations.md new file mode 100644 index 000000000..b94243da4 --- /dev/null +++ b/docs/fr/technical/technical/transaction-requests-service/authorizations.md @@ -0,0 +1,8 @@ +# Demandes de transaction — Autorisations + +GET /authorizations/{TransactionRequestID} et PUT /authorizations/{TransactionRequestID} pour prendre en charge les autorisations dans le cadre de la « demande de paiement marchande » (*Merchant Request to Pay*) et d'autres cas d'usage initiés par le bénéficiaire. + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-trx-req-authorizations-3.0.0.svg) + diff --git a/docs/fr/technical/technical/transaction-requests-service/transaction-requests-get.md b/docs/fr/technical/technical/transaction-requests-service/transaction-requests-get.md new file mode 100644 index 000000000..0af5d149e --- /dev/null +++ b/docs/fr/technical/technical/transaction-requests-service/transaction-requests-get.md @@ -0,0 +1,8 @@ +# Demandes de transaction — Consultation + +GET /transactionRequests et PUT /transactionRequests pour prendre en charge la « demande de paiement marchande » (*Merchant Request to Pay*). + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-trx-req-service-get-2.0.0.svg) + diff --git a/docs/fr/technical/technical/transaction-requests-service/transaction-requests-post.md b/docs/fr/technical/technical/transaction-requests-service/transaction-requests-post.md new file mode 100644 index 000000000..694408fa9 --- /dev/null +++ b/docs/fr/technical/technical/transaction-requests-service/transaction-requests-post.md @@ -0,0 +1,8 @@ +# Demandes de transaction + +POST /transactionRequests et PUT /transactionRequests pour prendre en charge la « demande de paiement marchande » (*Merchant Request to Pay*). + +## Diagramme de séquence + +![](./assets/diagrams/sequence/seq-trx-req-service-1.0.0.svg) + diff --git a/docs/pt/index.md b/docs/pt/index.md new file mode 100644 index 000000000..5d3ee471a --- /dev/null +++ b/docs/pt/index.md @@ -0,0 +1,26 @@ +--- +home: true +heroImage: /mojaloop_logo_med.png +tagline: Esta é a documentação oficial do projeto Mojaloop +# actionText: Comece Agora → +# actionLink: /getting-started/ +# features: +# - title: Negócios +# details: Justificando o caso de negócios para o Mojaloop +# - title: Comunidade +# details: Conheça a comunidade por trás da tecnologia +# - title: Técnico +# details: Veja os diferentes componentes e implemente o Mojaloop você mesmo! +# - title: Produto +# details: Funcionalidades, requisitos e roadmap do produto Mojaloop +--- + +
    +
    + +| | | | | +|:----:|:----:|:----:|:----:| +|

    **[Adoção](/adoption/)**

    |

    **[Comunidade](/community/)**

    |

    **[Produto](/product/)**

    |

    **[Técnico](/technical/)**

    | +| Justificando o caso de negócios para o Mojaloop | Conheça a comunidade por trás da tecnologia | Funcionalidades, requisitos e roadmap do produto Mojaloop | Veja os diferentes componentes e implemente o Mojaloop você mesmo! | + +
    \ No newline at end of file diff --git a/docs/technical/technical/deployment-guide/README.md b/docs/technical/technical/deployment-guide/README.md index 66ee65ccd..7e45a52f2 100644 --- a/docs/technical/technical/deployment-guide/README.md +++ b/docs/technical/technical/deployment-guide/README.md @@ -196,7 +196,7 @@ Further reading can be found [here](https://github.com/mojaloop/helm/blob/master 1. Deploy backend ```bash - helm ---namespace demo install backend mojaloop/example-mojaloop-backend --create-namespace + helm --namespace demo install backend mojaloop/example-mojaloop-backend --create-namespace ``` #### 5.2. Mojaloop Helm Deployment diff --git a/package-lock.json b/package-lock.json index 329334c39..db4d128de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,10 +11,10 @@ "devDependencies": { "@vuepress/plugin-back-to-top": "^1.9.10", "@vuepress/plugin-medium-zoom": "^1.9.10", - "got": "^14.6.6", + "got": "^15.0.0", "husky": "^9.1.7", "markdownlint-cli": "^0.48.0", - "npm-check-updates": "^19.6.6", + "npm-check-updates": "^20.0.0", "plantuml-encoder": "^1.4.0", "svgo": "^4.0.1", "vuepress": "^1.9.10", @@ -1865,9 +1865,9 @@ "license": "MIT" }, "node_modules/@sindresorhus/is": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.0.1.tgz", - "integrity": "sha512-QWLl2P+rsCJeofkDNIT3WFmb6NrRud1SUYW8dIhXK/46XFV8Q/g7Bsvib0Askb0reRLe+WYPeeE+l5cH7SlkuQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", "dev": true, "license": "MIT", "engines": { @@ -1957,9 +1957,9 @@ "dev": true }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", "dev": true, "license": "MIT" }, @@ -4307,40 +4307,24 @@ } }, "node_modules/cacheable-request": { - "version": "13.0.12", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-13.0.12.tgz", - "integrity": "sha512-qqK/etGeI/9DV5yRkO50ApDTjip9UXPml1NHYJksUAw15yMLOf8VUO1/8bu4P8birOCqR+hYQ/nh1Lezc8sZrA==", + "version": "13.0.18", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-13.0.18.tgz", + "integrity": "sha512-rFWadDRKJs3s2eYdXlGggnBZKG7MTblkFBB0YllFds+UYnfogDp2wcR6JN97FhRkHTvq59n2vhNoHNZn29dh/Q==", "dev": true, "license": "MIT", "dependencies": { "@types/http-cache-semantics": "^4.0.4", "get-stream": "^9.0.1", "http-cache-semantics": "^4.2.0", - "keyv": "^5.5.3", + "keyv": "^5.5.5", "mimic-response": "^4.0.0", - "normalize-url": "^8.1.0", - "responselike": "^3.0.0" + "normalize-url": "^8.1.1", + "responselike": "^4.0.2" }, "engines": { "node": ">=18" } }, - "node_modules/cacheable-request/node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -4794,6 +4778,19 @@ "node": ">=6.0" } }, + "node_modules/chunk-data": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chunk-data/-/chunk-data-0.1.0.tgz", + "integrity": "sha512-zFyPtyC0SZ6Zu79b9sOYtXZcgrsXe0RpePrzRyj52hYVFG1+Rk6rBqjjOEk+GNQwc3PIX+86teQMok970pod1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ci-info": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", @@ -9649,48 +9646,43 @@ } }, "node_modules/got": { - "version": "14.6.6", - "resolved": "https://registry.npmjs.org/got/-/got-14.6.6.tgz", - "integrity": "sha512-QLV1qeYSo5l13mQzWgP/y0LbMr5Plr5fJilgAIwgnwseproEbtNym8xpLsDzeZ6MWXgNE6kdWGBjdh3zT/Qerg==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/got/-/got-15.0.0.tgz", + "integrity": "sha512-CUqLG9oFZRis7SZq5Bcxh42LpzxXgXwxWVwNljo60oki8Cq3GXVRpDY2K4GwTzYz3htyXf212nfNg2socz4esQ==", "dev": true, "license": "MIT", "dependencies": { - "@sindresorhus/is": "^7.0.1", + "@sindresorhus/is": "^7.2.0", "byte-counter": "^0.1.0", "cacheable-lookup": "^7.0.0", - "cacheable-request": "^13.0.12", + "cacheable-request": "^13.0.18", + "chunk-data": "^0.1.0", "decompress-response": "^10.0.0", - "form-data-encoder": "^4.0.2", "http2-wrapper": "^2.2.1", - "keyv": "^5.5.3", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^4.0.1", + "keyv": "^5.6.0", + "lowercase-keys": "^4.0.1", "responselike": "^4.0.2", - "type-fest": "^4.26.1" + "type-fest": "^5.4.4", + "uint8array-extras": "^1.5.0" }, "engines": { - "node": ">=20" + "node": ">=22" }, "funding": { "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/got/node_modules/form-data-encoder": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.0.2.tgz", - "integrity": "sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==", - "dev": true, - "engines": { - "node": ">= 18" - } - }, - "node_modules/got/node_modules/p-cancelable": { + "node_modules/got/node_modules/lowercase-keys": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", - "integrity": "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-4.0.1.tgz", + "integrity": "sha512-wI9Nui/L8VfADa/cr/7NQruaASk1k23/Uh1khQ02BCVYiiy8F4AhOGnQzJy3Fl/c44GnYSbZHv8g7EcG3kJ1Qg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=14.16" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/graceful-fs": { @@ -11403,9 +11395,9 @@ } }, "node_modules/keyv": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.3.tgz", - "integrity": "sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "dev": true, "license": "MIT", "dependencies": { @@ -13050,9 +13042,9 @@ } }, "node_modules/normalize-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.0.tgz", - "integrity": "sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", + "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", "dev": true, "license": "MIT", "engines": { @@ -13063,9 +13055,9 @@ } }, "node_modules/npm-check-updates": { - "version": "19.6.6", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-19.6.6.tgz", - "integrity": "sha512-AvlRcnlUEyBEJfblUSjYMJwYKvCIWDRuCDa6x3hyUMTMkI3kslmFm0LDqwgzQfshfNh0Z3ouKiA4fLjRN7HejQ==", + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-20.0.0.tgz", + "integrity": "sha512-qCs02x51irGf0okCttwv8lHEO2NxT903IJ2bKpG82kIzkm6pfT3CoWB5YIvqY/wi/DdnYRfI7eVfCYYymQgvCg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -17475,6 +17467,19 @@ "node": ">=11.0.0" } }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -18109,13 +18114,16 @@ "dev": true }, "node_modules/type-fest": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", - "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.5.0.tgz", + "integrity": "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==", "dev": true, "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, "engines": { - "node": ">=16" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -18245,6 +18253,19 @@ "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", "dev": true }, + "node_modules/uint8array-extras": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", + "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", diff --git a/package.json b/package.json index ef03f0200..1c44f98d7 100644 --- a/package.json +++ b/package.json @@ -24,10 +24,10 @@ "devDependencies": { "@vuepress/plugin-back-to-top": "^1.9.10", "@vuepress/plugin-medium-zoom": "^1.9.10", - "got": "^14.6.6", + "got": "^15.0.0", "husky": "^9.1.7", "markdownlint-cli": "^0.48.0", - "npm-check-updates": "^19.6.6", + "npm-check-updates": "^20.0.0", "plantuml-encoder": "^1.4.0", "svgo": "^4.0.1", "vuepress": "^1.9.10",