__( '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' => __( '

Otrzymano nową rezerwację jachtu.

Szczegóły rezerwacji:
Numer rezerwacji: #{booking_id}
Jacht: {yacht_name}
Data rozpoczęcia: {start_date}
Data zakończenia: {end_date}
Liczba dni: {days}
Cena całkowita: {total_price}
Status: {status}

Dane klienta:
Imię i nazwisko: {customer_name}
Email: {customer_email}
Telefon: {customer_phone}

Przejdź do zarządzania rezerwacją

', 'yacht-booking' ), ), self::TYPE_CUSTOMER_CONFIRMED => array( 'subject' => __( '[Potwierdzenie] Rezerwacja #{booking_id} - {site_name}', 'yacht-booking' ), 'body' => __( '

Witaj {customer_name},

Twoja rezerwacja jachtu została potwierdzona.

Szczegóły rezerwacji:
Numer rezerwacji: #{booking_id}
Jacht: {yacht_name}
Data rozpoczęcia: {start_date}
Data zakończenia: {end_date}
Liczba dni: {days}
Cena całkowita: {total_price}

Dziękujemy za wybranie naszych usług.

', 'yacht-booking' ), ), self::TYPE_CUSTOMER_CANCELLED => array( 'subject' => __( '[Anulowanie] Rezerwacja #{booking_id} - {site_name}', 'yacht-booking' ), 'body' => __( '

Witaj {customer_name},

Niestety Twoja rezerwacja jachtu została anulowana.

Szczegóły rezerwacji:
Numer rezerwacji: #{booking_id}
Jacht: {yacht_name}
Data rozpoczęcia: {start_date}
Data zakończenia: {end_date}

W razie pytań prosimy o kontakt.

', '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; } }