Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
19 / 19
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
Email
100.00% covered (success)
100.00%
19 / 19
100.00% covered (success)
100.00%
2 / 2
5
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 print_instructions
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
1 / 1
4
1<?php
2/**
3 * Print payment details in customer emails.
4 *
5 * TODO: Prevent sending the on-hold email immediately, reschedule it for one hour later.
6 *
7 * @package    brianhenryie/bh-wp-bitcoin-gateway
8 */
9
10namespace BrianHenryIE\WP_Bitcoin_Gateway\WooCommerce;
11
12use BrianHenryIE\WP_Bitcoin_Gateway\API_Interface;
13use Psr\Log\LoggerAwareTrait;
14use Psr\Log\LoggerInterface;
15use WC_Order;
16
17/**
18 * Load the order details and pass to the email template.
19 */
20class Email {
21    use LoggerAwareTrait;
22
23    const TEMPLATE_NAME = 'emails/email-bitcoin-instructions-status.php';
24
25    /**
26     * Check is the order a bitcoin order.
27     * Get the order details.
28     */
29    protected API_Interface $api;
30
31    /**
32     * Constructor
33     *
34     * @param API_Interface   $api The main plugin functions.
35     * @param LoggerInterface $logger A PSR logger.
36     */
37    public function __construct( API_Interface $api, LoggerInterface $logger ) {
38        $this->setLogger( $logger );
39        $this->api = $api;
40    }
41
42    /**
43     * Add payment instructions or payment status (once paid) to the WC emails.
44     *
45     * @hooked woocommerce_email_before_order_table
46     *
47     * @param WC_Order $order The order object the email is being sent for.
48     * @param bool     $sent_to_admin Is this email being sent to an admin, or a customer.
49     * @param bool     $plain_text Is this plain text email ?( !HTML email ).
50     */
51    public function print_instructions( WC_Order $order, bool $sent_to_admin, bool $plain_text = false ): void {
52
53        if ( $sent_to_admin ) {
54            // TODO: Think about what information should be in admin emails.
55            return;
56        }
57
58        if ( ! $this->api->is_bitcoin_gateway( $order->get_payment_method() ) ) {
59            return;
60        }
61
62        /**
63         * There was an error where seemingly the order object being passed to this function is older than the
64         * one saved in `Bitcoin_Gateway::process_payment()` and the meta was not present, so let's refresh.
65         *
66         * @var WC_Order $order
67         */
68        $order = wc_get_order( $order->get_id() );
69
70        try {
71            $template_args = $this->api->get_formatted_order_details( $order, false );
72        } catch ( \Exception $exception ) {
73            $this->logger->warning(
74                "Failed to get `shop_order:{$order->get_id()}` details for Email template: {$exception->getMessage()}",
75                array(
76                    'order_id'  => $order->get_id(),
77                    'exception' => $exception,
78                )
79            );
80            return;
81        }
82
83        $template_args['template'] = self::TEMPLATE_NAME;
84
85        // TODO: Create a plain text template.
86        wc_get_template( self::TEMPLATE_NAME, $template_args );
87    }
88}