ImpotFixtures.php 3,47 ko
Newer Older
<?php
namespace App\DataFixtures;

use App\Entity\Impot;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;

class ImpotFixtures extends Fixture {

   private const BASE_DIRECTORY = __DIR__ . '/../../public/data/';

   public function load(ObjectManager $manager): void {
       // Trouver tous les dossiers commençant par "rei-20XX-fichier-notice-trace"
       $directories = glob(self::BASE_DIRECTORY . 'rei-20*-fichier-notice-trace', GLOB_ONLYDIR);

       if (empty($directories)) {
           throw new \Exception('Aucun dossier trouvé dans ' . self::BASE_DIRECTORY);
       }

       foreach ($directories as $directory) {
           echo "Traitement du dossier : $directory\n";

           if (preg_match('/rei-(\d{4})-fichier-notice-trace/', basename($directory), $matches)) {
               $year = (int)$matches[1];
               echo "Traitement du dossier : $directory pour l'année $year\n";
           } else {
               echo "Impossible d'extraire l'année du dossier : $directory\n";
               continue;
           }

           // Récupérer tous les fichiers CSV dans le dossier
           $files = glob($directory . '/REI_*.csv');

           if (empty($files)) {
               echo "Aucun fichier CSV trouvé dans le dossier : $directory\n";
               continue;
           }

           foreach ($files as $file) {
                $this->loadCsvFile($file, $manager, $year);

           }
       }

       $manager->flush();
   }

   private function loadCsvFile(string $filePath, ObjectManager $manager, int $year): void {
       echo "Chargement du fichier : $filePath\n";
       $i = 0;

       // Lire le fichier CSV
       if (($handle = fopen($filePath, 'r')) !== false) {
           // Lire la première ligne pour obtenir les en-têtes
           $headers = fgetcsv($handle, 1000, ',');

           if ($headers === false) {
               throw new \Exception("Impossible de lire les en-têtes du fichier $filePath.");
           }

           // Lire chaque ligne de données
           while (($data = fgetcsv($handle, 1000, ',')) !== false) {
                $i = $i + 1;
                $this->createImpotFromRow($data, $manager, $year);
                // Evite de surchager la mémoire du PC
                if ($i % 10000 == 0) {
                    $manager->flush();
                    $manager->clear();
                }
           }

           fclose($handle);
       }
   }

   private function createImpotFromRow(array $row, ObjectManager $manager, int $year): void {
        // On associe un type d'impôts en fonction de l'indice des colonnes du fichier CSV
        $map = [
            'Taxe d\'habitation' => ['taxRateIndex' => 3, 'volumeIndex' => 4],
            'CFE' => ['taxRateIndex' => 5, 'volumeIndex' => 6],
            'TFB' => ['taxRateIndex' => 7, 'volumeIndex' => 8],
            'TFNB' => ['taxRateIndex' => 9, 'volumeIndex' => 10],
        ];

        foreach ($map as $type => $indices) {
            $impot = new Impot();

            $impot->setType($type);
            $impot->setRegion($row[12]); // Colonne 12 = LIBREG
            $impot->setDepartment($row[11]); // Colonne 11 = LIBDEP
            $impot->setCommune($row[2]); // Colonne 2 = LIBCOM
            $impot->setYear($year);
            $impot->setTaxRate((float) $row[$indices['taxRateIndex']]); // Taux d'impôt
            $impot->setVolumeCollected((float) $row[$indices['volumeIndex']]); // Volume collecté

            $manager->persist($impot);
        }
    }


}