diff --git a/includes/Core/Notifications/DefaultEmailTemplates.php b/includes/Core/Notifications/DefaultEmailTemplates.php new file mode 100644 index 0000000..9884e10 --- /dev/null +++ b/includes/Core/Notifications/DefaultEmailTemplates.php @@ -0,0 +1,280 @@ + string, 'body' => string] + */ + public static function get_template($event_id, $recipient_type) { + $templates = self::get_all_templates(); + + if (isset($templates[$event_id][$recipient_type])) { + return $templates[$event_id][$recipient_type]; + } + + // Fallback + return [ + 'subject' => __('Notification from {store_name}', 'woonoow'), + 'body' => '[card type="default"]

' . __('You have a new notification.', 'woonoow') . '

[/card]', + ]; + } + + /** + * Get all default templates + * + * @return array + */ + private static function get_all_templates() { + return [ + // ORDER EVENTS + 'order_placed' => [ + 'staff' => [ + 'subject' => __('New Order #{order_number} Received', 'woonoow'), + 'body' => '[card type="hero"] +

' . __('New Order Received!', 'woonoow') . '

+

' . __('You have received a new order from {customer_name}.', 'woonoow') . '

+[/card] + +[card type="default"] +

' . __('Order Details', 'woonoow') . '

+

' . __('Order Number:', 'woonoow') . ' #{order_number}

+

' . __('Order Total:', 'woonoow') . ' {order_total}

+

' . __('Order Date:', 'woonoow') . ' {order_date}

+

' . __('Payment Method:', 'woonoow') . ' {payment_method}

+[/card] + +[card type="default"] +

' . __('Customer Details', 'woonoow') . '

+

' . __('Name:', 'woonoow') . ' {customer_name}

+

' . __('Email:', 'woonoow') . ' {customer_email}

+

' . __('Phone:', 'woonoow') . ' {customer_phone}

+[/card] + +[card type="default"] +

' . __('Order Items', 'woonoow') . '

+{order_items_list} +[/card] + +[button link="{order_url}" style="solid"]' . __('View Order Details', 'woonoow') . '[/button]', + ], + ], + + 'order_processing' => [ + 'customer' => [ + 'subject' => __('Your Order #{order_number} is Being Processed', 'woonoow'), + 'body' => '[card type="success"] +

' . __('Order Confirmed!', 'woonoow') . '

+

' . __('Thank you for your order. We\'re now processing it and will ship it soon.', 'woonoow') . '

+[/card] + +[card type="default"] +

' . __('Order Summary', 'woonoow') . '

+

' . __('Order Number:', 'woonoow') . ' #{order_number}

+

' . __('Order Total:', 'woonoow') . ' {order_total}

+

' . __('Order Status:', 'woonoow') . ' {order_status}

+[/card] + +[card type="default"] +

' . __('What\'s Next?', 'woonoow') . '

+

' . __('We\'ll send you another email once your order has been shipped with tracking information.', 'woonoow') . '

+[/card] + +[card type="default"] +

' . __('Order Items', 'woonoow') . '

+{order_items_list} +[/card] + +[button link="{order_url}" style="solid"]' . __('Track Your Order', 'woonoow') . '[/button]', + ], + ], + + 'order_completed' => [ + 'customer' => [ + 'subject' => __('Your Order #{order_number} is Complete', 'woonoow'), + 'body' => '[card type="success"] +

' . __('Order Completed!', 'woonoow') . '

+

' . __('Your order has been completed. We hope you enjoy your purchase!', 'woonoow') . '

+[/card] + +[card type="default"] +

' . __('Order Details', 'woonoow') . '

+

' . __('Order Number:', 'woonoow') . ' #{order_number}

+

' . __('Order Total:', 'woonoow') . ' {order_total}

+

' . __('Completed Date:', 'woonoow') . ' {order_date}

+[/card] + +[card type="default"] +

' . __('Thank You!', 'woonoow') . '

+

' . __('Thank you for shopping with us. We appreciate your business and hope to serve you again soon.', 'woonoow') . '

+

' . __('If you have any questions or concerns about your order, please don\'t hesitate to contact us.', 'woonoow') . '

+[/card] + +[button link="{order_url}" style="solid"]' . __('View Order', 'woonoow') . '[/button] +[button link="{store_url}" style="outline"]' . __('Continue Shopping', 'woonoow') . '[/button]', + ], + ], + + 'order_cancelled' => [ + 'staff' => [ + 'subject' => __('Order #{order_number} Cancelled', 'woonoow'), + 'body' => '[card type="warning"] +

' . __('Order Cancelled', 'woonoow') . '

+

' . __('Order #{order_number} has been cancelled.', 'woonoow') . '

+[/card] + +[card type="default"] +

' . __('Order Details', 'woonoow') . '

+

' . __('Order Number:', 'woonoow') . ' #{order_number}

+

' . __('Order Total:', 'woonoow') . ' {order_total}

+

' . __('Customer:', 'woonoow') . ' {customer_name}

+

' . __('Cancelled Date:', 'woonoow') . ' {order_date}

+[/card] + +[button link="{order_url}" style="solid"]' . __('View Order Details', 'woonoow') . '[/button]', + ], + ], + + 'order_refunded' => [ + 'customer' => [ + 'subject' => __('Your Order #{order_number} Has Been Refunded', 'woonoow'), + 'body' => '[card type="info"] +

' . __('Refund Processed', 'woonoow') . '

+

' . __('Your refund for order #{order_number} has been processed.', 'woonoow') . '

+[/card] + +[card type="default"] +

' . __('Refund Details', 'woonoow') . '

+

' . __('Order Number:', 'woonoow') . ' #{order_number}

+

' . __('Refund Amount:', 'woonoow') . ' {refund_amount}

+

' . __('Refund Date:', 'woonoow') . ' {order_date}

+[/card] + +[card type="default"] +

' . __('What Happens Next?', 'woonoow') . '

+

' . __('The refund will be credited back to your original payment method within 5-10 business days.', 'woonoow') . '

+

' . __('If you have any questions, please contact us.', 'woonoow') . '

+[/card] + +[button link="{order_url}" style="solid"]' . __('View Order', 'woonoow') . '[/button]', + ], + ], + + // PRODUCT EVENTS + 'low_stock' => [ + 'staff' => [ + 'subject' => __('Low Stock Alert: {product_name}', 'woonoow'), + 'body' => '[card type="warning"] +

' . __('Low Stock Alert', 'woonoow') . '

+

' . __('The following product is running low on stock.', 'woonoow') . '

+[/card] + +[card type="default"] +

' . __('Product Details', 'woonoow') . '

+

' . __('Product:', 'woonoow') . ' {product_name}

+

' . __('SKU:', 'woonoow') . ' {product_sku}

+

' . __('Current Stock:', 'woonoow') . ' {stock_quantity}

+

' . __('Low Stock Threshold:', 'woonoow') . ' {low_stock_threshold}

+[/card] + +[card type="default"] +

' . __('Action Required', 'woonoow') . '

+

' . __('Please restock this product to avoid running out of inventory.', 'woonoow') . '

+[/card] + +[button link="{product_url}" style="solid"]' . __('View Product', 'woonoow') . '[/button]', + ], + ], + + 'out_of_stock' => [ + 'staff' => [ + 'subject' => __('Out of Stock Alert: {product_name}', 'woonoow'), + 'body' => '[card type="warning"] +

' . __('Out of Stock Alert', 'woonoow') . '

+

' . __('The following product is now out of stock.', 'woonoow') . '

+[/card] + +[card type="default"] +

' . __('Product Details', 'woonoow') . '

+

' . __('Product:', 'woonoow') . ' {product_name}

+

' . __('SKU:', 'woonoow') . ' {product_sku}

+

' . __('Current Stock:', 'woonoow') . ' 0

+[/card] + +[card type="default"] +

' . __('Immediate Action Required', 'woonoow') . '

+

' . __('This product is no longer available for purchase. Please restock as soon as possible.', 'woonoow') . '

+[/card] + +[button link="{product_url}" style="solid"]' . __('Manage Product', 'woonoow') . '[/button]', + ], + ], + + // CUSTOMER EVENTS + 'new_customer' => [ + 'customer' => [ + 'subject' => __('Welcome to {store_name}!', 'woonoow'), + 'body' => '[card type="hero"] +

' . __('Welcome!', 'woonoow') . '

+

' . __('Thank you for creating an account with {store_name}. We\'re excited to have you!', 'woonoow') . '

+[/card] + +[card type="default"] +

' . __('Your Account Details', 'woonoow') . '

+

' . __('Username:', 'woonoow') . ' {customer_username}

+

' . __('Email:', 'woonoow') . ' {customer_email}

+[/card] + +[card type="default"] +

' . __('Get Started', 'woonoow') . '

+

' . __('You can now log in to your account to:', 'woonoow') . '

+ +[/card] + +[button link="{account_url}" style="solid"]' . __('Go to My Account', 'woonoow') . '[/button] +[button link="{store_url}" style="outline"]' . __('Start Shopping', 'woonoow') . '[/button]', + ], + ], + + 'customer_note' => [ + 'customer' => [ + 'subject' => __('Note Added to Your Order #{order_number}', 'woonoow'), + 'body' => '[card type="info"] +

' . __('Order Note Added', 'woonoow') . '

+

' . __('A note has been added to your order #{order_number}.', 'woonoow') . '

+[/card] + +[card type="default"] +

' . __('Order Details', 'woonoow') . '

+

' . __('Order Number:', 'woonoow') . ' #{order_number}

+

' . __('Order Status:', 'woonoow') . ' {order_status}

+[/card] + +[card type="default"] +

' . __('Note from Store', 'woonoow') . '

+

{customer_note}

+[/card] + +[button link="{order_url}" style="solid"]' . __('View Order', 'woonoow') . '[/button]', + ], + ], + ]; + } +} diff --git a/includes/Core/Notifications/TemplateProvider.php b/includes/Core/Notifications/TemplateProvider.php index 225198a..8e73595 100644 --- a/includes/Core/Notifications/TemplateProvider.php +++ b/includes/Core/Notifications/TemplateProvider.php @@ -128,155 +128,121 @@ class TemplateProvider { * @return array */ public static function get_default_templates() { - // Try to load WooCommerce email templates - $wc_new_order = self::get_wc_email_template('WC_Email_New_Order'); - $wc_processing = self::get_wc_email_template('WC_Email_Customer_Processing_Order'); - $wc_completed = self::get_wc_email_template('WC_Email_Customer_Completed_Order'); - $wc_refunded = self::get_wc_email_template('WC_Email_Customer_Refunded_Order'); - $wc_cancelled = self::get_wc_email_template('WC_Email_Cancelled_Order'); - $wc_new_account = self::get_wc_email_template('WC_Email_Customer_New_Account'); - $wc_customer_note = self::get_wc_email_template('WC_Email_Customer_Note'); + $templates = []; - return [ - // Email templates - Staff - 'order_placed_email' => [ - 'event_id' => 'order_placed', - 'channel_id' => 'email', - 'subject' => $wc_new_order['subject'] ?? __('New Order #{order_number}', 'woonoow'), - 'body' => __('[card] -

New Order Received

-

Hi Admin,

-

You have received a new order from {customer_name}.

-
-

Order #{order_number}

-

Total: {order_total}

-
-[/card] - -[card] -

Customer Details

-

Name: {customer_name}
-Email: {customer_email}
-Phone: {customer_phone}

-[/card] - -[button link="{order_url}" style="solid"]View Order Details[/button]', 'woonoow'), - 'variables' => self::get_order_variables(), - 'wc_email_id' => 'WC_Email_New_Order', - ], - 'order_processing_email' => [ - 'event_id' => 'order_processing', - 'channel_id' => 'email', - 'subject' => $wc_processing['subject'] ?? __('Your order #{order_number} is being processed', 'woonoow'), - 'body' => __('[card type="success"] -

✅ Order Confirmed!

-

Hi {customer_name},

-

Thank you for your order! We\'re now processing it and will notify you once it ships.

-[/card] - -[card] -

Order Summary

-
-

Order #{order_number}

-

Total: {order_total}

-

Payment: {payment_method}

-
-{order_items_table} -[/card] - -[button link="{order_url}" style="solid"]Track Your Order[/button] - -[card] -

Questions? Reply to this email or contact us.

-[/card]', 'woonoow'), - 'variables' => self::get_order_variables(), - 'wc_email_id' => 'WC_Email_Customer_Processing_Order', - ], - 'order_completed_email' => [ - 'event_id' => 'order_completed', - 'channel_id' => 'email', - 'subject' => $wc_completed['subject'] ?? __('Your order #{order_number} is complete', 'woonoow'), - 'body' => __("Hi {customer_name},\n\nYour order has been completed and shipped!\n\nOrder Number: {order_number}\nOrder Total: {order_total}\nTracking Number: {tracking_number}\n\nThank you for shopping with us!\n\nBest regards,\n{store_name}", 'woonoow'), - 'variables' => self::get_order_variables(), - 'wc_email_id' => 'WC_Email_Customer_Completed_Order', - ], - 'order_cancelled_email' => [ - 'event_id' => 'order_cancelled', - 'channel_id' => 'email', - 'subject' => $wc_cancelled['subject'] ?? __('Order #{order_number} has been cancelled', 'woonoow'), - 'body' => __("Hi Admin,\n\nOrder #{order_number} has been cancelled.\n\nOrder Number: {order_number}\nOrder Total: {order_total}\nCustomer: {customer_name}\n\nView order: {order_url}", 'woonoow'), - 'variables' => self::get_order_variables(), - 'wc_email_id' => 'WC_Email_Cancelled_Order', - ], - 'order_refunded_email' => [ - 'event_id' => 'order_refunded', - 'channel_id' => 'email', - 'subject' => $wc_refunded['subject'] ?? __('Your order #{order_number} has been refunded', 'woonoow'), - 'body' => __("Hi {customer_name},\n\nYour order has been refunded.\n\nOrder Number: {order_number}\nRefund Amount: {refund_amount}\n\nThe refund will be processed within 5-7 business days.\n\nBest regards,\n{store_name}", 'woonoow'), - 'variables' => self::get_order_variables(), - 'wc_email_id' => 'WC_Email_Customer_Refunded_Order', - ], - 'low_stock_email' => [ - 'event_id' => 'low_stock', - 'channel_id' => 'email', - 'subject' => __('Low Stock Alert: {product_name}', 'woonoow'), - 'body' => __("Hi Admin,\n\nThe following product is running low on stock:\n\nProduct: {product_name}\nSKU: {product_sku}\nCurrent Stock: {stock_quantity}\n\nPlease restock soon.\n\nView product: {product_url}", 'woonoow'), - 'variables' => self::get_product_variables(), - ], - 'out_of_stock_email' => [ - 'event_id' => 'out_of_stock', - 'channel_id' => 'email', - 'subject' => __('Out of Stock Alert: {product_name}', 'woonoow'), - 'body' => __("Hi Admin,\n\nThe following product is now out of stock:\n\nProduct: {product_name}\nSKU: {product_sku}\n\nPlease restock immediately.\n\nView product: {product_url}", 'woonoow'), - 'variables' => self::get_product_variables(), - ], - 'new_customer_email' => [ - 'event_id' => 'new_customer', - 'channel_id' => 'email', - 'subject' => $wc_new_account['subject'] ?? __('Welcome to {store_name}!', 'woonoow'), - 'body' => __("Hi {customer_name},\n\nWelcome to {store_name}!\n\nYour account has been created successfully.\n\nEmail: {customer_email}\n\nYou can now browse our products and place orders.\n\nVisit our store: {store_url}\n\nBest regards,\n{store_name}", 'woonoow'), - 'variables' => self::get_customer_variables(), - 'wc_email_id' => 'WC_Email_Customer_New_Account', - ], - 'customer_note_email' => [ - 'event_id' => 'customer_note', - 'channel_id' => 'email', - 'subject' => $wc_customer_note['subject'] ?? __('Note added to your order #{order_number}', 'woonoow'), - 'body' => __("Hi {customer_name},\n\nA note has been added to your order:\n\nOrder Number: {order_number}\nNote: {note_content}\n\nView order: {order_url}\n\nBest regards,\n{store_name}", 'woonoow'), - 'variables' => self::get_order_variables(), - 'wc_email_id' => 'WC_Email_Customer_Note', - ], - - // Push notification templates - 'order_placed_push' => [ - 'event_id' => 'order_placed', - 'channel_id' => 'push', - 'subject' => __('New Order #{order_number}', 'woonoow'), - 'body' => __('New order from {customer_name} - {order_total}', 'woonoow'), - 'variables' => self::get_order_variables(), - ], - 'order_processing_push' => [ - 'event_id' => 'order_processing', - 'channel_id' => 'push', - 'subject' => __('Order Processing', 'woonoow'), - 'body' => __('Your order #{order_number} is being processed', 'woonoow'), - 'variables' => self::get_order_variables(), - ], - 'order_completed_push' => [ - 'event_id' => 'order_completed', - 'channel_id' => 'push', - 'subject' => __('Order Completed', 'woonoow'), - 'body' => __('Your order #{order_number} has been completed!', 'woonoow'), - 'variables' => self::get_order_variables(), - ], - 'low_stock_push' => [ - 'event_id' => 'low_stock', - 'channel_id' => 'push', - 'subject' => __('Low Stock Alert', 'woonoow'), - 'body' => __('{product_name} is running low on stock', 'woonoow'), - 'variables' => self::get_product_variables(), - ], + // Define all events with their recipient types + $events = [ + 'order_placed' => 'staff', + 'order_processing' => 'customer', + 'order_completed' => 'customer', + 'order_cancelled' => 'staff', + 'order_refunded' => 'customer', + 'low_stock' => 'staff', + 'out_of_stock' => 'staff', + 'new_customer' => 'customer', + 'customer_note' => 'customer', ]; + + // Generate email templates from DefaultEmailTemplates + foreach ($events as $event_id => $recipient_type) { + $default = DefaultEmailTemplates::get_template($event_id, $recipient_type); + + $templates["{$event_id}_email"] = [ + 'event_id' => $event_id, + 'channel_id' => 'email', + 'subject' => $default['subject'], + 'body' => $default['body'], + 'variables' => self::get_variables_for_event($event_id), + ]; + } + + // Add push notification templates + $templates['order_placed_push'] = [ + 'event_id' => 'order_placed', + 'channel_id' => 'push', + 'subject' => __('New Order #{order_number}', 'woonoow'), + 'body' => __('New order from {customer_name} - {order_total}', 'woonoow'), + 'variables' => self::get_order_variables(), + ]; + $templates['order_processing_push'] = [ + 'event_id' => 'order_processing', + 'channel_id' => 'push', + 'subject' => __('Order Processing', 'woonoow'), + 'body' => __('Your order #{order_number} is being processed', 'woonoow'), + 'variables' => self::get_order_variables(), + ]; + $templates['order_completed_push'] = [ + 'event_id' => 'order_completed', + 'channel_id' => 'push', + 'subject' => __('Order Completed', 'woonoow'), + 'body' => __('Your order #{order_number} has been completed!', 'woonoow'), + 'variables' => self::get_order_variables(), + ]; + $templates['order_cancelled_push'] = [ + 'event_id' => 'order_cancelled', + 'channel_id' => 'push', + 'subject' => __('Order Cancelled', 'woonoow'), + 'body' => __('Order #{order_number} has been cancelled', 'woonoow'), + 'variables' => self::get_order_variables(), + ]; + $templates['order_refunded_push'] = [ + 'event_id' => 'order_refunded', + 'channel_id' => 'push', + 'subject' => __('Order Refunded', 'woonoow'), + 'body' => __('Your order #{order_number} has been refunded', 'woonoow'), + 'variables' => self::get_order_variables(), + ]; + $templates['low_stock_push'] = [ + 'event_id' => 'low_stock', + 'channel_id' => 'push', + 'subject' => __('Low Stock Alert', 'woonoow'), + 'body' => __('{product_name} is running low on stock', 'woonoow'), + 'variables' => self::get_product_variables(), + ]; + $templates['out_of_stock_push'] = [ + 'event_id' => 'out_of_stock', + 'channel_id' => 'push', + 'subject' => __('Out of Stock Alert', 'woonoow'), + 'body' => __('{product_name} is now out of stock', 'woonoow'), + 'variables' => self::get_product_variables(), + ]; + $templates['new_customer_push'] = [ + 'event_id' => 'new_customer', + 'channel_id' => 'push', + 'subject' => __('Welcome!', 'woonoow'), + 'body' => __('Welcome to {store_name}, {customer_name}!', 'woonoow'), + 'variables' => self::get_customer_variables(), + ]; + $templates['customer_note_push'] = [ + 'event_id' => 'customer_note', + 'channel_id' => 'push', + 'subject' => __('Order Note Added', 'woonoow'), + 'body' => __('A note has been added to order #{order_number}', 'woonoow'), + 'variables' => self::get_order_variables(), + ]; + + return $templates; + } + + /** + * Get variables for a specific event + * + * @param string $event_id Event ID + * @return array + */ + private static function get_variables_for_event($event_id) { + // Product events + if (in_array($event_id, ['low_stock', 'out_of_stock'])) { + return self::get_product_variables(); + } + + // Customer events (but not order-related) + if ($event_id === 'new_customer') { + return self::get_customer_variables(); + } + + // All other events are order-related + return self::get_order_variables(); } /**