Commit 5a85d0a2 authored by Antony Le Courtes's avatar Antony Le Courtes
Browse files

Renforcement pour meilleure controle du traitment des insee selon la forme

parent fd42610c
Loading
Loading
Loading
Loading
+25 −1
Original line number Diff line number Diff line
@@ -5,7 +5,14 @@
        <div class="card-header text-uppercase fw-bold">
            Importation des numéros de prise en charge
        </div>

        <div class="card-body">
            <div v-if="this.messageErrors" class="alert alert-danger" role="alert">
                {{ this.messageErrors }}
            </div>
            <div v-if="this.messageConfirm" class="alert alert-success" role="alert">
                {{ this.messageConfirm }}
            </div>
            <form id="formImport" action="" enctype="multipart/form-data" method="post">
                <p class="fs-9 text">
                    Vous pouvez utiliser le modèle directement extrait de winpaie ou télécharger le modèle d'import générique en <a
@@ -20,7 +27,7 @@
                    <label class="form-label" for="modele">Choisissez le modèle d'import :</label>&nbsp;
                    <select id="modeleImport" class="form-select" name="modeleImport">
                        <option value="winpaie">Winpaie</option>
                        <option value="generic">Generique</option>
                        <option value="generic">Generique (Modèle à 3 colonnes)</option>
                    </select>
                </div>
                <div class="mb-3">
@@ -80,6 +87,8 @@ export default {
            importUrl: unicaenVue.url('paiement/import-numero-pec'),
            fileErrors: null,
            intervenantMissing: null,
            messageErrors: null,
            messageConfirm: null,
        }
    },
    mounted()
@@ -90,12 +99,20 @@ export default {
        handleFileUpload(event)
        {
            this.selectedFile = event.target.files[0];
            this.fileErrors = null;
            this.intervenantMissing = null
            this.messageErrors = null;
            this.messageConfirm = null;
            document.getElementById('btn-import').disabled = false;

        },
        importFile(event)
        {
            event.preventDefault();
            //On reintialiser le message d'erreur
            this.messageErrors = null;
            this.messageConfirm = null;

            //On desactive le bouton de soumission
            let btnImport = document.getElementById('btn-import')
            let btnImportInProgress = document.getElementById('btn-import-inprogress')
@@ -115,6 +132,13 @@ export default {
                    let datas = response.data;
                    this.fileErrors = datas.file;
                    this.intervenantMissing = datas.intervenant;
                    console.log(this.messageErrors);
                    if (datas.message.length != 0) {
                        this.messageErrors = datas.message
                        console.log(this.messageErrors);
                    } else {
                        this.messageConfirm = "Importation des numéros de prise en charge réalisée avec succés !";
                    }
                    btnImport.disabled = false;
                    btnImportInProgress.classList.add('d-none');
                    btnImport.classList.remove('d-none');
+55 −26
Original line number Diff line number Diff line
@@ -25,6 +25,9 @@ class NumeroPriseEnChargeService extends AbstractService
    {
        $errors                = [];
        $nameFile              = $file['tmp_name'];
        $errors['intervenant'] = [];
        $errors['message']     = '';
        $errors['file']        = [];

        $document = new Document();
        $document->loadFromFile($nameFile);
@@ -39,7 +42,7 @@ class NumeroPriseEnChargeService extends AbstractService
            break;
        }
        $errors['file']    = $datas['errors'];

        $errors['message'] = (isset($datas['message'])) ? $datas['message'] : [];
        //On met à jour les numéros de prise en charge des intervenants
        $em = $this->getEntityManager();
        $em->beginTransaction();
@@ -78,34 +81,50 @@ class NumeroPriseEnChargeService extends AbstractService
        ];

        $maxRow = $sheet->getMaxRow();
        $maxCol = $sheet->getMaxCol();
        if ($maxCol <= 3) {
            $datas['result']  = $lines;
            $datas['errors']  = $errors;
            $datas['message'] = 'Le format de fichier fourni n\'est pas celui de winpaie';

            return $datas;
        }

        for ($rowNum = 2; $rowNum <= $maxRow; $rowNum++) {

            $cell     = $sheet->getCellByCoords($colonneNames['insee'], $rowNum);
            $colValue = $cell->getContent();
            //On supprime la quote et les espaces
            $colValue = str_replace(["'"], [''], $colValue);
            // Expression régulière pour capturer les caractères après le 16ème caractère
            $regexInsee           = '/^(.{16})(.*)$/';
            $regexInseeProvisoire = '/^(.{15})(.*)$/';
            // Utilisation de preg_match pour appliquer l'expression régulière
            if (preg_match($regexInsee, $colValue, $matches)) {
                $insee = str_replace("'", "", $matches[1]);
                $pec   = $matches[2];
                //Si je n'ai pas réussi à récupérer le numéro PEC s'est que le numéro insee doit etre provisoire sur 15 carctères
                if ($pec == '') {
                    if (preg_match($regexInseeProvisoire, $colValue, $matches)) {
                        $insee = str_replace(["'", " "], ["", ""], $matches[1]);
                        $pec   = $matches[2];
                    } else {
                        $inseeFile = $sheet->getCellByCoords($colonneNames['insee'], $rowNum)->getContent();
                        $nomFile   = $sheet->getCellByCoords($colonneNames['nom'], $rowNum)->getContent();
                        $errors[]  = $nomFile . " - " . $inseeFile;
                    }
                }
            /*
             * 1- si numero comporte une lettre alors c'est un insee etrangé
             * 2- si il fait moins de 15 caractères c'est un numéro provisoire
             * 3- sinon c'est un insee normale
             */
            $regexInseeEtranger = '/[a-zA-Z]/';
            $regexInsee         = '/^(.{15})(.*)$/';

            //On regarde d'abord si c'est un insee etranger (qui contient une lettre)
            if (preg_match($regexInseeEtranger, $colValue)) {
                if (preg_match('/^(.{13})(.*)$/', $colValue, $matches)) {
                    $insee   = trim($matches[1]);
                    $pec     = trim($matches[2]);
                    $lines[] = [
                        'insee' => $insee,
                        'pec'   => $pec,
                        'nom'   => $sheet->getCellByCoords($colonneNames['nom'], $rowNum)->getContent(),
                    ];
                }
                continue;
            } elseif (preg_match($regexInsee, $colValue, $matches)) {
                $insee   = $matches[1];
                $pec     = $matches[2];
                $lines[] = [
                    'insee' => trim($insee),
                    'pec'   => trim($pec),
                    'nom'   => $sheet->getCellByCoords($colonneNames['nom'], $rowNum)->getContent(),
                ];
            } else {
                //On stocke les erreurs dans datas pour afficher les lignes qui n'ont pas pu être traitées.
                $inseeFile = $sheet->getCellByCoords($colonneNames['insee'], $rowNum)->getContent();
@@ -113,9 +132,10 @@ class NumeroPriseEnChargeService extends AbstractService
                $errors[]  = $nomFile . " - " . $inseeFile;
            }
        }

        $datas['result']  = $lines;
        $datas['errors']  = $errors;
        $datas['message'] = '';


        return $datas;
    }
@@ -134,6 +154,14 @@ class NumeroPriseEnChargeService extends AbstractService
        ];

        $maxRow = $sheet->getMaxRow();
        $maxCol = $sheet->getMaxCol();
        if ($maxCol != 3) {
            $datas['result']  = $lines;
            $datas['errors']  = $errors;
            $datas['message'] = 'Le format de fichier fourni n\'est pas le modèle numérique';

            return $datas;
        }

        for ($rowNum = 2; $rowNum <= $maxRow; $rowNum++) {

@@ -150,6 +178,7 @@ class NumeroPriseEnChargeService extends AbstractService

        $datas['result']  = $lines;
        $datas['errors']  = $errors;
        $datas['message'] = '';

        return $datas;
    }