Completed
Branch BUG/rest-api-between-operator-... (f62593)
by
unknown
15:49 queued 33s
created
admin_pages/payments/Payments_Admin_Page.core.php 1 patch
Indentation   +1124 added lines, -1124 removed lines patch added patch discarded remove patch
@@ -14,1128 +14,1128 @@
 block discarded – undo
14 14
 class Payments_Admin_Page extends EE_Admin_Page
15 15
 {
16 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
31
-     */
32
-    public function __construct($routing = true)
33
-    {
34
-        parent::__construct($routing);
35
-    }
36
-
37
-
38
-    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
-    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
-    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
-    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 ;
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
-            } elseif ($payment_log->object() instanceof EE_Transaction) {
1126
-                $transaction = $payment_log->object();
1127
-                $payment_method = $transaction->payment_method();
1128
-            }
1129
-        }
1130
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template(
1131
-            EE_PAYMENTS_TEMPLATE_PATH . 'payment_log_details.template.php',
1132
-            array(
1133
-                'payment_log'    => $payment_log,
1134
-                'payment_method' => $payment_method,
1135
-                'transaction'    => $transaction,
1136
-            ),
1137
-            true
1138
-        );
1139
-        $this->display_admin_page_with_sidebar();
1140
-    }
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
31
+	 */
32
+	public function __construct($routing = true)
33
+	{
34
+		parent::__construct($routing);
35
+	}
36
+
37
+
38
+	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
+	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
+	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
+	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 ;
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
+			} elseif ($payment_log->object() instanceof EE_Transaction) {
1126
+				$transaction = $payment_log->object();
1127
+				$payment_method = $transaction->payment_method();
1128
+			}
1129
+		}
1130
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template(
1131
+			EE_PAYMENTS_TEMPLATE_PATH . 'payment_log_details.template.php',
1132
+			array(
1133
+				'payment_log'    => $payment_log,
1134
+				'payment_method' => $payment_method,
1135
+				'transaction'    => $transaction,
1136
+			),
1137
+			true
1138
+		);
1139
+		$this->display_admin_page_with_sidebar();
1140
+	}
1141 1141
 }
Please login to merge, or discard this patch.
core/libraries/payment_methods/EE_Gateway.lib.php 1 patch
Indentation   +491 added lines, -491 removed lines patch added patch discarded remove patch
@@ -23,495 +23,495 @@
 block discarded – undo
23 23
  */
24 24
 abstract class EE_Gateway
25 25
 {
26
-    /**
27
-     * a constant used as a possible value for $_currencies_supported to indicate
28
-     * that ALL currencies are supported by this gateway
29
-     */
30
-    const all_currencies_supported = 'all_currencies_supported';
31
-    /**
32
-     * Where values are 3-letter currency codes
33
-     *
34
-     * @var array
35
-     */
36
-    protected $_currencies_supported = array();
37
-    /**
38
-     * Whether or not this gateway can support SENDING a refund request (ie, initiated by
39
-     * admin in EE's wp-admin page)
40
-     *
41
-     * @var boolean
42
-     */
43
-    protected $_supports_sending_refunds = false;
44
-
45
-    /**
46
-     * Whether or not this gateway can support RECEIVING a refund request from the payment
47
-     * provider (ie, initiated by admin on the payment prover's website who sends an IPN to EE)
48
-     *
49
-     * @var boolean
50
-     */
51
-    protected $_supports_receiving_refunds = false;
52
-    /**
53
-     * Model for querying for existing payments
54
-     *
55
-     * @var EEMI_Payment
56
-     */
57
-    protected $_pay_model;
58
-
59
-    /**
60
-     * Model used for adding to the payments log
61
-     *
62
-     * @var EEMI_Payment_Log
63
-     */
64
-    protected $_pay_log;
65
-
66
-    /**
67
-     * Used for formatting some input to gateways
68
-     *
69
-     * @var EEHI_Template
70
-     */
71
-    protected $_template;
72
-
73
-    /**
74
-     * Concrete class that implements EEHI_Money, used by most gateways
75
-     *
76
-     * @var EEHI_Money
77
-     */
78
-    protected $_money;
79
-
80
-    /**
81
-     * Concrete class that implements EEHI_Line_Item, used for manipulating the line item tree
82
-     *
83
-     * @var EEHI_Line_Item
84
-     */
85
-    protected $_line_item;
86
-
87
-    /**
88
-     * @var GatewayDataFormatterInterface
89
-     */
90
-    protected $_gateway_data_formatter;
91
-
92
-    /**
93
-     * @var FormatterInterface
94
-     */
95
-    protected $_unsupported_character_remover;
96
-
97
-    /**
98
-     * The ID of the payment method using this gateway
99
-     *
100
-     * @var int
101
-     */
102
-    protected $_ID;
103
-
104
-    /**
105
-     * @var $_debug_mode boolean whether to send requests to teh sandbox site or not
106
-     */
107
-    protected $_debug_mode;
108
-    /**
109
-     *
110
-     * @var string $_name name to show for this payment method
111
-     */
112
-    protected $_name;
113
-    /**
114
-     *
115
-     * @var string name to show fir this payment method to admin-type users
116
-     */
117
-    protected $_admin_name;
118
-
119
-    /**
120
-     * @return EE_Gateway
121
-     */
122
-    public function __construct()
123
-    {
124
-    }
125
-
126
-    /**
127
-     * We don't want to serialize models as they often have circular structures
128
-     * (eg a payment model has a reference to each payment model object; and most
129
-     * payments have a transaction, most transactions have a payment method;
130
-     * most payment methods have a payment method type; most payment method types
131
-     * have a gateway. And if a gateway serializes its models, we start at the
132
-     * beginning again)
133
-     *
134
-     * @return array
135
-     */
136
-    public function __sleep()
137
-    {
138
-        $properties = get_object_vars($this);
139
-        unset($properties['_pay_model'], $properties['_pay_log']);
140
-        return array_keys($properties);
141
-    }
142
-
143
-    /**
144
-     * Returns whether or not this gateway should support SENDING refunds
145
-     * see $_supports_sending_refunds
146
-     *
147
-     * @return boolean
148
-     */
149
-    public function supports_sending_refunds()
150
-    {
151
-        return $this->_supports_sending_refunds;
152
-    }
153
-
154
-    /**
155
-     * Returns whether or not this gateway should support RECEIVING refunds
156
-     * see $_supports_receiving_refunds
157
-     *
158
-     * @return boolean
159
-     */
160
-    public function supports_receiving_refunds()
161
-    {
162
-        return $this->_supports_receiving_refunds;
163
-    }
164
-
165
-
166
-    /**
167
-     * Tries to refund the payment specified, taking into account the extra
168
-     * refund info. Note that if the gateway's _supports_sending_refunds is false,
169
-     * this should just throw an exception.
170
-     *
171
-     * @param EE_Payment $payment
172
-     * @param array      $refund_info
173
-     * @return EE_Payment for the refund
174
-     * @throws EE_Error
175
-     */
176
-    public function do_direct_refund(EE_Payment $payment, $refund_info = null)
177
-    {
178
-        return null;
179
-    }
180
-
181
-
182
-    /**
183
-     * Sets the payment method's settings so the gateway knows where to send the request
184
-     * etc
185
-     *
186
-     * @param array $settings_array
187
-     */
188
-    public function set_settings($settings_array)
189
-    {
190
-        foreach ($settings_array as $name => $value) {
191
-            $property_name = "_" . $name;
192
-            $this->{$property_name} = $value;
193
-        }
194
-    }
195
-
196
-    /**
197
-     * See this class description
198
-     *
199
-     * @param EEMI_Payment $payment_model
200
-     */
201
-    public function set_payment_model($payment_model)
202
-    {
203
-        $this->_pay_model = $payment_model;
204
-    }
205
-
206
-    /**
207
-     * See this class description
208
-     *
209
-     * @param EEMI_Payment_Log $payment_log_model
210
-     */
211
-    public function set_payment_log($payment_log_model)
212
-    {
213
-        $this->_pay_log = $payment_log_model;
214
-    }
215
-
216
-    /**
217
-     * See this class description
218
-     *
219
-     * @param EEHI_Template $template_helper
220
-     */
221
-    public function set_template_helper($template_helper)
222
-    {
223
-        $this->_template = $template_helper;
224
-    }
225
-
226
-    /**
227
-     * See this class description
228
-     *
229
-     * @param EEHI_Line_Item $line_item_helper
230
-     */
231
-    public function set_line_item_helper($line_item_helper)
232
-    {
233
-        $this->_line_item = $line_item_helper;
234
-    }
235
-
236
-    /**
237
-     * See this class description
238
-     *
239
-     * @param EEHI_Money $money_helper
240
-     */
241
-    public function set_money_helper($money_helper)
242
-    {
243
-        $this->_money = $money_helper;
244
-    }
245
-
246
-
247
-    /**
248
-     * Sets the gateway data formatter helper
249
-     *
250
-     * @param GatewayDataFormatterInterface $gateway_data_formatter
251
-     * @throws InvalidEntityException if it's not set properly
252
-     */
253
-    public function set_gateway_data_formatter(GatewayDataFormatterInterface $gateway_data_formatter)
254
-    {
255
-        if (! $gateway_data_formatter instanceof GatewayDataFormatterInterface) {
256
-            throw new InvalidEntityException(
257
-                is_object($gateway_data_formatter)
258
-                    ? get_class($gateway_data_formatter)
259
-                    : esc_html__('Not an object', 'event_espresso'),
260
-                '\\EventEspresso\\core\\services\\payment_methods\\gateways\\GatewayDataFormatterInterface'
261
-            );
262
-        }
263
-        $this->_gateway_data_formatter = $gateway_data_formatter;
264
-    }
265
-
266
-    /**
267
-     * Gets the gateway data formatter
268
-     *
269
-     * @return GatewayDataFormatterInterface
270
-     * @throws InvalidEntityException if it's not set properly
271
-     */
272
-    protected function _get_gateway_formatter()
273
-    {
274
-        if (! $this->_gateway_data_formatter instanceof GatewayDataFormatterInterface) {
275
-            throw new InvalidEntityException(
276
-                is_object($this->_gateway_data_formatter)
277
-                    ? get_class($this->_gateway_data_formatter)
278
-                    : esc_html__('Not an object', 'event_espresso'),
279
-                '\\EventEspresso\\core\\services\\payment_methods\\gateways\\GatewayDataFormatterInterface'
280
-            );
281
-        }
282
-        return $this->_gateway_data_formatter;
283
-    }
284
-
285
-
286
-    /**
287
-     * Sets the helper which will remove unsupported characters for most gateways
288
-     *
289
-     * @param FormatterInterface $formatter
290
-     * @return FormatterInterface
291
-     * @throws InvalidEntityException
292
-     */
293
-    public function set_unsupported_character_remover(FormatterInterface $formatter)
294
-    {
295
-        if (! $formatter instanceof FormatterInterface) {
296
-            throw new InvalidEntityException(
297
-                is_object($formatter)
298
-                    ? get_class($formatter)
299
-                    : esc_html__('Not an object', 'event_espresso'),
300
-                '\\EventEspresso\\core\\services\\formatters\\FormatterInterface'
301
-            );
302
-        }
303
-        $this->_unsupported_character_remover = $formatter;
304
-    }
305
-
306
-    /**
307
-     * Gets the helper which removes characters which gateways might not support, like emojis etc.
308
-     *
309
-     * @return FormatterInterface
310
-     * @throws InvalidEntityException
311
-     */
312
-    protected function _get_unsupported_character_remover()
313
-    {
314
-        if (! $this->_unsupported_character_remover instanceof FormatterInterface) {
315
-            throw new InvalidEntityException(
316
-                is_object($this->_unsupported_character_remover)
317
-                    ? get_class($this->_unsupported_character_remover)
318
-                    : esc_html__('Not an object', 'event_espresso'),
319
-                '\\EventEspresso\\core\\services\\formatters\\FormatterInterface'
320
-            );
321
-        }
322
-        return $this->_unsupported_character_remover;
323
-    }
324
-
325
-
326
-    /**
327
-     * @param $message
328
-     * @param $payment
329
-     */
330
-    public function log($message, $object_logged)
331
-    {
332
-        if ($object_logged instanceof EEI_Payment) {
333
-            $type = 'Payment';
334
-            $id = $object_logged->ID();
335
-        } elseif ($object_logged instanceof EEI_Payment_Method) {
336
-            $type = 'Payment_Method';
337
-            $id = $this->_ID;
338
-        } elseif ($object_logged instanceof EEI_Transaction) {
339
-            $type = 'Transaction';
340
-            $id = $object_logged->ID();
341
-        }
342
-        // only log if we're going to store it for longer than the minimum time
343
-        $reg_config = LoaderFactory::getLoader()->load('EE_Registration_Config');
344
-        if ($reg_config->gateway_log_lifespan !== '1 second') {
345
-            $this->_pay_log->gateway_log($message, $id, $type);
346
-        }
347
-    }
348
-
349
-    /**
350
-     * Formats the amount so it can generally be sent to gateways
351
-     *
352
-     * @param float $amount
353
-     * @return string
354
-     * @deprecated since 4.9.31 insetad use
355
-     *             EventEspresso\core\services\payment_methods\gateways\GatewayDataFormatter::format_currency()
356
-     */
357
-    public function format_currency($amount)
358
-    {
359
-        return $this->_get_gateway_formatter()->formatCurrency($amount);
360
-    }
361
-
362
-    /**
363
-     * Returns either an array of all the currency codes supported,
364
-     * or a string indicating they're all supported (EE_gateway::all_currencies_supported)
365
-     *
366
-     * @return mixed array or string
367
-     */
368
-    public function currencies_supported()
369
-    {
370
-        return $this->_currencies_supported;
371
-    }
372
-
373
-    /**
374
-     * Returns what a simple summing of items and taxes for this transaction. This
375
-     * can be used to determine if some more complex line items, like promotions,
376
-     * surcharges, or cancellations occurred (in which case we might want to forget
377
-     * about creating an itemized list of purchases and instead only send the total due)
378
-     *
379
-     * @param EE_Transaction $transaction
380
-     * @return float
381
-     */
382
-    protected function _sum_items_and_taxes(EE_Transaction $transaction)
383
-    {
384
-        $total_line_item = $transaction->total_line_item();
385
-        $total = 0;
386
-        foreach ($total_line_item->get_items() as $item_line_item) {
387
-            $total += max($item_line_item->total(), 0);
388
-        }
389
-        foreach ($total_line_item->tax_descendants() as $tax_line_item) {
390
-            $total += max($tax_line_item->total(), 0);
391
-        }
392
-        return $total;
393
-    }
394
-
395
-    /**
396
-     * Determines whether or not we can easily itemize the transaction using only
397
-     * items and taxes (ie, no promotions or surcharges or cancellations needed)
398
-     *
399
-     * @param EEI_Payment $payment
400
-     * @return boolean
401
-     */
402
-    protected function _can_easily_itemize_transaction_for(EEI_Payment $payment)
403
-    {
404
-        return $this->_money->compare_floats(
405
-            $this->_sum_items_and_taxes($payment->transaction()),
406
-            $payment->transaction()->total()
407
-        )
408
-               && $this->_money->compare_floats(
409
-                   $payment->amount(),
410
-                   $payment->transaction()->total()
411
-               );
412
-    }
413
-
414
-    /**
415
-     * Handles updating the transaction and any other related data based on the payment.
416
-     * You may be tempted to do this as part of do_direct_payment or handle_payment_update,
417
-     * but doing so on those functions might be too early. It's possible that the changes
418
-     * you make to teh transaction or registration or line items may just get overwritten
419
-     * at that point. Instead, you should store any info you need on the payment during those
420
-     * functions, and use that information at this step, which client code will decide
421
-     * for you when it should be called.
422
-     *
423
-     * @param EE_Payment $payment
424
-     * @return void
425
-     */
426
-    public function update_txn_based_on_payment($payment)
427
-    {
428
-        // maybe update the transaction or line items or registrations
429
-        // but most gateways don't need to do this, because they only update the payment
430
-    }
431
-
432
-    /**
433
-     * Gets the first event for this payment (it's possible that it could be for multiple)
434
-     *
435
-     * @param EEI_Payment $payment
436
-     * @return EEI_Event|null
437
-     * @deprecated since 4.9.31 instead use EEI_Payment::get_first_event()
438
-     */
439
-    protected function _get_first_event_for_payment(EEI_Payment $payment)
440
-    {
441
-        return $payment->get_first_event();
442
-    }
443
-
444
-    /**
445
-     * Gets the name of the first event for which is being paid
446
-     *
447
-     * @param EEI_Payment $payment
448
-     * @return string
449
-     * @deprecated since 4.9.31 instead use EEI_Payment::get_first_event_name()
450
-     */
451
-    protected function _get_first_event_name_for_payment(EEI_Payment $payment)
452
-    {
453
-        return $payment->get_first_event_name();
454
-    }
455
-
456
-    /**
457
-     * Gets the text to use for a gateway's line item name when this is a partial payment
458
-     *
459
-     * @deprecated since 4.9.31 instead use $this->_get_gateway_formatter()->formatPartialPaymentLineItemName($payment)
460
-     * @param EE_Payment $payment
461
-     * @return string
462
-     */
463
-    protected function _format_partial_payment_line_item_name(EEI_Payment $payment)
464
-    {
465
-        return $this->_get_gateway_formatter()->formatPartialPaymentLineItemName($payment);
466
-    }
467
-
468
-    /**
469
-     * Gets the text to use for a gateway's line item description when this is a partial payment
470
-     *
471
-     * @deprecated since 4.9.31 instead use $this->_get_gateway_formatter()->formatPartialPaymentLineItemDesc()
472
-     * @param EEI_Payment $payment
473
-     * @return string
474
-     */
475
-    protected function _format_partial_payment_line_item_desc(EEI_Payment $payment)
476
-    {
477
-        return $this->_get_gateway_formatter()->formatPartialPaymentLineItemDesc($payment);
478
-    }
479
-
480
-    /**
481
-     * Gets the name to use for a line item when sending line items to the gateway
482
-     *
483
-     * @deprecated since 4.9.31 instead use $this->_get_gateway_formatter()->formatLineItemName($line_item,$payment)
484
-     * @param EEI_Line_Item $line_item
485
-     * @param EEI_Payment   $payment
486
-     * @return string
487
-     */
488
-    protected function _format_line_item_name(EEI_Line_Item $line_item, EEI_Payment $payment)
489
-    {
490
-        return $this->_get_gateway_formatter()->formatLineItemName($line_item, $payment);
491
-    }
492
-
493
-    /**
494
-     * Gets the description to use for a line item when sending line items to the gateway
495
-     *
496
-     * @deprecated since 4.9.31 instead use $this->_get_gateway_formatter()->formatLineItemDesc($line_item, $payment))
497
-     * @param EEI_Line_Item $line_item
498
-     * @param EEI_Payment   $payment
499
-     * @return string
500
-     */
501
-    protected function _format_line_item_desc(EEI_Line_Item $line_item, EEI_Payment $payment)
502
-    {
503
-        return $this->_get_gateway_formatter()->formatLineItemDesc($line_item, $payment);
504
-    }
505
-
506
-    /**
507
-     * Gets the order description that should generlly be sent to gateways
508
-     *
509
-     * @deprecated since 4.9.31 instead use $this->_get_gateway_formatter()->formatOrderDescription($payment)
510
-     * @param EEI_Payment $payment
511
-     * @return type
512
-     */
513
-    protected function _format_order_description(EEI_Payment $payment)
514
-    {
515
-        return $this->_get_gateway_formatter()->formatOrderDescription($payment);
516
-    }
26
+	/**
27
+	 * a constant used as a possible value for $_currencies_supported to indicate
28
+	 * that ALL currencies are supported by this gateway
29
+	 */
30
+	const all_currencies_supported = 'all_currencies_supported';
31
+	/**
32
+	 * Where values are 3-letter currency codes
33
+	 *
34
+	 * @var array
35
+	 */
36
+	protected $_currencies_supported = array();
37
+	/**
38
+	 * Whether or not this gateway can support SENDING a refund request (ie, initiated by
39
+	 * admin in EE's wp-admin page)
40
+	 *
41
+	 * @var boolean
42
+	 */
43
+	protected $_supports_sending_refunds = false;
44
+
45
+	/**
46
+	 * Whether or not this gateway can support RECEIVING a refund request from the payment
47
+	 * provider (ie, initiated by admin on the payment prover's website who sends an IPN to EE)
48
+	 *
49
+	 * @var boolean
50
+	 */
51
+	protected $_supports_receiving_refunds = false;
52
+	/**
53
+	 * Model for querying for existing payments
54
+	 *
55
+	 * @var EEMI_Payment
56
+	 */
57
+	protected $_pay_model;
58
+
59
+	/**
60
+	 * Model used for adding to the payments log
61
+	 *
62
+	 * @var EEMI_Payment_Log
63
+	 */
64
+	protected $_pay_log;
65
+
66
+	/**
67
+	 * Used for formatting some input to gateways
68
+	 *
69
+	 * @var EEHI_Template
70
+	 */
71
+	protected $_template;
72
+
73
+	/**
74
+	 * Concrete class that implements EEHI_Money, used by most gateways
75
+	 *
76
+	 * @var EEHI_Money
77
+	 */
78
+	protected $_money;
79
+
80
+	/**
81
+	 * Concrete class that implements EEHI_Line_Item, used for manipulating the line item tree
82
+	 *
83
+	 * @var EEHI_Line_Item
84
+	 */
85
+	protected $_line_item;
86
+
87
+	/**
88
+	 * @var GatewayDataFormatterInterface
89
+	 */
90
+	protected $_gateway_data_formatter;
91
+
92
+	/**
93
+	 * @var FormatterInterface
94
+	 */
95
+	protected $_unsupported_character_remover;
96
+
97
+	/**
98
+	 * The ID of the payment method using this gateway
99
+	 *
100
+	 * @var int
101
+	 */
102
+	protected $_ID;
103
+
104
+	/**
105
+	 * @var $_debug_mode boolean whether to send requests to teh sandbox site or not
106
+	 */
107
+	protected $_debug_mode;
108
+	/**
109
+	 *
110
+	 * @var string $_name name to show for this payment method
111
+	 */
112
+	protected $_name;
113
+	/**
114
+	 *
115
+	 * @var string name to show fir this payment method to admin-type users
116
+	 */
117
+	protected $_admin_name;
118
+
119
+	/**
120
+	 * @return EE_Gateway
121
+	 */
122
+	public function __construct()
123
+	{
124
+	}
125
+
126
+	/**
127
+	 * We don't want to serialize models as they often have circular structures
128
+	 * (eg a payment model has a reference to each payment model object; and most
129
+	 * payments have a transaction, most transactions have a payment method;
130
+	 * most payment methods have a payment method type; most payment method types
131
+	 * have a gateway. And if a gateway serializes its models, we start at the
132
+	 * beginning again)
133
+	 *
134
+	 * @return array
135
+	 */
136
+	public function __sleep()
137
+	{
138
+		$properties = get_object_vars($this);
139
+		unset($properties['_pay_model'], $properties['_pay_log']);
140
+		return array_keys($properties);
141
+	}
142
+
143
+	/**
144
+	 * Returns whether or not this gateway should support SENDING refunds
145
+	 * see $_supports_sending_refunds
146
+	 *
147
+	 * @return boolean
148
+	 */
149
+	public function supports_sending_refunds()
150
+	{
151
+		return $this->_supports_sending_refunds;
152
+	}
153
+
154
+	/**
155
+	 * Returns whether or not this gateway should support RECEIVING refunds
156
+	 * see $_supports_receiving_refunds
157
+	 *
158
+	 * @return boolean
159
+	 */
160
+	public function supports_receiving_refunds()
161
+	{
162
+		return $this->_supports_receiving_refunds;
163
+	}
164
+
165
+
166
+	/**
167
+	 * Tries to refund the payment specified, taking into account the extra
168
+	 * refund info. Note that if the gateway's _supports_sending_refunds is false,
169
+	 * this should just throw an exception.
170
+	 *
171
+	 * @param EE_Payment $payment
172
+	 * @param array      $refund_info
173
+	 * @return EE_Payment for the refund
174
+	 * @throws EE_Error
175
+	 */
176
+	public function do_direct_refund(EE_Payment $payment, $refund_info = null)
177
+	{
178
+		return null;
179
+	}
180
+
181
+
182
+	/**
183
+	 * Sets the payment method's settings so the gateway knows where to send the request
184
+	 * etc
185
+	 *
186
+	 * @param array $settings_array
187
+	 */
188
+	public function set_settings($settings_array)
189
+	{
190
+		foreach ($settings_array as $name => $value) {
191
+			$property_name = "_" . $name;
192
+			$this->{$property_name} = $value;
193
+		}
194
+	}
195
+
196
+	/**
197
+	 * See this class description
198
+	 *
199
+	 * @param EEMI_Payment $payment_model
200
+	 */
201
+	public function set_payment_model($payment_model)
202
+	{
203
+		$this->_pay_model = $payment_model;
204
+	}
205
+
206
+	/**
207
+	 * See this class description
208
+	 *
209
+	 * @param EEMI_Payment_Log $payment_log_model
210
+	 */
211
+	public function set_payment_log($payment_log_model)
212
+	{
213
+		$this->_pay_log = $payment_log_model;
214
+	}
215
+
216
+	/**
217
+	 * See this class description
218
+	 *
219
+	 * @param EEHI_Template $template_helper
220
+	 */
221
+	public function set_template_helper($template_helper)
222
+	{
223
+		$this->_template = $template_helper;
224
+	}
225
+
226
+	/**
227
+	 * See this class description
228
+	 *
229
+	 * @param EEHI_Line_Item $line_item_helper
230
+	 */
231
+	public function set_line_item_helper($line_item_helper)
232
+	{
233
+		$this->_line_item = $line_item_helper;
234
+	}
235
+
236
+	/**
237
+	 * See this class description
238
+	 *
239
+	 * @param EEHI_Money $money_helper
240
+	 */
241
+	public function set_money_helper($money_helper)
242
+	{
243
+		$this->_money = $money_helper;
244
+	}
245
+
246
+
247
+	/**
248
+	 * Sets the gateway data formatter helper
249
+	 *
250
+	 * @param GatewayDataFormatterInterface $gateway_data_formatter
251
+	 * @throws InvalidEntityException if it's not set properly
252
+	 */
253
+	public function set_gateway_data_formatter(GatewayDataFormatterInterface $gateway_data_formatter)
254
+	{
255
+		if (! $gateway_data_formatter instanceof GatewayDataFormatterInterface) {
256
+			throw new InvalidEntityException(
257
+				is_object($gateway_data_formatter)
258
+					? get_class($gateway_data_formatter)
259
+					: esc_html__('Not an object', 'event_espresso'),
260
+				'\\EventEspresso\\core\\services\\payment_methods\\gateways\\GatewayDataFormatterInterface'
261
+			);
262
+		}
263
+		$this->_gateway_data_formatter = $gateway_data_formatter;
264
+	}
265
+
266
+	/**
267
+	 * Gets the gateway data formatter
268
+	 *
269
+	 * @return GatewayDataFormatterInterface
270
+	 * @throws InvalidEntityException if it's not set properly
271
+	 */
272
+	protected function _get_gateway_formatter()
273
+	{
274
+		if (! $this->_gateway_data_formatter instanceof GatewayDataFormatterInterface) {
275
+			throw new InvalidEntityException(
276
+				is_object($this->_gateway_data_formatter)
277
+					? get_class($this->_gateway_data_formatter)
278
+					: esc_html__('Not an object', 'event_espresso'),
279
+				'\\EventEspresso\\core\\services\\payment_methods\\gateways\\GatewayDataFormatterInterface'
280
+			);
281
+		}
282
+		return $this->_gateway_data_formatter;
283
+	}
284
+
285
+
286
+	/**
287
+	 * Sets the helper which will remove unsupported characters for most gateways
288
+	 *
289
+	 * @param FormatterInterface $formatter
290
+	 * @return FormatterInterface
291
+	 * @throws InvalidEntityException
292
+	 */
293
+	public function set_unsupported_character_remover(FormatterInterface $formatter)
294
+	{
295
+		if (! $formatter instanceof FormatterInterface) {
296
+			throw new InvalidEntityException(
297
+				is_object($formatter)
298
+					? get_class($formatter)
299
+					: esc_html__('Not an object', 'event_espresso'),
300
+				'\\EventEspresso\\core\\services\\formatters\\FormatterInterface'
301
+			);
302
+		}
303
+		$this->_unsupported_character_remover = $formatter;
304
+	}
305
+
306
+	/**
307
+	 * Gets the helper which removes characters which gateways might not support, like emojis etc.
308
+	 *
309
+	 * @return FormatterInterface
310
+	 * @throws InvalidEntityException
311
+	 */
312
+	protected function _get_unsupported_character_remover()
313
+	{
314
+		if (! $this->_unsupported_character_remover instanceof FormatterInterface) {
315
+			throw new InvalidEntityException(
316
+				is_object($this->_unsupported_character_remover)
317
+					? get_class($this->_unsupported_character_remover)
318
+					: esc_html__('Not an object', 'event_espresso'),
319
+				'\\EventEspresso\\core\\services\\formatters\\FormatterInterface'
320
+			);
321
+		}
322
+		return $this->_unsupported_character_remover;
323
+	}
324
+
325
+
326
+	/**
327
+	 * @param $message
328
+	 * @param $payment
329
+	 */
330
+	public function log($message, $object_logged)
331
+	{
332
+		if ($object_logged instanceof EEI_Payment) {
333
+			$type = 'Payment';
334
+			$id = $object_logged->ID();
335
+		} elseif ($object_logged instanceof EEI_Payment_Method) {
336
+			$type = 'Payment_Method';
337
+			$id = $this->_ID;
338
+		} elseif ($object_logged instanceof EEI_Transaction) {
339
+			$type = 'Transaction';
340
+			$id = $object_logged->ID();
341
+		}
342
+		// only log if we're going to store it for longer than the minimum time
343
+		$reg_config = LoaderFactory::getLoader()->load('EE_Registration_Config');
344
+		if ($reg_config->gateway_log_lifespan !== '1 second') {
345
+			$this->_pay_log->gateway_log($message, $id, $type);
346
+		}
347
+	}
348
+
349
+	/**
350
+	 * Formats the amount so it can generally be sent to gateways
351
+	 *
352
+	 * @param float $amount
353
+	 * @return string
354
+	 * @deprecated since 4.9.31 insetad use
355
+	 *             EventEspresso\core\services\payment_methods\gateways\GatewayDataFormatter::format_currency()
356
+	 */
357
+	public function format_currency($amount)
358
+	{
359
+		return $this->_get_gateway_formatter()->formatCurrency($amount);
360
+	}
361
+
362
+	/**
363
+	 * Returns either an array of all the currency codes supported,
364
+	 * or a string indicating they're all supported (EE_gateway::all_currencies_supported)
365
+	 *
366
+	 * @return mixed array or string
367
+	 */
368
+	public function currencies_supported()
369
+	{
370
+		return $this->_currencies_supported;
371
+	}
372
+
373
+	/**
374
+	 * Returns what a simple summing of items and taxes for this transaction. This
375
+	 * can be used to determine if some more complex line items, like promotions,
376
+	 * surcharges, or cancellations occurred (in which case we might want to forget
377
+	 * about creating an itemized list of purchases and instead only send the total due)
378
+	 *
379
+	 * @param EE_Transaction $transaction
380
+	 * @return float
381
+	 */
382
+	protected function _sum_items_and_taxes(EE_Transaction $transaction)
383
+	{
384
+		$total_line_item = $transaction->total_line_item();
385
+		$total = 0;
386
+		foreach ($total_line_item->get_items() as $item_line_item) {
387
+			$total += max($item_line_item->total(), 0);
388
+		}
389
+		foreach ($total_line_item->tax_descendants() as $tax_line_item) {
390
+			$total += max($tax_line_item->total(), 0);
391
+		}
392
+		return $total;
393
+	}
394
+
395
+	/**
396
+	 * Determines whether or not we can easily itemize the transaction using only
397
+	 * items and taxes (ie, no promotions or surcharges or cancellations needed)
398
+	 *
399
+	 * @param EEI_Payment $payment
400
+	 * @return boolean
401
+	 */
402
+	protected function _can_easily_itemize_transaction_for(EEI_Payment $payment)
403
+	{
404
+		return $this->_money->compare_floats(
405
+			$this->_sum_items_and_taxes($payment->transaction()),
406
+			$payment->transaction()->total()
407
+		)
408
+			   && $this->_money->compare_floats(
409
+				   $payment->amount(),
410
+				   $payment->transaction()->total()
411
+			   );
412
+	}
413
+
414
+	/**
415
+	 * Handles updating the transaction and any other related data based on the payment.
416
+	 * You may be tempted to do this as part of do_direct_payment or handle_payment_update,
417
+	 * but doing so on those functions might be too early. It's possible that the changes
418
+	 * you make to teh transaction or registration or line items may just get overwritten
419
+	 * at that point. Instead, you should store any info you need on the payment during those
420
+	 * functions, and use that information at this step, which client code will decide
421
+	 * for you when it should be called.
422
+	 *
423
+	 * @param EE_Payment $payment
424
+	 * @return void
425
+	 */
426
+	public function update_txn_based_on_payment($payment)
427
+	{
428
+		// maybe update the transaction or line items or registrations
429
+		// but most gateways don't need to do this, because they only update the payment
430
+	}
431
+
432
+	/**
433
+	 * Gets the first event for this payment (it's possible that it could be for multiple)
434
+	 *
435
+	 * @param EEI_Payment $payment
436
+	 * @return EEI_Event|null
437
+	 * @deprecated since 4.9.31 instead use EEI_Payment::get_first_event()
438
+	 */
439
+	protected function _get_first_event_for_payment(EEI_Payment $payment)
440
+	{
441
+		return $payment->get_first_event();
442
+	}
443
+
444
+	/**
445
+	 * Gets the name of the first event for which is being paid
446
+	 *
447
+	 * @param EEI_Payment $payment
448
+	 * @return string
449
+	 * @deprecated since 4.9.31 instead use EEI_Payment::get_first_event_name()
450
+	 */
451
+	protected function _get_first_event_name_for_payment(EEI_Payment $payment)
452
+	{
453
+		return $payment->get_first_event_name();
454
+	}
455
+
456
+	/**
457
+	 * Gets the text to use for a gateway's line item name when this is a partial payment
458
+	 *
459
+	 * @deprecated since 4.9.31 instead use $this->_get_gateway_formatter()->formatPartialPaymentLineItemName($payment)
460
+	 * @param EE_Payment $payment
461
+	 * @return string
462
+	 */
463
+	protected function _format_partial_payment_line_item_name(EEI_Payment $payment)
464
+	{
465
+		return $this->_get_gateway_formatter()->formatPartialPaymentLineItemName($payment);
466
+	}
467
+
468
+	/**
469
+	 * Gets the text to use for a gateway's line item description when this is a partial payment
470
+	 *
471
+	 * @deprecated since 4.9.31 instead use $this->_get_gateway_formatter()->formatPartialPaymentLineItemDesc()
472
+	 * @param EEI_Payment $payment
473
+	 * @return string
474
+	 */
475
+	protected function _format_partial_payment_line_item_desc(EEI_Payment $payment)
476
+	{
477
+		return $this->_get_gateway_formatter()->formatPartialPaymentLineItemDesc($payment);
478
+	}
479
+
480
+	/**
481
+	 * Gets the name to use for a line item when sending line items to the gateway
482
+	 *
483
+	 * @deprecated since 4.9.31 instead use $this->_get_gateway_formatter()->formatLineItemName($line_item,$payment)
484
+	 * @param EEI_Line_Item $line_item
485
+	 * @param EEI_Payment   $payment
486
+	 * @return string
487
+	 */
488
+	protected function _format_line_item_name(EEI_Line_Item $line_item, EEI_Payment $payment)
489
+	{
490
+		return $this->_get_gateway_formatter()->formatLineItemName($line_item, $payment);
491
+	}
492
+
493
+	/**
494
+	 * Gets the description to use for a line item when sending line items to the gateway
495
+	 *
496
+	 * @deprecated since 4.9.31 instead use $this->_get_gateway_formatter()->formatLineItemDesc($line_item, $payment))
497
+	 * @param EEI_Line_Item $line_item
498
+	 * @param EEI_Payment   $payment
499
+	 * @return string
500
+	 */
501
+	protected function _format_line_item_desc(EEI_Line_Item $line_item, EEI_Payment $payment)
502
+	{
503
+		return $this->_get_gateway_formatter()->formatLineItemDesc($line_item, $payment);
504
+	}
505
+
506
+	/**
507
+	 * Gets the order description that should generlly be sent to gateways
508
+	 *
509
+	 * @deprecated since 4.9.31 instead use $this->_get_gateway_formatter()->formatOrderDescription($payment)
510
+	 * @param EEI_Payment $payment
511
+	 * @return type
512
+	 */
513
+	protected function _format_order_description(EEI_Payment $payment)
514
+	{
515
+		return $this->_get_gateway_formatter()->formatOrderDescription($payment);
516
+	}
517 517
 }
Please login to merge, or discard this patch.
admin_pages/payments/templates/payment_log_details.template.php 1 patch
Indentation   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -36,17 +36,17 @@  discard block
 block discarded – undo
36 36
                 </th>
37 37
                 <td>
38 38
                     <?php
39
-                    if ($payment_log->object() instanceof EE_Transaction) {
40
-                        esc_html_e('Unknown', 'event_espresso');
41
-                    } else {
42
-                        echo $payment_method
43
-                        ? $payment_method->admin_name()
44
-                        : esc_html__(
45
-                            "No Longer Exists",
46
-                            'event_espresso'
47
-                        );
48
-                    }
49
-                    ?>
39
+					if ($payment_log->object() instanceof EE_Transaction) {
40
+						esc_html_e('Unknown', 'event_espresso');
41
+					} else {
42
+						echo $payment_method
43
+						? $payment_method->admin_name()
44
+						: esc_html__(
45
+							"No Longer Exists",
46
+							'event_espresso'
47
+						);
48
+					}
49
+					?>
50 50
 
51 51
                 </td>
52 52
             </tr>
@@ -69,9 +69,9 @@  discard block
 block discarded – undo
69 69
                 </th>
70 70
                 <td>
71 71
                     <?php echo $payment_log->e(
72
-                        'LOG_message',
73
-                        'as_table'
74
-                    );// EEH_Template::layout_array_as_table($payment_log->content())?>
72
+						'LOG_message',
73
+						'as_table'
74
+					);// EEH_Template::layout_array_as_table($payment_log->content())?>
75 75
                 </td>
76 76
             </tr>
77 77
             </tbody>
Please login to merge, or discard this patch.
core/libraries/payment_methods/EE_PMT_Base.lib.php 1 patch
Indentation   +808 added lines, -808 removed lines patch added patch discarded remove patch
@@ -21,812 +21,812 @@
 block discarded – undo
21 21
 abstract class EE_PMT_Base
22 22
 {
23 23
 
24
-    const onsite = 'on-site';
25
-    const offsite = 'off-site';
26
-    const offline = 'off-line';
27
-
28
-    /**
29
-     * @var EE_Payment_Method
30
-     */
31
-    protected $_pm_instance = null;
32
-
33
-    /**
34
-     * @var boolean
35
-     */
36
-    protected $_requires_https = false;
37
-
38
-    /**
39
-     * @var boolean
40
-     */
41
-    protected $_has_billing_form;
42
-
43
-    /**
44
-     * @var EE_Gateway
45
-     */
46
-    protected $_gateway = null;
47
-
48
-    /**
49
-     * @var EE_Payment_Method_Form
50
-     */
51
-    protected $_settings_form = null;
52
-
53
-    /**
54
-     * @var EE_Form_Section_Proper
55
-     */
56
-    protected $_billing_form = null;
57
-
58
-    /**
59
-     * @var boolean
60
-     */
61
-    protected $_cache_billing_form = true;
62
-
63
-    /**
64
-     * String of the absolute path to the folder containing this file, with a trailing slash.
65
-     * eg '/public_html/wp-site/wp-content/plugins/event-espresso/payment_methods/Invoice/'
66
-     *
67
-     * @var string
68
-     */
69
-    protected $_file_folder = null;
70
-
71
-    /**
72
-     * String to the absolute URL to this file (useful for getting its web-accessible resources
73
-     * like images, js, or css)
74
-     *
75
-     * @var string
76
-     */
77
-    protected $_file_url = null;
78
-
79
-    /**
80
-     * Pretty name for the payment method
81
-     *
82
-     * @var string
83
-     */
84
-    protected $_pretty_name = null;
85
-
86
-    /**
87
-     *
88
-     * @var string
89
-     */
90
-    protected $_default_button_url = null;
91
-
92
-    /**
93
-     *
94
-     * @var string
95
-     */
96
-    protected $_default_description = null;
97
-
98
-
99
-    /**
100
-     *
101
-     * @param EE_Payment_Method $pm_instance
102
-     * @throws EE_Error
103
-     * @return EE_PMT_Base
104
-     */
105
-    public function __construct($pm_instance = null)
106
-    {
107
-        if ($pm_instance instanceof EE_Payment_Method) {
108
-            $this->set_instance($pm_instance);
109
-        }
110
-        if ($this->_gateway) {
111
-            $this->_gateway->set_payment_model(EEM_Payment::instance());
112
-            $this->_gateway->set_payment_log(EEM_Change_Log::instance());
113
-            $this->_gateway->set_template_helper(new EEH_Template());
114
-            $this->_gateway->set_line_item_helper(new EEH_Line_Item());
115
-            $this->_gateway->set_money_helper(new EEH_Money());
116
-            $this->_gateway->set_gateway_data_formatter(new GatewayDataFormatter());
117
-            $this->_gateway->set_unsupported_character_remover(new AsciiOnly());
118
-            do_action('AHEE__EE_PMT_Base___construct__done_initializing_gateway_class', $this, $this->_gateway);
119
-        }
120
-        if (! isset($this->_has_billing_form)) {
121
-            // by default, On Site gateways have a billing form
122
-            if ($this->payment_occurs() == EE_PMT_Base::onsite) {
123
-                $this->set_has_billing_form(true);
124
-            } else {
125
-                $this->set_has_billing_form(false);
126
-            }
127
-        }
128
-
129
-        if (! $this->_pretty_name) {
130
-            throw new EE_Error(
131
-                sprintf(
132
-                    __(
133
-                        "You must set the pretty name for the Payment Method Type in the constructor (_pretty_name), and please make it internationalized",
134
-                        "event_espresso"
135
-                    )
136
-                )
137
-            );
138
-        }
139
-        // if the child didn't specify a default button, use the credit card one
140
-        if ($this->_default_button_url === null) {
141
-            $this->_default_button_url = EE_PLUGIN_DIR_URL . 'payment_methods' . DS . 'pay-by-credit-card.png';
142
-        }
143
-    }
144
-
145
-
146
-    /**
147
-     * @param boolean $has_billing_form
148
-     */
149
-    public function set_has_billing_form($has_billing_form)
150
-    {
151
-        $this->_has_billing_form = filter_var($has_billing_form, FILTER_VALIDATE_BOOLEAN);
152
-    }
153
-
154
-
155
-    /**
156
-     * sets the file_folder property
157
-     */
158
-    protected function _set_file_folder()
159
-    {
160
-        $reflector = new ReflectionClass(get_class($this));
161
-        $fn = $reflector->getFileName();
162
-        $this->_file_folder = dirname($fn) . DS;
163
-    }
164
-
165
-
166
-    /**
167
-     * sets the file URL with a trailing slash for this PMT
168
-     */
169
-    protected function _set_file_url()
170
-    {
171
-        $plugins_dir_fixed = str_replace('\\', DS, WP_PLUGIN_DIR);
172
-        $file_folder_fixed = str_replace('\\', DS, $this->file_folder());
173
-        $file_path = str_replace($plugins_dir_fixed, WP_PLUGIN_URL, $file_folder_fixed);
174
-        $this->_file_url = $file_path;
175
-    }
176
-
177
-    /**
178
-     * Gets the default description on all payment methods of this type
179
-     *
180
-     * @return string
181
-     */
182
-    public function default_description()
183
-    {
184
-        return $this->_default_description;
185
-    }
186
-
187
-
188
-    /**
189
-     * Returns the folder containing the PMT child class, with a trailing slash
190
-     *
191
-     * @return string
192
-     */
193
-    public function file_folder()
194
-    {
195
-        if (! $this->_file_folder) {
196
-            $this->_set_file_folder();
197
-        }
198
-        return $this->_file_folder;
199
-    }
200
-
201
-
202
-    /**
203
-     * @return string
204
-     */
205
-    public function file_url()
206
-    {
207
-        if (! $this->_file_url) {
208
-            $this->_set_file_url();
209
-        }
210
-        return $this->_file_url;
211
-    }
212
-
213
-
214
-    /**
215
-     * Sets the payment method instance this payment method type is for.
216
-     * Its important teh payment method instance is set before
217
-     *
218
-     * @param EE_Payment_Method $payment_method_instance
219
-     */
220
-    public function set_instance($payment_method_instance)
221
-    {
222
-        $this->_pm_instance = $payment_method_instance;
223
-        // if they have already requested the settings form, make sure its
224
-        // data matches this model object
225
-        if ($this->_settings_form) {
226
-            $this->settings_form()->populate_model_obj($payment_method_instance);
227
-        }
228
-        if ($this->_gateway && $this->_gateway instanceof EE_Gateway) {
229
-            $this->_gateway->set_settings($payment_method_instance->settings_array());
230
-        }
231
-    }
232
-
233
-
234
-    /**
235
-     * Gets teh form for displaying to admins where they setup the payment method
236
-     *
237
-     * @return EE_Payment_Method_Form
238
-     */
239
-    public function settings_form()
240
-    {
241
-        if (! $this->_settings_form) {
242
-            $this->_settings_form = $this->generate_new_settings_form();
243
-            $this->_settings_form->set_payment_method_type($this);
244
-            // if we have already assigned a model object to this pmt, make
245
-            // sure its reflected in teh form we just generated
246
-            if ($this->_pm_instance) {
247
-                $this->_settings_form->populate_model_obj($this->_pm_instance);
248
-            }
249
-        }
250
-        return $this->_settings_form;
251
-    }
252
-
253
-
254
-    /**
255
-     * Gets the form for all the settings related to this payment method type
256
-     *
257
-     * @return EE_Payment_Method_Form
258
-     */
259
-    abstract public function generate_new_settings_form();
260
-
261
-
262
-    /**
263
-     * Sets the form for settings. This may be useful if we have already received
264
-     * a form submission and have form data it in, and want to use it anytime we're showing
265
-     * this payment method type's settings form later in the request
266
-     *
267
-     * @param EE_Payment_Method_Form $form
268
-     */
269
-    public function set_settings_form($form)
270
-    {
271
-        $this->_settings_form = $form;
272
-    }
273
-
274
-
275
-    /**
276
-     * @return boolean
277
-     */
278
-    public function has_billing_form()
279
-    {
280
-        return $this->_has_billing_form;
281
-    }
282
-
283
-
284
-    /**
285
-     * Gets the form for displaying to attendees where they can enter their billing info
286
-     * which will be sent to teh gateway (can be null)
287
-     *
288
-     * @param \EE_Transaction $transaction
289
-     * @param array           $extra_args
290
-     * @return \EE_Billing_Attendee_Info_Form|\EE_Billing_Info_Form|null
291
-     */
292
-    public function billing_form(EE_Transaction $transaction = null, $extra_args = array())
293
-    {
294
-        // has billing form already been regenerated ? or overwrite cache?
295
-        if (! $this->_billing_form instanceof EE_Billing_Info_Form || ! $this->_cache_billing_form) {
296
-            $this->_billing_form = $this->generate_new_billing_form($transaction, $extra_args);
297
-        }
298
-        // if we know who the attendee is, and this is a billing form
299
-        // that uses attendee info, populate it
300
-        if (apply_filters(
301
-            'FHEE__populate_billing_form_fields_from_attendee',
302
-            ($this->_billing_form instanceof EE_Billing_Attendee_Info_Form
303
-                && $transaction instanceof EE_Transaction
304
-                && $transaction->primary_registration() instanceof EE_Registration
305
-                && $transaction->primary_registration()->attendee() instanceof EE_Attendee
306
-            ),
307
-            $this->_billing_form,
308
-            $transaction
309
-        )) {
310
-            $this->_billing_form->populate_from_attendee($transaction->primary_registration()->attendee());
311
-        }
312
-        return $this->_billing_form;
313
-    }
314
-
315
-
316
-    /**
317
-     * Creates the billing form for this payment method type
318
-     *
319
-     * @param \EE_Transaction $transaction
320
-     * @return \EE_Billing_Info_Form
321
-     */
322
-    abstract public function generate_new_billing_form(EE_Transaction $transaction = null);
323
-
324
-
325
-    /**
326
-     * apply_billing_form_debug_settings
327
-     * applies debug data to the form
328
-     *
329
-     * @param \EE_Billing_Info_Form $billing_form
330
-     * @return \EE_Billing_Info_Form
331
-     */
332
-    public function apply_billing_form_debug_settings(EE_Billing_Info_Form $billing_form)
333
-    {
334
-        return $billing_form;
335
-    }
336
-
337
-
338
-    /**
339
-     * Sets the billing form for this payment method type. You may want to use this
340
-     * if you have form
341
-     *
342
-     * @param EE_Payment_Method $form
343
-     */
344
-    public function set_billing_form($form)
345
-    {
346
-        $this->_billing_form = $form;
347
-    }
348
-
349
-
350
-    /**
351
-     * Returns whether or not this payment method requires HTTPS to be used
352
-     *
353
-     * @return boolean
354
-     */
355
-    public function requires_https()
356
-    {
357
-        return $this->_requires_https;
358
-    }
359
-
360
-
361
-    /**
362
-     *
363
-     * @param EE_Transaction       $transaction
364
-     * @param float                $amount
365
-     * @param EE_Billing_Info_Form $billing_info
366
-     * @param string               $return_url
367
-     * @param string               $fail_url
368
-     * @param string               $method
369
-     * @param bool                 $by_admin
370
-     * @return EE_Payment
371
-     * @throws EE_Error
372
-     */
373
-    public function process_payment(
374
-        EE_Transaction $transaction,
375
-        $amount = null,
376
-        $billing_info = null,
377
-        $return_url = null,
378
-        $fail_url = '',
379
-        $method = 'CART',
380
-        $by_admin = false
381
-    ) {
382
-        // @todo: add surcharge for the payment method, if any
383
-        if ($this->_gateway) {
384
-            // there is a gateway, so we're going to make a payment object
385
-            // but wait! do they already have a payment in progress that we thought was failed?
386
-            $duplicate_properties = array(
387
-                'STS_ID'               => EEM_Payment::status_id_failed,
388
-                'TXN_ID'               => $transaction->ID(),
389
-                'PMD_ID'               => $this->_pm_instance->ID(),
390
-                'PAY_source'           => $method,
391
-                'PAY_amount'           => $amount !== null ? $amount : $transaction->remaining(),
392
-                'PAY_gateway_response' => null,
393
-            );
394
-            $payment = EEM_Payment::instance()->get_one(array($duplicate_properties));
395
-            // if we didn't already have a payment in progress for the same thing,
396
-            // then we actually want to make a new payment
397
-            if (! $payment instanceof EE_Payment) {
398
-                $payment = EE_Payment::new_instance(
399
-                    array_merge(
400
-                        $duplicate_properties,
401
-                        array(
402
-                            'PAY_timestamp'       => time(),
403
-                            'PAY_txn_id_chq_nmbr' => null,
404
-                            'PAY_po_number'       => null,
405
-                            'PAY_extra_accntng'   => null,
406
-                            'PAY_details'         => null,
407
-                        )
408
-                    )
409
-                );
410
-            }
411
-            // make sure the payment has been saved to show we started it, and so it has an ID should the gateway try to log it
412
-            $payment->save();
413
-            $billing_values = $this->_get_billing_values_from_form($billing_info);
414
-
415
-            //  Offsite Gateway
416
-            if ($this->_gateway instanceof EE_Offsite_Gateway) {
417
-                $payment = $this->_gateway->set_redirection_info(
418
-                    $payment,
419
-                    $billing_values,
420
-                    $return_url,
421
-                    EE_Config::instance()->core->txn_page_url(
422
-                        array(
423
-                            'e_reg_url_link'    => $transaction->primary_registration()->reg_url_link(),
424
-                            'ee_payment_method' => $this->_pm_instance->slug(),
425
-                        )
426
-                    ),
427
-                    $fail_url
428
-                );
429
-                $payment->save();
430
-                //  Onsite Gateway
431
-            } elseif ($this->_gateway instanceof EE_Onsite_Gateway) {
432
-                $payment = $this->_gateway->do_direct_payment($payment, $billing_values);
433
-                $payment->save();
434
-            } else {
435
-                throw new EE_Error(
436
-                    sprintf(
437
-                        __(
438
-                            'Gateway for payment method type "%s" is "%s", not a subclass of either EE_Offsite_Gateway or EE_Onsite_Gateway, or null (to indicate NO gateway)',
439
-                            'event_espresso'
440
-                        ),
441
-                        get_class($this),
442
-                        gettype($this->_gateway)
443
-                    )
444
-                );
445
-            }
446
-        } else {
447
-            // no gateway provided
448
-            // there is no payment. Must be an offline gateway
449
-            // create a payment object anyways, but dont save it
450
-            $payment = EE_Payment::new_instance(
451
-                array(
452
-                    'STS_ID'        => EEM_Payment::status_id_pending,
453
-                    'TXN_ID'        => $transaction->ID(),
454
-                    'PMD_ID'        => $transaction->payment_method_ID(),
455
-                    'PAY_amount'    => 0.00,
456
-                    'PAY_timestamp' => time(),
457
-                )
458
-            );
459
-        }
460
-
461
-        // if there is billing info, clean it and save it now
462
-        if ($billing_info instanceof EE_Billing_Attendee_Info_Form) {
463
-            $this->_save_billing_info_to_attendee($billing_info, $transaction);
464
-        }
465
-
466
-        return $payment;
467
-    }
468
-
469
-    /**
470
-     * Gets the values we want to pass onto the gateway. Normally these
471
-     * are just the 'pretty' values, but there may be times the data may need
472
-     * a  little massaging. Proper subsections will become arrays of inputs
473
-     *
474
-     * @param EE_Billing_Info_Form $billing_form
475
-     * @return array
476
-     */
477
-    protected function _get_billing_values_from_form($billing_form)
478
-    {
479
-        if ($billing_form instanceof EE_Form_Section_Proper) {
480
-            return $billing_form->input_pretty_values(true);
481
-        } else {
482
-            return null;
483
-        }
484
-    }
485
-
486
-
487
-    /**
488
-     * Handles an instant payment notification when the transaction is known (by default).
489
-     *
490
-     * @param array          $req_data
491
-     * @param EE_Transaction $transaction
492
-     * @return EE_Payment
493
-     * @throws EE_Error
494
-     */
495
-    public function handle_ipn($req_data, $transaction)
496
-    {
497
-        $transaction = EEM_Transaction::instance()->ensure_is_obj($transaction);
498
-        if (! $this->_gateway instanceof EE_Offsite_Gateway) {
499
-            throw new EE_Error(
500
-                sprintf(
501
-                    __("Could not handle IPN because '%s' is not an offsite gateway", "event_espresso"),
502
-                    print_r($this->_gateway, true)
503
-                )
504
-            );
505
-        }
506
-        $payment = $this->_gateway->handle_payment_update($req_data, $transaction);
507
-        return $payment;
508
-    }
509
-
510
-
511
-    /**
512
-     * Saves the billing info onto the attendee of the primary registrant on this transaction, and
513
-     * cleans it first.
514
-     *
515
-     * @param EE_Billing_Attendee_Info_Form $billing_form
516
-     * @param EE_Transaction                $transaction
517
-     * @return boolean success
518
-     */
519
-    protected function _save_billing_info_to_attendee($billing_form, $transaction)
520
-    {
521
-        if (! $transaction || ! $transaction instanceof EE_Transaction) {
522
-            EE_Error::add_error(
523
-                __("Cannot save billing info because no transaction was specified", "event_espresso"),
524
-                __FILE__,
525
-                __FUNCTION__,
526
-                __LINE__
527
-            );
528
-            return false;
529
-        }
530
-        $primary_reg = $transaction->primary_registration();
531
-        if (! $primary_reg) {
532
-            EE_Error::add_error(
533
-                __("Cannot save billing info because the transaction has no primary registration", "event_espresso"),
534
-                __FILE__,
535
-                __FUNCTION__,
536
-                __LINE__
537
-            );
538
-            return false;
539
-        }
540
-        $attendee = $primary_reg->attendee();
541
-        if (! $attendee) {
542
-            EE_Error::add_error(
543
-                __(
544
-                    "Cannot save billing info because the transaction's primary registration has no attendee!",
545
-                    "event_espresso"
546
-                ),
547
-                __FILE__,
548
-                __FUNCTION__,
549
-                __LINE__
550
-            );
551
-            return false;
552
-        }
553
-        return $attendee->save_and_clean_billing_info_for_payment_method($billing_form, $transaction->payment_method());
554
-    }
555
-
556
-
557
-    /**
558
-     * Gets the payment this IPN is for. Children may often want to
559
-     * override this to inspect the request
560
-     *
561
-     * @param EE_Transaction $transaction
562
-     * @param array          $req_data
563
-     * @return EE_Payment
564
-     */
565
-    protected function find_payment_for_ipn(EE_Transaction $transaction, $req_data = array())
566
-    {
567
-        return $transaction->last_payment();
568
-    }
569
-
570
-
571
-    /**
572
-     * In case generic code cannot provide the payment processor with a specific payment method
573
-     * and transaction, it will try calling this method on each activate payment method.
574
-     * If the payment method is able to identify the request as being for it, it should fetch
575
-     * the payment its for and return it. If not, it should throw an EE_Error to indicate it cannot
576
-     * handle the IPN
577
-     *
578
-     * @param array $req_data
579
-     * @return EE_Payment only if this payment method can find the info its needs from $req_data
580
-     * and identifies the IPN as being for this payment method (not just fo ra payment method of this type)
581
-     * @throws EE_Error
582
-     */
583
-    public function handle_unclaimed_ipn($req_data = array())
584
-    {
585
-        throw new EE_Error(
586
-            sprintf(__("Payment Method '%s' cannot handle unclaimed IPNs", "event_espresso"), get_class($this))
587
-        );
588
-    }
589
-
590
-
591
-    /**
592
-     * Logic to be accomplished when the payment attempt is complete.
593
-     * Most payment methods don't need to do anything at this point; but some, like Mijireh, do.
594
-     * (Mijireh is an offsite gateway which doesn't send an IPN. So when the user returns to EE from
595
-     * mijireh, this method needs to be called so the Mijireh PM can ping Mijireh to know the status
596
-     * of the payment). Fed a transaction because it's always assumed to be the last payment that
597
-     * we're dealing with. Returns that last payment (if there is one)
598
-     *
599
-     * @param EE_Transaction $transaction
600
-     * @return EE_Payment
601
-     */
602
-    public function finalize_payment_for($transaction)
603
-    {
604
-        return $transaction->last_payment();
605
-    }
606
-
607
-
608
-    /**
609
-     * Whether or not this payment method's gateway supports sending refund requests
610
-     *
611
-     * @return boolean
612
-     */
613
-    public function supports_sending_refunds()
614
-    {
615
-        if ($this->_gateway && $this->_gateway instanceof EE_Gateway) {
616
-            return $this->_gateway->supports_sending_refunds();
617
-        } else {
618
-            return false;
619
-        }
620
-    }
621
-
622
-
623
-    /**
624
-     *
625
-     * @param EE_Payment $payment
626
-     * @param array      $refund_info
627
-     * @throws EE_Error
628
-     * @return EE_Payment
629
-     */
630
-    public function process_refund(EE_Payment $payment, $refund_info = array())
631
-    {
632
-        if ($this->_gateway && $this->_gateway instanceof EE_Gateway) {
633
-            return $this->_gateway->do_direct_refund($payment, $refund_info);
634
-        } else {
635
-            throw new EE_Error(
636
-                sprintf(
637
-                    __('Payment Method Type "%s" does not support sending refund requests', 'event_espresso'),
638
-                    get_class($this)
639
-                )
640
-            );
641
-        }
642
-    }
643
-
644
-
645
-    /**
646
-     * Returns one the class's constants onsite,offsite, or offline, depending on this
647
-     * payment method's gateway.
648
-     *
649
-     * @return string
650
-     * @throws EE_Error
651
-     */
652
-    public function payment_occurs()
653
-    {
654
-        if (! $this->_gateway) {
655
-            return EE_PMT_Base::offline;
656
-        } elseif ($this->_gateway instanceof EE_Onsite_Gateway) {
657
-            return EE_PMT_Base::onsite;
658
-        } elseif ($this->_gateway instanceof EE_Offsite_Gateway) {
659
-            return EE_PMT_Base::offsite;
660
-        } else {
661
-            throw new EE_Error(
662
-                sprintf(
663
-                    __(
664
-                        "Payment method type '%s's gateway isn't an instance of EE_Onsite_Gateway, EE_Offsite_Gateway, or null. It must be one of those",
665
-                        "event_espresso"
666
-                    ),
667
-                    get_class($this)
668
-                )
669
-            );
670
-        }
671
-    }
672
-
673
-
674
-    /**
675
-     * For adding any html output ab ove the payment overview.
676
-     * Many gateways won't want ot display anything, so this function just returns an empty string.
677
-     * Other gateways may want to override this, such as offline gateways.
678
-     *
679
-     * @param EE_Payment $payment
680
-     * @return string
681
-     */
682
-    public function payment_overview_content(EE_Payment $payment)
683
-    {
684
-        return EEH_Template::display_template(
685
-            EE_LIBRARIES . 'payment_methods' . DS . 'templates' . DS . 'payment_details_content.template.php',
686
-            array('payment_method' => $this->_pm_instance, 'payment' => $payment),
687
-            true
688
-        );
689
-    }
690
-
691
-
692
-    /**
693
-     * @return array where keys are the help tab name,
694
-     * values are: array {
695
-     * @type string $title         i18n name for the help tab
696
-     * @type string $filename      name of the file located in ./help_tabs/ (ie, in a folder next to this file)
697
-     * @type array  $template_args any arguments you want passed to the template file while rendering.
698
-     *                Keys will be variable names and values with be their values.
699
-     */
700
-    public function help_tabs_config()
701
-    {
702
-        return array();
703
-    }
704
-
705
-
706
-    /**
707
-     * The system name for this PMT (eg AIM, Paypal_Pro, Invoice... what gets put into
708
-     * the payment method's table's PMT_type column)
709
-     *
710
-     * @return string
711
-     */
712
-    public function system_name()
713
-    {
714
-        $classname = get_class($this);
715
-        return str_replace("EE_PMT_", '', $classname);
716
-    }
717
-
718
-
719
-    /**
720
-     * A pretty i18n version of the PMT name. Often the same as the "pretty_name", but you can change it by overriding
721
-     * this method.
722
-     * @return string
723
-     */
724
-    public function defaultFrontendName()
725
-    {
726
-        return $this->pretty_name();
727
-    }
728
-
729
-
730
-    /**
731
-     * A pretty i18n version of the PMT name
732
-     *
733
-     * @return string
734
-     */
735
-    public function pretty_name()
736
-    {
737
-        return $this->_pretty_name;
738
-    }
739
-
740
-
741
-    /**
742
-     * Gets the default absolute URL to the payment method type's button
743
-     *
744
-     * @return string
745
-     */
746
-    public function default_button_url()
747
-    {
748
-        return $this->_default_button_url;
749
-    }
750
-
751
-
752
-    /**
753
-     * Gets the gateway used by this payment method (if any)
754
-     *
755
-     * @return EE_Gateway
756
-     */
757
-    public function get_gateway()
758
-    {
759
-        return $this->_gateway;
760
-    }
761
-
762
-
763
-    /**
764
-     * @return string html for the link to a help tab
765
-     */
766
-    public function get_help_tab_link()
767
-    {
768
-        return EEH_Template::get_help_tab_link(
769
-            $this->get_help_tab_name(),
770
-            'espresso_payment_settings',
771
-            'default'
772
-        );
773
-    }
774
-
775
-
776
-    /**
777
-     * Returns the name of the help tab for this PMT
778
-     *
779
-     * @return string
780
-     */
781
-    public function get_help_tab_name()
782
-    {
783
-        return 'ee_' . strtolower($this->system_name()) . '_help_tab';
784
-    }
785
-
786
-    /**
787
-     * The name of the wp capability that should be associated with the usage of
788
-     * this PMT by an admin
789
-     *
790
-     * @return string
791
-     */
792
-    public function cap_name()
793
-    {
794
-        return 'ee_payment_method_' . strtolower($this->system_name());
795
-    }
796
-
797
-    /**
798
-     * Called by client code to tell the gateway that if it wants to change
799
-     * the transaction or line items or registrations related to teh payment it already
800
-     * processed (we think, but possibly not) that now's the time to do it.
801
-     * It is expected that gateways will store any info they need for this on the PAY_details,
802
-     * or maybe an extra meta value
803
-     *
804
-     * @param EE_Payment $payment
805
-     * @return void
806
-     */
807
-    public function update_txn_based_on_payment($payment)
808
-    {
809
-        if ($this->_gateway instanceof EE_Gateway) {
810
-            $this->_gateway->update_txn_based_on_payment($payment);
811
-        }
812
-    }
813
-
814
-    /**
815
-     * Returns a string of HTML describing this payment method type for an admin,
816
-     * primarily intended for them to read before activating it.
817
-     * The easiest way to set this is to create a folder 'templates' alongside
818
-     * your EE_PMT_{System_Name} file, and in it create a file named "{system_name}_intro.template.php".
819
-     * Eg, if your payment method file is named "EE_PMT_Foo_Bar.pm.php",
820
-     * then you'd create a file named "templates" in the same folder as it, and name the file
821
-     * "foo_bar_intro.template.php", and its content will be returned by this method
822
-     *
823
-     * @return string
824
-     */
825
-    public function introductory_html()
826
-    {
827
-        return EEH_Template::locate_template(
828
-            $this->file_folder() . 'templates' . DS . strtolower($this->system_name()) . '_intro.template.php',
829
-            array('pmt_obj' => $this, 'pm_instance' => $this->_pm_instance)
830
-        );
831
-    }
24
+	const onsite = 'on-site';
25
+	const offsite = 'off-site';
26
+	const offline = 'off-line';
27
+
28
+	/**
29
+	 * @var EE_Payment_Method
30
+	 */
31
+	protected $_pm_instance = null;
32
+
33
+	/**
34
+	 * @var boolean
35
+	 */
36
+	protected $_requires_https = false;
37
+
38
+	/**
39
+	 * @var boolean
40
+	 */
41
+	protected $_has_billing_form;
42
+
43
+	/**
44
+	 * @var EE_Gateway
45
+	 */
46
+	protected $_gateway = null;
47
+
48
+	/**
49
+	 * @var EE_Payment_Method_Form
50
+	 */
51
+	protected $_settings_form = null;
52
+
53
+	/**
54
+	 * @var EE_Form_Section_Proper
55
+	 */
56
+	protected $_billing_form = null;
57
+
58
+	/**
59
+	 * @var boolean
60
+	 */
61
+	protected $_cache_billing_form = true;
62
+
63
+	/**
64
+	 * String of the absolute path to the folder containing this file, with a trailing slash.
65
+	 * eg '/public_html/wp-site/wp-content/plugins/event-espresso/payment_methods/Invoice/'
66
+	 *
67
+	 * @var string
68
+	 */
69
+	protected $_file_folder = null;
70
+
71
+	/**
72
+	 * String to the absolute URL to this file (useful for getting its web-accessible resources
73
+	 * like images, js, or css)
74
+	 *
75
+	 * @var string
76
+	 */
77
+	protected $_file_url = null;
78
+
79
+	/**
80
+	 * Pretty name for the payment method
81
+	 *
82
+	 * @var string
83
+	 */
84
+	protected $_pretty_name = null;
85
+
86
+	/**
87
+	 *
88
+	 * @var string
89
+	 */
90
+	protected $_default_button_url = null;
91
+
92
+	/**
93
+	 *
94
+	 * @var string
95
+	 */
96
+	protected $_default_description = null;
97
+
98
+
99
+	/**
100
+	 *
101
+	 * @param EE_Payment_Method $pm_instance
102
+	 * @throws EE_Error
103
+	 * @return EE_PMT_Base
104
+	 */
105
+	public function __construct($pm_instance = null)
106
+	{
107
+		if ($pm_instance instanceof EE_Payment_Method) {
108
+			$this->set_instance($pm_instance);
109
+		}
110
+		if ($this->_gateway) {
111
+			$this->_gateway->set_payment_model(EEM_Payment::instance());
112
+			$this->_gateway->set_payment_log(EEM_Change_Log::instance());
113
+			$this->_gateway->set_template_helper(new EEH_Template());
114
+			$this->_gateway->set_line_item_helper(new EEH_Line_Item());
115
+			$this->_gateway->set_money_helper(new EEH_Money());
116
+			$this->_gateway->set_gateway_data_formatter(new GatewayDataFormatter());
117
+			$this->_gateway->set_unsupported_character_remover(new AsciiOnly());
118
+			do_action('AHEE__EE_PMT_Base___construct__done_initializing_gateway_class', $this, $this->_gateway);
119
+		}
120
+		if (! isset($this->_has_billing_form)) {
121
+			// by default, On Site gateways have a billing form
122
+			if ($this->payment_occurs() == EE_PMT_Base::onsite) {
123
+				$this->set_has_billing_form(true);
124
+			} else {
125
+				$this->set_has_billing_form(false);
126
+			}
127
+		}
128
+
129
+		if (! $this->_pretty_name) {
130
+			throw new EE_Error(
131
+				sprintf(
132
+					__(
133
+						"You must set the pretty name for the Payment Method Type in the constructor (_pretty_name), and please make it internationalized",
134
+						"event_espresso"
135
+					)
136
+				)
137
+			);
138
+		}
139
+		// if the child didn't specify a default button, use the credit card one
140
+		if ($this->_default_button_url === null) {
141
+			$this->_default_button_url = EE_PLUGIN_DIR_URL . 'payment_methods' . DS . 'pay-by-credit-card.png';
142
+		}
143
+	}
144
+
145
+
146
+	/**
147
+	 * @param boolean $has_billing_form
148
+	 */
149
+	public function set_has_billing_form($has_billing_form)
150
+	{
151
+		$this->_has_billing_form = filter_var($has_billing_form, FILTER_VALIDATE_BOOLEAN);
152
+	}
153
+
154
+
155
+	/**
156
+	 * sets the file_folder property
157
+	 */
158
+	protected function _set_file_folder()
159
+	{
160
+		$reflector = new ReflectionClass(get_class($this));
161
+		$fn = $reflector->getFileName();
162
+		$this->_file_folder = dirname($fn) . DS;
163
+	}
164
+
165
+
166
+	/**
167
+	 * sets the file URL with a trailing slash for this PMT
168
+	 */
169
+	protected function _set_file_url()
170
+	{
171
+		$plugins_dir_fixed = str_replace('\\', DS, WP_PLUGIN_DIR);
172
+		$file_folder_fixed = str_replace('\\', DS, $this->file_folder());
173
+		$file_path = str_replace($plugins_dir_fixed, WP_PLUGIN_URL, $file_folder_fixed);
174
+		$this->_file_url = $file_path;
175
+	}
176
+
177
+	/**
178
+	 * Gets the default description on all payment methods of this type
179
+	 *
180
+	 * @return string
181
+	 */
182
+	public function default_description()
183
+	{
184
+		return $this->_default_description;
185
+	}
186
+
187
+
188
+	/**
189
+	 * Returns the folder containing the PMT child class, with a trailing slash
190
+	 *
191
+	 * @return string
192
+	 */
193
+	public function file_folder()
194
+	{
195
+		if (! $this->_file_folder) {
196
+			$this->_set_file_folder();
197
+		}
198
+		return $this->_file_folder;
199
+	}
200
+
201
+
202
+	/**
203
+	 * @return string
204
+	 */
205
+	public function file_url()
206
+	{
207
+		if (! $this->_file_url) {
208
+			$this->_set_file_url();
209
+		}
210
+		return $this->_file_url;
211
+	}
212
+
213
+
214
+	/**
215
+	 * Sets the payment method instance this payment method type is for.
216
+	 * Its important teh payment method instance is set before
217
+	 *
218
+	 * @param EE_Payment_Method $payment_method_instance
219
+	 */
220
+	public function set_instance($payment_method_instance)
221
+	{
222
+		$this->_pm_instance = $payment_method_instance;
223
+		// if they have already requested the settings form, make sure its
224
+		// data matches this model object
225
+		if ($this->_settings_form) {
226
+			$this->settings_form()->populate_model_obj($payment_method_instance);
227
+		}
228
+		if ($this->_gateway && $this->_gateway instanceof EE_Gateway) {
229
+			$this->_gateway->set_settings($payment_method_instance->settings_array());
230
+		}
231
+	}
232
+
233
+
234
+	/**
235
+	 * Gets teh form for displaying to admins where they setup the payment method
236
+	 *
237
+	 * @return EE_Payment_Method_Form
238
+	 */
239
+	public function settings_form()
240
+	{
241
+		if (! $this->_settings_form) {
242
+			$this->_settings_form = $this->generate_new_settings_form();
243
+			$this->_settings_form->set_payment_method_type($this);
244
+			// if we have already assigned a model object to this pmt, make
245
+			// sure its reflected in teh form we just generated
246
+			if ($this->_pm_instance) {
247
+				$this->_settings_form->populate_model_obj($this->_pm_instance);
248
+			}
249
+		}
250
+		return $this->_settings_form;
251
+	}
252
+
253
+
254
+	/**
255
+	 * Gets the form for all the settings related to this payment method type
256
+	 *
257
+	 * @return EE_Payment_Method_Form
258
+	 */
259
+	abstract public function generate_new_settings_form();
260
+
261
+
262
+	/**
263
+	 * Sets the form for settings. This may be useful if we have already received
264
+	 * a form submission and have form data it in, and want to use it anytime we're showing
265
+	 * this payment method type's settings form later in the request
266
+	 *
267
+	 * @param EE_Payment_Method_Form $form
268
+	 */
269
+	public function set_settings_form($form)
270
+	{
271
+		$this->_settings_form = $form;
272
+	}
273
+
274
+
275
+	/**
276
+	 * @return boolean
277
+	 */
278
+	public function has_billing_form()
279
+	{
280
+		return $this->_has_billing_form;
281
+	}
282
+
283
+
284
+	/**
285
+	 * Gets the form for displaying to attendees where they can enter their billing info
286
+	 * which will be sent to teh gateway (can be null)
287
+	 *
288
+	 * @param \EE_Transaction $transaction
289
+	 * @param array           $extra_args
290
+	 * @return \EE_Billing_Attendee_Info_Form|\EE_Billing_Info_Form|null
291
+	 */
292
+	public function billing_form(EE_Transaction $transaction = null, $extra_args = array())
293
+	{
294
+		// has billing form already been regenerated ? or overwrite cache?
295
+		if (! $this->_billing_form instanceof EE_Billing_Info_Form || ! $this->_cache_billing_form) {
296
+			$this->_billing_form = $this->generate_new_billing_form($transaction, $extra_args);
297
+		}
298
+		// if we know who the attendee is, and this is a billing form
299
+		// that uses attendee info, populate it
300
+		if (apply_filters(
301
+			'FHEE__populate_billing_form_fields_from_attendee',
302
+			($this->_billing_form instanceof EE_Billing_Attendee_Info_Form
303
+				&& $transaction instanceof EE_Transaction
304
+				&& $transaction->primary_registration() instanceof EE_Registration
305
+				&& $transaction->primary_registration()->attendee() instanceof EE_Attendee
306
+			),
307
+			$this->_billing_form,
308
+			$transaction
309
+		)) {
310
+			$this->_billing_form->populate_from_attendee($transaction->primary_registration()->attendee());
311
+		}
312
+		return $this->_billing_form;
313
+	}
314
+
315
+
316
+	/**
317
+	 * Creates the billing form for this payment method type
318
+	 *
319
+	 * @param \EE_Transaction $transaction
320
+	 * @return \EE_Billing_Info_Form
321
+	 */
322
+	abstract public function generate_new_billing_form(EE_Transaction $transaction = null);
323
+
324
+
325
+	/**
326
+	 * apply_billing_form_debug_settings
327
+	 * applies debug data to the form
328
+	 *
329
+	 * @param \EE_Billing_Info_Form $billing_form
330
+	 * @return \EE_Billing_Info_Form
331
+	 */
332
+	public function apply_billing_form_debug_settings(EE_Billing_Info_Form $billing_form)
333
+	{
334
+		return $billing_form;
335
+	}
336
+
337
+
338
+	/**
339
+	 * Sets the billing form for this payment method type. You may want to use this
340
+	 * if you have form
341
+	 *
342
+	 * @param EE_Payment_Method $form
343
+	 */
344
+	public function set_billing_form($form)
345
+	{
346
+		$this->_billing_form = $form;
347
+	}
348
+
349
+
350
+	/**
351
+	 * Returns whether or not this payment method requires HTTPS to be used
352
+	 *
353
+	 * @return boolean
354
+	 */
355
+	public function requires_https()
356
+	{
357
+		return $this->_requires_https;
358
+	}
359
+
360
+
361
+	/**
362
+	 *
363
+	 * @param EE_Transaction       $transaction
364
+	 * @param float                $amount
365
+	 * @param EE_Billing_Info_Form $billing_info
366
+	 * @param string               $return_url
367
+	 * @param string               $fail_url
368
+	 * @param string               $method
369
+	 * @param bool                 $by_admin
370
+	 * @return EE_Payment
371
+	 * @throws EE_Error
372
+	 */
373
+	public function process_payment(
374
+		EE_Transaction $transaction,
375
+		$amount = null,
376
+		$billing_info = null,
377
+		$return_url = null,
378
+		$fail_url = '',
379
+		$method = 'CART',
380
+		$by_admin = false
381
+	) {
382
+		// @todo: add surcharge for the payment method, if any
383
+		if ($this->_gateway) {
384
+			// there is a gateway, so we're going to make a payment object
385
+			// but wait! do they already have a payment in progress that we thought was failed?
386
+			$duplicate_properties = array(
387
+				'STS_ID'               => EEM_Payment::status_id_failed,
388
+				'TXN_ID'               => $transaction->ID(),
389
+				'PMD_ID'               => $this->_pm_instance->ID(),
390
+				'PAY_source'           => $method,
391
+				'PAY_amount'           => $amount !== null ? $amount : $transaction->remaining(),
392
+				'PAY_gateway_response' => null,
393
+			);
394
+			$payment = EEM_Payment::instance()->get_one(array($duplicate_properties));
395
+			// if we didn't already have a payment in progress for the same thing,
396
+			// then we actually want to make a new payment
397
+			if (! $payment instanceof EE_Payment) {
398
+				$payment = EE_Payment::new_instance(
399
+					array_merge(
400
+						$duplicate_properties,
401
+						array(
402
+							'PAY_timestamp'       => time(),
403
+							'PAY_txn_id_chq_nmbr' => null,
404
+							'PAY_po_number'       => null,
405
+							'PAY_extra_accntng'   => null,
406
+							'PAY_details'         => null,
407
+						)
408
+					)
409
+				);
410
+			}
411
+			// make sure the payment has been saved to show we started it, and so it has an ID should the gateway try to log it
412
+			$payment->save();
413
+			$billing_values = $this->_get_billing_values_from_form($billing_info);
414
+
415
+			//  Offsite Gateway
416
+			if ($this->_gateway instanceof EE_Offsite_Gateway) {
417
+				$payment = $this->_gateway->set_redirection_info(
418
+					$payment,
419
+					$billing_values,
420
+					$return_url,
421
+					EE_Config::instance()->core->txn_page_url(
422
+						array(
423
+							'e_reg_url_link'    => $transaction->primary_registration()->reg_url_link(),
424
+							'ee_payment_method' => $this->_pm_instance->slug(),
425
+						)
426
+					),
427
+					$fail_url
428
+				);
429
+				$payment->save();
430
+				//  Onsite Gateway
431
+			} elseif ($this->_gateway instanceof EE_Onsite_Gateway) {
432
+				$payment = $this->_gateway->do_direct_payment($payment, $billing_values);
433
+				$payment->save();
434
+			} else {
435
+				throw new EE_Error(
436
+					sprintf(
437
+						__(
438
+							'Gateway for payment method type "%s" is "%s", not a subclass of either EE_Offsite_Gateway or EE_Onsite_Gateway, or null (to indicate NO gateway)',
439
+							'event_espresso'
440
+						),
441
+						get_class($this),
442
+						gettype($this->_gateway)
443
+					)
444
+				);
445
+			}
446
+		} else {
447
+			// no gateway provided
448
+			// there is no payment. Must be an offline gateway
449
+			// create a payment object anyways, but dont save it
450
+			$payment = EE_Payment::new_instance(
451
+				array(
452
+					'STS_ID'        => EEM_Payment::status_id_pending,
453
+					'TXN_ID'        => $transaction->ID(),
454
+					'PMD_ID'        => $transaction->payment_method_ID(),
455
+					'PAY_amount'    => 0.00,
456
+					'PAY_timestamp' => time(),
457
+				)
458
+			);
459
+		}
460
+
461
+		// if there is billing info, clean it and save it now
462
+		if ($billing_info instanceof EE_Billing_Attendee_Info_Form) {
463
+			$this->_save_billing_info_to_attendee($billing_info, $transaction);
464
+		}
465
+
466
+		return $payment;
467
+	}
468
+
469
+	/**
470
+	 * Gets the values we want to pass onto the gateway. Normally these
471
+	 * are just the 'pretty' values, but there may be times the data may need
472
+	 * a  little massaging. Proper subsections will become arrays of inputs
473
+	 *
474
+	 * @param EE_Billing_Info_Form $billing_form
475
+	 * @return array
476
+	 */
477
+	protected function _get_billing_values_from_form($billing_form)
478
+	{
479
+		if ($billing_form instanceof EE_Form_Section_Proper) {
480
+			return $billing_form->input_pretty_values(true);
481
+		} else {
482
+			return null;
483
+		}
484
+	}
485
+
486
+
487
+	/**
488
+	 * Handles an instant payment notification when the transaction is known (by default).
489
+	 *
490
+	 * @param array          $req_data
491
+	 * @param EE_Transaction $transaction
492
+	 * @return EE_Payment
493
+	 * @throws EE_Error
494
+	 */
495
+	public function handle_ipn($req_data, $transaction)
496
+	{
497
+		$transaction = EEM_Transaction::instance()->ensure_is_obj($transaction);
498
+		if (! $this->_gateway instanceof EE_Offsite_Gateway) {
499
+			throw new EE_Error(
500
+				sprintf(
501
+					__("Could not handle IPN because '%s' is not an offsite gateway", "event_espresso"),
502
+					print_r($this->_gateway, true)
503
+				)
504
+			);
505
+		}
506
+		$payment = $this->_gateway->handle_payment_update($req_data, $transaction);
507
+		return $payment;
508
+	}
509
+
510
+
511
+	/**
512
+	 * Saves the billing info onto the attendee of the primary registrant on this transaction, and
513
+	 * cleans it first.
514
+	 *
515
+	 * @param EE_Billing_Attendee_Info_Form $billing_form
516
+	 * @param EE_Transaction                $transaction
517
+	 * @return boolean success
518
+	 */
519
+	protected function _save_billing_info_to_attendee($billing_form, $transaction)
520
+	{
521
+		if (! $transaction || ! $transaction instanceof EE_Transaction) {
522
+			EE_Error::add_error(
523
+				__("Cannot save billing info because no transaction was specified", "event_espresso"),
524
+				__FILE__,
525
+				__FUNCTION__,
526
+				__LINE__
527
+			);
528
+			return false;
529
+		}
530
+		$primary_reg = $transaction->primary_registration();
531
+		if (! $primary_reg) {
532
+			EE_Error::add_error(
533
+				__("Cannot save billing info because the transaction has no primary registration", "event_espresso"),
534
+				__FILE__,
535
+				__FUNCTION__,
536
+				__LINE__
537
+			);
538
+			return false;
539
+		}
540
+		$attendee = $primary_reg->attendee();
541
+		if (! $attendee) {
542
+			EE_Error::add_error(
543
+				__(
544
+					"Cannot save billing info because the transaction's primary registration has no attendee!",
545
+					"event_espresso"
546
+				),
547
+				__FILE__,
548
+				__FUNCTION__,
549
+				__LINE__
550
+			);
551
+			return false;
552
+		}
553
+		return $attendee->save_and_clean_billing_info_for_payment_method($billing_form, $transaction->payment_method());
554
+	}
555
+
556
+
557
+	/**
558
+	 * Gets the payment this IPN is for. Children may often want to
559
+	 * override this to inspect the request
560
+	 *
561
+	 * @param EE_Transaction $transaction
562
+	 * @param array          $req_data
563
+	 * @return EE_Payment
564
+	 */
565
+	protected function find_payment_for_ipn(EE_Transaction $transaction, $req_data = array())
566
+	{
567
+		return $transaction->last_payment();
568
+	}
569
+
570
+
571
+	/**
572
+	 * In case generic code cannot provide the payment processor with a specific payment method
573
+	 * and transaction, it will try calling this method on each activate payment method.
574
+	 * If the payment method is able to identify the request as being for it, it should fetch
575
+	 * the payment its for and return it. If not, it should throw an EE_Error to indicate it cannot
576
+	 * handle the IPN
577
+	 *
578
+	 * @param array $req_data
579
+	 * @return EE_Payment only if this payment method can find the info its needs from $req_data
580
+	 * and identifies the IPN as being for this payment method (not just fo ra payment method of this type)
581
+	 * @throws EE_Error
582
+	 */
583
+	public function handle_unclaimed_ipn($req_data = array())
584
+	{
585
+		throw new EE_Error(
586
+			sprintf(__("Payment Method '%s' cannot handle unclaimed IPNs", "event_espresso"), get_class($this))
587
+		);
588
+	}
589
+
590
+
591
+	/**
592
+	 * Logic to be accomplished when the payment attempt is complete.
593
+	 * Most payment methods don't need to do anything at this point; but some, like Mijireh, do.
594
+	 * (Mijireh is an offsite gateway which doesn't send an IPN. So when the user returns to EE from
595
+	 * mijireh, this method needs to be called so the Mijireh PM can ping Mijireh to know the status
596
+	 * of the payment). Fed a transaction because it's always assumed to be the last payment that
597
+	 * we're dealing with. Returns that last payment (if there is one)
598
+	 *
599
+	 * @param EE_Transaction $transaction
600
+	 * @return EE_Payment
601
+	 */
602
+	public function finalize_payment_for($transaction)
603
+	{
604
+		return $transaction->last_payment();
605
+	}
606
+
607
+
608
+	/**
609
+	 * Whether or not this payment method's gateway supports sending refund requests
610
+	 *
611
+	 * @return boolean
612
+	 */
613
+	public function supports_sending_refunds()
614
+	{
615
+		if ($this->_gateway && $this->_gateway instanceof EE_Gateway) {
616
+			return $this->_gateway->supports_sending_refunds();
617
+		} else {
618
+			return false;
619
+		}
620
+	}
621
+
622
+
623
+	/**
624
+	 *
625
+	 * @param EE_Payment $payment
626
+	 * @param array      $refund_info
627
+	 * @throws EE_Error
628
+	 * @return EE_Payment
629
+	 */
630
+	public function process_refund(EE_Payment $payment, $refund_info = array())
631
+	{
632
+		if ($this->_gateway && $this->_gateway instanceof EE_Gateway) {
633
+			return $this->_gateway->do_direct_refund($payment, $refund_info);
634
+		} else {
635
+			throw new EE_Error(
636
+				sprintf(
637
+					__('Payment Method Type "%s" does not support sending refund requests', 'event_espresso'),
638
+					get_class($this)
639
+				)
640
+			);
641
+		}
642
+	}
643
+
644
+
645
+	/**
646
+	 * Returns one the class's constants onsite,offsite, or offline, depending on this
647
+	 * payment method's gateway.
648
+	 *
649
+	 * @return string
650
+	 * @throws EE_Error
651
+	 */
652
+	public function payment_occurs()
653
+	{
654
+		if (! $this->_gateway) {
655
+			return EE_PMT_Base::offline;
656
+		} elseif ($this->_gateway instanceof EE_Onsite_Gateway) {
657
+			return EE_PMT_Base::onsite;
658
+		} elseif ($this->_gateway instanceof EE_Offsite_Gateway) {
659
+			return EE_PMT_Base::offsite;
660
+		} else {
661
+			throw new EE_Error(
662
+				sprintf(
663
+					__(
664
+						"Payment method type '%s's gateway isn't an instance of EE_Onsite_Gateway, EE_Offsite_Gateway, or null. It must be one of those",
665
+						"event_espresso"
666
+					),
667
+					get_class($this)
668
+				)
669
+			);
670
+		}
671
+	}
672
+
673
+
674
+	/**
675
+	 * For adding any html output ab ove the payment overview.
676
+	 * Many gateways won't want ot display anything, so this function just returns an empty string.
677
+	 * Other gateways may want to override this, such as offline gateways.
678
+	 *
679
+	 * @param EE_Payment $payment
680
+	 * @return string
681
+	 */
682
+	public function payment_overview_content(EE_Payment $payment)
683
+	{
684
+		return EEH_Template::display_template(
685
+			EE_LIBRARIES . 'payment_methods' . DS . 'templates' . DS . 'payment_details_content.template.php',
686
+			array('payment_method' => $this->_pm_instance, 'payment' => $payment),
687
+			true
688
+		);
689
+	}
690
+
691
+
692
+	/**
693
+	 * @return array where keys are the help tab name,
694
+	 * values are: array {
695
+	 * @type string $title         i18n name for the help tab
696
+	 * @type string $filename      name of the file located in ./help_tabs/ (ie, in a folder next to this file)
697
+	 * @type array  $template_args any arguments you want passed to the template file while rendering.
698
+	 *                Keys will be variable names and values with be their values.
699
+	 */
700
+	public function help_tabs_config()
701
+	{
702
+		return array();
703
+	}
704
+
705
+
706
+	/**
707
+	 * The system name for this PMT (eg AIM, Paypal_Pro, Invoice... what gets put into
708
+	 * the payment method's table's PMT_type column)
709
+	 *
710
+	 * @return string
711
+	 */
712
+	public function system_name()
713
+	{
714
+		$classname = get_class($this);
715
+		return str_replace("EE_PMT_", '', $classname);
716
+	}
717
+
718
+
719
+	/**
720
+	 * A pretty i18n version of the PMT name. Often the same as the "pretty_name", but you can change it by overriding
721
+	 * this method.
722
+	 * @return string
723
+	 */
724
+	public function defaultFrontendName()
725
+	{
726
+		return $this->pretty_name();
727
+	}
728
+
729
+
730
+	/**
731
+	 * A pretty i18n version of the PMT name
732
+	 *
733
+	 * @return string
734
+	 */
735
+	public function pretty_name()
736
+	{
737
+		return $this->_pretty_name;
738
+	}
739
+
740
+
741
+	/**
742
+	 * Gets the default absolute URL to the payment method type's button
743
+	 *
744
+	 * @return string
745
+	 */
746
+	public function default_button_url()
747
+	{
748
+		return $this->_default_button_url;
749
+	}
750
+
751
+
752
+	/**
753
+	 * Gets the gateway used by this payment method (if any)
754
+	 *
755
+	 * @return EE_Gateway
756
+	 */
757
+	public function get_gateway()
758
+	{
759
+		return $this->_gateway;
760
+	}
761
+
762
+
763
+	/**
764
+	 * @return string html for the link to a help tab
765
+	 */
766
+	public function get_help_tab_link()
767
+	{
768
+		return EEH_Template::get_help_tab_link(
769
+			$this->get_help_tab_name(),
770
+			'espresso_payment_settings',
771
+			'default'
772
+		);
773
+	}
774
+
775
+
776
+	/**
777
+	 * Returns the name of the help tab for this PMT
778
+	 *
779
+	 * @return string
780
+	 */
781
+	public function get_help_tab_name()
782
+	{
783
+		return 'ee_' . strtolower($this->system_name()) . '_help_tab';
784
+	}
785
+
786
+	/**
787
+	 * The name of the wp capability that should be associated with the usage of
788
+	 * this PMT by an admin
789
+	 *
790
+	 * @return string
791
+	 */
792
+	public function cap_name()
793
+	{
794
+		return 'ee_payment_method_' . strtolower($this->system_name());
795
+	}
796
+
797
+	/**
798
+	 * Called by client code to tell the gateway that if it wants to change
799
+	 * the transaction or line items or registrations related to teh payment it already
800
+	 * processed (we think, but possibly not) that now's the time to do it.
801
+	 * It is expected that gateways will store any info they need for this on the PAY_details,
802
+	 * or maybe an extra meta value
803
+	 *
804
+	 * @param EE_Payment $payment
805
+	 * @return void
806
+	 */
807
+	public function update_txn_based_on_payment($payment)
808
+	{
809
+		if ($this->_gateway instanceof EE_Gateway) {
810
+			$this->_gateway->update_txn_based_on_payment($payment);
811
+		}
812
+	}
813
+
814
+	/**
815
+	 * Returns a string of HTML describing this payment method type for an admin,
816
+	 * primarily intended for them to read before activating it.
817
+	 * The easiest way to set this is to create a folder 'templates' alongside
818
+	 * your EE_PMT_{System_Name} file, and in it create a file named "{system_name}_intro.template.php".
819
+	 * Eg, if your payment method file is named "EE_PMT_Foo_Bar.pm.php",
820
+	 * then you'd create a file named "templates" in the same folder as it, and name the file
821
+	 * "foo_bar_intro.template.php", and its content will be returned by this method
822
+	 *
823
+	 * @return string
824
+	 */
825
+	public function introductory_html()
826
+	{
827
+		return EEH_Template::locate_template(
828
+			$this->file_folder() . 'templates' . DS . strtolower($this->system_name()) . '_intro.template.php',
829
+			array('pmt_obj' => $this, 'pm_instance' => $this->_pm_instance)
830
+		);
831
+	}
832 832
 }
Please login to merge, or discard this patch.
core/libraries/payment_methods/EE_Payment_Method_Manager.lib.php 2 patches
Indentation   +555 added lines, -555 removed lines patch added patch discarded remove patch
@@ -17,559 +17,559 @@
 block discarded – undo
17 17
 class EE_Payment_Method_Manager implements ResettableInterface
18 18
 {
19 19
 
20
-    /**
21
-     * prefix added to all payment method capabilities names
22
-     */
23
-    const   CAPABILITIES_PREFIX = 'ee_payment_method_';
24
-
25
-    /**
26
-     * @var EE_Payment_Method_Manager $_instance
27
-     */
28
-    private static $_instance;
29
-
30
-    /**
31
-     * @var boolean
32
-     */
33
-    protected $payment_method_caps_initialized = false;
34
-
35
-    /**
36
-     * @var array keys are class names without 'EE_PMT_', values are their filepaths
37
-     */
38
-    protected $_payment_method_types = array();
39
-
40
-    /**
41
-     * @var EE_PMT_Base[]
42
-     */
43
-    protected $payment_method_objects = array();
44
-
45
-
46
-    /**
47
-     * EE_Payment_Method_Manager constructor.
48
-     *
49
-     * @throws EE_Error
50
-     * @throws DomainException
51
-     */
52
-    public function __construct()
53
-    {
54
-        // if in admin lets ensure caps are set.
55
-        if (is_admin()) {
56
-            $this->_register_payment_methods();
57
-            // set them immediately
58
-            $this->initializePaymentMethodCaps();
59
-            // plus any time they get reset
60
-            add_filter(
61
-                'FHEE__EE_Capabilities__addCaps__capabilities_to_add',
62
-                array($this, 'addPaymentMethodCapsDuringReset')
63
-            );
64
-        }
65
-    }
66
-
67
-
68
-    /**
69
-     * @singleton method used to instantiate class object
70
-     * @return EE_Payment_Method_Manager instance
71
-     * @throws DomainException
72
-     * @throws EE_Error
73
-     */
74
-    public static function instance()
75
-    {
76
-        // check if class object is instantiated, and instantiated properly
77
-        if (! self::$_instance instanceof EE_Payment_Method_Manager) {
78
-            EE_Registry::instance()->load_lib('PMT_Base');
79
-            self::$_instance = new self();
80
-        }
81
-        return self::$_instance;
82
-    }
83
-
84
-
85
-    /**
86
-     * Resets the instance and returns a new one
87
-     *
88
-     * @return EE_Payment_Method_Manager
89
-     * @throws DomainException
90
-     * @throws EE_Error
91
-     */
92
-    public static function reset()
93
-    {
94
-        self::$_instance = null;
95
-        return self::instance();
96
-    }
97
-
98
-
99
-    /**
100
-     * If necessary, re-register payment methods
101
-     *
102
-     * @param boolean $force_recheck whether to recheck for payment method types,
103
-     *                               or just re-use the PMTs we found last time we checked during this request (if
104
-     *                               we have not yet checked during this request, then we need to check anyways)
105
-     */
106
-    public function maybe_register_payment_methods($force_recheck = false)
107
-    {
108
-        if (! $this->_payment_method_types || $force_recheck) {
109
-            $this->_register_payment_methods();
110
-        }
111
-    }
112
-
113
-
114
-    /**
115
-     * register_payment_methods
116
-     *
117
-     * @return array
118
-     */
119
-    protected function _register_payment_methods()
120
-    {
121
-        // grab list of installed modules
122
-        $pm_to_register = glob(EE_PAYMENT_METHODS . '*', GLOB_ONLYDIR);
123
-        // filter list of modules to register
124
-        $pm_to_register = apply_filters(
125
-            'FHEE__EE_Payment_Method_Manager__register_payment_methods__payment_methods_to_register',
126
-            $pm_to_register
127
-        );
128
-        // remove any duplicates if that should happen for some reason
129
-        $pm_to_register = array_unique($pm_to_register);
130
-        // loop through folders
131
-        foreach ($pm_to_register as $pm_path) {
132
-            $this->register_payment_method($pm_path);
133
-        }
134
-        do_action('FHEE__EE_Payment_Method_Manager__register_payment_methods__registered_payment_methods');
135
-        // filter list of installed modules
136
-        // keep them organized alphabetically by the payment method type's name
137
-        ksort($this->_payment_method_types);
138
-        return apply_filters(
139
-            'FHEE__EE_Payment_Method_Manager__register_payment_methods__installed_payment_methods',
140
-            $this->_payment_method_types
141
-        );
142
-    }
143
-
144
-
145
-    /**
146
-     * register_payment_method- makes core aware of this payment method
147
-     *
148
-     * @param string $payment_method_path - full path up to and including payment method folder
149
-     * @return boolean
150
-     */
151
-    public function register_payment_method($payment_method_path = '')
152
-    {
153
-        do_action('AHEE__EE_Payment_Method_Manager__register_payment_method__begin', $payment_method_path);
154
-        $module_ext = '.pm.php';
155
-        // make all separators match
156
-        $payment_method_path = rtrim(str_replace('/\\', DS, $payment_method_path), DS);
157
-        // grab and sanitize module name
158
-        $module_dir = basename($payment_method_path);
159
-        // create class name from module directory name
160
-        $module = str_replace(array('_', ' '), array(' ', '_'), $module_dir);
161
-        // add class prefix
162
-        $module_class = 'EE_PMT_' . $module;
163
-        // does the module exist ?
164
-        if (! is_readable($payment_method_path . DS . $module_class . $module_ext)) {
165
-            $msg = sprintf(
166
-                esc_html__(
167
-                    'The requested %s payment method file could not be found or is not readable due to file permissions.',
168
-                    'event_espresso'
169
-                ),
170
-                $module
171
-            );
172
-            EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
173
-            return false;
174
-        }
175
-        // load the module class file
176
-        require_once($payment_method_path . DS . $module_class . $module_ext);
177
-        // verify that class exists
178
-        if (! class_exists($module_class)) {
179
-            $msg = sprintf(
180
-                esc_html__('The requested %s module class does not exist.', 'event_espresso'),
181
-                $module_class
182
-            );
183
-            EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
184
-            return false;
185
-        }
186
-        // add to array of registered modules
187
-        $this->_payment_method_types[ $module ] = $payment_method_path . DS . $module_class . $module_ext;
188
-        ksort($this->_payment_method_types);
189
-        return true;
190
-    }
191
-
192
-
193
-    /**
194
-     * Checks if a payment method has been registered, and if so includes it
195
-     *
196
-     * @param string  $payment_method_name like 'PayPal_Pro', (ie class name without the prefix 'EEPM_')
197
-     * @param boolean $force_recheck       whether to force re-checking for new payment method types
198
-     * @return boolean
199
-     */
200
-    public function payment_method_type_exists($payment_method_name, $force_recheck = false)
201
-    {
202
-        if ($force_recheck
203
-            || ! is_array($this->_payment_method_types)
204
-            || ! isset($this->_payment_method_types[ $payment_method_name ])
205
-        ) {
206
-            $this->maybe_register_payment_methods($force_recheck);
207
-        }
208
-        if (isset($this->_payment_method_types[ $payment_method_name ])) {
209
-            require_once($this->_payment_method_types[ $payment_method_name ]);
210
-            return true;
211
-        }
212
-        return false;
213
-    }
214
-
215
-
216
-    /**
217
-     * Returns all the class names of the various payment method types
218
-     *
219
-     * @param boolean $with_prefixes TRUE: get payment method type class names; false just their 'names'
220
-     *                               (what you'd find in wp_esp_payment_method.PMD_type)
221
-     * @param boolean $force_recheck whether to force re-checking for new payment method types
222
-     * @return array
223
-     */
224
-    public function payment_method_type_names($with_prefixes = false, $force_recheck = false)
225
-    {
226
-        $this->maybe_register_payment_methods($force_recheck);
227
-        if ($with_prefixes) {
228
-            $classnames = array_keys($this->_payment_method_types);
229
-            $payment_methods = array();
230
-            foreach ($classnames as $classname) {
231
-                $payment_methods[] = $this->payment_method_class_from_type($classname);
232
-            }
233
-            return $payment_methods;
234
-        }
235
-        return array_keys($this->_payment_method_types);
236
-    }
237
-
238
-
239
-    /**
240
-     * Gets an object of each payment method type, none of which are bound to a
241
-     * payment method instance
242
-     *
243
-     * @param boolean $force_recheck whether to force re-checking for new payment method types
244
-     * @return EE_PMT_Base[]
245
-     */
246
-    public function payment_method_types($force_recheck = false)
247
-    {
248
-        if ($force_recheck || empty($this->payment_method_objects)) {
249
-            $this->maybe_register_payment_methods($force_recheck);
250
-            foreach ($this->payment_method_type_names(true) as $classname) {
251
-                if (! isset($this->payment_method_objects[ $classname ])) {
252
-                    $this->payment_method_objects[ $classname ] = new $classname;
253
-                }
254
-            }
255
-        }
256
-        return $this->payment_method_objects;
257
-    }
258
-
259
-
260
-    /**
261
-     * Changes the payment method's class name into the payment method type's name
262
-     * (as used on the payment method's table's PMD_type field)
263
-     *
264
-     * @param string $classname
265
-     * @return string
266
-     */
267
-    public function payment_method_type_sans_class_prefix($classname)
268
-    {
269
-        return str_replace('EE_PMT_', '', $classname);
270
-    }
271
-
272
-
273
-    /**
274
-     * Does the opposite of payment-method_type_sans_prefix
275
-     *
276
-     * @param string $type
277
-     * @return string
278
-     */
279
-    public function payment_method_class_from_type($type)
280
-    {
281
-        return 'EE_PMT_' . $type;
282
-    }
283
-
284
-
285
-    /**
286
-     * Activates a payment method of the given type.
287
-     *
288
-     * @param string $payment_method_type the PMT_type; for EE_PMT_Invoice this would be 'Invoice'
289
-     * @return EE_Payment_Method
290
-     * @throws InvalidDataTypeException
291
-     * @throws EE_Error
292
-     */
293
-    public function activate_a_payment_method_of_type($payment_method_type)
294
-    {
295
-        $this->maybe_register_payment_methods();
296
-        $payment_method = EEM_Payment_Method::instance()->get_one_of_type($payment_method_type);
297
-        if (! $payment_method instanceof EE_Payment_Method) {
298
-            $pm_type_class = $this->payment_method_class_from_type($payment_method_type);
299
-            if (class_exists($pm_type_class)) {
300
-                /** @var $pm_type_obj EE_PMT_Base */
301
-                $pm_type_obj = new $pm_type_class;
302
-                $payment_method = EEM_Payment_Method::instance()->get_one_by_slug($pm_type_obj->system_name());
303
-                if (! $payment_method) {
304
-                    $payment_method = $this->create_payment_method_of_type($pm_type_obj);
305
-                }
306
-                $payment_method->set_type($payment_method_type);
307
-                $this->initialize_payment_method($payment_method);
308
-            } else {
309
-                throw new EE_Error(
310
-                    sprintf(
311
-                        esc_html__(
312
-                            'There is no payment method of type %1$s, so it could not be activated',
313
-                            'event_espresso'
314
-                        ),
315
-                        $pm_type_class
316
-                    )
317
-                );
318
-            }
319
-        }
320
-        $payment_method->set_active();
321
-        $payment_method->save();
322
-        /** @type EE_Message_Resource_Manager $message_resource_manager */
323
-        // if this was the invoice message type, make sure users can view their invoices
324
-        if ($payment_method->type() === 'Invoice'
325
-            && (
326
-            ! EEH_MSG_Template::is_mt_active('invoice')
327
-            )
328
-        ) {
329
-            $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
330
-            /** @type EE_Message_Resource_Manager $message_resource_manager */
331
-            $message_resource_manager->ensure_message_type_is_active('invoice', 'html');
332
-            new PersistentAdminNotice(
333
-                'invoice_pm_requirements_notice',
334
-                sprintf(
335
-                    esc_html__(
336
-                        'The Invoice payment method has been activated. It requires the %1$sinvoice message%2$s type to be active, so it was automatically activated for you.',
337
-                        'event_espresso'
338
-                    ),
339
-                    '<a href="' . admin_url('admin.php?page=espresso_messages&action=settings') . '">',
340
-                    '</a>'
341
-                ),
342
-                true
343
-            );
344
-        }
345
-        return $payment_method;
346
-    }
347
-
348
-
349
-    /**
350
-     * Creates a payment method of the specified type. Does not save it.
351
-     *
352
-     * @global WP_User    $current_user
353
-     * @param EE_PMT_Base $pm_type_obj
354
-     * @return EE_Payment_Method
355
-     * @throws EE_Error
356
-     */
357
-    public function create_payment_method_of_type($pm_type_obj)
358
-    {
359
-        global $current_user;
360
-        $payment_method = EE_Payment_Method::new_instance(
361
-            array(
362
-                'PMD_type'       => $pm_type_obj->system_name(),
363
-                'PMD_name'       => $pm_type_obj->defaultFrontendName(),
364
-                'PMD_admin_name' => $pm_type_obj->pretty_name(),
365
-                'PMD_slug'       => $pm_type_obj->system_name(),// automatically converted to slug
366
-                'PMD_wp_user'    => $current_user->ID,
367
-                'PMD_order'      => EEM_Payment_Method::instance()->count(
368
-                    array(array('PMD_type' => array('!=', 'Admin_Only')))
369
-                ) * 10,
370
-            )
371
-        );
372
-        return $payment_method;
373
-    }
374
-
375
-
376
-    /**
377
-     * Sets the initial payment method properties (including extra meta)
378
-     *
379
-     * @param EE_Payment_Method $payment_method
380
-     * @return EE_Payment_Method
381
-     * @throws EE_Error
382
-     */
383
-    public function initialize_payment_method($payment_method)
384
-    {
385
-        $pm_type_obj = $payment_method->type_obj();
386
-        $payment_method->set_description($pm_type_obj->default_description());
387
-        if (! $payment_method->button_url()) {
388
-            $payment_method->set_button_url($pm_type_obj->default_button_url());
389
-        }
390
-        // now add setup its default extra meta properties
391
-        $extra_metas = $pm_type_obj->settings_form()->extra_meta_inputs();
392
-        if (! empty($extra_metas)) {
393
-            // verify the payment method has an ID before adding extra meta
394
-            if (! $payment_method->ID()) {
395
-                $payment_method->save();
396
-            }
397
-            foreach ($extra_metas as $meta_name => $input) {
398
-                $payment_method->update_extra_meta($meta_name, $input->raw_value());
399
-            }
400
-        }
401
-        return $payment_method;
402
-    }
403
-
404
-
405
-    /**
406
-     * Makes sure the payment method is related to the specified payment method
407
-     *
408
-     * @deprecated in 4.9.40 because the currency payment method table is being deprecated
409
-     * @param EE_Payment_Method $payment_method
410
-     * @return EE_Payment_Method
411
-     * @throws EE_Error
412
-     */
413
-    public function set_usable_currencies_on_payment_method($payment_method)
414
-    {
415
-        EE_Error::doing_it_wrong(
416
-            'EE_Payment_Method_Manager::set_usable_currencies_on_payment_method',
417
-            esc_html__(
418
-                'We no longer define what currencies are usable by payment methods. Its not used nor efficient.',
419
-                'event_espresso'
420
-            ),
421
-            '4.9.40'
422
-        );
423
-        return $payment_method;
424
-    }
425
-
426
-
427
-    /**
428
-     * Deactivates a payment method of the given payment method slug.
429
-     *
430
-     * @param string $payment_method_slug The slug for the payment method to deactivate.
431
-     * @return int count of rows updated.
432
-     * @throws EE_Error
433
-     */
434
-    public function deactivate_payment_method($payment_method_slug)
435
-    {
436
-        EE_Log::instance()->log(
437
-            __FILE__,
438
-            __FUNCTION__,
439
-            sprintf(
440
-                esc_html__(
441
-                    'Payment method with slug %1$s is being deactivated by site admin',
442
-                    'event_espresso'
443
-                ),
444
-                $payment_method_slug
445
-            ),
446
-            'payment_method_change'
447
-        );
448
-        $count_updated = EEM_Payment_Method::instance()->update(
449
-            array('PMD_scope' => array()),
450
-            array(array('PMD_slug' => $payment_method_slug))
451
-        );
452
-        do_action(
453
-            'AHEE__EE_Payment_Method_Manager__deactivate_payment_method__after_deactivating_payment_method',
454
-            $payment_method_slug,
455
-            $count_updated
456
-        );
457
-        return $count_updated;
458
-    }
459
-
460
-
461
-    /**
462
-     * initializes payment method access caps via EE_Capabilities::init_role_caps()
463
-     * upon EE_Payment_Method_Manager construction
464
-     *
465
-     * @throws EE_Error
466
-     * @throws DomainException
467
-     */
468
-    protected function initializePaymentMethodCaps()
469
-    {
470
-        // don't do this twice
471
-        if ($this->payment_method_caps_initialized) {
472
-            return;
473
-        }
474
-        EE_Capabilities::instance()->addCaps(
475
-            $this->getPaymentMethodCaps()
476
-        );
477
-        $this->payment_method_caps_initialized = true;
478
-    }
479
-
480
-
481
-    /**
482
-     * array  of dynamic payment method access caps.
483
-     * at the time of writing, october 20 2014, these are the caps added:
484
-     *  ee_payment_method_admin_only
485
-     *  ee_payment_method_aim
486
-     *  ee_payment_method_bank
487
-     *  ee_payment_method_check
488
-     *  ee_payment_method_invoice
489
-     *  ee_payment_method_mijireh
490
-     *  ee_payment_method_paypal_pro
491
-     *  ee_payment_method_paypal_standard
492
-     * Any other payment methods added to core or via addons will also get
493
-     * their related capability automatically added too, so long as they are
494
-     * registered properly using EE_Register_Payment_Method::register()
495
-     *
496
-     * @return array
497
-     * @throws DomainException
498
-     */
499
-    protected function getPaymentMethodCaps()
500
-    {
501
-        $caps = array();
502
-        foreach ($this->payment_method_type_names() as $payment_method_name) {
503
-            $caps = $this->addPaymentMethodCap($payment_method_name, $caps);
504
-        }
505
-        return $caps;
506
-    }
507
-
508
-
509
-    /**
510
-     * @param string $payment_method_name
511
-     * @param array  $payment_method_caps
512
-     * @param string $role
513
-     * @return array
514
-     * @throws DomainException
515
-     */
516
-    public function addPaymentMethodCap($payment_method_name, array $payment_method_caps, $role = 'administrator')
517
-    {
518
-        if (empty($payment_method_name)) {
519
-            throw new DomainException(
520
-                esc_html__(
521
-                    'The name of a payment method must be specified to add capabilities.',
522
-                    'event_espresso'
523
-                )
524
-            );
525
-        }
526
-        if (empty($role)) {
527
-            throw new DomainException(
528
-                sprintf(
529
-                    esc_html__(
530
-                        'No role was supplied while trying to add capabilities for the %1$s payment method.',
531
-                        'event_espresso'
532
-                    ),
533
-                    $payment_method_name
534
-                )
535
-            );
536
-        }
537
-        if (! isset($payment_method_caps[ $role ])) {
538
-            $payment_method_caps[ $role ] = array();
539
-        }
540
-        $payment_method_caps[ $role ][] = EE_Payment_Method_Manager::CAPABILITIES_PREFIX
541
-                                          . strtolower($payment_method_name);
542
-        return $payment_method_caps;
543
-    }
544
-
545
-
546
-    /**
547
-     * callback for FHEE__EE_Capabilities__init_role_caps__caps_map filter
548
-     * to add dynamic payment method access caps when capabilities are reset
549
-     * (or if that filter is called and PM caps are not already set)
550
-     *
551
-     * @param array $caps capabilities being filtered
552
-     * @param bool  $reset
553
-     * @return array
554
-     * @throws DomainException
555
-     */
556
-    public function addPaymentMethodCapsDuringReset(array $caps, $reset = false)
557
-    {
558
-        if ($reset || ! $this->payment_method_caps_initialized) {
559
-            $this->payment_method_caps_initialized = true;
560
-            $caps = array_merge_recursive($caps, $this->getPaymentMethodCaps());
561
-        }
562
-        return $caps;
563
-    }
564
-
565
-
566
-    /**
567
-     * @deprecated 4.9.42
568
-     * @param $caps
569
-     * @return mixed
570
-     */
571
-    public function add_payment_method_caps($caps)
572
-    {
573
-        return $caps;
574
-    }
20
+	/**
21
+	 * prefix added to all payment method capabilities names
22
+	 */
23
+	const   CAPABILITIES_PREFIX = 'ee_payment_method_';
24
+
25
+	/**
26
+	 * @var EE_Payment_Method_Manager $_instance
27
+	 */
28
+	private static $_instance;
29
+
30
+	/**
31
+	 * @var boolean
32
+	 */
33
+	protected $payment_method_caps_initialized = false;
34
+
35
+	/**
36
+	 * @var array keys are class names without 'EE_PMT_', values are their filepaths
37
+	 */
38
+	protected $_payment_method_types = array();
39
+
40
+	/**
41
+	 * @var EE_PMT_Base[]
42
+	 */
43
+	protected $payment_method_objects = array();
44
+
45
+
46
+	/**
47
+	 * EE_Payment_Method_Manager constructor.
48
+	 *
49
+	 * @throws EE_Error
50
+	 * @throws DomainException
51
+	 */
52
+	public function __construct()
53
+	{
54
+		// if in admin lets ensure caps are set.
55
+		if (is_admin()) {
56
+			$this->_register_payment_methods();
57
+			// set them immediately
58
+			$this->initializePaymentMethodCaps();
59
+			// plus any time they get reset
60
+			add_filter(
61
+				'FHEE__EE_Capabilities__addCaps__capabilities_to_add',
62
+				array($this, 'addPaymentMethodCapsDuringReset')
63
+			);
64
+		}
65
+	}
66
+
67
+
68
+	/**
69
+	 * @singleton method used to instantiate class object
70
+	 * @return EE_Payment_Method_Manager instance
71
+	 * @throws DomainException
72
+	 * @throws EE_Error
73
+	 */
74
+	public static function instance()
75
+	{
76
+		// check if class object is instantiated, and instantiated properly
77
+		if (! self::$_instance instanceof EE_Payment_Method_Manager) {
78
+			EE_Registry::instance()->load_lib('PMT_Base');
79
+			self::$_instance = new self();
80
+		}
81
+		return self::$_instance;
82
+	}
83
+
84
+
85
+	/**
86
+	 * Resets the instance and returns a new one
87
+	 *
88
+	 * @return EE_Payment_Method_Manager
89
+	 * @throws DomainException
90
+	 * @throws EE_Error
91
+	 */
92
+	public static function reset()
93
+	{
94
+		self::$_instance = null;
95
+		return self::instance();
96
+	}
97
+
98
+
99
+	/**
100
+	 * If necessary, re-register payment methods
101
+	 *
102
+	 * @param boolean $force_recheck whether to recheck for payment method types,
103
+	 *                               or just re-use the PMTs we found last time we checked during this request (if
104
+	 *                               we have not yet checked during this request, then we need to check anyways)
105
+	 */
106
+	public function maybe_register_payment_methods($force_recheck = false)
107
+	{
108
+		if (! $this->_payment_method_types || $force_recheck) {
109
+			$this->_register_payment_methods();
110
+		}
111
+	}
112
+
113
+
114
+	/**
115
+	 * register_payment_methods
116
+	 *
117
+	 * @return array
118
+	 */
119
+	protected function _register_payment_methods()
120
+	{
121
+		// grab list of installed modules
122
+		$pm_to_register = glob(EE_PAYMENT_METHODS . '*', GLOB_ONLYDIR);
123
+		// filter list of modules to register
124
+		$pm_to_register = apply_filters(
125
+			'FHEE__EE_Payment_Method_Manager__register_payment_methods__payment_methods_to_register',
126
+			$pm_to_register
127
+		);
128
+		// remove any duplicates if that should happen for some reason
129
+		$pm_to_register = array_unique($pm_to_register);
130
+		// loop through folders
131
+		foreach ($pm_to_register as $pm_path) {
132
+			$this->register_payment_method($pm_path);
133
+		}
134
+		do_action('FHEE__EE_Payment_Method_Manager__register_payment_methods__registered_payment_methods');
135
+		// filter list of installed modules
136
+		// keep them organized alphabetically by the payment method type's name
137
+		ksort($this->_payment_method_types);
138
+		return apply_filters(
139
+			'FHEE__EE_Payment_Method_Manager__register_payment_methods__installed_payment_methods',
140
+			$this->_payment_method_types
141
+		);
142
+	}
143
+
144
+
145
+	/**
146
+	 * register_payment_method- makes core aware of this payment method
147
+	 *
148
+	 * @param string $payment_method_path - full path up to and including payment method folder
149
+	 * @return boolean
150
+	 */
151
+	public function register_payment_method($payment_method_path = '')
152
+	{
153
+		do_action('AHEE__EE_Payment_Method_Manager__register_payment_method__begin', $payment_method_path);
154
+		$module_ext = '.pm.php';
155
+		// make all separators match
156
+		$payment_method_path = rtrim(str_replace('/\\', DS, $payment_method_path), DS);
157
+		// grab and sanitize module name
158
+		$module_dir = basename($payment_method_path);
159
+		// create class name from module directory name
160
+		$module = str_replace(array('_', ' '), array(' ', '_'), $module_dir);
161
+		// add class prefix
162
+		$module_class = 'EE_PMT_' . $module;
163
+		// does the module exist ?
164
+		if (! is_readable($payment_method_path . DS . $module_class . $module_ext)) {
165
+			$msg = sprintf(
166
+				esc_html__(
167
+					'The requested %s payment method file could not be found or is not readable due to file permissions.',
168
+					'event_espresso'
169
+				),
170
+				$module
171
+			);
172
+			EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
173
+			return false;
174
+		}
175
+		// load the module class file
176
+		require_once($payment_method_path . DS . $module_class . $module_ext);
177
+		// verify that class exists
178
+		if (! class_exists($module_class)) {
179
+			$msg = sprintf(
180
+				esc_html__('The requested %s module class does not exist.', 'event_espresso'),
181
+				$module_class
182
+			);
183
+			EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
184
+			return false;
185
+		}
186
+		// add to array of registered modules
187
+		$this->_payment_method_types[ $module ] = $payment_method_path . DS . $module_class . $module_ext;
188
+		ksort($this->_payment_method_types);
189
+		return true;
190
+	}
191
+
192
+
193
+	/**
194
+	 * Checks if a payment method has been registered, and if so includes it
195
+	 *
196
+	 * @param string  $payment_method_name like 'PayPal_Pro', (ie class name without the prefix 'EEPM_')
197
+	 * @param boolean $force_recheck       whether to force re-checking for new payment method types
198
+	 * @return boolean
199
+	 */
200
+	public function payment_method_type_exists($payment_method_name, $force_recheck = false)
201
+	{
202
+		if ($force_recheck
203
+			|| ! is_array($this->_payment_method_types)
204
+			|| ! isset($this->_payment_method_types[ $payment_method_name ])
205
+		) {
206
+			$this->maybe_register_payment_methods($force_recheck);
207
+		}
208
+		if (isset($this->_payment_method_types[ $payment_method_name ])) {
209
+			require_once($this->_payment_method_types[ $payment_method_name ]);
210
+			return true;
211
+		}
212
+		return false;
213
+	}
214
+
215
+
216
+	/**
217
+	 * Returns all the class names of the various payment method types
218
+	 *
219
+	 * @param boolean $with_prefixes TRUE: get payment method type class names; false just their 'names'
220
+	 *                               (what you'd find in wp_esp_payment_method.PMD_type)
221
+	 * @param boolean $force_recheck whether to force re-checking for new payment method types
222
+	 * @return array
223
+	 */
224
+	public function payment_method_type_names($with_prefixes = false, $force_recheck = false)
225
+	{
226
+		$this->maybe_register_payment_methods($force_recheck);
227
+		if ($with_prefixes) {
228
+			$classnames = array_keys($this->_payment_method_types);
229
+			$payment_methods = array();
230
+			foreach ($classnames as $classname) {
231
+				$payment_methods[] = $this->payment_method_class_from_type($classname);
232
+			}
233
+			return $payment_methods;
234
+		}
235
+		return array_keys($this->_payment_method_types);
236
+	}
237
+
238
+
239
+	/**
240
+	 * Gets an object of each payment method type, none of which are bound to a
241
+	 * payment method instance
242
+	 *
243
+	 * @param boolean $force_recheck whether to force re-checking for new payment method types
244
+	 * @return EE_PMT_Base[]
245
+	 */
246
+	public function payment_method_types($force_recheck = false)
247
+	{
248
+		if ($force_recheck || empty($this->payment_method_objects)) {
249
+			$this->maybe_register_payment_methods($force_recheck);
250
+			foreach ($this->payment_method_type_names(true) as $classname) {
251
+				if (! isset($this->payment_method_objects[ $classname ])) {
252
+					$this->payment_method_objects[ $classname ] = new $classname;
253
+				}
254
+			}
255
+		}
256
+		return $this->payment_method_objects;
257
+	}
258
+
259
+
260
+	/**
261
+	 * Changes the payment method's class name into the payment method type's name
262
+	 * (as used on the payment method's table's PMD_type field)
263
+	 *
264
+	 * @param string $classname
265
+	 * @return string
266
+	 */
267
+	public function payment_method_type_sans_class_prefix($classname)
268
+	{
269
+		return str_replace('EE_PMT_', '', $classname);
270
+	}
271
+
272
+
273
+	/**
274
+	 * Does the opposite of payment-method_type_sans_prefix
275
+	 *
276
+	 * @param string $type
277
+	 * @return string
278
+	 */
279
+	public function payment_method_class_from_type($type)
280
+	{
281
+		return 'EE_PMT_' . $type;
282
+	}
283
+
284
+
285
+	/**
286
+	 * Activates a payment method of the given type.
287
+	 *
288
+	 * @param string $payment_method_type the PMT_type; for EE_PMT_Invoice this would be 'Invoice'
289
+	 * @return EE_Payment_Method
290
+	 * @throws InvalidDataTypeException
291
+	 * @throws EE_Error
292
+	 */
293
+	public function activate_a_payment_method_of_type($payment_method_type)
294
+	{
295
+		$this->maybe_register_payment_methods();
296
+		$payment_method = EEM_Payment_Method::instance()->get_one_of_type($payment_method_type);
297
+		if (! $payment_method instanceof EE_Payment_Method) {
298
+			$pm_type_class = $this->payment_method_class_from_type($payment_method_type);
299
+			if (class_exists($pm_type_class)) {
300
+				/** @var $pm_type_obj EE_PMT_Base */
301
+				$pm_type_obj = new $pm_type_class;
302
+				$payment_method = EEM_Payment_Method::instance()->get_one_by_slug($pm_type_obj->system_name());
303
+				if (! $payment_method) {
304
+					$payment_method = $this->create_payment_method_of_type($pm_type_obj);
305
+				}
306
+				$payment_method->set_type($payment_method_type);
307
+				$this->initialize_payment_method($payment_method);
308
+			} else {
309
+				throw new EE_Error(
310
+					sprintf(
311
+						esc_html__(
312
+							'There is no payment method of type %1$s, so it could not be activated',
313
+							'event_espresso'
314
+						),
315
+						$pm_type_class
316
+					)
317
+				);
318
+			}
319
+		}
320
+		$payment_method->set_active();
321
+		$payment_method->save();
322
+		/** @type EE_Message_Resource_Manager $message_resource_manager */
323
+		// if this was the invoice message type, make sure users can view their invoices
324
+		if ($payment_method->type() === 'Invoice'
325
+			&& (
326
+			! EEH_MSG_Template::is_mt_active('invoice')
327
+			)
328
+		) {
329
+			$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
330
+			/** @type EE_Message_Resource_Manager $message_resource_manager */
331
+			$message_resource_manager->ensure_message_type_is_active('invoice', 'html');
332
+			new PersistentAdminNotice(
333
+				'invoice_pm_requirements_notice',
334
+				sprintf(
335
+					esc_html__(
336
+						'The Invoice payment method has been activated. It requires the %1$sinvoice message%2$s type to be active, so it was automatically activated for you.',
337
+						'event_espresso'
338
+					),
339
+					'<a href="' . admin_url('admin.php?page=espresso_messages&action=settings') . '">',
340
+					'</a>'
341
+				),
342
+				true
343
+			);
344
+		}
345
+		return $payment_method;
346
+	}
347
+
348
+
349
+	/**
350
+	 * Creates a payment method of the specified type. Does not save it.
351
+	 *
352
+	 * @global WP_User    $current_user
353
+	 * @param EE_PMT_Base $pm_type_obj
354
+	 * @return EE_Payment_Method
355
+	 * @throws EE_Error
356
+	 */
357
+	public function create_payment_method_of_type($pm_type_obj)
358
+	{
359
+		global $current_user;
360
+		$payment_method = EE_Payment_Method::new_instance(
361
+			array(
362
+				'PMD_type'       => $pm_type_obj->system_name(),
363
+				'PMD_name'       => $pm_type_obj->defaultFrontendName(),
364
+				'PMD_admin_name' => $pm_type_obj->pretty_name(),
365
+				'PMD_slug'       => $pm_type_obj->system_name(),// automatically converted to slug
366
+				'PMD_wp_user'    => $current_user->ID,
367
+				'PMD_order'      => EEM_Payment_Method::instance()->count(
368
+					array(array('PMD_type' => array('!=', 'Admin_Only')))
369
+				) * 10,
370
+			)
371
+		);
372
+		return $payment_method;
373
+	}
374
+
375
+
376
+	/**
377
+	 * Sets the initial payment method properties (including extra meta)
378
+	 *
379
+	 * @param EE_Payment_Method $payment_method
380
+	 * @return EE_Payment_Method
381
+	 * @throws EE_Error
382
+	 */
383
+	public function initialize_payment_method($payment_method)
384
+	{
385
+		$pm_type_obj = $payment_method->type_obj();
386
+		$payment_method->set_description($pm_type_obj->default_description());
387
+		if (! $payment_method->button_url()) {
388
+			$payment_method->set_button_url($pm_type_obj->default_button_url());
389
+		}
390
+		// now add setup its default extra meta properties
391
+		$extra_metas = $pm_type_obj->settings_form()->extra_meta_inputs();
392
+		if (! empty($extra_metas)) {
393
+			// verify the payment method has an ID before adding extra meta
394
+			if (! $payment_method->ID()) {
395
+				$payment_method->save();
396
+			}
397
+			foreach ($extra_metas as $meta_name => $input) {
398
+				$payment_method->update_extra_meta($meta_name, $input->raw_value());
399
+			}
400
+		}
401
+		return $payment_method;
402
+	}
403
+
404
+
405
+	/**
406
+	 * Makes sure the payment method is related to the specified payment method
407
+	 *
408
+	 * @deprecated in 4.9.40 because the currency payment method table is being deprecated
409
+	 * @param EE_Payment_Method $payment_method
410
+	 * @return EE_Payment_Method
411
+	 * @throws EE_Error
412
+	 */
413
+	public function set_usable_currencies_on_payment_method($payment_method)
414
+	{
415
+		EE_Error::doing_it_wrong(
416
+			'EE_Payment_Method_Manager::set_usable_currencies_on_payment_method',
417
+			esc_html__(
418
+				'We no longer define what currencies are usable by payment methods. Its not used nor efficient.',
419
+				'event_espresso'
420
+			),
421
+			'4.9.40'
422
+		);
423
+		return $payment_method;
424
+	}
425
+
426
+
427
+	/**
428
+	 * Deactivates a payment method of the given payment method slug.
429
+	 *
430
+	 * @param string $payment_method_slug The slug for the payment method to deactivate.
431
+	 * @return int count of rows updated.
432
+	 * @throws EE_Error
433
+	 */
434
+	public function deactivate_payment_method($payment_method_slug)
435
+	{
436
+		EE_Log::instance()->log(
437
+			__FILE__,
438
+			__FUNCTION__,
439
+			sprintf(
440
+				esc_html__(
441
+					'Payment method with slug %1$s is being deactivated by site admin',
442
+					'event_espresso'
443
+				),
444
+				$payment_method_slug
445
+			),
446
+			'payment_method_change'
447
+		);
448
+		$count_updated = EEM_Payment_Method::instance()->update(
449
+			array('PMD_scope' => array()),
450
+			array(array('PMD_slug' => $payment_method_slug))
451
+		);
452
+		do_action(
453
+			'AHEE__EE_Payment_Method_Manager__deactivate_payment_method__after_deactivating_payment_method',
454
+			$payment_method_slug,
455
+			$count_updated
456
+		);
457
+		return $count_updated;
458
+	}
459
+
460
+
461
+	/**
462
+	 * initializes payment method access caps via EE_Capabilities::init_role_caps()
463
+	 * upon EE_Payment_Method_Manager construction
464
+	 *
465
+	 * @throws EE_Error
466
+	 * @throws DomainException
467
+	 */
468
+	protected function initializePaymentMethodCaps()
469
+	{
470
+		// don't do this twice
471
+		if ($this->payment_method_caps_initialized) {
472
+			return;
473
+		}
474
+		EE_Capabilities::instance()->addCaps(
475
+			$this->getPaymentMethodCaps()
476
+		);
477
+		$this->payment_method_caps_initialized = true;
478
+	}
479
+
480
+
481
+	/**
482
+	 * array  of dynamic payment method access caps.
483
+	 * at the time of writing, october 20 2014, these are the caps added:
484
+	 *  ee_payment_method_admin_only
485
+	 *  ee_payment_method_aim
486
+	 *  ee_payment_method_bank
487
+	 *  ee_payment_method_check
488
+	 *  ee_payment_method_invoice
489
+	 *  ee_payment_method_mijireh
490
+	 *  ee_payment_method_paypal_pro
491
+	 *  ee_payment_method_paypal_standard
492
+	 * Any other payment methods added to core or via addons will also get
493
+	 * their related capability automatically added too, so long as they are
494
+	 * registered properly using EE_Register_Payment_Method::register()
495
+	 *
496
+	 * @return array
497
+	 * @throws DomainException
498
+	 */
499
+	protected function getPaymentMethodCaps()
500
+	{
501
+		$caps = array();
502
+		foreach ($this->payment_method_type_names() as $payment_method_name) {
503
+			$caps = $this->addPaymentMethodCap($payment_method_name, $caps);
504
+		}
505
+		return $caps;
506
+	}
507
+
508
+
509
+	/**
510
+	 * @param string $payment_method_name
511
+	 * @param array  $payment_method_caps
512
+	 * @param string $role
513
+	 * @return array
514
+	 * @throws DomainException
515
+	 */
516
+	public function addPaymentMethodCap($payment_method_name, array $payment_method_caps, $role = 'administrator')
517
+	{
518
+		if (empty($payment_method_name)) {
519
+			throw new DomainException(
520
+				esc_html__(
521
+					'The name of a payment method must be specified to add capabilities.',
522
+					'event_espresso'
523
+				)
524
+			);
525
+		}
526
+		if (empty($role)) {
527
+			throw new DomainException(
528
+				sprintf(
529
+					esc_html__(
530
+						'No role was supplied while trying to add capabilities for the %1$s payment method.',
531
+						'event_espresso'
532
+					),
533
+					$payment_method_name
534
+				)
535
+			);
536
+		}
537
+		if (! isset($payment_method_caps[ $role ])) {
538
+			$payment_method_caps[ $role ] = array();
539
+		}
540
+		$payment_method_caps[ $role ][] = EE_Payment_Method_Manager::CAPABILITIES_PREFIX
541
+										  . strtolower($payment_method_name);
542
+		return $payment_method_caps;
543
+	}
544
+
545
+
546
+	/**
547
+	 * callback for FHEE__EE_Capabilities__init_role_caps__caps_map filter
548
+	 * to add dynamic payment method access caps when capabilities are reset
549
+	 * (or if that filter is called and PM caps are not already set)
550
+	 *
551
+	 * @param array $caps capabilities being filtered
552
+	 * @param bool  $reset
553
+	 * @return array
554
+	 * @throws DomainException
555
+	 */
556
+	public function addPaymentMethodCapsDuringReset(array $caps, $reset = false)
557
+	{
558
+		if ($reset || ! $this->payment_method_caps_initialized) {
559
+			$this->payment_method_caps_initialized = true;
560
+			$caps = array_merge_recursive($caps, $this->getPaymentMethodCaps());
561
+		}
562
+		return $caps;
563
+	}
564
+
565
+
566
+	/**
567
+	 * @deprecated 4.9.42
568
+	 * @param $caps
569
+	 * @return mixed
570
+	 */
571
+	public function add_payment_method_caps($caps)
572
+	{
573
+		return $caps;
574
+	}
575 575
 }
Please login to merge, or discard this patch.
Spacing   +26 added lines, -26 removed lines patch added patch discarded remove patch
@@ -74,7 +74,7 @@  discard block
 block discarded – undo
74 74
     public static function instance()
75 75
     {
76 76
         // check if class object is instantiated, and instantiated properly
77
-        if (! self::$_instance instanceof EE_Payment_Method_Manager) {
77
+        if ( ! self::$_instance instanceof EE_Payment_Method_Manager) {
78 78
             EE_Registry::instance()->load_lib('PMT_Base');
79 79
             self::$_instance = new self();
80 80
         }
@@ -105,7 +105,7 @@  discard block
 block discarded – undo
105 105
      */
106 106
     public function maybe_register_payment_methods($force_recheck = false)
107 107
     {
108
-        if (! $this->_payment_method_types || $force_recheck) {
108
+        if ( ! $this->_payment_method_types || $force_recheck) {
109 109
             $this->_register_payment_methods();
110 110
         }
111 111
     }
@@ -119,7 +119,7 @@  discard block
 block discarded – undo
119 119
     protected function _register_payment_methods()
120 120
     {
121 121
         // grab list of installed modules
122
-        $pm_to_register = glob(EE_PAYMENT_METHODS . '*', GLOB_ONLYDIR);
122
+        $pm_to_register = glob(EE_PAYMENT_METHODS.'*', GLOB_ONLYDIR);
123 123
         // filter list of modules to register
124 124
         $pm_to_register = apply_filters(
125 125
             'FHEE__EE_Payment_Method_Manager__register_payment_methods__payment_methods_to_register',
@@ -159,9 +159,9 @@  discard block
 block discarded – undo
159 159
         // create class name from module directory name
160 160
         $module = str_replace(array('_', ' '), array(' ', '_'), $module_dir);
161 161
         // add class prefix
162
-        $module_class = 'EE_PMT_' . $module;
162
+        $module_class = 'EE_PMT_'.$module;
163 163
         // does the module exist ?
164
-        if (! is_readable($payment_method_path . DS . $module_class . $module_ext)) {
164
+        if ( ! is_readable($payment_method_path.DS.$module_class.$module_ext)) {
165 165
             $msg = sprintf(
166 166
                 esc_html__(
167 167
                     'The requested %s payment method file could not be found or is not readable due to file permissions.',
@@ -169,22 +169,22 @@  discard block
 block discarded – undo
169 169
                 ),
170 170
                 $module
171 171
             );
172
-            EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
172
+            EE_Error::add_error($msg.'||'.$msg, __FILE__, __FUNCTION__, __LINE__);
173 173
             return false;
174 174
         }
175 175
         // load the module class file
176
-        require_once($payment_method_path . DS . $module_class . $module_ext);
176
+        require_once($payment_method_path.DS.$module_class.$module_ext);
177 177
         // verify that class exists
178
-        if (! class_exists($module_class)) {
178
+        if ( ! class_exists($module_class)) {
179 179
             $msg = sprintf(
180 180
                 esc_html__('The requested %s module class does not exist.', 'event_espresso'),
181 181
                 $module_class
182 182
             );
183
-            EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
183
+            EE_Error::add_error($msg.'||'.$msg, __FILE__, __FUNCTION__, __LINE__);
184 184
             return false;
185 185
         }
186 186
         // add to array of registered modules
187
-        $this->_payment_method_types[ $module ] = $payment_method_path . DS . $module_class . $module_ext;
187
+        $this->_payment_method_types[$module] = $payment_method_path.DS.$module_class.$module_ext;
188 188
         ksort($this->_payment_method_types);
189 189
         return true;
190 190
     }
@@ -201,12 +201,12 @@  discard block
 block discarded – undo
201 201
     {
202 202
         if ($force_recheck
203 203
             || ! is_array($this->_payment_method_types)
204
-            || ! isset($this->_payment_method_types[ $payment_method_name ])
204
+            || ! isset($this->_payment_method_types[$payment_method_name])
205 205
         ) {
206 206
             $this->maybe_register_payment_methods($force_recheck);
207 207
         }
208
-        if (isset($this->_payment_method_types[ $payment_method_name ])) {
209
-            require_once($this->_payment_method_types[ $payment_method_name ]);
208
+        if (isset($this->_payment_method_types[$payment_method_name])) {
209
+            require_once($this->_payment_method_types[$payment_method_name]);
210 210
             return true;
211 211
         }
212 212
         return false;
@@ -248,8 +248,8 @@  discard block
 block discarded – undo
248 248
         if ($force_recheck || empty($this->payment_method_objects)) {
249 249
             $this->maybe_register_payment_methods($force_recheck);
250 250
             foreach ($this->payment_method_type_names(true) as $classname) {
251
-                if (! isset($this->payment_method_objects[ $classname ])) {
252
-                    $this->payment_method_objects[ $classname ] = new $classname;
251
+                if ( ! isset($this->payment_method_objects[$classname])) {
252
+                    $this->payment_method_objects[$classname] = new $classname;
253 253
                 }
254 254
             }
255 255
         }
@@ -278,7 +278,7 @@  discard block
 block discarded – undo
278 278
      */
279 279
     public function payment_method_class_from_type($type)
280 280
     {
281
-        return 'EE_PMT_' . $type;
281
+        return 'EE_PMT_'.$type;
282 282
     }
283 283
 
284 284
 
@@ -294,13 +294,13 @@  discard block
 block discarded – undo
294 294
     {
295 295
         $this->maybe_register_payment_methods();
296 296
         $payment_method = EEM_Payment_Method::instance()->get_one_of_type($payment_method_type);
297
-        if (! $payment_method instanceof EE_Payment_Method) {
297
+        if ( ! $payment_method instanceof EE_Payment_Method) {
298 298
             $pm_type_class = $this->payment_method_class_from_type($payment_method_type);
299 299
             if (class_exists($pm_type_class)) {
300 300
                 /** @var $pm_type_obj EE_PMT_Base */
301 301
                 $pm_type_obj = new $pm_type_class;
302 302
                 $payment_method = EEM_Payment_Method::instance()->get_one_by_slug($pm_type_obj->system_name());
303
-                if (! $payment_method) {
303
+                if ( ! $payment_method) {
304 304
                     $payment_method = $this->create_payment_method_of_type($pm_type_obj);
305 305
                 }
306 306
                 $payment_method->set_type($payment_method_type);
@@ -336,7 +336,7 @@  discard block
 block discarded – undo
336 336
                         'The Invoice payment method has been activated. It requires the %1$sinvoice message%2$s type to be active, so it was automatically activated for you.',
337 337
                         'event_espresso'
338 338
                     ),
339
-                    '<a href="' . admin_url('admin.php?page=espresso_messages&action=settings') . '">',
339
+                    '<a href="'.admin_url('admin.php?page=espresso_messages&action=settings').'">',
340 340
                     '</a>'
341 341
                 ),
342 342
                 true
@@ -362,7 +362,7 @@  discard block
 block discarded – undo
362 362
                 'PMD_type'       => $pm_type_obj->system_name(),
363 363
                 'PMD_name'       => $pm_type_obj->defaultFrontendName(),
364 364
                 'PMD_admin_name' => $pm_type_obj->pretty_name(),
365
-                'PMD_slug'       => $pm_type_obj->system_name(),// automatically converted to slug
365
+                'PMD_slug'       => $pm_type_obj->system_name(), // automatically converted to slug
366 366
                 'PMD_wp_user'    => $current_user->ID,
367 367
                 'PMD_order'      => EEM_Payment_Method::instance()->count(
368 368
                     array(array('PMD_type' => array('!=', 'Admin_Only')))
@@ -384,14 +384,14 @@  discard block
 block discarded – undo
384 384
     {
385 385
         $pm_type_obj = $payment_method->type_obj();
386 386
         $payment_method->set_description($pm_type_obj->default_description());
387
-        if (! $payment_method->button_url()) {
387
+        if ( ! $payment_method->button_url()) {
388 388
             $payment_method->set_button_url($pm_type_obj->default_button_url());
389 389
         }
390 390
         // now add setup its default extra meta properties
391 391
         $extra_metas = $pm_type_obj->settings_form()->extra_meta_inputs();
392
-        if (! empty($extra_metas)) {
392
+        if ( ! empty($extra_metas)) {
393 393
             // verify the payment method has an ID before adding extra meta
394
-            if (! $payment_method->ID()) {
394
+            if ( ! $payment_method->ID()) {
395 395
                 $payment_method->save();
396 396
             }
397 397
             foreach ($extra_metas as $meta_name => $input) {
@@ -534,10 +534,10 @@  discard block
 block discarded – undo
534 534
                 )
535 535
             );
536 536
         }
537
-        if (! isset($payment_method_caps[ $role ])) {
538
-            $payment_method_caps[ $role ] = array();
537
+        if ( ! isset($payment_method_caps[$role])) {
538
+            $payment_method_caps[$role] = array();
539 539
         }
540
-        $payment_method_caps[ $role ][] = EE_Payment_Method_Manager::CAPABILITIES_PREFIX
540
+        $payment_method_caps[$role][] = EE_Payment_Method_Manager::CAPABILITIES_PREFIX
541 541
                                           . strtolower($payment_method_name);
542 542
         return $payment_method_caps;
543 543
     }
Please login to merge, or discard this patch.
admin_pages/payments/Payment_Log_Admin_List_Table.class.php 1 patch
Indentation   +225 added lines, -225 removed lines patch added patch discarded remove patch
@@ -13,111 +13,111 @@  discard block
 block discarded – undo
13 13
 class Payment_Log_Admin_List_Table extends EE_Admin_List_Table
14 14
 {
15 15
 
16
-    /**
17
-     * @param \EE_Admin_Page $admin_page
18
-     * @return Payment_Log_Admin_List_Table
19
-     */
20
-    public function __construct($admin_page)
21
-    {
22
-        parent::__construct($admin_page);
23
-    }
24
-
25
-
26
-    /**
27
-     * _setup_data
28
-     *
29
-     * @return void
30
-     */
31
-    protected function _setup_data()
32
-    {
33
-        $this->_data = $this->_admin_page->get_payment_logs($this->_per_page, $this->_current_page);
34
-        // if (isset($this->_req_data['status']) && $this->_req_data['status'] == 'trash') {
35
-        //     $this->_data = $this->_admin_page->get_trashed_questions($this->_per_page, $this->_current_page, false);
36
-        // } else {
37
-        //     $this->_data = $this->_admin_page->get_questions($this->_per_page, $this->_current_page, false);
38
-        // }
39
-        $this->_all_data_count = $this->_admin_page->get_payment_logs($this->_per_page, $this->_current_page, true);
40
-        add_action(
41
-            'AHEE__EE_Admin_List_Table__extra_tablenav__after_bottom_buttons',
42
-            array($this, 'add_download_logs_checkbox')
43
-        );
44
-    }
45
-
46
-
47
-    /**
48
-     * add_download_logs_checkbox
49
-     * adds a checkbox to the bottom of the list table, instead of at the top with the rest of the filters
50
-     *
51
-     * @return void
52
-     */
53
-    public function add_download_logs_checkbox()
54
-    {
55
-        echo "<input type='submit' class='button-primary' id='download_results' name='download_results' value='"
56
-             . __(
57
-                 'Download Results',
58
-                 'event_espresso'
59
-             ) . "'>";
60
-    }
61
-
62
-
63
-    /**
64
-     * _set_properties
65
-     *
66
-     * @return void
67
-     */
68
-    protected function _set_properties()
69
-    {
70
-        $this->_wp_list_args = array(
71
-            'singular' => __('payment log', 'event_espresso'),
72
-            'plural'   => __('payment logs', 'event_espresso'),
73
-            'ajax'     => true, // for now,
74
-            'screen'   => $this->_admin_page->get_current_screen()->id,
75
-        );
76
-        $this->_columns = array(
77
-            'cb'       => '<input type="checkbox" />',
78
-            'id'       => __('ID', 'event_espresso'),
79
-            'LOG_time' => __('Time', 'event_espresso'),
80
-            'PMD_ID'   => __('Payment Method', 'event_espresso'),
81
-            'TXN_ID'   => __('Transaction ID', 'event_espresso'),
82
-        );
83
-        $this->_sortable_columns = array(
84
-            'LOG_time' => array('LOG_time' => true),
85
-        );
86
-        $this->_hidden_columns = array();
87
-    }
88
-
89
-
90
-    /**
91
-     * _get_table_filters
92
-     *
93
-     * @return array
94
-     */
95
-    protected function _get_table_filters()
96
-    {
97
-        $filters = array();
98
-        // todo we're currently using old functions here. We need to move things into the Events_Admin_Page() class as methods.
99
-        $payment_methods = EEM_Payment_Method::instance()->get_all();
100
-        $payment_method_names = array(
101
-            array('id' => 'all', 'text' => __("All", 'event_espresso')),
102
-            array('id' => '0', 'text' => __("Unknown Payment Method", 'event_espresso')),
103
-        );
104
-        foreach ($payment_methods as $payment_method) {
105
-            $payment_method_names[] = array('id' => $payment_method->ID(), 'text' => $payment_method->admin_name());
106
-        }
107
-        $filters[] = EEH_Form_Fields::select_input(
108
-            '_payment_method',
109
-            $payment_method_names,
110
-            isset($this->_req_data['_payment_method'])
111
-                ? $this->_req_data['_payment_method'] : 'all'
112
-        );
113
-        $start_date = isset($this->_req_data['payment-filter-start-date']) ? wp_strip_all_tags(
114
-            $this->_req_data['payment-filter-start-date']
115
-        ) : date('m/d/Y', strtotime('-6 months'));
116
-        $end_date = isset($this->_req_data['payment-filter-end-date']) ? wp_strip_all_tags(
117
-            $this->_req_data['payment-filter-end-date']
118
-        ) : date('m/d/Y');
119
-        ob_start();
120
-        ?>
16
+	/**
17
+	 * @param \EE_Admin_Page $admin_page
18
+	 * @return Payment_Log_Admin_List_Table
19
+	 */
20
+	public function __construct($admin_page)
21
+	{
22
+		parent::__construct($admin_page);
23
+	}
24
+
25
+
26
+	/**
27
+	 * _setup_data
28
+	 *
29
+	 * @return void
30
+	 */
31
+	protected function _setup_data()
32
+	{
33
+		$this->_data = $this->_admin_page->get_payment_logs($this->_per_page, $this->_current_page);
34
+		// if (isset($this->_req_data['status']) && $this->_req_data['status'] == 'trash') {
35
+		//     $this->_data = $this->_admin_page->get_trashed_questions($this->_per_page, $this->_current_page, false);
36
+		// } else {
37
+		//     $this->_data = $this->_admin_page->get_questions($this->_per_page, $this->_current_page, false);
38
+		// }
39
+		$this->_all_data_count = $this->_admin_page->get_payment_logs($this->_per_page, $this->_current_page, true);
40
+		add_action(
41
+			'AHEE__EE_Admin_List_Table__extra_tablenav__after_bottom_buttons',
42
+			array($this, 'add_download_logs_checkbox')
43
+		);
44
+	}
45
+
46
+
47
+	/**
48
+	 * add_download_logs_checkbox
49
+	 * adds a checkbox to the bottom of the list table, instead of at the top with the rest of the filters
50
+	 *
51
+	 * @return void
52
+	 */
53
+	public function add_download_logs_checkbox()
54
+	{
55
+		echo "<input type='submit' class='button-primary' id='download_results' name='download_results' value='"
56
+			 . __(
57
+				 'Download Results',
58
+				 'event_espresso'
59
+			 ) . "'>";
60
+	}
61
+
62
+
63
+	/**
64
+	 * _set_properties
65
+	 *
66
+	 * @return void
67
+	 */
68
+	protected function _set_properties()
69
+	{
70
+		$this->_wp_list_args = array(
71
+			'singular' => __('payment log', 'event_espresso'),
72
+			'plural'   => __('payment logs', 'event_espresso'),
73
+			'ajax'     => true, // for now,
74
+			'screen'   => $this->_admin_page->get_current_screen()->id,
75
+		);
76
+		$this->_columns = array(
77
+			'cb'       => '<input type="checkbox" />',
78
+			'id'       => __('ID', 'event_espresso'),
79
+			'LOG_time' => __('Time', 'event_espresso'),
80
+			'PMD_ID'   => __('Payment Method', 'event_espresso'),
81
+			'TXN_ID'   => __('Transaction ID', 'event_espresso'),
82
+		);
83
+		$this->_sortable_columns = array(
84
+			'LOG_time' => array('LOG_time' => true),
85
+		);
86
+		$this->_hidden_columns = array();
87
+	}
88
+
89
+
90
+	/**
91
+	 * _get_table_filters
92
+	 *
93
+	 * @return array
94
+	 */
95
+	protected function _get_table_filters()
96
+	{
97
+		$filters = array();
98
+		// todo we're currently using old functions here. We need to move things into the Events_Admin_Page() class as methods.
99
+		$payment_methods = EEM_Payment_Method::instance()->get_all();
100
+		$payment_method_names = array(
101
+			array('id' => 'all', 'text' => __("All", 'event_espresso')),
102
+			array('id' => '0', 'text' => __("Unknown Payment Method", 'event_espresso')),
103
+		);
104
+		foreach ($payment_methods as $payment_method) {
105
+			$payment_method_names[] = array('id' => $payment_method->ID(), 'text' => $payment_method->admin_name());
106
+		}
107
+		$filters[] = EEH_Form_Fields::select_input(
108
+			'_payment_method',
109
+			$payment_method_names,
110
+			isset($this->_req_data['_payment_method'])
111
+				? $this->_req_data['_payment_method'] : 'all'
112
+		);
113
+		$start_date = isset($this->_req_data['payment-filter-start-date']) ? wp_strip_all_tags(
114
+			$this->_req_data['payment-filter-start-date']
115
+		) : date('m/d/Y', strtotime('-6 months'));
116
+		$end_date = isset($this->_req_data['payment-filter-end-date']) ? wp_strip_all_tags(
117
+			$this->_req_data['payment-filter-end-date']
118
+		) : date('m/d/Y');
119
+		ob_start();
120
+		?>
121 121
         <label for="txn-filter-start-date"><?php _e('Display Transactions from ', 'event_espresso'); ?></label>
122 122
         <input id="payment-filter-start-date" class="datepicker" type="text" value="<?php echo $start_date; ?>"
123 123
                name="payment-filter-start-date" size="15"/>
@@ -125,124 +125,124 @@  discard block
 block discarded – undo
125 125
         <input id="payment-filter-end-date" class="datepicker" type="text" value="<?php echo $end_date; ?>"
126 126
                name="payment-filter-end-date" size="15"/>
127 127
         <?php
128
-        $filters[] = ob_get_clean();
129
-        return $filters;
130
-    }
131
-
132
-
133
-    /**
134
-     * _add_view_counts
135
-     *
136
-     * @return void
137
-     */
138
-    protected function _add_view_counts()
139
-    {
140
-        $this->_views['all']['count'] = $this->_admin_page->get_payment_logs(
141
-            $this->_per_page,
142
-            $this->_current_page,
143
-            true
144
-        );
145
-    }
146
-
147
-
148
-    /**
149
-     * column_cb
150
-     *
151
-     * @param \EE_Change_Log $item
152
-     * @return string
153
-     */
154
-    public function column_cb($item)
155
-    {
156
-        return sprintf('<input type="checkbox" class="option_id" name="checkbox[%1$d]" value="%1$d" />', $item->ID());
157
-    }
158
-
159
-
160
-    /**
161
-     * column_id
162
-     *
163
-     * @param \EE_Change_Log $item
164
-     * @return string
165
-     */
166
-    public function column_id(EE_Change_Log $item)
167
-    {
168
-        $details_query_args = array(
169
-            'action' => 'payment_log_details',
170
-            'ID'     => $item->ID(),
171
-        );
172
-        $url = EE_Admin_Page::add_query_args_and_nonce($details_query_args, EE_PAYMENTS_ADMIN_URL);
173
-        return "<a href='$url'>{$item->ID()}</a>";
174
-    }
175
-
176
-
177
-    /**
178
-     * column_LOG_time
179
-     *
180
-     * @param \EE_Change_Log $item
181
-     * @return string
182
-     */
183
-    public function column_LOG_time(EE_Change_Log $item)
184
-    {
185
-        return $item->get_datetime('LOG_time');
186
-    }
187
-
188
-
189
-    /**
190
-     * column_PMD_ID
191
-     *
192
-     * @param \EE_Change_Log $item
193
-     * @return string
194
-     */
195
-    public function column_PMD_ID(EE_Change_Log $item)
196
-    {
197
-        if ($item->object() instanceof EE_Payment_Method) {
198
-            return $item->object()->admin_name();
199
-        } elseif ($item->object() instanceof EE_Payment && $item->object()->payment_method()) {
200
-            return $item->object()->payment_method()->admin_name();
201
-        } elseif ($item->object() instanceof EE_Transaction) {
202
-            return esc_html__('Unknown', 'event_espresso');
203
-        } else {
204
-            return esc_html__("No longer exists", 'event_espresso');
205
-        }
206
-    }
207
-
208
-
209
-    /**
210
-     * column_TXN_ID
211
-     *
212
-     * @param \EE_Change_Log $item
213
-     * @return string
214
-     */
215
-    public function column_TXN_ID(EE_Change_Log $item)
216
-    {
217
-        if ($item->object() instanceof EE_Payment) {
218
-            $transaction_id = $item->object()->TXN_ID();
219
-        } elseif ($item->object() instanceof EE_Transaction) {
220
-            $transaction_id = $item->object()->ID();
221
-        } else {
222
-            $transaction_id = null;
223
-        }
224
-        if ($transaction_id
225
-            && EE_Registry::instance()->CAP->current_user_can(
226
-                'ee_read_transaction',
227
-                'espresso_transactions_view_transaction',
228
-                $transaction_id
229
-            )) {
230
-            $view_txn_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
231
-                array('action' => 'view_transaction', 'TXN_ID' => $transaction_id),
232
-                TXN_ADMIN_URL
233
-            );
234
-            return '<a href="'
235
-                   . $view_txn_lnk_url
236
-                   . '"  title="'
237
-                   . sprintf(
238
-                       esc_attr__('click to view transaction #%s', 'event_espresso'),
239
-                       $transaction_id
240
-                   )
241
-                   . '">'
242
-                   . sprintf(esc_html__('view txn %s', 'event_espresso'), $transaction_id)
243
-                   . '</a>';
244
-        }
245
-        // No transaction id or use can not view the transaction.
246
-        return __("Unable to find transaction", 'event_espresso');
247
-    }
128
+		$filters[] = ob_get_clean();
129
+		return $filters;
130
+	}
131
+
132
+
133
+	/**
134
+	 * _add_view_counts
135
+	 *
136
+	 * @return void
137
+	 */
138
+	protected function _add_view_counts()
139
+	{
140
+		$this->_views['all']['count'] = $this->_admin_page->get_payment_logs(
141
+			$this->_per_page,
142
+			$this->_current_page,
143
+			true
144
+		);
145
+	}
146
+
147
+
148
+	/**
149
+	 * column_cb
150
+	 *
151
+	 * @param \EE_Change_Log $item
152
+	 * @return string
153
+	 */
154
+	public function column_cb($item)
155
+	{
156
+		return sprintf('<input type="checkbox" class="option_id" name="checkbox[%1$d]" value="%1$d" />', $item->ID());
157
+	}
158
+
159
+
160
+	/**
161
+	 * column_id
162
+	 *
163
+	 * @param \EE_Change_Log $item
164
+	 * @return string
165
+	 */
166
+	public function column_id(EE_Change_Log $item)
167
+	{
168
+		$details_query_args = array(
169
+			'action' => 'payment_log_details',
170
+			'ID'     => $item->ID(),
171
+		);
172
+		$url = EE_Admin_Page::add_query_args_and_nonce($details_query_args, EE_PAYMENTS_ADMIN_URL);
173
+		return "<a href='$url'>{$item->ID()}</a>";
174
+	}
175
+
176
+
177
+	/**
178
+	 * column_LOG_time
179
+	 *
180
+	 * @param \EE_Change_Log $item
181
+	 * @return string
182
+	 */
183
+	public function column_LOG_time(EE_Change_Log $item)
184
+	{
185
+		return $item->get_datetime('LOG_time');
186
+	}
187
+
188
+
189
+	/**
190
+	 * column_PMD_ID
191
+	 *
192
+	 * @param \EE_Change_Log $item
193
+	 * @return string
194
+	 */
195
+	public function column_PMD_ID(EE_Change_Log $item)
196
+	{
197
+		if ($item->object() instanceof EE_Payment_Method) {
198
+			return $item->object()->admin_name();
199
+		} elseif ($item->object() instanceof EE_Payment && $item->object()->payment_method()) {
200
+			return $item->object()->payment_method()->admin_name();
201
+		} elseif ($item->object() instanceof EE_Transaction) {
202
+			return esc_html__('Unknown', 'event_espresso');
203
+		} else {
204
+			return esc_html__("No longer exists", 'event_espresso');
205
+		}
206
+	}
207
+
208
+
209
+	/**
210
+	 * column_TXN_ID
211
+	 *
212
+	 * @param \EE_Change_Log $item
213
+	 * @return string
214
+	 */
215
+	public function column_TXN_ID(EE_Change_Log $item)
216
+	{
217
+		if ($item->object() instanceof EE_Payment) {
218
+			$transaction_id = $item->object()->TXN_ID();
219
+		} elseif ($item->object() instanceof EE_Transaction) {
220
+			$transaction_id = $item->object()->ID();
221
+		} else {
222
+			$transaction_id = null;
223
+		}
224
+		if ($transaction_id
225
+			&& EE_Registry::instance()->CAP->current_user_can(
226
+				'ee_read_transaction',
227
+				'espresso_transactions_view_transaction',
228
+				$transaction_id
229
+			)) {
230
+			$view_txn_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
231
+				array('action' => 'view_transaction', 'TXN_ID' => $transaction_id),
232
+				TXN_ADMIN_URL
233
+			);
234
+			return '<a href="'
235
+				   . $view_txn_lnk_url
236
+				   . '"  title="'
237
+				   . sprintf(
238
+					   esc_attr__('click to view transaction #%s', 'event_espresso'),
239
+					   $transaction_id
240
+				   )
241
+				   . '">'
242
+				   . sprintf(esc_html__('view txn %s', 'event_espresso'), $transaction_id)
243
+				   . '</a>';
244
+		}
245
+		// No transaction id or use can not view the transaction.
246
+		return __("Unable to find transaction", 'event_espresso');
247
+	}
248 248
 }
Please login to merge, or discard this patch.
espresso.php 1 patch
Indentation   +80 added lines, -80 removed lines patch added patch discarded remove patch
@@ -38,103 +38,103 @@
 block discarded – undo
38 38
  * @since           4.0
39 39
  */
40 40
 if (function_exists('espresso_version')) {
41
-    if (! function_exists('espresso_duplicate_plugin_error')) {
42
-        /**
43
-         *    espresso_duplicate_plugin_error
44
-         *    displays if more than one version of EE is activated at the same time
45
-         */
46
-        function espresso_duplicate_plugin_error()
47
-        {
48
-            ?>
41
+	if (! function_exists('espresso_duplicate_plugin_error')) {
42
+		/**
43
+		 *    espresso_duplicate_plugin_error
44
+		 *    displays if more than one version of EE is activated at the same time
45
+		 */
46
+		function espresso_duplicate_plugin_error()
47
+		{
48
+			?>
49 49
             <div class="error">
50 50
                 <p>
51 51
                     <?php
52
-                    echo esc_html__(
53
-                        'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
-                        'event_espresso'
55
-                    ); ?>
52
+					echo esc_html__(
53
+						'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
+						'event_espresso'
55
+					); ?>
56 56
                 </p>
57 57
             </div>
58 58
             <?php
59
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
60
-        }
61
-    }
62
-    add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
59
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
60
+		}
61
+	}
62
+	add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
63 63
 } else {
64
-    define('EE_MIN_PHP_VER_REQUIRED', '5.4.0');
65
-    if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
-        /**
67
-         * espresso_minimum_php_version_error
68
-         *
69
-         * @return void
70
-         */
71
-        function espresso_minimum_php_version_error()
72
-        {
73
-            ?>
64
+	define('EE_MIN_PHP_VER_REQUIRED', '5.4.0');
65
+	if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
+		/**
67
+		 * espresso_minimum_php_version_error
68
+		 *
69
+		 * @return void
70
+		 */
71
+		function espresso_minimum_php_version_error()
72
+		{
73
+			?>
74 74
             <div class="error">
75 75
                 <p>
76 76
                     <?php
77
-                    printf(
78
-                        esc_html__(
79
-                            'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
-                            'event_espresso'
81
-                        ),
82
-                        EE_MIN_PHP_VER_REQUIRED,
83
-                        PHP_VERSION,
84
-                        '<br/>',
85
-                        '<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
-                    );
87
-                    ?>
77
+					printf(
78
+						esc_html__(
79
+							'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
+							'event_espresso'
81
+						),
82
+						EE_MIN_PHP_VER_REQUIRED,
83
+						PHP_VERSION,
84
+						'<br/>',
85
+						'<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
+					);
87
+					?>
88 88
                 </p>
89 89
             </div>
90 90
             <?php
91
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
92
-        }
91
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
92
+		}
93 93
 
94
-        add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
-    } else {
96
-        define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
97
-        /**
98
-         * espresso_version
99
-         * Returns the plugin version
100
-         *
101
-         * @return string
102
-         */
103
-        function espresso_version()
104
-        {
105
-            return apply_filters('FHEE__espresso__espresso_version', '4.9.65.rc.010');
106
-        }
94
+		add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
+	} else {
96
+		define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
97
+		/**
98
+		 * espresso_version
99
+		 * Returns the plugin version
100
+		 *
101
+		 * @return string
102
+		 */
103
+		function espresso_version()
104
+		{
105
+			return apply_filters('FHEE__espresso__espresso_version', '4.9.65.rc.010');
106
+		}
107 107
 
108
-        /**
109
-         * espresso_plugin_activation
110
-         * adds a wp-option to indicate that EE has been activated via the WP admin plugins page
111
-         */
112
-        function espresso_plugin_activation()
113
-        {
114
-            update_option('ee_espresso_activation', true);
115
-        }
108
+		/**
109
+		 * espresso_plugin_activation
110
+		 * adds a wp-option to indicate that EE has been activated via the WP admin plugins page
111
+		 */
112
+		function espresso_plugin_activation()
113
+		{
114
+			update_option('ee_espresso_activation', true);
115
+		}
116 116
 
117
-        register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
117
+		register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
118 118
 
119
-        require_once __DIR__ . '/core/bootstrap_espresso.php';
120
-        bootstrap_espresso();
121
-    }
119
+		require_once __DIR__ . '/core/bootstrap_espresso.php';
120
+		bootstrap_espresso();
121
+	}
122 122
 }
123 123
 if (! function_exists('espresso_deactivate_plugin')) {
124
-    /**
125
-     *    deactivate_plugin
126
-     * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
127
-     *
128
-     * @access public
129
-     * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
130
-     * @return    void
131
-     */
132
-    function espresso_deactivate_plugin($plugin_basename = '')
133
-    {
134
-        if (! function_exists('deactivate_plugins')) {
135
-            require_once ABSPATH . 'wp-admin/includes/plugin.php';
136
-        }
137
-        unset($_GET['activate'], $_REQUEST['activate']);
138
-        deactivate_plugins($plugin_basename);
139
-    }
124
+	/**
125
+	 *    deactivate_plugin
126
+	 * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
127
+	 *
128
+	 * @access public
129
+	 * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
130
+	 * @return    void
131
+	 */
132
+	function espresso_deactivate_plugin($plugin_basename = '')
133
+	{
134
+		if (! function_exists('deactivate_plugins')) {
135
+			require_once ABSPATH . 'wp-admin/includes/plugin.php';
136
+		}
137
+		unset($_GET['activate'], $_REQUEST['activate']);
138
+		deactivate_plugins($plugin_basename);
139
+	}
140 140
 }
Please login to merge, or discard this patch.