--- /dev/null
+job_construct_doc:
+ tags:
+ - md-pdf
+ script:
+ - php /opt/markdown2pdf/md2pdf.php -i ./PA-DOC-connecteur-seda-ng/ -o . -v
+ artifacts:
+ untracked: true
\ No newline at end of file
<library name="PHP">
<CLASSES>
<root url="file://$MODULE_DIR$/../pastell" />
+ <root url="file://$MODULE_DIR$/../pastell-seda" />
</CLASSES>
<SOURCES>
<root url="file://$MODULE_DIR$/../pastell" />
+ <root url="file://$MODULE_DIR$/../pastell-seda" />
</SOURCES>
</library>
</orderEntry>
--- /dev/null
+
+# Introduction
+
+L'extension pastell-seda-ng (new generation) propose un connecteur SEDA
+générique basé sur les fichiers produits par le logiciel de générationd
+de profil SEDA [Agape](https://agape.adullact.net/) (version 1).
+
+# Génération des profils d'archivage
+
+Les profils d'archivage doivent être générés avec l'outils Agape en
+ajoutant des **annotations Pastell**
+
+Le connecteur ne sait traiter que les fichiers en SEDA v0.2
+
+## Annotations Pastell
+
+Le connecteur utilise les annotations afin de remplir les méta-données
+du bordereau ainsi que les unités documentaires.
+
+Le principe est le suivant : pour chaque annotation Pastell trouvé, le
+connecteur cherche s'il trouve des annotations spécifique pour Pastell,
+si c'est le cas, il modifie le bordereau en fonction de l'annotation
+trouvé.
+
+Les annotations Pastell traitées par le connecteur ont la forme suivante
+: **{{pastell:commande:données}}**
+
+Les règles suivantes s'appliquent :
+
+- une annotation ne contenant pas de commande Pastell est ignoré et
+ n'apparait pas dans le bordereau
+- tout ce qu'il y a autour des commandes Pastell est ignoré
+
+- si une annotation contient plusieurs commande Pastell, on execute les
+commandes les unes après les autres. Le résultat est la concaténation de
+toutes les commandes.
+
+![Annotation Pastell dans Agape](./img/annotation_agape.png){width="650px"}
+
+## Commandes des annotations Pastell
+
+Le connecteur met à disposition plusieurs commandes. Si le connecteur
+rencontre une commande inconnu, alors il lance une erreur.
+
+### Commande string
+
+La commande string remplace le contenu de la balise sur laquelle porte
+l'annotation par la donnée.
+
+> **note**
+>
+> **{{pastell:string:Mairie de Bourg-en-Bresse}}** est remplacé par
+> **Mairie de Bourg-en-Bresse**.
+
+### Commande now
+
+La commande **now** remplace le contenu de la balise sur laquelle porte
+l'annotation par la date et l'heure de génération du bordereau au format
+[ISO-88601](https://fr.wikipedia.org/wiki/ISO_8601)
+
+> **note**
+>
+> **{{pastell:now}}** est remplacé par **1977-02-18T08:45:00Z**
+
+### Commande connecteur
+
+La commande **connecteur** interroge récupère une propriété texte du
+connecteur. Le contenu de la balise sur laquelle porte l'annotation est
+remplacer par la valeur de cette propriété.
+
+Les propriétés sont automatiquements généré dans la rubrique
+**Propriétés « pastell:connecteur » du profil**.
+
+> **note**
+>
+> **{{pastell:connecteur:service\_producteur\_nom}}** est remplacé par
+> **Médiathèque Bourg-en-Bresse**
+
+### Commande flux
+
+La commande **flux** interroge :
+
+- soit le flux qui est en train d'utiliser le connecteur
+
+- soit le connecteur lui-même dans le cadre de la génération et
+validation d'un bordereau de test. Les propriétes du flux sont alors
+automatiquement généré dans la rubrique **Propriétés « pastell:flux » du
+profil (test)**
+
+> **note**
+>
+> **{{pastell:flux:identifiant\_bordereau}}** est remplacé par
+> **889090**
+
+### Commande file
+
+La commande **file** permet de remplacer l'attribut **filename** de la
+balise sur laquelle porte l'annotation après avoir interroger le flux
+(ou le connecteur pour le test).
+
+> **note**
+>
+> **{{pastell::<file:pes_aller>}} est remplacé
+> par**PESALR2\_20899099.xml\*\*
+
+### Commande integrity
+
+La commande **integrity** remplace la balise sur laquelle elle porte par
+un ensemble de balise **<Integrity>** contenant les calcul de hash
+conformément au SEDA.
+
+> **note**
+>
+> **{{pastell:integrity}}** est remplacé par le code XML suivant :
+
+``` {.sourceCode .xml}
+<Integrity>
+ <Contains algorithme="http://www.w3.org/2001/04/xmlenc#sha256">MTYzMjEzNTEyOA==</Contains>
+ <UnitIdentifier>PESALR2_20899099.xml</UnitIdentifier>
+</Integrity>
+<Integrity>
+ <Contains algorithme="http://www.w3.org/2001/04/xmlenc#sha256">MTk2MDg3Nzk2NA==</Contains>
+ <UnitIdentifier>045038_160517160712-ACK-E1721300_A007EZQF_OK.xml</UnitIdentifier>
+</Integrity>
+```
+
+### Commande compteurJour
+
+La commande **compteurJour** remplace la balise sur laquelle est porte
+par un compteur journalisé.
+
+> **note**
+>
+> **{{pastell:compteurJour}}** est remplacé par **2016-05-18-187**
+> (187ème bordereau de la journée du 18/05/2016)
+
+# Connecteur SEDA NG
+
+## Configuration du connecteur
+
+![Configuration du connecteur
+SedaNG](./img/connecteur-seda-ng.png){width="500px"}
+
+### Profil SEDA (RelaxNG)
+
+Il s'agit de l'export du profil au format Relax NG produit par Agape.
+Celui-ci est obtenu dans Agape via le menu **outils** -> **Générer le
+schéma du profil**
+
+### Profil SEDA (Fichier Agape)
+
+C'est le fichier de base d'Agape
+
+### Propriétés « pastell:connecteur » du profil
+
+Le connecteur analyse toute les annotations Pastell de type
+**{{pastell:connecteur:xxx}}**.
+
+Pour chaque annotation de ce type, il est alors possible de renseigner
+la propriété directement dans le connecteur : *Modifier*->*Remplir
+les propriétés « pastell:connecteur » du profil*
+
+![Définition des propriétés d'un connecteur
+SedaNG](./img/connecteur-seda-properties.png){width="500px"}
+
+### Date de la dernière génération d'un bordereau
+
+Cette propriété n'est pas modifiable.
+
+### Nombre de bordereaux générés à la date du dernier transfert
+
+Cette propriété n'est pas modifiable.
+
+### Propriétés « pastell:flux » du profil (test)
+
+Afin de générer un bordereau de test, il est possible de renseigner des
+valeurs **bouchons** afin de remplir le bordereau et ainsi pouvoir le
+valider.
+
+Ces valeurs bouchons peuvent être modifiées via *modifié*->*Remplir
+les propriétés « pastell:flux » du profil pour le bordereau de test*
+
+Les valeurs bouchons comprennent à la fois les noms des champs *texte*,
+ainsi que le nom des fichiers.
+
+![Définition des propriétés bouchons dans un connecteur
+SedaNG](./img/connecteur-seda-flux.png){width="500px"}
+
+## Action du connecteur
+
+### Générer un bordereau de test
+
+A partir des élements suivants :
+
+- le fichier RNG
+- le fichier Agape contenant les annotations Pastell
+- les propriétés du connecteur
+- les propriétés du flux, prises dans le connecteur,
+
+le connecteur va générer et afficher un bordereau SEDA respectant toutes
+les propriétés et contraintes lié au SEDA.
+
+![image](./img/bordereau.png){width="500px"}
+
+### Valider le bordereau de test
+
+Cette action génère un bordereau comme la précédente, mais elle valide à
+deux niveau le bordereau test :
+
+- on vérifie que le bordereau valide le schéma RNG fourni par Agape
+- on vérifie que le borderau valide le schéma SEDA
+
+Si ce n'est pas le cas, on affiche alors les erreurs rencontrées lors de
+la validation.
+
+# Intégration dans un flux
+
+## Famille du connecteur
+
+La famille du connecteur est **seda\_ng** qui doit être utilisé sur la
+clé **connecteur** du flux qui souhaite utiliser ce connecteur.
--- /dev/null
+title: Connecteur SEDA NG
+author: Eric Pommateau
+manager: Eric Pommateau
+project: Pastell
+version: 1.4.x
+licence: CC-BY-NA
+date: 18/08/2016
+changes:
+ "1.0":
+ author: Eric Pommateau
+ date: 18/08/2016
+ change: Création du document
\ No newline at end of file
public function setFluxData(FluxData $fluxData){
$this->fluxData = $fluxData;
}
-
-
+
public function extractInfo($string) {
$result = array();
preg_match_all("#{{pastell:([^:]*):?((?:(?!}}).)*)}}#", $string, $matches);
$this->annotationWrapper->setFluxData($fluxDataTest);
$xml = $this->generate();
+
+ echo $xml;
$sedaValidation = new SedaValidation();
$is_valide = $sedaValidation->validateRelaxNG($xml, $this->relax_ng_path);
if (! $is_valide){
$this->assertRegExp("#pastell:now#", (string) $element);
}
+
+ public function testBigFile2(){
+
+ $generateXMLFromAnnotedRelaxNG = new GenerateXMLFromAnnotedRelaxNG(new RelaxNG());
+ $profil = $generateXMLFromAnnotedRelaxNG->generateFromRelaxNG(
+ __DIR__."/../../../fixtures/profil_test_annoted.rng"
+ );
+
+ //echo $profil;
+
+
+
+
+ }
+
+
}
\ No newline at end of file
<?php
class RelaxNGImportAnnotationTest extends PHPUnit_Framework_TestCase {
-
- public function testImportAnnotation(){
-
- $relax_ng_orig = __DIR__."/../../../fixtures/EMEG_PROFIL_PES_0002_v1_schema.rng";
+
+ private function getNewRelaxNG($agape_file, $rng_file){
+ $relax_ng_orig = $rng_file;
$relaxNGImportAnnotation = new RelaxNgImportAgapeAnnotation();
$new_relax_ng = $relaxNGImportAnnotation->importAnnotation(
$relax_ng_orig,
- __DIR__."/../../../fixtures/EMEG_PROFIL_PES_0002_v1.5.xml"
+ $agape_file
);
-
+
$relaxNG = new RelaxNG();
$relax_ng = $relaxNG->getFromString($new_relax_ng);
if (! $relax_ng){
$relax_ng->registerXPathNamespace('rng', RelaxNgImportAgapeAnnotation::RELAX_NG_NS);
$relax_ng->registerXPathNamespace('pastell', RelaxNgImportAgapeAnnotation::PASTELL_ANNOTATION_NS);
- $element = $relax_ng->xpath("//rng:element[@name='Date']/pastell:annotation")[0];
+ return $relax_ng;
+ }
+ public function testImportAnnotation(){
+ $relax_ng = $this->getNewRelaxNG(
+ __DIR__."/../../../fixtures/EMEG_PROFIL_PES_0002_v1.5.xml",
+ __DIR__."/../../../fixtures/EMEG_PROFIL_PES_0002_v1_schema.rng"
+ );
+ $element = $relax_ng->xpath("//rng:element[@name='Date']/pastell:annotation")[0];
$this->assertRegExp("#pastell:now#", (string) $element);
-
}
+ public function testImportAnnotation2(){
+ $relax_ng = $this->getNewRelaxNG(
+ __DIR__."/../../../fixtures/profil_test.xml",
+ __DIR__."/../../../fixtures/profil_test_schema.rng"
+ );
+ $element = $relax_ng->xpath("//rng:element[@name='Date']/pastell:annotation")[0];
+ $this->assertRegExp("#pastell:now#", (string) $element);
+ }
}
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0" xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:6" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0" xmlns:qdt="fr:gouv:ae:archive:draft:standard_echange_v0.2:QualifiedDataType:1" xmlns:ccts="urn:un:unece:uncefact:documentation:standard:CoreComponentsTechnicalSpecification:2" xmlns="fr:gouv:ae:archive:draft:standard_echange_v0.2" ns="fr:gouv:ae:archive:draft:standard_echange_v0.2" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+ <rng:start combine="choice">
+ <rng:ref name="ArchiveTransfer"/>
+ </rng:start>
+ <rng:define name="ArchiveTransfer">
+ <rng:element name="ArchiveTransfer">
+ <rng:ref name="ArchiveTransfer_N65537"/>
+ </rng:element>
+ </rng:define>
+ <rng:define name="ArchiveTransfer_N65537">
+ <rng:element name="Date">
+ <rng:data type="string"/>
+ <annotation xmlns="http://pastell.adullact-projet.coop/seda-ng/annotation">{{pastell:now}}</annotation>
+ </rng:element>
+ <rng:element name="TransferIdentifier">
+ <rng:ref name="TransferIdentifier_N65549"/>
+ <annotation xmlns="http://pastell.adullact-projet.coop/seda-ng/annotation">{{pastell:flux:transfert_id}}</annotation>
+ </rng:element>
+ <rng:element name="TransferringAgency">
+ <rng:ref name="TransferringAgency_N65581"/>
+ </rng:element>
+ <rng:element name="ArchivalAgency">
+ <rng:ref name="ArchivalAgency_N65629"/>
+ </rng:element>
+ <rng:oneOrMore>
+ <rng:element name="Contains">
+ <rng:ref name="Contains_N65664"/>
+ </rng:element>
+ </rng:oneOrMore>
+ </rng:define>
+ <rng:define name="TransferringAgency_N65581">
+ <rng:element name="Identification">
+ <rng:ref name="Identification_N65584"/>
+ <annotation xmlns="http://pastell.adullact-projet.coop/seda-ng/annotation">{{pastell:connecteur:service_versant}}</annotation>
+ </rng:element>
+ <rng:optional>
+ <rng:element name="Name">
+ <rng:ref name="Name_N65616"/>
+ <annotation xmlns="http://pastell.adullact-projet.coop/seda-ng/annotation">{{pastell:if:nom_service_versant}}{{pastell:connecteur:nom_service_versant}}</annotation>
+ </rng:element>
+ </rng:optional>
+ </rng:define>
+ <rng:define name="ArchivalAgency_N65629">
+ <rng:element name="Identification">
+ <rng:ref name="Identification_N65632"/>
+ <annotation xmlns="http://pastell.adullact-projet.coop/seda-ng/annotation">{{pastell:connecteur::service_archive}}</annotation>
+ </rng:element>
+ </rng:define>
+ <rng:define name="Contains_N65664">
+ <rng:oneOrMore>
+ <rng:element name="DescriptionLanguage">
+ <rng:ref name="DescriptionLanguage_N65668"/>
+ </rng:element>
+ </rng:oneOrMore>
+ <rng:element name="DescriptionLevel">
+ <rng:ref name="DescriptionLevel_N65681"/>
+ </rng:element>
+ <rng:element name="Name">
+ <rng:ref name="Name_N65693"/>
+ <annotation xmlns="http://pastell.adullact-projet.coop/seda-ng/annotation">{{pastell:flux:nom}}</annotation>
+ </rng:element>
+ <rng:element name="ContentDescription">
+ <rng:ref name="ContentDescription_N65705"/>
+ </rng:element>
+ <rng:zeroOrMore>
+ <rng:element name="Document">
+ <rng:ref name="Document_N65728"/>
+ <annotation xmlns="http://pastell.adullact-projet.coop/seda-ng/annotation">{{pastell:repeat:annexe}}</annotation>
+ </rng:element>
+ </rng:zeroOrMore>
+ </rng:define>
+ <rng:define name="ContentDescription_N65705">
+ <rng:oneOrMore>
+ <rng:element name="Language">
+ <rng:ref name="Language_N65708"/>
+ </rng:element>
+ </rng:oneOrMore>
+ </rng:define>
+ <rng:define name="Document_N65728">
+ <rng:element name="Attachment">
+ <rng:ref name="Attachment_N65734"/>
+ <annotation xmlns="http://pastell.adullact-projet.coop/seda-ng/annotation">{{pastell:filename:annexe}}</annotation>
+ </rng:element>
+ <rng:element name="Type">
+ <rng:ref name="Type_N65766"/>
+ </rng:element>
+ </rng:define>
+ <rng:define name="TransferIdentifier_N65549">
+ <rng:data type="string"/>
+ </rng:define>
+ <rng:define name="Identification_N65584">
+ <rng:data type="string"/>
+ </rng:define>
+ <rng:define name="Name_N65616">
+ <rng:data type="string"/>
+ </rng:define>
+ <rng:define name="Identification_N65632">
+ <rng:data type="string"/>
+ </rng:define>
+ <rng:define name="DescriptionLanguage_N65668">
+ <rng:value>fr</rng:value>
+ <rng:attribute name="listVersionID">
+ <rng:value>edition 2009</rng:value>
+ </rng:attribute>
+ </rng:define>
+ <rng:define name="DescriptionLevel_N65681">
+ <rng:value>file</rng:value>
+ <rng:attribute name="listVersionID">
+ <rng:value>edition 2009</rng:value>
+ </rng:attribute>
+ </rng:define>
+ <rng:define name="Name_N65693">
+ <rng:data type="string"/>
+ </rng:define>
+ <rng:define name="Language_N65708">
+ <rng:value>fr</rng:value>
+ <rng:attribute name="listVersionID">
+ <rng:value>edition 2009</rng:value>
+ </rng:attribute>
+ </rng:define>
+ <rng:define name="Attachment_N65734">
+ <rng:data type="string"/>
+ <rng:attribute name="filename">
+ <rng:data type="string"/>
+ </rng:attribute>
+ </rng:define>
+ <rng:define name="Type_N65766">
+ <rng:value>CDO</rng:value>
+ <rng:attribute name="listVersionID">
+ <rng:value>edition 2009</rng:value>
+ </rng:attribute>
+ </rng:define>
+ <rng:define name="anyElement">
+ <rng:zeroOrMore>
+ <rng:element>
+ <rng:anyName/>
+ <rng:zeroOrMore>
+ <rng:choice>
+ <rng:attribute>
+ <rng:anyName/>
+ </rng:attribute>
+ <rng:text/>
+ <rng:ref name="anyElement"/>
+ </rng:choice>
+ </rng:zeroOrMore>
+ </rng:element>
+ </rng:zeroOrMore>
+ </rng:define>
+</rng:grammar>