From d17bc60e71bc12c3f067a7a0140206a32c36bb71 Mon Sep 17 00:00:00 2001
From: Jean-Philippe Metivier <jean-philippe.metivier@unicaen.fr>
Date: Mon, 4 Jul 2022 11:07:07 +0200
Subject: [PATCH] V0 de unicaenValidation
---
.gitlab-ci.yml | 14 ++
Module.php | 48 +++++
composer.json | 21 ++
config/merged/validation-instance.config.php | 169 +++++++++++++++++
config/merged/validation-type.config.php | 127 +++++++++++++
config/module.config.php | 92 +++++++++
documentation/001_table.sql | 38 ++++
documentation/101_privilege.sql | 29 +++
.../ValidationInstanceController.php | 123 ++++++++++++
.../ValidationInstanceControllerFactory.php | 40 ++++
.../Controller/ValidationTypeController.php | 105 ++++++++++
.../ValidationTypeControllerFactory.php | 36 ++++
...ation.Entity.Db.ValidationInstance.dcm.xml | 29 +++
...alidation.Entity.Db.ValidationType.dcm.xml | 13 ++
.../Entity/Db/ValidationInstance.php | 66 +++++++
.../Entity/Db/ValidationType.php | 73 +++++++
.../Entity/HasValidationsInterface.php | 15 ++
.../Entity/HasValidationsTrait.php | 67 +++++++
.../ValidationInstanceForm.php | 68 +++++++
.../ValidationInstanceFormAwareTrait.php | 25 +++
.../ValidationInstanceFormFactory.php | 33 ++++
.../ValidationInstanceHydrator.php | 37 ++++
.../ValidationInstanceHydratorFactory.php | 27 +++
.../ValidationType/ValidationTypeForm.php | 98 ++++++++++
.../ValidationTypeFormAwareTrait.php | 24 +++
.../ValidationTypeFormFactory.php | 31 +++
.../ValidationType/ValidationTypeHydrator.php | 37 ++++
.../ValidationTypeHydratorFactory.php | 18 ++
.../ValidationinstancePrivileges.php | 13 ++
.../Privilege/ValidationtypePrivileges.php | 12 ++
.../ValidationInstanceService.php | 179 ++++++++++++++++++
.../ValidationInstanceServiceAwareTrait.php | 24 +++
.../ValidationInstanceServiceFactory.php | 33 ++++
.../ValidationType/ValidationTypeService.php | 158 ++++++++++++++++
.../ValidationTypeServiceAwareTrait.php | 24 +++
.../ValidationTypeServiceFactory.php | 33 ++++
.../Helper/ValidationAfficherViewHelper.php | 26 +++
.../View/Helper/ValidationBadgeViewHelper.php | 26 +++
.../Helper/ValidationValiderViewHelper.php | 29 +++
.../ValidationValiderViewHelperFactory.php | 27 +++
.../Helper/partial/validation-afficher.phtml | 22 +++
.../Helper/partial/validation-badge.phtml | 30 +++
.../Helper/partial/validation-valider.phtml | 39 ++++
.../default/confirmation.phtml | 37 ++++
.../default/default-form.phtml | 43 +++++
.../validation-instance/index.phtml | 121 ++++++++++++
.../validation-modal.phtml | 43 +++++
.../validation-type/index.phtml | 113 +++++++++++
48 files changed, 2535 insertions(+)
create mode 100644 .gitlab-ci.yml
create mode 100644 Module.php
create mode 100755 composer.json
create mode 100644 config/merged/validation-instance.config.php
create mode 100644 config/merged/validation-type.config.php
create mode 100644 config/module.config.php
create mode 100644 documentation/001_table.sql
create mode 100644 documentation/101_privilege.sql
create mode 100644 src/UnicaenValidation/Controller/ValidationInstanceController.php
create mode 100644 src/UnicaenValidation/Controller/ValidationInstanceControllerFactory.php
create mode 100644 src/UnicaenValidation/Controller/ValidationTypeController.php
create mode 100644 src/UnicaenValidation/Controller/ValidationTypeControllerFactory.php
create mode 100644 src/UnicaenValidation/Entity/Db/Mapping/UnicaenValidation.Entity.Db.ValidationInstance.dcm.xml
create mode 100644 src/UnicaenValidation/Entity/Db/Mapping/UnicaenValidation.Entity.Db.ValidationType.dcm.xml
create mode 100644 src/UnicaenValidation/Entity/Db/ValidationInstance.php
create mode 100644 src/UnicaenValidation/Entity/Db/ValidationType.php
create mode 100644 src/UnicaenValidation/Entity/HasValidationsInterface.php
create mode 100644 src/UnicaenValidation/Entity/HasValidationsTrait.php
create mode 100644 src/UnicaenValidation/Form/ValidationInstance/ValidationInstanceForm.php
create mode 100644 src/UnicaenValidation/Form/ValidationInstance/ValidationInstanceFormAwareTrait.php
create mode 100644 src/UnicaenValidation/Form/ValidationInstance/ValidationInstanceFormFactory.php
create mode 100644 src/UnicaenValidation/Form/ValidationInstance/ValidationInstanceHydrator.php
create mode 100644 src/UnicaenValidation/Form/ValidationInstance/ValidationInstanceHydratorFactory.php
create mode 100644 src/UnicaenValidation/Form/ValidationType/ValidationTypeForm.php
create mode 100644 src/UnicaenValidation/Form/ValidationType/ValidationTypeFormAwareTrait.php
create mode 100644 src/UnicaenValidation/Form/ValidationType/ValidationTypeFormFactory.php
create mode 100644 src/UnicaenValidation/Form/ValidationType/ValidationTypeHydrator.php
create mode 100644 src/UnicaenValidation/Form/ValidationType/ValidationTypeHydratorFactory.php
create mode 100644 src/UnicaenValidation/Provider/Privilege/ValidationinstancePrivileges.php
create mode 100644 src/UnicaenValidation/Provider/Privilege/ValidationtypePrivileges.php
create mode 100644 src/UnicaenValidation/Service/ValidationInstance/ValidationInstanceService.php
create mode 100644 src/UnicaenValidation/Service/ValidationInstance/ValidationInstanceServiceAwareTrait.php
create mode 100644 src/UnicaenValidation/Service/ValidationInstance/ValidationInstanceServiceFactory.php
create mode 100644 src/UnicaenValidation/Service/ValidationType/ValidationTypeService.php
create mode 100644 src/UnicaenValidation/Service/ValidationType/ValidationTypeServiceAwareTrait.php
create mode 100644 src/UnicaenValidation/Service/ValidationType/ValidationTypeServiceFactory.php
create mode 100644 src/UnicaenValidation/View/Helper/ValidationAfficherViewHelper.php
create mode 100644 src/UnicaenValidation/View/Helper/ValidationBadgeViewHelper.php
create mode 100644 src/UnicaenValidation/View/Helper/ValidationValiderViewHelper.php
create mode 100644 src/UnicaenValidation/View/Helper/ValidationValiderViewHelperFactory.php
create mode 100644 src/UnicaenValidation/View/Helper/partial/validation-afficher.phtml
create mode 100644 src/UnicaenValidation/View/Helper/partial/validation-badge.phtml
create mode 100644 src/UnicaenValidation/View/Helper/partial/validation-valider.phtml
create mode 100644 view/unicaen-validation/default/confirmation.phtml
create mode 100644 view/unicaen-validation/default/default-form.phtml
create mode 100644 view/unicaen-validation/validation-instance/index.phtml
create mode 100644 view/unicaen-validation/validation-instance/validation-modal.phtml
create mode 100644 view/unicaen-validation/validation-type/index.phtml
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..0e61a8f
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,14 @@
+image: registre.unicaen.fr:5000/unicaen-dev-php7.3-apache
+
+stages:
+- publish
+
+cache:
+ key: ${CI_COMMIT_REF_SLUG}
+ paths:
+ - vendor/
+
+update-satis:
+ stage: publish
+ script:
+ - curl https://gest.unicaen.fr/packagist/update
diff --git a/Module.php b/Module.php
new file mode 100644
index 0000000..c2ced8e
--- /dev/null
+++ b/Module.php
@@ -0,0 +1,48 @@
+<?php
+
+
+namespace UnicaenValidation;
+
+//use UnicaenUtilisateur\Event\UserRoleSelectedEventListener;
+use Laminas\Config\Factory as ConfigFactory;
+use Laminas\Mvc\ModuleRouteListener;
+use Laminas\Mvc\MvcEvent;
+use Laminas\Stdlib\ArrayUtils;
+use Laminas\Stdlib\Glob;
+
+class Module
+{
+ public function onBootstrap(MvcEvent $e)
+ {
+ $e->getApplication()->getServiceManager()->get('translator');
+ $eventManager = $e->getApplication()->getEventManager();
+ $moduleRouteListener = new ModuleRouteListener();
+ $moduleRouteListener->attach($eventManager);
+
+ }
+
+ public function getConfig()
+ {
+ $configInit = [
+ __DIR__ . '/config/module.config.php'
+ ];
+ $configFiles = ArrayUtils::merge(
+ $configInit,
+ Glob::glob(__DIR__ . '/config/merged/{,*.}{config}.php', Glob::GLOB_BRACE)
+ );
+
+ return ConfigFactory::fromFiles($configFiles);
+ }
+
+
+ public function getAutoloaderConfig()
+ {
+ return array(
+ 'Laminas\Loader\StandardAutoloader' => array(
+ 'namespaces' => array(
+ __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
+ ),
+ ),
+ );
+ }
+}
diff --git a/composer.json b/composer.json
new file mode 100755
index 0000000..da93126
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,21 @@
+{
+ "name": "unicaen/validation",
+ "description": "Module de gestion de validation (type et instance)",
+ "repositories": [
+ {
+ "type": "composer",
+ "url": "https://gest.unicaen.fr/packagist"
+ }
+ ],
+ "require": {
+ "unicaen/app": "^4.0",
+ "unicaen/privilege": "^4.0",
+ "laminas/laminas-dependency-plugin": "^2.1"
+ },
+ "autoload": {
+ "psr-0": [],
+ "classmap": [
+ "./Module.php"
+ ]
+ }
+}
diff --git a/config/merged/validation-instance.config.php b/config/merged/validation-instance.config.php
new file mode 100644
index 0000000..9779853
--- /dev/null
+++ b/config/merged/validation-instance.config.php
@@ -0,0 +1,169 @@
+<?php
+
+namespace UnicaenValidation;
+
+use UnicaenPrivilege\Guard\PrivilegeController;
+use UnicaenValidation\Controller\ValidationInstanceController;
+use UnicaenValidation\Controller\ValidationInstanceControllerFactory;
+use UnicaenValidation\Form\ValidationInstance\ValidationInstanceForm;
+use UnicaenValidation\Form\ValidationInstance\ValidationInstanceFormFactory;
+use UnicaenValidation\Form\ValidationInstance\ValidationInstanceHydrator;
+use UnicaenValidation\Form\ValidationInstance\ValidationInstanceHydratorFactory;
+use UnicaenValidation\Provider\Privilege\ValidationinstancePrivileges;
+use UnicaenValidation\Service\ValidationInstance\ValidationInstanceService;
+use UnicaenValidation\Service\ValidationInstance\ValidationInstanceServiceFactory;
+use UnicaenValidation\View\Helper\ValidationAfficherViewHelper;
+use UnicaenValidation\View\Helper\ValidationBadgeViewHelper;
+use UnicaenValidation\View\Helper\ValidationValiderViewHelperFactory;
+use Laminas\Router\Http\Literal;
+use Laminas\Router\Http\Segment;
+
+return [
+ 'bjyauthorize' => [
+ 'guards' => [
+ PrivilegeController::class => [
+ [
+ 'controller' => ValidationInstanceController::class,
+ 'action' => [
+ 'index',
+ ],
+ 'privileges' => [
+ ValidationinstancePrivileges::VALIDATIONINSTANCE_AFFICHER,
+ ],
+ ],
+ [
+ 'controller' => ValidationInstanceController::class,
+ 'action' => [
+ 'ajouter',
+ 'modifier',
+ ],
+ 'privileges' => [
+ ValidationinstancePrivileges::VALIDATIONINSTANCE_MODIFIER,
+ ],
+ ],
+ [
+ 'controller' => ValidationInstanceController::class,
+ 'action' => [
+ 'historiser',
+ 'restaurer',
+ ],
+ 'privileges' => [
+ ValidationinstancePrivileges::VALIDATIONINSTANCE_HISTORISER,
+ ],
+ ],
+ [
+ 'controller' => ValidationInstanceController::class,
+ 'action' => [
+ 'detruire',
+ ],
+ 'privileges' => [
+ ValidationinstancePrivileges::VALIDATIONINSTANCE_DETRUIRE,
+ ],
+ ],
+ ],
+ ],
+ ],
+
+ 'router' => [
+ 'routes' => [
+ 'validation' => [
+ 'child_routes' => [
+ 'instance' => [
+ 'type' => Literal::class,
+ 'options' => [
+ 'route' => '/instance',
+ 'defaults' => [
+ 'controller' => ValidationInstanceController::class,
+ 'action' => 'index',
+ ],
+ ],
+ 'may_terminate' => true,
+ 'child_routes' => [
+ 'ajouter' => [
+ 'type' => Literal::class,
+ 'options' => [
+ 'route' => '/ajouter',
+ 'defaults' => [
+ 'controller' => ValidationInstanceController::class,
+ 'action' => 'ajouter',
+ ],
+ ],
+ ],
+ 'modifier' => [
+ 'type' => Segment::class,
+ 'options' => [
+ 'route' => '/modifier/:validation',
+ 'defaults' => [
+ 'controller' => ValidationInstanceController::class,
+ 'action' => 'modifier',
+ ],
+ ],
+ ],
+ 'historiser' => [
+ 'type' => Segment::class,
+ 'options' => [
+ 'route' => '/historiser/:validation',
+ 'defaults' => [
+ 'controller' => ValidationInstanceController::class,
+ 'action' => 'historiser',
+ ],
+ ],
+ ],
+ 'restaurer' => [
+ 'type' => Segment::class,
+ 'options' => [
+ 'route' => '/restaurer/:validation',
+ 'defaults' => [
+ 'controller' => ValidationInstanceController::class,
+ 'action' => 'restaurer',
+ ],
+ ],
+ ],
+ 'detruire' => [
+ 'type' => Segment::class,
+ 'options' => [
+ 'route' => '/detruire/:validation',
+ 'defaults' => [
+ 'controller' => ValidationInstanceController::class,
+ 'action' => 'detruire',
+ ],
+ ],
+ ],
+ ],
+ ],
+ ],
+ ],
+ ],
+ ],
+
+ 'service_manager' => [
+ 'factories' => [
+ ValidationInstanceService::class => ValidationInstanceServiceFactory::class,
+ ],
+ ],
+ 'controllers' => [
+ 'factories' => [
+ ValidationInstanceController::class => ValidationInstanceControllerFactory::class,
+ ],
+ ],
+ 'form_elements' => [
+ 'factories' => [
+ ValidationInstanceForm::class => ValidationInstanceFormFactory::class,
+ ],
+ ],
+ 'hydrators' => [
+ 'factories' => [
+ ValidationInstanceHydrator::class => ValidationInstanceHydratorFactory::class,
+ ],
+ ],
+ 'view_helpers' => [
+ 'invokables' => [
+ 'validationAfficher' => ValidationAfficherViewHelper::class,
+ 'validationBadge' => ValidationBadgeViewHelper::class,
+ ],
+ 'factories' => [
+ 'validationValider' => ValidationValiderViewHelperFactory::class,
+ ]
+ ]
+
+];
\ No newline at end of file
diff --git a/config/merged/validation-type.config.php b/config/merged/validation-type.config.php
new file mode 100644
index 0000000..ba76fe8
--- /dev/null
+++ b/config/merged/validation-type.config.php
@@ -0,0 +1,127 @@
+<?php
+
+namespace UnicaenValidation;
+
+use UnicaenPrivilege\Guard\PrivilegeController;
+use UnicaenValidation\Controller\ValidationTypeController;
+use UnicaenValidation\Controller\ValidationTypeControllerFactory;
+use UnicaenValidation\Form\ValidationType\ValidationTypeForm;
+use UnicaenValidation\Form\ValidationType\ValidationTypeFormFactory;
+use UnicaenValidation\Form\ValidationType\ValidationTypeHydrator;
+use UnicaenValidation\Form\ValidationType\ValidationTypeHydratorFactory;
+use UnicaenValidation\Provider\Privilege\ValidationtypePrivileges;
+use UnicaenValidation\Service\ValidationType\ValidationTypeService;
+use UnicaenValidation\Service\ValidationType\ValidationTypeServiceFactory;
+use Laminas\Router\Http\Literal;
+use Laminas\Router\Http\Segment;
+
+return [
+ 'bjyauthorize' => [
+ 'guards' => [
+ PrivilegeController::class => [
+ [
+ 'controller' => ValidationTypeController::class,
+ 'action' => [
+ 'index',
+ ],
+ 'privileges' => [
+ ValidationtypePrivileges::VALIDATIONTYPE_AFFICHER,
+ ],
+ ],
+ [
+ 'controller' => ValidationTypeController::class,
+ 'action' => [
+ 'ajouter',
+ 'modifier',
+ ],
+ 'privileges' => [
+ ValidationtypePrivileges::VALIDATIONTYPE_MODIFIER,
+ ],
+ ],
+ [
+ 'controller' => ValidationTypeController::class,
+ 'action' => [
+ 'detruire',
+ ],
+ 'privileges' => [
+ ValidationtypePrivileges::VALIDATIONTYPE_DETRUIRE,
+ ],
+ ],
+ ],
+ ],
+ ],
+
+ 'router' => [
+ 'routes' => [
+ 'validation' => [
+ 'child_routes' => [
+ 'type' => [
+ 'type' => Literal::class,
+ 'options' => [
+ 'route' => '/type',
+ 'defaults' => [
+ 'controller' => ValidationTypeController::class,
+ 'action' => 'index',
+ ],
+ ],
+ 'may_terminate' => true,
+ 'child_routes' => [
+ 'ajouter' => [
+ 'type' => Literal::class,
+ 'options' => [
+ 'route' => '/ajouter',
+ 'defaults' => [
+ 'controller' => ValidationTypeController::class,
+ 'action' => 'ajouter',
+ ],
+ ],
+ ],
+ 'modifier' => [
+ 'type' => Segment::class,
+ 'options' => [
+ 'route' => '/modifier/:type',
+ 'defaults' => [
+ 'controller' => ValidationTypeController::class,
+ 'action' => 'modifier',
+ ],
+ ],
+ ],
+ 'detruire' => [
+ 'type' => Segment::class,
+ 'options' => [
+ 'route' => '/detruire/:type',
+ 'defaults' => [
+ 'controller' => ValidationTypeController::class,
+ 'action' => 'detruire',
+ ],
+ ],
+ ],
+ ],
+ ],
+ ],
+ ],
+ ],
+ ],
+
+ 'service_manager' => [
+ 'factories' => [
+ ValidationTypeService::class => ValidationTypeServiceFactory::class,
+ ],
+ ],
+ 'controllers' => [
+ 'factories' => [
+ ValidationTypeController::class => ValidationTypeControllerFactory::class,
+ ],
+ ],
+ 'form_elements' => [
+ 'factories' => [
+ ValidationTypeForm::class => ValidationTypeFormFactory::class,
+ ],
+ ],
+ 'hydrators' => [
+ 'factories' => [
+ ValidationTypeHydrator::class => ValidationTypeHydratorFactory::class,
+ ],
+ ]
+
+];
\ No newline at end of file
diff --git a/config/module.config.php b/config/module.config.php
new file mode 100644
index 0000000..07ce8e1
--- /dev/null
+++ b/config/module.config.php
@@ -0,0 +1,92 @@
+<?php
+
+use Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain;
+use Doctrine\ORM\Mapping\Driver\XmlDriver;
+use Laminas\Router\Http\Literal;
+use UnicaenPrivilege\Guard\PrivilegeController;
+use UnicaenValidation\Controller\ValidationInstanceController;
+use UnicaenValidation\Controller\ValidationTypeController;
+
+return [
+ 'doctrine' => [
+ 'driver' => [
+ 'orm_default' => [
+ 'class' => MappingDriverChain::class,
+ 'drivers' => [
+ 'UnicaenValidation\Entity\Db' => 'orm_default_xml_driver',
+ ],
+ ],
+ 'orm_default_xml_driver' => [
+ 'class' => XmlDriver::class,
+ 'cache' => 'apc',
+ 'paths' => [
+ __DIR__ . '/../src/UnicaenValidation/Entity/Db/Mapping',
+ ],
+ ],
+ ],
+ 'cache' => [
+ 'apc' => [
+ 'namespace' => 'UNICAEN-VALIDATION__' . __NAMESPACE__,
+ ],
+ ],
+ ],
+
+ 'router' => [
+ 'routes' => [
+ 'validation' => [
+ 'type' => Literal::class,
+ 'options' => [
+ 'route' => '/validation',
+ ],
+ 'may_terminate' => false,
+ ],
+ ],
+ ],
+
+ 'navigation' => [
+ 'default' => [
+ 'home' => [
+ 'pages' => [
+ 'administration' => [
+ 'pages' => [
+ 'validations' => [
+ 'label' => 'Validations',
+ 'route' => 'validation/type',
+ 'resource' => PrivilegeController::getResourceId(ValidationTypeController::class, 'index'),
+ 'order' => 1111,
+ 'pages' => [
+ 'instance' => [
+ 'label' => 'Instances de validation',
+ 'route' => 'validation/instance',
+ 'resource' => PrivilegeController::getResourceId(ValidationInstanceController::class, 'index'),
+ 'order' => 1112,
+ ],
+ ],
+ ],
+ ],
+ ],
+ ],
+ ],
+ ],
+ ],
+
+ 'service_manager' => [
+ 'invokables' => [
+ ],
+ 'factories' => [
+ ],
+ ],
+
+ 'view_manager' => [
+ 'template_path_stack' => [
+ __DIR__ . '/../view',
+ ],
+ ],
+
+ 'view_helpers' => [
+ 'aliases' => [
+ ],
+ 'factories' => [
+ ],
+ ],
+];
diff --git a/documentation/001_table.sql b/documentation/001_table.sql
new file mode 100644
index 0000000..4d266a9
--- /dev/null
+++ b/documentation/001_table.sql
@@ -0,0 +1,38 @@
+create table unicaen_validation_type
+(
+ id serial
+ constraint unicaen_validation_type_pk
+ primary key,
+ code varchar(256) not null,
+ libelle varchar(1024) not null,
+ refusable boolean default true not null
+);
+create unique index unicaen_validation_type_id_uindex
+ on unicaen_validation_type (id);
+
+create table unicaen_validation_instance
+(
+ id serial
+ constraint unicaen_validation_instance_pk
+ primary key,
+ type_id integer not null
+ constraint unicaen_validation_instance_unicaen_validation_type_id_fk
+ references unicaen_validation_type
+ on delete cascade,
+ valeur text,
+ histo_creation timestamp not null,
+ histo_createur_id integer not null
+ constraint unicaen_validation_instance_createur_fk
+ references unicaen_utilisateur_user,
+ histo_modification timestamp not null,
+ histo_modificateur_id integer not null
+ constraint unicaen_validation_instance_modificateur_fk
+ references unicaen_utilisateur_user,
+ histo_destruction timestamp,
+ histo_destructeur_id integer
+ constraint unicaen_validation_instance_destructeur_fk
+ references unicaen_utilisateur_user
+);
+create unique index unicaen_validation_instance_id_uindex
+ on unicaen_validation_instance (id);
+
diff --git a/documentation/101_privilege.sql b/documentation/101_privilege.sql
new file mode 100644
index 0000000..dcfb55c
--- /dev/null
+++ b/documentation/101_privilege.sql
@@ -0,0 +1,29 @@
+INSERT INTO unicaen_privilege_categorie (code, libelle, ordre, namespace)
+VALUES ('validation_type', 'Gestion des types de validation', 10000, 'UnicaenValidation\Provider\Privilege');
+
+INSERT INTO unicaen_privilege_privilege(CATEGORIE_ID, CODE, LIBELLE, ORDRE)
+WITH d(code, lib, ordre) AS (
+ SELECT 'validationtype_afficher', 'Affichage des types de validations', 10 UNION
+ SELECT 'validationtype_modifier', 'Modifier un type de validation', 20 UNION
+ SELECT 'validationtype_detruire', 'Détruire un type de validation', 30
+)
+SELECT cp.id, d.code, d.lib, d.ordre
+FROM d
+JOIN unicaen_privilege_categorie cp ON cp.CODE = 'validation_type'
+;
+
+INSERT INTO unicaen_privilege_categorie (code, libelle, ordre, namespace)
+VALUES ('validation_instance', 'Gestion des instances de validation', 10000, 'UnicaenValidation\Provider\Privilege');
+
+INSERT INTO unicaen_privilege_privilege(CATEGORIE_ID, CODE, LIBELLE, ORDRE)
+WITH d(code, lib, ordre) AS (
+ SELECT 'validationinstance_afficher', 'Affichage des instances de validations', 10 UNION
+ SELECT 'validationinstance_modifier', 'Modifier une instance de validation', 30 UNION
+ SELECT 'validationinstance_historiser', 'Historiser/restaurer une instance de validation', 40 UNION
+ SELECT 'validationinstance_detruire', 'Détruire une isntance de validation', 50
+
+)
+SELECT cp.id, d.code, d.lib, d.ordre
+FROM d
+ JOIN unicaen_privilege_categorie cp ON cp.CODE = 'validation_instance'
+;
\ No newline at end of file
diff --git a/src/UnicaenValidation/Controller/ValidationInstanceController.php b/src/UnicaenValidation/Controller/ValidationInstanceController.php
new file mode 100644
index 0000000..f158174
--- /dev/null
+++ b/src/UnicaenValidation/Controller/ValidationInstanceController.php
@@ -0,0 +1,123 @@
+<?php
+
+namespace UnicaenValidation\Controller;
+
+use Laminas\Http\Response;
+use UnicaenValidation\Entity\Db\ValidationInstance;
+use UnicaenValidation\Form\ValidationInstance\ValidationInstanceFormAwareTrait;
+use UnicaenValidation\Service\ValidationInstance\ValidationInstanceServiceAwareTrait;
+use UnicaenValidation\Service\ValidationType\ValidationTypeServiceAwareTrait;
+use Laminas\Http\Request;
+use Laminas\Mvc\Controller\AbstractActionController;
+use Laminas\View\Model\ViewModel;
+
+class ValidationInstanceController extends AbstractActionController {
+ use ValidationInstanceServiceAwareTrait;
+ use ValidationTypeServiceAwareTrait;
+ use ValidationInstanceFormAwareTrait;
+
+ public function indexAction() : ViewModel
+ {
+ $instances = $this->getValidationInstanceService()->getValidationsInstances();
+
+ return new ViewModel([
+ 'instances' => $instances,
+ ]);
+ }
+
+ public function ajouterAction() : ViewModel
+ {
+ $instance = new ValidationInstance();
+ $form = $this->getValidationInstancForm();
+ $form->setAttribute('action', $this->url()->fromRoute('validation/instance/ajouter', [], [], true));
+ $form->bind($instance);
+
+ /** @var Request $request */
+ $request = $this->getRequest();
+ if ($request->isPost()) {
+ $data = $request->getPost();
+ $form->setData($data);
+ if ($form->isValid()) {
+ $this->getValidationInstanceService()->create($instance);
+ }
+ }
+
+ $vm = new ViewModel();
+ $vm->setTemplate('unicaen-validation/default/default-form');
+ $vm->setVariables([
+ 'title' => "Ajout d'un type de validation",
+ 'form' => $form,
+ ]);
+ return $vm;
+ }
+
+ public function modifierAction() : ViewModel
+ {
+ $instance = $this->getValidationInstanceService()->getRequestedValidationInstance($this);
+ $form = $this->getValidationInstancForm();
+ $form->setAttribute('action', $this->url()->fromRoute('validation/instance/modifier', ['validation' => $instance->getId()], [], true));
+ $form->bind($instance);
+
+ /** @var Request $request */
+ $request = $this->getRequest();
+ if ($request->isPost()) {
+ $data = $request->getPost();
+ $form->setData($data);
+ if ($form->isValid()) {
+ $this->getValidationInstanceService()->update($instance);
+ }
+ }
+
+ $vm = new ViewModel();
+ $vm->setTemplate('unicaen-validation/default/default-form');
+ $vm->setVariables([
+ 'title' => "Modification d'un type de validation",
+ 'form' => $form,
+ ]);
+ return $vm;
+ }
+
+ public function historiserAction() : Response
+ {
+ $instance = $this->getValidationInstanceService()->getRequestedValidationInstance($this);
+ $this->getValidationInstanceService()->historise($instance);
+
+ $retour = $this->params()->fromQuery('retour');
+ if ($retour) return $this->redirect()->toUrl($retour);
+ return $this->redirect()->toRoute('validation/instance');
+ }
+
+ public function restaurerAction() : Response
+ {
+ $instance = $this->getValidationInstanceService()->getRequestedValidationInstance($this);
+ $this->getValidationInstanceService()->restore($instance);
+
+ $retour = $this->params()->fromQuery('retour');
+ if ($retour) return $this->redirect()->toUrl($retour);
+ return $this->redirect()->toRoute('validation/instance');
+ }
+
+ public function detruireAction() : ViewModel
+ {
+ $instance = $this->getValidationInstanceService()->getRequestedValidationInstance($this);
+
+ /** @var Request $request */
+ $request = $this->getRequest();
+ if ($request->isPost()) {
+ $data = $request->getPost();
+ if ($data["reponse"] === "oui") $this->getValidationInstanceService()->delete($instance);
+ exit();
+ }
+
+ $vm = new ViewModel();
+ if ($instance !== null) {
+ $vm->setTemplate('unicaen-validation/default/confirmation');
+ $vm->setVariables([
+ 'title' => "Suppression de la validation ",
+ 'text' => "La suppression est définitive êtes-vous sûr·e de vouloir continuer ?",
+ 'action' => $this->url()->fromRoute('validation/instance/detruire', ["validation" => $instance->getId()], [], true),
+ ]);
+ }
+ return $vm;
+ }
+}
diff --git a/src/UnicaenValidation/Controller/ValidationInstanceControllerFactory.php b/src/UnicaenValidation/Controller/ValidationInstanceControllerFactory.php
new file mode 100644
index 0000000..031bf57
--- /dev/null
+++ b/src/UnicaenValidation/Controller/ValidationInstanceControllerFactory.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace UnicaenValidation\Controller;
+
+use Interop\Container\ContainerInterface;
+use Psr\Container\ContainerExceptionInterface;
+use Psr\Container\NotFoundExceptionInterface;
+use UnicaenValidation\Form\ValidationInstance\ValidationInstanceForm;
+use UnicaenValidation\Service\ValidationInstance\ValidationInstanceService;
+use UnicaenValidation\Service\ValidationType\ValidationTypeService;
+
+class ValidationInstanceControllerFactory {
+
+ /**
+ * @param ContainerInterface $container
+ * @return ValidationInstanceController
+ * @throws ContainerExceptionInterface
+ * @throws NotFoundExceptionInterface
+ */
+ public function __invoke(ContainerInterface $container) : ValidationInstanceController
+ {
+ /**
+ * @var ValidationInstanceService $validationInstanceService
+ * @var ValidationTypeService $validationTypeService
+ */
+ $validationInstanceService = $container->get(ValidationInstanceService::class);
+ $validationTypeService = $container->get(ValidationTypeService::class);
+
+ /**
+ * @var ValidationInstanceForm $validationInstanceForm
+ */
+ $validationInstanceForm = $container->get('FormElementManager')->get(ValidationInstanceForm::class);
+
+ $controller = new ValidationInstanceController();
+ $controller->setValidationInstanceService($validationInstanceService);
+ $controller->setValidationInstancForm($validationInstanceForm);
+ $controller->setValidationTypeService($validationTypeService);
+ return $controller;
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Controller/ValidationTypeController.php b/src/UnicaenValidation/Controller/ValidationTypeController.php
new file mode 100644
index 0000000..e54c481
--- /dev/null
+++ b/src/UnicaenValidation/Controller/ValidationTypeController.php
@@ -0,0 +1,105 @@
+<?php
+
+namespace UnicaenValidation\Controller;
+
+use UnicaenValidation\Entity\Db\ValidationType;
+use UnicaenValidation\Form\ValidationType\ValidationTypeFormAwareTrait;
+use UnicaenValidation\Service\ValidationType\ValidationTypeServiceAwareTrait;
+use Laminas\Http\Request;
+use Laminas\Mvc\Controller\AbstractActionController;
+use Laminas\View\Model\ViewModel;
+
+class ValidationTypeController extends AbstractActionController
+{
+ use ValidationTypeServiceAwareTrait;
+ use ValidationTypeFormAwareTrait;
+
+ public function indexAction() : ViewModel
+ {
+ $types = $this->getValidationTypeService()->getValidationsTypes();
+
+ return new ViewModel([
+ 'types' => $types,
+ ]);
+ }
+
+ public function ajouterAction() : ViewModel
+ {
+ $type = new ValidationType();
+ $form = $this->getValidationTypeForm();
+ $form->setAttribute('action', $this->url()->fromRoute('validation/type/ajouter', [], [], true));
+ $form->bind($type);
+
+ /** @var Request $request */
+ $request = $this->getRequest();
+ if ($request->isPost()) {
+ $data = $request->getPost();
+ $form->setData($data);
+ if ($form->isValid()) {
+ $this->getValidationTypeService()->create($type);
+ }
+ }
+
+ $vm = new ViewModel();
+ $vm->setTemplate('unicaen-validation/default/default-form');
+ $vm->setVariables([
+ 'title' => "Ajout d'un type de validation",
+ 'form' => $form,
+ ]);
+ return $vm;
+ }
+
+ public function modifierAction() : ViewModel
+ {
+ $type = $this->getValidationTypeService()->getRequestedValidationType($this);
+ $form = $this->getValidationTypeForm();
+ $form->setAttribute('action', $this->url()->fromRoute('validation/type/modifier', ['type' => $type->getId()], [], true));
+ $form->bind($type);
+ $form->get('old-code')->setValue($type->getCode());
+
+
+ /** @var Request $request */
+ $request = $this->getRequest();
+ if ($request->isPost()) {
+ $data = $request->getPost();
+ $form->setData($data);
+ $oldcode = $type->getCode();
+ if ($form->isValid()) {
+ $this->getValidationTypeService()->update($type);
+ }
+ }
+
+ $vm = new ViewModel();
+ $vm->setTemplate('unicaen-validation/default/default-form');
+ $vm->setVariables([
+ 'title' => "Modification d'un type de validation",
+ 'form' => $form,
+ ]);
+ return $vm;
+ }
+
+ public function detruireAction() : ViewModel
+ {
+ $type = $this->getValidationTypeService()->getRequestedValidationType($this);
+
+ /** @var Request $request */
+ $request = $this->getRequest();
+ if ($request->isPost()) {
+ $data = $request->getPost();
+ if ($data["reponse"] === "oui") $this->getValidationTypeService()->delete($type);
+ exit();
+ }
+
+ $vm = new ViewModel();
+ if ($type !== null) {
+ $vm->setTemplate('unicaen-validation/default/confirmation');
+ $vm->setVariables([
+ 'title' => "Suppression du type de validation " . $type->getLibelle(),
+ 'text' => "La suppression est définitive êtes-vous sûr·e de vouloir continuer ?",
+ 'action' => $this->url()->fromRoute('validation/type/detruire', ["type" => $type->getId()], [], true),
+ ]);
+ }
+ return $vm;
+ }
+
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Controller/ValidationTypeControllerFactory.php b/src/UnicaenValidation/Controller/ValidationTypeControllerFactory.php
new file mode 100644
index 0000000..bfa0592
--- /dev/null
+++ b/src/UnicaenValidation/Controller/ValidationTypeControllerFactory.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace UnicaenValidation\Controller;
+
+use Psr\Container\ContainerExceptionInterface;
+use Psr\Container\ContainerInterface;
+use Psr\Container\NotFoundExceptionInterface;
+use UnicaenValidation\Form\ValidationType\ValidationTypeForm;
+use UnicaenValidation\Service\ValidationType\ValidationTypeService;
+
+class ValidationTypeControllerFactory {
+
+ /**
+ * @param ContainerInterface $container
+ * @return ValidationTypeController
+ * @throws ContainerExceptionInterface
+ * @throws NotFoundExceptionInterface
+ */
+ public function __invoke(ContainerInterface $container) : ValidationTypeController
+ {
+ /**
+ * @var ValidationTypeService $validationTypeService
+ */
+ $validationTypeService = $container->get(ValidationTypeService::class);
+
+ /**
+ * @var ValidationTypeForm $validationTypeForm
+ */
+ $validationTypeForm = $container->get('FormElementManager')->get(ValidationTypeForm::class);
+
+ $controller = new ValidationTypeController();
+ $controller->setValidationTypeService($validationTypeService);
+ $controller->setValidationTypeForm($validationTypeForm);
+ return $controller;
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Entity/Db/Mapping/UnicaenValidation.Entity.Db.ValidationInstance.dcm.xml b/src/UnicaenValidation/Entity/Db/Mapping/UnicaenValidation.Entity.Db.ValidationInstance.dcm.xml
new file mode 100644
index 0000000..fb2b132
--- /dev/null
+++ b/src/UnicaenValidation/Entity/Db/Mapping/UnicaenValidation.Entity.Db.ValidationInstance.dcm.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
+ <entity name="UnicaenValidation\Entity\Db\ValidationInstance" table="unicaen_validation_instance">
+
+ <id name="id" type="integer" column="id">
+ <generator strategy="IDENTITY"/>
+ </id>
+
+ <many-to-one target-entity="UnicaenValidation\Entity\Db\ValidationType" field="type">
+ <join-column name="type_id" referenced-column-name="id"/>
+ </many-to-one>
+
+ <field name="valeur" type="string" column="valeur" nullable="true"/>
+
+ <field name="histoCreation" type="datetime" column="histo_creation" nullable="false"/>
+ <field name="histoModification" type="datetime" column="histo_modification" nullable="false"/>
+ <field name="histoDestruction" type="datetime" column="histo_destruction" nullable="true"/>
+ <many-to-one target-entity="UnicaenUtilisateur\Entity\Db\User" field="histoCreateur">
+ <join-column name="histo_createur_id" referenced-column-name="ID"/>
+ </many-to-one>
+ <many-to-one target-entity="UnicaenUtilisateur\Entity\Db\User" field="histoModificateur">
+ <join-column name="histo_modificateur_id" referenced-column-name="ID"/>
+ </many-to-one>
+ <many-to-one target-entity="UnicaenUtilisateur\Entity\Db\User" field="histoDestructeur">
+ <join-column name="histo_destructeur_id" referenced-column-name="ID"/>
+ </many-to-one>
+
+ </entity>
+</doctrine-mapping>
diff --git a/src/UnicaenValidation/Entity/Db/Mapping/UnicaenValidation.Entity.Db.ValidationType.dcm.xml b/src/UnicaenValidation/Entity/Db/Mapping/UnicaenValidation.Entity.Db.ValidationType.dcm.xml
new file mode 100644
index 0000000..d0c6712
--- /dev/null
+++ b/src/UnicaenValidation/Entity/Db/Mapping/UnicaenValidation.Entity.Db.ValidationType.dcm.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
+ <entity name="UnicaenValidation\Entity\Db\ValidationType" table="unicaen_validation_type">
+
+ <id name="id" type="integer" column="id">
+ <generator strategy="IDENTITY"/>
+ </id>
+
+ <field name="code" type="string" length="256" column="code" nullable="false"/>
+ <field name="libelle" type="string" length="1024" column="libelle" nullable="false"/>
+ <field name="refusable" type="boolean" column="refusable" nullable="false"/>
+ </entity>
+</doctrine-mapping>
diff --git a/src/UnicaenValidation/Entity/Db/ValidationInstance.php b/src/UnicaenValidation/Entity/Db/ValidationInstance.php
new file mode 100644
index 0000000..e03ea4e
--- /dev/null
+++ b/src/UnicaenValidation/Entity/Db/ValidationInstance.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace UnicaenValidation\Entity\Db;
+
+use UnicaenUtilisateur\Entity\HistoriqueAwareInterface;
+use UnicaenUtilisateur\Entity\HistoriqueAwareTrait;
+
+class ValidationInstance implements HistoriqueAwareInterface {
+ use HistoriqueAwareTrait;
+
+ private int $id;
+ private ?ValidationType $type = null;
+ private ?string $valeur = null;
+
+ /**
+ * @return int
+ */
+ public function getId() : int
+ {
+ return $this->id;
+ }
+
+ /**
+ * @return ValidationType|null
+ */
+ public function getType() : ?ValidationType
+ {
+ return $this->type;
+ }
+
+ /**
+ * @param ValidationType $type
+ * @return ValidationInstance
+ */
+ public function setType(ValidationType $type) : ValidationInstance
+ {
+ $this->type = $type;
+ return $this;
+ }
+
+ /**
+ * @return string|null
+ */
+ public function getValeur() : ?string
+ {
+ return $this->valeur;
+ }
+
+ /**
+ * @param string|null $valeur
+ * @return ValidationInstance
+ */
+ public function setValeur(?string $valeur) : ValidationInstance
+ {
+ $this->valeur = $valeur;
+ return $this;
+ }
+
+ public function generateTooltipText() : string
+ {
+ $text = "Validation effectuée<br/>";
+ $text .= "par <span class='user'>".$this->histoModificateur->getDisplayName()."</span><br/>";
+ $text .= "le <span class='date'>".$this->getHistoModification()->format('d/m/Y')."</span>";
+ return $text;
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Entity/Db/ValidationType.php b/src/UnicaenValidation/Entity/Db/ValidationType.php
new file mode 100644
index 0000000..b4d9379
--- /dev/null
+++ b/src/UnicaenValidation/Entity/Db/ValidationType.php
@@ -0,0 +1,73 @@
+<?php
+
+namespace UnicaenValidation\Entity\Db;
+
+class ValidationType {
+
+ private int $id;
+ private ?string $code = null;
+ private ?string $libelle = null;
+ private ?bool $refusable = null;
+
+ /**
+ * @return int
+ */
+ public function getId() : int
+ {
+ return $this->id;
+ }
+
+ /**
+ * @return string|null
+ */
+ public function getCode() : ?string
+ {
+ return $this->code;
+ }
+
+ /**
+ * @param string $code
+ * @return ValidationType
+ */
+ public function setCode(string $code) : ValidationType
+ {
+ $this->code = $code;
+ return $this;
+ }
+
+ /**
+ * @return string|null
+ */
+ public function getLibelle() : ?string
+ {
+ return $this->libelle;
+ }
+
+ /**
+ * @param string $libelle
+ * @return ValidationType
+ */
+ public function setLibelle(string $libelle) : ValidationType
+ {
+ $this->libelle = $libelle;
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isRefusable() : bool
+ {
+ return $this->refusable??false;
+ }
+
+ /**
+ * @param bool $refusable
+ * @return ValidationType
+ */
+ public function setRefusable(bool $refusable) : ValidationType
+ {
+ $this->refusable = $refusable;
+ return $this;
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Entity/HasValidationsInterface.php b/src/UnicaenValidation/Entity/HasValidationsInterface.php
new file mode 100644
index 0000000..59ff8f9
--- /dev/null
+++ b/src/UnicaenValidation/Entity/HasValidationsInterface.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace UnicaenValidation\Entity;
+
+use UnicaenValidation\Entity\Db\ValidationInstance;
+
+interface HasValidationsInterface {
+
+ public function getValidations() : array;
+ public function addValidation(ValidationInstance $validation) : void;
+ public function removeValidation(ValidationInstance $validation) : void;
+ public function getValidationsByTypeCode(string $typeCode) : array ;
+ public function getValidationActiveByTypeCode(string $typeCode) : ?ValidationInstance;
+
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Entity/HasValidationsTrait.php b/src/UnicaenValidation/Entity/HasValidationsTrait.php
new file mode 100644
index 0000000..9c7f681
--- /dev/null
+++ b/src/UnicaenValidation/Entity/HasValidationsTrait.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace UnicaenValidation\Entity;
+
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+use UnicaenValidation\Entity\Db\ValidationInstance;
+
+trait HasValidationsTrait {
+
+ private Collection $validations;
+
+ /**
+ * @return ValidationInstance[]
+ */
+ public function getValidations() : array
+ {
+ return $this->validations->toArray();
+ }
+
+ /**
+ * @param ValidationInstance $validation
+ * @return void
+ */
+ public function addValidation(ValidationInstance $validation) : void
+ {
+ $this->validations->add($validation);
+ }
+
+ /**
+ * @param ValidationInstance $validation
+ * @return void
+ */
+ public function removeValidation(ValidationInstance $validation) : void
+ {
+ $this->validations->removeElement($validation);
+ }
+
+ /**
+ * @param string $typeCode
+ * @return array
+ */
+ public function getValidationsByTypeCode(string $typeCode) : array
+ {
+ $result = [];
+ /** @var ValidationInstance $validation */
+ foreach ($this->validations as $validation) {
+ if ($validation->getType()->getCode() === $typeCode AND $validation->estNonHistorise()) $result[] = $validation;
+ }
+ return $result;
+ }
+ /**
+ * @param string $typeCode
+ * @return ValidationInstance|null
+ */
+ public function getValidationActiveByTypeCode(string $typeCode) : ?ValidationInstance
+ {
+ /** @var ValidationInstance $validation */
+ foreach ($this->validations as $validation) {
+ if ($validation->getType()->getCode() === $typeCode AND $validation->estNonHistorise()) return $validation;
+ }
+ return null;
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Form/ValidationInstance/ValidationInstanceForm.php b/src/UnicaenValidation/Form/ValidationInstance/ValidationInstanceForm.php
new file mode 100644
index 0000000..a1138f4
--- /dev/null
+++ b/src/UnicaenValidation/Form/ValidationInstance/ValidationInstanceForm.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace UnicaenValidation\Form\ValidationInstance;
+
+use UnicaenValidation\Service\ValidationType\ValidationTypeServiceAwareTrait;
+use Laminas\Form\Element\Button;
+use Laminas\Form\Element\Select;
+use Laminas\Form\Element\Text;
+use Laminas\Form\Form;
+use Laminas\InputFilter\Factory;
+
+class ValidationInstanceForm extends Form {
+ use ValidationTypeServiceAwareTrait;
+
+ public function init() {
+
+ //type
+ $this->add([
+ 'type' => Select::class,
+ 'name' => 'type',
+ 'options' => [
+ 'label' => "Type de validation* :",
+ 'empty_option' => "Choisir un type de validation",
+ 'value_options' => $this->getValidationTypeService()->getValidationsTypesAsOptions(),
+ ],
+ 'attributes' => [
+ 'id' => 'type',
+ 'class' => 'bootstrap-selectpicker show-tick',
+ 'data-live-search' => 'true',
+ ],
+ ]);
+ //valeur
+ $this->add([
+ 'name' => 'valeur',
+ 'type' => Text::class,
+ 'options' => [
+ 'label' => 'Refus (laisser vide si acceptation) : ',
+ 'label_attributes' => [
+ 'class' => 'control-label',
+ ],
+ ],
+ 'attributes' => [
+ 'id' => 'valeur',
+ ]
+ ]);
+ //submit
+ $this->add([
+ 'type' => Button::class,
+ 'name' => 'creer',
+ 'options' => [
+ 'label' => '<i class="fas fa-save"></i> Enregistrer' ,
+ 'label_options' => [
+ 'disable_html_escape' => true,
+ ],
+ ],
+ 'attributes' => [
+ 'type' => 'submit',
+ 'class' => 'btn btn-primary',
+ ],
+ ]);
+
+ //inputfilter
+ $this->setInputFilter((new Factory())->createInputFilter([
+ 'type' => [ 'required' => true, ],
+ 'valeur' => [ 'required' => false, ],
+ ]));
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Form/ValidationInstance/ValidationInstanceFormAwareTrait.php b/src/UnicaenValidation/Form/ValidationInstance/ValidationInstanceFormAwareTrait.php
new file mode 100644
index 0000000..e5d81b5
--- /dev/null
+++ b/src/UnicaenValidation/Form/ValidationInstance/ValidationInstanceFormAwareTrait.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace UnicaenValidation\Form\ValidationInstance;
+
+trait ValidationInstanceFormAwareTrait {
+
+ private ValidationInstanceForm $validationInstancForm;
+
+ /**
+ * @return ValidationInstanceForm
+ */
+ public function getValidationInstancForm() : ValidationInstanceForm
+ {
+ return $this->validationInstancForm;
+ }
+
+ /**
+ * @param ValidationInstanceForm $validationInstancForm
+ */
+ public function setValidationInstancForm(ValidationInstanceForm $validationInstancForm) : void
+ {
+ $this->validationInstancForm = $validationInstancForm;
+ }
+
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Form/ValidationInstance/ValidationInstanceFormFactory.php b/src/UnicaenValidation/Form/ValidationInstance/ValidationInstanceFormFactory.php
new file mode 100644
index 0000000..90025cc
--- /dev/null
+++ b/src/UnicaenValidation/Form/ValidationInstance/ValidationInstanceFormFactory.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace UnicaenValidation\Form\ValidationInstance;
+
+use Interop\Container\ContainerInterface;
+use Psr\Container\ContainerExceptionInterface;
+use Psr\Container\NotFoundExceptionInterface;
+use UnicaenValidation\Service\ValidationType\ValidationTypeService;
+
+class ValidationInstanceFormFactory {
+
+ /**
+ * @param ContainerInterface $container
+ * @return ValidationInstanceForm
+ * @throws ContainerExceptionInterface
+ * @throws NotFoundExceptionInterface
+ */
+ public function __invoke(ContainerInterface $container) : ValidationInstanceForm
+ {
+ /**
+ * @var ValidationTypeService $validationTypeService
+ */
+ $validationTypeService = $container->get(ValidationTypeService::class);
+
+ /** @var ValidationInstanceHydrator $hydrator */
+ $hydrator = $container->get('HydratorManager')->get(ValidationInstanceHydrator::class);
+
+ $form = new ValidationInstanceForm();
+ $form->setValidationTypeService($validationTypeService);
+ $form->setHydrator($hydrator);
+ return $form;
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Form/ValidationInstance/ValidationInstanceHydrator.php b/src/UnicaenValidation/Form/ValidationInstance/ValidationInstanceHydrator.php
new file mode 100644
index 0000000..a901991
--- /dev/null
+++ b/src/UnicaenValidation/Form/ValidationInstance/ValidationInstanceHydrator.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace UnicaenValidation\Form\ValidationInstance;
+
+use UnicaenValidation\Entity\Db\ValidationInstance;
+use UnicaenValidation\Service\ValidationType\ValidationTypeServiceAwareTrait;
+use Laminas\Hydrator\HydratorInterface;
+
+class ValidationInstanceHydrator implements HydratorInterface {
+ use ValidationTypeServiceAwareTrait;
+
+ /**
+ * @param ValidationInstance $object
+ * @return array
+ */
+ public function extract(object $object) : array
+ {
+ $data = [
+ 'type' => ($object AND $object->getType())?$object->getType()->getId():null,
+ 'valeur' => $object?$object->getValeur():null,
+ ];
+ return $data;
+ }
+
+ /**
+ * @param array $data
+ * @param ValidationInstance $object
+ * @return ValidationInstance
+ */
+ public function hydrate(array $data, object $object)
+ {
+ $type = $this->getValidationTypeService()->getValidationType($data['type']);
+ $object->setType($type);
+ $object->setValeur($data['valeur'] ?? null);
+ return $object;
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Form/ValidationInstance/ValidationInstanceHydratorFactory.php b/src/UnicaenValidation/Form/ValidationInstance/ValidationInstanceHydratorFactory.php
new file mode 100644
index 0000000..4f3adc2
--- /dev/null
+++ b/src/UnicaenValidation/Form/ValidationInstance/ValidationInstanceHydratorFactory.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace UnicaenValidation\Form\ValidationInstance;
+
+use Interop\Container\ContainerInterface;
+use UnicaenValidation\Service\ValidationType\ValidationTypeService;
+
+class ValidationInstanceHydratorFactory {
+
+ /**
+ * @param ContainerInterface $container
+ * @return ValidationInstanceHydrator
+ * @throws \Psr\Container\ContainerExceptionInterface
+ * @throws \Psr\Container\NotFoundExceptionInterface
+ */
+ public function __invoke(ContainerInterface $container) : ValidationInstanceHydrator
+ {
+ /**
+ * @var ValidationTypeService $validationTypeService
+ */
+ $validationTypeService = $container->get(ValidationTypeService::class);
+
+ $hydrator = new ValidationInstanceHydrator();
+ $hydrator->setValidationTypeService($validationTypeService);
+ return $hydrator;
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Form/ValidationType/ValidationTypeForm.php b/src/UnicaenValidation/Form/ValidationType/ValidationTypeForm.php
new file mode 100644
index 0000000..64c3ea0
--- /dev/null
+++ b/src/UnicaenValidation/Form/ValidationType/ValidationTypeForm.php
@@ -0,0 +1,98 @@
+<?php
+
+namespace UnicaenValidation\Form\ValidationType;
+
+use Laminas\Form\Element\Button;
+use Laminas\Form\Element\Checkbox;
+use Laminas\Form\Element\Hidden;
+use Laminas\Form\Element\Text;
+use Laminas\Form\Form;
+use Laminas\InputFilter\Factory;
+use Laminas\Validator\Callback;
+use UnicaenApp\Service\EntityManagerAwareTrait;
+use UnicaenValidation\Entity\Db\ValidationType;
+
+class ValidationTypeForm extends Form {
+ use EntityManagerAwareTrait;
+
+ public function init()
+ {
+ //code
+ $this->add([
+ 'type' => Text::class,
+ 'name' => 'code',
+ 'options' => [
+ 'label' => "Code* :",
+ ],
+ 'attributes' => [
+ 'id' => 'code',
+ ],
+ ]);
+ $this->add([
+ 'name' => 'old-code',
+ 'type' => Hidden::class,
+ 'attributes' => [
+ 'value' => "",
+ ],
+ ]);
+ //libelle
+ $this->add([
+ 'type' => Text::class,
+ 'name' => 'libelle',
+ 'options' => [
+ 'label' => "Libelle* :",
+ ],
+ 'attributes' => [
+ 'id' => 'libelle',
+ ],
+ ]);
+ //refusable
+ $this->add([
+ 'type' => Checkbox::class,
+ 'name' => 'refusable',
+ 'options' => [
+ 'label' => "Peut-être refusable",
+ ],
+ 'attributes' => [
+ 'id' => 'refusable',
+ ],
+ ]);
+ //submit
+ $this->add([
+ 'type' => Button::class,
+ 'name' => 'creer',
+ 'options' => [
+ 'label' => '<i class="fas fa-save"></i> Enregistrer',
+ 'label_options' => [
+ 'disable_html_escape' => true,
+ ],
+ ],
+ 'attributes' => [
+ 'type' => 'submit',
+ 'class' => 'btn btn-primary',
+ ],
+ ]);
+ //inputfilter
+ $this->setInputFilter((new Factory())->createInputFilter([
+ 'code' => [
+ 'required' => true,
+ 'validators' => [[
+ 'name' => Callback::class,
+ 'options' => [
+ 'messages' => [
+ Callback::INVALID_VALUE => "Ce code existe déjà",
+ ],
+ 'callback' => function ($value, $context = []) {
+ if($value == $context['old-code']) return true;
+ return ($this->getEntityManager()->getRepository(ValidationType::class)->findOneBy(['code'=>$value],[]) == null);
+ },
+ //'break_chain_on_failure' => true,
+ ],
+ ]],
+ ],
+ 'old-code' => ['required' => false, ],
+ 'libelle' => [ 'required' => true, ],
+ 'refusable' => [ 'required' => false, ],
+ ]));
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Form/ValidationType/ValidationTypeFormAwareTrait.php b/src/UnicaenValidation/Form/ValidationType/ValidationTypeFormAwareTrait.php
new file mode 100644
index 0000000..0dc05b5
--- /dev/null
+++ b/src/UnicaenValidation/Form/ValidationType/ValidationTypeFormAwareTrait.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace UnicaenValidation\Form\ValidationType;
+
+trait ValidationTypeFormAwareTrait {
+
+ private ValidationTypeForm $validationTypeForm;
+
+ /**
+ * @return ValidationTypeForm
+ */
+ public function getValidationTypeForm() : ValidationTypeForm
+ {
+ return $this->validationTypeForm;
+ }
+
+ /**
+ * @param ValidationTypeForm $validationTypeForm
+ */
+ public function setValidationTypeForm(ValidationTypeForm $validationTypeForm) : void
+ {
+ $this->validationTypeForm = $validationTypeForm;
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Form/ValidationType/ValidationTypeFormFactory.php b/src/UnicaenValidation/Form/ValidationType/ValidationTypeFormFactory.php
new file mode 100644
index 0000000..979679d
--- /dev/null
+++ b/src/UnicaenValidation/Form/ValidationType/ValidationTypeFormFactory.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace UnicaenValidation\Form\ValidationType;
+
+use Doctrine\ORM\EntityManager;
+use Interop\Container\ContainerInterface;
+use Psr\Container\ContainerExceptionInterface;
+use Psr\Container\NotFoundExceptionInterface;
+
+class ValidationTypeFormFactory {
+
+ /**
+ * @param ContainerInterface $container
+ * @return ValidationTypeForm
+ * @throws ContainerExceptionInterface
+ * @throws NotFoundExceptionInterface
+ */
+ public function __invoke(ContainerInterface $container) : ValidationTypeForm
+ {
+ /** @var EntityManager $entityManager */
+ $entityManager = $container->get('doctrine.entitymanager.orm_default');
+
+ /** @var ValidationTypeHydrator $hydrator */
+ $hydrator = $container->get('HydratorManager')->get(ValidationTypeHydrator::class);
+
+ $form = new ValidationTypeForm();
+ $form->setEntityManager($entityManager);
+ $form->setHydrator($hydrator);
+ return $form;
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Form/ValidationType/ValidationTypeHydrator.php b/src/UnicaenValidation/Form/ValidationType/ValidationTypeHydrator.php
new file mode 100644
index 0000000..b2edaea
--- /dev/null
+++ b/src/UnicaenValidation/Form/ValidationType/ValidationTypeHydrator.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace UnicaenValidation\Form\ValidationType;
+
+use UnicaenValidation\Entity\Db\ValidationType;
+use Laminas\Hydrator\HydratorInterface;
+
+class ValidationTypeHydrator implements HydratorInterface {
+
+ /**
+ * @param ValidationType $object
+ * @return array
+ */
+ public function extract(object $object) : array
+ {
+ $data = [
+ "code" => $object->getCode(),
+ "libelle" => $object->getLibelle(),
+ "refusable" => $object->isRefusable(),
+ ];
+ return $data;
+ }
+
+ /**
+ * @param array $data
+ * @param ValidationType $object
+ * @return ValidationType
+ */
+ public function hydrate(array $data, object $object)
+ {
+ $object->setCode($data['code'] ?? null);
+ $object->setLibelle($data['libelle'] ?? null);
+ $object->setRefusable($data['refusable'] ?? null);
+ return $object;
+ }
+
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Form/ValidationType/ValidationTypeHydratorFactory.php b/src/UnicaenValidation/Form/ValidationType/ValidationTypeHydratorFactory.php
new file mode 100644
index 0000000..f4f151c
--- /dev/null
+++ b/src/UnicaenValidation/Form/ValidationType/ValidationTypeHydratorFactory.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace UnicaenValidation\Form\ValidationType;
+
+use Interop\Container\ContainerInterface;
+
+class ValidationTypeHydratorFactory {
+
+ /**
+ * @param ContainerInterface $container
+ * @return ValidationTypeHydrator
+ */
+ public function __invoke(ContainerInterface $container) : ValidationTypeHydrator
+ {
+ $hydrator = new ValidationTypeHydrator();
+ return $hydrator;
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Provider/Privilege/ValidationinstancePrivileges.php b/src/UnicaenValidation/Provider/Privilege/ValidationinstancePrivileges.php
new file mode 100644
index 0000000..dd1415c
--- /dev/null
+++ b/src/UnicaenValidation/Provider/Privilege/ValidationinstancePrivileges.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace UnicaenValidation\Provider\Privilege;
+
+use UnicaenPrivilege\Provider\Privilege\Privileges;
+
+class ValidationinstancePrivileges extends Privileges
+{
+ const VALIDATIONINSTANCE_AFFICHER = 'validationinstance-validationinstance_afficher';
+ const VALIDATIONINSTANCE_MODIFIER = 'validationinstance-validationinstance_modifier';
+ const VALIDATIONINSTANCE_HISTORISER = 'validationinstance-validationinstance_historiser';
+ const VALIDATIONINSTANCE_DETRUIRE = 'validationinstance-validationinstance_detruire';
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Provider/Privilege/ValidationtypePrivileges.php b/src/UnicaenValidation/Provider/Privilege/ValidationtypePrivileges.php
new file mode 100644
index 0000000..f050ecf
--- /dev/null
+++ b/src/UnicaenValidation/Provider/Privilege/ValidationtypePrivileges.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace UnicaenValidation\Provider\Privilege;
+
+use UnicaenPrivilege\Provider\Privilege\Privileges;
+
+class ValidationtypePrivileges extends Privileges
+{
+ const VALIDATIONTYPE_AFFICHER = 'validationtype-validationtype_afficher';
+ const VALIDATIONTYPE_MODIFIER = 'validationtype-validationtype_modifier';
+ const VALIDATIONTYPE_DETRUIRE = 'validationtype-validationtype_detruire';
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Service/ValidationInstance/ValidationInstanceService.php b/src/UnicaenValidation/Service/ValidationInstance/ValidationInstanceService.php
new file mode 100644
index 0000000..3490147
--- /dev/null
+++ b/src/UnicaenValidation/Service/ValidationInstance/ValidationInstanceService.php
@@ -0,0 +1,179 @@
+<?php
+
+namespace UnicaenValidation\Service\ValidationInstance;
+
+use Doctrine\ORM\NonUniqueResultException;
+use Doctrine\ORM\ORMException;
+use Doctrine\ORM\QueryBuilder;
+use Laminas\Mvc\Controller\AbstractActionController;
+use UnicaenApp\Exception\RuntimeException;
+use UnicaenApp\Service\EntityManagerAwareTrait;
+use UnicaenValidation\Entity\Db\ValidationInstance;
+use UnicaenValidation\Service\ValidationType\ValidationTypeServiceAwareTrait;
+
+class ValidationInstanceService {
+ use EntityManagerAwareTrait;
+ use ValidationTypeServiceAwareTrait;
+
+ /** GESTION DES ENTITES *******************************************************************************************/
+
+ /**
+ * @param ValidationInstance $instance
+ * @return ValidationInstance
+ */
+ public function create(ValidationInstance $instance) : ValidationInstance
+ {
+ try {
+ $this->getEntityManager()->persist($instance);
+ $this->getEntityManager()->flush($instance);
+ } catch (ORMException $e) {
+ throw new RuntimeException("Un problème est survenue lors de l'enregistrement en BD.",0,$e);
+ }
+
+ return $instance;
+ }
+
+ /**
+ * @param ValidationInstance $instance
+ * @return ValidationInstance
+ */
+ public function update(ValidationInstance $instance) : ValidationInstance
+ {
+ try {
+ $this->getEntityManager()->flush($instance);
+ } catch (ORMException $e) {
+ throw new RuntimeException("Un problème est survenue lors de l'enregistrement en BD.",0,$e);
+ }
+
+ return $instance;
+ }
+
+ /**
+ * @param ValidationInstance $instance
+ * @return ValidationInstance
+ */
+ public function historise(ValidationInstance $instance) : ValidationInstance
+ {
+ try {
+ $instance->historiser();
+ $this->getEntityManager()->flush($instance);
+ } catch (ORMException $e) {
+ throw new RuntimeException("Un problème est survenue lors de l'enregistrement en BD.",0,$e);
+ }
+
+ return $instance;
+ }
+
+ /**
+ * @param ValidationInstance $instance
+ * @return ValidationInstance
+ */
+ public function restore(ValidationInstance $instance) : ValidationInstance
+ {
+
+ try {
+ $instance->dehistoriser();
+ $this->getEntityManager()->flush($instance);
+ } catch (ORMException $e) {
+ throw new RuntimeException("Un problème est survenue lors de l'enregistrement en BD.",0,$e);
+ }
+
+ return $instance;
+ }
+
+ /**
+ * @param ValidationInstance $instance
+ * @return ValidationInstance
+ */
+ public function delete(ValidationInstance $instance) : ValidationInstance
+ {
+ try {
+ $this->getEntityManager()->remove($instance);
+ $this->getEntityManager()->flush($instance);
+ } catch (ORMException $e) {
+ throw new RuntimeException("Un problème est survenue lors de l'enregistrement en BD.",0,$e);
+ }
+
+ return $instance;
+ }
+
+ /** REQUETAGE *****************************************************************************************************/
+
+ /**
+ * @return QueryBuilder
+ */
+ public function createQueryBuilder() : QueryBuilder
+ {
+ $qb = $this->getEntityManager()->getRepository(ValidationInstance::class)->createQueryBuilder('vinstance')
+ ->addSelect('createur')->join('vinstance.histoCreateur', 'createur')
+ ->addSelect('modificateur')->join('vinstance.histoModificateur', 'modificateur')
+ ->addSelect('vtype')->join('vinstance.type', 'vtype')
+ ;
+ return $qb;
+ }
+
+ /**
+ * @param string $champ
+ * @param string $ordre
+ * @return ValidationInstance[]
+ */
+ public function getValidationsInstances(string $champ = 'histoModification', string $ordre = 'DESC') : array
+ {
+ $qb = $this->createQueryBuilder()
+ ->orderBy('vinstance.' . $champ, $ordre)
+ ;
+
+ $result = $qb->getQuery()->getResult();
+ return $result;
+ }
+
+ /**
+ * @param int|null $id
+ * @return ValidationInstance|null
+ */
+ public function getValidationInstance(?int $id) : ?ValidationInstance
+ {
+ $qb = $this->createQueryBuilder()
+ ->andWhere('vinstance.id = :id')
+ ->setParameter('id', $id)
+ ;
+
+ try {
+ $result = $qb->getQuery()->getOneOrNullResult();
+ } catch (NonUniqueResultException $e) {
+ throw new RuntimeException("Plusieurs ValidationInstance partagent le même id [".$id."]", 0, true);
+ }
+ return $result;
+ }
+
+ /**
+ * @param AbstractActionController $controller
+ * @param string $param
+ * @return ValidationInstance|null
+ */
+ public function getRequestedValidationInstance(AbstractActionController $controller, string $param = "validation") : ?ValidationInstance
+ {
+ $id = $controller->params()->fromRoute($param);
+ $result = $this->getValidationInstance($id);
+ return $result;
+ }
+
+ /** FACADE ********************************************************************************************************/
+
+ /**
+ * @param string $code
+ * @param string|null $valeur
+ * @return ValidationInstance
+ */
+ public function createWithCode(string $code, ?string $valeur = null) : ValidationInstance
+ {
+ $type = $this->getValidationTypeService()->getValidationTypeByCode($code);
+
+ $instance = new ValidationInstance();
+ $instance->setType($type);
+ $instance->setValeur($valeur);
+ $this->create($instance);
+
+ return $instance;
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Service/ValidationInstance/ValidationInstanceServiceAwareTrait.php b/src/UnicaenValidation/Service/ValidationInstance/ValidationInstanceServiceAwareTrait.php
new file mode 100644
index 0000000..93583dc
--- /dev/null
+++ b/src/UnicaenValidation/Service/ValidationInstance/ValidationInstanceServiceAwareTrait.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace UnicaenValidation\Service\ValidationInstance;
+
+trait ValidationInstanceServiceAwareTrait {
+
+ private ValidationInstanceService $validationInstanceService;
+
+ /**
+ * @return ValidationInstanceService
+ */
+ public function getValidationInstanceService() : ValidationInstanceService
+ {
+ return $this->validationInstanceService;
+ }
+
+ /**
+ * @param ValidationInstanceService $validationInstanceService
+ */
+ public function setValidationInstanceService(ValidationInstanceService $validationInstanceService) : void
+ {
+ $this->validationInstanceService = $validationInstanceService;
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Service/ValidationInstance/ValidationInstanceServiceFactory.php b/src/UnicaenValidation/Service/ValidationInstance/ValidationInstanceServiceFactory.php
new file mode 100644
index 0000000..5bb4bd9
--- /dev/null
+++ b/src/UnicaenValidation/Service/ValidationInstance/ValidationInstanceServiceFactory.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace UnicaenValidation\Service\ValidationInstance;
+
+use Doctrine\ORM\EntityManager;
+use Interop\Container\ContainerInterface;
+use Psr\Container\ContainerExceptionInterface;
+use Psr\Container\NotFoundExceptionInterface;
+use UnicaenValidation\Service\ValidationType\ValidationTypeService;
+
+class ValidationInstanceServiceFactory {
+
+ /**
+ * @param ContainerInterface $container
+ * @return ValidationInstanceService
+ * @throws ContainerExceptionInterface
+ * @throws NotFoundExceptionInterface
+ */
+ public function __invoke(ContainerInterface $container) : ValidationInstanceService
+ {
+ /**
+ * @var EntityManager $entityManager
+ * @var ValidationTypeService $validationTypeService
+ */
+ $entityManager = $container->get('doctrine.entitymanager.orm_default');
+ $validationTypeService = $container->get(ValidationTypeService::class);
+
+ $service = new ValidationInstanceService();
+ $service->setEntityManager($entityManager);
+ $service->setValidationTypeService($validationTypeService);
+ return $service;
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Service/ValidationType/ValidationTypeService.php b/src/UnicaenValidation/Service/ValidationType/ValidationTypeService.php
new file mode 100644
index 0000000..ec28ac3
--- /dev/null
+++ b/src/UnicaenValidation/Service/ValidationType/ValidationTypeService.php
@@ -0,0 +1,158 @@
+<?php
+
+namespace UnicaenValidation\Service\ValidationType;
+
+use Doctrine\ORM\NonUniqueResultException;
+use Doctrine\ORM\ORMException;
+use Doctrine\ORM\QueryBuilder;
+use Laminas\Mvc\Controller\AbstractActionController;
+use UnicaenApp\Exception\RuntimeException;
+use UnicaenApp\Service\EntityManagerAwareTrait;
+use UnicaenUtilisateur\Service\User\UserServiceAwareTrait;
+use UnicaenValidation\Entity\Db\ValidationType;
+
+class ValidationTypeService {
+ use EntityManagerAwareTrait;
+ use UserServiceAwareTrait;
+
+ /** GESTION DES ENTITES *******************************************************************************************/
+
+ /**
+ * @param ValidationType $type
+ * @return ValidationType
+ */
+ public function create(ValidationType $type) : ValidationType
+ {
+ try {
+ $this->getEntityManager()->persist($type);
+ $this->getEntityManager()->flush($type);
+ } catch (ORMException $e) {
+ throw new RuntimeException("Un problème est survenue lors de l'enregistrement en BD.",0,$e);
+ }
+
+ return $type;
+ }
+
+ /**
+ * @param ValidationType $type
+ * @return ValidationType
+ */
+ public function update(ValidationType $type) : ValidationType
+ {
+ try {
+ $this->getEntityManager()->flush($type);
+ } catch (ORMException $e) {
+ throw new RuntimeException("Un problème est survenue lors de l'enregistrement en BD.",0,$e);
+ }
+
+ return $type;
+ }
+
+ /**
+ * @param ValidationType $type
+ * @return ValidationType
+ */
+ public function delete(ValidationType $type) : ValidationType
+ {
+ try {
+ $this->getEntityManager()->remove($type);
+ $this->getEntityManager()->flush($type);
+ } catch (ORMException $e) {
+ throw new RuntimeException("Un problème est survenue lors de l'enregistrement en BD.",0,$e);
+ }
+
+ return $type;
+ }
+
+ /** REQUETAGE *****************************************************************************************************/
+
+ /**
+ * @return QueryBuilder
+ */
+ public function createQueryBuilder() : QueryBuilder
+ {
+ $qb = $this->getEntityManager()->getRepository(ValidationType::class)->createQueryBuilder('vtype')
+ ;
+
+ return $qb;
+ }
+
+ /**
+ * @param string $champ
+ * @param string $ordre
+ * @return ValidationType[]
+ */
+ public function getValidationsTypes(string $champ = "libelle", string $ordre = "ASC") : array
+ {
+ $qb = $this->createQueryBuilder()
+ ->orderBy('vtype.' . $champ, $ordre)
+ ;
+
+ $result = $qb->getQuery()->getResult();
+ return $result;
+ }
+
+ /**
+ * @param string $champ
+ * @param string $ordre
+ * @return array
+ */
+ public function getValidationsTypesAsOptions(string $champ = "libelle", string $ordre = "ASC") : array
+ {
+ $result = $this->getValidationsTypes($champ, $ordre);
+ $array = [];
+ foreach ($result as $item) $array[$item->getId()] = $item->getCode();
+ return $array;
+ }
+
+ /**
+ * @param int|null $id
+ * @return ValidationType|null
+ */
+ public function getValidationType(?int $id) : ?ValidationType
+ {
+ $qb = $this->createQueryBuilder()
+ ->andWhere('vtype.id = :id')
+ ->setParameter('id', $id)
+ ;
+
+ try {
+ $result = $qb->getQuery()->getOneOrNullResult();
+ } catch (NonUniqueResultException $e) {
+ throw new RuntimeException("Plusieurs ValidationType partagent le même id [".$id."]", 0, $e);
+ }
+
+ return $result;
+ }
+
+ /**
+ * @param AbstractActionController $controller
+ * @param string $param
+ * @return ValidationType|null
+ */
+ public function getRequestedValidationType(AbstractActionController $controller, string $param='type') : ?ValidationType
+ {
+ $id = $controller->params()->fromRoute($param);
+ $result = $this->getValidationType($id);
+ return $result;
+ }
+
+ /**
+ * @param string $code
+ * @return ValidationType|null
+ */
+ public function getValidationTypeByCode(string $code) : ?ValidationType
+ {
+ $qb = $this->createQueryBuilder()
+ ->andWhere('vtype.code = :code')
+ ->setParameter('code', $code)
+ ;
+
+ try {
+ $result = $qb->getQuery()->getOneOrNullResult();
+ } catch (NonUniqueResultException $e) {
+ throw new RuntimeException("Plusieurs ValidationType partagent le même code [".$code."]", 0, $e);
+ }
+ return $result;
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Service/ValidationType/ValidationTypeServiceAwareTrait.php b/src/UnicaenValidation/Service/ValidationType/ValidationTypeServiceAwareTrait.php
new file mode 100644
index 0000000..cb39160
--- /dev/null
+++ b/src/UnicaenValidation/Service/ValidationType/ValidationTypeServiceAwareTrait.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace UnicaenValidation\Service\ValidationType;
+
+trait ValidationTypeServiceAwareTrait {
+
+ private ValidationTypeService $validationTypeService;
+
+ /**
+ * @return ValidationTypeService
+ */
+ public function getValidationTypeService() : ValidationTypeService
+ {
+ return $this->validationTypeService;
+ }
+
+ /**
+ * @param ValidationTypeService $validationTypeService
+ */
+ public function setValidationTypeService(ValidationTypeService $validationTypeService) : void
+ {
+ $this->validationTypeService = $validationTypeService;
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/Service/ValidationType/ValidationTypeServiceFactory.php b/src/UnicaenValidation/Service/ValidationType/ValidationTypeServiceFactory.php
new file mode 100644
index 0000000..ec92356
--- /dev/null
+++ b/src/UnicaenValidation/Service/ValidationType/ValidationTypeServiceFactory.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace UnicaenValidation\Service\ValidationType;
+
+use Doctrine\ORM\EntityManager;
+use Interop\Container\ContainerInterface;
+use Psr\Container\ContainerExceptionInterface;
+use Psr\Container\NotFoundExceptionInterface;
+use UnicaenUtilisateur\Service\User\UserService;
+
+class ValidationTypeServiceFactory {
+
+ /**
+ * @param ContainerInterface $container
+ * @return ValidationTypeService
+ * @throws ContainerExceptionInterface
+ * @throws NotFoundExceptionInterface
+ */
+ public function __invoke(ContainerInterface $container) : ValidationTypeService
+ {
+ /**
+ * @var EntityManager $entityManager
+ * @var UserService $userService
+ */
+ $entityManager = $container->get('doctrine.entitymanager.orm_default');
+ $userService = $container->get(UserService::class);
+
+ $service = new ValidationTypeService();
+ $service->setEntityManager($entityManager);
+ $service->setUserService($userService);
+ return $service;
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/View/Helper/ValidationAfficherViewHelper.php b/src/UnicaenValidation/View/Helper/ValidationAfficherViewHelper.php
new file mode 100644
index 0000000..1c0ab3d
--- /dev/null
+++ b/src/UnicaenValidation/View/Helper/ValidationAfficherViewHelper.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace UnicaenValidation\View\Helper;
+
+use UnicaenValidation\Entity\Db\ValidationInstance;
+use Laminas\View\Helper\AbstractHelper;
+use Laminas\View\Helper\Partial;
+use Laminas\View\Renderer\PhpRenderer;
+use Laminas\View\Resolver\TemplatePathStack;
+
+class ValidationAfficherViewHelper extends AbstractHelper
+{
+ /**
+ * @param ValidationInstance $validation
+ * @param array $options
+ * @return string|Partial
+ */
+ public function __invoke(ValidationInstance $validation, array $options = [])
+ {
+ /** @var PhpRenderer $view */
+ $view = $this->getView();
+ $view->resolver()->attach(new TemplatePathStack(['script_paths' => [__DIR__ . "/partial"]]));
+
+ return $view->partial('validation-afficher', ['instance' => $validation]);
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/View/Helper/ValidationBadgeViewHelper.php b/src/UnicaenValidation/View/Helper/ValidationBadgeViewHelper.php
new file mode 100644
index 0000000..6c56a5c
--- /dev/null
+++ b/src/UnicaenValidation/View/Helper/ValidationBadgeViewHelper.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace UnicaenValidation\View\Helper;
+
+use UnicaenValidation\Entity\Db\ValidationInstance;
+use Laminas\View\Helper\AbstractHelper;
+use Laminas\View\Helper\Partial;
+use Laminas\View\Renderer\PhpRenderer;
+use Laminas\View\Resolver\TemplatePathStack;
+
+class ValidationBadgeViewHelper extends AbstractHelper
+{
+ /**
+ * @param ValidationInstance|null $validation
+ * @param array $options
+ * @return string|Partial
+ */
+ public function __invoke(?ValidationInstance $validation, array $options = [])
+ {
+ /** @var PhpRenderer $view */
+ $view = $this->getView();
+ $view->resolver()->attach(new TemplatePathStack(['script_paths' => [__DIR__ . "/partial"]]));
+
+ return $view->partial('validation-badge', ['validation' => $validation, 'options' => $options]);
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/View/Helper/ValidationValiderViewHelper.php b/src/UnicaenValidation/View/Helper/ValidationValiderViewHelper.php
new file mode 100644
index 0000000..ab90eeb
--- /dev/null
+++ b/src/UnicaenValidation/View/Helper/ValidationValiderViewHelper.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace UnicaenValidation\View\Helper;
+
+use UnicaenValidation\Service\ValidationType\ValidationTypeServiceAwareTrait;
+use Laminas\View\Helper\AbstractHelper;
+use Laminas\View\Helper\Partial;
+use Laminas\View\Renderer\PhpRenderer;
+use Laminas\View\Resolver\TemplatePathStack;
+
+class ValidationValiderViewHelper extends AbstractHelper
+{
+ use ValidationTypeServiceAwareTrait;
+ /**
+ * @param string $validationTypeCode
+ * @param array $options
+ * @return string|Partial
+ */
+ public function __invoke(string $validationTypeCode, array $options = [])
+ {
+ $type = $this->getValidationTypeService()->getValidationTypeByCode($validationTypeCode);
+
+ /** @var PhpRenderer $view */
+ $view = $this->getView();
+ $view->resolver()->attach(new TemplatePathStack(['script_paths' => [__DIR__ . "/partial"]]));
+
+ return $view->partial('validation-valider', ['type' => $type, 'options' => $options]);
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/View/Helper/ValidationValiderViewHelperFactory.php b/src/UnicaenValidation/View/Helper/ValidationValiderViewHelperFactory.php
new file mode 100644
index 0000000..d4765eb
--- /dev/null
+++ b/src/UnicaenValidation/View/Helper/ValidationValiderViewHelperFactory.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace UnicaenValidation\View\Helper;
+
+use Interop\Container\ContainerInterface;
+use Psr\Container\ContainerExceptionInterface;
+use Psr\Container\NotFoundExceptionInterface;
+use UnicaenValidation\Service\ValidationType\ValidationTypeService;
+
+class ValidationValiderViewHelperFactory {
+
+ /**
+ * @param ContainerInterface $container
+ * @return ValidationValiderViewHelper
+ * @throws ContainerExceptionInterface
+ * @throws NotFoundExceptionInterface
+ */
+ public function __invoke(ContainerInterface $container) : ValidationValiderViewHelper
+ {
+ /** @var ValidationTypeService $validationTypeService */
+ $validationTypeService = $container->get(ValidationTypeService::class);
+
+ $helper = new ValidationValiderViewHelper();
+ $helper->setValidationTypeService($validationTypeService);
+ return $helper;
+ }
+}
\ No newline at end of file
diff --git a/src/UnicaenValidation/View/Helper/partial/validation-afficher.phtml b/src/UnicaenValidation/View/Helper/partial/validation-afficher.phtml
new file mode 100644
index 0000000..fc3f456
--- /dev/null
+++ b/src/UnicaenValidation/View/Helper/partial/validation-afficher.phtml
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @var ValidationInstance $instance
+ * @var array $options
+ */
+
+use UnicaenValidation\Entity\Db\ValidationInstance;
+
+$type = $instance->getType();
+
+?>
+
+<div class="validation validation-affichage <?php echo ($instance->getValeur() === null)?"validation-valider":"validation-refuser" ?>">
+ <?php if ($instance->getValeur() !== null) : ?>
+ Refusé
+ <?php else : ?>
+ Validé
+ <?php endif; ?>
+ le <?php echo $instance->getHistoModification()->format('d/m/Y à H:i:s'); ?>
+ par <?php echo $instance->getHistoModificateur()->getDisplayName(); ?>.
+</div>
diff --git a/src/UnicaenValidation/View/Helper/partial/validation-badge.phtml b/src/UnicaenValidation/View/Helper/partial/validation-badge.phtml
new file mode 100644
index 0000000..cd3a3a5
--- /dev/null
+++ b/src/UnicaenValidation/View/Helper/partial/validation-badge.phtml
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @see \UnicaenValidation\View\Helper\ValidationBadgeViewHelper
+ * @var ValidationInstance $validation
+ * @var array $options
+ */
+
+use UnicaenValidation\Entity\Db\ValidationInstance;
+
+$texte = (isset($options['texte']) AND $options['texte'] === true);
+?>
+
+<?php if ($validation !== null) : ?>
+ <?php if ($validation->getValeur() === null) : ?>
+ <span class="icon ok" style="color: darkgreen;"
+ data-toggle="tooltip" data-html="true"
+ title="Validé le <span class='highlight date'> <?php echo $validation->getHistoCreation()->format('d/m/Y'); ?> </span> par <span class='highlight agent'> <?php echo $validation->getHistoCreateur()->getDisplayName(); ?>">
+ <?php echo ($texte)?"Validée":""; ?>
+ </span>
+ <?php else : ?>
+ <span class="icon ko" style="color: darkred;"
+ data-toggle="tooltip" data-html="true"
+ title="Validé le <span class='highlight date'> <?php echo $validation->getHistoCreation()->format('d/m/Y'); ?> </span> par <span class='highlight agent'> <?php echo $validation->getHistoCreateur()->getDisplayName(); ?>">
+ <?php echo ($texte)?"Refusée":""; ?>
+ </span>
+ <?php endif; ?>
+<?php else : ?>
+ <span style="color:#123456;"><span class="icon aucune"></span> <?php echo ($texte)?"Aucune":""; ?></span>
+<?php endif; ?>
diff --git a/src/UnicaenValidation/View/Helper/partial/validation-valider.phtml b/src/UnicaenValidation/View/Helper/partial/validation-valider.phtml
new file mode 100644
index 0000000..007795f
--- /dev/null
+++ b/src/UnicaenValidation/View/Helper/partial/validation-valider.phtml
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * @var \UnicaenValidation\Entity\Db\ValidationType $type
+ * @var array $options
+ */
+
+$displayType = (isset($options["display-type"]) AND $options["display-type"] === true);
+$retour = $options["retour"] ?? $this->url(null, [], [], true);
+
+
+?>
+
+<div class="validation validation-validation">
+
+ <?php if($displayType) : ?>
+ <dl class="dl-horizontal">
+ <dt> Validation :</dt>
+ <dd> <?php echo $type->getLibelle(); ?> </dd>
+ </dl>
+ <?php endif; ?>
+
+ <a
+ <?php /** @see \UnicaenValidation\Controller\ValidationInstanceController::validerAction() */ ?>
+ href="<?php echo $this->url('validation/instance/valider', ['type' => $type->getId()], ["query" => ["retour" => $retour]]); ?>"
+ class="btn btn-success action"
+ >
+ <span class="icon ok"></span> Valider
+ </a>
+ <?php if ($type->isRefusable()) : ?>
+ <a
+ <?php /** @see \UnicaenValidation\Controller\ValidationInstanceController::refuserAction() */ ?>
+ href="<?php echo $this->url('validation/instance/refuser', ['type' => $type->getId()], ["query" => ["retour" => $retour]]); ?>"
+ class="btn btn-danger action"
+ >
+ <span class="icon ko"></span> Refuser
+ </a>
+ <?php endif; ?>
+</div>
diff --git a/view/unicaen-validation/default/confirmation.phtml b/view/unicaen-validation/default/confirmation.phtml
new file mode 100644
index 0000000..f2e8bdf
--- /dev/null
+++ b/view/unicaen-validation/default/confirmation.phtml
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * @var string $title
+ * @var string $text
+ * @var string $action
+ */
+
+?>
+
+<p class="lead">
+<?php echo $text; ?>
+</p>
+
+<table>
+ <tr><td>
+<form method="post" action="<?php echo $action; ?>">
+ <input type="hidden" name="reponse" value="oui">
+ <input type="submit" name="oui" class="btn btn-success action" value="Oui, je suis sûr·e">
+</form>
+ </td><td>
+<form method="post" action="<?php echo $action; ?>">
+ <input type="hidden" name="reponse" value="non">
+ <input type="submit" id="non" name="non" class="btn btn-danger action" value="Non, je ne veux pas">
+</form>
+ </td></tr>
+</table>
+
+<script>
+ $(function() {
+ $("input#non").click(function(e){
+ $('div.modal').modal('hide');
+ e.preventDefault(e);
+ });
+ });
+</script>
+
diff --git a/view/unicaen-validation/default/default-form.phtml b/view/unicaen-validation/default/default-form.phtml
new file mode 100644
index 0000000..850f1cd
--- /dev/null
+++ b/view/unicaen-validation/default/default-form.phtml
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * @var Form $form
+ */
+
+use Laminas\Form\Form;
+
+?>
+
+<?php echo $this->form($form); ?>
+
+<script>
+ $(document).ready(function() {
+ // tinymce.remove();
+ tinymce.init({
+ selector: '.type2',
+ toolbar: 'newdocument undo redo | bold italic underline | bullist',
+ resize: true,
+ language: 'fr_FR',
+ plugins: 'lists',
+ statusbar: true,
+ browser_spellcheck : true,
+ branding: false,
+ menu: {},
+ body_id: 'description',
+ setup: function (editor) {
+ editor.on("focusout", function () {
+ console.log(tinymce.get('description').getContent());
+ $('textarea').val(tinymce.get('description').getContent());
+ });
+ }
+ });
+ });
+
+ $('select').selectpicker();
+</script>
+
+<style>
+ .form-control {
+ height:auto;
+ }
+</style>
\ No newline at end of file
diff --git a/view/unicaen-validation/validation-instance/index.phtml b/view/unicaen-validation/validation-instance/index.phtml
new file mode 100644
index 0000000..4b1c9df
--- /dev/null
+++ b/view/unicaen-validation/validation-instance/index.phtml
@@ -0,0 +1,121 @@
+<?php
+
+/**
+ * @see \UnicaenValidation\Controller\ValidationInstanceController::indexAction()
+ * @var ValidationInstance[] $instances
+ */
+
+use UnicaenValidation\Entity\Db\ValidationInstance;
+use UnicaenValidation\Provider\Privilege\ValidationinstancePrivileges;
+use UnicaenValidation\Provider\Privilege\ValidationtypePrivileges;
+
+$this->headTitle("Index des instances de validation");
+
+$canAfficher = $this->isAllowed(ValidationinstancePrivileges::getResourceId(ValidationinstancePrivileges::VALIDATIONINSTANCE_AFFICHER));
+$canAjouter = $this->isAllowed(ValidationinstancePrivileges::getResourceId(ValidationinstancePrivileges::VALIDATIONINSTANCE_MODIFIER));
+$canModifier = $this->isAllowed(ValidationinstancePrivileges::getResourceId(ValidationinstancePrivileges::VALIDATIONINSTANCE_MODIFIER));
+$canHistoriser = $this->isAllowed(ValidationinstancePrivileges::getResourceId(ValidationinstancePrivileges::VALIDATIONINSTANCE_HISTORISER));
+$canDetruire = $this->isAllowed(ValidationinstancePrivileges::getResourceId(ValidationinstancePrivileges::VALIDATIONINSTANCE_DETRUIRE));
+
+$canAfficherType = $this->isAllowed(ValidationTypePrivileges::getResourceId(ValidationTypePrivileges::VALIDATIONTYPE_AFFICHER));
+
+?>
+
+<div class="row">
+ <div class="col-md-6">
+ <h1 class="page-header">
+ Instances de validation
+ </h1>
+ </div>
+ <div class="pull-right">
+ <?php if ($canAfficherType) : ?>
+ <a href="<?php echo $this->url('validation/type', [], [], true); ?>" class="btn btn-primary action">
+ <span class="icon acceder"></span>
+ Types de validation
+ </a>
+ <?php endif; ?>
+ </div>
+</div>
+
+<span class="todo"> Faire un filtre </span>
+<div class="main">
+
+ <?php if ($canAjouter): ?>
+ <a
+ <?php /** @see \UnicaenValidation\Controller\ValidationInstanceController::ajouterAction() */ ?>
+ href="<?php echo $this->url('validation/instance/ajouter', [], [], true); ?>"
+ class="btn btn-primary action ajax-modal"
+ data-event="modification"
+ >
+ <span class="icon ajouter"> Ajouter une instance</span>
+ </a>
+ <?php endif; ?>
+
+ <table class="table table-condensed">
+ <thead>
+ <tr>
+ <th> Type </th>
+ <th> Refus </th>
+ <th> Date </th>
+ <th> Utilisateur </th>
+ <th> Action </th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php /** @var ValidationInstance $instance */ ?>
+ <?php foreach ($instances as $instance) : ?>
+ <tr>
+ <td> <?php echo $instance->getType()->getCode(); ?> </td>
+ <td> <?php echo $instance->getValeur(); ?> </td>
+ <td> <?php echo $instance->getHistoModification()->format('d/m/Y à H:i:s'); ?> </td>
+ <td> <?php echo $instance->getHistoModificateur()->getDisplayName(); ?> </td>
+ <td>
+ <?php if ($canModifier): ?>
+ <a
+ <?php /** @see \UnicaenValidation\Controller\ValidationInstanceController::modifierAction() */?>
+ href="<?php echo $this->url('validation/instance/modifier', ['validation' => $instance->getId()], [], true); ?>"
+ class="ajax-modal" data-event="modification"
+ >
+ <span class="icon editer" title="Modifier l'instance de validation"></a>
+ <?php endif; ?>
+
+ <?php if ($canHistoriser): ?>
+ <?php if ($instance->estNonHistorise()) :?>
+ <a
+ <?php /** @see \UnicaenValidation\Controller\ValidationInstanceController::modifierAction() */?>
+ href="<?php echo $this->url('validation/instance/historiser', ['validation' => $instance->getId()], [], true); ?>"
+ >
+ <span class="icon historiser" title="Historiser l'instance de validation"></a>
+ <?php else : ?>
+
+ <a
+ <?php /** @see \UnicaenValidation\Controller\ValidationInstanceController::modifierAction() */?>
+ href="<?php echo $this->url('validation/instance/restaurer', ['validation' => $instance->getId()], [], true); ?>"
+ >
+ <span class="icon restaurer" title="Restaurer l'instance de validation"></a>
+ <?php endif; ?>
+ <?php endif; ?>
+
+ <?php if ($canDetruire): ?>
+ <a
+ <?php /** @see \UnicaenValidation\Controller\ValidationInstanceController::detruireAction() */?>
+ href="<?php echo $this->url('validation/instance/detruire', ['validation' => $instance->getId()], [], true); ?>"
+ class="ajax-modal" data-event="modification"
+ >
+ <span class="icon detruire" title="Supprimer définitivement l'instance de validation"></a>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </tbody>
+ </table>
+</div>
+
+<script>
+ $(function() {
+ $("body").on("modification", function (event) {
+ event.div.modal('hide');
+ window.location.reload();
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/view/unicaen-validation/validation-instance/validation-modal.phtml b/view/unicaen-validation/validation-instance/validation-modal.phtml
new file mode 100644
index 0000000..d13b9b2
--- /dev/null
+++ b/view/unicaen-validation/validation-instance/validation-modal.phtml
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * @var string $title
+ * @var string $text
+ * @var string $action
+ * @var boolean $refus
+ */
+
+$refusable = ($refus === null OR $refus === true)
+?>
+
+<p class="lead">
+ <?php echo $text; ?>
+</p>
+
+<table>
+ <tr><td>
+ <form method="post" action="<?php echo $action; ?>">
+ <input type="hidden" name="reponse" value="oui">
+ <input type="submit" name="oui" class="btn btn-success action" value="Valider">
+ </form>
+ </td>
+ <?php if ($refusable) : ?>
+ <td>
+ <form method="post" action="<?php echo $action; ?>">
+ <input type="hidden" name="reponse" value="non">
+ <input type="submit" name="non" class="btn btn-danger action" value="Refuser">
+ </form>
+ </td>
+ <?php endif; ?>
+ </tr>
+</table>
+
+<script>
+ $(function() {
+ $("input#non").click(function(e){
+ $('div.modal').modal('hide');
+ e.preventDefault(e);
+ });
+ });
+</script>
+
diff --git a/view/unicaen-validation/validation-type/index.phtml b/view/unicaen-validation/validation-type/index.phtml
new file mode 100644
index 0000000..f5eb631
--- /dev/null
+++ b/view/unicaen-validation/validation-type/index.phtml
@@ -0,0 +1,113 @@
+<?php
+
+/**
+ * @see \UnicaenValidation\Controller\ValidationTypeController::indexAction()
+ * @var ValidationType[] $types;
+ */
+
+use UnicaenValidation\Entity\Db\ValidationType;
+use UnicaenValidation\Provider\Privilege\ValidationinstancePrivileges;
+use UnicaenValidation\Provider\Privilege\ValidationtypePrivileges;
+
+$this->headTitle("Index des types de validation");
+
+$canAfficher = $this->isAllowed(ValidationtypePrivileges::getResourceId(ValidationtypePrivileges::VALIDATIONTYPE_AFFICHER));
+$canAjouter = $this->isAllowed(ValidationtypePrivileges::getResourceId(ValidationtypePrivileges::VALIDATIONTYPE_MODIFIER));
+$canModifier = $this->isAllowed(ValidationtypePrivileges::getResourceId(ValidationtypePrivileges::VALIDATIONTYPE_MODIFIER));
+$canDetruire = $this->isAllowed(ValidationtypePrivileges::getResourceId(ValidationtypePrivileges::VALIDATIONTYPE_DETRUIRE));
+
+$canAfficherInstance = $this->isAllowed(ValidationInstancePrivileges::getResourceId(ValidationInstancePrivileges::VALIDATIONINSTANCE_AFFICHER));
+?>
+
+<div class="row">
+ <div class="col-md-6">
+ <h1 class="page-header">
+ Index des types de validations
+ </h1>
+ </div>
+ <div class="pull-right">
+ <?php if ($canAfficherInstance) : ?>
+ <a href="<?php echo $this->url('validation/instance', [], [], true); ?>" class="btn btn-primary action">
+ <span class="icon acceder"></span>
+ Instances de validation
+ </a>
+ <?php endif; ?>
+ </div>
+</div>
+
+<div class="main">
+
+ <div>
+ <?php if ($canAjouter): ?>
+ <a
+ <?php /** @see \UnicaenValidation\Controller\ValidationTypeController::ajouterAction() */ ?>
+ href="<?php echo $this->url('validation/type/ajouter', [], [], true); ?>"
+ class="btn btn-primary action ajax-modal"
+ data-event="modification"
+ >
+ <span class="icon ajouter"> Ajouter un type</span>
+ </a>
+ <?php endif; ?>
+ </div>
+
+ <div>
+ <?php if (empty($types)) : ?>
+ <em>Aucun type de validation</em>
+ <?php else : ?>
+ <table class="table table-condensed table-hover">
+ <thead>
+ <tr>
+ <th> Code </th>
+ <th> Libelle </th>
+ <th> Est refusable </th>
+ <th> Action </th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php /** @var ValidationType $type */ ?>
+ <?php foreach ($types as $type) : ?>
+ <tr>
+ <td> <?php echo $type->getCode(); ?> </td>
+ <td> <?php echo $type->getLibelle(); ?> </td>
+ <td>
+ <?php if ($type->isRefusable()) : ?>
+ <span class="icon ok" style="color:darkgreen;"></span>
+ <?php else : ?>
+ <span class="icon ko" style="color:darkred;"></span>
+ <?php endif; ?>
+ </td>
+ <td>
+ <?php if ($canModifier): ?>
+ <a
+ <?php /** @see \UnicaenValidation\Controller\ValidationTypeController::modifierAction() */?>
+ href="<?php echo $this->url('validation/type/modifier', ['type' => $type->getId()], [], true); ?>"
+ class="ajax-modal" data-event="modification"
+ >
+ <span class="icon editer" title="Modifier le type de validation"></a>
+ <?php endif; ?>
+
+ <?php if ($canDetruire): ?>
+ <a
+ <?php /** @see \UnicaenValidation\Controller\ValidationTypeController::detruireAction() */?>
+ href="<?php echo $this->url('validation/type/detruire', ['type' => $type->getId()], [], true); ?>"
+ class="ajax-modal" data-event="modification"
+ >
+ <span class="icon detruire" title="Supprimer définitivement le type de validation"></a>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </tbody>
+ </table>
+ <?php endif; ?>
+ </div>
+</div>
+
+<script>
+ $(function() {
+ $("body").on("modification", function (event) {
+ event.div.modal('hide');
+ window.location.reload();
+ });
+ });
+</script>
\ No newline at end of file
--
GitLab