Commit 72520d57 authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

- Ajout d'un onglet "Documents générés"

- Fix erreur d'édition
- Documents privés (dans un onglet) : ok
parent c70684c0
Loading
Loading
Loading
Loading
Loading
+32 −15
Original line number Diff line number Diff line
@@ -194,8 +194,28 @@
          {{ tab.label }}
          <sup class="label label-default">{{ tab.total }}</sup>
        </div>
        <div class="tab"  :class="{'selected': displayComputed }" @click.prevent="handlerSelectTab('computed')">
          Documents générés
        </div>
      </div>

      <div class="tab-content" v-show="displayComputed">
        <article class="card xs" v-for="doc in computedDocuments" :key="doc.key">
          <div class="">
            <i class="picto icon-doc"></i>
            <strong>{{doc.label}}</strong>
            <small class="text-light">&nbsp;
              (Document généré automatiquement)
            </small>
          </div>
          <nav class="text-right show-over">
            <a class="btn btn-default btn-xs" :href="doc.url">
              <i class="icon-upload-outline"></i>
              Télécharger
            </a>
          </nav>
        </article>
      </div>
      <div class="tab-content" v-for="tab in packedDocuments" v-show="selectedTabId === tab.id">
        <nav v-if="tab.manage" class="text-right">
          <button v-on:click="handlerUploadNewDoc(tab.id)" class="btn btn-xs btn-default" v-if="tab.manage">
@@ -308,7 +328,8 @@ export default {
    url: {required: true},
    documentTypes: {required: true},
    urlDocumentType: {required: true},
    moment: {require: true}
    moment: {require: true},
    computedDocuments: { requires: false, default: [] }
  },

  data() {
@@ -441,6 +462,7 @@ export default {

    // Modification d'un document
    handlerEdit(document) {
      console.log(JSON.parse(JSON.stringify(document)));
      let valueTabDocument = document.tabDocument;
      if (valueTabDocument === null || valueTabDocument === undefined || valueTabDocument.trim === ''){
        valueTabDocument = PRIVATE;
@@ -515,20 +537,8 @@ export default {
      document.persons.forEach(p => {
        this.persons.push(p);
      })
      // initialise objet de base
      this.uploadNewDocData.init = true;
      // Affectation valeur par défaut champ fichier lié au contexte de l'onglet choisi (tab)
      this.fileToDownload = null;
      // Tab choisis pour upload document (TabId est égal id onglet)
      /**
      this.uploadDoc = true;
      //Hydratation de l'url de soumission complétée (propre à cet objet)
      this.uploadNewDocData.baseUrlUpload =  urlReupload;
      this.selectedIdTypeDocument = typeId;
//tab.id, doc.urlReupload, doc.category.id,
      //Datas communes sous traite à une méthode commune (méthode "privée" nb : pas possible en JS)
      this.initUploadDatas(tabId, typeId);
       ****/
    },

    /**
@@ -747,8 +757,15 @@ export default {
    },

    handlerSelectTab(tab){
      if( tab == "computed" ){
        this.displayComputed = true;
        this.selectedTab = null;
        this.selectedTabId = null;
      } else {
        this.displayComputed = false;
        this.selectedTab = tab;
        this.selectedTabId = tab.id;
      }
    },

    // Recup datas Docs
+46 −88
Original line number Diff line number Diff line
@@ -189,38 +189,52 @@ class ContractDocumentController extends AbstractOscarController implements UseS
     * @return JsonModel
     * @throws OscarException|\HttpException
     */
    public function changeTypeAction(): JsonModel
    public function changeTypeAction()
    {
        /** @var Request $request */
        $request = $this->getRequest();
        if ($request->isPost()) {
            // Récup document


            $document = $this->getContractDocumentService()->getDocument($request->getPost('documentId'));

            if( !($this->getOscarUserContextService()->getAccessDocument($document)['write'] === true) ){
                return $this->getResponseUnauthorized("Vous ne pouvez pas modifier ce document");
            }

            $type = $this->getEntityManager()->getRepository(TypeDocument::class)->find($request->getPost('type'));
            if (!$type) {
                $this->getResponseBadRequest("Type de document invalide");
            // Gestion de l'onglet
            $tabDest = $document->getTabDocument();
            $tabDestId = intval($request->getPost()->get('tabDocument'));
            if( $tabDestId ){
                $tabDest = $this->getContractDocumentService()->getContractTabDocument($tabDestId);
                if( $tabDestId != $document->getTabDocument()->getId() ){
                    // On regarde si on a le droit d'accès à l'onglet
                    if( $this->getOscarUserContextService()->getAccessTabDocument($tabDest)['write'] === true ){
                        $document->setTabDocument($tabDest);
                    } else {
                        return $this->getResponseUnauthorized("Vous n'avez pas accès à l'onglet de destination");
                    }
            $privateDocument = $request->getPost('private');
            $idsPersons = (trim($request->getPost('persons')) !== "") ? explode(",", $request->getPost('persons')) : [];
            // Passage du doc en non privé ou else -> passage en privé
            if (false === boolval($privateDocument)) {
                $tabDocument = $this->getEntityManager()->getRepository(TabDocument::class)->find(
                    $request->getPost('tabDocument')
                );
                $succesManageDocuments = $this->manageDocsInTab($document, $idsPersons, $tabDocument, $type, false);
                if (false === $succesManageDocuments) {
                    $this->getResponseBadRequest("La gestion des documents associés a échouée !");
                }
            } else {
                $succesManageDocuments = $this->manageDocsInTab($document, $idsPersons, null, $type, true);
                if (false === $succesManageDocuments) {
                    $this->getResponseBadRequest("La gestion des documents associés a échouée !");
            }

            // Type de document
            $type = $this->getContractDocumentService()->getContractDocumentType($request->getPost('type'));
            if (!$type) {
                return $this->getResponseBadRequest("Type de document invalide");
            }

            // Privé
            $privateDocument = (bool) $request->getPost('private', false);

            // Personnes
            $idsPersons = (trim($request->getPost('persons')) !== "") ? explode(",", $request->getPost('persons')) : [];

            // Traitement
            $succesManageDocuments = $this->manageDocsInTab($document, $idsPersons, $tabDest, $type, $privateDocument);
            if( !$succesManageDocuments ){
                return $this->getResponseBadRequest("Impossible de modifier le document");
            }

            return new JsonModel(['response' => 'ok']);
        }
        throw new \HttpException();
@@ -377,76 +391,23 @@ class ContractDocumentController extends AbstractOscarController implements UseS
        $pathDocumentsConfig = $this->getOscarConfigurationService()->getDocumentDropLocation();

        // 1 : On va chercher toutes les versions d'un même document
        $em = $this->getEntityManager()->getRepository(ContractDocument::class);
        $documents = $em->createQueryBuilder('d')->select('d');
        // Params pour la requete de base
        $paramsQuery = [
            'fileName' => $document->getFileName(),
            'grant' => $activity,
        ];
        if (true === $document->isPrivate()) {
            // Documents privés
            $paramsQuery ['private'] = true;
            $documents->where(
                'd.fileName = :fileName 
                AND d.grant = :grant
                AND d.private = :private'
        $documents = $this->getContractDocumentService()->getContractDocumentRepository()->getDocumentsForFilenameAndActivity(
            $document
        );
        } else {
            if (!is_null($document->getTabDocument())) {
                $paramsQuery ['tabDocument'] = $document->getTabDocument();
                $documents->where(
                    'd.fileName = :fileName 
                    AND d.grant = :grant 
                    AND d.tabDocument = :tabDocument'
                );
            } else {
                // Document version antérieur feature onglets de documents (non classés)
                $paramsQuery ['private'] = false;
                $documents->where(
                    'd.fileName = :fileName 
                    AND d.grant = :grant
                    AND d.private = :private'
                );
            }
        }
        $result = $documents->setParameters($paramsQuery)->getQuery()->getResult();



        $destinationFolder = null;
        //2 : On gère le déplacement de doc et la privatisation
        /** @var ContractDocument $doc */
        foreach ($result as $doc) {
        foreach ($documents as $doc) {
            //Passage d'un document en privée
            if (true === $docToPrivate) {
                $pathSource = (!is_null($doc->getTabDocument())) ? $pathDocumentsConfig . 'tab_' . $doc->getTabDocument(
                    )->getId() . '/' . $doc->getPath() : $pathDocumentsConfig;
                $pathDestination = $pathDocumentsConfig . 'private/' . $doc->getPath();
                $destinationFolder = $pathDocumentsConfig . 'private';
                $this->createFolder($destinationFolder);
                //On supprime les tabDocuments
                $doc->setTabDocument(null);
                //On rend le document privé
                $doc->setPrivate(true);
            } else {
                if ($doc->isPrivate()) {
                    $pathSource = $pathDocumentsConfig . 'private/' . $doc->getPath();
                } else {
                    $pathSource = (!is_null(
                        $doc->getTabDocument()
                    )) ? $pathDocumentsConfig . 'tab_' . $doc->getTabDocument()->getId() . '/' . $doc->getPath(
                        ) : $pathDocumentsConfig . '/' . $doc->getPath();
                }
                $pathDestination = $pathDocumentsConfig . 'tab_' . $tabDocument->getId() . '/' . $doc->getPath();
                $destinationFolder = $pathDocumentsConfig . 'tab_' . $tabDocument->getId();
                $this->createFolder($destinationFolder);
                //Passage d'un document dans un onglet
            $doc->setPrivate($docToPrivate);
            $doc->setTabDocument($tabDocument);
                $doc->setPrivate(false);
            }

            //on réinitialise les personnes
            foreach ($doc->getPersons() as $person) {
                $doc->removePerson($person);
            }
            $doc->getPersons()->clear();

            //On ajoute les personnes demandées
            if (count($persons) > 0) {
                foreach ($persons as $idPerson) {
@@ -457,18 +418,15 @@ class ContractDocumentController extends AbstractOscarController implements UseS
            //Ajoute l'utilisateur courant
            $doc->addPerson($this->getCurrentPerson());
            $doc->setTypeDocument($type);
            $this->getEntityManager()->persist($doc);
            $this->getEntityManager()->flush();
            //Déplacement des fichiers dans le bon répertoire
            rename($pathSource, $pathDestination);
        }
        $this->getEntityManager()->flush();

        $this->getActivityLogService()->addUserInfo(
            sprintf("a modifié le document '%s' dans l'activité %s.", $document, $document->getGrant()->log()),
            'Activity',
            $activity->getId()
        );
        return $isSuccess;
        return true;
    }

    /**
+5 −2
Original line number Diff line number Diff line
@@ -119,7 +119,7 @@ class ContractDocumentService implements UseOscarConfigurationService, UseEntity
     */
    public function deleteDocument(ContractDocument $contractDocument): void
    {
        $this->getLoggerService()->debug("# Suppression du document '$contractDocument'");
        $this->getLoggerService()->debug("# Suppression du document '$contractDocument'...");

        // Nom du document
        $documentName = $contractDocument->getFileName();
@@ -127,9 +127,12 @@ class ContractDocumentService implements UseOscarConfigurationService, UseEntity

        // Path document pour déplacement
        $documentLocation = $this->getOscarConfigurationService()->getDocumentDropLocation();
        $this->getLoggerService()->debug(" - Dossier : " . $documentLocation);

        // Récupération du document et des ces différentes versions
        $documents = $this->getContractDocumentRepository()->getDocumentsForFilenameAndActivity($contractDocument);
        $this->getLoggerService()->debug(" - Le documents et ces versions implique " . count($documents) . " document(s)");


        if (count($documents) == 0) {
            throw new OscarException("Ce document n'existe plus");
@@ -219,7 +222,7 @@ class ContractDocumentService implements UseOscarConfigurationService, UseEntity

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// REPOSITORY
    protected function getContractDocumentRepository(): ContractDocumentRepository
    public function getContractDocumentRepository(): ContractDocumentRepository
    {
        return $this->getEntityManager()->getRepository(ContractDocument::class);
    }
+9 −0
Original line number Diff line number Diff line
@@ -1506,6 +1506,15 @@ class OscarUserContext implements UseOscarConfigurationService, UseLoggerService
            if ($ressource) {
                // $this->getLoggerService()->info("hasPrivilege $privilege dans $ressource non global");
                $privileges = $this->getPrivileges($ressource);

                if( $privilege == Privileges::PROJECT_DOCUMENT_SHOW && $ressource instanceof Project ){
                    foreach ($ressource->getActivities() as $activity ){
                        if( $this->getAccessActivityDocument($activity)['read'] ){
                            return true;
                        }
                    }
                }

                if ($privilege == Privileges::ACTIVITY_DOCUMENT_SHOW || $privilege == Privileges::ACTIVITY_DOCUMENT_MANAGE) {
                    if ($ressource instanceof Activity) {
                        $access = $this->getAccessActivityDocument($ressource);
+2 −2
Original line number Diff line number Diff line
@@ -113,7 +113,7 @@ class PCRUService implements UseLoggerService, UseOscarConfigurationService, Use
            $organization->getSiret(),
            $organization->getTvaintra(),
            $organization->getDuns(),
            "",
            "1",
            $organization->getStreet1(),
            $organization->getZipCode(),
            $organization->getCity(),
@@ -457,6 +457,7 @@ class PCRUService implements UseLoggerService, UseOscarConfigurationService, Use
            throw new OscarException("Le module PCR n'est pas activé");
        }


        // Récupération des données
        $pcruInfos = $this->getPcruInfosActivity($activity);
        $preview = false;
@@ -476,7 +477,6 @@ class PCRUService implements UseLoggerService, UseOscarConfigurationService, Use

        $pcruValidation = new PCRUValidator($this->getOscarConfigurationService(), $this->getEntityManager());
        $validation = $pcruValidation->validate($pcruInfos);

        $documentPath = "";
        if( $pcruInfos->getDocumentId() ){
            $documentPath = $this->getDocumentPath($pcruInfos->getDocumentId());
Loading