getConnection(); $row = $pdo->query("SELECT * FROM `option` LIMIT 1")->fetch(PDO::FETCH_ASSOC) ?: []; } catch (Throwable $e) { $row = []; } $opt = [ 'cc_email' => trim((string) ($row['event_notify_email'] ?? '')), 'cc' => [ 'booking' => ($row['event_cc_booking'] ?? 'N') === 'Y', 'user_cancel' => ($row['event_cc_user_cancel'] ?? 'N') === 'Y', 'event_cancel' => ($row['event_cc_event_cancel'] ?? 'N') === 'Y', 'reminder' => ($row['event_cc_reminder'] ?? 'N') === 'Y', 'promotion' => ($row['event_cc_promotion'] ?? 'N') === 'Y', ], ]; return $opt; } /* ---------- Invio base ---------- */ function yse_send(string $to, string $toName, string $subject, string $html, bool $ccSchool): bool { $env = $_ENV; try { $mail = new \PHPMailer\PHPMailer\PHPMailer(true); $mail->isSMTP(); $mail->Host = $env['MAIL_HOST'] ?? ''; $mail->SMTPAuth = true; $mail->Username = $env['MAIL_USERNAME'] ?? ''; $mail->Password = $env['MAIL_PASSWORD'] ?? ''; $enc = strtolower($env['MAIL_ENCRYPTION'] ?? 'ssl'); $mail->SMTPSecure = ($enc === 'tls') ? \PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS : \PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_SMTPS; $mail->Port = (int) ($env['MAIL_PORT'] ?? 465); $mail->CharSet = 'UTF-8'; $mail->setFrom($env['MAIL_FROM_ADDRESS'] ?? 'info@yogasoul.it', $env['MAIL_FROM_NAME'] ?? 'YogiBook'); $mail->addAddress($to, $toName); if ($ccSchool) { $ccEmail = yse_mail_options()['cc_email']; if ($ccEmail !== '' && strcasecmp($ccEmail, $to) !== 0) { $mail->addCC($ccEmail); } } $mail->isHTML(true); $mail->Subject = $subject; $mail->Body = $html; $mail->AltBody = trim(preg_replace( '/\n{3,}/', "\n\n", strip_tags(str_replace(['

', '
', '
', '
', ''], "\n", $html)) )); return $mail->send(); } catch (Throwable $e) { error_log('[event mail] ' . $e->getMessage()); return false; } } /* ---------- Helper contenuto ---------- */ function yse_h($v): string { return htmlspecialchars((string) $v, ENT_QUOTES, 'UTF-8'); } function yse_fmt_datetime(array $event): string { $mesi = [ 1 => 'gennaio', 2 => 'febbraio', 3 => 'marzo', 4 => 'aprile', 5 => 'maggio', 6 => 'giugno', 7 => 'luglio', 8 => 'agosto', 9 => 'settembre', 10 => 'ottobre', 11 => 'novembre', 12 => 'dicembre' ]; $t = strtotime($event['starts_at']); $s = (int) date('j', $t) . ' ' . $mesi[(int) date('n', $t)] . ' ' . date('Y', $t) . ' · ' . date('H:i', $t); if (!empty($event['ends_at'])) { $s .= '–' . date('H:i', strtotime($event['ends_at'])); } return $s; } function yse_maps_link(array $event): string { $q = trim((string) ($event['address'] ?? '')); if ($q === '' && !empty($event['lat']) && !empty($event['lng'])) { $q = $event['lat'] . ',' . $event['lng']; } return $q !== '' ? 'https://www.google.com/maps/search/?api=1&query=' . rawurlencode($q) : ''; } function yse_event_info_block(array $event): string { $accent = (isset($event['color']) && preg_match('/^#[0-9a-fA-F]{6}$/', $event['color'])) ? $event['color'] : '#4CAF50'; $when = yse_h(yse_fmt_datetime($event)); $addr = trim((string) ($event['address'] ?? '')); $maps = yse_maps_link($event); $rows = 'Quando' . $when . ''; if ($addr !== '') { $mapsLink = $maps !== '' ? '  apri mappa' : ''; $rows .= 'Dove' . yse_h($addr) . $mapsLink . ''; } $info = ''; foreach ([['suitable_for', 'Per chi è adatto'], ['what_to_bring', 'Cosa portare'], ['instructions', 'Istruzioni']] as $f) { $val = trim((string) ($event[$f[0]] ?? '')); if ($val !== '') { $info .= '

' . $f[1] . ':
' . nl2br(yse_h($val)) . '

'; } } $html = '' . $rows . '
'; if ($info !== '') { $html .= '
' . $info . '
'; } return $html; } function yse_email_layout(array $event, string $heading, string $bodyHtml): string { $accent = (isset($event['color']) && preg_match('/^#[0-9a-fA-F]{6}$/', $event['color'])) ? $event['color'] : '#4CAF50'; $from = $_ENV['MAIL_FROM_NAME'] ?? 'YogaSoul'; $title = yse_h($event['title'] ?? ''); return '
' . yse_h($from) . '

' . $heading . '

' . $title . '
' . $bodyHtml . '
Questa email è stata inviata da ' . yse_h($from) . '.
'; } function yse_button(string $url, string $label, string $accent): string { return '' . yse_h($label) . ''; } function yse_cancel_url(array $booking): string { return YB_PUBLIC_BASE . 'apiwp/cancel.php?token=' . rawurlencode($booking['token']); } function yse_confirm_url(array $booking): string { return YB_PUBLIC_BASE . 'apiwp/confirm.php?token=' . rawurlencode($booking['token']); } /* ---------- Builder per tipo ---------- */ /** A) Prenotazione (confermata o lista d'attesa) */ function yse_mail_booking(array $booking, array $event): bool { $accent = $event['color'] ?? '#4CAF50'; $waiting = ($booking['status'] ?? '') === 'waiting'; $parts = explode(' ', trim($booking['name'])); $name = $parts[0] ?? ''; if ($waiting) { $heading = "Sei in lista d'attesa"; $intro = '

Ciao ' . yse_h($name) . ", ti abbiamo messo in lista d'attesa per questo evento. Ti avviseremo appena si libera un posto.

"; } else { $heading = 'Prenotazione confermata'; $intro = '

Ciao ' . yse_h($name) . ', la tua prenotazione è confermata. Ecco i dettagli:

'; } $body = $intro; $body .= yse_event_info_block($event); $body .= '

Posti prenotati: ' . (int) $booking['seats'] . '

'; $body .= '

Se non puoi più partecipare, puoi annullare qui:

'; $body .= '

' . yse_button(yse_cancel_url($booking), 'Annulla prenotazione', $accent) . '

'; $subject = ($waiting ? "Lista d'attesa: " : 'Prenotazione confermata: ') . $event['title']; $html = yse_email_layout($event, $heading, $body); return yse_send($booking['email'], $booking['name'], $subject, $html, yse_mail_options()['cc']['booking']); } /** B) Disdetta fatta dall'utente */ function yse_mail_user_cancel(array $booking, array $event): bool { $parts = explode(' ', trim($booking['name'])); $name = $parts[0] ?? ''; $body = '

Ciao ' . yse_h($name) . ', la tua prenotazione per questo evento è stata annullata.

'; $body .= yse_event_info_block($event); $body .= '

Ci dispiace non vederti questa volta. A presto!

'; $subject = 'Prenotazione annullata: ' . $event['title']; $html = yse_email_layout($event, 'Prenotazione annullata', $body); return yse_send($booking['email'], $booking['name'], $subject, $html, yse_mail_options()['cc']['user_cancel']); } /** C) Evento annullato dall'insegnante (a ciascun iscritto) */ function yse_mail_event_cancel(array $booking, array $event): bool { $parts = explode(' ', trim($booking['name'])); $name = $parts[0] ?? ''; $body = '

Ciao ' . yse_h($name) . ", ci dispiace: l'evento è stato annullato.

"; $body .= yse_event_info_block($event); $body .= '

La tua prenotazione è stata annullata automaticamente. Per informazioni, rispondi pure a questa email.

'; $subject = 'Evento annullato: ' . $event['title']; $html = yse_email_layout($event, 'Evento annullato', $body); return yse_send($booking['email'], $booking['name'], $subject, $html, yse_mail_options()['cc']['event_cancel']); } /** E) Promozione da lista d'attesa — con RICONFERMA */ function yse_mail_promotion(array $booking, array $event): bool { $accent = $event['color'] ?? '#4CAF50'; $parts = explode(' ', trim($booking['name'])); $name = $parts[0] ?? ''; $body = '

Ciao ' . yse_h($name) . ", buone notizie: si è liberato un posto e tocca a te!

"; $body .= yse_event_info_block($event); $body .= '

Conferma entro breve per tenere il posto:

'; $body .= '

' . yse_button(yse_confirm_url($booking), 'Confermo, ci sarò', $accent) . '

'; $body .= '

Se non puoi partecipare, annulla qui così offriamo il posto a un\'altra persona.

'; $subject = 'Si è liberato un posto: ' . $event['title']; $html = yse_email_layout($event, 'Un posto per te', $body); return yse_send($booking['email'], $booking['name'], $subject, $html, yse_mail_options()['cc']['promotion']); } /** D) Promemoria prima dell'evento (testo e punto di ritrovo opzionali) */ function yse_mail_reminder(array $booking, array $event, string $message = '', string $meetingLink = ''): bool { $accent = $event['color'] ?? '#4CAF50'; $parts = explode(' ', trim($booking['name'])); $name = $parts[0] ?? ''; $note = $message !== '' ? nl2br(yse_h($message)) : 'Ti ricordiamo il tuo prossimo appuntamento.'; $body = '

Ciao ' . yse_h($name) . ',
' . $note . '

'; $body .= yse_event_info_block($event); if ($meetingLink !== '') { $body .= '

Punto di ritrovo: apri la posizione sulla mappa

'; } $body .= '

Se non puoi più partecipare, avvisaci annullando:

'; $body .= '

' . yse_button(yse_cancel_url($booking), 'Annulla prenotazione', $accent) . '

'; $subject = 'Promemoria: ' . $event['title']; $html = yse_email_layout($event, 'Ci vediamo presto', $body); return yse_send($booking['email'], $booking['name'], $subject, $html, yse_mail_options()['cc']['reminder']); }