Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 76
0.00% covered (danger)
0.00%
0 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 1
MembersUtils
0.00% covered (danger)
0.00%
0 / 76
0.00% covered (danger)
0.00%
0 / 7
272
0.00% covered (danger)
0.00%
0 / 1
 parseCsv
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
20
 getMemberIdent
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getMemberUsername
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getMemberFirstName
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getMemberLastName
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 update
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 1
56
 getUserData
0.00% covered (danger)
0.00%
0 / 38
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace Olz\Apps\Members\Utils;
4
5use Olz\Entity\Members\Member;
6use Olz\Entity\Users\User;
7use Olz\Utils\WithUtilsTrait;
8
9class MembersUtils {
10    use WithUtilsTrait;
11
12    public ?string $encoding = 'Windows-1252';
13    public int $first_data_row = 1;
14    public string $member_ident_key = '[Id]';
15    public string $member_username_key = 'Benutzer-Id';
16    public string $member_first_name_key = 'Vorname';
17    public string $member_last_name_key = 'Nachname';
18
19    /** @return array<array<string, string>> */
20    public function parseCsv(string $csv_content): array {
21        $utf8_csv_content = mb_convert_encoding($csv_content, 'UTF-8', $this->encoding);
22        $this->generalUtils()->checkNotFalse($utf8_csv_content, 'Could not convert to UTF-8');
23        $data = str_getcsv($utf8_csv_content, "\n", "\"", "\\");
24        $header = str_getcsv($data[0] ?? '', ";", "\"", "\\");
25        $num_columns = count($header);
26
27        $rows = [];
28        for ($i = $this->first_data_row; $i < count($data); $i++) {
29            $raw_row = str_getcsv($data[$i] ?? '', ";", "\"", "\\");
30            if (count($raw_row) !== $num_columns) {
31                $this->log()->notice("Member CSV parse: Row[{$i}] = '{$data[$i]}' length is not {$num_columns}");
32                continue;
33            }
34            $row = [];
35            for ($j = 0; $j < $num_columns; $j++) {
36                $row[$header[$j]] = "{$raw_row[$j]}";
37            }
38            $rows[] = $row;
39        }
40        return $rows;
41    }
42
43    /** @param array<string, string> $member */
44    public function getMemberIdent(array $member): ?string {
45        return $member[$this->member_ident_key] ?? null;
46    }
47
48    /** @param array<string, string> $member */
49    public function getMemberUsername(array $member): ?string {
50        return $member[$this->member_username_key] ?? null;
51    }
52
53    /** @param array<string, string> $member */
54    public function getMemberFirstName(array $member): ?string {
55        return $member[$this->member_first_name_key] ?? null;
56    }
57
58    /** @param array<string, string> $member */
59    public function getMemberLastName(array $member): ?string {
60        return $member[$this->member_last_name_key] ?? null;
61    }
62
63    public function update(Member $member, ?User $user): void {
64        if (!$user) {
65            return;
66        }
67        if ($member->getUser()?->getId() !== $user->getId()) {
68            $this->log()->error("Update requested for member {$member->getIdent()} ({$member->getUser()?->getId()} !== {$user->getId()})");
69            return;
70        }
71        $member_data = json_decode($member->getData(), true);
72        $user_data = $this->getUserData($user);
73        $update = [];
74        foreach ($user_data as $key => $user_value) {
75            $member_value = $member_data[$key] ?? '';
76            if ($member_value !== $user_value && $user_value !== '') {
77                $this->log()->info("Field {$key} was updated.");
78                $update[$key] = $user_value;
79            }
80        }
81        if ($update) {
82            $enc_update = json_encode($update);
83            $this->generalUtils()->checkNotFalse($enc_update, 'JSON encode failed');
84            $member->setUpdates($enc_update);
85        } else {
86            $member->setUpdates(null);
87        }
88    }
89
90    /** @return array<string, string> */
91    protected function getUserData(User $user): array {
92        return [
93            'Nachname' => $user->getLastName(),
94            'Vorname' => $user->getFirstName(),
95            'Adresse' => $user->getStreet() ?? '',
96            'PLZ' => $user->getPostalCode() ?? '',
97            'Ort' => $user->getCity() ?? '',
98            'Benutzer-Id' => $user->getUsername(),
99            // 'Land' => $user->getCountryCode() ?? '',
100            // 'E-Mail' => $user->getEmail() ?? '',
101            // 'Geschlecht' => $user->getGender() ?? '',
102            // 'Geburtsdatum' => $user->getBirthdate()?->format('Y-m-d') ?? '',
103            // 'SOLV NR' => $user->getSolvNumber() ?? '',
104            // 'Badge Nummer' => $user->getSiCardNumber() ?? '',
105            // 'Rechnungsversand' => 'E-Mail', // All online accounts get invoices by email
106
107            // TODO: Think about the other fields:
108            // "Telefon Privat" => $user->getPhone(),
109            // "Telefon Mobil"
110            // "Anrede"
111            // "Titel"
112            // "Briefanrede"
113            // "Adress-Zusatz"
114            // "Nationalität"
115            // "[Gruppen]"
116            // "Status"
117            // "[Rolle]"
118            // "Eintritt"
119            // "Mitgliedsjahre"
120            // "Austritt"
121            // "Zivilstand"
122            // "Jahrgang"
123            // "Alter"
124            // "Nie mahnen"
125            // "IBAN"
126            // "Kontoinhaber"
127            // "Mail-MV"
128            // "Werbegrund"
129            // "Geburtsjahr"
130        ];
131    }
132}