Commit 8edfa777 authored by Antony Le Courtes's avatar Antony Le Courtes
Browse files

Amélioration de la demande de paiement en lot afin d’afficher les intervenants...

Amélioration de la demande de paiement en lot afin d’afficher les intervenants ayant des HETD restantes à payer, en notifiant qu’il existe des incohérences de paiement sur leurs demandes précédentes (trop-perçu, etc.) (#64196)
parent 0279bcf7
Loading
Loading
Loading
Loading
Loading
+72 −34
Changes for front/Paiement/DemandeMiseEnPaiementLot.vue: 72 added lines, 34 removed lines.
Original line number Diff line number Diff line
@@ -102,8 +102,8 @@
                                                       name="allPermanents" type="checkbox"
                                                       @click="toggleCheckbox"></th>
                                <th scope="col">Intervenant</th>
                                <th>HETD payables</th>
                                <th>HETD non payables</th>
                                <th>HETD payables en lot</th>
                                <th>HETD sans centre de coût</th>
                            </tr>
                            </thead>
                            <tbody>
@@ -112,24 +112,29 @@
                                <td><input :id="'permanent-' + intervenant.datasIntervenant.id"
                                           :data-paie-etat="totalRessourcePaieEtat(intervenant.heures)"
                                           :data-ressource-propre="totalRessourcePropre(intervenant.heures)"
                                           :disabled="totalPayable(intervenant.heures) == 0 "
                                           :disabled="totalPayable(intervenant) == 0 || intervenant.datasIntervenant.incoherencePaiement"
                                           :name="'intervenant[' + intervenant.datasIntervenant.id +']'"
                                           :title="totalPayable(intervenant.heures) == 0?'Aucune heure pré-paramétrée avec un centre de coût ne peut bénéficier d\'une demande de mise en paiement':''"
                                           :title="totalPayable(intervenant) == 0?'Aucune heure pré-paramétrée avec un centre de coût ne peut bénéficier d\'une demande de mise en paiement':''"
                                           checked="checked"
                                           class="checkbox-permanent"
                                           type="checkbox"
                                           @change="refreshTotalConsommation()"></td>
                                <td><a :href="urlIntervenant(intervenant)"
                                <td>
                                    <i title="La fiche intervenant contient des incohérences de paiement (trop payé, etc...), une revue manuelle des paiements est nécessaire."
                                       v-if="intervenant.datasIntervenant.incoherencePaiement"
                                       class="fas fa-triangle-exclamation" style="color:#a40000;cursor: help;"></i>&nbsp;

                                    <a :href="urlIntervenant(intervenant)"
                                       target="_blank">{{
                                        intervenant.datasIntervenant.nom_usuel.toUpperCase() + ' ' + intervenant.datasIntervenant.prenom
                                    }}</a></td>
                                <td><span
                                    :title="totalRessourcePaieEtat(intervenant.heures) + ' HETD en paie état / ' + totalRessourcePropre(intervenant.heures) + ' HETD en ressource propre' "
                                    style="text-decoration:underline dotted;cursor: help;">
                                    {{ totalPayable(intervenant.heures) }} h</span></td>
                                    {{ totalPayable(intervenant) }} h</span></td>
                                <td><span style="text-decoration:underline dotted;cursor: help;"
                                          title="Manque un centre de coût et/ou un domaine fonctionnel">{{
                                        totalNonPayable(intervenant.heures)
                                        totalNonPayable(intervenant)
                                    }} h</span></td>
                            </tr>
                            </tbody>
@@ -157,36 +162,42 @@
                                           name="allVacataire" type="checkbox"
                                           @click="toggleCheckbox"></th>
                                <th>Intervenant</th>
                                <th>HETD payables</th>
                                <th>HETD non payables</th>
                                <th>HETD payables en lot</th>
                                <th>HETD sans centre de coût</th>
                            </tr>
                            </thead>
                            <tbody>

                            <tr v-for="intervenant in this.vacataires">
                                <td><input :id="'vacataire-' + intervenant.datasIntervenant.id"
                                <td>
                                    <input
                                        :id="'vacataire-' + intervenant.datasIntervenant.id"
                                           :data-paie-etat="totalRessourcePaieEtat(intervenant.heures)"
                                           :data-ressource-propre="totalRessourcePropre(intervenant.heures)"
                                           :disabled="totalPayable(intervenant.heures) == 0 "
                                        :disabled="totalPayable(intervenant) == 0 || intervenant.datasIntervenant.incoherencePaiement"
                                           :name="'intervenant[' + intervenant.datasIntervenant.id +']'"
                                           :title="totalPayable(intervenant.heures) == 0?'Aucune heure pré-paramétrée avec un centre de coût ne peut bénéficier d\'une demande de mise en paiement':''"
                                        :title="totalPayable(intervenant) == 0?'Aucune heure pré-paramétrée avec un centre de coût ne peut bénéficier d\'une demande de mise en paiement':''"
                                           checked="checked"
                                           class="checkbox-vacataire"
                                           type="checkbox"
                                           @change="refreshTotalConsommation()">
                                </td>
                                <td><a :href="urlIntervenant(intervenant)"
                                <td>
                                    <i title="La fiche intervenant contient des incohérences de paiement (trop payé, etc...), une revue manuelle des paiements est nécessaire."
                                       v-if="intervenant.datasIntervenant.incoherencePaiement"
                                       class="fas fa-triangle-exclamation" style="color:#a40000;cursor: help;"></i>&nbsp;
                                    <a :href="urlIntervenant(intervenant)"
                                       target="_blank">{{
                                        intervenant.datasIntervenant.nom_usuel.toUpperCase() + ' ' + intervenant.datasIntervenant.prenom
                                    }}</a></td>
                                <td><span
                                    :title="totalRessourcePaieEtat(intervenant.heures) + ' HETD en paie état / ' + totalRessourcePropre(intervenant.heures) + ' HETD en ressource propre' "
                                    style="text-decoration:underline dotted;cursor: help;">{{
                                        totalPayable(intervenant.heures)
                                        totalPayable(intervenant)
                                    }} h</span></td>
                                <td><span style="text-decoration:underline dotted;cursor: help;"
                                          title="Manque un centre de coût et/ou un domaine fonctionnel">{{
                                        totalNonPayable(intervenant.heures)
                                        totalNonPayable(intervenant)
                                    }} h</span></td>

                            </tr>
@@ -215,8 +226,8 @@
                                           name="allEtudiants" type="checkbox"
                                           @click="toggleCheckbox"></th>
                                <th>Intervenant</th>
                                <th>HETD payables</th>
                                <th>HETD non payables</th>
                                <th>HETD payables en lot</th>
                                <th>HETD sans centre de coût</th>
                            </tr>
                            </thead>
                            <tbody>
@@ -225,22 +236,27 @@
                                <td><input :id="'etudiant-' + intervenant.datasIntervenant.id"
                                           :data-paie-etat="totalRessourcePaieEtat(intervenant.heures)"
                                           :data-ressource-propre="totalRessourcePropre(intervenant.heures)"
                                           :disabled="totalPayable(intervenant.heures) == 0 "
                                           :disabled="totalPayable(intervenant) == 0 "
                                           :name="'intervenant[' + intervenant.datasIntervenant.id +']'"
                                           :title="totalPayable(intervenant.heures) == 0?'Aucune heure pré-paramétrée avec un centre de coût ne peut bénéficier d\'une demande de mise en paiement':''"
                                           :title="totalPayable(intervenant) == 0?'Aucune heure pré-paramétrée avec un centre de coût ne peut bénéficier d\'une demande de mise en paiement':''"
                                           checked="checked" class="checkbox-etudiant" type="checkbox"
                                           @change="refreshTotalConsommation()"></td>
                                <td><a :href="urlIntervenant(intervenant)"
                                <td>
                                    <i title="La fiche intervenant contient des incohérences de paiement (trop payé, etc...), une revue manuelle des paiements est nécessaire."
                                       v-if="intervenant.datasIntervenant.incoherencePaiement"
                                       class="fas fa-triangle-exclamation" style="color:#a40000;cursor: help;"></i>&nbsp;

                                    <a :href="urlIntervenant(intervenant)"
                                       target="_blank">{{
                                        intervenant.datasIntervenant.nom_usuel.toUpperCase() + ' ' + intervenant.datasIntervenant.prenom
                                    }}</a></td>
                                <td><span
                                    :title="totalRessourcePaieEtat(intervenant.heures) + ' HETD en paie état / ' + totalRessourcePropre(intervenant.heures) + ' HETD en ressource propre' "
                                    style="text-decoration:underline dotted;cursor: help;">
                                    {{ totalPayable(intervenant.heures) }} h</span></td>
                                    {{ totalPayable(intervenant) }} h</span></td>
                                <td><span style="text-decoration:underline dotted;cursor: help;"
                                          title="Manque un centre de coût et/ou un domaine fonctionnel">{{
                                        totalNonPayable(intervenant.heures)
                                        totalNonPayable(intervenant)
                                    }} h</span></td>
                            </tr>
                            </tbody>
@@ -268,8 +284,8 @@
                                           type="checkbox" @click="toggleCheckbox">
                                </th>
                                <th>Intervenant</th>
                                <th>HETD payables</th>
                                <th>HETD non payables</th>
                                <th>HETD payables en lot</th>
                                <th>HETD sans centre de coût</th>
                            </tr>
                            </thead>
                            <tbody>
@@ -278,24 +294,29 @@
                                <td><input :id="'autre-' + intervenant.datasIntervenant.id"
                                           :data-paie-etat="totalRessourcePaieEtat(intervenant.heures)"
                                           :data-ressource-propre="totalRessourcePropre(intervenant.heures)"
                                           :disabled="totalPayable(intervenant.heures) == 0 "
                                           :disabled="totalPayable(intervenant) == 0 "
                                           :name="'intervenant[' + intervenant.datasIntervenant.id +']'"
                                           :title="totalPayable(intervenant.heures) == 0?'Aucune heure pré-paramétrée avec un centre de coût ne peut bénéficier d\'une demande de mise en paiement':''"
                                           :title="totalPayable(intervenant) == 0?'Aucune heure pré-paramétrée avec un centre de coût ne peut bénéficier d\'une demande de mise en paiement':''"
                                           checked="checked"
                                           class="checkbox-autre"
                                           type="checkbox"
                                           @change="refreshTotalConsommation()"></td>
                                <td><a :href="urlIntervenant(intervenant)"
                                <td>
                                    <i title="La fiche intervenant contient des incohérences de paiement (trop payé, etc...), une revue manuelle des paiements est nécessaire."
                                       v-if="intervenant.datasIntervenant.incoherencePaiement"
                                       class="fas fa-triangle-exclamation" style="color:#a40000;cursor: help;"></i>&nbsp;

                                    <a :href="urlIntervenant(intervenant)"
                                       target="_blank">{{
                                        intervenant.datasIntervenant.nom_usuel.toUpperCase() + ' ' + intervenant.datasIntervenant.prenom
                                    }}</a></td>
                                <td><span
                                    :title="totalRessourcePaieEtat(intervenant.heures) + ' HETD en paie état / ' + totalRessourcePropre(intervenant.heures) + ' HETD en ressource propre' "
                                    style="text-decoration:underline dotted;cursor: help;">
                                    {{ totalPayable(intervenant.heures) }} h</span></td>
                                    {{ totalPayable(intervenant) }} h</span></td>
                                <td><span style="text-decoration:underline dotted;cursor: help;"
                                          title="Manque un centre de coût et/ou un domaine fonctionnel">{{
                                        totalNonPayable(intervenant.heures)
                                        totalNonPayable(intervenant)
                                    }} h</span></td>
                            </tr>
                            </tbody>
@@ -480,10 +501,19 @@ export default {

        },

        totalPayable(heures)
        totalPayable(intervenant)
        {
            // Si intervenant n'est pas encore chargé
            if (!intervenant || !intervenant.datasIntervenant) {
                return 0;
            }
            let total = 0;
            heures.forEach((item, index) => {


            if (intervenant?.datasIntervenant?.incoherencePaiement) {
                return intervenant.datasIntervenant.totalHeures.toLocaleString('fr-FR', {maximumFractionDigits: 2});
            }
            intervenant.heures.forEach((item, index) => {
                if (item.centreCout.code != '') {
                    if (item.missionId != '' || item.serviceRefId != '') {
                        if (item.domaineFonctionnel.code != '') {
@@ -499,10 +529,19 @@ export default {
            return total.toLocaleString('fr-FR', {maximumFractionDigits: 2});

        },
        totalNonPayable(heures)
        totalNonPayable(intervenant)
        {
            // Si intervenant n'est pas encore chargé
            if (!intervenant || !intervenant.datasIntervenant) {
                return 0;
            }

            let total = 0;
            heures.forEach((item, index) => {
            if (intervenant?.datasIntervenant?.incoherencePaiement) {
                return total.toLocaleString('fr-FR', {maximumFractionDigits: 2});
            }

            intervenant.heures.forEach((item, index) => {
                if (item.centreCout.code == '') {
                    total += item.heuresAPayer;
                } else {
@@ -548,7 +587,6 @@ export default {
            this.etudiants = [];
            this.autres = [];
            this.intervenants = [];
            console.log(datas);


            for (const [index, intervenant] of Object.entries(datas)) {
+24 −3
Changes for module/Paiement/src/Service/DemandesService.php: 24 added lines, 3 removed lines.
Original line number Diff line number Diff line
@@ -809,6 +809,7 @@ class DemandesService extends AbstractService
        $dmeps                   = $this->getEntityManager()->createQuery($dql)->setParameters(['structure' => $structure, 'annee' => $annee])->getResult();
        $dmep                    = [];
        $intervenantsTotalHeures = [];
        $intervenantPaiementErreur = [];
        foreach ($dmeps as $value) {
            /**
             * @var TblPaiement $value
@@ -820,7 +821,11 @@ class DemandesService extends AbstractService
            }
            $intervenantsTotalHeures[$intervenant->getId()] ['heuresDemandees'] += $value->getHeuresDemandees();
            $intervenantsTotalHeures[$intervenant->getId()] ['heuresAPayer']    += $value->getHeuresAPayer();

            /*Dés qu'on a une ligne de paiement avec plus d'heures demandées que d'heures à payer on sort
            l'intervenant du traitement de paiement en masse, il faudra faire un paiement manuel */
            if ($value->getHeuresAPayer() < $value->getHeuresDemandees()) {
                $intervenantPaiementErreur[] = $intervenant->getId();
            }

            if (empty($value->getMiseEnPaiement())) {
                $workflowEtape = $this->getServiceWorkflow()->getEtape(WfEtape::CODE_DEMANDE_MEP, $intervenant, $value->getStructure());
@@ -840,8 +845,12 @@ class DemandesService extends AbstractService
                            'structure'       => ($intervenant->getStructure()) ? $intervenant->getStructure()->getLibelleCourt() : '',
                            'statut'          => $intervenant->getStatut()->getLibelle(),
                            'typeIntervenant' => $intervenant->getStatut()->getTypeIntervenant()->getLibelle(),
                            'incoherencePaiement' => false,
                            'totalHeures'         => 0,
                        ];
                    }


                    //On prend uniquement les heures ou hetd qui ne sont pas du référentiel

                    $dmep[$intervenant->getId()]['heures'][] = [
@@ -862,14 +871,26 @@ class DemandesService extends AbstractService
            }
        }

        //On enlève les intervenants dont le nombre d'heures demandées en paiement est supérieur au nombre d'heure à payer
        /*on flaggue les intervenants avec des paiements incohérent (ligne trop payée, etc...) pour ne pas les traiter dans le
        paiement en masse mais quand même indiquer qu'il y a des problèmes sur les demandes de mise
        en paiement de cet intervenant, traitement manuelle nécessaire*/
        foreach ($intervenantsTotalHeures as $intervenantId => $heures) {
            if ($heures['heuresDemandees'] > $heures['heuresAPayer']) {
            if (array_key_exists($intervenantId, $dmep)) {
                $dmep[$intervenantId]['datasIntervenant']['totalHeures'] = $heures['heuresAPayer'] - $heures['heuresDemandees'];
                if ($heures['heuresDemandees'] >= $heures['heuresAPayer']) {
                    $dmep[$intervenantId]['datasIntervenant']['incoherencePaiement'] = true;
                    unset($dmep[$intervenantId]);
                }
            }
        }
        /*on flaggue les intervenants avec des paiements incohérent (ligne trop payée, etc...) pour ne pas les traiter dans le
        paiement en masse mais quand même indiquer qu'il y a des problèmes sur les demandes de mise
        en paiement de cet intervenant, traitement manuelle nécessaire*/
        foreach ($intervenantPaiementErreur as $intervenantId) {
            if (array_key_exists($intervenantId, $dmep)) {
                $dmep[$intervenantId]['datasIntervenant']['incoherencePaiement'] = true;
            }
        }

        return $dmep;
    }
+1 −1
Changes for public/dist/.vite/manifest.json: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -4,7 +4,7 @@
    "name": "vendor"
  },
  "main.js": {
    "file": "assets/main-C137TWer.js",
    "file": "assets/main-ExTKhvMX.js",
    "name": "main",
    "src": "main.js",
    "isEntry": true,
+10 −10

File changed and moved.

Preview size limit exceeded, changes collapsed.