Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 90
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
OlzUserDetail
0.00% covered (danger)
0.00%
0 / 90
0.00% covered (danger)
0.00%
0 / 3
506
0.00% covered (danger)
0.00%
0 / 1
 getSearchTitle
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getSearchResults
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getHtml
0.00% covered (danger)
0.00%
0 / 88
0.00% covered (danger)
0.00%
0 / 1
420
1<?php
2
3namespace Olz\Users\Components\OlzUserDetail;
4
5use Olz\Components\Common\OlzRootComponent;
6use Olz\Components\Page\OlzFooter\OlzFooter;
7use Olz\Components\Page\OlzHeader\OlzHeader;
8use Olz\Entity\Users\User;
9
10/** @extends OlzRootComponent<array<string, mixed>> */
11class OlzUserDetail extends OlzRootComponent {
12    public function getSearchTitle(): string {
13        return 'TODO';
14    }
15
16    public function getSearchResults(array $terms): array {
17        return [];
18    }
19
20    public function getHtml(mixed $args): string {
21        $code_href = $this->envUtils()->getCodeHref();
22        $user_repo = $this->entityManager()->getRepository(User::class);
23        $user = $user_repo->findOneBy(['id' => $args['id']]);
24
25        if (!$user) {
26            $this->httpUtils()->dieWithHttpError(404);
27            throw new \Exception('should already have failed');
28        }
29
30        $out = OlzHeader::render([
31            'back_link' => "{$code_href}verein",
32            'title' => $user->getFullName(),
33            'description' => "{$user->getFullName()} - Profil.",
34            'norobots' => true,
35        ]);
36
37        $out .= "<div class='content-full olz-user-detail'>";
38
39        $image_paths = $this->authUtils()->getUserAvatar($user);
40        $image_src_html = $this->htmlUtils()->getImageSrcHtml($image_paths);
41        $img_html = "<img {$image_src_html} alt='' class='image'>";
42
43        $auth_user_id = $this->session()->get('auth_user_id');
44        $is_parent = $auth_user_id && intval($user->getParentUserId()) === intval($auth_user_id);
45        $is_self = $auth_user_id && intval($user->getId()) === intval($auth_user_id);
46        $has_permissions = $this->authUtils()->hasPermission('users');
47        $can_edit = $is_parent || $is_self || $has_permissions;
48        $edit_admin = '';
49        $edit_password = '';
50        if ($can_edit) {
51            $json_id = json_encode($user->getId());
52            $edit_admin = <<<ZZZZZZZZZZ
53                <div>
54                    <button
55                        id='edit-user-button'
56                        class='btn btn-primary'
57                        onclick='return olz.editUser({$json_id})'
58                    >
59                        <img src='{$code_href}assets/icns/edit_white_16.svg' class='noborder' />
60                        Bearbeiten
61                    </button>
62                </div>
63                ZZZZZZZZZZ;
64            $edit_password = <<<'ZZZZZZZZZZ'
65                     <button
66                        class='btn btn-secondary'
67                        onclick='return olz.initOlzChangePasswordModal()'
68                        id='change-password-button'
69                    >
70                        Passwort ändern
71                    </button>
72                ZZZZZZZZZZ;
73        }
74
75        $street = $user->getStreet() ?? '(Keine Adresse)';
76        $postal_code = $user->getPostalCode() ?? '(Keine PLZ)';
77        $city = $user->getCity() ?? '(Kein Ort)';
78        $region = $user->getRegion() ?? 'Keine Region';
79        $country_code = $user->getCountryCode() ?? 'Kein Land';
80        $birthdate = $user->getBirthdate()?->format('d.m.Y') ?? '(Unbekannt)';
81        $phone = $user->getPhone() ?? '(Unbekannt)';
82
83        if (
84            !$user->getParentUserId()
85            && !$user->isEmailVerified()
86            && !$this->authUtils()->hasPermission('verified_email', $user)
87        ) {
88            if ($user->getEmailVerificationToken()) {
89                $out .= <<<'ZZZZZZZZZZ'
90                    <div class='alert alert-danger' role='alert'>
91                        Deine E-Mail-Adresse ist noch nicht bestätigt. Bitte prüfe deine Inbox (und dein Spam-Postfach) auf unsere Bestätigungs-E-Mail (Betreff: "[OLZ] E-Mail bestätigen").
92                        <a
93                            href='#'
94                            onclick='olz.initOlzVerifyUserEmailModal()'
95                            id='verify-user-email-link'
96                        >
97                            Erneut senden
98                        </a>
99                    </div>
100                    ZZZZZZZZZZ;
101            } else {
102                $out .= <<<'ZZZZZZZZZZ'
103                    <div class='alert alert-danger' role='alert'>
104                        Deine E-Mail-Adresse ist noch nicht bestätigt.
105                        <a
106                            href='#'
107                            onclick='olz.initOlzVerifyUserEmailModal()'
108                            id='verify-user-email-link'
109                        >
110                            Jetzt bestätigen
111                        </a>
112                    </div>
113                    ZZZZZZZZZZ;
114            }
115        }
116
117        $out .= "<div class='edit-user-container'>{$edit_admin}</div>";
118        $out .= "<div class='image-container'>{$img_html}</div>";
119        $out .= "<h1 class='name-container'>{$user->getFullName()}</h1>";
120        $out .= "<div class='info-container username'>Benutzername: {$user->getUsername()}</div>";
121        if ($can_edit) {
122            $out .= "<div class='info-container address1'>{$street}</div>";
123            $out .= "<div class='info-container address2'>{$postal_code} {$city} ({$region}{$country_code})</div>";
124            $out .= "<div class='info-container birthdate'>Geburtsdatum: {$birthdate}</div>";
125            $out .= "<div class='info-container phone'>Telephon: {$phone}</div>";
126        }
127
128        $has_official_email = $this->authUtils()->hasPermission('user_email', $user);
129        $email_html = '';
130        if ($has_official_email) {
131            $host = $this->envUtils()->getEmailForwardingHost();
132            $email = "{$user->getUsername()}@{$host}";
133            $email_html = $this->htmlUtils()->replaceEmailAdresses($email);
134        } else {
135            $email_html = (
136                $user->getEmail()
137                ? $this->htmlUtils()->replaceEmailAdresses($user->getEmail())
138                : ''
139            );
140        }
141        if ($email_html) {
142            $out .= "<div class='info-container email'>{$email_html}</div>";
143        }
144        $out .= $edit_password;
145
146        if ($can_edit) {
147            $out .= "<h2>Familie</h2>";
148            $child_users = $user_repo->findBy(['parent_user' => $user->getId()]);
149            if ($child_users) {
150                $out .= "<ul class='info-container'>";
151                foreach ($child_users as $child_user) {
152                    $out .= "<li>Familienmitglied <a href='{$code_href}benutzer/{$child_user->getId()}'>{$child_user->getFullName()}</a></li>";
153                }
154                $out .= "</ul>";
155            }
156            if ($user->getParentUserId()) {
157                $parent_user = $user_repo->findOneBy(['id' => $user->getParentUserId()]);
158                $out .= "<div class='info-container'>Familienmitglied von <a href='{$code_href}benutzer/{$parent_user?->getId()}'>{$parent_user?->getFullName()}</a></div>";
159                if ($child_users) {
160                    $this->log()->warning("User {$user->getId()} has parent and children.");
161                }
162            } else {
163                $json_id = json_encode($user->getId());
164                $out .= <<<ZZZZZZZZZZ
165                    <div>
166                        <button
167                            id='add-child-user-button'
168                            class='btn btn-secondary'
169                            onclick='return olz.addChildUser({$json_id})'
170                        >
171                            <img src='{$code_href}assets/icns/new_white_16.svg' class='noborder' />
172                            Familienmitglied hinzufügen
173                        </button>
174                    </div>
175                    ZZZZZZZZZZ;
176            }
177        }
178        $out .= "</div>";
179
180        $out .= OlzFooter::render();
181
182        return $out;
183    }
184}