-
-
Notifications
You must be signed in to change notification settings - Fork 6
/
createLists.php
126 lines (100 loc) · 3.49 KB
/
createLists.php
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<?php
use PhpOffice\PhpSpreadsheet\IOFactory;
require_once __DIR__ . '/vendor/autoload.php';
function write(string $string, $exit = false)
{
echo $string, PHP_EOL;
if ($exit !== false) {
if (is_int($exit)) {
exit($exit);
}
exit(0);
}
}
function createPurposeClass()
{
$xlsDocument = 'https://www.iso20022.org/sites/default/files/2021-03/ExternalCodeSets_4Q2020_February2021_v1.xlsx';
if (!class_exists('PhpOffice\PhpSpreadsheet\Spreadsheet')) {
write('Please install also development dependencies to generate the Purpose class');
return;
}
$file = __DIR__ . '/src/Sepa/Purpose.php';
if (file_exists($file)) {
if (!@unlink($file)) {
write("Could not delete existing Purpose class in {$file}", 1);
}
}
$class = [
'<?php',
'',
'namespace rikudou\\EuQrPayment\\Sepa;',
'',
'/**',
" * @see {$xlsDocument}",
' */',
'class Purpose',
'{',
];
$tmpFile = tempnam(sys_get_temp_dir(), 'qrPaymentEuPurpose');
file_put_contents($tmpFile, file_get_contents($xlsDocument));
$spreadsheet = IOFactory::load($tmpFile);
$worksheet = $spreadsheet->getSheetByName('11-Purpose');
$row = 5;
$coordinates = [
'order' => 'A',
'code' => 'B',
'classification' => 'C',
'name' => 'D',
];
$constantify = function (string $name) {
$name = preg_replace_callback('@([A-Z]{2,})(?!$)@', function ($matches) {
return ucfirst(strtolower(substr($matches[1], 0, -1))) . substr($matches[1], -1);
}, $name);
$name = ucwords($name);
$name = str_replace(' ', '', $name);
$name = preg_replace_callback('@([A-Z]+$|[A-Z])@', function ($matches) {
return '_' . $matches[1];
}, $name);
$name = strtoupper($name);
$name = preg_replace('@[^a-zA-Z_]@', '', $name);
if (substr($name, 0, 1) === '_') {
$name = substr($name, 1);
}
return $name;
};
$lastClassification = null;
$constants = [];
do {
$order = $worksheet->getCell("{$coordinates['order']}{$row}")->getCalculatedValue();
$code = $worksheet->getCell("{$coordinates['code']}{$row}")->getValue();
$classification = trim($worksheet->getCell("{$coordinates['classification']}{$row}")->getValue());
$name = $worksheet->getCell("{$coordinates['name']}{$row}")->getValue();
if (!$name || !$code || !$classification) {
continue;
}
$constName = $constantify($name);
if (isset($constants[$constName])) {
$constName = $constantify($classification) . '_' . $constName;
}
$constants[$constName] = true;
if ($classification !== $lastClassification) {
$class[] = '';
$class[] = "\t// {$classification}";
}
$class[] = "\tpublic const {$constName} = '{$code}';";
$lastClassification = $classification;
++$row;
} while ($order);
$class[] = '}';
$class[] = '';
unset($class[9]); // empty space after class body
$classString = implode(PHP_EOL, $class);
$classString = str_replace("\t", ' ', $classString);
if (!file_put_contents($file, $classString)) {
write("Could not save the generated class to {$file}", 1);
} else {
@unlink($tmpFile);
write("Successfully created the Purpose class at {$file}");
}
}
createPurposeClass();