Passed
Pull Request — master (#116)
by
unknown
04:02
created

WPInv_Meta_Box_Details   C

Complexity

Total Complexity 55

Size/Duplication

Total Lines 231
Duplicated Lines 2.16 %

Coupling/Cohesion

Components 0
Dependencies 3

Importance

Changes 0
Metric Value
dl 5
loc 231
rs 6
c 0
b 0
f 0
wmc 55
lcom 0
cbo 3

5 Methods

Rating   Name   Duplication   Size   Complexity  
F output() 0 86 21
C resend_invoice() 0 32 7
C subscriptions() 5 62 11
A renewals() 0 12 2
C payment_meta() 0 33 14

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like WPInv_Meta_Box_Details often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use WPInv_Meta_Box_Details, and based on these observations, apply Extract Interface, too.

1
<?php
2
// MUST have WordPress.
3
if ( !defined( 'WPINC' ) ) {
4
    exit( 'Do NOT access this file directly: ' . basename( __FILE__ ) );
5
}
6
7
class WPInv_Meta_Box_Details {
8
    public static function output( $post ) {
9
        $currency_symbol    = wpinv_currency_symbol();
0 ignored issues
show
Unused Code introduced by
$currency_symbol is not used, you could remove the assignment.

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

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

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

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

Loading history...
10
        $statuses           = wpinv_get_invoice_statuses();
11
        
12
        $post_id            = !empty( $post->ID ) ? $post->ID : 0;
13
        $invoice            = new WPInv_Invoice( $post_id );
14
        
15
        $status             = $invoice->get_status( false ); // Current status    
16
        $discount           = $invoice->get_discount();
17
        $discount_code      = $discount > 0 ? $invoice->get_discount_code() : '';
18
        $invoice_number     = $invoice->get_number();
19
        
20
        $date_created       = $invoice->get_created_date();
21
        $datetime_created   = strtotime( $date_created );
22
        $date_created       = $date_created != '' && $date_created != '0000-00-00 00:00:00' ? date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), $datetime_created ) : '';
23
        $date_completed     = $invoice->get_completed_date();
24
        $date_completed     = $date_completed != '' && $date_completed != '0000-00-00 00:00:00' ? date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), strtotime( $date_completed ) ) : 'n/a';
25
        $title['status'] = __( 'Invoice Status:', 'invoicing' );
0 ignored issues
show
Coding Style Comprehensibility introduced by
$title was never initialized. Although not strictly required by PHP, it is generally a good practice to add $title = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
26
        $title['number'] = __( 'Invoice Number:', 'invoicing' );
27
        $mail_notice = esc_attr__( 'After saving invoice, this will send a copy of the invoice to the user&#8217;s email address.', 'invoicing' );
28
        
29
        $title = apply_filters('wpinv_details_metabox_titles', $title, $invoice);
30
        $statuses = apply_filters('wpinv_invoice_statuses', $statuses, $invoice);
31
        $mail_notice = apply_filters('wpinv_metabox_mail_notice', $mail_notice, $invoice);
32
        $post_obj = get_post_type_object($invoice->post_type);
33
        ?>
34
<div class="gdmbx2-wrap form-table">
35
    <div class="gdmbx2-metabox gdmbx-field-list" id="gdmbx2-metabox-wpinv_details">
36
        <div class="gdmbx-row gdmbx-type-select gdmbx2-id-wpinv-date-created">
37
            <div class="gdmbx-th"><label><?php _e( 'Date Created:', 'invoicing' );?></label></div>
38
            <div class="gdmbx-td"><?php echo $date_created;?></div>
39
        </div>
40
        <?php if ( $invoice->post_type == 'wpi_invoice' && wpinv_get_option( 'overdue_active' ) && ( $invoice->needs_payment() || $invoice->has_status( array( 'auto-draft' ) ) ) ) { ?>
41
        <div class="gdmbx-row gdmbx-type-select gdmbx2-id-wpinv-date-overdue">
42
            <div class="gdmbx-th"><label for="wpinv_due_date"><?php _e( 'Due Date:', 'invoicing' );?></label></div>
43
            <div class="gdmbx-td">
44
                <input type="text" placeholder="<?php esc_attr_e( 'Y-m-d', 'invoicing' );?>" value="<?php echo esc_attr( $invoice->get_due_date() );?>" id="wpinv_due_date" name="wpinv_due_date" class="regular-text wpiDatepicker" data-minDate="<?php echo esc_attr( date_i18n( 'Y-m-d', $datetime_created ) );?>" data-dateFormat="yy-mm-dd">
45
            </div>
46
        </div>
47
        <?php } ?>
48
        <?php if ( $date_completed && $date_completed != 'n/a' ) { ?>
49
        <div class="gdmbx-row gdmbx-type-select gdmbx2-id-wpinv-date-completed">
50
            <div class="gdmbx-th"><label><?php _e( 'Payment Date:', 'invoicing' );?></label></div>
51
            <div class="gdmbx-td"><?php echo $date_completed;?></div>
52
        </div>
53
        <?php } ?>
54
        <?php do_action( 'wpinv_meta_box_details_after_due_date', $post_id ); ?>
55
        <div class="gdmbx-row gdmbx-type-select gdmbx2-id-wpinv-status">
56
            <div class="gdmbx-th"><label for="wpinv_status"><?php echo $title['status']; ?></label></div>
57
            <div class="gdmbx-td">
58
                <select required="required" id="wpinv_status" name="wpinv_status" class="gdmbx2_select">
59
                    <?php foreach ( $statuses as $value => $label ) { ?>
60
                    <option value="<?php echo $value;?>" <?php selected( $status, $value );?>><?php echo $label;?></option>
61
                    <?php } ?>
62
                </select>
63
            </div>
64
        </div>
65
        <div class="gdmbx-row gdmbx-type-text gdmbx2-id-wpinv-number table-layout">
66
            <div class="gdmbx-th"><label for="wpinv_number"><?php echo $title['number']; ?></label></div>
67
            <div class="gdmbx-td">
68
                <input type="text" value="<?php echo esc_attr( $invoice_number );?>" id="wpinv_number" name="wpinv_number" class="regular-text" readonly>
69
            </div>
70
        </div>
71
        <?php do_action( 'wpinv_meta_box_details_inner', $post_id ); ?>
72
        <?php if ( !( $is_paid = ( $invoice->is_paid() || $invoice->is_refunded() ) ) || $discount_code ) { ?>
73
        <div class="gdmbx-row gdmbx-type-text gdmbx2-id-wpinv-discount-code table-layout">
74
            <div class="gdmbx-th"><label for="wpinv_discount_code"><?php _e( 'Discount Code:', 'invoicing' );?></label></div>
75
            <div class="gdmbx-td">
76
                <input type="text" value="<?php echo esc_attr( $discount_code ); ?>" id="wpinv_discount" class="medium-text" <?php echo ( $discount_code ? 'readonly' : '' ); ?> /><?php if ( !$is_paid ) { ?><input value="<?php echo esc_attr_e( 'Apply', 'invoicing' ); ?>" class="button button-small button-primary <?php echo ( $discount_code ? 'wpi-hide' : 'wpi-inlineb' ); ?>" id="wpinv-apply-code" type="button" /><input value="<?php echo esc_attr_e( 'Remove', 'invoicing' ); ?>" class="button button-small button-primary <?php echo ( $discount_code ? 'wpi-inlineb' : 'wpi-hide' ); ?>" id="wpinv-remove-code" type="button" /><?php } ?>
77
            </div>
78
        </div>
79
        <?php } ?>
80
    </div>
81
</div>
82
<div class="gdmbx-row gdmbx-type-text gdmbx-wpinv-save-send table-layout">
83
    <p class="wpi-meta-row wpi-save-send"><label for="wpi_save_send"><?php echo sprintf(__( 'Send %s:', 'invoicing' ),$post_obj->labels->singular_name) ; ?></label>
84
        <select id="wpi_save_send" name="wpi_save_send">
85
            <option value="1"><?php _e( 'Yes', 'invoicing' ); ?></option>
86
            <option value="" selected="selected"><?php _e( 'No', 'invoicing' ); ?></option>
87
        </select>
88
    </p>
89
    <p class="wpi-meta-row wpi-send-info"><?php echo $mail_notice; ?></p>
90
</div>
91
<?php wp_nonce_field( 'wpinv_details', 'wpinv_details_nonce' ) ;?>
92
        <?php
93
    }
94
    
95
    public static function resend_invoice( $post ) {
96
        global $wpi_mb_invoice;
97
        
98
        if ( empty( $wpi_mb_invoice ) ) {
99
            return;
100
        }
101
        
102
        $text = array(
103
            'message'       => esc_attr__( 'This will send a copy of the invoice to the customer&#8217;s email address.', 'invoicing' ),
104
            'button_text'   =>  __( 'Resend Invoice', 'invoicing' ),
105
        );
106
            
107
        $text = apply_filters('wpinv_resend_invoice_metabox_text', $text);
108
        do_action( 'wpinv_metabox_resend_invoice_before', $wpi_mb_invoice );
109
        
110
        if ( $email = $wpi_mb_invoice->get_email() ) {
0 ignored issues
show
Unused Code introduced by
$email is not used, you could remove the assignment.

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

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

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

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

Loading history...
111
            $email_actions = array();
112
            $email_actions['email_url']      = add_query_arg( array( 'wpi_action' => 'send_invoice', 'invoice_id' => $post->ID ) );
113
            $email_actions['reminder_url']   = add_query_arg( array( 'wpi_action' => 'send_reminder', 'invoice_id' => $post->ID ) );
114
            
115
            $email_actions = apply_filters('wpinv_resend_invoice_email_actions', $email_actions );
116
        ?>
117
        <p class="wpi-meta-row wpi-resend-info"><?php echo $text['message']; ?></p>
118
        <p class="wpi-meta-row wpi-resend-email"><a href="<?php echo esc_url( $email_actions['email_url'] ); ?>" class="button button-secondary"><?php echo $text['button_text']; ?></a></p>
119
        <?php if ( wpinv_get_option( 'overdue_active' ) && "wpi_invoice" === $wpi_mb_invoice->post_type && $wpi_mb_invoice->needs_payment() && ( $due_date = $wpi_mb_invoice->get_due_date() ) ) { ?>
120
        <p class="wpi-meta-row wpi-send-reminder"><a title="<?php esc_attr_e( 'Send overdue reminder notification to customer', 'invoicing' ); ?>" href="<?php echo esc_url( $email_actions['reminder_url'] ); ?>" class="button button-secondary"><?php esc_attr_e( 'Send Reminder', 'invoicing' ); ?></a></p>
121
        <?php } ?>
122
        <?php
123
        }
124
        
125
        do_action( 'wpinv_metabox_resend_invoice_after', $wpi_mb_invoice );
126
    }
127
    
128
    public static function subscriptions( $post ) {
129
130
        $invoice = wpinv_get_invoice( $post->ID );
131
132
        if (!empty($invoice) && $invoice->is_recurring() && $invoice->is_parent()) {
133
134
            $subs_db = new WPInv_Subscriptions_DB;
135
            $subs = $subs_db->get_subscriptions(array('parent_payment_id' => $post->ID, 'number' => 1));
136
            $sub = reset($subs);
137
138
            if(!$sub){
139
                _e('No <a href="'.admin_url( 'admin.php?page=wpinv-subscriptions' ).'">Subscriptions</a> found.', 'invoicing');
140
                return;
141
            }
142
            $frequency = WPInv_Subscriptions::wpinv_get_pretty_subscription_frequency($sub->period, $sub->frequency);
143
            $billing = wpinv_price(wpinv_format_amount($sub->recurring_amount), wpinv_get_invoice_currency_code($sub->parent_payment_id)) . ' / ' . $frequency;
144
            $initial = wpinv_price(wpinv_format_amount($sub->initial_amount), wpinv_get_invoice_currency_code($sub->parent_payment_id));
145
146
            ?>
147
            <p class="wpi-meta-row wpi-sub-label <?php echo 'status-'.$sub->status; ?>"><?php _e('Recurring Payment', 'invoicing'); ?></p>
148
            <?php if ($subscription_id = $invoice->get_subscription_id()) { ?>
149
                <p class="wpi-meta-row wpi-sub-id">
150
                    <label><?php _e('Subscription ID:', 'invoicing'); ?> </label><?php echo $subscription_id; ?></p>
151
            <?php } ?>
152
            <p class="wpi-meta-row wpi-bill-cycle">
153
                <label><?php _e('Billing Cycle:', 'invoicing'); ?> </label><?php printf(_x('%s then %s', 'Initial subscription amount then billing cycle and amount', 'invoicing'), $initial, $billing); ?>
154
            </p>
155
            <p class="wpi-meta-row wpi-billed-times">
156
                <label><?php _e('Times Billed:', 'invoicing'); ?> </label><?php echo $sub->get_times_billed() . ' / ' . (($sub->bill_times == 0) ? 'Until Cancelled' : $sub->bill_times); ?>
157
            </p>
158
            <p class="wpi-meta-row wpi-start-date">
159
                <label><?php _e('Start Date:', 'invoicing'); ?> </label><?php echo date_i18n(get_option('date_format'), strtotime($sub->created, current_time('timestamp'))); ?>
160
            </p>
161 View Code Duplication
            <p class="wpi-meta-row wpi-end-date"><label><?php if ('trialling' == $sub->status) : ?>
162
                        <?php _e('Trialling Until:', 'invoicing'); ?>
163
                    <?php else: ?>
164
                        <?php _e('Expiration Date:', 'invoicing'); ?>
165
                    <?php endif; ?></label><?php echo date_i18n(get_option('date_format'), strtotime($sub->expiration, current_time('timestamp'))); ?>
166
            </p>
167
            <?php if ($sub->status) { ?>
168
                <p class="wpi-meta-row wpi-sub-status">
169
                    <label><?php _e('Subscription Status:', 'invoicing'); ?> </label><?php echo $sub->get_status_label(); ?>
170
                </p>
171
            <?php } ?>
172
            <?php
173
            $payments = $sub->get_child_payments();
174
            if (!empty($payments)) { ?>
175
                <p><strong><?php _e('Renewal Payments:', 'invoicing'); ?></strong></p>
176
                <ul id="wpi-sub-payments">
177
                    <?php foreach ($payments as $payment) {
178
                        $invoice_id = $payment->ID;
179
                        ?>
180
                        <li>
181
                            <a href="<?php echo esc_url(get_edit_post_link($invoice_id)); ?>"><?php echo wpinv_get_invoice_number($invoice_id); ?></a>&nbsp;&ndash;&nbsp;
182
                            <span><?php echo wpinv_get_invoice_date($invoice_id); ?>&nbsp;&ndash;&nbsp;</span>
183
                            <span><?php echo wpinv_payment_total($invoice_id, true); ?></span>
184
                        </li>
185
                    <?php } ?>
186
                </ul>
187
            <?php }
188
        }
189
    }
190
    
191
    public static function renewals( $post ) {
192
        $invoice = wpinv_get_invoice( $post->ID );
193
        
194
        if ( wpinv_is_subscription_payment( $invoice ) ) {
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
195
            $parent_url = get_edit_post_link( $invoice->parent_invoice );
196
            $parent_id  = wpinv_get_invoice_number( $invoice->parent_invoice );
197
        ?>
198
        <p class="wpi-meta-row wpi-sub-id"><label><?php _e( 'Subscription ID:', 'invoicing' );?> </label><?php echo $invoice->get_subscription_id(); ?></p>
199
        <p class="wpi-meta-row wpi-parent-id"><label><?php _e( 'Parent Invoice:', 'invoicing' );?> </label><a href="<?php echo esc_url( $parent_url ); ?>"><?php echo $parent_id; ?></a></p>
200
        <?php
201
        }
202
    }
203
    
204
    public static function payment_meta( $post ) {
0 ignored issues
show
Unused Code introduced by
The parameter $post is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
205
        global $wpi_mb_invoice;
206
207
        $set_dateway = empty( $wpi_mb_invoice->gateway ) ? true : false;
208
        if ( !$set_dateway && !$wpi_mb_invoice->get_meta( '_wpinv_checkout', true ) && !$wpi_mb_invoice->is_paid() && !$wpi_mb_invoice->is_refunded() ) {
209
            $set_dateway = true;
210
        }
211
        
212
        ?>
213
        <p class="wpi-meta-row">
214
        <?php if ( $set_dateway ) { $gateways = wpinv_get_enabled_payment_gateways( true ); ?>
215
            <label for="wpinv_gateway"><?php _e( 'Gateway:', 'invoicing' ) ; ?></label>
216
            <select required="required" id="wpinv_gateway" name="wpinv_gateway">
217
                <?php foreach ( $gateways as $name => $gateway ) {
218
                    if ( $wpi_mb_invoice->is_recurring() && !wpinv_gateway_support_subscription( $name ) ) {
219
                        continue;
220
                    }
221
                    ?>
222
                <option value="<?php echo $name;?>" <?php selected( $wpi_mb_invoice->gateway, $name );?>><?php echo !empty( $gateway['admin_label'] ) ? $gateway['admin_label'] : $gateway['checkout_label']; ?></option>
223
                <?php } ?>
224
            </select>
225
        <?php } else { 
226
            echo wp_sprintf( __( '<label>Gateway:</label> %s', 'invoicing' ), wpinv_get_gateway_checkout_label( $wpi_mb_invoice->gateway ) );
227
        } ?>
228
        </p>
229
        <?php if ( $key = $wpi_mb_invoice->get_key() ) { ?>
230
        <p class="wpi-meta-row"><?php echo wp_sprintf( __( '<label>Key:</label> %s', 'invoicing' ), $key ); ?></p>
231
        <?php } ?>
232
        <?php if ( $wpi_mb_invoice->is_paid() || $wpi_mb_invoice->is_refunded() ) { ?>
233
        <p class="wpi-meta-row"><?php echo wp_sprintf( __( '<label>Transaction ID:</label> %s', 'invoicing' ), wpinv_payment_link_transaction_id( $wpi_mb_invoice ) ); ?></p>
234
        <?php } ?>
235
        <?php
236
    }
237
}
238