Completed
Branch GDPR/consent (c6029e)
by
unknown
44:48 queued 29:41
created

Payments_Admin_Page::getPaymentSettingsForm()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 33
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 20
nc 1
nop 0
dl 0
loc 33
rs 8.8571
c 0
b 0
f 0
1
<?php
2
3
use EventEspresso\core\services\loaders\LoaderFactory;
4
5
/**
6
 * Payments_Admin_Page
7
 * This contains the logic for setting up the Event Payments related admin pages.  Any methods without
8
 * phpdoc comments have inline docs with parent class.
9
 * @package         Payments_Admin_Page
10
 * @subpackage      includes/core/admin/Payments_Admin_Page.core.php
11
 * @author          Darren Ethier
12
 *                  ------------------------------------------------------------------------
13
 */
14
class Payments_Admin_Page extends EE_Admin_Page
15
{
16
17
    /**
18
     * Variables used for when we're re-sorting the logs results, in case
19
     * we needed to do two queries and we need to resort
20
     *
21
     * @var string
22
     */
23
    private $_sort_logs_again_direction;
24
25
26
    /**
27
     * @Constructor
28
     * @access public
29
     * @param bool $routing indicate whether we want to just load the object and handle routing or just load the object.
30
     * @return \Payments_Admin_Page
0 ignored issues
show
Comprehensibility Best Practice introduced by
Adding a @return annotation to constructors is generally not recommended as a constructor does not have a meaningful return value.

Adding a @return annotation to a constructor is not recommended, since a constructor does not have a meaningful return value.

Please refer to the PHP core documentation on constructors.

Loading history...
31
     */
32
    public function __construct($routing = true)
33
    {
34
        parent::__construct($routing);
35
    }
36
37
38 View Code Duplication
    protected function _init_page_props()
39
    {
40
        $this->page_slug = EE_PAYMENTS_PG_SLUG;
41
        $this->page_label = __('Payment Methods', 'event_espresso');
42
        $this->_admin_base_url = EE_PAYMENTS_ADMIN_URL;
43
        $this->_admin_base_path = EE_PAYMENTS_ADMIN;
44
    }
45
46
47
    protected function _ajax_hooks()
48
    {
49
        // todo: all hooks for ajax goes here.
50
    }
51
52
53
    protected function _define_page_props()
54
    {
55
        $this->_admin_page_title = $this->page_label;
56
        $this->_labels = array(
57
            'publishbox' => __('Update Settings', 'event_espresso'),
58
        );
59
    }
60
61
62
    protected function _set_page_routes()
63
    {
64
        /**
65
         * note that with payment method capabilities, although we've implemented
66
         * capability mapping which will be used for accessing payment methods owned by
67
         * other users.  This is not fully implemented yet in the payment method ui.
68
         * Currently only the "plural" caps are in active use.
69
         * When cap mapping is implemented, some routes will need to use the singular form of
70
         * capability method and also include the $id of the payment method for the route.
71
         **/
72
        $this->_page_routes = array(
73
            'default'                   => array(
74
                'func'       => '_payment_methods_list',
75
                'capability' => 'ee_edit_payment_methods',
76
            ),
77
            'payment_settings'          => array(
78
                'func'       => '_payment_settings',
79
                'capability' => 'ee_manage_gateways',
80
            ),
81
            'activate_payment_method'   => array(
82
                'func'       => '_activate_payment_method',
83
                'noheader'   => true,
84
                'capability' => 'ee_edit_payment_methods',
85
            ),
86
            'deactivate_payment_method' => array(
87
                'func'       => '_deactivate_payment_method',
88
                'noheader'   => true,
89
                'capability' => 'ee_delete_payment_methods',
90
            ),
91
            'update_payment_method'     => array(
92
                'func'               => '_update_payment_method',
93
                'noheader'           => true,
94
                'headers_sent_route' => 'default',
95
                'capability'         => 'ee_edit_payment_methods',
96
            ),
97
            'update_payment_settings'   => array(
98
                'func'       => '_update_payment_settings',
99
                'noheader'   => true,
100
                'capability' => 'ee_manage_gateways',
101
            ),
102
            'payment_log'               => array(
103
                'func'       => '_payment_log_overview_list_table',
104
                'capability' => 'ee_read_payment_methods',
105
            ),
106
            'payment_log_details'       => array(
107
                'func'       => '_payment_log_details',
108
                'capability' => 'ee_read_payment_methods',
109
            ),
110
        );
111
    }
112
113
114
    protected function _set_page_config()
115
    {
116
        $payment_method_list_config = array(
117
            'nav'           => array(
118
                'label' => __('Payment Methods', 'event_espresso'),
119
                'order' => 10,
120
            ),
121
            'metaboxes'     => $this->_default_espresso_metaboxes,
122
            'help_tabs'     => array_merge(
123
                array(
124
                    'payment_methods_overview_help_tab' => array(
125
                        'title'    => __('Payment Methods Overview', 'event_espresso'),
126
                        'filename' => 'payment_methods_overview',
127
                    ),
128
                ),
129
                $this->_add_payment_method_help_tabs()
130
            ),
131
            'help_tour'     => array('Payment_Methods_Selection_Help_Tour'),
132
            'require_nonce' => false,
133
        );
134
        $this->_page_config = array(
135
            'default'          => $payment_method_list_config,
136
            'payment_settings' => array(
137
                'nav'           => array(
138
                    'label' => __('Settings', 'event_espresso'),
139
                    'order' => 20,
140
                ),
141
                'help_tabs'     => array(
142
                    'payment_methods_settings_help_tab' => array(
143
                        'title'    => __('Payment Method Settings', 'event_espresso'),
144
                        'filename' => 'payment_methods_settings',
145
                    ),
146
                ),
147
                // 'help_tour' => array( 'Payment_Methods_Settings_Help_Tour' ),
148
                'metaboxes'     => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')),
149
                'require_nonce' => false,
150
            ),
151
            'payment_log'      => array(
152
                'nav'           => array(
153
                    'label' => __("Logs", 'event_espresso'),
154
                    'order' => 30,
155
                ),
156
                'list_table'    => 'Payment_Log_Admin_List_Table',
157
                'metaboxes'     => $this->_default_espresso_metaboxes,
158
                'require_nonce' => false,
159
            ),
160
        );
161
    }
162
163
164
    /**
165
     * @return array
166
     */
167
    protected function _add_payment_method_help_tabs()
168
    {
169
        EE_Registry::instance()->load_lib('Payment_Method_Manager');
170
        $payment_method_types = EE_Payment_Method_Manager::instance()->payment_method_types();
171
        $all_pmt_help_tabs_config = array();
172
        foreach ($payment_method_types as $payment_method_type) {
173
            if (! EE_Registry::instance()->CAP->current_user_can(
174
                $payment_method_type->cap_name(),
175
                'specific_payment_method_type_access'
176
            )
177
            ) {
178
                continue;
179
            }
180
            foreach ($payment_method_type->help_tabs_config() as $help_tab_name => $config) {
181
                $template_args = isset($config['template_args']) ? $config['template_args'] : array();
182
                $template_args['admin_page_obj'] = $this;
183
                $all_pmt_help_tabs_config[ $help_tab_name ] = array(
184
                    'title'   => $config['title'],
185
                    'content' => EEH_Template::display_template(
186
                        $payment_method_type->file_folder() . 'help_tabs' . DS . $config['filename'] . '.help_tab.php',
187
                        $template_args,
188
                        true
189
                    ),
190
                );
191
            }
192
        }
193
        return $all_pmt_help_tabs_config;
194
    }
195
196
197
    // none of the below group are currently used for Gateway Settings
198
    protected function _add_screen_options()
199
    {
200
    }
201
202
203
    protected function _add_feature_pointers()
204
    {
205
    }
206
207
208
    public function admin_init()
209
    {
210
    }
211
212
213
    public function admin_notices()
214
    {
215
    }
216
217
218
    public function admin_footer_scripts()
219
    {
220
    }
221
222
223
    public function load_scripts_styles()
224
    {
225
        wp_enqueue_script('ee_admin_js');
226
        wp_enqueue_script('ee-text-links');
227
        wp_enqueue_script(
228
            'espresso_payments',
229
            EE_PAYMENTS_ASSETS_URL . 'espresso_payments_admin.js',
230
            array('espresso-ui-theme', 'ee-datepicker'),
231
            EVENT_ESPRESSO_VERSION,
232
            true
233
        );
234
    }
235
236
237
    public function load_scripts_styles_default()
238
    {
239
        // styles
240
        wp_register_style(
241
            'espresso_payments',
242
            EE_PAYMENTS_ASSETS_URL . 'ee-payments.css',
243
            array(),
244
            EVENT_ESPRESSO_VERSION
245
        );
246
        wp_enqueue_style('espresso_payments');
247
        wp_enqueue_style('ee-text-links');
248
        // scripts
249
    }
250
251
252
    protected function _payment_methods_list()
253
    {
254
        /**
255
         * first let's ensure payment methods have been setup. We do this here because when people activate a
256
         * payment method for the first time (as an addon), it may not setup its capabilities or get registered correctly due
257
         * to the loading process.  However, people MUST setup the details for the payment method so its safe to do a
258
         * recheck here.
259
         */
260
        EE_Registry::instance()->load_lib('Payment_Method_Manager');
261
        EEM_Payment_Method::instance()->verify_button_urls();
262
        // setup tabs, one for each payment method type
263
        $tabs = array();
264
        $payment_methods = array();
265
        foreach (EE_Payment_Method_Manager::instance()->payment_method_types() as $pmt_obj) {
266
            // we don't want to show admin-only PMTs for now
267
            if ($pmt_obj instanceof EE_PMT_Admin_Only) {
268
                continue;
269
            }
270
            // check access
271
            if (! EE_Registry::instance()->CAP->current_user_can(
272
                $pmt_obj->cap_name(),
273
                'specific_payment_method_type_access'
274
            )
275
            ) {
276
                continue;
277
            }
278
            // check for any active pms of that type
279
            $payment_method = EEM_Payment_Method::instance()->get_one_of_type($pmt_obj->system_name());
280
            if (! $payment_method instanceof EE_Payment_Method) {
281
                $payment_method = EE_Payment_Method::new_instance(
282
                    array(
283
                        'PMD_slug'       => sanitize_key($pmt_obj->system_name()),
284
                        'PMD_type'       => $pmt_obj->system_name(),
285
                        'PMD_name'       => $pmt_obj->pretty_name(),
286
                        'PMD_admin_name' => $pmt_obj->pretty_name(),
287
                    )
288
                );
289
            }
290
            $payment_methods[ $payment_method->slug() ] = $payment_method;
291
        }
292
        $payment_methods = apply_filters(
293
            'FHEE__Payments_Admin_Page___payment_methods_list__payment_methods',
294
            $payment_methods
295
        );
296
        foreach ($payment_methods as $payment_method) {
297
            if ($payment_method instanceof EE_Payment_Method) {
298
                add_meta_box(
299
                    // html id
300
                    'espresso_' . $payment_method->slug() . '_payment_settings',
301
                    // title
302
                    sprintf(__('%s Settings', 'event_espresso'), $payment_method->admin_name()),
303
                    // callback
304
                    array($this, 'payment_method_settings_meta_box'),
305
                    // post type
306
                    null,
307
                    // context
308
                    'normal',
309
                    // priority
310
                    'default',
311
                    // callback args
312
                    array('payment_method' => $payment_method)
313
                );
314
                // setup for tabbed content
315
                $tabs[ $payment_method->slug() ] = array(
316
                    'label' => $payment_method->admin_name(),
317
                    'class' => $payment_method->active() ? 'gateway-active' : '',
318
                    'href'  => 'espresso_' . $payment_method->slug() . '_payment_settings',
319
                    'title' => __('Modify this Payment Method', 'event_espresso'),
320
                    'slug'  => $payment_method->slug(),
321
                );
322
            }
323
        }
324
        $this->_template_args['admin_page_header'] = EEH_Tabbed_Content::tab_text_links(
325
            $tabs,
326
            'payment_method_links',
327
            '|',
328
            $this->_get_active_payment_method_slug()
329
        );
330
        $this->display_admin_page_with_sidebar();
331
    }
332
333
334
    /**
335
     *   _get_active_payment_method_slug
336
     *
337
     * @return string
338
     */
339
    protected function _get_active_payment_method_slug()
340
    {
341
        $payment_method_slug = false;
342
        // decide which payment method tab to open first, as dictated by the request's 'payment_method'
343
        if (isset($this->_req_data['payment_method'])) {
344
            // if they provided the current payment method, use it
345
            $payment_method_slug = sanitize_key($this->_req_data['payment_method']);
346
        }
347
        $payment_method = EEM_Payment_Method::instance()->get_one(array(array('PMD_slug' => $payment_method_slug)));
348
        // if that didn't work or wasn't provided, find another way to select the current pm
349
        if (! $this->_verify_payment_method($payment_method)) {
350
            // like, looking for an active one
351
            $payment_method = EEM_Payment_Method::instance()->get_one_active('CART');
352
            // test that one as well
353
            if ($this->_verify_payment_method($payment_method)) {
354
                $payment_method_slug = $payment_method->slug();
355
            } else {
356
                $payment_method_slug = 'paypal_standard';
357
            }
358
        }
359
        return $payment_method_slug;
360
    }
361
362
363
    /**
364
     *    payment_method_settings_meta_box
365
     *    returns TRUE if the passed payment method is properly constructed and the logged in user has the correct
366
     *    capabilities to access it
367
     *
368
     * @param \EE_Payment_Method $payment_method
369
     * @return boolean
370
     */
371
    protected function _verify_payment_method($payment_method)
372
    {
373
        if ($payment_method instanceof EE_Payment_Method && $payment_method->type_obj() instanceof EE_PMT_Base
374
            && EE_Registry::instance()->CAP->current_user_can(
375
                $payment_method->type_obj()->cap_name(),
376
                'specific_payment_method_type_access'
377
            )
378
        ) {
379
            return true;
380
        }
381
        return false;
382
    }
383
384
385
    /**
386
     *    payment_method_settings_meta_box
387
     *
388
     * @param NULL  $post_obj_which_is_null is an object containing the current post (as a $post object)
389
     * @param array $metabox                is an array with metabox id, title, callback, and args elements. the value
390
     *                                      at 'args' has key 'payment_method', as set within _payment_methods_list
391
     * @return string
392
     * @throws EE_Error
393
     */
394
    public function payment_method_settings_meta_box($post_obj_which_is_null, $metabox)
395
    {
396
        $payment_method = isset($metabox['args'], $metabox['args']['payment_method'])
397
            ? $metabox['args']['payment_method'] : null;
398
        if (! $payment_method instanceof EE_Payment_Method) {
399
            throw new EE_Error(
400
                sprintf(
401
                    __(
402
                        'Payment method metabox setup incorrectly. No Payment method object was supplied',
403
                        'event_espresso'
404
                    )
405
                )
406
            );
407
        }
408
        $payment_method_scopes = $payment_method->active();
409
        // if the payment method really exists show its form, otherwise the activation template
410
        if ($payment_method->ID() && ! empty($payment_method_scopes)) {
411
            $form = $this->_generate_payment_method_settings_form($payment_method);
412
            if ($form->form_data_present_in($this->_req_data)) {
413
                $form->receive_form_submission($this->_req_data);
414
            }
415
            echo $form->form_open() . $form->get_html_and_js() . $form->form_close();
416
        } else {
417
            echo $this->_activate_payment_method_button($payment_method)->get_html_and_js();
418
        }
419
    }
420
421
422
    /**
423
     * Gets the form for all the settings related to this payment method type
424
     *
425
     * @access protected
426
     * @param \EE_Payment_Method $payment_method
427
     * @return \EE_Form_Section_Proper
428
     */
429
    protected function _generate_payment_method_settings_form(EE_Payment_Method $payment_method)
430
    {
431
        if (! $payment_method instanceof EE_Payment_Method) {
432
            return new EE_Form_Section_Proper();
433
        }
434
        return new EE_Form_Section_Proper(
435
            array(
436
                'name'            => $payment_method->slug() . '_settings_form',
437
                'html_id'         => $payment_method->slug() . '_settings_form',
438
                'action'          => EE_Admin_Page::add_query_args_and_nonce(
439
                    array(
440
                        'action'         => 'update_payment_method',
441
                        'payment_method' => $payment_method->slug(),
442
                    ),
443
                    EE_PAYMENTS_ADMIN_URL
444
                ),
445
                'layout_strategy' => new EE_Admin_Two_Column_Layout(),
446
                'subsections'     => apply_filters(
447
                    'FHEE__Payments_Admin_Page___generate_payment_method_settings_form__form_subsections',
448
                    array(
449
                        'pci_dss_compliance'      => $this->_pci_dss_compliance($payment_method),
450
                        'currency_support'        => $this->_currency_support($payment_method),
451
                        'payment_method_settings' => $this->_payment_method_settings($payment_method),
452
                        'update'                  => $this->_update_payment_method_button($payment_method),
453
                        'deactivate'              => $this->_deactivate_payment_method_button($payment_method),
454
                        'fine_print'              => $this->_fine_print(),
455
                    ),
456
                    $payment_method
457
                ),
458
            )
459
        );
460
    }
461
462
463
    /**
464
     * _pci_dss_compliance
465
     *
466
     * @access protected
467
     * @param \EE_Payment_Method $payment_method
468
     * @return \EE_Form_Section_Proper
469
     */
470
    protected function _pci_dss_compliance(EE_Payment_Method $payment_method)
471
    {
472
        if ($payment_method->type_obj()->requires_https()) {
473
            return new EE_Form_Section_HTML(
474
                EEH_HTML::tr(
475
                    EEH_HTML::th(
476
                        EEH_HTML::label(
477
                            EEH_HTML::strong(__('IMPORTANT', 'event_espresso'), '', 'important-notice')
478
                        )
479
                    ) .
480
                    EEH_HTML::td(
481
                        EEH_HTML::strong(
482
                            __(
483
                                'You are responsible for your own website security and Payment Card Industry Data Security Standards (PCI DSS) compliance.',
484
                                'event_espresso'
485
                            )
486
                        )
487
                        .
488
                        EEH_HTML::br()
489
                        .
490
                        __('Learn more about ', 'event_espresso')
491
                        . EEH_HTML::link(
492
                            'https://www.pcisecuritystandards.org/merchants/index.php',
493
                            __('PCI DSS compliance', 'event_espresso')
494
                        )
495
                    )
496
                )
497
            );
498
        } else {
499
            return new EE_Form_Section_HTML('');
500
        }
501
    }
502
503
504
    /**
505
     * _currency_support
506
     *
507
     * @access protected
508
     * @param \EE_Payment_Method $payment_method
509
     * @return \EE_Form_Section_Proper
510
     */
511
    protected function _currency_support(EE_Payment_Method $payment_method)
512
    {
513
        if (! $payment_method->usable_for_currency(EE_Config::instance()->currency->code)) {
514
            return new EE_Form_Section_HTML(
515
                EEH_HTML::tr(
516
                    EEH_HTML::th(
517
                        EEH_HTML::label(
518
                            EEH_HTML::strong(__('IMPORTANT', 'event_espresso'), '', 'important-notice')
519
                        )
520
                    ) .
521
                    EEH_HTML::td(
522
                        EEH_HTML::strong(
523
                            sprintf(
524
                                __(
525
                                    'This payment method does not support the currency set on your site (%1$s). Please activate a different payment method or change your site\'s country and associated currency.',
526
                                    'event_espresso'
527
                                ),
528
                                EE_Config::instance()->currency->code
529
                            )
530
                        )
531
                    )
532
                )
533
            );
534
        } else {
535
            return new EE_Form_Section_HTML('');
536
        }
537
    }
538
539
540
    /**
541
     * _update_payment_method_button
542
     *
543
     * @access protected
544
     * @param \EE_Payment_Method $payment_method
545
     * @return \EE_Form_Section_HTML
546
     */
547
    protected function _payment_method_settings(EE_Payment_Method $payment_method)
548
    {
549
        // modify the form so we only have/show fields that will be implemented for this version
550
        return $this->_simplify_form($payment_method->type_obj()->settings_form(), $payment_method->name());
551
    }
552
553
554
    /**
555
     * Simplifies the form to merely reproduce 4.1's gateway settings functionality
556
     *
557
     * @param EE_Form_Section_Proper $form_section
558
     * @param string                 $payment_method_name
559
     * @return \EE_Payment_Method_Form
560
     * @throws \EE_Error
561
     */
562
    protected function _simplify_form($form_section, $payment_method_name = '')
563
    {
564
        if ($form_section instanceof EE_Payment_Method_Form) {
565
            $form_section->exclude(
566
                array(
567
                    'PMD_type', // dont want them changing the type
568
                    'PMD_slug', // or the slug (probably never)
569
                    'PMD_wp_user', // or the user's ID
570
                    'Currency' // or the currency, until the rest of EE supports simultaneous currencies
571
                )
572
            );
573
            return $form_section;
574
        } else {
575
            throw new EE_Error(
576
                sprintf(
577
                    __(
578
                        'The EE_Payment_Method_Form for the "%1$s" payment method is missing or invalid.',
579
                        'event_espresso'
580
                    ),
581
                    $payment_method_name
582
                )
583
            );
584
        }
585
    }
586
587
588
    /**
589
     * _update_payment_method_button
590
     *
591
     * @access protected
592
     * @param \EE_Payment_Method $payment_method
593
     * @return \EE_Form_Section_HTML
594
     */
595
    protected function _update_payment_method_button(EE_Payment_Method $payment_method)
596
    {
597
        $update_button = new EE_Submit_Input(
598
            array(
599
                'name'       => 'submit',
600
                'html_id'    => 'save_' . $payment_method->slug() . '_settings',
601
                'default'    => sprintf(
602
                    __('Update %s Payment Settings', 'event_espresso'),
603
                    $payment_method->admin_name()
604
                ),
605
                'html_label' => EEH_HTML::nbsp(),
606
            )
607
        );
608
        return new EE_Form_Section_HTML(
609
            EEH_HTML::no_row(EEH_HTML::br(2)) .
610
            EEH_HTML::tr(
611
                EEH_HTML::th(__('Update Settings', 'event_espresso')) .
612
                EEH_HTML::td(
613
                    $update_button->get_html_for_input()
614
                )
615
            )
616
        );
617
    }
618
619
620
    /**
621
     * _deactivate_payment_method_button
622
     *
623
     * @access protected
624
     * @param \EE_Payment_Method $payment_method
625
     * @return \EE_Form_Section_Proper
626
     */
627
    protected function _deactivate_payment_method_button(EE_Payment_Method $payment_method)
628
    {
629
        $link_text_and_title = sprintf(
630
            __('Deactivate %1$s Payments?', 'event_espresso'),
631
            $payment_method->admin_name()
632
        );
633
        return new EE_Form_Section_HTML(
634
            EEH_HTML::tr(
635
                EEH_HTML::th(__('Deactivate Payment Method', 'event_espresso')) .
636
                EEH_HTML::td(
637
                    EEH_HTML::link(
638
                        EE_Admin_Page::add_query_args_and_nonce(
639
                            array(
640
                                'action'         => 'deactivate_payment_method',
641
                                'payment_method' => $payment_method->slug(),
642
                            ),
643
                            EE_PAYMENTS_ADMIN_URL
644
                        ),
645
                        $link_text_and_title,
646
                        $link_text_and_title,
647
                        'deactivate_' . $payment_method->slug(),
648
                        'espresso-button button-secondary'
649
                    )
650
                )
651
            )
652
        );
653
    }
654
655
656
    /**
657
     * _activate_payment_method_button
658
     *
659
     * @access protected
660
     * @param \EE_Payment_Method $payment_method
661
     * @return \EE_Form_Section_Proper
662
     */
663
    protected function _activate_payment_method_button(EE_Payment_Method $payment_method)
664
    {
665
        $link_text_and_title = sprintf(
666
            __('Activate %1$s Payment Method?', 'event_espresso'),
667
            $payment_method->admin_name()
668
        );
669
        return new EE_Form_Section_Proper(
670
            array(
671
                'name'            => 'activate_' . $payment_method->slug() . '_settings_form',
672
                'html_id'         => 'activate_' . $payment_method->slug() . '_settings_form',
673
                'action'          => '#',
674
                'layout_strategy' => new EE_Admin_Two_Column_Layout(),
675
                'subsections'     => apply_filters(
676
                    'FHEE__Payments_Admin_Page___activate_payment_method_button__form_subsections',
677
                    array(
678
                        new EE_Form_Section_HTML(
679
                            EEH_HTML::tr(
680
                                EEH_HTML::td(
681
                                    $payment_method->type_obj()->introductory_html(),
682
                                    '',
683
                                    '',
684
                                    '',
685
                                    'colspan="2"'
686
                                )
687
                            ) .
688
                            EEH_HTML::tr(
689
                                EEH_HTML::th(
690
                                    EEH_HTML::label(__('Click to Activate ', 'event_espresso'))
691
                                ) .
692
                                EEH_HTML::td(
693
                                    EEH_HTML::link(
694
                                        EE_Admin_Page::add_query_args_and_nonce(
695
                                            array(
696
                                                'action'              => 'activate_payment_method',
697
                                                'payment_method_type' => $payment_method->type(),
698
                                            ),
699
                                            EE_PAYMENTS_ADMIN_URL
700
                                        ),
701
                                        $link_text_and_title,
702
                                        $link_text_and_title,
703
                                        'activate_' . $payment_method->slug(),
704
                                        'espresso-button-green button-primary'
705
                                    )
706
                                )
707
                            )
708
                        ),
709
                    ),
710
                    $payment_method
711
                ),
712
            )
713
        );
714
    }
715
716
717
    /**
718
     * _fine_print
719
     *
720
     * @access protected
721
     * @return \EE_Form_Section_HTML
722
     */
723
    protected function _fine_print()
724
    {
725
        return new EE_Form_Section_HTML(
726
            EEH_HTML::tr(
727
                EEH_HTML::th() .
728
                EEH_HTML::td(
729
                    EEH_HTML::p(__('All fields marked with a * are required fields', 'event_espresso'), '', 'grey-text')
730
                )
731
            )
732
        );
733
    }
734
735
736
    /**
737
     * Activates a payment method of that type. Mostly assuming there is only 1 of that type (or none so far)
738
     *
739
     * @global WP_User $current_user
740
     */
741 View Code Duplication
    protected function _activate_payment_method()
742
    {
743
        if (isset($this->_req_data['payment_method_type'])) {
744
            $payment_method_type = sanitize_text_field($this->_req_data['payment_method_type']);
745
            // see if one exists
746
            EE_Registry::instance()->load_lib('Payment_Method_Manager');
747
            $payment_method = EE_Payment_Method_Manager::instance()
748
                                                       ->activate_a_payment_method_of_type($payment_method_type);
749
            $this->_redirect_after_action(
750
                1,
751
                'Payment Method',
752
                'activated',
753
                array('action' => 'default', 'payment_method' => $payment_method->slug())
754
            );
755
        } else {
756
            $this->_redirect_after_action(false, 'Payment Method', 'activated', array('action' => 'default'));
757
        }
758
    }
759
760
761
    /**
762
     * Deactivates the payment method with the specified slug, and redirects.
763
     */
764 View Code Duplication
    protected function _deactivate_payment_method()
765
    {
766
        if (isset($this->_req_data['payment_method'])) {
767
            $payment_method_slug = sanitize_key($this->_req_data['payment_method']);
768
            // deactivate it
769
            EE_Registry::instance()->load_lib('Payment_Method_Manager');
770
            $count_updated = EE_Payment_Method_Manager::instance()->deactivate_payment_method($payment_method_slug);
771
            $this->_redirect_after_action(
772
                $count_updated,
773
                'Payment Method',
774
                'deactivated',
775
                array('action' => 'default', 'payment_method' => $payment_method_slug)
776
            );
777
        } else {
778
            $this->_redirect_after_action(false, 'Payment Method', 'deactivated', array('action' => 'default'));
779
        }
780
    }
781
782
783
    /**
784
     * Processes the payment method form that was submitted. This is slightly trickier than usual form
785
     * processing because we first need to identify WHICH form was processed and which payment method
786
     * it corresponds to. Once we have done that, we see if the form is valid. If it is, the
787
     * form's data is saved and we redirect to the default payment methods page, setting the updated payment method
788
     * as the currently-selected one. If it DOESN'T validate, we render the page with the form's errors (in the
789
     * subsequently called 'headers_sent_func' which is _payment_methods_list)
790
     *
791
     * @return void
792
     */
793
    protected function _update_payment_method()
794
    {
795
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
796
            // ok let's find which gateway form to use based on the form input
797
            EE_Registry::instance()->load_lib('Payment_Method_Manager');
798
            /** @var $correct_pmt_form_to_use EE_Payment_Method_Form */
799
            $correct_pmt_form_to_use = null;
800
            $payment_method = null;
801
            foreach (EEM_Payment_Method::instance()->get_all() as $payment_method) {
802
                // get the form and simplify it, like what we do when we display it
803
                $pmt_form = $this->_generate_payment_method_settings_form($payment_method);
804
                if ($pmt_form->form_data_present_in($this->_req_data)) {
805
                    $correct_pmt_form_to_use = $pmt_form;
806
                    break;
807
                }
808
            }
809
            // if we couldn't find the correct payment method type...
810
            if (! $correct_pmt_form_to_use) {
811
                EE_Error::add_error(
812
                    __(
813
                        "We could not find which payment method type your form submission related to. Please contact support",
814
                        'event_espresso'
815
                    ),
816
                    __FILE__,
817
                    __FUNCTION__,
818
                    __LINE__
819
                );
820
                $this->_redirect_after_action(false, 'Payment Method', 'activated', array('action' => 'default'));
821
            }
822
            $correct_pmt_form_to_use->receive_form_submission($this->_req_data);
823
            if ($correct_pmt_form_to_use->is_valid()) {
824
                $payment_settings_subform = $correct_pmt_form_to_use->get_subsection('payment_method_settings');
825
                if (! $payment_settings_subform instanceof EE_Payment_Method_Form) {
826
                    throw new EE_Error(
827
                        sprintf(
828
                            __(
829
                                'The payment method could not be saved because the form sections were misnamed. We expected to find %1$s, but did not.',
830
                                'event_espresso'
831
                            ),
832
                            'payment_method_settings'
833
                        )
834
                    );
835
                }
836
                $payment_settings_subform->save();
837
                /** @var $pm EE_Payment_Method */
838
                $this->_redirect_after_action(
839
                    true,
840
                    'Payment Method',
841
                    'updated',
842
                    array('action' => 'default', 'payment_method' => $payment_method->slug())
843
                );
844
            } else {
845
                EE_Error::add_error(
846
                    sprintf(
847
                        __(
848
                            'Payment method of type %s was not saved because there were validation errors. They have been marked in the form',
849
                            'event_espresso'
850
                        ),
851
                        $payment_method instanceof EE_Payment_Method ? $payment_method->type_obj()->pretty_name()
852
                            : __('"(unknown)"', 'event_espresso')
853
                    ),
854
                    __FILE__,
855
                    __FUNCTION__,
856
                    __LINE__
857
                );
858
            }
859
        }
860
        return;
861
    }
862
863
864
    /**
865
     * Displays payment settings (not payment METHOD settings, that's _payment_method_settings)
866
     * @throws DomainException
867
     * @throws EE_Error
868
     * @throws InvalidArgumentException
869
     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
870
     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
871
     */
872 View Code Duplication
    protected function _payment_settings()
873
    {
874
        $form = $this->getPaymentSettingsForm();
875
        $this->_set_add_edit_form_tags('update_payment_settings');
876
        $this->_set_publish_post_box_vars(null, false, false, null, false);
877
        $this->_template_args['admin_page_content'] =  $form->get_html_and_js();
878
        $this->display_admin_page_with_sidebar();
879
    }
880
881
882
    /**
883
     *        _update_payment_settings
884
     *
885
     * @access protected
886
     * @return void
887
     * @throws EE_Error
888
     * @throws InvalidArgumentException
889
     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
890
     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
891
     */
892
    protected function _update_payment_settings()
893
    {
894
        $form = $this->getPaymentSettingsForm();
895
        if ($form->was_submitted($this->_req_data)) {
896
            $form->receive_form_submission($this->_req_data);
897
            if ($form->is_valid()) {
898
                /**
899
                 * @var $reg_config EE_Registration_Config
900
                 */
901
                $loader = LoaderFactory::getLoader();
902
                $reg_config = $loader->getShared('EE_Registration_Config');
903
                $valid_data = $form->valid_data();
904
                $reg_config->show_pending_payment_options = $valid_data['show_pending_payment_options'];
905
                $reg_config->gateway_log_lifespan = $valid_data['gateway_log_lifespan'];
906
            }
907
        }
908
        EE_Registry::instance()->CFG = apply_filters(
909
            'FHEE__Payments_Admin_Page___update_payment_settings__CFG',
910
            EE_Registry::instance()->CFG
911
        );
912
913
        $cfg =  EE_Registry::instance()->CFG ;
0 ignored issues
show
Unused Code introduced by
$cfg is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
914
915
        $what = __('Payment Settings', 'event_espresso');
916
        $success = $this->_update_espresso_configuration(
917
            $what,
918
            EE_Registry::instance()->CFG,
919
            __FILE__,
920
            __FUNCTION__,
921
            __LINE__
922
        );
923
        $this->_redirect_after_action(
924
            $success,
925
            $what,
926
            __('updated', 'event_espresso'),
927
            array('action' => 'payment_settings')
928
        );
929
    }
930
931
932
    /**
933
     * Gets the form used for updating payment settings
934
     *
935
     * @return EE_Form_Section_Proper
936
     * @throws EE_Error
937
     * @throws InvalidArgumentException
938
     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
939
     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
940
     */
941
    protected function getPaymentSettingsForm()
942
    {
943
        /**
944
         * @var $reg_config EE_Registration_Config
945
         */
946
        $reg_config = LoaderFactory::getLoader()->getShared('EE_Registration_Config');
947
        return new EE_Form_Section_Proper(
948
            array(
949
                'name' => 'payment-settings',
950
                'layout_strategy' => new EE_Admin_Two_Column_Layout(),
951
                'subsections' => array(
952
                    'show_pending_payment_options' => new EE_Yes_No_Input(
953
                        array(
954
                            'html_name' => 'show_pending_payment_options',
955
                            'default' => $reg_config->show_pending_payment_options,
956
                            'html_help_text' => esc_html__(
957
                                "If a payment is marked as 'Pending Payment', or if payment is deferred (ie, an offline gateway like Check, Bank, or Invoice is used), then give registrants the option to retry payment. ",
958
                                'event_espresso'
959
                            )
960
                        )
961
                    ),
962
                    'gateway_log_lifespan' => new \EE_Select_Input(
963
                        $reg_config->gatewayLogLifespanOptions(),
964
                        array(
965
                            'html_label_text' => esc_html__('Gateway Logs Lifespan', 'event_espresso'),
966
                            'html_help_text' => esc_html__('If issues arise with payments being made through a payment gateway, it\'s helpful to log non-sensitive communications with the payment gateway. But it\'s a security responsibility, so it\'s a good idea to not keep them for any longer than necessary.', 'event_espresso'),
967
                            'default' => $reg_config->gateway_log_lifespan,
968
                        )
969
                    )
970
                )
971
            )
972
        );
973
    }
974
975
976
    protected function _payment_log_overview_list_table()
977
    {
978
        $this->display_admin_list_table_page_with_sidebar();
979
    }
980
981
982
    protected function _set_list_table_views_payment_log()
983
    {
984
        $this->_views = array(
985
            'all' => array(
986
                'slug'  => 'all',
987
                'label' => __('View All Logs', 'event_espresso'),
988
                'count' => 0,
989
            ),
990
        );
991
    }
992
993
994
    /**
995
     * @param int  $per_page
996
     * @param int  $current_page
997
     * @param bool $count
998
     * @return array
999
     */
1000
    public function get_payment_logs($per_page = 50, $current_page = 0, $count = false)
1001
    {
1002
        EE_Registry::instance()->load_model('Change_Log');
1003
        // we may need to do multiple queries (joining differently), so we actually wan tan array of query params
1004
        $query_params = array(array('LOG_type' => EEM_Change_Log::type_gateway));
1005
        // check if they've selected a specific payment method
1006
        if (isset($this->_req_data['_payment_method']) && $this->_req_data['_payment_method'] !== 'all') {
1007
            $query_params[0]['OR*pm_or_pay_pm'] = array(
1008
                'Payment.Payment_Method.PMD_ID' => $this->_req_data['_payment_method'],
1009
                'Payment_Method.PMD_ID'         => $this->_req_data['_payment_method'],
1010
            );
1011
        }
1012
        // take into account search
1013
        if (isset($this->_req_data['s']) && $this->_req_data['s']) {
1014
            $similarity_string = array('LIKE', '%' . str_replace("", "%", $this->_req_data['s']) . '%');
1015
            $query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_fname'] = $similarity_string;
1016
            $query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_lname'] = $similarity_string;
1017
            $query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_email'] = $similarity_string;
1018
            $query_params[0]['OR*s']['Payment.Payment_Method.PMD_name'] = $similarity_string;
1019
            $query_params[0]['OR*s']['Payment.Payment_Method.PMD_admin_name'] = $similarity_string;
1020
            $query_params[0]['OR*s']['Payment.Payment_Method.PMD_type'] = $similarity_string;
1021
            $query_params[0]['OR*s']['LOG_message'] = $similarity_string;
1022
            $query_params[0]['OR*s']['Payment_Method.PMD_name'] = $similarity_string;
1023
            $query_params[0]['OR*s']['Payment_Method.PMD_admin_name'] = $similarity_string;
1024
            $query_params[0]['OR*s']['Payment_Method.PMD_type'] = $similarity_string;
1025
            $query_params[0]['OR*s']['LOG_message'] = $similarity_string;
1026
        }
1027
        if (isset($this->_req_data['payment-filter-start-date'])
1028
            && isset($this->_req_data['payment-filter-end-date'])
1029
        ) {
1030
            // add date
1031
            $start_date = wp_strip_all_tags($this->_req_data['payment-filter-start-date']);
1032
            $end_date = wp_strip_all_tags($this->_req_data['payment-filter-end-date']);
1033
            // make sure our timestamps start and end right at the boundaries for each day
1034
            $start_date = date('Y-m-d', strtotime($start_date)) . ' 00:00:00';
1035
            $end_date = date('Y-m-d', strtotime($end_date)) . ' 23:59:59';
1036
            // convert to timestamps
1037
            $start_date = strtotime($start_date);
1038
            $end_date = strtotime($end_date);
1039
            // makes sure start date is the lowest value and vice versa
1040
            $start_date = min($start_date, $end_date);
1041
            $end_date = max($start_date, $end_date);
1042
            // convert for query
1043
            $start_date = EEM_Change_Log::instance()
1044
                                        ->convert_datetime_for_query(
1045
                                            'LOG_time',
1046
                                            date('Y-m-d H:i:s', $start_date),
1047
                                            'Y-m-d H:i:s'
1048
                                        );
1049
            $end_date = EEM_Change_Log::instance()
1050
                                      ->convert_datetime_for_query(
1051
                                          'LOG_time',
1052
                                          date('Y-m-d H:i:s', $end_date),
1053
                                          'Y-m-d H:i:s'
1054
                                      );
1055
            $query_params[0]['LOG_time'] = array('BETWEEN', array($start_date, $end_date));
1056
        }
1057
        if ($count) {
1058
            return EEM_Change_Log::instance()->count($query_params);
1059
        }
1060
        if (isset($this->_req_data['order'])) {
1061
            $sort = (isset($this->_req_data['order']) && ! empty($this->_req_data['order'])) ? $this->_req_data['order']
1062
                : 'DESC';
1063
            $query_params['order_by'] = array('LOG_time' => $sort);
1064
        } else {
1065
            $query_params['order_by'] = array('LOG_time' => 'DESC');
1066
        }
1067
        $offset = ($current_page - 1) * $per_page;
1068
        if (! isset($this->_req_data['download_results'])) {
1069
            $query_params['limit'] = array($offset, $per_page);
1070
        }
1071
        // now they've requested to instead just download the file instead of viewing it.
1072
        if (isset($this->_req_data['download_results'])) {
1073
            $wpdb_results = EEM_Change_Log::instance()->get_all_efficiently($query_params);
1074
            header('Content-Disposition: attachment');
1075
            header("Content-Disposition: attachment; filename=ee_payment_logs_for_" . sanitize_key(site_url()));
1076
            echo "<h1>Payment Logs for " . site_url() . "</h1>";
1077
            echo "<h3>Query:</h3>";
1078
            var_dump($query_params);
1079
            echo "<h3>Results:</h3>";
1080
            var_dump($wpdb_results);
1081
            die;
1082
        }
1083
        $results = EEM_Change_Log::instance()->get_all($query_params);
1084
        return $results;
1085
    }
1086
1087
1088
    /**
1089
     * Used by usort to RE-sort log query results, because we lose the ordering
1090
     * because we're possibly combining the results from two queries
1091
     *
1092
     * @param EE_Change_Log $logA
1093
     * @param EE_Change_Log $logB
1094
     * @return int
1095
     */
1096
    protected function _sort_logs_again($logA, $logB)
1097
    {
1098
        $timeA = $logA->get_raw('LOG_time');
1099
        $timeB = $logB->get_raw('LOG_time');
1100
        if ($timeA == $timeB) {
1101
            return 0;
1102
        }
1103
        $comparison = $timeA < $timeB ? -1 : 1;
1104
        if (strtoupper($this->_sort_logs_again_direction) == 'DESC') {
1105
            return $comparison * -1;
1106
        } else {
1107
            return $comparison;
1108
        }
1109
    }
1110
1111
1112
    protected function _payment_log_details()
1113
    {
1114
        EE_Registry::instance()->load_model('Change_Log');
1115
        /** @var $payment_log EE_Change_Log */
1116
        $payment_log = EEM_Change_Log::instance()->get_one_by_ID($this->_req_data['ID']);
1117
        $payment_method = null;
1118
        $transaction = null;
1119
        if ($payment_log instanceof EE_Change_Log) {
1120
            if ($payment_log->object() instanceof EE_Payment) {
1121
                $payment_method = $payment_log->object()->payment_method();
1122
                $transaction = $payment_log->object()->transaction();
1123
            } elseif ($payment_log->object() instanceof EE_Payment_Method) {
1124
                $payment_method = $payment_log->object();
1125
            }
1126
        }
1127
        $this->_template_args['admin_page_content'] = EEH_Template::display_template(
1128
            EE_PAYMENTS_TEMPLATE_PATH . 'payment_log_details.template.php',
1129
            array(
1130
                'payment_log'    => $payment_log,
1131
                'payment_method' => $payment_method,
1132
                'transaction'    => $transaction,
1133
            ),
1134
            true
1135
        );
1136
        $this->display_admin_page_with_sidebar();
1137
    }
1138
}
1139