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

Refonte du stsème de paramètres (afin de faciliter l'ajout de futur paramètres)

parent 203546e2
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -33,6 +33,26 @@
      "type": "boolean",
      "default": true
    },
    {
      "key": "activity_form_person_roles",
      "label": "Roles personnes visibles dans la fiche",
      "description": "Liste des roles personnes disponibles sur la fiche activite.",
      "category": "Activites de recherche",
      "type": "list",
      "multiple": true,
      "options_source": "activity_person_roles",
      "default": []
    },
    {
      "key": "activity_form_organization_roles",
      "label": "Roles organisations visibles dans la fiche",
      "description": "Liste des roles organisations disponibles sur la fiche activite.",
      "category": "Activites de recherche",
      "type": "list",
      "multiple": true,
      "options_source": "activity_organization_roles",
      "default": []
    },
    {
      "key": "spents_account_filter",
      "label": "Comptes exclus (depenses)",
+138 −4
Original line number Diff line number Diff line
@@ -728,14 +728,13 @@ class AdministrationController extends AbstractOscarController implements
            throw new OscarException("Schema des parametres invalide (parameters)");
        }

        $themes = $this->getOscarConfigurationService()->getConfiguration('themes');

        foreach ($parameters as &$parameter) {
            if (!is_array($parameter)) {
                continue;
            }
            if (($parameter['options_source'] ?? null) === 'themes') {
                $parameter['options'] = array_values($themes);
            $optionsSource = $parameter['options_source'] ?? null;
            if ($optionsSource) {
                $parameter['options'] = $this->getAdministrationParameterOptionsFromSource((string)$optionsSource);
            }
        }

@@ -743,9 +742,28 @@ class AdministrationController extends AbstractOscarController implements
        return $decoded;
    }

    private function getAdministrationParameterOptionsFromSource(string $source): array
    {
        switch ($source) {
            case 'themes':
                return array_values($this->getOscarConfigurationService()->getConfiguration('themes'));

            case 'activity_person_roles':
                return $this->getOscarUserContextService()->getAvailabledRolesPersonActivity();

            case 'activity_organization_roles':
                return $this->getOscarUserContextService()->getAvailabledRolesOrganizationActivity();

            default:
                return [];
        }
    }

    private function getAdministrationParametersCurrentValues(): array
    {
        $organizationRequired = $this->getOscarConfigurationService()->getOrganizationRequired();
        $personRoles = $this->getOscarConfigurationService()->getActivityFormPersonRoles();
        $organizationRoles = $this->getOscarConfigurationService()->getActivityFormOrganizationRoles();

        return [
            OscarConfigurationService::allow_numerotation_custom => $this->getOscarConfigurationService()->getNumerotationEditable(),
@@ -762,9 +780,24 @@ class AdministrationController extends AbstractOscarController implements
            'timesheet_excel' => $this->getOscarConfigurationService()->getTimesheetExcel(),
            'organization_require_type' => boolval($organizationRequired['type'] ?? false),
            'organization_require_country' => boolval($organizationRequired['country'] ?? false),
            OscarConfigurationService::activity_form_person_roles => $this->extractRoleIdsFromConfiguration($personRoles),
            OscarConfigurationService::activity_form_organization_roles => $this->extractRoleIdsFromConfiguration($organizationRoles),
        ];
    }

    private function extractRoleIdsFromConfiguration($value): array
    {
        if (!is_array($value)) {
            return [];
        }

        if (array_key_exists('roleids', $value) && is_array($value['roleids'])) {
            return array_values($value['roleids']);
        }

        return array_values($value);
    }

    private function applyAdministrationParametersValues($inputValues): void
    {
        if (!is_array($inputValues)) {
@@ -821,6 +854,9 @@ class AdministrationController extends AbstractOscarController implements
            case 'select':
                return (string)$value;

            case 'list':
                return $this->castAdministrationParameterListValue($definition, $value);

            case 'text':
            case 'string':
            default:
@@ -828,6 +864,84 @@ class AdministrationController extends AbstractOscarController implements
        }
    }

    private function castAdministrationParameterListValue(array $definition, $value)
    {
        $multiple = boolval($definition['multiple'] ?? false);

        if ($multiple) {
            if (is_array($value) && array_key_exists('roleids', $value) && is_array($value['roleids'])) {
                $value = $value['roleids'];
            }
            $items = is_array($value) ? $value : [$value];
            $out = [];
            foreach ($items as $item) {
                $itemResolved = $this->resolveAdministrationParameterListOptionValue($definition, $item);
                if ($itemResolved !== null) {
                    $out[] = $itemResolved;
                }
            }
            return array_values(array_unique($out, SORT_REGULAR));
        }

        if (is_array($value)) {
            if (array_key_exists('value', $value)) {
                $value = $value['value'];
            } else {
                $value = reset($value);
            }
        }

        return $this->resolveAdministrationParameterListOptionValue($definition, $value);
    }

    private function resolveAdministrationParameterListOptionValue(array $definition, $rawValue)
    {
        if ($rawValue === null || $rawValue === '') {
            return boolval($definition['multiple'] ?? false) ? null : '';
        }

        $allowedValues = $this->getAdministrationParameterAllowedListValues($definition);
        if (count($allowedValues) === 0) {
            return $rawValue;
        }

        foreach ($allowedValues as $allowedValue) {
            if ((string)$allowedValue === (string)$rawValue) {
                return $allowedValue;
            }
        }

        return null;
    }

    private function getAdministrationParameterAllowedListValues(array $definition): array
    {
        $options = $definition['options'] ?? [];
        if (!is_array($options)) {
            return [];
        }

        $isList = array_keys($options) === range(0, count($options) - 1);
        $allowedValues = [];
        foreach ($options as $key => $option) {
            if (is_array($option) && array_key_exists('value', $option)) {
                $allowedValues[] = $option['value'];
                continue;
            }

            if (!$isList && !is_array($option) && !is_object($option)) {
                $allowedValues[] = $key;
                continue;
            }

            if (!is_array($option) && !is_object($option)) {
                $allowedValues[] = $option;
            }
        }

        return $allowedValues;
    }

    private function saveAdministrationParameterValue(string $key, $value): void
    {
        switch ($key) {
@@ -886,6 +1000,26 @@ class AdministrationController extends AbstractOscarController implements
            case 'organization_require_country':
                $this->getOscarConfigurationService()->saveEditableConfKey('organization_require_country', boolval($value));
                return;

            case OscarConfigurationService::activity_form_person_roles:
                $this->getOscarConfigurationService()->saveEditableConfKey(
                    OscarConfigurationService::activity_form_person_roles,
                    [
                        'roleids' => is_array($value) ? array_values($value) : [],
                        'min' => 1,
                    ]
                );
                return;

            case OscarConfigurationService::activity_form_organization_roles:
                $this->getOscarConfigurationService()->saveEditableConfKey(
                    OscarConfigurationService::activity_form_organization_roles,
                    [
                        'roleids' => is_array($value) ? array_values($value) : [],
                        'min' => 1,
                    ]
                );
                return;
        }
    }