La fonctionnalité M2M, permet d'envoyer un courrier et des pièces jointes entre deux instances de Maarch Courrier, ou entre Maarch Courrier et une autre GEC.
L'expéditeur du courrier sera automatiquement créé dans la base de données s'il n'existe pas.
Il est également possible de recevoir un accusé de réception et de suivre l'avancement de notre courrier chez le destinataire.
Les données sont transmises dans une archive ZIP soit par l'envoi de mail (et Maarch Capture), soit pas web service REST, soit manuellement. Cette archive ZIP est appelée par la suite "Pli numérique"
Dans les trois cas, un fichier de configuration doit être renseigné.
Avant toutes modifications, copier le fichier [racine]/apps/maarch_entreprise/xml/m2m_config.xml dans votre custom [racine]/custom/[custom_id]/apps/maarch_entreprise/xml/m2m_config.xml
<?xml version="1.0" encoding="utf-8"?>
<ROOT>
<res_letterbox>
<type_id>101</type_id>
<status>NUMQUAL</status>
<priority>poiuytre1357nbvc</priority>
<indexingModelId>1</indexingModelId>
</res_letterbox>
<res_attachments>
<attachment_type>simple_attachment</attachment_type>
</res_attachments>
<basketRedirection_afterUpload>NumericBasket</basketRedirection_afterUpload><!--basketId-->
<m2m_communication>https://cchaplin:maarch@demo.maarchcourrier.com,test@maarch.org</m2m_communication><!--moyen de communication de l'instance : email ou uri -->
</ROOT>
Par mesure de sécurité, si vous renseignez une uri, le compte utilisé doit être un compte de webservice (voir le paramétrage ici).
L'utilisateur doit être dans un groupe qui a au moins le privilège :
1) Vérifier que le docserver_id ARCHIVETRANSFER existe dans la table docservers. S'il n'existe pas, passer cette commande dans la base de données :
INSERT INTO docservers (docserver_id, docserver_type_id, device_label, is_readonly, enabled, size_limit_number, actual_size_number, path_template, ext_docserver_info, chain_before, chain_after, creation_date, closing_date, coll_id, priority_number, docserver_location_id, adr_priority_number)
VALUES ('ARCHIVETRANSFER', 'ARCHIVETRANSFER', 'Fast internal disc bay for archive transfer', 'N', 'Y', 50000000000, 1, '/opt/maarch/docservers/archive_transfer/', NULL, NULL, NULL, '2017-01-13 14:47:49.197164', NULL, 'archive_transfer_coll', 10, 'NANTERRE', 2);
Vérifier également que le chemin /opt/maarch/docservers/archive_transfer/ existe sur votre serveur et que les droits soient correctement positionnés. Sinon modifier ce chemin, ou créer le dossier.
2) Vérifier que le docserver_type ARCHIVETRANSFER existe dans la table docserver_types. S'il n'existe pas, passer cette commande dans la base de données :
INSERT INTO docserver_types (docserver_type_id, docserver_type_label, enabled, is_container, container_max_number, is_compressed, compression_mode, is_meta, meta_template, is_logged, log_template, is_signed, fingerprint_mode)
VALUES ('ARCHIVETRANSFER', 'Archive Transfer', 'Y', 'N', 0, 'N', 'NONE', 'N', 'NONE', 'N', 'NONE', 'Y', 'SHA256');
Afin de transférer les documents entre les deux instances, le protocole utilisé est SEDA2.
Le pli numérique est une archive ZIP, contenant :
Exemple de paquet transféré : ArchiveTransfer_20181008_164539_bblier.zip
Après un envoi ou une réception de pli numérique, les archives ZIP sont visible dans le dossier [racine_maarch]/apps/maarch_entreprise/tmp/
Exemple de bordereau SEDA2 généré : (Par soucis de lisibilité, le fichier encodé en base64 a été enlevé)
<?xml version="1.0" encoding="UTF-8"?>
<ArchiveTransfer xmlns="fr:gouv:culture:archivesdefrance:seda:v2.0">
<Comment>Bernard BLIER (Ville de Maarch-les-bains - Service Courrier - florian.azizian@maarch.org) : Votre message est prêt à être envoyé avec les fichiers joints suivants :
sdfsddf: sdfsddf.pdf
</Comment>
<Date>2018-10-08T16:45:39+02:00</Date>
<MessageIdentifier>ArchiveTransfer_20181008_164539_bblier</MessageIdentifier>
<CodeListVersions>
<ReplyCodeListVersion>""</ReplyCodeListVersion>
<MessageDigestAlgorithmCodeListVersion>""</MessageDigestAlgorithmCodeListVersion>
<MimeTypeCodeListVersion>""</MimeTypeCodeListVersion>
<EncodingCodeListVersion>""</EncodingCodeListVersion>
<FileFormatCodeListVersion>""</FileFormatCodeListVersion>
<CompressionAlgorithmCodeListVersion>""</CompressionAlgorithmCodeListVersion>
<DataObjectVersionCodeListVersion>""</DataObjectVersionCodeListVersion>
<StorageRuleCodeListVersion>""</StorageRuleCodeListVersion>
<AppraisalRuleCodeListVersion>""</AppraisalRuleCodeListVersion>
<AccessRuleCodeListVersion>""</AccessRuleCodeListVersion>
<DisseminationRuleCodeListVersion>""</DisseminationRuleCodeListVersion>
<ReuseRuleCodeListVersion>""</ReuseRuleCodeListVersion>
<ClassificationRuleCodeListVersion>""</ClassificationRuleCodeListVersion>
<AuthorizationReasonCodeListVersion>""</AuthorizationReasonCodeListVersion>
<RelationshipCodeListVersion>""</RelationshipCodeListVersion>
</CodeListVersions>
<DataObjectPackage>
<BinaryDataObject id="res_letterbox_0_104">
<Attachment filename="0030_1200000707.pdf">BASE64_DU_DOCUMENT</Attachment>
<MessageDigest algorithm="sha256">d4ae804a0e20cd61d63a92056506fe40fe6d46ade73a5803c54cf5ebf024cc2896133f7314da49edcaab61f9c3049f74030d153b30566f9822f2722173105e95</MessageDigest>
<Size>111108</Size>
<FormatIdentification>
<MimeType>application/pdf</MimeType>
</FormatIdentification>
</BinaryDataObject>
<DescriptiveMetadata>
<ArchiveUnit id="mail_1">
<Content>
<DescriptionLevel>File</DescriptionLevel>
<Title>[CAPTUREM2M]Réponse à votre courrier du 27-06-2018</Title>
<OriginatingSystemId>104</OriginatingSystemId>
<Status>Nouveau courrier ou document non qualifié</Status>
<Writer>
<FirstName>Barbara</FirstName>
<BirthName>BAIN</BirthName>
</Writer>
<CreatedDate>2018-06-27</CreatedDate>
</Content>
<ArchiveUnit id="archiveUnit_res_letterbox_0_104">
<Content>
<DescriptionLevel>Item</DescriptionLevel>
<Title>sdfsddf</Title>
<OriginatingSystemId>104</OriginatingSystemId>
<Status>Nouveau courrier ou document non qualifié</Status>
<Writer>
<FirstName>Barbara</FirstName>
<BirthName>BAIN</BirthName>
</Writer>
<CreatedDate>2018-06-27</CreatedDate>
</Content>
<DataObjectReference>
<DataObjectReferenceId>res_letterbox_0_104</DataObjectReferenceId>
</DataObjectReference>
</ArchiveUnit>
</ArchiveUnit>
</DescriptiveMetadata>
<ManagementMetadata></ManagementMetadata>
</DataObjectPackage>
<ArchivalAgency>
<Identifier>org_987654321_DGS_SF</Identifier>
<OrganizationDescriptiveMetadata>
<Name>Préfecture de Maarch Les Bains</Name>
<Communication>
<Channel>url</Channel>
<CompleteNumber>https://cchaplin:maarch@demo.maarchcourrier.com/rest/saveNumericPackage</CompleteNumber>
</Communication>
<Contact>
<PersonName>MARTIN Nicolas</PersonName>
<Communication>
<Channel>phone</Channel>
<CompleteNumber></CompleteNumber>
</Communication>
<Communication>
<Channel>email</Channel>
<CompleteNumber>info@maarch.org</CompleteNumber>
</Communication>
<Address>
<CityName>MAARCH LES BAINS</CityName>
<Country>FRANCE</Country>
<PostOfficeBox>13</PostOfficeBox>
<StreetName>RUE LA PREFECTURE</StreetName>
</Address>
</Contact>
</OrganizationDescriptiveMetadata>
</ArchivalAgency>
<TransferringAgency>
<Identifier>org_987654321_DGS_SF</Identifier>
<OrganizationDescriptiveMetadata>
<LegalClassification>Ville de Maarch-les-bains</LegalClassification>
<Name>Service Courrier</Name>
<Communication>
<Channel>url</Channel>
<CompleteNumber>https://cchaplin:maarch@localhost/maarch_v2</CompleteNumber>
</Communication>
<Contact>
<DepartmentName>Service Courrier</DepartmentName>
<PersonName>Bernard BLIER</PersonName>
<Communication>
<Channel>phone</Channel>
</Communication>
<Communication>
<Channel>email</Channel>
<CompleteNumber>florian.azizian@maarch.org</CompleteNumber>
</Communication>
<Address></Address>
</Contact>
</OrganizationDescriptiveMetadata>
</TransferringAgency>
</ArchiveTransfer>
Afin de pouvoir envoyer un pli numérique, un utilisateur doit faire parti d'un groupe qui a le privilège "Enregistrer un pli numérique".
L'envoi de pli numérique se fait dans la partie "Eléments envoyés" visible dans la fiche détaillée, ou la page de traitement. Cliquer ensuite sur le logo "Envoyer un pli numérique" afin d'accéder au formulaire d'envoi.
Le pli numérique peut être transmis selon 3 méthodes. Cela dépend du moyen de communication de l'expéditeur et du destinataire.
Envoi par webservice
Aucun paramétrage à faire en plus. Les courriers, accusé de réception et suivi des demandes seront visible en tant réelle (sauf ralentissement réseau).
Envoi manuel
Si les 2 instances ne sont pas joignable, il est possible d'enregistrer le pli numérique et de le transférer au destinataire "manuellement".
Pour cela :
Envoi par mail automatisé
Attention, avec cette méthode, la transmission des pli numérique, des accusés de réception et de la suivi des demande ne sont pas instantanée. Cela dépend de la fréquence d'exécution des scripts d'envoi de mail et de capture.
Pour utiliser cette méthode, il faut paramétrer Maarch Capture :
1) Copier le fichier [racine_Maarch_Capture]/config/samples/Capture_m2m_sample.xml.default vers [racine_Maarch_Capture]/config/Capture.xml. Et modifier les chemins des attributs maarchLogParam et directory en fonction de votre environnement.
2) Copier les 4 fichiers [racine_Maarch_Capture]modules/MailCapture/samples/MailCapture_M2M{_ACK, _NOTIFICATION, _REPLY}.xml.default vers [racine_Maarch_Capture]modules/MailCapture/MailCapture_M2M{_ACK, _NOTIFICATION, _REPLY}.xml.default
3) Copier le fichier [racine_Maarch_Capture]/modules/MaarchWSClient/samples/MaarchWSClient_m2m_sample.xml.default vers [racine_Maarch_Capture]/modules/MaarchWSClient/MaarchWSClient_m2m_sample.xml. Et modifier l'attribut uri en fonction de votre environnement.
4) Copier le script [racine_Maarch_Capture]/scripts/samples/linux/CAPTURE_M2M.sh.default en [racine_Maarch_Capture]/scripts/samples/linux/CAPTURE_M2M.sh
Rendre ce script exécutable avec la commande "chmod +x", puis lancer le en tâche planifié.
Les logs de Maarch Capture sont visible dans le fichier que vous avez indiqué dans l'attribut directory du fichier Capture.xml
De plus, il faut que le script d'envoi de mail soit correctement configuré dans votre application (Paramétrage du script sendmail ici).
Les logs de l'envoi de mail sont visible ici : [racine_Maarch]/modules/sendmail/batch/logs/
Dans les trois cas, les archives sont générés et extraite dans le dossier [racine_maarch]/apps/maarch_entreprise/tmp/
Après l'envoi d'un pli numérique, celui-ci est visible dans la liste des plis numérique.
Vous pouvez voir si le pli numérique a été reçu par le destinataire en vérifiant que la date de réception soit bien remplie.
Dans la liste des plis numérique envoyés, cliquer sur un pli numérique.
Le détail du pli numérique envoyé s'affiche.
Aussi, vous pouvez voir :
Les actions sont enregistrés dans l'historique :
C'est tout à fait possible, grâce au contact que vous créez dans l'instance émettrice via le champ "Identifiant contact externe de l'adresse du contact" qui doit correspondre au numéro SIRET d'une entité de l'instance destinatrice.
Ex : vous pouvez envoyer un pli numérique à la ville de Nancy pour le service informatique, si vous avez créé dans votre instance émettrice l'adresse "service informatique" du contact de la ville de Nancy. L'adresse "service informatique" du contact "ville de Nancy" doit avoir dans le champ "identifiant du contact externe" le numéro de SIRET de l'entité "service informatique" de l'instance de la ville de Nancy.
Pour étayer cet exemple, imaginons que vous souhaitez envoyer deux plis numériques à la ville de Nancy. Un pour le service informatique, un autre pour le service comptabilité
Le paramétrage et les étapes suivantes devront alors être validées :
Etape 0 : dans l'instance destinatrice, la ville de Nancy, il faut que j'ai les deux entités déclarées avec le champ numéro de SIRET unique. J'ai donc créé le service informatique avec le num SIRET 1234NANCY_INFORMATIQUE et le service comptabilité avec le SIRET 1234NANCY_COMPTABILITE.
Etape 1 : je créé le contact "service informatique" du contact de la ville de Nancy avec comme identifiant contact externe "1234NANCY_INFORMATIQUE"
Etape 2 : je créé le contact "service comptabilité" du contact de la ville de Nancy avec comme identifiant contact externe "1234NANCY_COMPTABILITE"
Etape 3 : une fois mon courrier enregistré (associé au contact "ville de Nancy service informatique") j'envoie le pli numérique au service informatique de la ville de Nancy
Etape 4 : une fois mon courrier enregistré (associé au contact "ville de Nancy service comptabilité") j'envoie le pli numérique au service comptabilité de la ville de Nancy
Depuis le répertoire ./sql vous avez à votre disposition un fichier SQL vous permettant de vous aider à charger des contacts candidats au M2GEC. C'est un fichier exemple quand vous êtes en multi-instances. Cela vous permet de charger les contacts des autres instances de votre plateforme. Vous permettant ainsi de faire des transferts de courriers entre vos instances.
./sql/m2m_contacts_samples.sql
Voici son contenu :
--CREATE GROUP FOR M2GEC
DELETE FROM usergroups WHERE group_id = 'MAARCHTOGEC';
INSERT INTO usergroups (group_id,group_desc,enabled) VALUES ('MAARCHTOGEC', 'Envoi dématérialisé','Y');
DELETE FROM usergroups_services WHERE group_id = 'MAARCHTOGEC';
INSERT INTO usergroups_services (group_id, service_id) VALUES ('MAARCHTOGEC', 'save_numeric_package');
--CREATE SECURITY FOR M2GEC
DELETE FROM security WHERE group_id = 'MAARCHTOGEC';
INSERT INTO security (group_id, coll_id, where_clause, maarch_comment) VALUES ('MAARCHTOGEC', 'letterbox_coll', '1=0', 'Aucun courrier');
--CREATE A USER FOR M2GEC
DELETE FROM users WHERE user_id = 'cchaplin';
INSERT INTO users (user_id, password, firstname, lastname, mail, enabled, change_password, status, loginmode) VALUES ('cchaplin', '$2y$10$C.QSslBKD3yNMfRPuZfcaubFwPKiCkqqOUyAdOr5FSGKPaePwuEjG', 'Jean', 'WEBSERVICE', 'info@maarch.org', 'Y', 'N', 'OK', 'restMode');
DELETE FROM usergroup_content WHERE user_id = 'cchaplin';
INSERT INTO usergroup_content (user_id, group_id, primary_group, role) VALUES ('cchaplin', 'MAARCHTOGEC', 'Y','');
--CREATE CONTACTS FOR M2GEC
DELETE FROM contacts_v2 where contact_id >= 1000000;
DELETE FROM contact_addresses where id >= 1000000;
DELETE FROM contact_communication where contact_id >= 1000000;
-- INSTANCE A
INSERT INTO contacts_v2 (contact_id, contact_type, is_corporate_person, is_external_contact, society, user_id, entity_id, creation_date) VALUES
(1000000, 102, 'Y', 'Y', 'Custom 1', 'cchaplin', 'COU', '2019-03-28 21:43:54.97424');
INSERT INTO contact_addresses (id, contact_id, contact_purpose_id, user_id, entity_id, external_id)
VALUES (1000000, 1000000, 1, 'cchaplin', 'COU', '{"m2m": "org_custom_1"}');
INSERT INTO contact_communication (contact_id, type, value)
VALUES (1000000, 'url', 'http://cchaplin:maarch@127.0.0.1/MaarchCourrier/cs_custom_1/');
-- INSTANCE B
INSERT INTO contacts_v2 (contact_id, contact_type, is_corporate_person, is_external_contact, society, user_id, entity_id, creation_date) VALUES
(1000001, 102, 'Y', 'Y', 'Custom 2', 'cchaplin', 'COU', '2019-03-28 21:43:54.97424');
INSERT INTO contact_addresses (id, contact_id, contact_purpose_id, user_id, entity_id, external_id)
VALUES (1000001, 1000001, 1, 'cchaplin', 'COU', '{"m2m": "org_custom_2"}');
INSERT INTO contact_communication (contact_id, type, value)
VALUES (1000001, 'url', 'http://cchaplin:maarch@127.0.0.1/MaarchCourrier/cs_custom_2/');
-- INSTANCE C
INSERT INTO contacts_v2 (contact_id, contact_type, is_corporate_person, is_external_contact, society, user_id, entity_id, creation_date) VALUES
(1000002, 102, 'Y', 'Y', 'Custom 3', 'cchaplin', 'COU', '2019-03-28 21:43:54.97424');
INSERT INTO contact_addresses (id, contact_id, contact_purpose_id, user_id, entity_id, external_id)
VALUES (1000002, 1000002, 1, 'cchaplin', 'COU', '{"m2m": "org_custom_2"}');
INSERT INTO contact_communication (contact_id, type, value)
VALUES (1000002, 'url', 'http://cchaplin:maarch@127.0.0.1/MaarchCourrier/cs_custom_3/');
-- FOR EACH INSTANCE
DO $$
BEGIN
IF (SELECT current_database() = 'custom_1') THEN
UPDATE entities set business_id = 'org_custom_1';
END IF;
END $$;
DO $$
BEGIN
IF (SELECT current_database() = 'custom_2') THEN
UPDATE entities set business_id = 'org_custom_2';
END IF;
END $$;
DO $$
BEGIN
IF (SELECT current_database() = 'custom_3') THEN
UPDATE entities set business_id = 'org_custom_3';
END IF;
END $$;