Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
100.00% |
77 / 77 |
|
100.00% |
1 / 1 |
CRAP | |
100.00% |
1 / 1 |
| SolvEventParser | |
100.00% |
77 / 77 |
|
100.00% |
1 / 1 |
33 | |
100.00% |
1 / 1 |
| parse_solv_events_csv | |
100.00% |
77 / 77 |
|
100.00% |
1 / 1 |
33 | |||
| 1 | <?php |
| 2 | |
| 3 | namespace Olz\Parsers; |
| 4 | |
| 5 | use Olz\Entity\SolvEvent; |
| 6 | use Olz\Utils\WithUtilsTrait; |
| 7 | |
| 8 | class SolvEventParser { |
| 9 | use WithUtilsTrait; |
| 10 | |
| 11 | /** @var array<int, string> */ |
| 12 | public array $solv_entryportals = [ |
| 13 | 1 => "GO2OL", |
| 14 | 2 => "picoTIMING", |
| 15 | 3 => "anderes", |
| 16 | ]; |
| 17 | |
| 18 | /** @return array<SolvEvent> */ |
| 19 | public function parse_solv_events_csv(string $csv_content): ?array { |
| 20 | $data = str_getcsv($csv_content, "\n", "\"", "\\"); |
| 21 | $header = str_getcsv($data[0] ?? '', ";", "\"", "\\"); |
| 22 | $num_data = count($data); |
| 23 | $num_header = count($header); |
| 24 | if ($num_data <= 1 || $num_header <= 3) { |
| 25 | return null; |
| 26 | } |
| 27 | $solv_events = []; |
| 28 | for ($row_index = 1; $row_index < $num_data; $row_index++) { |
| 29 | $line = html_entity_decode($data[$row_index] ?? '', ENT_QUOTES); |
| 30 | $row = str_getcsv($line, ";", "\"", "\\"); |
| 31 | $solv_event = new SolvEvent(); |
| 32 | $solv_event->setStartLink(null); |
| 33 | $solv_event->setRankLink(null); |
| 34 | for ($col_index = 0; $col_index < $num_header; $col_index++) { |
| 35 | $csv_column_name = $header[$col_index] ?? ''; |
| 36 | $field_value = $row[$col_index] ?? ''; |
| 37 | switch ($csv_column_name) { |
| 38 | case 'unique_id': |
| 39 | $solv_event->setSolvUid(intval($field_value)); |
| 40 | break; |
| 41 | case 'date': |
| 42 | $date = $this->dateUtils()->sanitizeDateValue($field_value); |
| 43 | $this->generalUtils()->checkNotNull($date, "No SolvEvent date {$field_value}"); |
| 44 | $solv_event->setDate($date); |
| 45 | break; |
| 46 | case 'duration': |
| 47 | $solv_event->setDuration(intval($field_value)); |
| 48 | break; |
| 49 | case 'kind': |
| 50 | $solv_event->setKind($field_value ?: ''); |
| 51 | break; |
| 52 | case 'day_night': |
| 53 | $solv_event->setDayNight($field_value ?: ''); |
| 54 | break; |
| 55 | case 'national': |
| 56 | $solv_event->setNational(intval($field_value)); |
| 57 | break; |
| 58 | case 'region': |
| 59 | $solv_event->setRegion($field_value ?: ''); |
| 60 | break; |
| 61 | case 'type': |
| 62 | $solv_event->setType($field_value ?: ''); |
| 63 | break; |
| 64 | case 'event_name': |
| 65 | $solv_event->setName($field_value ?: ''); |
| 66 | break; |
| 67 | case 'event_link': |
| 68 | $solv_event->setLink($field_value ?: ''); |
| 69 | break; |
| 70 | case 'club': |
| 71 | $solv_event->setClub($field_value ?: ''); |
| 72 | break; |
| 73 | case 'map': |
| 74 | $solv_event->setMap($field_value ?: ''); |
| 75 | break; |
| 76 | case 'location': |
| 77 | $solv_event->setLocation($field_value ?: ''); |
| 78 | break; |
| 79 | case 'coord_x': |
| 80 | $solv_event->setCoordX(intval($field_value)); |
| 81 | break; |
| 82 | case 'coord_y': |
| 83 | $solv_event->setCoordY(intval($field_value)); |
| 84 | break; |
| 85 | case 'deadline': |
| 86 | $date = $this->dateUtils()->sanitizeDateValue($field_value); |
| 87 | $solv_event->setDeadline($date); |
| 88 | break; |
| 89 | case 'entryportal': |
| 90 | $solv_event->setEntryportal(intval($field_value)); |
| 91 | break; |
| 92 | case 'last_modification': |
| 93 | $datetime = $this->dateUtils()->sanitizeDatetimeValue($field_value); |
| 94 | $solv_event->setLastModification($datetime ?? new \DateTime()); |
| 95 | break; |
| 96 | default: |
| 97 | break; |
| 98 | } |
| 99 | } |
| 100 | $solv_events[] = $solv_event; |
| 101 | } |
| 102 | return $solv_events; |
| 103 | } |
| 104 | } |