Pourquoi la conformité documentaire ?

24/09/2020


Vous souhaitez comprendre les enjeux de la conformité documentaire ?

Cet article détaille les différentes fonctionnalités liées à la conformité documentaire mais également comment l’intégrer au sein de Flower.

Pour quels usages ?

Au sein d’un système de GED, on retrouve souvent le besoin de valider le contenu d’un document ajouté manuellement par un utilisateur tant en terme de type de document, de contexte métier ou encore de validité du document.
La conformité documentaire consiste à vérifier dès l’ajout d’un document, si son contenu est bien celui attendu, s’il est cohérent avec les données métier ou les autres documents fournis, et s’il est valide.


Les deux buts majeurs sont de pouvoir :

  • éviter les erreurs manuelles
  • forcer les contrôles relatifs à la validité d’un document.


Voici les cas d’usage associés à la conformité documentaire :

  • Le document ajouté doit être une pièce d’identité. Le système vérifie que le document correspond bien à un carte d’identité, un passeport ou un titre de séjour.
  • Le document ajouté doit correspondre au client courant. Le système compare les informations extraites du contenu avec celles de Flower et bloque l’intégration du contenu si ce dernier ne concerne pas le client.
  • Le document ajouté doit être valide. Le système va vérifier la date de validité du document et peut bloquer l’intégration de ce contenu si la date est dépassée.

Cinématique

Le scénario illustré dans cet article est le suivant :

  • Lancement de la création d’un document : le formulaire d’indexation comporte des informations métier telles que le nom du client et le type du document attendu.

    Indexation du document
    Indexation du document
  • Ajout du contenu : le fichier est ajouté au formulaire d’indexation.

    Ajout du contenu
    Ajout du contenu
  • Contrôles des informations suivantes :

    • le type de document doit être conforme à l’attendu

      Non conformité du type de document
      Non conformité du type de document

    • le document doit être valide ( date de validité, informations requises présentes, date de validité non expirée …)

      Invalidité du document
      Invalidité du document

Intégration

Cette intégration dans Flower peut être faite côté client via un script en JavaScript. Il s’agit d’appeler un service de conformité externe au choix du client et en fonction des règles métier à définir.


Un script permettant d'appeler un service de conformité et d'afficher côté Flower le résultat sour forme de message d'erreur.

var SUPPORTED_MIME_TYPE = ["pdf", "jpeg", "jpg", "png", "gif", "tiff"];
var SUPPORTED_DOCUMENT_TYPE = ["PieceIdentite"];
var RAD_IDS = ["CNI", "TitreSejour"];

JSAPI.get().registerForComponentChange(
		function(formAPI, component, phase) {
			if (phase == PHASE_INSERT &&  OBJECT_TYPE_DOCUMENT == component.getCategory()) {
				setTimeout(function() {
					JSAPI.get().getLastComponentFormAPI().getActions().registerForActionConfirmation("footer", "create", function(value, executor) {
					    executor.hold();	
					    JSAPI.get().showLoadingPanel();
					    if (!callDocumentConformite(component, executor)) {
					    	JSAPI.get().hideLoadingPanel();
					    	executor.resume();
					    }
					});
				}, 500);
			}
		});

function callDocumentConformite (component, executor) {
	
	var documentType = component.getTagValue("TypeDocument");
	if (documentType != "" && SUPPORTED_DOCUMENT_TYPE.indexOf(documentType) != -1) {
		var fileId = component.getDocumentFiles()[0].getId();
		var fileType = component.getDocumentFiles()[0].getFormatCode();
		if (isSupportedFormat(fileType)) {
			var token = JSAPI.get().getUserAPI().getUserToken();
			 $.ajax({
			        type: "GET",
					dataType: 'binary',
					processData: 'false',
					responseType: 'arraybuffer',
			        url: './../flower-docs-ws/rest/files/tmp/' + fileId + '?token=' + token
					}).then(function (response) {
						callDocumentConformityService (component, response, fileType, documentType, executor);
					}, function (error) {
						JSAPI.get().hideLoadingPanel();
						JSAPI.get().getNotificationAPI().sendError("Impossible de transmettre le fichier pour l'analyse de la conformité. Veuillez contacter votre administrateur technique."); 
					});
			 
		} else {
			JSAPI.get().hideLoadingPanel();
			JSAPI.get().getNotificationAPI().sendError("Le format de fichier n'est pas le format attendu : pdf, jpeg, jpg, png, gif, tiff"); 
		}
		return true;
		
	}

	return false;
	
}


function callDocumentConformityService (component, fileContent, fileType, documentType, executor) {

	$.ajax({
        url: "http://documentConfityServiceUrl",
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        type: "POST", 
        dataType: "json",
        complete: function (result) {
        	if (result.status == 200) {
        		var token = result.responseJSON.access_token;
            	extractJSONInformation (component, responseJSON, documentType, executor)
        	} else {
        		JSAPI.get().hideLoadingPanel();
        		JSAPI.get().getNotificationAPI().sendError("Impossible de transmettre le fichier pour l'analyse de la conformité. Veuillez contacter votre administrateur technique."); 
        	}
        	
        }
    });
	
}

function extractJSONInformation (component, responseJSON, documentType, executor) {
	
	var customerName = component.getTagValue("NomClient");
	var document = responseJSON.document;
	var type = document.type;
	if (RAD_IDS.indexOf(type) != -1) {
		if (document.result.errors != undefined && document.result.errors.length != 0) {
			var errorMessage = "Le document n'est pas conforme. \n";
			for (var i in document.result.errors) {
				errorMessage += document.result.errors[i].shortDescription + "\n";
			}
			JSAPI.get().hideLoadingPanel();
			JSAPI.get().getNotificationAPI().sendError(errorMessage);
			return;
		} else {
			if (document.customerName == customerName) {
				JSAPI.get().hideLoadingPanel();
				executor.resume();
				return;
			}
		}
		JSAPI.get().hideLoadingPanel();
		JSAPI.get().getNotificationAPI().sendError("Le document ne concerne pas le client " + customerName);
	} else {
		JSAPI.get().hideLoadingPanel();
		JSAPI.get().getNotificationAPI().sendError("Le document n'est pas une pièce d'identité.");
	}
	
	
}

function isSupportedFormat(fileType) {
	
	for (var mimeType in SUPPORTED_MIME_TYPE) {
		if (fileType.indexOf(SUPPORTED_MIME_TYPE[mimeType]) != -1) {
			return true;
		}
	}
	return false;
	
}