Create New Item
×
Item Type
File
Folder
Item Name
×
Search file in folder and subfolders...
File Manager
/
wp-content
/
plugins
/
woocommerce
/
includes
/
gateways
/
bacs
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php if (!defined('ABSPATH')) { exit; } class WC_Gateway_BACS extends WC_Payment_Gateway { public $locale; public function __construct() { $this->id = 'bacs'; $this->icon = apply_filters('woocommerce_bacs_icon', ''); $this->has_fields = false; $this->method_title = __('Direct bank transfer', 'woocommerce'); $this->method_description = __('Take payments in person via BACS. More commonly known as direct bank/wire transfer.', 'woocommerce'); $this->init_form_fields(); $this->init_settings(); $this->title = $this->get_option('title'); $this->description = $this->get_option('description'); $this->instructions = $this->get_option('instructions'); $this->account_details = get_option('woocommerce_bacs_accounts', array(array('account_name' => $this->get_option('account_name'), 'account_number' => $this->get_option('account_number'), 'sort_code' => $this->get_option('sort_code'), 'bank_name' => $this->get_option('bank_name'), 'iban' => $this->get_option('iban'), 'bic' => $this->get_option('bic')))); add_action('woocommerce_update_options_payment_gateways_' . $this->id, array($this, 'process_admin_options')); add_action('woocommerce_update_options_payment_gateways_' . $this->id, array($this, 'save_account_details')); add_action('woocommerce_thankyou_bacs', array($this, 'thankyou_page')); add_action('woocommerce_email_before_order_table', array($this, 'email_instructions'), 10, 3); } public function init_form_fields() { $this->form_fields = array('enabled' => array('title' => __('Enable/Disable', 'woocommerce'), 'type' => 'checkbox', 'label' => __('Enable bank transfer', 'woocommerce'), 'default' => 'no'), 'title' => array('title' => __('Title', 'woocommerce'), 'type' => 'text', 'description' => __('This controls the title which the user sees during checkout.', 'woocommerce'), 'default' => __('Direct bank transfer', 'woocommerce'), 'desc_tip' => true), 'description' => array('title' => __('Description', 'woocommerce'), 'type' => 'textarea', 'description' => __('Payment method description that the customer will see on your checkout.', 'woocommerce'), 'default' => __('Make your payment directly into our bank account. Please use your Order ID as the payment reference. Your order will not be shipped until the funds have cleared in our account.', 'woocommerce'), 'desc_tip' => true), 'instructions' => array('title' => __('Instructions', 'woocommerce'), 'type' => 'textarea', 'description' => __('Instructions that will be added to the thank you page and emails.', 'woocommerce'), 'default' => '', 'desc_tip' => true), 'account_details' => array('type' => 'account_details')); } public function generate_account_details_html() { ob_start(); $country = WC()->countries->get_base_country(); $locale = $this->get_country_locale(); $sortcode = isset($locale[$country]['sortcode']['label']) ? $locale[$country]['sortcode']['label'] : __('Sort code', 'woocommerce'); ?> <tr valign="top"> <th scope="row" class="titledesc"><?php esc_html_e('Account details:', 'woocommerce'); ?></th> <td class="forminp" id="bacs_accounts"> <div class="wc_input_table_wrapper"> <table class="widefat wc_input_table sortable" cellspacing="0"> <thead> <tr> <th class="sort"> </th> <th><?php esc_html_e('Account name', 'woocommerce'); ?></th> <th><?php esc_html_e('Account number', 'woocommerce'); ?></th> <th><?php esc_html_e('Bank name', 'woocommerce'); ?></th> <th><?php echo esc_html($sortcode); ?></th> <th><?php esc_html_e('IBAN', 'woocommerce'); ?></th> <th><?php esc_html_e('BIC / Swift', 'woocommerce'); ?></th> </tr> </thead> <tbody class="accounts"> <?php $i = -1; if ($this->account_details) { foreach ($this->account_details as $account) { $i++; echo '<tr class="account"> <td class="sort"></td> <td><input type="text" value="' . esc_attr(wp_unslash($account['account_name'])) . '" name="bacs_account_name[' . esc_attr($i) . ']" /></td> <td><input type="text" value="' . esc_attr($account['account_number']) . '" name="bacs_account_number[' . esc_attr($i) . ']" /></td> <td><input type="text" value="' . esc_attr(wp_unslash($account['bank_name'])) . '" name="bacs_bank_name[' . esc_attr($i) . ']" /></td> <td><input type="text" value="' . esc_attr($account['sort_code']) . '" name="bacs_sort_code[' . esc_attr($i) . ']" /></td> <td><input type="text" value="' . esc_attr($account['iban']) . '" name="bacs_iban[' . esc_attr($i) . ']" /></td> <td><input type="text" value="' . esc_attr($account['bic']) . '" name="bacs_bic[' . esc_attr($i) . ']" /></td> </tr>'; } } ?> </tbody> <tfoot> <tr> <th colspan="7"><a href="#" class="add button"><?php esc_html_e('+ Add account', 'woocommerce'); ?></a> <a href="#" class="remove_rows button"><?php esc_html_e('Remove selected account(s)', 'woocommerce'); ?></a></th> </tr> </tfoot> </table> </div> <script type="text/javascript"> jQuery(function() { jQuery('#bacs_accounts').on( 'click', 'a.add', function(){ var size = jQuery('#bacs_accounts').find('tbody .account').length; jQuery('<tr class="account">\ <td class="sort"></td>\ <td><input type="text" name="bacs_account_name[' + size + ']" /></td>\ <td><input type="text" name="bacs_account_number[' + size + ']" /></td>\ <td><input type="text" name="bacs_bank_name[' + size + ']" /></td>\ <td><input type="text" name="bacs_sort_code[' + size + ']" /></td>\ <td><input type="text" name="bacs_iban[' + size + ']" /></td>\ <td><input type="text" name="bacs_bic[' + size + ']" /></td>\ </tr>').appendTo('#bacs_accounts table tbody'); return false; }); }); </script> </td> </tr> <?php return ob_get_clean(); } public function save_account_details() { $accounts = array(); if (isset($_POST['bacs_account_name']) && isset($_POST['bacs_account_number']) && isset($_POST['bacs_bank_name']) && isset($_POST['bacs_sort_code']) && isset($_POST['bacs_iban']) && isset($_POST['bacs_bic'])) { $account_names = wc_clean(wp_unslash($_POST['bacs_account_name'])); $account_numbers = wc_clean(wp_unslash($_POST['bacs_account_number'])); $bank_names = wc_clean(wp_unslash($_POST['bacs_bank_name'])); $sort_codes = wc_clean(wp_unslash($_POST['bacs_sort_code'])); $ibans = wc_clean(wp_unslash($_POST['bacs_iban'])); $bics = wc_clean(wp_unslash($_POST['bacs_bic'])); foreach ($account_names as $i => $name) { if (!isset($account_names[$i])) { continue; } $accounts[] = array('account_name' => $account_names[$i], 'account_number' => $account_numbers[$i], 'bank_name' => $bank_names[$i], 'sort_code' => $sort_codes[$i], 'iban' => $ibans[$i], 'bic' => $bics[$i]); } } update_option('woocommerce_bacs_accounts', $accounts); } public function thankyou_page($order_id) { if ($this->instructions) { echo wp_kses_post(wpautop(wptexturize(wp_kses_post($this->instructions)))); } $this->bank_details($order_id); } public function email_instructions($order, $sent_to_admin, $plain_text = false) { if (!$sent_to_admin && 'bacs' === $order->get_payment_method() && $order->has_status('on-hold')) { if ($this->instructions) { echo wp_kses_post(wpautop(wptexturize($this->instructions)) . PHP_EOL); } $this->bank_details($order->get_id()); } } private function bank_details($order_id = '') { if (empty($this->account_details)) { return; } $order = wc_get_order($order_id); $country = $order->get_billing_country(); $locale = $this->get_country_locale(); $sortcode = isset($locale[$country]['sortcode']['label']) ? $locale[$country]['sortcode']['label'] : __('Sort code', 'woocommerce'); $bacs_accounts = apply_filters('woocommerce_bacs_accounts', $this->account_details, $order_id); if (!empty($bacs_accounts)) { $account_html = ''; $has_details = false; foreach ($bacs_accounts as $bacs_account) { $bacs_account = (object) $bacs_account; if ($bacs_account->account_name) { $account_html .= '<h3 class="wc-bacs-bank-details-account-name">' . wp_kses_post(wp_unslash($bacs_account->account_name)) . ':</h3>' . PHP_EOL; } $account_html .= '<ul class="wc-bacs-bank-details order_details bacs_details">' . PHP_EOL; $account_fields = apply_filters('woocommerce_bacs_account_fields', array('bank_name' => array('label' => __('Bank', 'woocommerce'), 'value' => $bacs_account->bank_name), 'account_number' => array('label' => __('Account number', 'woocommerce'), 'value' => $bacs_account->account_number), 'sort_code' => array('label' => $sortcode, 'value' => $bacs_account->sort_code), 'iban' => array('label' => __('IBAN', 'woocommerce'), 'value' => $bacs_account->iban), 'bic' => array('label' => __('BIC', 'woocommerce'), 'value' => $bacs_account->bic)), $order_id); foreach ($account_fields as $field_key => $field) { if (!empty($field['value'])) { $account_html .= '<li class="' . esc_attr($field_key) . '">' . wp_kses_post($field['label']) . ': <strong>' . wp_kses_post(wptexturize($field['value'])) . '</strong></li>' . PHP_EOL; $has_details = true; } } $account_html .= '</ul>'; } if ($has_details) { echo '<section class="woocommerce-bacs-bank-details"><h2 class="wc-bacs-bank-details-heading">' . esc_html__('Our bank details', 'woocommerce') . '</h2>' . wp_kses_post(PHP_EOL . $account_html) . '</section>'; } } } public function process_payment($order_id) { $order = wc_get_order($order_id); if ($order->get_total() > 0) { $order->update_status(apply_filters('woocommerce_bacs_process_payment_order_status', 'on-hold', $order), __('Awaiting BACS payment', 'woocommerce')); } else { $order->payment_complete(); } WC()->cart->empty_cart(); return array('result' => 'success', 'redirect' => $this->get_return_url($order)); } public function get_country_locale() { if (empty($this->locale)) { $this->locale = apply_filters('woocommerce_get_bacs_locale', array('AU' => array('sortcode' => array('label' => __('BSB', 'woocommerce'))), 'CA' => array('sortcode' => array('label' => __('Bank transit number', 'woocommerce'))), 'IN' => array('sortcode' => array('label' => __('IFSC', 'woocommerce'))), 'IT' => array('sortcode' => array('label' => __('Branch sort', 'woocommerce'))), 'NZ' => array('sortcode' => array('label' => __('Bank code', 'woocommerce'))), 'SE' => array('sortcode' => array('label' => __('Bank code', 'woocommerce'))), 'US' => array('sortcode' => array('label' => __('Routing number', 'woocommerce'))), 'ZA' => array('sortcode' => array('label' => __('Branch code', 'woocommerce'))))); } return $this->locale; } }