Commit 6277e213 authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

Merge branch 'v0.0.8' into 'master'

v0.0.8

See merge request !4
parents 9821ff99 4a627dd4
Loading
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -50,9 +50,11 @@ require 'unicaen/signature'
Copier la configuration par défaut : 

```bash
cp vendor/unicaen/signature/conf/unicaen-signature.php.dist config/autoload/signature.local.php
cp vendor/unicaen/signature/confing/unicaen-signature.local.php.dist config/autoload/signature.local.php
```

Référencer le modèle Doctrine : [Configuration de la base de données](doc/config/database.md) 

Puis configurez le parapheur : 

 - **Esup** : [Configuration du parapheur ESUP](./doc/config/config-parapheur-esup.md)
+210 −23
Original line number Diff line number Diff line
<?php

use Psr\Container\ContainerInterface;

return [
    /**  **/
    'unicaen-signature' => [

        ////////////////////////////////////////////////////////////
        /////////////////////////////////////////////////////////////////////////////////
        // DEVELOPPEMENT
        'vite_mode'              => 'prod', // mode développement de l'UI
        // Mode dev (voir doc)
//        'vite_mode'      => 'dev', // mode développement de l'UI

        // Emplacement où sont archivés les document en cours de signature
        'documents_path' => __DIR__ . '/../../data/documents/signature',


        /////////////////////////////////////////////////////////////////////////////////
        /// SYSTEME de LOG
        'logger'         => [
            'enable' => false,
            'level' => \Monolog\Logger::DEBUG,
            'file'  => '/tmp/unicaen-signature.log',
            'stdout' => false
            ///////////////////////////////////////
            // Activation d'un logger autonome
            'enable'          => true, // Actif
            'level'           => \Monolog\Logger::DEBUG, // Niveau de log
            'file'            => __DIR__ . '/../../logs/signature.log', // Fichier d'écriture
            'file_permission' => 0666,

            ///////////////////////////////////////
            /// Sortie standard (pour le développement le built-in serveur)
            'stdout'          => false,

            ///////////////////////////////////////
            /// Logger complémentaire (celui de l'application utilisant le module)
            /// -> implementation de LoggerInterface (ex: Monolog)
            // 'customLogger' => null
            'customLogger'    => 'Logger' // customLogger (LoggerInterface)
        ],
        /////////////////////////////////////////////////////////////////////////////////

        /////////////////////////////////////////////////////////////////////////////////
        /// Logique métier

        /**
         * Retourne l'email de l'utilisateur courant. Cette méthode est utilisé lors d'un VISA INTERNE pour vérifier
         * si l'utilisateur courant est autorisé à Valider/Refuser le document.
         */
        'current_user'   => function (ContainerInterface $sc): string {
            $person = $sc->get(\Oscar\Service\OscarUserContext::class)->getCurrentPerson();
            if ($person) {
                return $person->getEmail();
            }
            return "";
        },

        'notifications_messages' => [
            'base_url' => 'http://localhost',
            'subject' => 'Document à {ACTION} sur OSCAR(dev)',
            'body'    => "Bonjour {FULLNAME},\r\nVous avez un document à {ACTION} sur OSCAR(dev). \r\n
                {URL}
            "
        ],

        /**
         * Liste des procédures déclenchées lors des notifications.
         */
        'notifications'          => [
            function (
                ContainerInterface $sc,
                \UnicaenSignature\Entity\Db\SignatureRecipient $recipient,
                string $subject,
                string $message
            ): void {
                $logger = $sc->get("Logger");
                $logger->debug("CONFIG:Notification $recipient | $subject | $message");
                try {
                    /** @var \Oscar\Service\MailingService $mailer */
                    $mailer = $sc->get(\Oscar\Service\MailingService::class);
                    $mail = $mailer->newMessage($subject);
                    $mail->setTo($recipient->getEmail())
                        ->setBody($message);
                    $mailer->send($mail);
                } catch (Exception $e) {
                    $logger->error("ERREUR MAIL SIGNATURE : ". $e->getMessage());
                }

            }
        ],

        /**
         * Méthodes personnalisées de récupération des utilisateurs
         *
         * La finalité est d'obtenir une liste de destinataires sous la forme :
         * [
         *   ['email'=>string, 'firstname'=>string, 'lastname'=>string ],
         *   ['email'=>string, 'firstname'=>string, 'lastname'=>string ],
         *  ]
         *
         * Note : firstname/lastname sont optionnels
         */
        'get_recipients_methods' => [
            [
                ///// key : Clef unique pour identifier le méthode
                'key'               => 'persons_by_role',
                'label'             => 'Personnes par rôle', // Intitulé
                'description'       => 'Selectionne les personnes en fonction de leurs rôles', // Description

                // Les options sont utilisées pour configurer la méthode d'obtention des destinataires
                // Il y'a 2 étapes :
                //  ETAPE 1 - options
                // Les options permettent de définir un ou plusieurs critères
                // Chaque critère a un nom unique (key), et un tableau de valeurs possibles.
                // Ces valeurs sont fixées avec la clef 'values', soit des valeurs fixes, soit une fonction retournant
                // la liste des CLEFS=>VALEURS disponible pour cette option.
                //  ETAPE 2 - getRecipients
                // Un méthode 'getRecipients' est appelé lors du déclenchement d'un étape de signature,
                // cette méthode reçoit les options configurées sous la forme KEY_OPTION => [VALEURA,VALEURSB,...]
                'options'           => [ // Options
                    [
                        'key'          => 'role_person_id',
                        'label'        => "Rôle dans l'activité",
                        // Type d'affichage (checkbox / recipients)
                        'type'         => 'checkbox',

                        ///////////////////////////////////////////////////
                        // array|function
                        // Retourne un tableau VALEUR => LABEL.
                        //
                        // Ex : [
                        //        15 => "Valeur d'option A",
                        //        24 => "Valeur d'option B",
                        //        37 => "Valeur d'option C",
                        //      ]
                        'values'       => function (ContainerInterface $s) {
                            return $s->get(
                                \Oscar\Service\OscarUserContext::class
                            )->getAvailableRolesActivityOrOrganization();
                        },

                        // Valeurs par défaut
                        'defaultValue' => []
                    ],
                    [
                        'key'    => 'role_organisation_id',
                        'label'  => "étendre aux structures",
                        'type'   => 'checkbox',
                        'values' => function ($s) {
                            return $s->get(
                                \Oscar\Service\OscarUserContext::class
                            )->getAvailabledRolesOrganizationActivity();
                        },

                        'defaultValue' => []
                    ]
                ],

                //////////////////////////////////////
                /// TODO / DEPRECATED ?
                'methods_on_create' => null,

                //////////////////////////////////////
                /// Retourne les destinataires sous la forme :
                /// [
                ///    ['email'=>string, 'firstname'=>string, 'lastname'=>string ],
                ///    ['email'=>string, 'firstname'=>string, 'lastname'=>string ],
                /// ]
                ///
                /// $options corresponds au options configurées avant, dans cet exemple, 'getRecipients' va recevoir les
                /// valeurs :
                /// [
                ///   'role_person_id' => [VALEUR1,VALEUR2],
                ///   'role_organisation_id' => [VALEURA,VALEURB]
                /// ]
                ///
                'getRecipients'     => function ($sc, $options) {
                    return $sc->get(\Oscar\Service\ProjectGrantService::class)->getRecipients($options);
                }
            ],
        ],

        // Configuration des parafeurs numérique
        'letterfiles'            => [
            [
                'label'     => 'ESUP signature',
                // Nom visible côté applicatif
                'label' => 'ESUP',

                // Code (unique)
                'name'  => 'esup',

                'description' => 'Parafeur numérique ESUP',

                // Utilisé par défaut
                'default'     => true,

                // Classe
                'class'       => \UnicaenSignature\Strategy\Letterfile\Esup\EsupLetterfileStrategy::class,

                // Niveaux de signature disponible
                'levels'      => [
                    'visa_visuel' => 'visa_visuel_in_esup',
                    'sign_visuel' => 'sign_visuel_in_esup',
                    'sign_certif' => 'sign_certif_in_esup',
                    'sign_eidas' => 'sign_eidas_in_esup',
                    \UnicaenSignature\Utils\SignatureConstants::VISA_HIDDEN => 'hidden',
                    \UnicaenSignature\Utils\SignatureConstants::VISA_VISUAL => 'visa',
                    \UnicaenSignature\Utils\SignatureConstants::SIGN_VISUAL => 'pdfImageStamp',
                    \UnicaenSignature\Utils\SignatureConstants::SIGN_CERTIF => 'certSign',
                    \UnicaenSignature\Utils\SignatureConstants::SIGN_EIDAS  => 'nexuSign',
                ],

                // Configuration du parafeur
                'config'      => [
                    // ESUP configuration
                    'url' => "https://esup.unicaen.fr/"
                    'url'           => "https://signature-pp.unicaen.fr",

                    // Créateur
                    'createdByEppn' => 'bouvry@unicaen.fr',
                ]
            ],
//            [
//                'label'     => 'OSCAR visa',
//                'name'      => 'oscar',
//                'default'   => false,
//                'class'     => \UnicaenSignature\Strategy\Letterfile\Oscar\OscarLetterfileStrategy::class,
//                'levels'    => [
//                    'visa_hidden' => 'visa_hidden',
//                ],
//                'config'    => [
//
//                ]
//            ]
            [
                'label'   => 'OSCAR visa',
                'name'    => 'internal', // internal est une clef dédiée pour identifier le parapheur interne
                'default' => false,
                'class'   => \UnicaenSignature\Strategy\Letterfile\InternalVisa\InternalVisaStrategy::class,
                'levels'  => [
                    'visa_hidden' => 'visa_hidden',
                ],
                'config'  => [
                    'checkUserAcces' => function ($sc, $signatureRecipient) {
                        return true;
                        //return $sc->get(\Oscar\Service\ProjectGrantService::class)->getRecipients($options);
                    }
                ]
            ]
        ]
    ]
    /******/
];
 No newline at end of file

doc/config/database.md

0 → 100644
+138 −0
Original line number Diff line number Diff line
# Base de données

## Localisation des entités Doctrine
Le module est conçu pour fonctionner avec *doctrine*.

Indiquez l'emplacement des entitées doctrine dans la configuration de votre projet : 

```php
<?php
// Fichier config/autoload/global.php de votre projet
return array(
    // ...
    
    // Dans la configuration de doctrine
    'doctrine' => array(
        // ... 
        'driver' => array(
            'oscar_entities' => array(
                'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
                'cache' => 'array',
                'paths' => array(
                    // ... Vos entitées
                    // Ajoutez celles d'UnicaenSignature
                    __DIR__ . '/../../vendor/unicaen/signature/src/Entity/Db',
                ),
            ),
        ),
    ),
);
```

> Pensez à actualiser votre modèle via la console de Doctrine

## Construction des tables

> Si vous ne passez pas par les outils Dotrine

```sql
CREATE TABLE public.unicaen_signature_signature (
	id int4 NOT NULL,
	datecreated timestamp(0) NULL DEFAULT NULL::timestamp without time zone,
	"type" varchar(32) NULL DEFAULT NULL::character varying,
	status int4 NOT NULL DEFAULT 101,
	"label" varchar(255) NULL DEFAULT NULL::character varying,
	description varchar(255) NULL DEFAULT NULL::character varying,
	datesend timestamp(0) NULL DEFAULT NULL::timestamp without time zone,
	dateupdate timestamp(0) NULL DEFAULT NULL::timestamp without time zone,
	document_path varchar(255) NOT NULL,
	document_remotekey varchar(255) NULL DEFAULT NULL::character varying,
	document_localkey varchar(255) NULL DEFAULT NULL::character varying,
	letterfile_key varchar(255) NULL DEFAULT NULL::character varying,
	letterfile_process varchar(255) NULL DEFAULT NULL::character varying,
	letterfile_url varchar(255) NULL DEFAULT NULL::character varying,
	allsigntocomplete bool NOT NULL DEFAULT false,
	"ordering" int4 NOT NULL DEFAULT 0,
	notificationsrecipients bool NOT NULL DEFAULT false,
	CONSTRAINT unicaen_signature_signature_pkey PRIMARY KEY (id)
);

CREATE TABLE public.unicaen_signature_signatureflow (
	id int4 NOT NULL,
	"label" varchar(255) NULL DEFAULT NULL::character varying,
	description varchar(255) NULL DEFAULT NULL::character varying,
	CONSTRAINT unicaen_signature_signatureflow_pkey PRIMARY KEY (id)
);

CREATE TABLE public.unicaen_signature_observer (
	id int4 NOT NULL,
	signature_id int4 NULL,
	firstname varchar(64) NULL DEFAULT NULL::character varying,
	lastname varchar(64) NULL DEFAULT NULL::character varying,
	email varchar(256) NOT NULL,
	CONSTRAINT unicaen_signature_observer_pkey PRIMARY KEY (id),
	CONSTRAINT fk_eac19423ed61183a FOREIGN KEY (signature_id) REFERENCES unicaen_signature_signature(id)
);
CREATE INDEX idx_eac19423ed61183a ON public.unicaen_signature_observer USING btree (signature_id);

CREATE TABLE public.unicaen_signature_process (
	id int4 NOT NULL,
	signatureflow_id int4 NULL,
	datecreated timestamp(0) NULL DEFAULT NULL::timestamp without time zone,
	lastupdate timestamp(0) NULL DEFAULT NULL::timestamp without time zone,
	status int4 NULL,
	document_name varchar(255) NOT NULL,
	currentstep int4 NOT NULL,
	CONSTRAINT unicaen_signature_process_pkey PRIMARY KEY (id),
	CONSTRAINT fk_994855d2b4090c8a FOREIGN KEY (signatureflow_id) REFERENCES unicaen_signature_signatureflow(id)
);
CREATE INDEX idx_994855d2b4090c8a ON public.unicaen_signature_process USING btree (signatureflow_id);

CREATE TABLE public.unicaen_signature_recipient (
	id int4 NOT NULL,
	signature_id int4 NULL,
	status int4 NOT NULL DEFAULT 101,
	firstname varchar(64) NULL DEFAULT NULL::character varying,
	lastname varchar(64) NULL DEFAULT NULL::character varying,
	email varchar(256) NOT NULL,
	phone varchar(20) NULL DEFAULT NULL::character varying,
	dateupdate timestamp(0) NULL DEFAULT NULL::timestamp without time zone,
	keyaccess varchar(255) NULL DEFAULT NULL::character varying,
	"comment" varchar(255) NULL DEFAULT NULL::character varying,
	datefinished timestamp(0) NULL DEFAULT NULL::timestamp without time zone,
	CONSTRAINT unicaen_signature_recipient_pkey PRIMARY KEY (id),
	CONSTRAINT fk_f47c5330ed61183a FOREIGN KEY (signature_id) REFERENCES unicaen_signature_signature(id)
);
CREATE INDEX idx_f47c5330ed61183a ON public.unicaen_signature_recipient USING btree (signature_id);

CREATE TABLE public.unicaen_signature_signatureflowstep (
	id int4 NOT NULL,
	recipientsmethod varchar(64) NULL DEFAULT NULL::character varying,
	"label" varchar(64) NULL DEFAULT NULL::character varying,
	letterfilename varchar(256) NOT NULL,
	"level" varchar(256) NOT NULL,
	"ordering" int4 NOT NULL,
	signatureflow_id int4 NULL,
	"options" text NULL,
	allrecipientssign bool NOT NULL DEFAULT true,
	notificationsrecipients bool NOT NULL DEFAULT false,
	editablerecipients bool NOT NULL DEFAULT false,
	CONSTRAINT unicaen_signature_signatureflowstep_pkey PRIMARY KEY (id),
	CONSTRAINT fk_a575dc3eb4090c8a FOREIGN KEY (signatureflow_id) REFERENCES unicaen_signature_signatureflow(id)
);
CREATE INDEX idx_a575dc3eb4090c8a ON public.unicaen_signature_signatureflowstep USING btree (signatureflow_id);

CREATE TABLE public.unicaen_signature_process_step (
	id int4 NOT NULL,
	process_id int4 NULL,
	signature_id int4 NULL,
	signatureflowstep_id int4 NULL,
	CONSTRAINT unicaen_signature_process_step_pkey PRIMARY KEY (id),
	CONSTRAINT fk_cf70b0a57ec2f574 FOREIGN KEY (process_id) REFERENCES unicaen_signature_process(id),
	CONSTRAINT fk_cf70b0a5c352c4 FOREIGN KEY (signatureflowstep_id) REFERENCES unicaen_signature_signatureflowstep(id),
	CONSTRAINT fk_cf70b0a5ed61183a FOREIGN KEY (signature_id) REFERENCES unicaen_signature_signature(id)
);
CREATE INDEX idx_cf70b0a57ec2f574 ON public.unicaen_signature_process_step USING btree (process_id);
CREATE INDEX idx_cf70b0a5c352c4 ON public.unicaen_signature_process_step USING btree (signatureflowstep_id);
CREATE UNIQUE INDEX uniq_cf70b0a5ed61183a ON public.unicaen_signature_process_step USING btree (signature_id);
```
 No newline at end of file
+1 −0

File added.

Preview size limit exceeded, changes collapsed.

+0 −1

File deleted.

Preview size limit exceeded, changes collapsed.

Loading