Commit ecded1b8 authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

V2 (Vue) de l'interface de gestion des droits + copier/coller des privilèges

parent ab4640f1
Loading
Loading
Loading
Loading
Loading
+0 −6825

File deleted.

Preview size limit exceeded, changes collapsed.

+0 −0

Empty file added.

+0 −0

Empty file added.

+85 −69
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ use Oscar\Entity\LogActivity;
use Oscar\Entity\OrganizationRole;
use Oscar\Entity\Privilege;
use Oscar\Entity\Role;
use Oscar\Entity\RoleRepository;
use Oscar\Entity\TVA;
use Oscar\Exception\OscarException;
use Oscar\Formatter\OscarFormatterConst;
@@ -126,21 +127,14 @@ class AdministrationController extends AbstractOscarController implements UsePro
        }

        return new ViewModel([
                                 'signed_contract'           => $this->getOscarConfigurationService(
                                 )->useSignedContract() ?
            'signed_contract' => $this->getOscarConfigurationService()->useSignedContract() ?
                [
                                         'documents_signed_roles_persons'       => $this->getOscarConfigurationService(
                                         )->getSignedContractRolesPersons(),
                                         'documents_signed_roles_organizations' => $this->getOscarConfigurationService(
                                         )->getSignedContractRolesOrganizations(),
                                         'roles_organizations'                  => $this->getOscarUserContextService(
                                         )->getRolesOrganisationLeader(),
                                         'roles_persons'                        => $this->getOscarUserContextService(
                                         )->getAvailableRolesActivityOrOrganization(),
                                         'parafeur_select'                      => $this->getOscarConfigurationService(
                                         )->getSignedContractLetterFile(),
                                         'level_select'                         => $this->getOscarConfigurationService(
                                         )->getSignedContractLevel(),
                    'documents_signed_roles_persons' => $this->getOscarConfigurationService()->getSignedContractRolesPersons(),
                    'documents_signed_roles_organizations' => $this->getOscarConfigurationService()->getSignedContractRolesOrganizations(),
                    'roles_organizations' => $this->getOscarUserContextService()->getRolesOrganisationLeader(),
                    'roles_persons' => $this->getOscarUserContextService()->getAvailableRolesActivityOrOrganization(),
                    'parafeur_select' => $this->getOscarConfigurationService()->getSignedContractLetterFile(),
                    'level_select' => $this->getOscarConfigurationService()->getSignedContractLevel(),
                ] : null,
            'letterfiles_configuration' => $signatureService->getLetterfileService()
                ->getSignatureConfigurationService()->getLetterfileConfiguration(),
@@ -228,8 +222,7 @@ class AdministrationController extends AbstractOscarController implements UsePro
                        $this->flashMessenger()->addWarningMessage(
                            "Rien à ajouter"
                        );
                    }
                    else {
                    } else {
                        $persons = $this->getProjectGrantService()->getPersonService()->getPersonsByIds($personIds);
                        $adder = $this->getCurrentPerson();
                        $this->getProjectGrantService()->getPersonService()->addDeclarersToBlacklist(
@@ -265,8 +258,7 @@ class AdministrationController extends AbstractOscarController implements UsePro

        return [
            "useWhiteList" => $useWhitelist,
            "whitelist"    => $useWhitelist ? $this->getProjectGrantService()->getPersonService(
            )->getDeclarersWhitelist() : null,
            "whitelist" => $useWhitelist ? $this->getProjectGrantService()->getPersonService()->getDeclarersWhitelist() : null,
            "blacklist" => $this->getProjectGrantService()->getPersonService()->getDeclarersBlacklist()
        ];
    }
@@ -298,8 +290,7 @@ class AdministrationController extends AbstractOscarController implements UsePro
            exec('tail -n 50 ' . $this->getLoggerService()->getCurrentFile(), $logs);
            if ($logs === null) {
                $logs = "Impossible de charger les logs oscar";
            }
            else {
            } else {
                $logs = array_reverse($logs);
                $logs = implode("\n", $logs);
            }
@@ -427,8 +418,7 @@ class AdministrationController extends AbstractOscarController implements UsePro
                        throw new OscarException(
                            "Vous ne pouvez pas appliquer le mode strict avec une expression régulière vide"
                        );
                    }
                    else {
                    } else {
                        // Contrôler la regex
                        $this->getOscarConfigurationService()->setStrict($strict);
                        $this->getOscarConfigurationService()->saveEditableConfKey(
@@ -451,32 +441,22 @@ class AdministrationController extends AbstractOscarController implements UsePro
                ', ',
                $this->getOscarConfigurationService()->getSpentAccountFilter()
            ),
            OscarConfigurationService::activity_request_limit       => $this->getOscarConfigurationService(
            )->getActivityRequestLimit(),
            'timesheet_preview'                                     => $this->getOscarConfigurationService(
            )->getTimesheetPreview(),
            'timesheet_excel'                                       => $this->getOscarConfigurationService(
            )->getTimesheetExcel(),
            'allow_numerotation_custom'                             => $this->getOscarConfigurationService(
            )->getNumerotationEditable(),
            'themes'                                                => $this->getOscarConfigurationService(
            )->getConfiguration('themes'),
            'theme'                                                 => $this->getOscarConfigurationService()->getTheme(
            ),
            OscarConfigurationService::activity_request_limit => $this->getOscarConfigurationService()->getActivityRequestLimit(),
            'timesheet_preview' => $this->getOscarConfigurationService()->getTimesheetPreview(),
            'timesheet_excel' => $this->getOscarConfigurationService()->getTimesheetExcel(),
            'allow_numerotation_custom' => $this->getOscarConfigurationService()->getNumerotationEditable(),
            'themes' => $this->getOscarConfigurationService()->getConfiguration('themes'),
            'theme' => $this->getOscarConfigurationService()->getTheme(),
            'export' => [
                'separator' => $this->getOscarConfigurationService()->getExportSeparator(),
                'dateformat' => $this->getOscarConfigurationService()->getExportDateFormat()
            ],
            'organization_leader_role' => $organization_leader_role,
            OscarConfigurationService::document_use_version_in_name => $this->getOscarConfigurationService(
            )->getDocumentUseVersionInName(),
            OscarConfigurationService::pfi_strict                   => $this->getOscarConfigurationService(
            )->isPfiStrict(),
            OscarConfigurationService::document_use_version_in_name => $this->getOscarConfigurationService()->getDocumentUseVersionInName(),
            OscarConfigurationService::pfi_strict => $this->getOscarConfigurationService()->isPfiStrict(),
            OscarConfigurationService::pfi_strict_format => $pfiFixed,
            "pfi_default_format"                                    => $this->getOscarConfigurationService(
            )->getConfiguration('validation.pfi'),
            "allow_node_selection"                                  => $this->getOscarConfigurationService(
            )->isAllowNodeSelection(),
            "pfi_default_format" => $this->getOscarConfigurationService()->getConfiguration('validation.pfi'),
            "allow_node_selection" => $this->getOscarConfigurationService()->isAllowNodeSelection(),
            "organizationRequire" => [
                "type" => $this->getOscarConfigurationService()->getOrganizationRequired()['type'],
                "country" => $this->getOscarConfigurationService()->getOrganizationRequired()['country']
@@ -532,8 +512,7 @@ class AdministrationController extends AbstractOscarController implements UsePro
                    default:
                        return $this->getResponseInternalError();
                }
            }
            else {
            } else {
                switch ($method) {
                    case 'GET':
                        $numerotation = $this->getOscarConfigurationService()->getEditableConfKey('numerotation', []);
@@ -616,8 +595,7 @@ class AdministrationController extends AbstractOscarController implements UsePro
                            if (!$tva) {
                                return $this->getResponseInternalError("Impossible de charger la TVA '$id'");
                            }
                        }
                        else {
                        } else {
                            return $this->getResponseBadRequest("");
                        }
                        $this->getEntityManager()->remove($tva);
@@ -644,8 +622,7 @@ class AdministrationController extends AbstractOscarController implements UsePro
                            if (!$tva) {
                                throw new OscarException("Impossible de charger la TVA '$id'");
                            }
                        }
                        else {
                        } else {
                            $tva = new TVA();
                            $this->getEntityManager()->persist($tva);
                        }
@@ -1042,16 +1019,56 @@ class AdministrationController extends AbstractOscarController implements UsePro
        if ($idRolePrivilege) {
            switch ($this->getHttpXMethod()) {
            }
        }
        else {
        } else {
            switch ($this->getHttpXMethod()) {
                case 'POST' :
                    $datas = $_POST;
                    $this->getLoggerService()->info("DATAS : " . print_r($datas, true));
                    /** @var RoleRepository */
                    $roleRepository = $this->getEntityManager()->getRepository(Role::class);

                    try {
                        $action = $datas['action'];
                        switch ($action) {
                            case 'one':
                                $this->getLoggerService()->error("Toggle one privilège...");
                                $privilegeId = $request->getPost('privilegeid');
                                $roleId = $request->getPost('roleid');
                                $roleRepository->updateToggleRolePrivilege($roleId, $privilegeId);
                                break;
                            case 'copy':
                                $this->getLoggerService()->error("Copy privileges...");
                                $from = $request->getPost('from');
                                $to = $request->getPost('to');
                                $roleRepository->updateCopyPrivilege($from, $to);
                                break;
                            case 'saverole':
                                $this->getLoggerService()->error("Save role...");
                                $roleData = json_decode($request->getPost('role'), true);
                                $roleRepository->updateRole($roleData);
                                break;
                            default:
                                throw new OscarException("Action inconnue");
                        }

                    } catch (\Exception $e) {
                        $this->getLoggerService()->error("Impossible de modifier les privilèges : " . $e->getMessage());
                        return $this->jsonError("Impossible de modifier les privilèges : " . $e->getMessage());
                    }
                    return $this->getResponseOk();
                    break;
                case 'PATCH':
                    try {
                        $this->getOscarUserContextService()->check(Privileges::DROIT_PRIVILEGE_EDITION);

                        $privilegeId = $request->getPost('privilegeid');
                        $roleId = $request->getPost('roleid');
                        $this->getLoggerService()->info("PATCH : $privilegeId/$roleId");
                        $this->getLoggerService()->info(print_r($this->getJsonREST(), true));


                        /** @var Privilege $privilege */
                    $privilege = $this->getEntityManager()->getRepository(Privilege::class)->find($privilegeId);
                        $privilege = $this->getEntityManager()->getRepository(Privilege::class)->findOneBy(['id' => $privilegeId]);
                        if (!$privilege) {
                            return $this->getResponseBadRequest(
                                sprintf(
@@ -1076,14 +1093,21 @@ class AdministrationController extends AbstractOscarController implements UsePro

                        if ($privilege->hasRole($role)) {
                            $privilege->removeRole($role);
                    }
                    else {
                        } else {
                            $privilege->addRole($role);
                        }

                        $this->getEntityManager()->flush();

                        return $this->ajaxResponse($privilege->asArray());

                    } catch (\Exception $exception) {
                        $this->getLoggerService()->error("Impossible de modifier les privilèges : "
                            . $exception->getMessage()
                        );
                    }


                // LISTE COMPLETE
                case 'GET' :
                    $privileges = $this->getEntityManager()->getRepository(Privilege::class)->findAll();
@@ -1348,8 +1372,7 @@ class AdministrationController extends AbstractOscarController implements UsePro
                }

                return $this->getResponseBadRequest();
            }
            else {
            } else {
                // Création
                if ($this->getHttpXMethod() == "POST") {
                    $this->getOscarUserContextService()->hasPrivileges(Privileges::DROIT_ROLE_EDITION);
@@ -1363,8 +1386,7 @@ class AdministrationController extends AbstractOscarController implements UsePro
                                $roleId
                            )
                        );
                    }
                    else {
                    } else {
                        $role = new Role();
                        $this->hydrateRolewithPost($role, $request);
                        $this->getEntityManager()->persist($role);
@@ -1455,8 +1477,7 @@ class AdministrationController extends AbstractOscarController implements UsePro
                        $this->getLoggerService()->critical("$msg : " . $exception->getMessage());
                        return $this->jsonError($msg);
                    }
                }
                else {
                } else {
                    try {
                        $out = $this->getOrganizationService()->getOrganizationsRolesAndUsage();
                        return $this->ajaxResponse($out);
@@ -1515,8 +1536,7 @@ class AdministrationController extends AbstractOscarController implements UsePro
                            $this->getLoggerService()->critical("Action $datas->action inconnue !");
                            return $this->getResponseNotImplemented();
                    }
                }
                else {
                } else {
                    // Contrôle du Role
                    $roleId = trim($datas->get('label'));
                    if ($roleId == "") {
@@ -1539,8 +1559,7 @@ class AdministrationController extends AbstractOscarController implements UsePro
                    return $this->ajaxResponse($role->toArray());
                }
            }
        }
        else {
        } else {
            $method = $this->getHttpXMethod();
            $this->getOscarUserContextService()->check(Privileges::DROIT_ROLEORGA_EDITION);
            $role = $this->getEntityManager()->getRepository(OrganizationRole::class)->find($roleId);
@@ -1737,8 +1756,7 @@ class AdministrationController extends AbstractOscarController implements UsePro
            'declarersRelanceJour1' => $this->getOscarConfigurationService()->getDeclarersRelanceJour1(),
            'declarersRelance2' => $this->getOscarConfigurationService()->getDeclarersRelance2(),
            'declarersRelanceJour2' => $this->getOscarConfigurationService()->getDeclarersRelanceJour2(),
            'declarersRelanceConflitMessage' => $this->getOscarConfigurationService(
            )->getDeclarersRelanceConflitMessage(),
            'declarersRelanceConflitMessage' => $this->getOscarConfigurationService()->getDeclarersRelanceConflitMessage(),
            'declarersRelanceConflitJour' => $this->getOscarConfigurationService()->getDeclarersRelanceConflitJour(),
            /**  **/
            'validatorsRelance1' => $this->getOscarConfigurationService()->getValidatorsRelance1(),
@@ -1821,8 +1839,7 @@ class AdministrationController extends AbstractOscarController implements UsePro
            }

            return [];
        }
        elseif ($method == "POST") {
        } elseif ($method == "POST") {
            // Enregistrement des associations TYPE OSCAR <> TYPE PCRU
            $datas = $this->getJsonPosted();
            $idTypeActivity = $datas['oscar_id'];
@@ -1834,8 +1851,7 @@ class AdministrationController extends AbstractOscarController implements UsePro
                $this->getLoggerService()->error($e->getMessage());
                return $this->getResponseInternalError($e->getMessage());
            }
        }
        else {
        } else {
            return $this->getResponseBadRequest("La méthode de transmission ne fonctionne pas");
        }
    }
+118 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ use Doctrine\ORM\NoResultException;
use Doctrine\ORM\QueryBuilder;
use Oscar\Exception\OscarException;
use Oscar\Formatter\OscarFormatterConst;
use Oscar\Provider\Privileges;

class RoleRepository extends EntityRepository
{
@@ -350,4 +351,121 @@ class RoleRepository extends EntityRepository

        return $results;
    }

    /**
     * Permute l'état d'un privilège actif/inactif.
     *
     * @param int $roleId
     * @param int $privilegeId
     * @return void
     * @throws NoResultException
     * @throws \Doctrine\ORM\NonUniqueResultException
     */
    public function updateToggleRolePrivilege(int $roleId, int $privilegeId): void
    {
        /** @var Privilege $privilege */
        $privilege = $this->getEntityManager()->createQueryBuilder()
            ->select('p')->from(Privilege::class, 'p')
            ->where('p.id = :privilegeId')
            ->setParameter('privilegeId', $privilegeId)
            ->getQuery()
            ->getSingleResult();

        /** @var Role $role */
        $role = $this->getEntityManager()->createQueryBuilder()
            ->select('r')->from(Role::class, 'r')
            ->where('r.id = :roleId')
            ->setParameter('roleId', $roleId)
            ->getQuery()
            ->getSingleResult();

        if ($privilege->hasRole($role)) {
            $privilege->removeRole($role);
        } else {
            $privilege->addRole($role);
        }

        $this->getEntityManager()->flush();
    }

    public function updateCopyPrivilege(int $from, int $to): void
    {
        /** @var Role $role */
        $roleTo = $this->getEntityManager()->createQueryBuilder()
            ->select('r')->from(Role::class, 'r')
            ->where('r.id = :roleId')
            ->setParameter('roleId', $to)
            ->getQuery()
            ->getSingleResult();

        if ($roleTo->getRoleId() === "Administrateur") {
            throw new OscarException("Le rôle Administrateur doit être géré manuellement");
        }

        /** @var Role $role */
        $roleFrom = $this->getEntityManager()->createQueryBuilder()
            ->select('r')->from(Role::class, 'r')
            ->where('r.id = :roleId')
            ->setParameter('roleId', $from)
            ->getQuery()
            ->getSingleResult();

        foreach ($roleTo->getPrivileges() as $privilege) {
            $privilege->removeRole($roleTo);
        }

        /** @var Privilege $privilege */
        foreach ($roleFrom->getPrivileges() as $privilege) {
            $privilege->addRole($roleTo);
        }

        $this->getEntityManager()->flush();
    }

    public function updateRole(array $datas): void
    {
        // Contrôle des données
        $id = $datas["id"];
        $spot = $datas["spot"];
        $ldapFilter = $datas["ldapFilter"];
        $description = $datas["description"];
        $principal = $datas["principal"];

        $roleId = $datas['roleId'];
        if (!$roleId) {
            throw new OscarException(_("Un libelle pour le rôle est requis"));
        }

        $exist = $this->getEntityManager()->createQueryBuilder()
            ->select('r')->from(Role::class, 'r')
            ->where('r.roleId = :roleId')
            ->setParameter('roleId', $roleId)
            ->getQuery()
            ->getResult();

        if ($exist && $exist[0]->getId() !== $id) {
            throw new OscarException(_("Le rôle '$roleId' existe déjà"));
        }

        if ($datas['id']) {
            /** @var Role $role */
            $role = $this->getEntityManager()->createQueryBuilder()
                ->select('r')->from(Role::class, 'r')
                ->where('r.id = :roleId')
                ->setParameter('roleId', $datas['id'])
                ->getQuery()
                ->getSingleResult();
        } else {
            $role = new Role();
            $this->getEntityManager()->persist($role);
        }

        $role->setRoleId($roleId);
        $role->setDescription($description);
        $role->setSpot($spot);
        $role->setLdapFilter($ldapFilter);
        $role->setPrincipal($principal);

        $this->getEntityManager()->flush();
    }
}
Loading