Files
Roman Pyrih 7483681901 first commit
2026-04-21 15:48:41 +02:00

293 lines
8.9 KiB
PHP

<?php
/**
* Email templates helper.
*
* @package YachtBooking
*/
namespace YachtBooking;
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Email templates class.
*/
class Email_Templates {
/**
* Option key.
*/
const OPTION_KEY = 'yacht_booking_email_templates';
/**
* Template type: admin notification.
*/
const TYPE_ADMIN_NEW_BOOKING = 'admin_new_booking';
/**
* Template type: customer confirmed.
*/
const TYPE_CUSTOMER_CONFIRMED = 'customer_confirmed';
/**
* Template type: customer cancelled.
*/
const TYPE_CUSTOMER_CANCELLED = 'customer_cancelled';
/**
* Get template labels.
*
* @return array
*/
public static function get_template_labels() {
return array(
self::TYPE_ADMIN_NEW_BOOKING => __( 'Nowa rezerwacja (email do admina)', 'yacht-booking' ),
self::TYPE_CUSTOMER_CONFIRMED => __( 'Potwierdzenie rezerwacji (email do klienta)', 'yacht-booking' ),
self::TYPE_CUSTOMER_CANCELLED => __( 'Anulowanie rezerwacji (email do klienta)', 'yacht-booking' ),
);
}
/**
* Get available tags for templates.
*
* @return array
*/
public static function get_available_tags() {
return array(
'{booking_id}' => __( 'ID rezerwacji', 'yacht-booking' ),
'{yacht_name}' => __( 'Nazwa jachtu', 'yacht-booking' ),
'{customer_name}' => __( 'Imię i nazwisko klienta', 'yacht-booking' ),
'{customer_email}' => __( 'Email klienta', 'yacht-booking' ),
'{customer_phone}' => __( 'Telefon klienta', 'yacht-booking' ),
'{start_date}' => __( 'Data rozpoczęcia', 'yacht-booking' ),
'{end_date}' => __( 'Data zakończenia', 'yacht-booking' ),
'{days}' => __( 'Liczba dni', 'yacht-booking' ),
'{total_price}' => __( 'Cena całkowita', 'yacht-booking' ),
'{status}' => __( 'Status rezerwacji', 'yacht-booking' ),
'{admin_link}' => __( 'Link do panelu admin', 'yacht-booking' ),
'{site_name}' => __( 'Nazwa strony', 'yacht-booking' ),
);
}
/**
* Get default templates.
*
* @return array
*/
public static function get_default_templates() {
return array(
self::TYPE_ADMIN_NEW_BOOKING => array(
'subject' => __( '[Nowa Rezerwacja] #{booking_id} - {site_name}', 'yacht-booking' ),
'body' => __(
'<p>Otrzymano nową rezerwację jachtu.</p>
<p><strong>Szczegóły rezerwacji:</strong><br>
Numer rezerwacji: #{booking_id}<br>
Jacht: {yacht_name}<br>
Data rozpoczęcia: {start_date}<br>
Data zakończenia: {end_date}<br>
Liczba dni: {days}<br>
Cena całkowita: {total_price}<br>
Status: {status}</p>
<p><strong>Dane klienta:</strong><br>
Imię i nazwisko: {customer_name}<br>
Email: {customer_email}<br>
Telefon: {customer_phone}</p>
<p><a href="{admin_link}">Przejdź do zarządzania rezerwacją</a></p>',
'yacht-booking'
),
),
self::TYPE_CUSTOMER_CONFIRMED => array(
'subject' => __( '[Potwierdzenie] Rezerwacja #{booking_id} - {site_name}', 'yacht-booking' ),
'body' => __(
'<p>Witaj {customer_name},</p>
<p>Twoja rezerwacja jachtu została potwierdzona.</p>
<p><strong>Szczegóły rezerwacji:</strong><br>
Numer rezerwacji: #{booking_id}<br>
Jacht: {yacht_name}<br>
Data rozpoczęcia: {start_date}<br>
Data zakończenia: {end_date}<br>
Liczba dni: {days}<br>
Cena całkowita: {total_price}</p>
<p>Dziękujemy za wybranie naszych usług.</p>',
'yacht-booking'
),
),
self::TYPE_CUSTOMER_CANCELLED => array(
'subject' => __( '[Anulowanie] Rezerwacja #{booking_id} - {site_name}', 'yacht-booking' ),
'body' => __(
'<p>Witaj {customer_name},</p>
<p>Niestety Twoja rezerwacja jachtu została anulowana.</p>
<p><strong>Szczegóły rezerwacji:</strong><br>
Numer rezerwacji: #{booking_id}<br>
Jacht: {yacht_name}<br>
Data rozpoczęcia: {start_date}<br>
Data zakończenia: {end_date}</p>
<p>W razie pytań prosimy o kontakt.</p>',
'yacht-booking'
),
),
);
}
/**
* Get all templates.
*
* @return array
*/
public static function get_templates() {
$defaults = self::get_default_templates();
$saved = get_option( self::OPTION_KEY, array() );
if ( ! is_array( $saved ) ) {
return $defaults;
}
$merged = array();
foreach ( $defaults as $type => $template ) {
$merged[ $type ] = array(
'subject' => isset( $saved[ $type ]['subject'] ) && '' !== trim( (string) $saved[ $type ]['subject'] )
? sanitize_text_field( $saved[ $type ]['subject'] )
: $template['subject'],
'body' => isset( $saved[ $type ]['body'] ) && '' !== trim( (string) $saved[ $type ]['body'] )
? wp_kses_post( $saved[ $type ]['body'] )
: $template['body'],
);
}
return $merged;
}
/**
* Save templates.
*
* @param array $templates Templates.
* @return bool
*/
public static function save_templates( $templates ) {
$defaults = self::get_default_templates();
$normalized = array();
foreach ( $defaults as $type => $default_template ) {
$subject = isset( $templates[ $type ]['subject'] ) ? sanitize_text_field( wp_unslash( $templates[ $type ]['subject'] ) ) : '';
$body = isset( $templates[ $type ]['body'] ) ? wp_kses_post( wp_unslash( $templates[ $type ]['body'] ) ) : '';
$normalized[ $type ] = array(
'subject' => '' !== trim( $subject ) ? $subject : $default_template['subject'],
'body' => '' !== trim( $body ) ? $body : $default_template['body'],
);
}
return update_option( self::OPTION_KEY, $normalized );
}
/**
* Reset to default templates.
*
* @return bool
*/
public static function reset_templates() {
return delete_option( self::OPTION_KEY );
}
/**
* Compile template with replacement tags.
*
* @param string $type Template type.
* @param array $data Data for replacements.
* @return array
*/
public static function compile( $type, $data = array() ) {
$templates = self::get_templates();
if ( ! isset( $templates[ $type ] ) ) {
return array(
'subject' => '',
'body' => '',
);
}
$replacements = self::build_replacements( $data );
return array(
'subject' => strtr( $templates[ $type ]['subject'], $replacements ),
'body' => strtr( $templates[ $type ]['body'], $replacements ),
);
}
/**
* Build replacement map.
*
* @param array $data Raw data.
* @return array
*/
private static function build_replacements( $data ) {
$site_name = get_bloginfo( 'name' );
return array(
'{booking_id}' => isset( $data['booking_id'] ) ? (string) $data['booking_id'] : '',
'{yacht_name}' => isset( $data['yacht_name'] ) ? (string) $data['yacht_name'] : '',
'{customer_name}' => isset( $data['customer_name'] ) ? (string) $data['customer_name'] : '',
'{customer_email}' => isset( $data['customer_email'] ) ? (string) $data['customer_email'] : '',
'{customer_phone}' => isset( $data['customer_phone'] ) ? (string) $data['customer_phone'] : '',
'{start_date}' => isset( $data['start_date'] ) ? (string) $data['start_date'] : '',
'{end_date}' => isset( $data['end_date'] ) ? (string) $data['end_date'] : '',
'{days}' => isset( $data['days'] ) ? (string) $data['days'] : '',
'{total_price}' => isset( $data['total_price'] ) ? (string) $data['total_price'] : '',
'{status}' => isset( $data['status'] ) ? (string) $data['status'] : '',
'{admin_link}' => isset( $data['admin_link'] ) ? (string) $data['admin_link'] : '',
'{site_name}' => $site_name,
);
}
/**
* Build booking data for template replacements.
*
* @param int $booking_id Booking ID.
* @return array
*/
public static function get_booking_template_data( $booking_id ) {
$booking_id = absint( $booking_id );
$yacht_id = Booking::get_yacht_id( $booking_id );
$yacht = get_post( $yacht_id );
$start_date = Booking::get_start_date( $booking_id );
$end_date = Booking::get_end_date( $booking_id );
$status = Booking::get_status( $booking_id );
$days = Availability::count_days( $start_date, $end_date );
return array(
'booking_id' => $booking_id,
'yacht_name' => $yacht ? $yacht->post_title : __( 'Nieznany', 'yacht-booking' ),
'customer_name' => Booking::get_customer_name( $booking_id ),
'customer_email' => Booking::get_customer_email( $booking_id ),
'customer_phone' => Booking::get_customer_phone( $booking_id ),
'start_date' => Settings::format_date( $start_date ),
'end_date' => Settings::format_date( $end_date ),
'days' => $days,
'total_price' => Settings::format_price( Booking::get_total_price( $booking_id ) ),
'status' => self::get_status_label( $status ),
'admin_link' => admin_url( 'admin.php?page=yacht-bookings-list&booking_id=' . $booking_id ),
);
}
/**
* Get localized status label.
*
* @param string $status Status.
* @return string
*/
private static function get_status_label( $status ) {
$labels = array(
'pending' => __( 'Oczekująca', 'yacht-booking' ),
'confirmed' => __( 'Potwierdzona', 'yacht-booking' ),
'cancelled' => __( 'Anulowana', 'yacht-booking' ),
);
return isset( $labels[ $status ] ) ? $labels[ $status ] : $status;
}
}