Loading front/Paiement/ImportNumeroPec.vue +25 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -20,7 +27,7 @@ <label class="form-label" for="modele">Choisissez le modèle d'import :</label> <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"> Loading Loading @@ -80,6 +87,8 @@ export default { importUrl: unicaenVue.url('paiement/import-numero-pec'), fileErrors: null, intervenantMissing: null, messageErrors: null, messageConfirm: null, } }, mounted() Loading @@ -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') Loading @@ -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'); Loading module/Paiement/src/Service/NumeroPriseEnChargeService.php +55 −26 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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(); Loading Loading @@ -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(); Loading @@ -113,9 +132,10 @@ class NumeroPriseEnChargeService extends AbstractService $errors[] = $nomFile . " - " . $inseeFile; } } $datas['result'] = $lines; $datas['errors'] = $errors; $datas['message'] = ''; return $datas; } Loading @@ -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++) { Loading @@ -150,6 +178,7 @@ class NumeroPriseEnChargeService extends AbstractService $datas['result'] = $lines; $datas['errors'] = $errors; $datas['message'] = ''; return $datas; } Loading Loading
front/Paiement/ImportNumeroPec.vue +25 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -20,7 +27,7 @@ <label class="form-label" for="modele">Choisissez le modèle d'import :</label> <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"> Loading Loading @@ -80,6 +87,8 @@ export default { importUrl: unicaenVue.url('paiement/import-numero-pec'), fileErrors: null, intervenantMissing: null, messageErrors: null, messageConfirm: null, } }, mounted() Loading @@ -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') Loading @@ -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'); Loading
module/Paiement/src/Service/NumeroPriseEnChargeService.php +55 −26 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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(); Loading Loading @@ -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(); Loading @@ -113,9 +132,10 @@ class NumeroPriseEnChargeService extends AbstractService $errors[] = $nomFile . " - " . $inseeFile; } } $datas['result'] = $lines; $datas['errors'] = $errors; $datas['message'] = ''; return $datas; } Loading @@ -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++) { Loading @@ -150,6 +178,7 @@ class NumeroPriseEnChargeService extends AbstractService $datas['result'] = $lines; $datas['errors'] = $errors; $datas['message'] = ''; return $datas; } Loading