Lizenz-Vertrieb Feinschliff: Zugabe +10%, sichere Datei-Einloesung, Mail-Config
Umsetzung des Thomas-Feedbacks: - Reihenfolge: freie Lizenzen beim Lehrer jetzt ORDER BY id (= Reihenfolge der reinkopierten Liste); stornierte ausgeblendet. - Gratis-Zugabe: Checkbox (Default an) "+10 % aufgerundet" -> geliefert = ceil(bestellt*1.1) (14 -> 16). Batch speichert qty_ordered (verrechnet) und qty (geliefert); Live-Vorschau im Formular. - Einloeselink/QR ENTFERNT (Sicherheitsrisiko: falscher eingeloggter Account). einloesen.html + pages/einloesen.php geloescht, Sammellink aus UI/Mail raus. - CSV: Gueltig-bis + Metadaten nur in der KOPFZEILE, danach reine Code-Zeilen (per Copy-Paste einloesbar). Dateiname: <ExtBestellnr|Datum>_geograsim_<intNr>. - Interne Bestellnummer = batch.id (laufend, nicht editierbar, storno-stabil). - Lehrer-Einloesen: sichere .txt/.csv-Ablage (mehrstufig: Endung+MIME, Groessen- limit, nur Text lesen, Whitelist-Regex extrahiert nur Code-Tokens, Server validiert) — kein Upload, keine Ausfuehrung/Rendering. - Mailsystem: zentrale Config in neuer app_settings (Provider server|aws, Absender-Name/-Adresse, oeffentliche URL), pflegbar in Admin + Test-Versand. Mailer liest Absender aus Config (SMTP-Zugang bleibt in .env). Mailtext nutzt kanonische geograsim.at (nicht v3/localhost). Migrationen: -2 (qty_ordered), -3 (app_settings). Beide additiv, auf v3 angewandt. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+21
-4
@@ -16,13 +16,30 @@ class Mailer {
|
||||
$mail->SMTPSecure = \PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS;
|
||||
$mail->Port = defined('SMTP_PORT') ? (int)SMTP_PORT : 587;
|
||||
$mail->CharSet = 'UTF-8';
|
||||
$mail->setFrom(
|
||||
defined('SMTP_FROM') ? SMTP_FROM : 'support@geograsim.at',
|
||||
defined('SMTP_FROM_NAME') ? SMTP_FROM_NAME : 'GeoGraSim'
|
||||
);
|
||||
[$fromEmail, $fromName] = self::configuredFrom();
|
||||
$mail->setFrom($fromEmail, $fromName);
|
||||
return $mail;
|
||||
}
|
||||
|
||||
/** Absender aus Admin-Config (platform_config_v2), Fallback auf .env-Konstanten.
|
||||
* SMTP-Zugangsdaten bleiben bewusst in .env (geheim) — nur die sichtbare
|
||||
* Absenderadresse/-name ist zentral in der Admin-Oberflaeche pflegbar. */
|
||||
private static function configuredFrom(): array {
|
||||
$email = defined('SMTP_FROM') ? SMTP_FROM : 'support@geograsim.at';
|
||||
$name = defined('SMTP_FROM_NAME') ? SMTP_FROM_NAME : 'GeoGraSim';
|
||||
try {
|
||||
if (class_exists('Database')) {
|
||||
$rows = Database::get()->fetchAll(
|
||||
"SELECT skey, sval FROM app_settings WHERE skey IN ('mail_from_email','mail_from_name')");
|
||||
foreach ($rows as $row) {
|
||||
if ($row['skey'] === 'mail_from_email' && !empty($row['sval'])) $email = $row['sval'];
|
||||
if ($row['skey'] === 'mail_from_name' && !empty($row['sval'])) $name = $row['sval'];
|
||||
}
|
||||
}
|
||||
} catch (\Throwable $e) { /* Config nicht verfuegbar -> Defaults */ }
|
||||
return [$email, $name];
|
||||
}
|
||||
|
||||
public static function send(string $to, string $subject, string $htmlBody, string $textBody = ''): bool {
|
||||
try {
|
||||
$mail = self::create();
|
||||
|
||||
Reference in New Issue
Block a user