MailController.php 10.5 KB
Newer Older
1
2
3
4
<?php

namespace App\Http\Controllers;

5
6
use App\Mail\Kontakt;
use App\Mail\Sprachdatei;
7
use Illuminate\Http\Request;
8
use Illuminate\Http\Response;
9
use LaravelLocalization;
10
use Mail;
Dominik Hebeler's avatar
Dominik Hebeler committed
11
use Log;
12
use Validator;
Dominik Hebeler's avatar
Dominik Hebeler committed
13
14
use \IBAN;
use \IBANCountry;
15
16
17
18
19
20
21
22
23

class MailController extends Controller
{
    /**
     * Load Startpage accordingly to the given URL-Parameter and Mobile
     *
     * @param  int  $id
     * @return Response
     */
Dominik Hebeler's avatar
Dominik Hebeler committed
24
25
    public function contactMail(Request $request)
    {
26
        # Nachricht, die wir an den Nutzer weiterleiten:
Dominik Hebeler's avatar
Dominik Hebeler committed
27
        $messageType = ""; # [success|error]
28
        $returnMessage = '';
29
30

        # Wir benötigen 3 Felder von dem Benutzer wenn diese nicht übermittelt wurden, oder nicht korrekt sind geben wir einen Error zurück
31
        $input_data = $request->all();
32
33

        $maxFileSize = 5 * 1024;
34
        $validator = Validator::make(
35
            $input_data,
36
            [
Dominik Hebeler's avatar
Dominik Hebeler committed
37
                'email' => 'required|email',
Dominik Hebeler's avatar
Dominik Hebeler committed
38
                'pcsrf' => ['required', 'string', new \App\Rules\PCSRF],
39
                'attachments' => ['max:5'],
40
                'attachments.*' => ['file', 'max:' . $maxFileSize],
41
42
43
            ]
        );

Dominik Hebeler's avatar
Dominik Hebeler committed
44
        if ($validator->fails()) {
45
46
47
48
49
            return view('kontakt.kontakt')->with('formerrors', $validator)->with('title', trans('titles.kontakt'))->with('navbarFocus', 'kontakt');
        }

        $name = $request->input('name', '');

Dominik Hebeler's avatar
Dominik Hebeler committed
50
        $replyTo = $request->input('email', 'noreply@metager.de');
Dominik Hebeler's avatar
Dominik Hebeler committed
51
        if ($replyTo === "") {
52
            $replyTo = "noreply@metager.de";
Dominik Hebeler's avatar
Dominik Hebeler committed
53
        } else {
54
55
56
            $replyTo = $request->input('email');
        }

Dominik Hebeler's avatar
Dominik Hebeler committed
57
        if (!$request->filled('message') || !$request->filled('subject')) {
Dominik Hebeler's avatar
Dominik Hebeler committed
58
            $messageType = "error";
59
            $returnMessage = trans('kontakt.error.1');
Dominik Hebeler's avatar
Dominik Hebeler committed
60
        } else {
61
            # Wir versenden die Mail des Benutzers an uns:
62
            $mailto = "support@metager.org";
Dominik Hebeler's avatar
Dominik Hebeler committed
63
            if (LaravelLocalization::getCurrentLocale() === "de") {
Dominik Hebeler's avatar
Dominik Hebeler committed
64
                $mailto = "support+46521@metager.de";
65
            }
66
            $message = $request->input('message');
67
            $subject = $request->input('subject');
68
            $files = $request->file("attachments");
69

70
            Mail::to($mailto)
71
                ->send(new Kontakt($name, $replyTo, $subject, $message, $files));
72

73
            $returnMessage = trans('kontakt.success.1');
Dominik Hebeler's avatar
Dominik Hebeler committed
74
            $messageType = "success";
75
76
77
        }

        return view('kontakt.kontakt')
Dominik Hebeler's avatar
Dominik Hebeler committed
78
            ->with('title', 'Kontakt')
79
            ->with('js', ['lib.js'])
Dominik Hebeler's avatar
Dominik Hebeler committed
80
            ->with($messageType, $returnMessage);
81
82

        
83
    }
Dominik Hebeler's avatar
Dominik Hebeler committed
84
85
86

    public function donation(Request $request)
    {
Dominik Hebeler's avatar
Dominik Hebeler committed
87
88
89
90
91
        $data = [
            'name' => $request->input('Name', ''),
            'iban' => $request->input('iban', ''),
            'bic' => $request->input('bic', ''),
            'email' => $request->input('email', ''),
92
            'betrag' => $request->input('amount', ''),
Phil Höfer's avatar
Phil Höfer committed
93
            'frequency' => $request->input('frequency', ''),
Dominik Hebeler's avatar
Dominik Hebeler committed
94
95
96
97
98
99
            'nachricht' => $request->input('Nachricht', ''),
        ];
        $name = $request->input('Name', '');
        $iban = $request->input('iban', '');
        $bic = $request->input('bic', '');
        $email = $request->input('email', '');
100
        $frequency = $request->input('frequency', '');
Phil Höfer's avatar
Phil Höfer committed
101
        $betrag = $request->input('amount', '');
Dominik Hebeler's avatar
Dominik Hebeler committed
102
        $nachricht = $request->input('Nachricht', '');
103

Phil Höfer's avatar
Phil Höfer committed
104
        # Allow custom amounts
105
        if ($betrag == "custom" && $request->filled('custom-amount')) {
Phil Höfer's avatar
Phil Höfer committed
106
107
108
109
            $betrag = $request->input('custom-amount', '');
            $data['betrag'] = $betrag;
        }

Dominik Hebeler's avatar
Dominik Hebeler committed
110
111
112
113
114
115
116
117
118
        # Check for valid frequency
        $validFrequencies = [
            "once",
            "monthly",
            "quarterly",
            "six-monthly",
            "annual",
        ];

Dominik Hebeler's avatar
Dominik Hebeler committed
119
120
        # Der enthaltene String wird dem Benutzer nach der Spende ausgegeben
        $messageToUser = "";
Dominik Hebeler's avatar
Dominik Hebeler committed
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
        $messageType = ""; # [success|error]

        # Check the IBAN
        $iban = new IBAN($iban);
        $bic = $request->input('Bankleitzahl', '');
        $country = new IBANCountry($iban->Country());
        $isSEPA = filter_var($country->IsSEPA(), FILTER_VALIDATE_BOOLEAN);

        # Check the amount
        $validBetrag = is_numeric($betrag) && $betrag > 0;

        # Validate Email
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $email = "anonymous@suma-ev.de";
        }

        if (!$iban->Verify()) {
Dominik Hebeler's avatar
Dominik Hebeler committed
138
            $messageToUser = trans('spende.error.iban');
Dominik Hebeler's avatar
Dominik Hebeler committed
139
            $messageType = "error";
140
        } elseif (!$isSEPA && $bic === '') {
Dominik Hebeler's avatar
Dominik Hebeler committed
141
            $messageToUser = trans('spende.error.bic');
Dominik Hebeler's avatar
Dominik Hebeler committed
142
            $messageType = "error";
143
        } elseif (!$validBetrag) {
Dominik Hebeler's avatar
Dominik Hebeler committed
144
145
146
147
            $messageToUser = trans('spende.error.amount');
            $messageType = "error";
        } elseif (!in_array($frequency, $validFrequencies)) {
            $messageToUser = trans('spende.error.frequency');
Dominik Hebeler's avatar
Dominik Hebeler committed
148
            $messageType = "error";
Dominik Hebeler's avatar
Dominik Hebeler committed
149
        } else {
Dominik Hebeler's avatar
Dominik Hebeler committed
150

Dominik Hebeler's avatar
Dominik Hebeler committed
151
152
153
            # The value has to have a maximum of 2 decimal digits
            $betrag = round($betrag, 2, PHP_ROUND_HALF_DOWN);

154
155
156
157
158
159
160
            # Folgende Felder werden vom Spendenformular als Input übergeben:
            # Name
            # Telefon
            # email
            # Kontonummer ( IBAN )
            # Bankleitzahl ( BIC )
            # Nachricht
Dominik Hebeler's avatar
Dominik Hebeler committed
161
162
163
164
165
166
167
168

            $message = "\r\nName: " . $name;
            $message .= "\r\nIBAN: " . $iban->HumanFormat();
            if ($bic !== "") {
                $message .= "\r\nBIC: " . $bic;
            }

            $message .= "\r\nBetrag: " . $betrag;
Dominik Hebeler's avatar
Dominik Hebeler committed
169
            $message .= "\r\nHäufigkeit: " . trans('spende.frequency.' . $frequency);
Dominik Hebeler's avatar
Dominik Hebeler committed
170
171
172
173
174
175
176
177
178
            $message .= "\r\nNachricht: " . $nachricht;

            try {
                Mail::to("spenden@suma-ev.de")
                    ->send(new \App\Mail\Spende($email, $message, $name));

                $messageType = "success";
                $messageToUser = "Herzlichen Dank!! Wir haben Ihre Spendenbenachrichtigung erhalten.";
            } catch (\Swift_TransportException $e) {
Dominik Hebeler's avatar
Dominik Hebeler committed
179
                Log::error($e->getMessage());
Dominik Hebeler's avatar
Dominik Hebeler committed
180
181
                $messageType = "error";
                $messageToUser = 'Beim Senden Ihrer Spendenbenachrichtigung ist ein Fehler auf unserer Seite aufgetreten. Bitte schicken Sie eine E-Mail an: office@suma-ev.de, damit wir uns darum kümmern können.';
Dominik Hebeler's avatar
Dominik Hebeler committed
182
183
184
            }
        }

185
        if ($messageType === "error") {
186
            return view('spende.spende')
187
                ->with('title', 'Kontakt')
Dominik Hebeler's avatar
Dominik Hebeler committed
188
189
                ->with($messageType, $messageToUser)
                ->with('data', $data);
190
        } else {
Dominik Hebeler's avatar
Dominik Hebeler committed
191
            $data['iban'] = $iban->HumanFormat();
192
            $data = base64_encode(serialize($data));
193
            return redirect(LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route("danke", ['data' => $data])));
194
        }
Dominik Hebeler's avatar
Dominik Hebeler committed
195
    }
196

197
    #Ueberprueft ob ein bereits vorhandener Eintrag bearbeitet worden ist
198
    public static function isEdited($k, $v, $filename)
199
    {
200
        try {
Dominik Hebeler's avatar
Dominik Hebeler committed
201
            $temp = include resource_path() . "/" . $filename;
202
            foreach ($temp as $key => $value) {
Dominik Hebeler's avatar
Dominik Hebeler committed
203
                if ($k === $key && $v !== $value) {
204
205
                    return true;
                }
Dominik Hebeler's avatar
Dominik Hebeler committed
206
            }
207
208
209
        } catch (\ErrorException $e) {
            #Datei existiert noch nicht
            return true;
210
211
212
213
        }
        return false;
    }

Dominik Hebeler's avatar
Dominik Hebeler committed
214
    public function sendLanguageFile(Request $request, $from, $to, $exclude = "", $email = "")
215
216
217
218
    {
        $filename = $request->input('filename');
        # Wir erstellen nun zunächst den Inhalt der Datei:
        $data = [];
Dominik Hebeler's avatar
Dominik Hebeler committed
219
        $new = 0;
220
        $emailAddress = "";
221
        $editedKeys = "";
222
223
224
225
        foreach ($request->all() as $key => $value) {
            if ($key === "filename" || $value === "") {
                continue;
            }
Dominik Hebeler's avatar
Dominik Hebeler committed
226
            if ($key === "email") {
227
228
229
                $emailAddress = $value;
                continue;
            }
230
            $key = base64_decode($key);
231
232
233
            if (strpos($key, "_new_") === 0 && $value !== "") {
                $new++;
                $key = substr($key, strpos($key, "_new_") + 5);
Dominik Hebeler's avatar
Dominik Hebeler committed
234
                $editedKeys = $editedKeys . "\n" . $key;
235
            } elseif ($this->isEdited($key, $value, $filename)) {
236
                $new++;
Dominik Hebeler's avatar
Dominik Hebeler committed
237
                $editedKeys = $editedKeys . "\n" . $key;
238
            }
239

240
241
242
243
244
245
246
247
248
249
250
251
252
            $key = trim($key);
            if (!strpos($key, "#")) {
                $data[$key] = $value;
            } else {
                $ref = &$data;
                do {
                    $ref = &$ref[substr($key, 0, strpos($key, "#"))];
                    $key = substr($key, strpos($key, "#") + 1);
                } while (strpos($key, "#"));
                $ref = &$ref[$key];
                $ref = $value;
            }
        }
253

254
        $output = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
255
256
257
        $output = preg_replace("/\{/si", "[", $output);
        $output = preg_replace("/\}/si", "]", $output);
        $output = preg_replace("/\": ([\"\[])/si", "\"\t=>\t$1", $output);
Dominik Hebeler's avatar
Dominik Hebeler committed
258

259
260
        $output = "<?php\n\nreturn $output;\n";

261
262
        $message = "Moin moin,\n\nein Benutzer hat eine Sprachdatei aktualisiert.\nBearbeitet wurden die Einträge: $editedKeys\n\nSollten die Texte so in Ordnung sein, ersetzt, oder erstellt die Datei aus dem Anhang in folgendem Pfad:\n$filename\n\nFolgend zusätzlich der Inhalt der Datei:\n\n$output";

263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
        # Wir haben nun eine Mail an uns geschickt, welche die entsprechende Datei beinhaltet.
        # Nun müssen wir den Nutzer eigentlich nur noch zurück leiten und die Letzte bearbeitete Datei ausschließen:
        $ex = [];
        if ($exclude !== "") {
            try {
                $ex = unserialize(base64_decode($exclude));
            } catch (\ErrorException $e) {
                $ex = [];
            }

            if (!isset($ex["files"])) {
                $ex["files"] = [];
            }
        }
        if (!isset($ex["new"])) {
            $ex["new"] = 0;
        }
        $ex['files'][] = basename($filename);
        $ex["new"] += $new;
282
283

        if ($new > 0) {
Dominik Hebeler's avatar
Dominik Hebeler committed
284
            if ($emailAddress !== "") {
Aria Givi's avatar
Aria Givi committed
285
                Mail::to("dev@suma-ev.de")
Dominik Hebeler's avatar
Dominik Hebeler committed
286
                    ->send(new Sprachdatei($message, $output, basename($filename), $emailAddress));
287
            } else {
Aria Givi's avatar
Aria Givi committed
288
                Mail::to("dev@suma-ev.de")
Dominik Hebeler's avatar
Dominik Hebeler committed
289
                    ->send(new Sprachdatei($message, $output, basename($filename)));
290
            }
291
        }
292
        $ex = base64_encode(serialize($ex));
293
294

        return redirect(url('languages/edit', ['from' => $from, 'to' => $to, 'exclude' => $ex, 'email' => $emailAddress]));
295
    }
Dominik Hebeler's avatar
Dominik Hebeler committed
296
}