Commit d0961d83 authored by Jean-Baptiste Oellers's avatar Jean-Baptiste Oellers
Browse files

Ajout calcul pourcentage

parent 5c370403
Loading
Loading
Loading
Loading
Loading
+1 −0
Changes for module/Oscar/src/Oscar/Controller/PcruController.php: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -265,6 +265,7 @@ class PcruController extends AbstractOscarController implements UseLoggerService
                    $pcruInformations->setDateDebut($a->dateDebut);
                    $pcruInformations->setUtiliserDateFinParDefaut($a->utiliserDateFinParDefaut);
                    $pcruInformations->setDateFin($a->dateFin);
                    $pcruInformations->setUtiliserMontantPercuUniteParDefaut($a->utiliserMontantPercuUniteParDefaut);
                    $pcruInformations->setMontantPercuUnite(NULL);
                    if ($a->montantPercuUnite || $a->montantPercuUnite === 0) {
                        $pcruInformations->setMontantPercuUnite($a->montantPercuUnite);
+24 −0
Changes for module/Oscar/src/Oscar/Entity/ActivityPcruInformations.php: 24 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -251,6 +251,12 @@ class ActivityPcruInformations
     */
    private $dateFin = NULL;

    /**
     * @var bool
     * @ORM\Column(type="boolean", options={"default" : true}, nullable=false)
     */
    private $utiliserMontantPercuUniteParDefaut = true;

    /**
     * @var ?float
     * @ORM\Column(type="decimal", precision=12, scale=2, nullable=true)
@@ -1265,6 +1271,23 @@ class ActivityPcruInformations
        return $this;
    }

    /**
     * @return bool
     */
    public function isUtiliserMontantPercuUniteParDefaut()
    {
        return $this->utiliserMontantPercuUniteParDefaut;
    }

    /**
     * @param bool $utiliserMontantPercuUniteParDefaut
     */
    public function setUtiliserMontantPercuUniteParDefaut(bool $utiliserMontantPercuUniteParDefaut): self
    {
        $this->utiliserMontantPercuUniteParDefaut = $utiliserMontantPercuUniteParDefaut;
        return $this;
    }

    /**
     * @return ?float
     */
@@ -1589,6 +1612,7 @@ class ActivityPcruInformations
        $out['dateDebut'] = $this->getDateDebut();
        $out['utiliserDateFinParDefaut'] = $this->isUtiliserDateFinParDefaut();
        $out['dateFin'] = $this->getDateFin();
        $out['utiliserMontantPercuUniteParDefaut'] = $this->isUtiliserMontantPercuUniteParDefaut();
        $out['montantPercuUnite'] = $this->getMontantPercuUnite();
        $out['contributionFinanceur'] = $this->getContributionFinanceur();
        $out['utiliserMontantTotalParDefaut'] = $this->isUtiliserMontantTotalParDefaut();
+15 −0
Changes for module/Oscar/src/Oscar/Service/PcruInformationParDefaut.php: 15 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -220,6 +220,21 @@ class PcruInformationParDefaut
     */
    public $dateFinErreurs = [];

    /**
     * @var ?string
     */
    public $montantPercuUniteParDefautErreur = NULL;

    /**
     * @var ?float
     */
    public $montantPercuUnite = NULL;

    /**
     * @var array
     */
    public $montantPercuUniteErreurs = [];
    
    /**
     * @var ?float
     */
+37 −1
Changes for module/Oscar/src/Oscar/Service/PcruInformationsService.php: 37 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ class PcruInformationsService implements UseEntityManager, UseOscarConfiguration
        $pcruInformation->duree = $activityPcruInformations->getDuree();
        $pcruInformation->dateDebut = $activityPcruInformations->isUtiliserDateDebutParDefaut() ? $pcruInformationParDefaut->dateDebut : $activityPcruInformations->getDateDebut();
        $pcruInformation->dateFin = $activityPcruInformations->isUtiliserDateFinParDefaut() ? $pcruInformationParDefaut->dateFin : $activityPcruInformations->getDateFin();
        $pcruInformation->montantPercuUnite = $activityPcruInformations->getMontantPercuUnite();
        $pcruInformation->montantPercuUnite = $activityPcruInformations->isUtiliserMontantPercuUniteParDefaut() ? $pcruInformationParDefaut->montantPercuUnite : $activityPcruInformations->getMontantPercuUnite();
        $pcruInformation->contributionFinanceur = $activityPcruInformations->getContributionFinanceur();
        $pcruInformation->montantTotal = $activityPcruInformations->isUtiliserMontantTotalParDefaut() ? $pcruInformationParDefaut->montantTotal : $activityPcruInformations->getMontantTotal();
        $pcruInformation->montantTotalDevise = $activityPcruInformations->isUtiliserMontantTotalParDefaut() ? $pcruInformationParDefaut->montantTotalDevise : 'Euro';
@@ -348,6 +348,10 @@ class PcruInformationsService implements UseEntityManager, UseOscarConfiguration
            $pcruInformationParDefaut->dateFinParDefautErreur = "Impossible de déterminer automatiquement la date de fin car la date de fin du contrat n'est pas renseignée dans la fiche de l'activité.";
        }

        if ($activity->getAmount() != NULL) {
            $pcruInformationParDefaut->montantPercuUnite = round($activity->getAmount() - $this->getValueOrPercentage($activity->getFraisDeGestionPartHebergeur(), $activity->getAmount(), $activity->getFraisDeGestion()) - $this->getValueOrPercentage($activity->getFraisDeGestionPartGestionnaire(), $activity->getAmount(), $activity->getFraisDeGestion()), 2, PHP_ROUND_HALF_UP);
        }

        $pcruInformationParDefaut->montantTotal = $activity->getAmount();
        $pcruInformationParDefaut->montantTotalDevise = $activity->getCurrency()->getLabel();

@@ -364,6 +368,28 @@ class PcruInformationsService implements UseEntityManager, UseOscarConfiguration
        return $pcruInformationParDefaut;
    }
    
    private function getValueOrPercentage(?string $value, ?float $montant, ?string $fraisDeGestion) {
        if (preg_match('/^(\d+\.?\d?\d?)(%)?$/', $value, $matches) !== 1 || count($matches) < 2) {
            return (float)0;
        }
        if (count($matches) <= 2) {
            return (float)$matches[1];
        }
        if ($montant == NULL) {
            $montant = (float)0;
        }
        if (!$this->getOscarConfigurationService()->getFraisDeGestionInclus()) {
            return $montant * (float)$matches[1] / 100;
        }
        if (preg_match('/^(\d+\.?\d?\d?)(%)?$/', $fraisDeGestion, $matches2) !== 1 || count($matches2) < 2) {
            return $montant * (float)$matches[1] / 100;
        }
        if (count($matches2) <= 2) {
            return ($montant - (float)$matches2[1]) * (float)$matches[1] / 100;
        }
        return ($montant / ( 1 + (float)$matches2[1] / 100 )) * (float)$matches[1] / 100;
    }

    /**
     * Validation des informations PCRU d'une activité
     *
@@ -433,6 +459,11 @@ class PcruInformationsService implements UseEntityManager, UseOscarConfiguration
            }
        }

        if ($info->montantPercuUnite == NULL) {
            $info->montantPercuUniteErreurs[] = 'Le champ MontantPercuUnite est obligatoire et doit être défini';
        } else if ($this->aPlusDeDeuxDecimales($info->montantPercuUnite)) {
            $info->montantPercuUniteErreurs[] = 'Le champ MontantPercuUnite ne doit pas avoir plus de deux chiffres après la virgule';
        }
        if ($this->aPlusDeDeuxDecimales($info->montantTotal)) {
            $info->montantTotalErreurs[] = 'Le champ MontantTotal ne doit pas avoir plus de deux chiffres après la virgule';
        }
@@ -593,6 +624,7 @@ class PcruInformationsService implements UseEntityManager, UseOscarConfiguration
        }

        $erreurs['montantPercuUniteErreurs'] = [];
        if (!$activityPcruInformations->isUtiliserMontantPercuUniteParDefaut()) {
            if ($activityPcruInformations->getMontantPercuUnite() === NULL) {
                $erreurs['montantPercuUniteErreurs'][] = 'Le champ MontantPercuUnite est obligatoire et doit être défini';
            } else {
@@ -602,6 +634,7 @@ class PcruInformationsService implements UseEntityManager, UseOscarConfiguration
                    $erreurs['montantPercuUniteErreurs'][] = "Le champ MontantPercuUnite contient une valeur trop petite.";
                }
            }
        }

        $erreurs['contributionFinanceurErreurs'] = [];
        if ($activityPcruInformations->getContributionFinanceur() !== NULL) {
@@ -814,6 +847,9 @@ class PcruInformationsService implements UseEntityManager, UseOscarConfiguration
            } else if ($info->montantPercuUnite < -9999999999.99) {
                $errorsMontantPercuUnite[] = "Le champ MontantPercuUnite contient une valeur trop petite.";
            }
            if ($this->aPlusDeDeuxDecimales($info->montantPercuUnite)) {
                $errorsMontantPercuUnite[] = 'Le champ MontantPercuUnite ne doit pas avoir plus de deux chiffres après la virgule';
            }
        }
        if (count($errorsMontantPercuUnite) > 0) {
            $errors['montantPercuUnite'] = $errorsMontantPercuUnite;
+31 −6
Changes for ui/src/views/ActivityPcruInformations.vue: 31 added lines, 6 removed lines.
Original line number Diff line number Diff line
@@ -230,7 +230,7 @@
                    <span>22</span>
                    <label>MontantPercuUnite</label>
                    <span>Le montant perçu par l'unité</span>
                    <span>Pas de valeur par défaut</span>
                    <span>Montant subventionné moins la part hébergeur moins la part gestionnaire</span>
                    <span style="font-weight: bold;">{{ pcru.activityPcruInformations.envoiMontantPercuUnite }}</span>
                    
                    <span>23</span>
@@ -850,18 +850,26 @@
                        <span>22</span>
                        <label for="montantPercuUnite">MontantPercuUnite<span style="color: red; font-weight: bold;">*</span></label>
                        <span>Le montant perçu par l'unité</span>
                        <span style="grid-column-end: span 2;">Pas de valeur par défaut</span>
                        <span>Montant subventionné moins la part hébergeur moins la part gestionnaire</span>
                        <div>
                            <input type="checkbox" disabled />
                            <ul v-if="pcru.activityPcruInformations.utiliserMontantPercuUniteParDefaut && pcru.pcruInformationParDefaut.montantPercuUniteErreurs.length > 0" style="text-align: left; color: #a94442;">
                                <template v-for="e in pcru.pcruInformationParDefaut.montantPercuUniteErreurs">
                                    <li>{{ e }}</li>
                                </template>
                            </ul>
                            <span :class="{ invalidSpan: pcru.activityPcruInformations.utiliserMontantPercuUniteParDefaut && pcru.pcruInformationParDefaut.montantPercuUniteErreurs.length > 0, bold: pcru.activityPcruInformations.utiliserMontantPercuUniteParDefaut }">{{ pcru.pcruInformationParDefaut.montantPercuUnite }} {{ budget.currency.symbol }}</span>
                        </div>
                        <div>
                            <input type="checkbox" v-model="pcru.activityPcruInformations.utiliserMontantPercuUniteParDefaut" @change="checkMontantPercuUniteParDefaut($event)" :disabled="pcru.activityPcruInformations.status != 'jamais-envoyee'" />
                        </div>
                        <div>
                            <ul v-if="montantPercuUniteErreursPasParDefaut.length > 0" style="text-align: left; color: #a94442;">
                            <ul v-if="!pcru.activityPcruInformations.utiliserMontantPercuUniteParDefaut && montantPercuUniteErreursPasParDefaut.length > 0" style="text-align: left; color: #a94442;">
                                <template v-for="e in montantPercuUniteErreursPasParDefaut">
                                    <li>{{ e }}</li>
                                </template>
                            </ul>
                            <div style="display: flex;">
                                <input style="margin-left: 1em; text-align: center;" :class="{ invalid: montantPercuUniteErreursPasParDefaut.length > 0, bold: true }" type="number" step="0.01" id="montantPercuUnite" v-model="pcru.activityPcruInformations.montantPercuUnite" :disabled="pcru.activityPcruInformations.status != 'jamais-envoyee'" max="9999999999.99" min="-9999999999.99" @input="montantPercuUniteAfficherLesErreursServeur = false">
                                <input style="margin-left: 1em; text-align: center;" :class="{ bold: !pcru.activityPcruInformations.utiliserMontantPercuUniteParDefaut }" type="number" step="0.01" id="montantPercuUnite" v-model="pcru.activityPcruInformations.montantPercuUnite" :disabled="pcru.activityPcruInformations.utiliserMontantPercuUniteParDefaut || pcru.activityPcruInformations.status != 'jamais-envoyee'" max="9999999999.99" min="-9999999999.99" @input="montantPercuUniteAfficherLesErreursServeur = false">
                                <span style="margin-left: 1em; margin-right: 1em;" >€&nbsp;<abbr title="Hors Taxes">HT</abbr></span>
                            </div>
                        </div>
@@ -1496,6 +1504,13 @@ export default {
            return erreurs;
        },
        
        montantPercuUniteErreurs() {
            if (this.pcru.activityPcruInformations.utiliserMontantPercuUniteParDefaut) {
                return this.pcru.pcruInformationParDefaut.montantPercuUniteErreurs;
            }
            return this.montantPercuUniteErreursPasParDefaut;
        },

        contributionFinanceurErreursPasParDefaut() {
            let erreurs = [];
            if (this.pcru.activityPcruInformations.contributionFinanceur != null && typeof this.pcru.activityPcruInformations.contributionFinanceur == 'number' && this.pcru.activityPcruInformations.contributionFinanceur != '') {
@@ -1558,7 +1573,7 @@ export default {
                this.idPartenairePrincipalErreurs.concat(this.pcru.pcruInformationParDefaut.sourceFinancementErreurs.concat(
                this.lieuExecutionErreursPasParDefaut.concat(this.dateDerniereSignatureErreurs.concat(
                this.dureeErreursPasParDefaut.concat(this.dateDebutErreurs.concat(this.dateFinErreurs.concat(
                this.montantPercuUniteErreursPasParDefaut.concat(this.contributionFinanceurErreursPasParDefaut.concat(
                this.montantPercuUniteErreurs.concat(this.contributionFinanceurErreursPasParDefaut.concat(
                this.montantTotalErreurs.concat(this.pcru.pcruInformationParDefaut.poleCompetitiviteErreurs.concat(
                this.commentairesErreursPasParDefaut.concat(this.referenceErreurs)))))))))))))))))))))))));
        },
@@ -1752,6 +1767,16 @@ export default {
            }
        },

        checkMontantPercuUniteParDefaut(e) {
            this.pcru.activityPcruInformations.montantPercuUnite = null;
            if (!this.pcru.activityPcruInformations.utiliserMontantPercuUniteParDefaut) {
                if (this.pcru.pcruInformationParDefaut.montantPercuUnite !== null) {
                    this.pcru.activityPcruInformations.montantPercuUnite = this.pcru.pcruInformationParDefaut.montantPercuUnite;
                }
                document.getElementById("montantPercuUnite").focus();
            }
        },

        checkMontantTotalParDefaut(e) {
            this.pcru.activityPcruInformations.montantTotal = null;
            if (!this.pcru.activityPcruInformations.utiliserMontantTotalParDefaut) {