Passed
Push — master ( 47b6fc...99ae46 )
by Brian
05:46 queued 20s
created
includes/class-getpaid-tax.php 1 patch
Indentation   +160 added lines, -160 removed lines patch added patch discarded remove patch
@@ -13,167 +13,167 @@
 block discarded – undo
13 13
  */
14 14
 class GetPaid_Tax {
15 15
 
16
-	/**
17
-	 * Calculates tax for a line item.
18
-	 *
19
-	 * @param  float   $price              The price to calc tax on.
20
-	 * @param  array   $rates              The rates to apply.
21
-	 * @param  boolean $price_includes_tax Whether the passed price has taxes included.
22
-	 * @return array                       Array of tax name => tax amount.
23
-	 */
24
-	public static function calc_tax( $price, $rates, $price_includes_tax = false ) {
25
-
26
-		if ( $price_includes_tax ) {
27
-			$taxes = self::calc_inclusive_tax( $price, $rates );
28
-		} else {
29
-			$taxes = self::calc_exclusive_tax( $price, $rates );
30
-		}
31
-
32
-		return apply_filters( 'getpaid_calc_tax', $taxes, $price, $rates, $price_includes_tax );
33
-
34
-	}
35
-
36
-	/**
37
-	 * Calc tax from inclusive price.
38
-	 *
39
-	 * @param  float $price Price to calculate tax for.
40
-	 * @param  array $rates Array of tax rates.
41
-	 * @return array
42
-	 */
43
-	public static function calc_inclusive_tax( $price, $rates ) {
44
-		$taxes     = array();
45
-		$tax_rates = wp_list_pluck( $rates, 'rate', 'name' );
46
-
47
-		// Add tax rates.
48
-		$tax_rate  = 1 + ( array_sum( $tax_rates ) / 100 );
49
-
50
-		foreach ( $tax_rates as $name => $rate ) {
51
-			$the_rate       = ( $rate / 100 ) / $tax_rate;
52
-			$net_price      = $price - ( $the_rate * $price );
53
-			$tax_amount     = apply_filters( 'getpaid_price_inc_tax_amount', $price - $net_price, $name, $rate, $price );
54
-			$taxes[ $name ] = $tax_amount;
55
-		}
56
-
57
-		// Round all taxes to precision (4DP) before passing them back.
58
-		$taxes = array_map( array( __CLASS__, 'round' ), $taxes );
59
-
60
-		return $taxes;
61
-	}
62
-
63
-	/**
64
-	 * Calc tax from exclusive price.
65
-	 *
66
-	 * @param  float $price Price to calculate tax for.
67
-	 * @param  array $rates Array of tax rates.
68
-	 * @return array
69
-	 */
70
-	public static function calc_exclusive_tax( $price, $rates ) {
71
-		$taxes     = array();
72
-		$tax_rates = wp_list_pluck( $rates, 'rate', 'name' );
73
-
74
-		foreach ( $tax_rates as $name => $rate ) {
75
-
76
-			$tax_amount     = $price * ( $rate / 100 );
77
-			$taxes[ $name ] = apply_filters( 'getpaid_price_ex_tax_amount', $tax_amount, $name, $rate, $price );
78
-
79
-		}
80
-
81
-		// Round all taxes to precision (4DP) before passing them back.
82
-		$taxes = array_map( array( __CLASS__, 'round' ), $taxes );
83
-
84
-		return $taxes;
85
-	}
86
-
87
-	/**
88
-	 * Get's an array of all tax rates.
89
-	 *
90
-	 * @return array
91
-	 */
92
-	public static function get_all_tax_rates() {
93
-
94
-		$rates = get_option( 'wpinv_tax_rates', array() );
95
-
96
-		return apply_filters(
97
-			'getpaid_get_all_tax_rates',
98
-			array_filter( wpinv_parse_list( $rates ) )
99
-		);
100
-
101
-	}
102
-
103
-	/**
104
-	 * Get's an array of default tax rates.
105
-	 *
106
-	 * @return array
107
-	 */
108
-	public static function get_default_tax_rates() {
109
-
110
-		return apply_filters(
111
-			'getpaid_get_default_tax_rates',
112
-			array(
113
-				array(
114
-					'country' => wpinv_get_default_country(),
115
-					'state'   => wpinv_get_default_state(),
116
-					'global'  => true,
117
-					'rate'    => wpinv_get_default_tax_rate(),
118
-					'name'    => __( 'Base Tax', 'invoicing' ),
119
-				),
120
-			)
121
-		);
122
-
123
-	}
124
-
125
-	/**
126
-	 * Get's an array of tax rates for a given address.
127
-	 *
128
-	 * @param string $country
129
-	 * @param string $state
130
-	 * @return array
131
-	 */
132
-	public static function get_address_tax_rates( $country, $state ) {
133
-
134
-		$all_tax_rates  = self::get_all_tax_rates();
135
-		$matching_rates = array_merge(
136
-			wp_list_filter( $all_tax_rates, array( 'country' => $country ) ),
137
-			wp_list_filter( $all_tax_rates, array( 'country' => '' ) )
138
-		);
139
-
140
-		foreach ( $matching_rates as $i => $rate ) {
141
-
142
-			$states = array_filter( wpinv_clean( explode( ',', strtolower( $rate['state'] ) ) ) );
143
-			if ( empty( $rate['global'] ) && ! in_array( strtolower( $state ), $states ) ) {
144
-				unset( $matching_rates[ $i ] );
145
-			}
16
+    /**
17
+     * Calculates tax for a line item.
18
+     *
19
+     * @param  float   $price              The price to calc tax on.
20
+     * @param  array   $rates              The rates to apply.
21
+     * @param  boolean $price_includes_tax Whether the passed price has taxes included.
22
+     * @return array                       Array of tax name => tax amount.
23
+     */
24
+    public static function calc_tax( $price, $rates, $price_includes_tax = false ) {
25
+
26
+        if ( $price_includes_tax ) {
27
+            $taxes = self::calc_inclusive_tax( $price, $rates );
28
+        } else {
29
+            $taxes = self::calc_exclusive_tax( $price, $rates );
30
+        }
31
+
32
+        return apply_filters( 'getpaid_calc_tax', $taxes, $price, $rates, $price_includes_tax );
33
+
34
+    }
35
+
36
+    /**
37
+     * Calc tax from inclusive price.
38
+     *
39
+     * @param  float $price Price to calculate tax for.
40
+     * @param  array $rates Array of tax rates.
41
+     * @return array
42
+     */
43
+    public static function calc_inclusive_tax( $price, $rates ) {
44
+        $taxes     = array();
45
+        $tax_rates = wp_list_pluck( $rates, 'rate', 'name' );
46
+
47
+        // Add tax rates.
48
+        $tax_rate  = 1 + ( array_sum( $tax_rates ) / 100 );
49
+
50
+        foreach ( $tax_rates as $name => $rate ) {
51
+            $the_rate       = ( $rate / 100 ) / $tax_rate;
52
+            $net_price      = $price - ( $the_rate * $price );
53
+            $tax_amount     = apply_filters( 'getpaid_price_inc_tax_amount', $price - $net_price, $name, $rate, $price );
54
+            $taxes[ $name ] = $tax_amount;
55
+        }
56
+
57
+        // Round all taxes to precision (4DP) before passing them back.
58
+        $taxes = array_map( array( __CLASS__, 'round' ), $taxes );
59
+
60
+        return $taxes;
61
+    }
62
+
63
+    /**
64
+     * Calc tax from exclusive price.
65
+     *
66
+     * @param  float $price Price to calculate tax for.
67
+     * @param  array $rates Array of tax rates.
68
+     * @return array
69
+     */
70
+    public static function calc_exclusive_tax( $price, $rates ) {
71
+        $taxes     = array();
72
+        $tax_rates = wp_list_pluck( $rates, 'rate', 'name' );
73
+
74
+        foreach ( $tax_rates as $name => $rate ) {
75
+
76
+            $tax_amount     = $price * ( $rate / 100 );
77
+            $taxes[ $name ] = apply_filters( 'getpaid_price_ex_tax_amount', $tax_amount, $name, $rate, $price );
78
+
79
+        }
80
+
81
+        // Round all taxes to precision (4DP) before passing them back.
82
+        $taxes = array_map( array( __CLASS__, 'round' ), $taxes );
83
+
84
+        return $taxes;
85
+    }
86
+
87
+    /**
88
+     * Get's an array of all tax rates.
89
+     *
90
+     * @return array
91
+     */
92
+    public static function get_all_tax_rates() {
93
+
94
+        $rates = get_option( 'wpinv_tax_rates', array() );
95
+
96
+        return apply_filters(
97
+            'getpaid_get_all_tax_rates',
98
+            array_filter( wpinv_parse_list( $rates ) )
99
+        );
100
+
101
+    }
102
+
103
+    /**
104
+     * Get's an array of default tax rates.
105
+     *
106
+     * @return array
107
+     */
108
+    public static function get_default_tax_rates() {
109
+
110
+        return apply_filters(
111
+            'getpaid_get_default_tax_rates',
112
+            array(
113
+                array(
114
+                    'country' => wpinv_get_default_country(),
115
+                    'state'   => wpinv_get_default_state(),
116
+                    'global'  => true,
117
+                    'rate'    => wpinv_get_default_tax_rate(),
118
+                    'name'    => __( 'Base Tax', 'invoicing' ),
119
+                ),
120
+            )
121
+        );
122
+
123
+    }
124
+
125
+    /**
126
+     * Get's an array of tax rates for a given address.
127
+     *
128
+     * @param string $country
129
+     * @param string $state
130
+     * @return array
131
+     */
132
+    public static function get_address_tax_rates( $country, $state ) {
133
+
134
+        $all_tax_rates  = self::get_all_tax_rates();
135
+        $matching_rates = array_merge(
136
+            wp_list_filter( $all_tax_rates, array( 'country' => $country ) ),
137
+            wp_list_filter( $all_tax_rates, array( 'country' => '' ) )
138
+        );
139
+
140
+        foreach ( $matching_rates as $i => $rate ) {
141
+
142
+            $states = array_filter( wpinv_clean( explode( ',', strtolower( $rate['state'] ) ) ) );
143
+            if ( empty( $rate['global'] ) && ! in_array( strtolower( $state ), $states ) ) {
144
+                unset( $matching_rates[ $i ] );
145
+            }
146 146
 }
147 147
 
148
-		return apply_filters( 'getpaid_get_address_tax_rates', $matching_rates, $country, $state );
149
-
150
-	}
151
-
152
-	/**
153
-	 * Sums a set of taxes to form a single total. Result is rounded to precision.
154
-	 *
155
-	 * @param  array $taxes Array of taxes.
156
-	 * @return float
157
-	 */
158
-	public static function get_tax_total( $taxes ) {
159
-		return self::round( array_sum( $taxes ) );
160
-	}
161
-
162
-	/**
163
-	 * Round to precision.
164
-	 *
165
-	 * Filter example: to return rounding to .5 cents you'd use:
166
-	 *
167
-	 * function euro_5cent_rounding( $in ) {
168
-	 *      return round( $in / 5, 2 ) * 5;
169
-	 * }
170
-	 * add_filter( 'getpaid_tax_round', 'euro_5cent_rounding' );
171
-	 *
172
-	 * @param float|int $in Value to round.
173
-	 * @return float
174
-	 */
175
-	public static function round( $in ) {
176
-		return apply_filters( 'getpaid_tax_round', round( $in, 4 ), $in );
177
-	}
148
+        return apply_filters( 'getpaid_get_address_tax_rates', $matching_rates, $country, $state );
149
+
150
+    }
151
+
152
+    /**
153
+     * Sums a set of taxes to form a single total. Result is rounded to precision.
154
+     *
155
+     * @param  array $taxes Array of taxes.
156
+     * @return float
157
+     */
158
+    public static function get_tax_total( $taxes ) {
159
+        return self::round( array_sum( $taxes ) );
160
+    }
161
+
162
+    /**
163
+     * Round to precision.
164
+     *
165
+     * Filter example: to return rounding to .5 cents you'd use:
166
+     *
167
+     * function euro_5cent_rounding( $in ) {
168
+     *      return round( $in / 5, 2 ) * 5;
169
+     * }
170
+     * add_filter( 'getpaid_tax_round', 'euro_5cent_rounding' );
171
+     *
172
+     * @param float|int $in Value to round.
173
+     * @return float
174
+     */
175
+    public static function round( $in ) {
176
+        return apply_filters( 'getpaid_tax_round', round( $in, 4 ), $in );
177
+    }
178 178
 
179 179
 }
Please login to merge, or discard this patch.
includes/admin/class-getpaid-installer.php 1 patch
Indentation   +367 added lines, -367 removed lines patch added patch discarded remove patch
@@ -20,226 +20,226 @@  discard block
 block discarded – undo
20 20
  */
21 21
 class GetPaid_Installer {
22 22
 
23
-	/**
24
-	 * Upgrades the install.
25
-	 *
26
-	 * @param string $upgrade_from The current invoicing version.
27
-	 */
28
-	public function upgrade_db( $upgrade_from ) {
29
-
30
-		// Save the current invoicing version.
31
-		update_option( 'wpinv_version', WPINV_VERSION );
32
-
33
-		// Setup the invoice Custom Post Type.
34
-		GetPaid_Post_Types::register_post_types();
35
-
36
-		// Clear the permalinks
37
-		flush_rewrite_rules();
38
-
39
-		// Maybe create new/missing pages.
40
-		$this->create_pages();
41
-
42
-		// Maybe re(add) admin capabilities.
43
-		$this->add_capabilities();
44
-
45
-		// Maybe create the default payment form.
46
-		wpinv_get_default_payment_form();
47
-
48
-		// Create any missing database tables.
49
-		$method = "upgrade_from_$upgrade_from";
50
-
51
-		$installed = get_option( 'gepaid_installed_on' );
52
-
53
-		if ( empty( $installed ) ) {
54
-			update_option( 'gepaid_installed_on', time() );
55
-		}
56
-
57
-		if ( method_exists( $this, $method ) ) {
58
-			$this->$method();
59
-		}
60
-
61
-	}
62
-
63
-	/**
64
-	 * Do a fresh install.
65
-	 *
66
-	 */
67
-	public function upgrade_from_0() {
68
-		$this->create_subscriptions_table();
69
-		$this->create_invoices_table();
70
-		$this->create_invoice_items_table();
71
-
72
-		// Save default tax rates.
73
-		update_option( 'wpinv_tax_rates', wpinv_get_data( 'tax-rates' ) );
74
-	}
75
-
76
-	/**
77
-	 * Upgrade to 0.0.5
78
-	 *
79
-	 */
80
-	public function upgrade_from_004() {
81
-		global $wpdb;
82
-
83
-		// Invoices.
84
-		$results = $wpdb->get_results( "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'wpi_invoice' AND post_status IN( 'pending', 'processing', 'onhold', 'refunded', 'cancelled', 'failed', 'renewal' )" );
85
-		if ( ! empty( $results ) ) {
86
-			$wpdb->query( "UPDATE {$wpdb->posts} SET post_status = CONCAT( 'wpi-', post_status ) WHERE post_type = 'wpi_invoice' AND post_status IN( 'pending', 'processing', 'onhold', 'refunded', 'cancelled', 'failed', 'renewal' )" );
87
-
88
-			// Clean post cache
89
-			foreach ( $results as $row ) {
90
-				clean_post_cache( $row->ID );
91
-			}
23
+    /**
24
+     * Upgrades the install.
25
+     *
26
+     * @param string $upgrade_from The current invoicing version.
27
+     */
28
+    public function upgrade_db( $upgrade_from ) {
29
+
30
+        // Save the current invoicing version.
31
+        update_option( 'wpinv_version', WPINV_VERSION );
32
+
33
+        // Setup the invoice Custom Post Type.
34
+        GetPaid_Post_Types::register_post_types();
35
+
36
+        // Clear the permalinks
37
+        flush_rewrite_rules();
38
+
39
+        // Maybe create new/missing pages.
40
+        $this->create_pages();
41
+
42
+        // Maybe re(add) admin capabilities.
43
+        $this->add_capabilities();
44
+
45
+        // Maybe create the default payment form.
46
+        wpinv_get_default_payment_form();
47
+
48
+        // Create any missing database tables.
49
+        $method = "upgrade_from_$upgrade_from";
50
+
51
+        $installed = get_option( 'gepaid_installed_on' );
52
+
53
+        if ( empty( $installed ) ) {
54
+            update_option( 'gepaid_installed_on', time() );
55
+        }
56
+
57
+        if ( method_exists( $this, $method ) ) {
58
+            $this->$method();
59
+        }
60
+
61
+    }
62
+
63
+    /**
64
+     * Do a fresh install.
65
+     *
66
+     */
67
+    public function upgrade_from_0() {
68
+        $this->create_subscriptions_table();
69
+        $this->create_invoices_table();
70
+        $this->create_invoice_items_table();
71
+
72
+        // Save default tax rates.
73
+        update_option( 'wpinv_tax_rates', wpinv_get_data( 'tax-rates' ) );
74
+    }
75
+
76
+    /**
77
+     * Upgrade to 0.0.5
78
+     *
79
+     */
80
+    public function upgrade_from_004() {
81
+        global $wpdb;
82
+
83
+        // Invoices.
84
+        $results = $wpdb->get_results( "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'wpi_invoice' AND post_status IN( 'pending', 'processing', 'onhold', 'refunded', 'cancelled', 'failed', 'renewal' )" );
85
+        if ( ! empty( $results ) ) {
86
+            $wpdb->query( "UPDATE {$wpdb->posts} SET post_status = CONCAT( 'wpi-', post_status ) WHERE post_type = 'wpi_invoice' AND post_status IN( 'pending', 'processing', 'onhold', 'refunded', 'cancelled', 'failed', 'renewal' )" );
87
+
88
+            // Clean post cache
89
+            foreach ( $results as $row ) {
90
+                clean_post_cache( $row->ID );
91
+            }
92 92
 }
93 93
 
94
-		// Item meta key changes
95
-		$query = 'SELECT DISTINCT post_id FROM ' . $wpdb->postmeta . " WHERE meta_key IN( '_wpinv_item_id', '_wpinv_package_id', '_wpinv_post_id', '_wpinv_cpt_name', '_wpinv_cpt_singular_name' )";
96
-		$results = $wpdb->get_results( $query );
94
+        // Item meta key changes
95
+        $query = 'SELECT DISTINCT post_id FROM ' . $wpdb->postmeta . " WHERE meta_key IN( '_wpinv_item_id', '_wpinv_package_id', '_wpinv_post_id', '_wpinv_cpt_name', '_wpinv_cpt_singular_name' )";
96
+        $results = $wpdb->get_results( $query );
97 97
 
98
-		if ( ! empty( $results ) ) {
99
-			$wpdb->query( 'UPDATE ' . $wpdb->postmeta . " SET meta_key = '_wpinv_custom_id' WHERE meta_key IN( '_wpinv_item_id', '_wpinv_package_id', '_wpinv_post_id' )" );
100
-			$wpdb->query( 'UPDATE ' . $wpdb->postmeta . " SET meta_key = '_wpinv_custom_name' WHERE meta_key = '_wpinv_cpt_name'" );
101
-			$wpdb->query( 'UPDATE ' . $wpdb->postmeta . " SET meta_key = '_wpinv_custom_singular_name' WHERE meta_key = '_wpinv_cpt_singular_name'" );
98
+        if ( ! empty( $results ) ) {
99
+            $wpdb->query( 'UPDATE ' . $wpdb->postmeta . " SET meta_key = '_wpinv_custom_id' WHERE meta_key IN( '_wpinv_item_id', '_wpinv_package_id', '_wpinv_post_id' )" );
100
+            $wpdb->query( 'UPDATE ' . $wpdb->postmeta . " SET meta_key = '_wpinv_custom_name' WHERE meta_key = '_wpinv_cpt_name'" );
101
+            $wpdb->query( 'UPDATE ' . $wpdb->postmeta . " SET meta_key = '_wpinv_custom_singular_name' WHERE meta_key = '_wpinv_cpt_singular_name'" );
102 102
 
103
-			foreach ( $results as $row ) {
104
-				clean_post_cache( $row->post_id );
105
-			}
103
+            foreach ( $results as $row ) {
104
+                clean_post_cache( $row->post_id );
105
+            }
106 106
 }
107 107
 
108
-		$this->upgrade_from_102();
109
-	}
110
-
111
-	/**
112
-	 * Upgrade to 1.0.3
113
-	 *
114
-	 */
115
-	public function upgrade_from_102() {
116
-		$this->create_subscriptions_table();
117
-		$this->upgrade_from_118();
118
-	}
119
-
120
-	/**
121
-	 * Upgrade to version 2.0.0.
122
-	 *
123
-	 */
124
-	public function upgrade_from_118() {
125
-		$this->create_invoices_table();
126
-		$this->create_invoice_items_table();
127
-		$this->migrate_old_invoices();
128
-	}
129
-
130
-	/**
131
-	 * Upgrade to version 2.0.8.
132
-	 *
133
-	 */
134
-	public function upgrade_from_207() {
135
-		global $wpdb;
136
-		$wpdb->query( "ALTER TABLE {$wpdb->prefix}getpaid_invoice_items MODIFY COLUMN quantity FLOAT(20);" );
137
-	}
138
-
139
-	/**
140
-	 * Give administrators the capability to manage GetPaid.
141
-	 *
142
-	 */
143
-	public function add_capabilities() {
144
-		$GLOBALS['wp_roles']->add_cap( 'administrator', 'manage_invoicing' );
145
-	}
146
-
147
-	/**
148
-	 * Retreives GetPaid pages.
149
-	 *
150
-	 */
151
-	public static function get_pages() {
152
-
153
-		return apply_filters(
154
-			'wpinv_create_pages',
155
-			array(
156
-
157
-				// Checkout page.
158
-				'checkout_page'             => array(
159
-					'name'    => _x( 'gp-checkout', 'Page slug', 'invoicing' ),
160
-					'title'   => _x( 'Checkout', 'Page title', 'invoicing' ),
161
-					'content' => '
108
+        $this->upgrade_from_102();
109
+    }
110
+
111
+    /**
112
+     * Upgrade to 1.0.3
113
+     *
114
+     */
115
+    public function upgrade_from_102() {
116
+        $this->create_subscriptions_table();
117
+        $this->upgrade_from_118();
118
+    }
119
+
120
+    /**
121
+     * Upgrade to version 2.0.0.
122
+     *
123
+     */
124
+    public function upgrade_from_118() {
125
+        $this->create_invoices_table();
126
+        $this->create_invoice_items_table();
127
+        $this->migrate_old_invoices();
128
+    }
129
+
130
+    /**
131
+     * Upgrade to version 2.0.8.
132
+     *
133
+     */
134
+    public function upgrade_from_207() {
135
+        global $wpdb;
136
+        $wpdb->query( "ALTER TABLE {$wpdb->prefix}getpaid_invoice_items MODIFY COLUMN quantity FLOAT(20);" );
137
+    }
138
+
139
+    /**
140
+     * Give administrators the capability to manage GetPaid.
141
+     *
142
+     */
143
+    public function add_capabilities() {
144
+        $GLOBALS['wp_roles']->add_cap( 'administrator', 'manage_invoicing' );
145
+    }
146
+
147
+    /**
148
+     * Retreives GetPaid pages.
149
+     *
150
+     */
151
+    public static function get_pages() {
152
+
153
+        return apply_filters(
154
+            'wpinv_create_pages',
155
+            array(
156
+
157
+                // Checkout page.
158
+                'checkout_page'             => array(
159
+                    'name'    => _x( 'gp-checkout', 'Page slug', 'invoicing' ),
160
+                    'title'   => _x( 'Checkout', 'Page title', 'invoicing' ),
161
+                    'content' => '
162 162
 						<!-- wp:shortcode -->
163 163
 						[wpinv_checkout]
164 164
 						<!-- /wp:shortcode -->
165 165
 					',
166
-					'parent'  => '',
167
-				),
168
-
169
-				// Invoice history page.
170
-				'invoice_history_page'      => array(
171
-					'name'    => _x( 'gp-invoices', 'Page slug', 'invoicing' ),
172
-					'title'   => _x( 'My Invoices', 'Page title', 'invoicing' ),
173
-					'content' => '
166
+                    'parent'  => '',
167
+                ),
168
+
169
+                // Invoice history page.
170
+                'invoice_history_page'      => array(
171
+                    'name'    => _x( 'gp-invoices', 'Page slug', 'invoicing' ),
172
+                    'title'   => _x( 'My Invoices', 'Page title', 'invoicing' ),
173
+                    'content' => '
174 174
 					<!-- wp:shortcode -->
175 175
 					[wpinv_history]
176 176
 					<!-- /wp:shortcode -->
177 177
 				',
178
-					'parent'  => '',
179
-				),
180
-
181
-				// Success page content.
182
-				'success_page'              => array(
183
-					'name'    => _x( 'gp-receipt', 'Page slug', 'invoicing' ),
184
-					'title'   => _x( 'Payment Confirmation', 'Page title', 'invoicing' ),
185
-					'content' => '
178
+                    'parent'  => '',
179
+                ),
180
+
181
+                // Success page content.
182
+                'success_page'              => array(
183
+                    'name'    => _x( 'gp-receipt', 'Page slug', 'invoicing' ),
184
+                    'title'   => _x( 'Payment Confirmation', 'Page title', 'invoicing' ),
185
+                    'content' => '
186 186
 					<!-- wp:shortcode -->
187 187
 					[wpinv_receipt]
188 188
 					<!-- /wp:shortcode -->
189 189
 				',
190
-					'parent'  => 'gp-checkout',
191
-				),
192
-
193
-				// Failure page content.
194
-				'failure_page'              => array(
195
-					'name'    => _x( 'gp-transaction-failed', 'Page slug', 'invoicing' ),
196
-					'title'   => _x( 'Transaction Failed', 'Page title', 'invoicing' ),
197
-					'content' => __( 'Your transaction failed, please try again or contact site support.', 'invoicing' ),
198
-					'parent'  => 'gp-checkout',
199
-				),
200
-
201
-				// Subscriptions history page.
202
-				'invoice_subscription_page' => array(
203
-					'name'    => _x( 'gp-subscriptions', 'Page slug', 'invoicing' ),
204
-					'title'   => _x( 'My Subscriptions', 'Page title', 'invoicing' ),
205
-					'content' => '
190
+                    'parent'  => 'gp-checkout',
191
+                ),
192
+
193
+                // Failure page content.
194
+                'failure_page'              => array(
195
+                    'name'    => _x( 'gp-transaction-failed', 'Page slug', 'invoicing' ),
196
+                    'title'   => _x( 'Transaction Failed', 'Page title', 'invoicing' ),
197
+                    'content' => __( 'Your transaction failed, please try again or contact site support.', 'invoicing' ),
198
+                    'parent'  => 'gp-checkout',
199
+                ),
200
+
201
+                // Subscriptions history page.
202
+                'invoice_subscription_page' => array(
203
+                    'name'    => _x( 'gp-subscriptions', 'Page slug', 'invoicing' ),
204
+                    'title'   => _x( 'My Subscriptions', 'Page title', 'invoicing' ),
205
+                    'content' => '
206 206
 					<!-- wp:shortcode -->
207 207
 					[wpinv_subscriptions]
208 208
 					<!-- /wp:shortcode -->
209 209
 				',
210
-					'parent'  => '',
211
-				),
210
+                    'parent'  => '',
211
+                ),
212 212
 
213
-			)
214
-		);
213
+            )
214
+        );
215 215
 
216
-	}
216
+    }
217 217
 
218
-	/**
219
-	 * Re-create GetPaid pages.
220
-	 *
221
-	 */
222
-	public function create_pages() {
218
+    /**
219
+     * Re-create GetPaid pages.
220
+     *
221
+     */
222
+    public function create_pages() {
223 223
 
224
-		foreach ( self::get_pages() as $key => $page ) {
225
-			wpinv_create_page( esc_sql( $page['name'] ), $key, $page['title'], $page['content'], $page['parent'] );
226
-		}
224
+        foreach ( self::get_pages() as $key => $page ) {
225
+            wpinv_create_page( esc_sql( $page['name'] ), $key, $page['title'], $page['content'], $page['parent'] );
226
+        }
227 227
 
228
-	}
228
+    }
229 229
 
230
-	/**
231
-	 * Create subscriptions table.
232
-	 *
233
-	 */
234
-	public function create_subscriptions_table() {
230
+    /**
231
+     * Create subscriptions table.
232
+     *
233
+     */
234
+    public function create_subscriptions_table() {
235 235
 
236
-		global $wpdb;
236
+        global $wpdb;
237 237
 
238
-		require_once ABSPATH . 'wp-admin/includes/upgrade.php';
238
+        require_once ABSPATH . 'wp-admin/includes/upgrade.php';
239 239
 
240
-		// Create tables.
241
-		$charset_collate = $wpdb->get_charset_collate();
242
-		$sql             = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}wpinv_subscriptions (
240
+        // Create tables.
241
+        $charset_collate = $wpdb->get_charset_collate();
242
+        $sql             = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}wpinv_subscriptions (
243 243
 			id bigint(20) unsigned NOT NULL auto_increment,
244 244
 			customer_id bigint(20) NOT NULL,
245 245
 			frequency int(11) NOT NULL DEFAULT '1',
@@ -262,22 +262,22 @@  discard block
 block discarded – undo
262 262
 			KEY customer_and_status (customer_id, status)
263 263
 		  ) $charset_collate;";
264 264
 
265
-		dbDelta( $sql );
265
+        dbDelta( $sql );
266 266
 
267
-	}
267
+    }
268 268
 
269
-	/**
270
-	 * Create invoices table.
271
-	 *
272
-	 */
273
-	public function create_invoices_table() {
274
-		global $wpdb;
269
+    /**
270
+     * Create invoices table.
271
+     *
272
+     */
273
+    public function create_invoices_table() {
274
+        global $wpdb;
275 275
 
276
-		require_once ABSPATH . 'wp-admin/includes/upgrade.php';
276
+        require_once ABSPATH . 'wp-admin/includes/upgrade.php';
277 277
 
278
-		// Create tables.
279
-		$charset_collate = $wpdb->get_charset_collate();
280
-		$sql             = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}getpaid_invoices (
278
+        // Create tables.
279
+        $charset_collate = $wpdb->get_charset_collate();
280
+        $sql             = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}getpaid_invoices (
281 281
 			post_id BIGINT(20) NOT NULL,
282 282
             `number` VARCHAR(100),
283 283
             `key` VARCHAR(100),
@@ -313,22 +313,22 @@  discard block
 block discarded – undo
313 313
 			KEY `key` (`key`)
314 314
 		  ) $charset_collate;";
315 315
 
316
-		dbDelta( $sql );
316
+        dbDelta( $sql );
317 317
 
318
-	}
318
+    }
319 319
 
320
-	/**
321
-	 * Create invoice items table.
322
-	 *
323
-	 */
324
-	public function create_invoice_items_table() {
325
-		global $wpdb;
320
+    /**
321
+     * Create invoice items table.
322
+     *
323
+     */
324
+    public function create_invoice_items_table() {
325
+        global $wpdb;
326 326
 
327
-		require_once ABSPATH . 'wp-admin/includes/upgrade.php';
327
+        require_once ABSPATH . 'wp-admin/includes/upgrade.php';
328 328
 
329
-		// Create tables.
330
-		$charset_collate = $wpdb->get_charset_collate();
331
-		$sql             = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}getpaid_invoice_items (
329
+        // Create tables.
330
+        $charset_collate = $wpdb->get_charset_collate();
331
+        $sql             = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}getpaid_invoice_items (
332 332
 			ID BIGINT(20) NOT NULL AUTO_INCREMENT,
333 333
             post_id BIGINT(20) NOT NULL,
334 334
             item_id BIGINT(20) NOT NULL,
@@ -350,159 +350,159 @@  discard block
 block discarded – undo
350 350
 			KEY post_id (post_id)
351 351
 		  ) $charset_collate;";
352 352
 
353
-		dbDelta( $sql );
354
-
355
-	}
356
-
357
-	/**
358
-	 * Migrates old invoices to new invoices.
359
-	 *
360
-	 */
361
-	public function migrate_old_invoices() {
362
-		global $wpdb;
363
-
364
-		$invoices_table      = $wpdb->prefix . 'getpaid_invoices';
365
-		$invoice_items_table = $wpdb->prefix . 'getpaid_invoice_items';
366
-		$migrated            = $wpdb->get_col( "SELECT post_id FROM $invoices_table" );
367
-		$invoices            = array_unique(
368
-			get_posts(
369
-				array(
370
-					'post_type'      => array( 'wpi_invoice', 'wpi_quote' ),
371
-					'posts_per_page' => -1,
372
-					'fields'         => 'ids',
373
-					'post_status'    => array_keys( get_post_stati() ),
374
-					'exclude'        => (array) $migrated,
375
-				)
376
-			)
377
-		);
378
-
379
-		// Abort if we do not have any invoices.
380
-		if ( empty( $invoices ) ) {
381
-			return;
382
-		}
383
-
384
-		require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-legacy-invoice.php';
385
-
386
-		$invoice_rows = array();
387
-		foreach ( $invoices as $invoice ) {
388
-
389
-			$invoice = new WPInv_Legacy_Invoice( $invoice );
390
-
391
-			if ( empty( $invoice->ID ) ) {
392
-				return;
393
-			}
394
-
395
-			$fields = array(
396
-				'post_id'            => $invoice->ID,
397
-				'number'             => $invoice->get_number(),
398
-				'key'                => $invoice->get_key(),
399
-				'type'               => str_replace( 'wpi_', '', $invoice->post_type ),
400
-				'mode'               => $invoice->mode,
401
-				'user_ip'            => $invoice->get_ip(),
402
-				'first_name'         => $invoice->get_first_name(),
403
-				'last_name'          => $invoice->get_last_name(),
404
-				'address'            => $invoice->get_address(),
405
-				'city'               => $invoice->city,
406
-				'state'              => $invoice->state,
407
-				'country'            => $invoice->country,
408
-				'zip'                => $invoice->zip,
409
-				'adddress_confirmed' => (int) $invoice->adddress_confirmed,
410
-				'gateway'            => $invoice->get_gateway(),
411
-				'transaction_id'     => $invoice->get_transaction_id(),
412
-				'currency'           => $invoice->get_currency(),
413
-				'subtotal'           => $invoice->get_subtotal(),
414
-				'tax'                => $invoice->get_tax(),
415
-				'fees_total'         => $invoice->get_fees_total(),
416
-				'total'              => $invoice->get_total(),
417
-				'discount'           => $invoice->get_discount(),
418
-				'discount_code'      => $invoice->get_discount_code(),
419
-				'disable_taxes'      => $invoice->disable_taxes,
420
-				'due_date'           => $invoice->get_due_date(),
421
-				'completed_date'     => $invoice->get_completed_date(),
422
-				'company'            => $invoice->company,
423
-				'vat_number'         => $invoice->vat_number,
424
-				'vat_rate'           => $invoice->vat_rate,
425
-				'custom_meta'        => $invoice->payment_meta,
426
-			);
427
-
428
-			foreach ( $fields as $key => $val ) {
429
-				if ( is_null( $val ) ) {
430
-					$val = '';
431
-				}
432
-				$val = maybe_serialize( $val );
433
-				$fields[ $key ] = $wpdb->prepare( '%s', $val );
434
-			}
435
-
436
-			$fields = implode( ', ', $fields );
437
-			$invoice_rows[] = "($fields)";
438
-
439
-			$item_rows    = array();
440
-			$item_columns = array();
441
-			foreach ( $invoice->get_cart_details() as $details ) {
442
-				$fields = array(
443
-					'post_id'          => $invoice->ID,
444
-					'item_id'          => $details['id'],
445
-					'item_name'        => $details['name'],
446
-					'item_description' => empty( $details['meta']['description'] ) ? '' : $details['meta']['description'],
447
-					'vat_rate'         => $details['vat_rate'],
448
-					'vat_class'        => empty( $details['vat_class'] ) ? '_standard' : $details['vat_class'],
449
-					'tax'              => $details['tax'],
450
-					'item_price'       => $details['item_price'],
451
-					'custom_price'     => $details['custom_price'],
452
-					'quantity'         => $details['quantity'],
453
-					'discount'         => $details['discount'],
454
-					'subtotal'         => $details['subtotal'],
455
-					'price'            => $details['price'],
456
-					'meta'             => $details['meta'],
457
-					'fees'             => $details['fees'],
458
-				);
459
-
460
-				$item_columns = array_keys( $fields );
461
-
462
-				foreach ( $fields as $key => $val ) {
463
-					if ( is_null( $val ) ) {
464
-						$val = '';
465
-					}
466
-					$val = maybe_serialize( $val );
467
-					$fields[ $key ] = $wpdb->prepare( '%s', $val );
468
-				}
469
-
470
-				$fields = implode( ', ', $fields );
471
-				$item_rows[] = "($fields)";
472
-			}
473
-
474
-			$item_rows    = implode( ', ', $item_rows );
475
-			$item_columns = implode( ', ', $item_columns );
476
-			$wpdb->query( "INSERT INTO $invoice_items_table ($item_columns) VALUES $item_rows" );
477
-		}
478
-
479
-		if ( empty( $invoice_rows ) ) {
480
-			return;
481
-		}
482
-
483
-		$invoice_rows = implode( ', ', $invoice_rows );
484
-		$wpdb->query( "INSERT INTO $invoices_table VALUES $invoice_rows" );
485
-
486
-	}
487
-
488
-	/**
489
-	 * Migrates old invoices to new invoices.
490
-	 *
491
-	 */
492
-	public static function rename_gateways_label() {
493
-		global $wpdb;
494
-
495
-		foreach ( array_keys( wpinv_get_payment_gateways() ) as $gateway ) {
496
-
497
-			$wpdb->update(
498
-				$wpdb->prefix . 'getpaid_invoices',
499
-				array( 'gateway' => $gateway ),
500
-				array( 'gateway' => wpinv_get_gateway_admin_label( $gateway ) ),
501
-				'%s',
502
-				'%s'
503
-			);
504
-
505
-		}
506
-	}
353
+        dbDelta( $sql );
354
+
355
+    }
356
+
357
+    /**
358
+     * Migrates old invoices to new invoices.
359
+     *
360
+     */
361
+    public function migrate_old_invoices() {
362
+        global $wpdb;
363
+
364
+        $invoices_table      = $wpdb->prefix . 'getpaid_invoices';
365
+        $invoice_items_table = $wpdb->prefix . 'getpaid_invoice_items';
366
+        $migrated            = $wpdb->get_col( "SELECT post_id FROM $invoices_table" );
367
+        $invoices            = array_unique(
368
+            get_posts(
369
+                array(
370
+                    'post_type'      => array( 'wpi_invoice', 'wpi_quote' ),
371
+                    'posts_per_page' => -1,
372
+                    'fields'         => 'ids',
373
+                    'post_status'    => array_keys( get_post_stati() ),
374
+                    'exclude'        => (array) $migrated,
375
+                )
376
+            )
377
+        );
378
+
379
+        // Abort if we do not have any invoices.
380
+        if ( empty( $invoices ) ) {
381
+            return;
382
+        }
383
+
384
+        require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-legacy-invoice.php';
385
+
386
+        $invoice_rows = array();
387
+        foreach ( $invoices as $invoice ) {
388
+
389
+            $invoice = new WPInv_Legacy_Invoice( $invoice );
390
+
391
+            if ( empty( $invoice->ID ) ) {
392
+                return;
393
+            }
394
+
395
+            $fields = array(
396
+                'post_id'            => $invoice->ID,
397
+                'number'             => $invoice->get_number(),
398
+                'key'                => $invoice->get_key(),
399
+                'type'               => str_replace( 'wpi_', '', $invoice->post_type ),
400
+                'mode'               => $invoice->mode,
401
+                'user_ip'            => $invoice->get_ip(),
402
+                'first_name'         => $invoice->get_first_name(),
403
+                'last_name'          => $invoice->get_last_name(),
404
+                'address'            => $invoice->get_address(),
405
+                'city'               => $invoice->city,
406
+                'state'              => $invoice->state,
407
+                'country'            => $invoice->country,
408
+                'zip'                => $invoice->zip,
409
+                'adddress_confirmed' => (int) $invoice->adddress_confirmed,
410
+                'gateway'            => $invoice->get_gateway(),
411
+                'transaction_id'     => $invoice->get_transaction_id(),
412
+                'currency'           => $invoice->get_currency(),
413
+                'subtotal'           => $invoice->get_subtotal(),
414
+                'tax'                => $invoice->get_tax(),
415
+                'fees_total'         => $invoice->get_fees_total(),
416
+                'total'              => $invoice->get_total(),
417
+                'discount'           => $invoice->get_discount(),
418
+                'discount_code'      => $invoice->get_discount_code(),
419
+                'disable_taxes'      => $invoice->disable_taxes,
420
+                'due_date'           => $invoice->get_due_date(),
421
+                'completed_date'     => $invoice->get_completed_date(),
422
+                'company'            => $invoice->company,
423
+                'vat_number'         => $invoice->vat_number,
424
+                'vat_rate'           => $invoice->vat_rate,
425
+                'custom_meta'        => $invoice->payment_meta,
426
+            );
427
+
428
+            foreach ( $fields as $key => $val ) {
429
+                if ( is_null( $val ) ) {
430
+                    $val = '';
431
+                }
432
+                $val = maybe_serialize( $val );
433
+                $fields[ $key ] = $wpdb->prepare( '%s', $val );
434
+            }
435
+
436
+            $fields = implode( ', ', $fields );
437
+            $invoice_rows[] = "($fields)";
438
+
439
+            $item_rows    = array();
440
+            $item_columns = array();
441
+            foreach ( $invoice->get_cart_details() as $details ) {
442
+                $fields = array(
443
+                    'post_id'          => $invoice->ID,
444
+                    'item_id'          => $details['id'],
445
+                    'item_name'        => $details['name'],
446
+                    'item_description' => empty( $details['meta']['description'] ) ? '' : $details['meta']['description'],
447
+                    'vat_rate'         => $details['vat_rate'],
448
+                    'vat_class'        => empty( $details['vat_class'] ) ? '_standard' : $details['vat_class'],
449
+                    'tax'              => $details['tax'],
450
+                    'item_price'       => $details['item_price'],
451
+                    'custom_price'     => $details['custom_price'],
452
+                    'quantity'         => $details['quantity'],
453
+                    'discount'         => $details['discount'],
454
+                    'subtotal'         => $details['subtotal'],
455
+                    'price'            => $details['price'],
456
+                    'meta'             => $details['meta'],
457
+                    'fees'             => $details['fees'],
458
+                );
459
+
460
+                $item_columns = array_keys( $fields );
461
+
462
+                foreach ( $fields as $key => $val ) {
463
+                    if ( is_null( $val ) ) {
464
+                        $val = '';
465
+                    }
466
+                    $val = maybe_serialize( $val );
467
+                    $fields[ $key ] = $wpdb->prepare( '%s', $val );
468
+                }
469
+
470
+                $fields = implode( ', ', $fields );
471
+                $item_rows[] = "($fields)";
472
+            }
473
+
474
+            $item_rows    = implode( ', ', $item_rows );
475
+            $item_columns = implode( ', ', $item_columns );
476
+            $wpdb->query( "INSERT INTO $invoice_items_table ($item_columns) VALUES $item_rows" );
477
+        }
478
+
479
+        if ( empty( $invoice_rows ) ) {
480
+            return;
481
+        }
482
+
483
+        $invoice_rows = implode( ', ', $invoice_rows );
484
+        $wpdb->query( "INSERT INTO $invoices_table VALUES $invoice_rows" );
485
+
486
+    }
487
+
488
+    /**
489
+     * Migrates old invoices to new invoices.
490
+     *
491
+     */
492
+    public static function rename_gateways_label() {
493
+        global $wpdb;
494
+
495
+        foreach ( array_keys( wpinv_get_payment_gateways() ) as $gateway ) {
496
+
497
+            $wpdb->update(
498
+                $wpdb->prefix . 'getpaid_invoices',
499
+                array( 'gateway' => $gateway ),
500
+                array( 'gateway' => wpinv_get_gateway_admin_label( $gateway ) ),
501
+                '%s',
502
+                '%s'
503
+            );
504
+
505
+        }
506
+    }
507 507
 
508 508
 }
Please login to merge, or discard this patch.
includes/admin/class-wpinv-subscriptions-list-table.php 1 patch
Indentation   +463 added lines, -463 removed lines patch added patch discarded remove patch
@@ -8,7 +8,7 @@  discard block
 block discarded – undo
8 8
 }
9 9
 
10 10
 if ( ! class_exists( 'WP_List_Table' ) ) {
11
-	include_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
11
+    include_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
12 12
 }
13 13
 
14 14
 /**
@@ -16,468 +16,468 @@  discard block
 block discarded – undo
16 16
  */
17 17
 class WPInv_Subscriptions_List_Table extends WP_List_Table {
18 18
 
19
-	/**
20
-	 * URL of this page
21
-	 *
22
-	 * @var   string
23
-	 * @since 1.0.19
24
-	 */
25
-	public $base_url;
26
-
27
-	/**
28
-	 * Query
29
-	 *
30
-	 * @var   GetPaid_Subscriptions_Query
31
-	 * @since 1.0.19
32
-	 */
33
-	public $query;
34
-
35
-	/**
36
-	 * Total subscriptions
37
-	 *
38
-	 * @var   string
39
-	 * @since 1.0.0
40
-	 */
41
-	public $total_count;
42
-
43
-	/**
44
-	 * Current status subscriptions
45
-	 *
46
-	 * @var   string
47
-	 * @since 1.0.0
48
-	 */
49
-	public $current_total_count;
50
-
51
-	/**
52
-	 * Status counts
53
-	 *
54
-	 * @var   array
55
-	 * @since 1.0.19
56
-	 */
57
-	public $status_counts;
58
-
59
-	/**
60
-	 * Number of results to show per page
61
-	 *
62
-	 * @var   int
63
-	 * @since 1.0.0
64
-	 */
65
-	public $per_page = 10;
66
-
67
-	/**
68
-	 *  Constructor function.
69
-	 */
70
-	public function __construct() {
71
-
72
-		parent::__construct(
73
-			array(
74
-				'singular' => 'subscription',
75
-				'plural'   => 'subscriptions',
76
-			)
77
-		);
78
-
79
-		$this->process_bulk_action();
80
-
81
-		$this->prepare_query();
82
-
83
-		$this->base_url = remove_query_arg( 'status' );
84
-
85
-	}
86
-
87
-	/**
88
-	 *  Prepares the display query
89
-	 */
90
-	public function prepare_query() {
91
-
92
-		// Prepare query args.
93
-		$query = array(
94
-			'number'      => $this->per_page,
95
-			'paged'       => $this->get_paged(),
96
-			'status'      => ( isset( $_GET['status'] ) && array_key_exists( $_GET['status'], getpaid_get_subscription_statuses() ) ) ? sanitize_text_field( $_GET['status'] ) : 'all',
97
-			'orderby'     => ( isset( $_GET['orderby'] ) ) ? sanitize_text_field( $_GET['orderby'] ) : 'id',
98
-			'order'       => ( isset( $_GET['order'] ) ) ? sanitize_text_field( $_GET['order'] ) : 'DESC',
99
-			'customer_in' => $this->get_user_in(),
100
-		);
101
-
102
-		if ( is_array( $query['customer_in'] ) && empty( $query['customer_in'] ) ) {
103
-			$this->total_count         = 0;
104
-			$this->current_total_count = 0;
105
-			$this->items               = array();
106
-			$this->status_counts       = array();
107
-			return;
108
-		}
109
-
110
-		// Prepare class properties.
111
-		$this->query               = new GetPaid_Subscriptions_Query( $query );
112
-		$this->total_count         = $this->query->get_total();
113
-		$this->current_total_count = $this->query->get_total();
114
-		$this->items               = $this->query->get_results();
115
-		$this->status_counts       = getpaid_get_subscription_status_counts( $query );
116
-
117
-		if ( 'all' != $query['status'] ) {
118
-			unset( $query['status'] );
119
-			$this->total_count   = getpaid_get_subscriptions( $query, 'count' );
120
-		}
121
-
122
-	}
123
-
124
-	/**
125
-	 * Get user in.
126
-	 *
127
-	 */
128
-	public function get_user_in() {
129
-
130
-		// Abort if no user.
131
-		if ( empty( $_GET['s'] ) ) {
132
-			return null;
133
-		}
134
-
135
-		// Or invalid user.
136
-		$user = wp_unslash( sanitize_text_field( $_REQUEST['s'] ) );
137
-
138
-		if ( empty( $user ) ) {
139
-			return null;
140
-		}
141
-
142
-		// Search matching users.
143
-		$user  = '*' . $user . '*';
144
-		$users = new WP_User_Query(
145
-			array(
146
-				'fields'      => 'ID',
147
-				'search'      => $user,
148
-				'count_total' => false,
149
-			)
150
-		);
151
-
152
-		return $users->get_results();
153
-	}
154
-
155
-	/**
156
-	 * Gets the list of views available on this table.
157
-	 *
158
-	 * The format is an associative array:
159
-	 * - `'id' => 'link'`
160
-	 *
161
-	 * @since 1.0.0
162
-	 *
163
-	 * @return array
164
-	 */
165
-	public function get_views() {
166
-
167
-		$current  = isset( $_GET['status'] ) ? sanitize_text_field( $_GET['status'] ) : 'all';
168
-		$views    = array(
169
-
170
-			'all' => sprintf(
171
-				'<a href="%s" %s>%s&nbsp;<span class="count">(%d)</span></a>',
172
-				esc_url( add_query_arg( 'status', false, $this->base_url ) ),
173
-				$current === 'all' ? ' class="current"' : '',
174
-				__( 'All', 'invoicing' ),
175
-				$this->total_count
176
-			),
177
-
178
-		);
179
-
180
-		foreach ( array_filter( $this->status_counts ) as $status => $count ) {
181
-
182
-			$views[ $status ] = sprintf(
183
-				'<a href="%s" %s>%s&nbsp;<span class="count">(%d)</span></a>',
184
-				esc_url( add_query_arg( 'status', urlencode( $status ), $this->base_url ) ),
185
-				$current === $status ? ' class="current"' : '',
186
-				esc_html( getpaid_get_subscription_status_label( $status ) ),
187
-				$count
188
-			);
189
-
190
-		}
191
-
192
-		return $views;
193
-
194
-	}
195
-
196
-	/**
197
-	 * Render most columns
198
-	 *
199
-	 * @access      private
200
-	 * @since       1.0.0
201
-	 * @return      string
202
-	 */
203
-	public function column_default( $item, $column_name ) {
204
-		return apply_filters( "getpaid_subscriptions_table_column_$column_name", $item->$column_name );
205
-	}
206
-
207
-	/**
208
-	 * This is how checkbox column renders.
209
-	 *
210
-	 * @param WPInv_Subscription $item
211
-	 * @return string
212
-	 */
213
-	public function column_cb( $item ) {
214
-		return sprintf( '<input type="checkbox" name="id[]" value="%s" />', esc_html( $item->get_id() ) );
215
-	}
216
-
217
-	/**
218
-	 * Status column
219
-	 *
220
-	 * @param WPInv_Subscription $item
221
-	 * @since       1.0.0
222
-	 * @return      string
223
-	 */
224
-	public function column_status( $item ) {
225
-		return $item->get_status_label_html();
226
-	}
227
-
228
-	/**
229
-	 * Subscription column
230
-	 *
231
-	 * @param WPInv_Subscription $item
232
-	 * @since       1.0.0
233
-	 * @return      string
234
-	 */
235
-	public function column_subscription( $item ) {
236
-
237
-		$username = __( '(Missing User)', 'invoicing' );
238
-
239
-		$user = get_userdata( $item->get_customer_id() );
240
-		if ( $user ) {
241
-
242
-			$username = sprintf(
243
-				'<a href="user-edit.php?user_id=%s">%s</a>',
244
-				absint( $user->ID ),
245
-				! empty( $user->display_name ) ? esc_html( $user->display_name ) : sanitize_email( $user->user_email )
246
-			);
247
-
248
-		}
249
-
250
-		// translators: $1: is opening link, $2: is subscription id number, $3: is closing link tag, $4: is user's name
251
-		$column_content = sprintf(
252
-			_x( '%1$s#%2$s%3$s for %4$s', 'Subscription title on admin table. (e.g.: #211 for John Doe)', 'invoicing' ),
253
-			'<a href="' . esc_url( admin_url( 'admin.php?page=wpinv-subscriptions&id=' . absint( $item->get_id() ) ) ) . '">',
254
-			'<strong>' . esc_attr( $item->get_id() ) . '</strong>',
19
+    /**
20
+     * URL of this page
21
+     *
22
+     * @var   string
23
+     * @since 1.0.19
24
+     */
25
+    public $base_url;
26
+
27
+    /**
28
+     * Query
29
+     *
30
+     * @var   GetPaid_Subscriptions_Query
31
+     * @since 1.0.19
32
+     */
33
+    public $query;
34
+
35
+    /**
36
+     * Total subscriptions
37
+     *
38
+     * @var   string
39
+     * @since 1.0.0
40
+     */
41
+    public $total_count;
42
+
43
+    /**
44
+     * Current status subscriptions
45
+     *
46
+     * @var   string
47
+     * @since 1.0.0
48
+     */
49
+    public $current_total_count;
50
+
51
+    /**
52
+     * Status counts
53
+     *
54
+     * @var   array
55
+     * @since 1.0.19
56
+     */
57
+    public $status_counts;
58
+
59
+    /**
60
+     * Number of results to show per page
61
+     *
62
+     * @var   int
63
+     * @since 1.0.0
64
+     */
65
+    public $per_page = 10;
66
+
67
+    /**
68
+     *  Constructor function.
69
+     */
70
+    public function __construct() {
71
+
72
+        parent::__construct(
73
+            array(
74
+                'singular' => 'subscription',
75
+                'plural'   => 'subscriptions',
76
+            )
77
+        );
78
+
79
+        $this->process_bulk_action();
80
+
81
+        $this->prepare_query();
82
+
83
+        $this->base_url = remove_query_arg( 'status' );
84
+
85
+    }
86
+
87
+    /**
88
+     *  Prepares the display query
89
+     */
90
+    public function prepare_query() {
91
+
92
+        // Prepare query args.
93
+        $query = array(
94
+            'number'      => $this->per_page,
95
+            'paged'       => $this->get_paged(),
96
+            'status'      => ( isset( $_GET['status'] ) && array_key_exists( $_GET['status'], getpaid_get_subscription_statuses() ) ) ? sanitize_text_field( $_GET['status'] ) : 'all',
97
+            'orderby'     => ( isset( $_GET['orderby'] ) ) ? sanitize_text_field( $_GET['orderby'] ) : 'id',
98
+            'order'       => ( isset( $_GET['order'] ) ) ? sanitize_text_field( $_GET['order'] ) : 'DESC',
99
+            'customer_in' => $this->get_user_in(),
100
+        );
101
+
102
+        if ( is_array( $query['customer_in'] ) && empty( $query['customer_in'] ) ) {
103
+            $this->total_count         = 0;
104
+            $this->current_total_count = 0;
105
+            $this->items               = array();
106
+            $this->status_counts       = array();
107
+            return;
108
+        }
109
+
110
+        // Prepare class properties.
111
+        $this->query               = new GetPaid_Subscriptions_Query( $query );
112
+        $this->total_count         = $this->query->get_total();
113
+        $this->current_total_count = $this->query->get_total();
114
+        $this->items               = $this->query->get_results();
115
+        $this->status_counts       = getpaid_get_subscription_status_counts( $query );
116
+
117
+        if ( 'all' != $query['status'] ) {
118
+            unset( $query['status'] );
119
+            $this->total_count   = getpaid_get_subscriptions( $query, 'count' );
120
+        }
121
+
122
+    }
123
+
124
+    /**
125
+     * Get user in.
126
+     *
127
+     */
128
+    public function get_user_in() {
129
+
130
+        // Abort if no user.
131
+        if ( empty( $_GET['s'] ) ) {
132
+            return null;
133
+        }
134
+
135
+        // Or invalid user.
136
+        $user = wp_unslash( sanitize_text_field( $_REQUEST['s'] ) );
137
+
138
+        if ( empty( $user ) ) {
139
+            return null;
140
+        }
141
+
142
+        // Search matching users.
143
+        $user  = '*' . $user . '*';
144
+        $users = new WP_User_Query(
145
+            array(
146
+                'fields'      => 'ID',
147
+                'search'      => $user,
148
+                'count_total' => false,
149
+            )
150
+        );
151
+
152
+        return $users->get_results();
153
+    }
154
+
155
+    /**
156
+     * Gets the list of views available on this table.
157
+     *
158
+     * The format is an associative array:
159
+     * - `'id' => 'link'`
160
+     *
161
+     * @since 1.0.0
162
+     *
163
+     * @return array
164
+     */
165
+    public function get_views() {
166
+
167
+        $current  = isset( $_GET['status'] ) ? sanitize_text_field( $_GET['status'] ) : 'all';
168
+        $views    = array(
169
+
170
+            'all' => sprintf(
171
+                '<a href="%s" %s>%s&nbsp;<span class="count">(%d)</span></a>',
172
+                esc_url( add_query_arg( 'status', false, $this->base_url ) ),
173
+                $current === 'all' ? ' class="current"' : '',
174
+                __( 'All', 'invoicing' ),
175
+                $this->total_count
176
+            ),
177
+
178
+        );
179
+
180
+        foreach ( array_filter( $this->status_counts ) as $status => $count ) {
181
+
182
+            $views[ $status ] = sprintf(
183
+                '<a href="%s" %s>%s&nbsp;<span class="count">(%d)</span></a>',
184
+                esc_url( add_query_arg( 'status', urlencode( $status ), $this->base_url ) ),
185
+                $current === $status ? ' class="current"' : '',
186
+                esc_html( getpaid_get_subscription_status_label( $status ) ),
187
+                $count
188
+            );
189
+
190
+        }
191
+
192
+        return $views;
193
+
194
+    }
195
+
196
+    /**
197
+     * Render most columns
198
+     *
199
+     * @access      private
200
+     * @since       1.0.0
201
+     * @return      string
202
+     */
203
+    public function column_default( $item, $column_name ) {
204
+        return apply_filters( "getpaid_subscriptions_table_column_$column_name", $item->$column_name );
205
+    }
206
+
207
+    /**
208
+     * This is how checkbox column renders.
209
+     *
210
+     * @param WPInv_Subscription $item
211
+     * @return string
212
+     */
213
+    public function column_cb( $item ) {
214
+        return sprintf( '<input type="checkbox" name="id[]" value="%s" />', esc_html( $item->get_id() ) );
215
+    }
216
+
217
+    /**
218
+     * Status column
219
+     *
220
+     * @param WPInv_Subscription $item
221
+     * @since       1.0.0
222
+     * @return      string
223
+     */
224
+    public function column_status( $item ) {
225
+        return $item->get_status_label_html();
226
+    }
227
+
228
+    /**
229
+     * Subscription column
230
+     *
231
+     * @param WPInv_Subscription $item
232
+     * @since       1.0.0
233
+     * @return      string
234
+     */
235
+    public function column_subscription( $item ) {
236
+
237
+        $username = __( '(Missing User)', 'invoicing' );
238
+
239
+        $user = get_userdata( $item->get_customer_id() );
240
+        if ( $user ) {
241
+
242
+            $username = sprintf(
243
+                '<a href="user-edit.php?user_id=%s">%s</a>',
244
+                absint( $user->ID ),
245
+                ! empty( $user->display_name ) ? esc_html( $user->display_name ) : sanitize_email( $user->user_email )
246
+            );
247
+
248
+        }
249
+
250
+        // translators: $1: is opening link, $2: is subscription id number, $3: is closing link tag, $4: is user's name
251
+        $column_content = sprintf(
252
+            _x( '%1$s#%2$s%3$s for %4$s', 'Subscription title on admin table. (e.g.: #211 for John Doe)', 'invoicing' ),
253
+            '<a href="' . esc_url( admin_url( 'admin.php?page=wpinv-subscriptions&id=' . absint( $item->get_id() ) ) ) . '">',
254
+            '<strong>' . esc_attr( $item->get_id() ) . '</strong>',
255 255
             '</a>',
256
-			$username
257
-		);
258
-
259
-		$row_actions = array();
260
-
261
-		// View subscription.
262
-		$view_url    = esc_url( add_query_arg( 'id', $item->get_id(), admin_url( 'admin.php?page=wpinv-subscriptions' ) ) );
263
-		$row_actions['view'] = '<a href="' . $view_url . '">' . __( 'View Subscription', 'invoicing' ) . '</a>';
264
-
265
-		// View invoice.
266
-		$invoice = get_post( $item->get_parent_invoice_id() );
267
-
268
-		if ( ! empty( $invoice ) ) {
269
-			$invoice_url            = get_edit_post_link( $invoice );
270
-			$row_actions['invoice'] = '<a href="' . $invoice_url . '">' . __( 'View Invoice', 'invoicing' ) . '</a>';
271
-		}
272
-
273
-		$delete_url            = esc_url(
274
-			wp_nonce_url(
275
-				add_query_arg(
276
-					array(
277
-						'getpaid-admin-action' => 'subscription_manual_delete',
278
-						'id'                   => $item->get_id(),
279
-					)
280
-				),
281
-				'getpaid-nonce',
282
-				'getpaid-nonce'
283
-			)
284
-		);
285
-		$row_actions['delete'] = '<a class="text-danger" href="' . $delete_url . '">' . __( 'Delete Subscription', 'invoicing' ) . '</a>';
286
-
287
-		$row_actions = $this->row_actions( apply_filters( 'getpaid_subscription_table_row_actions', $row_actions, $item ) );
288
-
289
-		return "<strong>$column_content</strong>" . $this->column_amount( $item ) . $row_actions;
290
-	}
291
-
292
-	/**
293
-	 * Renewal date column
294
-	 *
295
-	 * @param WPInv_Subscription $item
296
-	 * @since       1.0.0
297
-	 * @return      string
298
-	 */
299
-	public function column_renewal_date( $item ) {
300
-		return getpaid_format_date_value( $item->get_expiration() );
301
-	}
302
-
303
-	/**
304
-	 * Start date column
305
-	 *
306
-	 * @param WPInv_Subscription $item
307
-	 * @since       1.0.0
308
-	 * @return      string
309
-	 */
310
-	public function column_start_date( $item ) {
311
-
312
-		$gateway = $item->get_parent_invoice()->get_gateway_title();
313
-
314
-		if ( empty( $gateway ) ) {
315
-			return getpaid_format_date_value( $item->get_date_created() );
316
-		}
317
-
318
-		$url = apply_filters( 'getpaid_remote_subscription_profile_url', '', $item );
319
-		if ( ! empty( $url ) ) {
320
-
321
-			return getpaid_format_date_value( $item->get_date_created() ) . '<br>' . sprintf(
322
-				__( 'Via %s', 'invoicing' ),
323
-				'<strong><a href="' . esc_url( $url ) . '" target="_blank">' . esc_html( $item->get_parent_invoice()->get_gateway_title() ) . '</a></strong>'
324
-			);
325
-
326
-		}
327
-
328
-		return getpaid_format_date_value( $item->get_date_created() ) . '<br>' . sprintf(
329
-			__( 'Via %s', 'invoicing' ),
330
-			'<strong>' . esc_html( $item->get_parent_invoice()->get_gateway_title() ) . '</strong>'
331
-		);
332
-
333
-	}
334
-
335
-	/**
336
-	 * Amount column
337
-	 *
338
-	 * @param WPInv_Subscription $item
339
-	 * @since       1.0.19
340
-	 * @return      string
341
-	 */
342
-	public static function column_amount( $item ) {
343
-		$amount = getpaid_get_formatted_subscription_amount( $item );
344
-		return "<span class='text-muted form-text mt-2 mb-2'>$amount</span>";
345
-	}
346
-
347
-	/**
348
-	 * Billing Times column
349
-	 *
350
-	 * @param WPInv_Subscription $item
351
-	 * @since       1.0.0
352
-	 * @return      string
353
-	 */
354
-	public function column_renewals( $item ) {
355
-		$max_bills = $item->get_bill_times();
356
-		return $item->get_times_billed() . ' / ' . ( empty( $max_bills ) ? '&infin;' : $max_bills );
357
-	}
358
-
359
-	/**
360
-	 * Product ID column
361
-	 *
362
-	 * @param WPInv_Subscription $item
363
-	 * @since       1.0.0
364
-	 * @return      string
365
-	 */
366
-	public function column_item( $item ) {
367
-		$subscription_group = getpaid_get_invoice_subscription_group( $item->get_parent_invoice_id(), $item->get_id() );
368
-
369
-		if ( empty( $subscription_group ) ) {
370
-			return $this->generate_item_markup( $item->get_product_id() );
371
-		}
372
-
373
-		$markup = array_map( array( $this, 'generate_item_markup' ), array_keys( $subscription_group['items'] ) );
374
-		return implode( ' | ', $markup );
375
-
376
-	}
377
-
378
-	/**
379
-	 * Generates the items markup.
380
-	 *
381
-	 * @param int $item_id
382
-	 * @since       1.0.0
383
-	 * @return      string
384
-	 */
385
-	public static function generate_item_markup( $item_id ) {
386
-		$item = get_post( $item_id );
387
-
388
-		if ( ! empty( $item ) ) {
389
-			$link = get_edit_post_link( $item );
390
-			$link = esc_url( $link );
391
-			$name = esc_html( get_the_title( $item ) );
392
-			return wpinv_current_user_can_manage_invoicing() ? "<a href='$link'>$name</a>" : $name;
393
-		} else {
394
-			return sprintf( __( 'Item #%s', 'invoicing' ), $item_id );
395
-		}
396
-
397
-	}
398
-
399
-	/**
400
-	 * Retrieve the current page number
401
-	 *
402
-	 * @return      int
403
-	 */
404
-	public function get_paged() {
405
-		return isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
406
-	}
407
-
408
-	/**
409
-	 * Setup the final data for the table
410
-	 *
411
-	 */
412
-	public function prepare_items() {
413
-
414
-		$columns  = $this->get_columns();
415
-		$hidden   = array();
416
-		$sortable = $this->get_sortable_columns();
417
-
418
-		$this->_column_headers = array( $columns, $hidden, $sortable );
419
-
420
-		$this->set_pagination_args(
421
-			array(
422
-				'total_items' => $this->current_total_count,
423
-				'per_page'    => $this->per_page,
424
-				'total_pages' => ceil( $this->current_total_count / $this->per_page ),
425
-			)
426
-		);
427
-	}
428
-
429
-	/**
430
-	 * Table columns
431
-	 *
432
-	 * @return array
433
-	 */
434
-	public function get_columns() {
435
-		$columns = array(
436
-			'cb'           => '<input type="checkbox" />',
437
-			'subscription' => __( 'Subscription', 'invoicing' ),
438
-			'start_date'   => __( 'Start Date', 'invoicing' ),
439
-			'renewal_date' => __( 'Next Payment', 'invoicing' ),
440
-			'renewals'     => __( 'Payments', 'invoicing' ),
441
-			'item'         => __( 'Items', 'invoicing' ),
442
-			'status'       => __( 'Status', 'invoicing' ),
443
-		);
444
-
445
-		return apply_filters( 'manage_getpaid_subscriptions_table_columns', $columns );
446
-	}
447
-
448
-	/**
449
-	 * Sortable table columns.
450
-	 *
451
-	 * @return array
452
-	 */
453
-	public function get_sortable_columns() {
454
-		$sortable = array(
455
-			'subscription' => array( 'id', true ),
456
-			'start_date'   => array( 'created', true ),
457
-			'renewal_date' => array( 'expiration', true ),
458
-			'renewals'     => array( 'bill_times', true ),
459
-			'item'         => array( 'product_id', true ),
460
-			'status'       => array( 'status', true ),
461
-		);
462
-
463
-		return apply_filters( 'manage_getpaid_subscriptions_sortable_table_columns', $sortable );
464
-	}
465
-
466
-	/**
467
-	 * Whether the table has items to display or not
468
-	 *
469
-	 * @return bool
470
-	 */
471
-	public function has_items() {
472
-		return ! empty( $this->current_total_count );
473
-	}
474
-
475
-	/**
476
-	 * Processes bulk actions.
477
-	 *
478
-	 */
479
-	public function process_bulk_action() {
480
-
481
-	}
256
+            $username
257
+        );
258
+
259
+        $row_actions = array();
260
+
261
+        // View subscription.
262
+        $view_url    = esc_url( add_query_arg( 'id', $item->get_id(), admin_url( 'admin.php?page=wpinv-subscriptions' ) ) );
263
+        $row_actions['view'] = '<a href="' . $view_url . '">' . __( 'View Subscription', 'invoicing' ) . '</a>';
264
+
265
+        // View invoice.
266
+        $invoice = get_post( $item->get_parent_invoice_id() );
267
+
268
+        if ( ! empty( $invoice ) ) {
269
+            $invoice_url            = get_edit_post_link( $invoice );
270
+            $row_actions['invoice'] = '<a href="' . $invoice_url . '">' . __( 'View Invoice', 'invoicing' ) . '</a>';
271
+        }
272
+
273
+        $delete_url            = esc_url(
274
+            wp_nonce_url(
275
+                add_query_arg(
276
+                    array(
277
+                        'getpaid-admin-action' => 'subscription_manual_delete',
278
+                        'id'                   => $item->get_id(),
279
+                    )
280
+                ),
281
+                'getpaid-nonce',
282
+                'getpaid-nonce'
283
+            )
284
+        );
285
+        $row_actions['delete'] = '<a class="text-danger" href="' . $delete_url . '">' . __( 'Delete Subscription', 'invoicing' ) . '</a>';
286
+
287
+        $row_actions = $this->row_actions( apply_filters( 'getpaid_subscription_table_row_actions', $row_actions, $item ) );
288
+
289
+        return "<strong>$column_content</strong>" . $this->column_amount( $item ) . $row_actions;
290
+    }
291
+
292
+    /**
293
+     * Renewal date column
294
+     *
295
+     * @param WPInv_Subscription $item
296
+     * @since       1.0.0
297
+     * @return      string
298
+     */
299
+    public function column_renewal_date( $item ) {
300
+        return getpaid_format_date_value( $item->get_expiration() );
301
+    }
302
+
303
+    /**
304
+     * Start date column
305
+     *
306
+     * @param WPInv_Subscription $item
307
+     * @since       1.0.0
308
+     * @return      string
309
+     */
310
+    public function column_start_date( $item ) {
311
+
312
+        $gateway = $item->get_parent_invoice()->get_gateway_title();
313
+
314
+        if ( empty( $gateway ) ) {
315
+            return getpaid_format_date_value( $item->get_date_created() );
316
+        }
317
+
318
+        $url = apply_filters( 'getpaid_remote_subscription_profile_url', '', $item );
319
+        if ( ! empty( $url ) ) {
320
+
321
+            return getpaid_format_date_value( $item->get_date_created() ) . '<br>' . sprintf(
322
+                __( 'Via %s', 'invoicing' ),
323
+                '<strong><a href="' . esc_url( $url ) . '" target="_blank">' . esc_html( $item->get_parent_invoice()->get_gateway_title() ) . '</a></strong>'
324
+            );
325
+
326
+        }
327
+
328
+        return getpaid_format_date_value( $item->get_date_created() ) . '<br>' . sprintf(
329
+            __( 'Via %s', 'invoicing' ),
330
+            '<strong>' . esc_html( $item->get_parent_invoice()->get_gateway_title() ) . '</strong>'
331
+        );
332
+
333
+    }
334
+
335
+    /**
336
+     * Amount column
337
+     *
338
+     * @param WPInv_Subscription $item
339
+     * @since       1.0.19
340
+     * @return      string
341
+     */
342
+    public static function column_amount( $item ) {
343
+        $amount = getpaid_get_formatted_subscription_amount( $item );
344
+        return "<span class='text-muted form-text mt-2 mb-2'>$amount</span>";
345
+    }
346
+
347
+    /**
348
+     * Billing Times column
349
+     *
350
+     * @param WPInv_Subscription $item
351
+     * @since       1.0.0
352
+     * @return      string
353
+     */
354
+    public function column_renewals( $item ) {
355
+        $max_bills = $item->get_bill_times();
356
+        return $item->get_times_billed() . ' / ' . ( empty( $max_bills ) ? '&infin;' : $max_bills );
357
+    }
358
+
359
+    /**
360
+     * Product ID column
361
+     *
362
+     * @param WPInv_Subscription $item
363
+     * @since       1.0.0
364
+     * @return      string
365
+     */
366
+    public function column_item( $item ) {
367
+        $subscription_group = getpaid_get_invoice_subscription_group( $item->get_parent_invoice_id(), $item->get_id() );
368
+
369
+        if ( empty( $subscription_group ) ) {
370
+            return $this->generate_item_markup( $item->get_product_id() );
371
+        }
372
+
373
+        $markup = array_map( array( $this, 'generate_item_markup' ), array_keys( $subscription_group['items'] ) );
374
+        return implode( ' | ', $markup );
375
+
376
+    }
377
+
378
+    /**
379
+     * Generates the items markup.
380
+     *
381
+     * @param int $item_id
382
+     * @since       1.0.0
383
+     * @return      string
384
+     */
385
+    public static function generate_item_markup( $item_id ) {
386
+        $item = get_post( $item_id );
387
+
388
+        if ( ! empty( $item ) ) {
389
+            $link = get_edit_post_link( $item );
390
+            $link = esc_url( $link );
391
+            $name = esc_html( get_the_title( $item ) );
392
+            return wpinv_current_user_can_manage_invoicing() ? "<a href='$link'>$name</a>" : $name;
393
+        } else {
394
+            return sprintf( __( 'Item #%s', 'invoicing' ), $item_id );
395
+        }
396
+
397
+    }
398
+
399
+    /**
400
+     * Retrieve the current page number
401
+     *
402
+     * @return      int
403
+     */
404
+    public function get_paged() {
405
+        return isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
406
+    }
407
+
408
+    /**
409
+     * Setup the final data for the table
410
+     *
411
+     */
412
+    public function prepare_items() {
413
+
414
+        $columns  = $this->get_columns();
415
+        $hidden   = array();
416
+        $sortable = $this->get_sortable_columns();
417
+
418
+        $this->_column_headers = array( $columns, $hidden, $sortable );
419
+
420
+        $this->set_pagination_args(
421
+            array(
422
+                'total_items' => $this->current_total_count,
423
+                'per_page'    => $this->per_page,
424
+                'total_pages' => ceil( $this->current_total_count / $this->per_page ),
425
+            )
426
+        );
427
+    }
428
+
429
+    /**
430
+     * Table columns
431
+     *
432
+     * @return array
433
+     */
434
+    public function get_columns() {
435
+        $columns = array(
436
+            'cb'           => '<input type="checkbox" />',
437
+            'subscription' => __( 'Subscription', 'invoicing' ),
438
+            'start_date'   => __( 'Start Date', 'invoicing' ),
439
+            'renewal_date' => __( 'Next Payment', 'invoicing' ),
440
+            'renewals'     => __( 'Payments', 'invoicing' ),
441
+            'item'         => __( 'Items', 'invoicing' ),
442
+            'status'       => __( 'Status', 'invoicing' ),
443
+        );
444
+
445
+        return apply_filters( 'manage_getpaid_subscriptions_table_columns', $columns );
446
+    }
447
+
448
+    /**
449
+     * Sortable table columns.
450
+     *
451
+     * @return array
452
+     */
453
+    public function get_sortable_columns() {
454
+        $sortable = array(
455
+            'subscription' => array( 'id', true ),
456
+            'start_date'   => array( 'created', true ),
457
+            'renewal_date' => array( 'expiration', true ),
458
+            'renewals'     => array( 'bill_times', true ),
459
+            'item'         => array( 'product_id', true ),
460
+            'status'       => array( 'status', true ),
461
+        );
462
+
463
+        return apply_filters( 'manage_getpaid_subscriptions_sortable_table_columns', $sortable );
464
+    }
465
+
466
+    /**
467
+     * Whether the table has items to display or not
468
+     *
469
+     * @return bool
470
+     */
471
+    public function has_items() {
472
+        return ! empty( $this->current_total_count );
473
+    }
474
+
475
+    /**
476
+     * Processes bulk actions.
477
+     *
478
+     */
479
+    public function process_bulk_action() {
480
+
481
+    }
482 482
 
483 483
 }
Please login to merge, or discard this patch.
includes/admin/views/html-gateways-edit.php 1 patch
Indentation   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -44,9 +44,9 @@  discard block
 block discarded – undo
44 44
                         <?php
45 45
 
46 46
                             if ( wpinv_is_gateway_active( $id ) ) {
47
-							echo "<i class='text-success fa fa-check'></i>";
47
+                            echo "<i class='text-success fa fa-check'></i>";
48 48
                             } else {
49
-							echo "<i class='text-dark fa fa-times'></i>";
49
+                            echo "<i class='text-dark fa fa-times'></i>";
50 50
                             }
51 51
 
52 52
                         ?>
@@ -58,9 +58,9 @@  discard block
 block discarded – undo
58 58
                             $supports = apply_filters( 'getapid_gateway_supports_subscription', $supports, $id );
59 59
 
60 60
                             if ( $supports ) {
61
-							echo "<i class='text-success fa fa-check'></i>";
61
+                            echo "<i class='text-success fa fa-check'></i>";
62 62
                             } else {
63
-							echo "<i class='text-dark fa fa-times'></i>";
63
+                            echo "<i class='text-dark fa fa-times'></i>";
64 64
                             }
65 65
 
66 66
                         ?>
Please login to merge, or discard this patch.
includes/admin/views/wizard-plugins.php 1 patch
Indentation   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -27,7 +27,7 @@
 block discarded – undo
27 27
 						<input type="checkbox" name="plugins[<?php echo esc_attr( $plugin['slug'] ); ?>]" value="<?php echo esc_attr( $plugin['file'] ); ?>" class="custom-control-input"  
28 28
                                                                         <?php
29 29
                         if ( is_plugin_active( $plugin['slug'] ) ) {
30
-																								echo 'checked';}
30
+                                                                                                echo 'checked';}
31 31
 ?>
32 32
 >
33 33
 						<label class="custom-control-label" for="ac-setting-updates"></label>
Please login to merge, or discard this patch.
includes/admin/class-getpaid-metaboxes.php 1 patch
Indentation   +236 added lines, -236 removed lines patch added patch discarded remove patch
@@ -12,273 +12,273 @@
 block discarded – undo
12 12
  */
13 13
 class GetPaid_Metaboxes {
14 14
 
15
-	/**
16
-	 * Only save metaboxes once.
17
-	 *
18
-	 * @var boolean
19
-	 */
20
-	private static $saved_meta_boxes = false;
15
+    /**
16
+     * Only save metaboxes once.
17
+     *
18
+     * @var boolean
19
+     */
20
+    private static $saved_meta_boxes = false;
21 21
 
22 22
     /**
23
-	 * Hook in methods.
24
-	 */
25
-	public static function init() {
23
+     * Hook in methods.
24
+     */
25
+    public static function init() {
26 26
 
27
-		// Register metaboxes.
28
-		add_action( 'add_meta_boxes', 'GetPaid_Metaboxes::add_meta_boxes', 5, 2 );
27
+        // Register metaboxes.
28
+        add_action( 'add_meta_boxes', 'GetPaid_Metaboxes::add_meta_boxes', 5, 2 );
29 29
 
30
-		// Remove metaboxes.
31
-		add_action( 'add_meta_boxes', 'GetPaid_Metaboxes::remove_meta_boxes', 30 );
30
+        // Remove metaboxes.
31
+        add_action( 'add_meta_boxes', 'GetPaid_Metaboxes::remove_meta_boxes', 30 );
32 32
 
33
-		// Rename metaboxes.
34
-		add_action( 'add_meta_boxes', 'GetPaid_Metaboxes::rename_meta_boxes', 45 );
33
+        // Rename metaboxes.
34
+        add_action( 'add_meta_boxes', 'GetPaid_Metaboxes::rename_meta_boxes', 45 );
35 35
 
36
-		// Save metaboxes.
37
-		add_action( 'save_post', 'GetPaid_Metaboxes::save_meta_boxes', 1, 2 );
38
-	}
36
+        // Save metaboxes.
37
+        add_action( 'save_post', 'GetPaid_Metaboxes::save_meta_boxes', 1, 2 );
38
+    }
39 39
 
40
-	/**
41
-	 * Register core metaboxes.
42
-	 */
43
-	public static function add_meta_boxes( $post_type, $post ) {
40
+    /**
41
+     * Register core metaboxes.
42
+     */
43
+    public static function add_meta_boxes( $post_type, $post ) {
44 44
 
45
-		// For invoices...
46
-		self::add_invoice_meta_boxes( $post_type, $post );
45
+        // For invoices...
46
+        self::add_invoice_meta_boxes( $post_type, $post );
47 47
 
48
-		// For payment forms.
49
-		self::add_payment_form_meta_boxes( $post_type, $post );
48
+        // For payment forms.
49
+        self::add_payment_form_meta_boxes( $post_type, $post );
50 50
 
51
-		// For invoice items.
52
-		self::add_item_meta_boxes( $post_type );
51
+        // For invoice items.
52
+        self::add_item_meta_boxes( $post_type );
53 53
 
54
-		// For invoice discounts.
55
-		if ( $post_type == 'wpi_discount' ) {
56
-			add_meta_box( 'wpinv_discount_details', __( 'Discount Details', 'invoicing' ), 'GetPaid_Meta_Box_Discount_Details::output', 'wpi_discount', 'normal', 'high' );
57
-		}
54
+        // For invoice discounts.
55
+        if ( $post_type == 'wpi_discount' ) {
56
+            add_meta_box( 'wpinv_discount_details', __( 'Discount Details', 'invoicing' ), 'GetPaid_Meta_Box_Discount_Details::output', 'wpi_discount', 'normal', 'high' );
57
+        }
58 58
 
59
-	}
59
+    }
60 60
 
61
-	/**
62
-	 * Register core metaboxes.
63
-	 */
64
-	protected static function add_payment_form_meta_boxes( $post_type, $post ) {
61
+    /**
62
+     * Register core metaboxes.
63
+     */
64
+    protected static function add_payment_form_meta_boxes( $post_type, $post ) {
65 65
 
66
-		// For payment forms.
67
-		if ( $post_type == 'wpi_payment_form' ) {
66
+        // For payment forms.
67
+        if ( $post_type == 'wpi_payment_form' ) {
68 68
 
69
-			// Design payment form.
70
-			add_meta_box( 'wpinv-payment-form-design', __( 'Payment Form', 'invoicing' ), 'GetPaid_Meta_Box_Payment_Form::output', 'wpi_payment_form', 'normal' );
69
+            // Design payment form.
70
+            add_meta_box( 'wpinv-payment-form-design', __( 'Payment Form', 'invoicing' ), 'GetPaid_Meta_Box_Payment_Form::output', 'wpi_payment_form', 'normal' );
71 71
 
72
-			// Payment form information.
73
-			if ( $post->ID != wpinv_get_default_payment_form() ) {
74
-				add_meta_box( 'wpinv-payment-form-info', __( 'Details', 'invoicing' ), 'GetPaid_Meta_Box_Payment_Form_Info::output', 'wpi_payment_form', 'side' );
75
-			}
72
+            // Payment form information.
73
+            if ( $post->ID != wpinv_get_default_payment_form() ) {
74
+                add_meta_box( 'wpinv-payment-form-info', __( 'Details', 'invoicing' ), 'GetPaid_Meta_Box_Payment_Form_Info::output', 'wpi_payment_form', 'side' );
75
+            }
76 76
 }
77 77
 
78
-	}
79
-
80
-	/**
81
-	 * Register core metaboxes.
82
-	 */
83
-	protected static function add_item_meta_boxes( $post_type ) {
78
+    }
84 79
 
85
-		if ( $post_type == 'wpi_item' ) {
86
-
87
-			// Item details.
88
-			add_meta_box( 'wpinv_item_details', __( 'Item Details', 'invoicing' ), 'GetPaid_Meta_Box_Item_Details::output', 'wpi_item', 'normal', 'high' );
89
-
90
-			// If taxes are enabled, register the tax metabox.
91
-			if ( wpinv_use_taxes() ) {
92
-				add_meta_box( 'wpinv_item_vat', __( 'Tax', 'invoicing' ), 'GetPaid_Meta_Box_Item_VAT::output', 'wpi_item', 'normal', 'high' );
93
-			}
80
+    /**
81
+     * Register core metaboxes.
82
+     */
83
+    protected static function add_item_meta_boxes( $post_type ) {
94 84
 
95
-			// Item info.
96
-			add_meta_box( 'wpinv_field_item_info', __( 'Item info', 'invoicing' ), 'GetPaid_Meta_Box_Item_Info::output', 'wpi_item', 'side', 'core' );
85
+        if ( $post_type == 'wpi_item' ) {
97 86
 
98
-		}
87
+            // Item details.
88
+            add_meta_box( 'wpinv_item_details', __( 'Item Details', 'invoicing' ), 'GetPaid_Meta_Box_Item_Details::output', 'wpi_item', 'normal', 'high' );
99 89
 
100
-	}
90
+            // If taxes are enabled, register the tax metabox.
91
+            if ( wpinv_use_taxes() ) {
92
+                add_meta_box( 'wpinv_item_vat', __( 'Tax', 'invoicing' ), 'GetPaid_Meta_Box_Item_VAT::output', 'wpi_item', 'normal', 'high' );
93
+            }
101 94
 
102
-	/**
103
-	 * Register invoice metaboxes.
104
-	 */
105
-	protected static function add_invoice_meta_boxes( $post_type, $post ) {
95
+            // Item info.
96
+            add_meta_box( 'wpinv_field_item_info', __( 'Item info', 'invoicing' ), 'GetPaid_Meta_Box_Item_Info::output', 'wpi_item', 'side', 'core' );
106 97
 
107
-		// For invoices...
108
-		if ( getpaid_is_invoice_post_type( $post_type ) ) {
109
-			$invoice = new WPInv_Invoice( $post );
98
+        }
110 99
 
111
-			// Resend invoice.
112
-			if ( ! $invoice->is_draft() ) {
100
+    }
113 101
 
114
-				add_meta_box(
115
-					'wpinv-mb-resend-invoice',
116
-					sprintf(
117
-						__( 'Resend %s', 'invoicing' ),
118
-						ucfirst( $invoice->get_invoice_quote_type() )
119
-					),
120
-					'GetPaid_Meta_Box_Resend_Invoice::output',
121
-					$post_type,
122
-					'side',
123
-					'low'
124
-				);
102
+    /**
103
+     * Register invoice metaboxes.
104
+     */
105
+    protected static function add_invoice_meta_boxes( $post_type, $post ) {
106
+
107
+        // For invoices...
108
+        if ( getpaid_is_invoice_post_type( $post_type ) ) {
109
+            $invoice = new WPInv_Invoice( $post );
110
+
111
+            // Resend invoice.
112
+            if ( ! $invoice->is_draft() ) {
113
+
114
+                add_meta_box(
115
+                    'wpinv-mb-resend-invoice',
116
+                    sprintf(
117
+                        __( 'Resend %s', 'invoicing' ),
118
+                        ucfirst( $invoice->get_invoice_quote_type() )
119
+                    ),
120
+                    'GetPaid_Meta_Box_Resend_Invoice::output',
121
+                    $post_type,
122
+                    'side',
123
+                    'low'
124
+                );
125
+
126
+            }
127
+
128
+            // Subscriptions.
129
+            $subscriptions = getpaid_get_invoice_subscriptions( $invoice );
130
+            if ( ! empty( $subscriptions ) ) {
131
+
132
+                if ( is_array( $subscriptions ) ) {
133
+                    add_meta_box( 'wpinv-mb-subscriptions', __( 'Related Subscriptions', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Subscription::output_related', $post_type, 'advanced' );
134
+                } else {
135
+                    add_meta_box( 'wpinv-mb-subscriptions', __( 'Subscription Details', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Subscription::output', $post_type, 'advanced' );
136
+                }
137
+
138
+                if ( getpaid_count_subscription_invoices( $invoice->is_renewal() ? $invoice->get_parent_id() : $invoice->get_id() ) > 1 ) {
139
+                    add_meta_box( 'wpinv-mb-subscription-invoices', __( 'Related Payments', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Subscription::output_invoices', $post_type, 'advanced' );
140
+                }
141
+}
125 142
 
126
-			}
143
+            // Invoice details.
144
+            add_meta_box(
145
+                'wpinv-details',
146
+                sprintf(
147
+                    __( '%s Details', 'invoicing' ),
148
+                    ucfirst( $invoice->get_invoice_quote_type() )
149
+                ),
150
+                'GetPaid_Meta_Box_Invoice_Details::output',
151
+                $post_type,
152
+                'side'
153
+            );
154
+
155
+            // Payment details.
156
+            add_meta_box( 'wpinv-payment-meta', __( 'Payment Meta', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Payment_Meta::output', $post_type, 'side', 'default' );
157
+
158
+            // Billing details.
159
+            add_meta_box( 'wpinv-address', __( 'Billing Details', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Address::output', $post_type, 'normal', 'high' );
160
+
161
+            // Invoice items.
162
+            add_meta_box(
163
+                'wpinv-items',
164
+                sprintf(
165
+                    __( '%s Items', 'invoicing' ),
166
+                    ucfirst( $invoice->get_invoice_quote_type() )
167
+                ),
168
+                'GetPaid_Meta_Box_Invoice_Items::output',
169
+                $post_type,
170
+                'normal',
171
+                'high'
172
+            );
173
+
174
+            // Invoice notes.
175
+            add_meta_box(
176
+                'wpinv-notes',
177
+                sprintf(
178
+                    __( '%s Notes', 'invoicing' ),
179
+                    ucfirst( $invoice->get_invoice_quote_type() )
180
+                ),
181
+                'WPInv_Meta_Box_Notes::output',
182
+                $post_type,
183
+                'side',
184
+                'low'
185
+            );
186
+
187
+            // Shipping Address.
188
+            if ( get_post_meta( $invoice->get_id(), 'shipping_address', true ) ) {
189
+                add_meta_box( 'wpinv-invoice-shipping-details', __( 'Shipping Address', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Shipping_Address::output', $post_type, 'side', 'high' );
190
+            }
191
+
192
+            // Payment form information.
193
+            if ( get_post_meta( $invoice->get_id(), 'payment_form_data', true ) ) {
194
+                add_meta_box( 'wpinv-invoice-payment-form-details', __( 'Payment Form Details', 'invoicing' ), 'WPInv_Meta_Box_Payment_Form::output_details', $post_type, 'side', 'high' );
195
+            }
196
+}
127 197
 
128
-			// Subscriptions.
129
-			$subscriptions = getpaid_get_invoice_subscriptions( $invoice );
130
-			if ( ! empty( $subscriptions ) ) {
198
+    }
131 199
 
132
-				if ( is_array( $subscriptions ) ) {
133
-					add_meta_box( 'wpinv-mb-subscriptions', __( 'Related Subscriptions', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Subscription::output_related', $post_type, 'advanced' );
134
-				} else {
135
-					add_meta_box( 'wpinv-mb-subscriptions', __( 'Subscription Details', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Subscription::output', $post_type, 'advanced' );
136
-				}
200
+    /**
201
+     * Remove some metaboxes.
202
+     */
203
+    public static function remove_meta_boxes() {
204
+        remove_meta_box( 'wpseo_meta', 'wpi_invoice', 'normal' );
205
+    }
137 206
 
138
-				if ( getpaid_count_subscription_invoices( $invoice->is_renewal() ? $invoice->get_parent_id() : $invoice->get_id() ) > 1 ) {
139
-					add_meta_box( 'wpinv-mb-subscription-invoices', __( 'Related Payments', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Subscription::output_invoices', $post_type, 'advanced' );
140
-				}
141
-}
207
+    /**
208
+     * Rename other metaboxes.
209
+     */
210
+    public static function rename_meta_boxes() {
142 211
 
143
-			// Invoice details.
144
-			add_meta_box(
145
-				'wpinv-details',
146
-				sprintf(
147
-					__( '%s Details', 'invoicing' ),
148
-					ucfirst( $invoice->get_invoice_quote_type() )
149
-				),
150
-				'GetPaid_Meta_Box_Invoice_Details::output',
151
-				$post_type,
152
-				'side'
153
-			);
154
-
155
-			// Payment details.
156
-			add_meta_box( 'wpinv-payment-meta', __( 'Payment Meta', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Payment_Meta::output', $post_type, 'side', 'default' );
157
-
158
-			// Billing details.
159
-			add_meta_box( 'wpinv-address', __( 'Billing Details', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Address::output', $post_type, 'normal', 'high' );
160
-
161
-			// Invoice items.
162
-			add_meta_box(
163
-				'wpinv-items',
164
-				sprintf(
165
-					__( '%s Items', 'invoicing' ),
166
-					ucfirst( $invoice->get_invoice_quote_type() )
167
-				),
168
-				'GetPaid_Meta_Box_Invoice_Items::output',
169
-				$post_type,
170
-				'normal',
171
-				'high'
172
-			);
173
-
174
-			// Invoice notes.
175
-			add_meta_box(
176
-				'wpinv-notes',
177
-				sprintf(
178
-					__( '%s Notes', 'invoicing' ),
179
-					ucfirst( $invoice->get_invoice_quote_type() )
180
-				),
181
-				'WPInv_Meta_Box_Notes::output',
182
-				$post_type,
183
-				'side',
184
-				'low'
185
-			);
186
-
187
-			// Shipping Address.
188
-			if ( get_post_meta( $invoice->get_id(), 'shipping_address', true ) ) {
189
-				add_meta_box( 'wpinv-invoice-shipping-details', __( 'Shipping Address', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Shipping_Address::output', $post_type, 'side', 'high' );
190
-			}
191
-
192
-			// Payment form information.
193
-			if ( get_post_meta( $invoice->get_id(), 'payment_form_data', true ) ) {
194
-				add_meta_box( 'wpinv-invoice-payment-form-details', __( 'Payment Form Details', 'invoicing' ), 'WPInv_Meta_Box_Payment_Form::output_details', $post_type, 'side', 'high' );
195
-			}
196
-}
212
+    }
197 213
 
198
-	}
199
-
200
-	/**
201
-	 * Remove some metaboxes.
202
-	 */
203
-	public static function remove_meta_boxes() {
204
-		remove_meta_box( 'wpseo_meta', 'wpi_invoice', 'normal' );
205
-	}
206
-
207
-	/**
208
-	 * Rename other metaboxes.
209
-	 */
210
-	public static function rename_meta_boxes() {
211
-
212
-	}
213
-
214
-	/**
215
-	 * Check if we're saving, then trigger an action based on the post type.
216
-	 *
217
-	 * @param  int    $post_id Post ID.
218
-	 * @param  object $post Post object.
219
-	 */
220
-	public static function save_meta_boxes( $post_id, $post ) {
221
-		$post_id = absint( $post_id );
222
-		$data    = wp_kses_post_deep( wp_unslash( $_POST ) );
223
-
224
-		// Do not save for ajax requests.
225
-		if ( ( defined( 'DOING_AJAX' ) && DOING_AJAX ) || isset( $_REQUEST['bulk_edit'] ) ) {
226
-			return;
227
-		}
228
-
229
-		// $post_id and $post are required
230
-		if ( empty( $post_id ) || empty( $post ) || self::$saved_meta_boxes ) {
231
-			return;
232
-		}
233
-
234
-		// Dont' save meta boxes for revisions or autosaves.
235
-		if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || is_int( wp_is_post_revision( $post ) ) || is_int( wp_is_post_autosave( $post ) ) ) {
236
-			return;
237
-		}
238
-
239
-		// Check the nonce.
240
-		if ( empty( $data['getpaid_meta_nonce'] ) || ! wp_verify_nonce( $data['getpaid_meta_nonce'], 'getpaid_meta_nonce' ) ) {
241
-			return;
242
-		}
243
-
244
-		// Check the post being saved == the $post_id to prevent triggering this call for other save_post events.
245
-		if ( empty( $data['post_ID'] ) || absint( $data['post_ID'] ) !== $post_id ) {
246
-			return;
247
-		}
248
-
249
-		// Check user has permission to edit.
250
-		if ( ! current_user_can( 'edit_post', $post_id ) ) {
251
-			return;
252
-		}
253
-
254
-		if ( getpaid_is_invoice_post_type( $post->post_type ) ) {
255
-
256
-			// We need this save event to run once to avoid potential endless loops.
257
-			self::$saved_meta_boxes = true;
258
-
259
-			return GetPaid_Meta_Box_Invoice_Address::save( $post_id );
260
-
261
-		}
262
-
263
-		// Ensure this is our post type.
264
-		$post_types_map = array(
265
-			'wpi_item'         => 'GetPaid_Meta_Box_Item_Details',
266
-			'wpi_payment_form' => 'GetPaid_Meta_Box_Payment_Form',
267
-			'wpi_discount'     => 'GetPaid_Meta_Box_Discount_Details',
268
-		);
269
-
270
-		// Is this our post type?
271
-		if ( ! isset( $post_types_map[ $post->post_type ] ) ) {
272
-			return;
273
-		}
274
-
275
-		// We need this save event to run once to avoid potential endless loops.
276
-		self::$saved_meta_boxes = true;
277
-
278
-		// Save the post.
279
-		$class = $post_types_map[ $post->post_type ];
280
-		$class::save( $post_id, wp_kses_post_deep( $_POST ), $post );
281
-
282
-	}
214
+    /**
215
+     * Check if we're saving, then trigger an action based on the post type.
216
+     *
217
+     * @param  int    $post_id Post ID.
218
+     * @param  object $post Post object.
219
+     */
220
+    public static function save_meta_boxes( $post_id, $post ) {
221
+        $post_id = absint( $post_id );
222
+        $data    = wp_kses_post_deep( wp_unslash( $_POST ) );
223
+
224
+        // Do not save for ajax requests.
225
+        if ( ( defined( 'DOING_AJAX' ) && DOING_AJAX ) || isset( $_REQUEST['bulk_edit'] ) ) {
226
+            return;
227
+        }
228
+
229
+        // $post_id and $post are required
230
+        if ( empty( $post_id ) || empty( $post ) || self::$saved_meta_boxes ) {
231
+            return;
232
+        }
233
+
234
+        // Dont' save meta boxes for revisions or autosaves.
235
+        if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || is_int( wp_is_post_revision( $post ) ) || is_int( wp_is_post_autosave( $post ) ) ) {
236
+            return;
237
+        }
238
+
239
+        // Check the nonce.
240
+        if ( empty( $data['getpaid_meta_nonce'] ) || ! wp_verify_nonce( $data['getpaid_meta_nonce'], 'getpaid_meta_nonce' ) ) {
241
+            return;
242
+        }
243
+
244
+        // Check the post being saved == the $post_id to prevent triggering this call for other save_post events.
245
+        if ( empty( $data['post_ID'] ) || absint( $data['post_ID'] ) !== $post_id ) {
246
+            return;
247
+        }
248
+
249
+        // Check user has permission to edit.
250
+        if ( ! current_user_can( 'edit_post', $post_id ) ) {
251
+            return;
252
+        }
253
+
254
+        if ( getpaid_is_invoice_post_type( $post->post_type ) ) {
255
+
256
+            // We need this save event to run once to avoid potential endless loops.
257
+            self::$saved_meta_boxes = true;
258
+
259
+            return GetPaid_Meta_Box_Invoice_Address::save( $post_id );
260
+
261
+        }
262
+
263
+        // Ensure this is our post type.
264
+        $post_types_map = array(
265
+            'wpi_item'         => 'GetPaid_Meta_Box_Item_Details',
266
+            'wpi_payment_form' => 'GetPaid_Meta_Box_Payment_Form',
267
+            'wpi_discount'     => 'GetPaid_Meta_Box_Discount_Details',
268
+        );
269
+
270
+        // Is this our post type?
271
+        if ( ! isset( $post_types_map[ $post->post_type ] ) ) {
272
+            return;
273
+        }
274
+
275
+        // We need this save event to run once to avoid potential endless loops.
276
+        self::$saved_meta_boxes = true;
277
+
278
+        // Save the post.
279
+        $class = $post_types_map[ $post->post_type ];
280
+        $class::save( $post_id, wp_kses_post_deep( $_POST ), $post );
281
+
282
+    }
283 283
 
284 284
 }
Please login to merge, or discard this patch.
admin/meta-boxes/class-getpaid-meta-box-invoice-shipping-address.php 1 patch
Indentation   +34 added lines, -34 removed lines patch added patch discarded remove patch
@@ -7,7 +7,7 @@  discard block
 block discarded – undo
7 7
  */
8 8
 
9 9
 if ( ! defined( 'ABSPATH' ) ) {
10
-	exit; // Exit if accessed directly
10
+    exit; // Exit if accessed directly
11 11
 }
12 12
 
13 13
 /**
@@ -15,22 +15,22 @@  discard block
 block discarded – undo
15 15
  */
16 16
 class GetPaid_Meta_Box_Invoice_Shipping_Address {
17 17
 
18
-	/**
19
-	 * Output the metabox.
20
-	 *
21
-	 * @param WP_Post $post
22
-	 */
23
-	public static function output( $post ) {
18
+    /**
19
+     * Output the metabox.
20
+     *
21
+     * @param WP_Post $post
22
+     */
23
+    public static function output( $post ) {
24 24
 
25
-		// Retrieve shipping address.
26
-		$shipping_address = get_post_meta( $post->ID, 'shipping_address', true );
25
+        // Retrieve shipping address.
26
+        $shipping_address = get_post_meta( $post->ID, 'shipping_address', true );
27 27
 
28
-		// Abort if it is invalid.
29
-		if ( ! is_array( $shipping_address ) ) {
30
-			return;
31
-		}
28
+        // Abort if it is invalid.
29
+        if ( ! is_array( $shipping_address ) ) {
30
+            return;
31
+        }
32 32
 
33
-		?>
33
+        ?>
34 34
 
35 35
 		<div class="bsui">
36 36
 
@@ -68,31 +68,31 @@  discard block
 block discarded – undo
68 68
 
69 69
 		<?php
70 70
 
71
-	}
71
+    }
72 72
 
73
-	/**
74
-	 * Prepares a value.
75
-	 *
76
-	 * @param array $address
77
-	 * @param string $key
78
-	 * @return string
79
-	 */
80
-	public static function prepare_for_display( $address, $key ) {
73
+    /**
74
+     * Prepares a value.
75
+     *
76
+     * @param array $address
77
+     * @param string $key
78
+     * @return string
79
+     */
80
+    public static function prepare_for_display( $address, $key ) {
81 81
 
82
-		// Prepare the value.
83
-		$value = $address[ $key ];
82
+        // Prepare the value.
83
+        $value = $address[ $key ];
84 84
 
85
-		if ( $key == 'country' ) {
86
-			$value = wpinv_country_name( $value );
87
-		}
85
+        if ( $key == 'country' ) {
86
+            $value = wpinv_country_name( $value );
87
+        }
88 88
 
89
-		if ( $key == 'state' ) {
90
-			$country = isset( $address['country'] ) ? $address['country'] : wpinv_get_default_country();
91
-			$value = wpinv_state_name( $value, $country );
92
-		}
89
+        if ( $key == 'state' ) {
90
+            $country = isset( $address['country'] ) ? $address['country'] : wpinv_get_default_country();
91
+            $value = wpinv_state_name( $value, $country );
92
+        }
93 93
 
94
-		return esc_html( $value );
94
+        return esc_html( $value );
95 95
 
96
-	}
96
+    }
97 97
 
98 98
 }
Please login to merge, or discard this patch.
includes/admin/meta-boxes/class-getpaid-meta-box-discount-details.php 1 patch
Indentation   +26 added lines, -26 removed lines patch added patch discarded remove patch
@@ -8,7 +8,7 @@  discard block
 block discarded – undo
8 8
  */
9 9
 
10 10
 if ( ! defined( 'ABSPATH' ) ) {
11
-	exit; // Exit if accessed directly
11
+    exit; // Exit if accessed directly
12 12
 }
13 13
 
14 14
 /**
@@ -17,10 +17,10 @@  discard block
 block discarded – undo
17 17
 class GetPaid_Meta_Box_Discount_Details {
18 18
 
19 19
     /**
20
-	 * Output the metabox.
21
-	 *
22
-	 * @param WP_Post $post
23
-	 */
20
+     * Output the metabox.
21
+     *
22
+     * @param WP_Post $post
23
+     */
24 24
     public static function output( $post ) {
25 25
 
26 26
         // Prepare the discount.
@@ -396,35 +396,35 @@  discard block
 block discarded – undo
396 396
     }
397 397
 
398 398
     /**
399
-	 * Save meta box data.
400
-	 *
401
-	 * @param int $post_id
402
-	 */
403
-	public static function save( $post_id ) {
399
+     * Save meta box data.
400
+     *
401
+     * @param int $post_id
402
+     */
403
+    public static function save( $post_id ) {
404 404
 
405 405
         // Prepare the discount.
406 406
         $discount = new WPInv_Discount( $post_id );
407 407
 
408 408
         // Load new data.
409 409
         $discount->set_props(
410
-			array(
411
-				'code'           => isset( $_POST['wpinv_discount_code'] ) ? wpinv_clean( $_POST['wpinv_discount_code'] ) : null,
412
-				'amount'         => isset( $_POST['wpinv_discount_amount'] ) ? floatval( $_POST['wpinv_discount_amount'] ) : null,
413
-				'start'          => isset( $_POST['wpinv_discount_start'] ) ? wpinv_clean( $_POST['wpinv_discount_start'] ) : null,
414
-				'expiration'     => isset( $_POST['wpinv_discount_expiration'] ) ? wpinv_clean( $_POST['wpinv_discount_expiration'] ) : null,
415
-				'is_single_use'  => ! empty( $_POST['wpinv_discount_single_use'] ),
410
+            array(
411
+                'code'           => isset( $_POST['wpinv_discount_code'] ) ? wpinv_clean( $_POST['wpinv_discount_code'] ) : null,
412
+                'amount'         => isset( $_POST['wpinv_discount_amount'] ) ? floatval( $_POST['wpinv_discount_amount'] ) : null,
413
+                'start'          => isset( $_POST['wpinv_discount_start'] ) ? wpinv_clean( $_POST['wpinv_discount_start'] ) : null,
414
+                'expiration'     => isset( $_POST['wpinv_discount_expiration'] ) ? wpinv_clean( $_POST['wpinv_discount_expiration'] ) : null,
415
+                'is_single_use'  => ! empty( $_POST['wpinv_discount_single_use'] ),
416 416
                 'type'           => isset( $_POST['wpinv_discount_type'] ) ? wpinv_clean( $_POST['wpinv_discount_type'] ) : null,
417
-				'is_recurring'   => ! empty( $_POST['wpinv_discount_recurring'] ),
418
-				'items'          => isset( $_POST['wpinv_discount_items'] ) ? wpinv_clean( $_POST['wpinv_discount_items'] ) : array(),
419
-				'excluded_items' => isset( $_POST['wpinv_discount_excluded_items'] ) ? wpinv_clean( $_POST['wpinv_discount_excluded_items'] ) : array(),
417
+                'is_recurring'   => ! empty( $_POST['wpinv_discount_recurring'] ),
418
+                'items'          => isset( $_POST['wpinv_discount_items'] ) ? wpinv_clean( $_POST['wpinv_discount_items'] ) : array(),
419
+                'excluded_items' => isset( $_POST['wpinv_discount_excluded_items'] ) ? wpinv_clean( $_POST['wpinv_discount_excluded_items'] ) : array(),
420 420
                 'required_items' => isset( $_POST['wpinv_discount_required_items'] ) ? wpinv_clean( $_POST['wpinv_discount_required_items'] ) : array(),
421
-				'max_uses'       => isset( $_POST['wpinv_discount_max_uses'] ) ? intval( $_POST['wpinv_discount_max_uses'] ) : null,
422
-				'min_total'      => isset( $_POST['wpinv_discount_min_total'] ) ? floatval( $_POST['wpinv_discount_min_total'] ) : null,
423
-				'max_total'      => isset( $_POST['wpinv_discount_max_total'] ) ? floatval( $_POST['wpinv_discount_max_total'] ) : null,
424
-			)
421
+                'max_uses'       => isset( $_POST['wpinv_discount_max_uses'] ) ? intval( $_POST['wpinv_discount_max_uses'] ) : null,
422
+                'min_total'      => isset( $_POST['wpinv_discount_min_total'] ) ? floatval( $_POST['wpinv_discount_min_total'] ) : null,
423
+                'max_total'      => isset( $_POST['wpinv_discount_max_total'] ) ? floatval( $_POST['wpinv_discount_max_total'] ) : null,
424
+            )
425 425
         );
426 426
 
427
-		$discount->save();
428
-		do_action( 'getpaid_discount_metabox_save', $post_id, $discount );
429
-	}
427
+        $discount->save();
428
+        do_action( 'getpaid_discount_metabox_save', $post_id, $discount );
429
+    }
430 430
 }
Please login to merge, or discard this patch.
includes/admin/class-wpinv-customers-table.php 1 patch
Indentation   +362 added lines, -362 removed lines patch added patch discarded remove patch
@@ -11,7 +11,7 @@  discard block
 block discarded – undo
11 11
 
12 12
 // Load WP_List_Table if not loaded
13 13
 if ( ! class_exists( 'WP_List_Table' ) ) {
14
-	require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
14
+    require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
15 15
 }
16 16
 
17 17
 /**
@@ -23,369 +23,369 @@  discard block
 block discarded – undo
23 23
  */
24 24
 class WPInv_Customers_Table extends WP_List_Table {
25 25
 
26
-	/**
27
-	 * @var int Number of items per page
28
-	 * @since 1.0.19
29
-	 */
30
-	public $per_page = 10;
31
-
32
-	/**
33
-	 * @var int Number of items
34
-	 * @since 1.0.19
35
-	 */
36
-	public $total = 0;
37
-
38
-	/**
39
-	 * Get things started
40
-	 *
41
-	 * @since 1.0.19
42
-	 * @see WP_List_Table::__construct()
43
-	 */
44
-	public function __construct() {
45
-
46
-		// Set parent defaults
47
-		parent::__construct(
26
+    /**
27
+     * @var int Number of items per page
28
+     * @since 1.0.19
29
+     */
30
+    public $per_page = 10;
31
+
32
+    /**
33
+     * @var int Number of items
34
+     * @since 1.0.19
35
+     */
36
+    public $total = 0;
37
+
38
+    /**
39
+     * Get things started
40
+     *
41
+     * @since 1.0.19
42
+     * @see WP_List_Table::__construct()
43
+     */
44
+    public function __construct() {
45
+
46
+        // Set parent defaults
47
+        parent::__construct(
48 48
             array(
49
-				'singular' => 'id',
50
-				'plural'   => 'ids',
51
-				'ajax'     => false,
49
+                'singular' => 'id',
50
+                'plural'   => 'ids',
51
+                'ajax'     => false,
52 52
             )
53 53
         );
54 54
 
55
-	}
56
-
57
-	/**
58
-	 * Gets the name of the primary column.
59
-	 *
60
-	 * @since 1.0.19
61
-	 * @access protected
62
-	 *
63
-	 * @return string Name of the primary column.
64
-	 */
65
-	protected function get_primary_column_name() {
66
-		return 'name';
67
-	}
68
-
69
-	/**
70
-	 * This function renders most of the columns in the list table.
71
-	 *
72
-	 * @since 1.0.19
73
-	 *
74
-	 * @param WP_User $item
75
-	 * @param string $column_name The name of the column
76
-	 *
77
-	 * @return string Column Name
78
-	 */
79
-	public function column_default( $item, $column_name ) {
80
-		$value = esc_html( get_user_meta( $item->ID, '_wpinv_' . $column_name, true ) );
81
-		return apply_filters( 'wpinv_customers_table_column' . $column_name, $value, $item );
82
-	}
83
-
84
-	/**
85
-	 * Displays the country column.
86
-	 *
87
-	 * @since 1.0.19
88
-	 *
89
-	 * @param WP_User $user
90
-	 *
91
-	 * @return string Column Name
92
-	 */
93
-	public function column_country( $user ) {
94
-		$country = wpinv_sanitize_country( $user->_wpinv_country );
95
-		if ( $country ) {
96
-			$country = wpinv_country_name( $country );
97
-		}
98
-		return esc_html( $country );
99
-	}
100
-
101
-	/**
102
-	 * Displays the state column.
103
-	 *
104
-	 * @since 1.0.19
105
-	 *
106
-	 * @param WP_User $user
107
-	 *
108
-	 * @return string Column Name
109
-	 */
110
-	public function column_state( $user ) {
111
-		$country = wpinv_sanitize_country( $user->_wpinv_country );
112
-		$state   = $user->_wpinv_state;
113
-		if ( $state ) {
114
-			$state = wpinv_state_name( $state, $country );
115
-		}
116
-
117
-		return esc_html( $state );
118
-	}
119
-
120
-	/**
121
-	 * Displays the signup column.
122
-	 *
123
-	 * @since 1.0.19
124
-	 *
125
-	 * @param WP_User $user
126
-	 *
127
-	 * @return string Column Name
128
-	 */
129
-	public function column_signup( $user ) {
130
-		return getpaid_format_date_value( $user->user_registered );
131
-	}
132
-
133
-	/**
134
-	 * Displays the total spent column.
135
-	 *
136
-	 * @since 1.0.19
137
-	 *
138
-	 * @param WP_User $user
139
-	 *
140
-	 * @return string Column Name
141
-	 */
142
-	public function column_total( $user ) {
143
-		return wpinv_price( $this->column_total_raw( $user ) );
144
-	}
145
-
146
-	/**
147
-	 * Displays the total spent column.
148
-	 *
149
-	 * @since 1.0.19
150
-	 *
151
-	 * @param WP_User $user
152
-	 *
153
-	 * @return float
154
-	 */
155
-	public function column_total_raw( $user ) {
156
-
157
-		$args = array(
158
-			'data'           => array(
159
-
160
-				'total' => array(
161
-					'type'     => 'invoice_data',
162
-					'function' => 'SUM',
163
-					'name'     => 'total_sales',
164
-				),
165
-
166
-			),
167
-			'where'          => array(
168
-
169
-				'author' => array(
170
-					'type'     => 'post_data',
171
-					'value'    => absint( $user->ID ),
172
-					'key'      => 'posts.post_author',
173
-					'operator' => '=',
174
-				),
175
-
176
-			),
177
-			'query_type'     => 'get_var',
178
-			'invoice_status' => array( 'wpi-renewal', 'wpi-processing', 'publish' ),
179
-		);
180
-
181
-		return wpinv_round_amount( GetPaid_Reports_Helper::get_invoice_report_data( $args ) );
182
-
183
-	}
184
-
185
-	/**
186
-	 * Displays the total spent column.
187
-	 *
188
-	 * @since 1.0.19
189
-	 *
190
-	 * @param WP_User $user
191
-	 *
192
-	 * @return string Column Name
193
-	 */
194
-	public function column_invoices( $user ) {
195
-
196
-		$args = array(
197
-			'data'           => array(
198
-
199
-				'ID' => array(
200
-					'type'     => 'post_data',
201
-					'function' => 'COUNT',
202
-					'name'     => 'count',
203
-					'distinct' => true,
204
-				),
205
-
206
-			),
207
-			'where'          => array(
208
-
209
-				'author' => array(
210
-					'type'     => 'post_data',
211
-					'value'    => absint( $user->ID ),
212
-					'key'      => 'posts.post_author',
213
-					'operator' => '=',
214
-				),
215
-
216
-			),
217
-			'query_type'     => 'get_var',
218
-			'invoice_status' => array_keys( wpinv_get_invoice_statuses() ),
219
-		);
220
-
221
-		return absint( GetPaid_Reports_Helper::get_invoice_report_data( $args ) );
222
-
223
-	}
224
-
225
-	/**
226
-	 * Generates content for a single row of the table
227
-	 * @since 1.0.19
228
-	 *
229
-	 * @param int $item The user id.
230
-	 */
231
-	public function single_row( $item ) {
232
-		$item = get_user_by( 'id', $item );
233
-
234
-		if ( empty( $item ) ) {
235
-			return;
236
-		}
237
-
238
-		echo '<tr>';
239
-		$this->single_row_columns( $item );
240
-		echo '</tr>';
241
-	}
242
-
243
-	/**
244
-	 * Displays the customers name
245
-	 *
246
-	 * @param  WP_User $customer customer.
247
-	 * @return string
248
-	 */
249
-	public function column_name( $customer ) {
250
-
251
-		// Customer view URL.
252
-		$view_url    = esc_url( add_query_arg( 'user_id', $customer->ID, admin_url( 'user-edit.php' ) ) );
253
-		$row_actions = $this->row_actions(
254
-			array(
255
-				'view' => '<a href="' . $view_url . '#getpaid-fieldset-billing">' . __( 'Edit Details', 'invoicing' ) . '</a>',
256
-			)
257
-		);
258
-
259
-		// Get user's address.
260
-		$address = wpinv_get_user_address( $customer->ID );
261
-
262
-		// Customer email address.
263
-		$email       = sanitize_email( $customer->user_email );
264
-
265
-		// Customer's avatar.
266
-		$avatar = esc_url( get_avatar_url( $email ) );
267
-		$avatar = "<img src='$avatar' height='32' width='32'/>";
268
-
269
-		// Customer's name.
270
-		$name   = esc_html( "{$address['first_name']} {$address['last_name']}" );
271
-
272
-		if ( ! empty( $name ) ) {
273
-			$name = "<div style='overflow: hidden;height: 18px;'>$name</div>";
274
-		}
275
-
276
-		$email = "<div class='row-title'><a href='$view_url'>$email</a></div>";
277
-
278
-		return "<div style='display: flex;'><div>$avatar</div><div style='margin-left: 10px;'>$name<strong>$email</strong>$row_actions</div></div>";
279
-
280
-	}
281
-
282
-	/**
283
-	 * Retrieve the table columns
284
-	 *
285
-	 * @since 1.0.19
286
-	 * @return array $columns Array of all the list table columns
287
-	 */
288
-	public function get_columns() {
289
-
290
-		$columns = array(
291
-			'name'     => __( 'Name', 'invoicing' ),
292
-			'country'  => __( 'Country', 'invoicing' ),
293
-			'state'    => __( 'State', 'invoicing' ),
294
-			'city'     => __( 'City', 'invoicing' ),
295
-			'zip'      => __( 'ZIP', 'invoicing' ),
296
-			'address'  => __( 'Address', 'invoicing' ),
297
-			'phone'    => __( 'Phone', 'invoicing' ),
298
-			'company'  => __( 'Company', 'invoicing' ),
299
-			'invoices' => __( 'Invoices', 'invoicing' ),
300
-			'total'    => __( 'Total Spend', 'invoicing' ),
301
-			'signup'   => __( 'Date created', 'invoicing' ),
302
-		);
303
-		return apply_filters( 'wpinv_customers_table_columns', $columns );
304
-
305
-	}
306
-
307
-	/**
308
-	 * Retrieve the current page number
309
-	 *
310
-	 * @since 1.0.19
311
-	 * @return int Current page number
312
-	 */
313
-	public function get_paged() {
314
-		return isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
315
-	}
316
-
317
-	/**
318
-	 * Returns bulk actions.
319
-	 *
320
-	 * @since 1.0.19
321
-	 * @return void
322
-	 */
323
-	public function bulk_actions( $which = '' ) {
324
-		return array();
325
-	}
326
-
327
-	/**
328
-	 *  Prepares the display query
329
-	 */
330
-	public function prepare_query() {
331
-		global $wpdb;
332
-
333
-		$post_types = '';
334
-
335
-		foreach ( array_keys( getpaid_get_invoice_post_types() ) as $post_type ) {
336
-			$post_types .= $wpdb->prepare( 'post_type=%s OR ', $post_type );
337
-		}
338
-
339
-		$post_types = rtrim( $post_types, ' OR' );
340
-
341
-		// Maybe search.
342
-		if ( ! empty( $_POST['s'] ) ) {
343
-			$users = get_users(
344
-				array(
345
-					'search'         => '*' . sanitize_text_field( urldecode( $_POST['s'] ) ) . '*',
346
-					'search_columns' => array( 'user_login', 'user_email', 'display_name' ),
347
-					'fields'         => 'ID',
348
-				)
349
-			);
350
-
351
-			$users      = implode( ', ', $users );
352
-			$post_types = "($post_types) AND ( post_author IN ( $users ) )";
353
-		}
354
-
355
-		// Users with invoices.
356
-    	$customers = $wpdb->get_col(
357
-			$wpdb->prepare(
358
-				"SELECT DISTINCT( post_author ) FROM $wpdb->posts WHERE $post_types LIMIT %d,%d",
359
-				$this->get_paged() * 10 - 10,
360
-				$this->per_page
361
-			)
362
-		);
363
-
364
-		$this->items = $customers;
365
-		$this->total = (int) $wpdb->get_var( "SELECT COUNT( DISTINCT( post_author ) ) FROM $wpdb->posts WHERE $post_types" );
366
-
367
-	}
368
-
369
-	/**
370
-	 * Setup the final data for the table
371
-	 *
372
-	 * @since 1.0.19
373
-	 * @return void
374
-	 */
375
-	public function prepare_items() {
376
-		$columns               = $this->get_columns();
377
-		$hidden                = array(); // No hidden columns
378
-		$sortable              = $this->get_sortable_columns();
379
-		$this->_column_headers = array( $columns, $hidden, $sortable );
380
-		$this->prepare_query();
381
-
382
-		$this->set_pagination_args(
383
-			array(
384
-				'total_items' => $this->total,
385
-				'per_page'    => $this->per_page,
386
-				'total_pages' => ceil( $this->total / $this->per_page ),
387
-			)
388
-		);
389
-
390
-	}
55
+    }
56
+
57
+    /**
58
+     * Gets the name of the primary column.
59
+     *
60
+     * @since 1.0.19
61
+     * @access protected
62
+     *
63
+     * @return string Name of the primary column.
64
+     */
65
+    protected function get_primary_column_name() {
66
+        return 'name';
67
+    }
68
+
69
+    /**
70
+     * This function renders most of the columns in the list table.
71
+     *
72
+     * @since 1.0.19
73
+     *
74
+     * @param WP_User $item
75
+     * @param string $column_name The name of the column
76
+     *
77
+     * @return string Column Name
78
+     */
79
+    public function column_default( $item, $column_name ) {
80
+        $value = esc_html( get_user_meta( $item->ID, '_wpinv_' . $column_name, true ) );
81
+        return apply_filters( 'wpinv_customers_table_column' . $column_name, $value, $item );
82
+    }
83
+
84
+    /**
85
+     * Displays the country column.
86
+     *
87
+     * @since 1.0.19
88
+     *
89
+     * @param WP_User $user
90
+     *
91
+     * @return string Column Name
92
+     */
93
+    public function column_country( $user ) {
94
+        $country = wpinv_sanitize_country( $user->_wpinv_country );
95
+        if ( $country ) {
96
+            $country = wpinv_country_name( $country );
97
+        }
98
+        return esc_html( $country );
99
+    }
100
+
101
+    /**
102
+     * Displays the state column.
103
+     *
104
+     * @since 1.0.19
105
+     *
106
+     * @param WP_User $user
107
+     *
108
+     * @return string Column Name
109
+     */
110
+    public function column_state( $user ) {
111
+        $country = wpinv_sanitize_country( $user->_wpinv_country );
112
+        $state   = $user->_wpinv_state;
113
+        if ( $state ) {
114
+            $state = wpinv_state_name( $state, $country );
115
+        }
116
+
117
+        return esc_html( $state );
118
+    }
119
+
120
+    /**
121
+     * Displays the signup column.
122
+     *
123
+     * @since 1.0.19
124
+     *
125
+     * @param WP_User $user
126
+     *
127
+     * @return string Column Name
128
+     */
129
+    public function column_signup( $user ) {
130
+        return getpaid_format_date_value( $user->user_registered );
131
+    }
132
+
133
+    /**
134
+     * Displays the total spent column.
135
+     *
136
+     * @since 1.0.19
137
+     *
138
+     * @param WP_User $user
139
+     *
140
+     * @return string Column Name
141
+     */
142
+    public function column_total( $user ) {
143
+        return wpinv_price( $this->column_total_raw( $user ) );
144
+    }
145
+
146
+    /**
147
+     * Displays the total spent column.
148
+     *
149
+     * @since 1.0.19
150
+     *
151
+     * @param WP_User $user
152
+     *
153
+     * @return float
154
+     */
155
+    public function column_total_raw( $user ) {
156
+
157
+        $args = array(
158
+            'data'           => array(
159
+
160
+                'total' => array(
161
+                    'type'     => 'invoice_data',
162
+                    'function' => 'SUM',
163
+                    'name'     => 'total_sales',
164
+                ),
165
+
166
+            ),
167
+            'where'          => array(
168
+
169
+                'author' => array(
170
+                    'type'     => 'post_data',
171
+                    'value'    => absint( $user->ID ),
172
+                    'key'      => 'posts.post_author',
173
+                    'operator' => '=',
174
+                ),
175
+
176
+            ),
177
+            'query_type'     => 'get_var',
178
+            'invoice_status' => array( 'wpi-renewal', 'wpi-processing', 'publish' ),
179
+        );
180
+
181
+        return wpinv_round_amount( GetPaid_Reports_Helper::get_invoice_report_data( $args ) );
182
+
183
+    }
184
+
185
+    /**
186
+     * Displays the total spent column.
187
+     *
188
+     * @since 1.0.19
189
+     *
190
+     * @param WP_User $user
191
+     *
192
+     * @return string Column Name
193
+     */
194
+    public function column_invoices( $user ) {
195
+
196
+        $args = array(
197
+            'data'           => array(
198
+
199
+                'ID' => array(
200
+                    'type'     => 'post_data',
201
+                    'function' => 'COUNT',
202
+                    'name'     => 'count',
203
+                    'distinct' => true,
204
+                ),
205
+
206
+            ),
207
+            'where'          => array(
208
+
209
+                'author' => array(
210
+                    'type'     => 'post_data',
211
+                    'value'    => absint( $user->ID ),
212
+                    'key'      => 'posts.post_author',
213
+                    'operator' => '=',
214
+                ),
215
+
216
+            ),
217
+            'query_type'     => 'get_var',
218
+            'invoice_status' => array_keys( wpinv_get_invoice_statuses() ),
219
+        );
220
+
221
+        return absint( GetPaid_Reports_Helper::get_invoice_report_data( $args ) );
222
+
223
+    }
224
+
225
+    /**
226
+     * Generates content for a single row of the table
227
+     * @since 1.0.19
228
+     *
229
+     * @param int $item The user id.
230
+     */
231
+    public function single_row( $item ) {
232
+        $item = get_user_by( 'id', $item );
233
+
234
+        if ( empty( $item ) ) {
235
+            return;
236
+        }
237
+
238
+        echo '<tr>';
239
+        $this->single_row_columns( $item );
240
+        echo '</tr>';
241
+    }
242
+
243
+    /**
244
+     * Displays the customers name
245
+     *
246
+     * @param  WP_User $customer customer.
247
+     * @return string
248
+     */
249
+    public function column_name( $customer ) {
250
+
251
+        // Customer view URL.
252
+        $view_url    = esc_url( add_query_arg( 'user_id', $customer->ID, admin_url( 'user-edit.php' ) ) );
253
+        $row_actions = $this->row_actions(
254
+            array(
255
+                'view' => '<a href="' . $view_url . '#getpaid-fieldset-billing">' . __( 'Edit Details', 'invoicing' ) . '</a>',
256
+            )
257
+        );
258
+
259
+        // Get user's address.
260
+        $address = wpinv_get_user_address( $customer->ID );
261
+
262
+        // Customer email address.
263
+        $email       = sanitize_email( $customer->user_email );
264
+
265
+        // Customer's avatar.
266
+        $avatar = esc_url( get_avatar_url( $email ) );
267
+        $avatar = "<img src='$avatar' height='32' width='32'/>";
268
+
269
+        // Customer's name.
270
+        $name   = esc_html( "{$address['first_name']} {$address['last_name']}" );
271
+
272
+        if ( ! empty( $name ) ) {
273
+            $name = "<div style='overflow: hidden;height: 18px;'>$name</div>";
274
+        }
275
+
276
+        $email = "<div class='row-title'><a href='$view_url'>$email</a></div>";
277
+
278
+        return "<div style='display: flex;'><div>$avatar</div><div style='margin-left: 10px;'>$name<strong>$email</strong>$row_actions</div></div>";
279
+
280
+    }
281
+
282
+    /**
283
+     * Retrieve the table columns
284
+     *
285
+     * @since 1.0.19
286
+     * @return array $columns Array of all the list table columns
287
+     */
288
+    public function get_columns() {
289
+
290
+        $columns = array(
291
+            'name'     => __( 'Name', 'invoicing' ),
292
+            'country'  => __( 'Country', 'invoicing' ),
293
+            'state'    => __( 'State', 'invoicing' ),
294
+            'city'     => __( 'City', 'invoicing' ),
295
+            'zip'      => __( 'ZIP', 'invoicing' ),
296
+            'address'  => __( 'Address', 'invoicing' ),
297
+            'phone'    => __( 'Phone', 'invoicing' ),
298
+            'company'  => __( 'Company', 'invoicing' ),
299
+            'invoices' => __( 'Invoices', 'invoicing' ),
300
+            'total'    => __( 'Total Spend', 'invoicing' ),
301
+            'signup'   => __( 'Date created', 'invoicing' ),
302
+        );
303
+        return apply_filters( 'wpinv_customers_table_columns', $columns );
304
+
305
+    }
306
+
307
+    /**
308
+     * Retrieve the current page number
309
+     *
310
+     * @since 1.0.19
311
+     * @return int Current page number
312
+     */
313
+    public function get_paged() {
314
+        return isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
315
+    }
316
+
317
+    /**
318
+     * Returns bulk actions.
319
+     *
320
+     * @since 1.0.19
321
+     * @return void
322
+     */
323
+    public function bulk_actions( $which = '' ) {
324
+        return array();
325
+    }
326
+
327
+    /**
328
+     *  Prepares the display query
329
+     */
330
+    public function prepare_query() {
331
+        global $wpdb;
332
+
333
+        $post_types = '';
334
+
335
+        foreach ( array_keys( getpaid_get_invoice_post_types() ) as $post_type ) {
336
+            $post_types .= $wpdb->prepare( 'post_type=%s OR ', $post_type );
337
+        }
338
+
339
+        $post_types = rtrim( $post_types, ' OR' );
340
+
341
+        // Maybe search.
342
+        if ( ! empty( $_POST['s'] ) ) {
343
+            $users = get_users(
344
+                array(
345
+                    'search'         => '*' . sanitize_text_field( urldecode( $_POST['s'] ) ) . '*',
346
+                    'search_columns' => array( 'user_login', 'user_email', 'display_name' ),
347
+                    'fields'         => 'ID',
348
+                )
349
+            );
350
+
351
+            $users      = implode( ', ', $users );
352
+            $post_types = "($post_types) AND ( post_author IN ( $users ) )";
353
+        }
354
+
355
+        // Users with invoices.
356
+        $customers = $wpdb->get_col(
357
+            $wpdb->prepare(
358
+                "SELECT DISTINCT( post_author ) FROM $wpdb->posts WHERE $post_types LIMIT %d,%d",
359
+                $this->get_paged() * 10 - 10,
360
+                $this->per_page
361
+            )
362
+        );
363
+
364
+        $this->items = $customers;
365
+        $this->total = (int) $wpdb->get_var( "SELECT COUNT( DISTINCT( post_author ) ) FROM $wpdb->posts WHERE $post_types" );
366
+
367
+    }
368
+
369
+    /**
370
+     * Setup the final data for the table
371
+     *
372
+     * @since 1.0.19
373
+     * @return void
374
+     */
375
+    public function prepare_items() {
376
+        $columns               = $this->get_columns();
377
+        $hidden                = array(); // No hidden columns
378
+        $sortable              = $this->get_sortable_columns();
379
+        $this->_column_headers = array( $columns, $hidden, $sortable );
380
+        $this->prepare_query();
381
+
382
+        $this->set_pagination_args(
383
+            array(
384
+                'total_items' => $this->total,
385
+                'per_page'    => $this->per_page,
386
+                'total_pages' => ceil( $this->total / $this->per_page ),
387
+            )
388
+        );
389
+
390
+    }
391 391
 }
Please login to merge, or discard this patch.