Commit 3b0b217d authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

Système de migration des clefs pour l'uniformisation des numérotations personnalisées

parent 293162e8
Loading
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -197,8 +197,6 @@ import OrganizationAutoCompleter from "./components/OrganizationAutoCompleter";
import PersonAutoCompleter from "./components/PersonAutoCompleter";
import Datepicker from "./components/Datepicker";

console.log("FOO");

export default {
  components: {
    organizationselector: OrganizationAutoCompleter,
+106 −0
Original line number Diff line number Diff line
<template>
  <div>
    <button @click="handlerDisplayUi()" class="btn btn-primary">
      Migration des numérotations
      TEST
    </button>
    <div class="overlay" v-if="display">
      <div class="overlay-content">
        <h3 v-if="message">
          {{ message }}
        </h3>
        <article class="row" v-else>
          <div class="col-md-12">
            <h3>Outils de migration de clef de numérotation</h3>
            <p class="alert alert-info">
              Cette écran permet de mettre à jour automatiquement les activités utilisant certaines clefs vers une des clefs déclarée dans la liste des clefs configurer. <strong>Les valeurs sont concervées.</strong>
            </p>
          </div>
          <div class="col-md-6">
            Déplacer la clef :
            <select name="from" v-model="formData.from">
              <option value="">Selectionnez un clef à déplacer</option>
              <option v-for="k in unreferencedSorted" :value="k">{{ k }}</option>
            </select>
          </div>
          <div class="col-md-6">
            vers la clef :
            <select name="to" id="" v-model="formData.to">
              <option value="">Choisir une clef</option>
              <option v-for="dest in referenced" :value="dest">{{ dest }}</option>
            </select>
          </div>
        </article>
        <hr>
        <nav class="buttons">
          <button @click="handlerHideUi()" class="btn btn-danger">
            Fermer
          </button>
          <button v-if="!message" @click="handlerSave()"
                  class="btn btn-success"
                  :class="{'disabled': !formData.from || !formData.to }">
            Enregistrer
          </button>
        </nav>
      </div>
    </div>
  </div>
</template>
<script>
// node node_modules/.bin/vue-cli-service build --name NumberMigrate --dest ../public/js/oscar/dist --no-clean --formats umd,umd-min --target lib src/NumberMigrate.vue
export default {
  data(){
    return {
      display: false,
      formData: {
        from: "",
        to: ""
      },
      message: "",
      unreferenced: [],
      referenced: []
    }
  },
  computed: {
    unreferencedSorted(){
      return this.unreferenced.sort();
    }
  },
  methods:{
    handlerSave(){
      let form = new FormData();
      form.append("from", this.formData.from);
      form.append("to", this.formData.to);
      this.$http.post('?action=migrate', form).then(
          ok => {
            this.$emit("migrate");
            this.message = ok.data;
          },
          ko => {
            this.message = ko.data;
          }
      )
    },

    handlerDisplayUi(){
      this.display = true;
      this.$http.get('?action=migrate').then(
          ok => {
            console.log('OK', ok);
            this.unreferenced = ok.data.unreferenced;
            this.referenced = ok.data.referenced;
          },
          ko => {
            this.message = ko.data;
          }
      )
    },
    handlerHideUi(){
      this.display = false;
      if( this.message ){
        document.location.reload();
      }
    }
  }
}
</script>
 No newline at end of file
+77 −46
Original line number Diff line number Diff line
@@ -407,11 +407,39 @@ class AdministrationController extends AbstractOscarController implements UsePro
    {
        $this->getOscarUserContextService()->check(Privileges::MAINTENANCE_NUMEROTATION_MANAGE);


        $invalidActivityNumbers = $this->getProjectGrantService()->getActivitiesWithUnreferencedNumbers();
        $infosUnreferenced = $this->getProjectGrantService()->getActivitiesWithUnreferencedNumbers();
        $invalidActivityNumbers = $infosUnreferenced['activities'];
        $usedKey = $this->getOscarConfigurationService()->getNumerotationKeys();
        $unreferenced = $infosUnreferenced['keys'];

        if ($this->isAjax()) {
            $action = $this->params()->fromQuery('action');
            $method = $this->getHttpXMethod();

            if( $action == 'migrate' ){
                switch ($method) {
                    case 'GET':
                        return $this->jsonOutput([
                             "referenced" => $usedKey,
                             "unreferenced" => $unreferenced
                            ]);
                        break;

                    case 'POST':
                        try {
                            $from = $this->params()->fromPost('from');
                            $to = $this->params()->fromPost('to');
                            $totalChanged = $this->getActivityService()->administrationMoveKey($from, $to);
                            return $this->getResponseOk("$totalChanged activité(s) mise à jour");
                        } catch (\Exception $e) {
                            return $this->getResponseInternalError($e->getMessage());
                        }
                        break;

                    default:
                        return $this->getResponseInternalError();
                }
            } else {
                switch ($method) {
                    case 'GET':
                        $numerotation = $this->getOscarConfigurationService()->getEditableConfKey('numerotation', []);
@@ -467,8 +495,11 @@ class AdministrationController extends AbstractOscarController implements UsePro
                        return $this->getResponseInternalError();
                }
            }
        }
        return [
            "invalidActivityNumbers" => $invalidActivityNumbers
            "invalidActivityNumbers" => $invalidActivityNumbers,
            "referenced" => $usedKey,
            "unreferenced" => $unreferenced
        ];
    }

+7 −0
Original line number Diff line number Diff line
@@ -20,6 +20,13 @@ use Oscar\Utils\DateTimeUtils;
class ActivityRepository extends EntityRepository
{

    public function getActivitiesWithNumber( string $key ) :array {
        $len = strlen($key);
        $queryBuilder = $this->createQueryBuilder('a')
            ->where("a.numbers LIKE '%s:$len:\"".$key."\"%'");
        return $queryBuilder->getQuery()->getResult();
    }

    public function getDistinctPFI() :array
    {
        $queryBuilder = $this->createQueryBuilder('a')
+29 −2
Original line number Diff line number Diff line
@@ -1173,13 +1173,16 @@ class ProjectGrantService implements UseGearmanJobLauncherService, UseOscarConfi

        // On isole les activités ayant des clefs de numérotation "Hors configuration"
        $activities = [];
        $keys = [];

        /** @var Activity $activity */
        foreach ($query->getQuery()->getResult() as $activity) {
            $hasUnknow = false;
            foreach (array_keys($activity->getNumbers()) as $key) {
                if (!in_array($key, $authorisedKeys)) {
                    $this->getLoggerService()->debug("$key n'est pas référencé");
                    if( !in_array($key, $keys) ){
                        $keys[] = $key;
                    }
                    $hasUnknow = true;
                }
            }
@@ -1188,7 +1191,31 @@ class ProjectGrantService implements UseGearmanJobLauncherService, UseOscarConfi
            }
        }

        return $activities;
        return [
            'activities' => $activities,
            'keys' => $keys
        ];
    }

    /**
     * Renomage des clefs pour les numérotations personnalisées;
     *
     * @param $from
     * @param $to
     */
    public function administrationMoveKey($from, $to) :int
    {
       $activities = $this->getActivityRepository()->getActivitiesWithNumber($from);
       $out = [];
       /** @var Activity $activity */
        foreach ($activities as $activity) {
           $value = $activity->getNumber($from);
           $activity->removeNumber($from);
           $activity->addNumber($to, $value);
           $out[] = $activity->getId();
           $this->getEntityManager()->flush($activity);
       }
        return count($out);
    }

    public function getPaymentsByActivityId(array $idsActivity, $organizations = null)
Loading