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

- Processus de confirmation avant envoi des données vers PCRU depuis l'écran...

- Processus de confirmation avant envoi des données vers PCRU depuis l'écran de synthèse PCRU de l'activité
- Ecran de contrôle pour voir l'état des envois PCRU (Administration)
parent 108225a0
Loading
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -2843,11 +2843,17 @@ class ProjectGrantController extends AbstractOscarController implements UseNotif
    {
        /** @var Activity $activity */
        $activity = $this->getActivityFromRoute();
        $method = $this->getHttpXMethod();

        if( $method == 'POST' ){
            $this->getProjectGrantService()->getPCRUService()->activateActivity($activity);
            return $this->redirect()->toRoute('contract/pcru-infos');
        }

        // Droit d'accès
        $this->getOscarUserContextService()->check(Privileges::ACTIVITY_PCRU, $activity);

        return $this->getPCRUService()->getPreview($activity);
        return $this->getProjectGrantService()->getPCRUService()->getPreview($activity);
    }

    public function mergeAction()
+54 −0
Original line number Diff line number Diff line
@@ -201,6 +201,22 @@ class ActivityPcruInfos
    const STATUS_ERROR_REMOTE = "error_remote"; // Erreur (retour PCRU)
    const STATUS_DONE = "done"; // Envoyé (OK)

    static $status_str = null;
    public static function statusStr( $status )
    {
            if( self::$status_str == null ){
                self::$status_str = [
                    self::STATUS_PREVIEW => "Aperçu",
                    self::STATUS_ERROR_DATA => "ERREUR (Oscar)",
                    self::STATUS_SEND_READY => "Prêt pour l'envoi",
                    self::STATUS_SEND_PENDING => "Envoyé",
                    self::STATUS_ERROR_REMOTE => "ERREUR (PCRU)",
                    self::STATUS_DONE => "OK",
                ];
            }
            return self::$status_str[$status];
    }

    /**
     * @ORM\Column(type="string", length=20, nullable=true)
     */
@@ -424,10 +440,34 @@ class ActivityPcruInfos
            $out['document_signed'] = self::VALIDATION_VALID;
        }

        foreach ($out as $champ=>$state) {
            if( $champ == 'contract_signed') continue;
            if( $state == self::VALIDATION_ERROR ){
                $this->status = self::STATUS_ERROR_DATA;
                $this->addError($this->getMessage($champ));
            }
        }


        return $out;
    }

    static private $messages;

    protected function getMessage( $champ )
    {
        if( self::$messages === null ) {
            self::$messages = [];
            self::$messages['SourceFinancement'] = "La source de financement est manquante, vous pouvez la renseigner depuis la fiche activité";
        }

        if( array_key_exists($champ, self::$messages) ){
            return self::$messages[$champ];
        } else {
            return sprintf("Le champ %s n'est pas renseigné.", $champ);
        }
    }

    /**
     * @return mixed
     */
@@ -1039,6 +1079,14 @@ class ActivityPcruInfos
        return $this->status;
    }

    /**
     * @return string
     */
    public function getStatusStr(): string
    {
        return self::statusStr($this->getStatus());
    }

    /**
     * @param string $status
     */
@@ -1056,6 +1104,12 @@ class ActivityPcruInfos
        return $this->error;
    }

    public function addError( $errorMessage ) :self
    {
        $this->error[] = $errorMessage;
        return $this;
    }

    /**
     * @param array $error
     */
+9 −9
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@ class ActivityPcruInfoFromActivityFactory
        // Récupération des laboratoires
        $structures = $activity->getOrganizationsWithRole($roleStructureToFind);
        if( count($structures) == 0 ){
            $errors[] = "Aucune structure $roleStructureToFind pour cette activité.";
            $activityPcruInfos->addError("Aucune structure $roleStructureToFind pour cette activité.");
        }


@@ -70,7 +70,7 @@ class ActivityPcruInfoFromActivityFactory
        }

        if( $codeUniteLabintel == "" ){
            $errors[] = "Le $roleStructureToFind (".implode(', ', $organizationsParsed).") n'a pas de code LABINTEL";
            $activityPcruInfos->addError("Le $roleStructureToFind (".implode(', ', $organizationsParsed).") n'a pas de code LABINTEL");
        }

        // Recherche automatique du responsable scientifique
@@ -84,7 +84,8 @@ class ActivityPcruInfoFromActivityFactory
        }

        // Document signé
        $typeDocumentSigne = "Contrat Version Définitive Signée";
        $typeDocumentSigne = $this->oscarConfigurationService
            ->getOptionalConfiguration('pcru_contrat_type', "Contrat Version Définitive Signée");;
        $documentSigned = null;

        /** @var ContractDocument $document */
@@ -92,13 +93,17 @@ class ActivityPcruInfoFromActivityFactory
            if( $document->getTypeDocument()->getLabel() == $typeDocumentSigne ){
                // Test sur les versions
                if(  $documentSigned != null ){
                    $errors[] = "Il y'a plusieurs $typeDocumentSigne sur cette activité";
                    $activityPcruInfos->addError("Il y'a plusieurs $typeDocumentSigne sur cette activité");
                } else {
                    $documentSigned = $document->getPath();
                }
            }
        }

        if( !$documentSigned ){
            $activityPcruInfos->addError("Oscar n'a pas trouvé de document '$typeDocumentSigne' à utiliser pour la soumission PCRU.");
        }

        /** @var PcruTypeContractRepository $pcruContractTypeRepository */
        $pcruContractTypeRepository = $this->entityManager->getRepository(PcruTypeContract::class);

@@ -123,11 +128,6 @@ class ActivityPcruInfoFromActivityFactory
            ->setDateDerniereSignature($activity->getDateSigned())
            ->setReference($activity->getOscarNum());

        if( count($errors) ){
            $activityPcruInfos->setError($errors)
                ->setStatus(ActivityPcruInfos::STATUS_ERROR_DATA);
        }

        return $activityPcruInfos;
    }

+18 −0
Original line number Diff line number Diff line
@@ -49,6 +49,24 @@ class PCRUService implements UseLoggerService, UseOscarConfigurationService, Use
        return $pcruRepository->findAll();
    }

    public function activateActivity( Activity $activity, $json = false ) :void
    {
        if( !$this->getOscarConfigurationService()->getPcruEnabled() ){
            throw new OscarException("Le module PCR n'est pas activé");
        }

        $factory = new ActivityPcruInfoFromActivityFactory($this->getOscarConfigurationService(), $this->getEntityManager());
        $pcruInfos = $factory->createNew($activity);
        $validation = $pcruInfos->validation();
        if( count($pcruInfos->getError()) > 0 ){
            throw new OscarException("Impossible d'activer PCRU pour cette activité, des données sont manquantes/erronées");
        }
        $pcruInfos->setStatus(ActivityPcruInfos::STATUS_SEND_READY);
        $this->getEntityManager()->persist($pcruInfos);
        $this->getEntityManager()->flush($pcruInfos);
    }


    public function getPreview( Activity $activity, $json = false ) :array
    {
        if( !$this->getOscarConfigurationService()->getPcruEnabled() ){
+46 −2
Original line number Diff line number Diff line
@@ -2,10 +2,54 @@
<link rel="stylesheet" href="/js/certic-ui-components/build/DatepickerField.css">
<div class="container">
    <header>
        <h1>Informations PCRU</h1>
        <h3><?= $activity ?></h3>
        <h3>Informations PCRU</h3>
        <h1><?= $activity ?></h1>
    </header>

    <?php if(count($errors)): ?>
        <div class="alert alert-danger">
            <p>Cette activité ne peut pas être envoyée à PCRU, certaines informations sont manquantes / erronées : </p>
            <ul>
                <?php foreach ($errors as $error): ?>
                    <li><?= $error ?></li>
                <?php endforeach; ?>
            </ul>
        </div>
    <?php else: ?>
        <div class="alert alert-success">
            Toutes les informations requises semblent correctes. Vous pouvez déclencher l'envois des informations à PCRU.
            <form action="" method="post">
                <button type="submit" class="btn btn-success">
                    <i class="icon-paper-plane"></i>
                    Activer l'envoi PCRU
                </button>
            </form>
        </div>
    <?php endif; ?>

    <nav>
        <a href="<?= $this->url('contract/show', ['id' => $activity->getId()]) ?>" class="btn btn-default btn-sm">
            <i class="icon-cube"></i>
            Revenir sur la fiche activité</a>

        <?php if($this->grant(\Oscar\Provider\Privileges::ACTIVITY_EDIT) ): ?>
        <a href="<?= $this->url('contract/edit', ['id' => $activity->getId()]) ?>" class="btn btn-default btn-sm">
            <i class="icon-pencil"></i>
            Modifier la fiche activité</a>
        <?php endif; ?>
    </nav>

    <?php if(count($errors)): ?>
    <div class="alert alert-danger">
        <p>Cette activité ne peut pas être envoyée à PCRU, certaines informations sont manquantes / erronées : </p>
        <ul>
            <?php foreach ($errors as $error): ?>
            <li><?= $error ?></li>
            <?php endforeach; ?>
        </ul>
    </div>
    <?php endif; ?>

    <?php if( !$documentPath ): ?>
    <div class="alert alert-danger">
        <i class="icon-attention"></i> Pas de document signé pour cette activité
Loading