Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<?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[0]); // Colonne 0 = DEP
$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);
}
}
}