1
|
|
|
<?php if ( !defined( 'ABSPATH' ) ) exit; |
2
|
|
|
/** |
3
|
|
|
* Products management method file |
4
|
|
|
* |
5
|
|
|
* This file contains the different methods for products management |
6
|
|
|
* @author Eoxia <[email protected]> |
7
|
|
|
* @version 1.1 |
8
|
|
|
* @package wpshop |
9
|
|
|
* @subpackage librairies |
10
|
|
|
*/ |
11
|
|
|
|
12
|
|
|
/* Check if file is include. No direct access possible with file url */ |
13
|
|
|
if ( !defined( 'WPSHOP_VERSION' ) ) { |
14
|
|
|
die( __('Access is not allowed by this way', 'wpshop') ); |
15
|
|
|
} |
16
|
|
|
|
17
|
|
|
/** |
18
|
|
|
* This file contains the different methods for products management |
19
|
|
|
* @author Eoxia <[email protected]> |
20
|
|
|
* @version 1.1 |
21
|
|
|
* @package wpshop |
22
|
|
|
* @subpackage librairies |
23
|
|
|
*/ |
24
|
|
|
class wpshop_orders { |
25
|
|
|
|
26
|
|
|
/** |
27
|
|
|
* Create a new custom post type in wordpress for current element |
28
|
|
|
*/ |
29
|
|
View Code Duplication |
public static function create_orders_type( ) { |
|
|
|
|
30
|
|
|
register_post_type(WPSHOP_NEWTYPE_IDENTIFIER_ORDER, array( |
31
|
|
|
'labels' => array( |
32
|
|
|
'name' => __('Orders', 'wpshop'), |
33
|
|
|
'singular_name' => __('Order', 'wpshop'), |
34
|
|
|
'add_new' => __('Add quotation', 'wpshop'), |
35
|
|
|
'add_new_item' => __('Add new quotation', 'wpshop'), |
36
|
|
|
'edit' => __('Edit', 'wpshop'), |
37
|
|
|
'edit_item' => __('Edit Order', 'wpshop'), |
38
|
|
|
'new_item' => __('New quotation', 'wpshop'), |
39
|
|
|
'view' => __('View Order', 'wpshop'), |
40
|
|
|
'view_item' => __('View Order', 'wpshop'), |
41
|
|
|
'search_items' => __('Search Orders', 'wpshop'), |
42
|
|
|
'not_found' => __('No Orders found', 'wpshop'), |
43
|
|
|
'not_found_in_trash' => __('No Orders found in trash', 'wpshop'), |
44
|
|
|
'parent' => __('Parent Orders', 'wpshop') |
45
|
|
|
), |
46
|
|
|
'description' => __('This is where store orders are stored.', 'wpshop'), |
47
|
|
|
'public' => true, |
48
|
|
|
'show_ui' => true, |
49
|
|
|
'capability_type' => 'post', |
50
|
|
|
'publicly_queryable' => false, |
51
|
|
|
'exclude_from_search' => true, |
52
|
|
|
'show_in_menu' => true, |
53
|
|
|
'hierarchical' => false, |
54
|
|
|
'show_in_nav_menus' => false, |
55
|
|
|
'show_in_admin_bar' => false, |
56
|
|
|
'rewrite' => false, |
57
|
|
|
'query_var' => true, |
58
|
|
|
'supports' => array(''), |
59
|
|
|
'has_archive' => false, |
60
|
|
|
'menu_icon' => 'dashicons-cart' |
61
|
|
|
)); |
62
|
|
|
} |
63
|
|
|
|
64
|
|
|
/** |
65
|
|
|
* Call the different boxes in edition page |
66
|
|
|
*/ |
67
|
|
|
public static function add_meta_boxes( ) { |
68
|
|
|
global $post; |
69
|
|
|
|
70
|
|
|
/** Add action button */ |
71
|
|
|
add_meta_box( |
72
|
|
|
'wpshop_order_actions', |
73
|
|
|
'<span class="dashicons dashicons-info"></span> '.__('Actions on order', 'wpshop'), |
74
|
|
|
array('wpshop_orders', 'order_actions'), |
75
|
|
|
WPSHOP_NEWTYPE_IDENTIFIER_ORDER, 'side', 'high' |
76
|
|
|
); |
77
|
|
|
|
78
|
|
View Code Duplication |
if ( !in_array( $post->post_status, array( 'auto-draft' ) ) ) { |
|
|
|
|
79
|
|
|
add_meta_box('wpshop_credit_actions', __('Credit on order', 'wpshop'), array('wps_credit', 'wps_credit_meta_box'), WPSHOP_NEWTYPE_IDENTIFIER_ORDER, 'side', 'low'); |
80
|
|
|
} |
81
|
|
|
|
82
|
|
|
|
83
|
|
|
|
84
|
|
|
/** Box containing listing of customer notification */ |
85
|
|
|
// $notifs = self::get_notification_by_object( array('object_type' => 'order', 'object_id' => $post->ID) ); |
|
|
|
|
86
|
|
|
// if ( !empty($notifs) ) { |
87
|
|
|
// add_meta_box( |
88
|
|
|
// 'wpshop_order_customer_notification', |
89
|
|
|
// __('Customer Notification', 'wpshop'), |
90
|
|
|
// array('wpshop_orders', 'wpshop_order_customer_notification'), |
91
|
|
|
// WPSHOP_NEWTYPE_IDENTIFIER_ORDER, 'side', 'low' |
92
|
|
|
// ); |
93
|
|
|
// } |
94
|
|
|
} |
95
|
|
|
|
96
|
|
|
|
97
|
|
|
|
98
|
|
|
/** |
99
|
|
|
* Define the box for actions on order |
100
|
|
|
* |
101
|
|
|
* @param object $order The current order being edited |
102
|
|
|
*/ |
103
|
|
|
public static function order_actions( $order ) { |
104
|
|
|
$output = ''; |
|
|
|
|
105
|
|
|
|
106
|
|
|
$order_status = unserialize(WPSHOP_ORDER_STATUS); |
107
|
|
|
$order_postmeta = get_post_meta($order->ID, '_order_postmeta', true); |
108
|
|
|
|
109
|
|
|
$tpl_component = array(); |
110
|
|
|
|
111
|
|
|
$delete_button = wpshop_display::display_template_element('wpshop_admin_order_action_del_button', array('ADMIN_ORDER_DELETE_LINK' => esc_url( get_delete_post_link($order->ID) ) , 'ADMIN_ORDER_DELETE_TEXT' => (!EMPTY_TRASH_DAYS ? __('Delete Permanently', 'wpshop') : __('Move to Trash', 'wpshop'))), array(), 'admin'); |
112
|
|
|
$tpl_component['ADMIN_ORDER_DELETE_ORDER'] = current_user_can( "delete_post", $order->ID ) ? $delete_button : ''; |
113
|
|
|
|
114
|
|
|
/** Add an action list */ |
115
|
|
|
$tpl_component['ADMIN_ORDER_ACTIONS_LIST'] = ''; |
116
|
|
|
|
117
|
|
|
/** Display main information about the order */ |
118
|
|
|
$order_main_info = ''; |
119
|
|
|
if(!empty($order_postmeta['order_date'])){ |
120
|
|
|
$order_main_info .= '<div class="wps-product-section"><span class="dashicons dashicons-calendar-alt"></span> <strong>'.__('Order date','wpshop').' : </strong><br/>'.mysql2date('d F Y H:i:s', $order_postmeta['order_date'], true).'</div>'; |
121
|
|
|
} |
122
|
|
|
$order_main_info .= '<div class="wps-product-section">'; |
123
|
|
|
if(empty($order_postmeta['order_date']) || (empty($order_postmeta['order_key']) && empty($order_postmeta['order_temporary_key']) && empty($order_postmeta['order_invoice_ref']))){ |
124
|
|
|
$order_main_info .= '<span class="dashicons dashicons-arrow-right"></span> <strong>'.__('Temporary quotation reference','wpshop').': </strong>'.self::get_new_pre_order_reference(false).'<br/>'; |
125
|
|
|
} |
126
|
|
|
else{ |
127
|
|
|
if(!empty($order_postmeta['order_key'])){ |
128
|
|
|
$order_main_info .= '<span class="dashicons dashicons-arrow-right"></span> <strong>'.__('Order reference','wpshop').' : </strong>'.$order_postmeta['order_key'].'<br/>'; |
129
|
|
|
} |
130
|
|
|
if(!empty($order_postmeta['order_temporary_key'])){ |
131
|
|
|
$order_main_info .= '<span class="dashicons dashicons-arrow-right"></span> <strong>'.__('Pre-order reference','wpshop').': </strong>'.$order_postmeta['order_temporary_key'].'<br/>'; |
132
|
|
|
$post_ID = !empty( $_GET['post'] ) ? (int) $_GET['post'] : 0; |
133
|
|
|
$order_main_info .= '<a href="' .admin_url( 'admin-post.php?action=wps_invoice&order_id=' . $post_ID . '&mode=pdf' ) . '">' .__('Download the quotation', 'wpshop'). '</a><br />'; |
134
|
|
|
} |
135
|
|
|
if(!empty($order_postmeta['order_invoice_ref'])){ |
136
|
|
|
$sub_tpl_component = array(); |
|
|
|
|
137
|
|
|
$order_invoice_download = '<a href="' . admin_url( 'admin-post.php?action=wps_invoice&order_id=' . $order->ID . '&invoice_ref=' . $order_postmeta['order_invoice_ref'] . '&mode=pdf' ) . '">' . __('Download invoice', 'wpshop') . '</a><br />'; |
138
|
|
|
$order_main_info .= '<span class="dashicons dashicons-arrow-right"></span> <strong>'. __('Invoice number','wpshop').': </strong>'.$order_postmeta['order_invoice_ref'].'<br/>' . $order_invoice_download . ''; |
139
|
|
|
} |
140
|
|
|
else { |
141
|
|
|
$order_main_info .= wpshop_display::display_template_element('wpshop_admin_order_generate_invoice_button', array(), array(), 'admin'); |
142
|
|
|
} |
143
|
|
|
} |
144
|
|
|
$order_main_info .= '</div>'; |
145
|
|
|
|
146
|
|
|
|
147
|
|
|
/*Add the current order status in display**/ |
148
|
|
|
$tpl_component['ADMIN_ORDER_ACTIONS_LIST'] .= ( !empty($order_postmeta['order_status']) ) ? (sprintf('<span class="order_status_' . $order->ID . ' wpshop_order_status_container wpshop_order_status_%1$s ">%2$s</span>', sanitize_title(strtolower($order_postmeta['order_status'])), __($order_status[strtolower($order_postmeta['order_status'])], 'wpshop')) ) : ''; |
149
|
|
|
|
150
|
|
|
$tpl_component['ADMIN_ORDER_ACTIONS_LIST'] .= $order_main_info; |
151
|
|
|
|
152
|
|
|
/** Add a box allowing to notify the customer on order update */ |
153
|
|
|
/** |
154
|
|
|
* |
155
|
|
|
* To check because notification is not really send |
156
|
|
|
* |
157
|
|
|
*/ |
158
|
|
|
/*if ( !empty($order->post_author) ) { |
|
|
|
|
159
|
|
|
$tpl_component['ADMIN_ORDER_ACTIONS_LIST'] .= ' |
160
|
|
|
<div class="wps-product-section wpshop_order_notify_customer_on_update_container" > |
161
|
|
|
<input type="checkbox" name="notif_the_customer" id="wpshop_order_notif_the_customer_on_update" /> <label for="wpshop_order_notif_the_customer_on_update" >'.__('Send a notification to the customer', 'wpshop').'</label> |
162
|
|
|
<!-- <br/><input type="checkbox" name="notif_the_customer_sendsms" id="wpshop_order_notif_the_customer_sendsms_on_update" /> <label for="wpshop_order_nnotif_the_customer_sendsms_on_update" >'.__('Send a SMS to the customer', 'wpshop').'</label> --> |
163
|
|
|
</div>'; |
164
|
|
|
}*/ |
165
|
|
|
|
166
|
|
|
if( ( ( !empty($order_postmeta['cart_type']) && $order_postmeta['cart_type'] == 'quotation' ) || !empty( $order_postmeta['order_temporary_key'] ) ) && in_array( $order_postmeta['order_status'], array( 'awaiting_payment', 'partially_paid' ) ) && (float) $order_postmeta['order_amount_to_pay_now'] != (float) 0 ) { |
167
|
|
|
$tpl_component['ADMIN_ORDER_ACTIONS_LIST'] .= '<div class="wps-product-section">' . self::display_customer_pay_quotation( isset( $order_postmeta['pay_quotation'] ), $order->ID ) . '</div>'; |
168
|
|
|
} |
169
|
|
|
|
170
|
|
|
/** |
171
|
|
|
* Only for quotations |
172
|
|
|
*/ |
173
|
|
|
/*if( ( ( !empty($order_postmeta['cart_type']) && $order_postmeta['cart_type'] == 'quotation' ) || !empty( $order_postmeta['order_temporary_key'] ) ) && $order_postmeta['order_status'] != 'canceled' && (float) $order_postmeta['order_amount_to_pay_now'] != (float) 0 ) { |
|
|
|
|
174
|
|
|
$tpl_component['ADMIN_ORDER_ACTIONS_LIST'] .= '<div class="wps-product-section"><input type="text" value="' . wpshop_checkout::wps_direct_payment_link_url( $order->ID ) . '"/></div>'; |
175
|
|
|
}*/ |
176
|
|
|
|
177
|
|
|
/*Add the button regarding the order status**/ |
178
|
|
|
if ( !empty($order_postmeta['order_status']) ) { |
179
|
|
|
if( $order_postmeta['order_status'] == 'awaiting_payment' ) { |
180
|
|
|
$tpl_component['ADMIN_ORDER_ACTIONS_LIST'] .= '<div class="wps-product-section"><button class="wps-bton-second-mini-rounded markAsCanceled order_'.$order->ID.'" >'.__('Cancel this order', 'wpshop').'</button><input type="hidden" id="markascanceled_order_hidden_indicator" name="markascanceled_order_hidden_indicator" /></div>'; |
181
|
|
|
} |
182
|
|
|
$credit_meta = get_post_meta( $order->ID, '_wps_order_credit', true ); |
183
|
|
|
|
184
|
|
|
$total_received = (float) 0; |
185
|
|
|
if ( ! empty( $order_postmeta['order_payment'] ) && ! empty( $order_postmeta['order_payment']['received'] ) ) { |
186
|
|
|
foreach( $order_postmeta['order_payment']['received'] as $received ) { |
187
|
|
|
$total_received += (float) isset( $received['received_amount'] ) ? $received['received_amount'] : 0; |
188
|
|
|
} |
189
|
|
|
} |
190
|
|
|
|
191
|
|
|
if ( empty($credit_meta) && (float) 0 !== $total_received ) { |
192
|
|
|
if( $order_postmeta['order_status'] == 'refunded') { |
193
|
|
|
$tpl_component['ADMIN_ORDER_ACTIONS_LIST'] .= '<div class="wps-product-section wps_markAsRefunded_container">' .__('Credit Slip number', 'wpshop'). ' : <strong>'. ( (!empty($order_postmeta) && !empty($order_postmeta['order_payment']) && !empty($order_postmeta['order_payment']['refunded_action']) && !empty($order_postmeta['order_payment']['refunded_action']['credit_slip_ref']) ) ? '<a href="' .admin_url( 'admin-post.php?action=wps_invoice&order_id=' .$order->ID. '&invoice_ref=' .$order_postmeta['order_payment']['refunded_action']['credit_slip_ref'].'&credit_slip=ok' ). '" target="_blank">'.$order_postmeta['order_payment']['refunded_action']['credit_slip_ref'].'</a>' : '') .'</strong></div>'; |
194
|
|
|
} |
195
|
|
|
else { |
196
|
|
|
$tpl_component['ADMIN_ORDER_ACTIONS_LIST'] .= '<div class="wps-product-section wps_markAsRefunded_container" ><button class="wps-bton-second-mini-rounded markAsRefunded order_' .$order->ID. '">' .__('Refund this order', 'wpshop'). '</button><input type="hidden" id="markasrefunded_order_hidden_indicator" name="markasrefunded_order_hidden_indicator" /></div>'; |
197
|
|
|
} |
198
|
|
|
} |
199
|
|
|
} |
200
|
|
|
$tpl_component['ADMIN_ORDER_ACTIONS_LIST'] = strrev( preg_replace( strrev( '/wps-product-section/' ), '', strrev( $tpl_component['ADMIN_ORDER_ACTIONS_LIST'] ), 1 ) ); |
201
|
|
|
echo wpshop_display::display_template_element( 'wpshop_admin_order_action_box', $tpl_component, array( 'type' => WPSHOP_NEWTYPE_IDENTIFIER_ORDER, 'id' => $order->ID ), 'admin' ); |
202
|
|
|
} |
203
|
|
|
|
204
|
|
|
|
205
|
|
|
|
206
|
|
|
function order_container_in_admin() { |
|
|
|
|
207
|
|
|
global $post; |
208
|
|
|
$output = '<div id="wps_order_content_container">'; |
209
|
|
|
$output .= self::order_content( $post ); |
210
|
|
|
$output .= '</div>'; |
211
|
|
|
echo $output; |
212
|
|
|
} |
213
|
|
|
|
214
|
|
|
|
215
|
|
|
/** |
216
|
|
|
* Display the order content: the list of element put into order |
217
|
|
|
* |
218
|
|
|
* @param order $post The complete order content |
219
|
|
|
*/ |
220
|
|
|
function order_content( $post ) { |
|
|
|
|
221
|
|
|
$order_content = ''; |
222
|
|
|
|
223
|
|
|
$order = get_post_meta($post->ID, '_order_postmeta', true); |
224
|
|
|
|
225
|
|
|
$order_content .= '<div id="order_product_container" class="order_product_container wpshop_cls" >'; |
226
|
|
|
if($order){/* Read the order content if the order has product */ |
227
|
|
|
$order_content .= '<input type="hidden" value="" name="order_products_to_delete" id="order_products_to_delete" />' . wpshop_cart::display_cart(true, $order, 'admin'); |
228
|
|
|
if (empty($order['order_invoice_ref'])) { |
229
|
|
|
$order_content .= '<div id="order_refresh_button_container" class="wpshop_clear_block" ><input type="button" class="button-primary alignright wpshopHide" id="wpshop_admin_order_recalculate" value="' . __('Refresh order informations', 'wpshop') . '" /></div>'; |
230
|
|
|
} |
231
|
|
|
} |
232
|
|
|
$order_content .= '<div class="wpshop_cls" ></div></div>'; |
233
|
|
|
|
234
|
|
|
return $order_content; |
235
|
|
|
} |
236
|
|
|
|
237
|
|
|
|
238
|
|
|
|
239
|
|
|
|
240
|
|
|
|
241
|
|
|
/** Generate the billing reference regarding the order $order_id |
242
|
|
|
* @return void |
243
|
|
|
*/ |
244
|
|
|
function order_generate_billing_number($order_id, $force_invoicing = false){ |
|
|
|
|
245
|
|
|
global $wpdb, $wpshop_modules_billing; |
246
|
|
|
|
247
|
|
|
// Get the order from the db |
248
|
|
|
$order = get_post_meta($order_id, '_order_postmeta', true); |
249
|
|
|
|
250
|
|
|
// If the payment is completed |
251
|
|
|
if(($order['order_status']=='completed') || $force_invoicing) { |
252
|
|
|
|
253
|
|
|
// If the reference hasn't been generated yet |
254
|
|
|
if(empty($order['order_invoice_ref'])) { |
255
|
|
|
$order['order_invoice_ref'] = $wpshop_modules_billing->generate_invoice_number( $order_id ); |
256
|
|
|
|
257
|
|
|
update_post_meta($order_id, '_order_postmeta', $order); |
258
|
|
|
} |
259
|
|
|
} |
260
|
|
|
} |
261
|
|
|
|
262
|
|
|
|
263
|
|
|
/** Renvoi une nouvelle r�f�rence unique pour une commande |
264
|
|
|
* @return int |
265
|
|
|
*/ |
266
|
|
View Code Duplication |
public static function get_new_order_reference(){ |
|
|
|
|
267
|
|
|
$number_figures = get_option('wpshop_order_number_figures', false); |
|
|
|
|
268
|
|
|
/* If the number doesn't exist, we create a default one */ |
269
|
|
|
if(!$number_figures){ |
270
|
|
|
$number_figures = 5; |
271
|
|
|
update_option('wpshop_order_number_figures', $number_figures); |
272
|
|
|
} |
273
|
|
|
|
274
|
|
|
$order_current_number = get_option('wpshop_order_current_number', false); |
|
|
|
|
275
|
|
|
/* If the counter doesn't exist, we initiate it */ |
276
|
|
|
if(!$order_current_number) { $order_current_number = 1; } |
277
|
|
|
else { $order_current_number++; } |
278
|
|
|
update_option('wpshop_order_current_number', $order_current_number); |
279
|
|
|
|
280
|
|
|
$order_ref = (string)sprintf('%0'.$number_figures.'d', $order_current_number); |
281
|
|
|
return WPSHOP_ORDER_REFERENCE_PREFIX.$order_ref; |
282
|
|
|
} |
283
|
|
|
|
284
|
|
|
/** Renvoi une nouvelle r�f�rence unique pour un devis |
285
|
|
|
* @return int |
286
|
|
|
*/ |
287
|
|
View Code Duplication |
public static function get_new_pre_order_reference($save = true){ |
|
|
|
|
288
|
|
|
$number_figures = get_option('wpshop_order_number_figures', false); |
|
|
|
|
289
|
|
|
/* If the number doesn't exist, we create a default one */ |
290
|
|
|
if(!$number_figures){ |
291
|
|
|
$number_figures = 5; |
292
|
|
|
update_option('wpshop_order_number_figures', $number_figures); |
293
|
|
|
} |
294
|
|
|
|
295
|
|
|
$order_current_number = get_option('wpshop_preorder_current_number', false); |
|
|
|
|
296
|
|
|
/* If the counter doesn't exist, we initiate it */ |
297
|
|
|
if(!$order_current_number) { $order_current_number = 1; } |
298
|
|
|
else { $order_current_number++; } |
299
|
|
|
if($save){ |
300
|
|
|
update_option('wpshop_preorder_current_number', $order_current_number); |
301
|
|
|
} |
302
|
|
|
|
303
|
|
|
$order_ref = (string)sprintf('%0'.$number_figures.'d', $order_current_number); |
304
|
|
|
return WPSHOP_PREORDER_REFERENCE_PREFIX.$order_ref; |
305
|
|
|
} |
306
|
|
|
|
307
|
|
|
|
308
|
|
|
|
309
|
|
|
|
310
|
|
|
|
311
|
|
|
/** |
312
|
|
|
* Add information about user to the selected order |
313
|
|
|
* |
314
|
|
|
* @param int $user_id The user identifier to get information for and to add to order meta informations |
315
|
|
|
* @param int $order_id The order identifier to update meta information for |
316
|
|
|
* |
317
|
|
|
* @return void |
318
|
|
|
*/ |
319
|
|
|
public static function set_order_customer_addresses($user_id, $order_id, $shipping_address_id='', $billing_address_id=''){ |
|
|
|
|
320
|
|
|
/** Get order informations */ |
321
|
|
|
$billing_info['id'] = get_post_meta($billing_address_id, WPSHOP_ADDRESS_ATTRIBUTE_SET_ID_META_KEY, true); |
|
|
|
|
322
|
|
|
$billing_info['address'] = get_post_meta($billing_address_id, '_'.WPSHOP_NEWTYPE_IDENTIFIER_ADDRESS.'_metadata', true); |
323
|
|
|
$billing_info['address_id'] = ( !empty($_SESSION['billing_address']) ) ? intval( $_SESSION['billing_address'] ) : ''; |
324
|
|
|
if ( !empty($_SESSION['shipping_partner_id']) ) { |
325
|
|
|
$partner_address_id = get_post_meta( $_SESSION['shipping_partner_id'], '_wpshop_attached_address', true); |
326
|
|
|
if (!empty($partner_address_id)) { |
327
|
|
|
foreach( $partner_address_id as $address_id ) { |
328
|
|
|
$shipping_info['id'] = get_post_meta($address_id, WPSHOP_ADDRESS_ATTRIBUTE_SET_ID_META_KEY, true); |
|
|
|
|
329
|
|
|
$shipping_info['address'] = get_post_meta( $address_id, '_'.WPSHOP_NEWTYPE_IDENTIFIER_ADDRESS.'_metadata', true); |
330
|
|
|
} |
331
|
|
|
} |
332
|
|
|
} |
333
|
|
|
else { |
334
|
|
|
$shipping_info['id'] = get_post_meta($shipping_address_id, WPSHOP_ADDRESS_ATTRIBUTE_SET_ID_META_KEY, true); |
|
|
|
|
335
|
|
|
$shipping_info['address'] = get_post_meta($shipping_address_id, '_'.WPSHOP_NEWTYPE_IDENTIFIER_ADDRESS.'_metadata', true); |
336
|
|
|
$shipping_info['address_id'] = ( !empty($_SESSION['shipping_address']) ) ? intval( $_SESSION['shipping_address'] ) : ''; |
337
|
|
|
} |
338
|
|
|
|
339
|
|
|
$order_info = array('billing' => $billing_info, 'shipping' => $shipping_info); |
|
|
|
|
340
|
|
|
|
341
|
|
|
/** Update order info metadata with new shipping */ |
342
|
|
|
update_post_meta($order_id, '_order_info', $order_info); |
343
|
|
|
} |
344
|
|
|
|
345
|
|
|
|
346
|
|
|
/** |
347
|
|
|
* Set the custom colums |
348
|
|
|
* @return array |
349
|
|
|
*/ |
350
|
|
|
static function orders_edit_columns($columns){ |
|
|
|
|
351
|
|
|
$shipping_address_option = get_option( 'wpshop_shipping_address_choice' ); |
352
|
|
|
|
353
|
|
|
$columns = array( |
354
|
|
|
'cb' => '<input type="checkbox" />', |
355
|
|
|
'order_identifier' => __('Identifiers', 'wpshop'), |
356
|
|
|
'order_status' => __('Status', 'wpshop'), |
357
|
|
|
'order_type' => __('Order type', 'wpshop'), |
358
|
|
|
'order_billing' => __('Billing', 'wpshop'), |
359
|
|
|
); |
360
|
|
|
if ( ( ! empty( $shipping_address_option ) && ! empty( $shipping_address_option['activate'] ) ) ) { |
361
|
|
|
$columns ['order_shipping'] = __('Shipping', 'wpshop'); |
362
|
|
|
} |
363
|
|
|
$columns ['order_total'] = __('Order total', 'wpshop'); |
364
|
|
|
$columns ['date'] = __('Date', 'wpshop'); |
365
|
|
|
//$columns ['order_actions'] = __('Actions', 'wpshop'); |
|
|
|
|
366
|
|
|
|
367
|
|
|
return $columns; |
368
|
|
|
} |
369
|
|
|
|
370
|
|
|
/** Give the content by column |
371
|
|
|
* @return array |
372
|
|
|
*/ |
373
|
|
|
public static function orders_custom_columns($column, $post_id) { |
374
|
|
|
if ( get_post_type( $post_id ) == WPSHOP_NEWTYPE_IDENTIFIER_ORDER ) { |
375
|
|
|
global $civility, $order_status; |
376
|
|
|
|
377
|
|
|
$metadata = get_post_custom(); |
378
|
|
|
|
379
|
|
|
$order_postmeta = isset($metadata['_order_postmeta'][0])?unserialize($metadata['_order_postmeta'][0]):''; |
380
|
|
|
$addresses = get_post_meta($post_id,'_order_info', true); |
381
|
|
|
|
382
|
|
|
switch($column){ |
383
|
|
|
case "order_identifier": |
384
|
|
|
if( !empty( $order_postmeta['order_key'] ) ) { |
385
|
|
|
echo '<b>' . $order_postmeta['order_key'] . '</b><br>'; |
386
|
|
|
} |
387
|
|
|
if( !empty( $order_postmeta['order_invoice_ref'] ) ) { |
388
|
|
|
echo '<i>' . $order_postmeta['order_invoice_ref'] . '</i>'; |
389
|
|
|
} elseif( !empty($order_postmeta['order_temporary_key'] ) ) { |
390
|
|
|
echo '<b>' . $order_postmeta['order_temporary_key'] . '</b>'; |
391
|
|
|
} |
392
|
|
|
break; |
393
|
|
|
|
394
|
|
|
case "order_status": |
395
|
|
|
echo !empty($order_postmeta['order_status']) ? sprintf('<mark class="%s" id="order_status_'.$post_id.'">%s</mark>', sanitize_title(strtolower($order_postmeta['order_status'])), __($order_status[strtolower($order_postmeta['order_status'])], 'wpshop')) : __('Unknown Status', 'wpshop'); |
396
|
|
|
break; |
397
|
|
|
|
398
|
|
|
case "order_billing": |
399
|
|
View Code Duplication |
if ( !empty($addresses['billing']) && !empty($addresses['billing']['address']) && is_array($addresses['billing']['address']) ) { |
|
|
|
|
400
|
|
|
$billing = $addresses['billing']['address']; |
401
|
|
|
} |
402
|
|
|
else if ( !empty($addresses['billing']) ) { |
403
|
|
|
$billing = $addresses['billing']; |
404
|
|
|
} |
405
|
|
|
if ( !empty($billing) ) { |
406
|
|
|
echo (!empty($billing['civility']) ? __(wpshop_attributes::get_attribute_type_select_option_info($billing['civility'], 'label', 'custom'), 'wpshop') : null).' <strong>'.(!empty($billing['address_first_name']) ? $billing['address_first_name'] : null).' '.(!empty($billing['address_last_name']) ? $billing['address_last_name'] : null).'</strong>'; |
407
|
|
|
echo empty($billing['company']) ?'<br />' : ', <i>'.$billing['company'].'</i><br />'; |
408
|
|
|
echo !empty($billing['address']) ? $billing['address'] : null; |
409
|
|
|
echo !empty($billing['postcode']) ? '<br />' . $billing['postcode'] . ' ' : null; |
410
|
|
|
echo !empty($billing['city']) ? $billing['city'] . ', ' : null; |
411
|
|
|
echo !empty($billing['country']) ? $billing['country'] : null; |
412
|
|
|
echo (!empty($billing['phone']) ? '<br /><b>' . $billing['phone'] . '</b>' : ''); |
413
|
|
|
} |
414
|
|
|
else { |
415
|
|
|
echo __('No information available for user billing', 'wpshop'); |
416
|
|
|
} |
417
|
|
|
break; |
418
|
|
|
|
419
|
|
|
case "order_shipping": |
420
|
|
View Code Duplication |
if ( !empty($addresses['shipping']) && !empty($addresses['shipping']['address']) && is_array($addresses['shipping']['address']) ) { |
|
|
|
|
421
|
|
|
$shipping = $addresses['shipping']['address']; |
422
|
|
|
} |
423
|
|
|
else if ( !empty($addresses['shipping']) ) { |
424
|
|
|
$shipping = $addresses['shipping']; |
425
|
|
|
} |
426
|
|
|
if ( !empty($shipping) ) { |
427
|
|
|
echo '<strong>'.(!empty($shipping['address_first_name']) ? $shipping['address_first_name'] : null).' '.(!empty($shipping['address_last_name']) ? $shipping['address_last_name'] : null).'</strong>'; |
428
|
|
|
echo empty($shipping['company'])?'<br />':', <i>'.$shipping['company'].'</i><br />'; |
429
|
|
|
echo (!empty($shipping['address']) ? $shipping['address'] : null); |
430
|
|
|
echo !empty($billing['postcode']) ? '<br />' . $billing['postcode'] . ' ' : null; |
|
|
|
|
431
|
|
|
echo !empty($billing['city']) ? $billing['city'] . ', ' : null; |
432
|
|
|
echo !empty($billing['country']) ? $billing['country'] : null; |
433
|
|
|
} |
434
|
|
|
else{ |
435
|
|
|
echo __('No information available for user shipping', 'wpshop'); |
436
|
|
|
} |
437
|
|
|
break; |
438
|
|
|
|
439
|
|
|
case "order_type": |
440
|
|
|
echo '<a href="'.admin_url('post.php?post='.$post_id.'&action=edit').'">'.(!empty($order_postmeta['order_temporary_key']) ? __('Quotation','wpshop') : __('Basic order','wpshop')).'</a>'; |
441
|
|
|
$buttons = '<p class="row-actions">'; |
442
|
|
|
// Voir la commande |
443
|
|
|
$buttons .= '<a class="button button-small" href="'.admin_url('post.php?post='.$post_id.'&action=edit').'">'.__('View', 'wpshop').'</a>'; |
444
|
|
|
// Marquer comme envoy� |
445
|
|
|
if (!empty($order_postmeta['order_status']) && ($order_postmeta['order_status'] == 'completed')) { |
446
|
|
|
$buttons .= '<a data-id="' . $post_id . '" class="wps-bton-second-mini-rounded markAsShipped order_'.$post_id.' wps-bton-loader" data-nonce="' . wp_create_nonce("wpshop_dialog_inform_shipping_number") . '">'.__('Mark as shipped', 'wpshop').'</a> '; |
447
|
|
|
} |
448
|
|
|
else if (!empty($order_postmeta['order_status']) && ($order_postmeta['order_status'] == 'awaiting_payment' )) { |
|
|
|
|
449
|
|
|
// $buttons .= '<a class="button markAsCompleted order_'.$post_id.' alignleft" >'.__('Payment received', 'wpshop').'</a>' . wpshop_payment::display_payment_receiver_interface($post_id) . ' '; |
|
|
|
|
450
|
|
|
} |
451
|
|
|
$buttons .= '</p>'; |
452
|
|
|
/*$buttons .= '<input type="hidden" name="input_wpshop_change_order_state" id="input_wpshop_change_order_state" value="' . wp_create_nonce("wpshop_change_order_state") . '" />'; |
|
|
|
|
453
|
|
|
$buttons .= '<input type="hidden" name="input_wpshop_dialog_inform_shipping_number" id="input_wpshop_dialog_inform_shipping_number" value="' . wp_create_nonce("wpshop_dialog_inform_shipping_number") . '" />'; |
454
|
|
|
$buttons .= '<input type="hidden" name="input_wpshop_validate_payment_method" id="input_wpshop_validate_payment_method" value="' . wp_create_nonce("wpshop_validate_payment_method") . '" />';*/ |
455
|
|
|
|
456
|
|
|
echo $buttons; |
457
|
|
|
break; |
458
|
|
|
|
459
|
|
|
case "order_total": |
460
|
|
|
$currency = !empty($order_postmeta['order_currency']) ? $order_postmeta['order_currency'] : get_option('wpshop_shop_default_currency'); |
461
|
|
|
echo isset( $order_postmeta['order_grand_total'] ) ? number_format( $order_postmeta['order_grand_total'], 2, '.', '' ).' '. wpshop_tools::wpshop_get_sigle($currency) : 'NaN'; |
462
|
|
|
break; |
463
|
|
|
|
464
|
|
|
/*case "order_actions": |
|
|
|
|
465
|
|
|
$buttons = '<p class="row-actions">'; |
466
|
|
|
// Marquer comme envoy� |
467
|
|
|
if (!empty($order_postmeta['order_status']) && ($order_postmeta['order_status'] == 'completed')) { |
468
|
|
|
$buttons .= '<a class="button markAsShipped order_'.$post_id.'">'.__('Mark as shipped', 'wpshop').'</a> '; |
469
|
|
|
} |
470
|
|
|
else if (!empty($order_postmeta['order_status']) && ($order_postmeta['order_status'] == 'awaiting_payment' )) { |
471
|
|
|
// $buttons .= '<a class="button markAsCompleted order_'.$post_id.' alignleft" >'.__('Payment received', 'wpshop').'</a>' . wpshop_payment::display_payment_receiver_interface($post_id) . ' '; |
472
|
|
|
} |
473
|
|
|
|
474
|
|
|
// Voir la commande |
475
|
|
|
$buttons .= '<a class="button alignright" href="'.admin_url('post.php?post='.$post_id.'&action=edit').'">'.__('View', 'wpshop').'</a>'; |
476
|
|
|
$buttons .= '</p>'; |
477
|
|
|
$buttons .= '<input type="hidden" name="input_wpshop_change_order_state" id="input_wpshop_change_order_state" value="' . wp_create_nonce("wpshop_change_order_state") . '" />'; |
478
|
|
|
$buttons .= '<input type="hidden" name="input_wpshop_dialog_inform_shipping_number" id="input_wpshop_dialog_inform_shipping_number" value="' . wp_create_nonce("wpshop_dialog_inform_shipping_number") . '" />'; |
479
|
|
|
$buttons .= '<input type="hidden" name="input_wpshop_validate_payment_method" id="input_wpshop_validate_payment_method" value="' . wp_create_nonce("wpshop_validate_payment_method") . '" />'; |
480
|
|
|
|
481
|
|
|
echo $buttons; |
482
|
|
|
break;*/ |
483
|
|
|
} |
484
|
|
|
|
485
|
|
|
} |
486
|
|
|
} |
487
|
|
|
|
488
|
|
|
public static function list_table_filters() { |
489
|
|
|
$post_type = !empty( $_GET['post_type'] ) ? sanitize_text_field( $_GET['post_type'] ) : ''; |
490
|
|
|
$entity_filter = !empty( $_GET['entity_filter'] ) ? sanitize_text_field( $_GET['entity_filter'] ) : ''; |
491
|
|
|
$entity_filter_btpf = !empty( $_GET['entity_filter_btpf'] ) ? sanitize_text_field( $_GET['entity_filter_btpf'] ) : ''; |
492
|
|
|
$entity_filter_btps = !empty( $_GET['entity_filter_btps'] ) ? sanitize_text_field( $_GET['entity_filter_btps'] ) : ''; |
493
|
|
|
|
494
|
|
|
if (isset($post_type)) { |
495
|
|
|
if (post_type_exists($post_type) && ($post_type == WPSHOP_NEWTYPE_IDENTIFIER_ORDER)) { |
496
|
|
|
$filter_possibilities = array(); |
497
|
|
|
$filter_possibilities['all'] = __('-- Select Filter --', 'wpshop'); |
498
|
|
|
$filter_possibilities['only_orders'] = __('List orders only', 'wpshop'); |
499
|
|
|
$filter_possibilities['quotations'] = __('List quotations only', 'wpshop'); |
500
|
|
|
$filter_possibilities['free_orders'] = __('List orders free', 'wpshop'); |
501
|
|
|
echo wpshop_form::form_input_select('entity_filter', 'entity_filter', $filter_possibilities, $entity_filter, '', 'index'); |
502
|
|
|
$min = $entity_filter_btpf; |
503
|
|
|
$max = $entity_filter_btps; |
504
|
|
|
echo ' <label for="entity_filter_btpf">'.__('Between two prices', 'wpshop').'</label> '; |
505
|
|
|
echo wpshop_form::form_input('entity_filter_btpf', 'entity_filter_btpf', $min, 'text', 'placeholder="'.__('Minimum price', 'wpshop').'"', null); |
506
|
|
|
echo wpshop_form::form_input('entity_filter_btps', 'entity_filter_btps', $max, 'text', 'placeholder="'.__('Maximum price', 'wpshop').'"', null); |
507
|
|
|
} |
508
|
|
|
} |
509
|
|
|
} |
510
|
|
|
|
511
|
|
|
public static function list_table_filter_parse_query($query) { |
512
|
|
|
global $pagenow, $wpdb; |
513
|
|
|
$post_type = !empty( $_GET['post_type'] ) ? sanitize_text_field( $_GET['post_type'] ) : ''; |
514
|
|
|
$entity_filter = !empty( $_GET['entity_filter'] ) ? sanitize_text_field( $_GET['entity_filter'] ) : ''; |
515
|
|
|
$entity_filter_btpf = !empty( $_GET['entity_filter_btpf'] ) ? sanitize_text_field( $_GET['entity_filter_btpf'] ) : ''; |
|
|
|
|
516
|
|
|
$entity_filter_btps = !empty( $_GET['entity_filter_btps'] ) ? sanitize_text_field( $_GET['entity_filter_btps'] ) : ''; |
|
|
|
|
517
|
|
|
|
518
|
|
|
if ( is_admin() && ($pagenow == 'edit.php') && !empty( $post_type ) && ( $post_type == WPSHOP_NEWTYPE_IDENTIFIER_ORDER ) && !empty( $entity_filter ) ) { |
519
|
|
|
$check = null; |
520
|
|
|
switch ( $entity_filter ) { |
521
|
|
|
case 'all': |
522
|
|
|
$sql_query = $wpdb->prepare( |
523
|
|
|
"SELECT ID |
524
|
|
|
FROM {$wpdb->posts} |
525
|
|
|
WHERE post_type = %s |
526
|
|
|
AND post_status != %s", |
527
|
|
|
WPSHOP_NEWTYPE_IDENTIFIER_ORDER, |
528
|
|
|
'auto-draft'); |
529
|
|
|
$check = 'post__in'; |
530
|
|
|
break; |
531
|
|
View Code Duplication |
case 'only_orders': |
|
|
|
|
532
|
|
|
$sql_query = $wpdb->prepare( |
533
|
|
|
"SELECT ID |
534
|
|
|
FROM {$wpdb->posts} |
535
|
|
|
INNER JOIN {$wpdb->postmeta} |
536
|
|
|
ON post_id = ID |
537
|
|
|
AND meta_key = %s |
538
|
|
|
AND meta_value NOT LIKE %s |
539
|
|
|
AND meta_value NOT LIKE %s |
540
|
|
|
WHERE post_type = %s |
541
|
|
|
AND post_status != %s", |
542
|
|
|
'_order_postmeta', |
543
|
|
|
'%s:9:"cart_type";s:9:"quotation";%', |
544
|
|
|
'%s:17:"order_grand_total";d:0;%', |
545
|
|
|
WPSHOP_NEWTYPE_IDENTIFIER_ORDER, |
546
|
|
|
'auto-draft'); |
547
|
|
|
$check = 'post__in'; |
548
|
|
|
break; |
549
|
|
View Code Duplication |
case 'quotations': |
|
|
|
|
550
|
|
|
$sql_query = $wpdb->prepare( |
551
|
|
|
"SELECT ID |
552
|
|
|
FROM {$wpdb->posts} |
553
|
|
|
INNER JOIN {$wpdb->postmeta} |
554
|
|
|
ON post_id = ID |
555
|
|
|
AND meta_key = %s |
556
|
|
|
AND meta_value LIKE %s |
557
|
|
|
WHERE post_type = %s |
558
|
|
|
AND post_status != %s", |
559
|
|
|
'_order_postmeta', |
560
|
|
|
'%s:9:"cart_type";s:9:"quotation";%', |
561
|
|
|
WPSHOP_NEWTYPE_IDENTIFIER_ORDER, |
562
|
|
|
'auto-draft'); |
563
|
|
|
$check = 'post__in'; |
564
|
|
|
break; |
565
|
|
View Code Duplication |
case 'free_orders': |
|
|
|
|
566
|
|
|
$sql_query = $wpdb->prepare( |
567
|
|
|
"SELECT ID |
568
|
|
|
FROM {$wpdb->posts} |
569
|
|
|
INNER JOIN {$wpdb->postmeta} |
570
|
|
|
ON post_id = ID |
571
|
|
|
AND meta_key = %s |
572
|
|
|
AND meta_value LIKE %s |
573
|
|
|
WHERE post_type = %s |
574
|
|
|
AND post_status != %s", |
575
|
|
|
'_order_postmeta', |
576
|
|
|
'%s:17:"order_grand_total";d:0;%', |
577
|
|
|
WPSHOP_NEWTYPE_IDENTIFIER_ORDER, |
578
|
|
|
'auto-draft'); |
579
|
|
|
$check = 'post__in'; |
580
|
|
|
$no_btp = 'yes'; |
581
|
|
|
break; |
582
|
|
|
} |
583
|
|
|
|
584
|
|
|
if ( !empty( $check ) ) { |
585
|
|
|
if( !empty($no_btp) && $no_btp == 'yes' ) { |
586
|
|
|
$min = 'minimum'; |
587
|
|
|
$max = 'maximum'; |
588
|
|
|
} else { |
589
|
|
|
$min = ( !empty($_GET['entity_filter_btpf']) && is_numeric($_GET['entity_filter_btpf']) ) ? sanitize_text_field( $_GET['entity_filter_btpf'] ) : 'minimum'; |
590
|
|
|
$max = ( !empty($_GET['entity_filter_btps']) && is_numeric($_GET['entity_filter_btps']) ) ? sanitize_text_field( $_GET['entity_filter_btps'] ) : 'maximum'; |
591
|
|
|
} |
592
|
|
|
$results = $wpdb->get_results($sql_query); |
|
|
|
|
593
|
|
|
$post_id_list = array(); |
594
|
|
|
$i = 0; |
|
|
|
|
595
|
|
|
foreach($results as $item){ |
596
|
|
|
$meta_value = get_post_meta($item->ID, '_order_postmeta'); |
597
|
|
|
$price = ( !empty( $meta_value[0]['order_grand_total'] ) ) ? $meta_value[0]['order_grand_total'] : ''; |
598
|
|
|
if( $price >= $min || $min == 'minimum' ) { |
599
|
|
|
if( $price <= $max || $max == 'maximum' ) { |
600
|
|
|
$post_id_list[] = $item->ID; |
601
|
|
|
} |
602
|
|
|
} |
603
|
|
|
} |
604
|
|
|
if( empty($post_id_list) ) { |
605
|
|
|
$post_id_list[] = 'no_result'; |
606
|
|
|
} |
607
|
|
|
$query->query_vars[$check] = $post_id_list; |
608
|
|
|
} |
609
|
|
|
$query->query_vars['post_type'] = WPSHOP_NEWTYPE_IDENTIFIER_ORDER; |
610
|
|
|
} |
611
|
|
|
} |
612
|
|
|
|
613
|
|
|
|
614
|
|
|
|
615
|
|
|
function latest_products_ordered ( $orders ) { |
|
|
|
|
616
|
|
|
global $wpdb; |
617
|
|
|
$product_id = $output = ''; |
|
|
|
|
618
|
|
|
$products = array(); |
619
|
|
|
$display_option = get_option('wpshop_display_option'); |
620
|
|
|
if ( !empty($orders) && !empty($display_option) && !empty($display_option['latest_products_ordered']) ) { |
621
|
|
|
foreach( $orders as $order ) { |
622
|
|
|
$order_content = get_post_meta( $order->ID, '_order_postmeta', true ); |
623
|
|
|
if ( !empty($order_content) && !empty( $order_content['order_items']) ) { |
624
|
|
|
|
625
|
|
|
foreach( $order_content['order_items'] as $item ) { |
626
|
|
|
if ( count( $products) >= $display_option['latest_products_ordered'] ) { |
627
|
|
|
continue; |
628
|
|
|
} |
629
|
|
|
$product_id = $item['item_id']; |
630
|
|
|
if ( !empty( $item) && !empty($item['item_meta']) && !empty($item['item_meta']['variation_definition']) ) { |
631
|
|
|
$parent_def = wpshop_products::get_parent_variation( $item['item_id'] ); |
632
|
|
|
if ( !empty( $parent_def ) ) { |
633
|
|
|
$parent_post = $parent_def['parent_post']; |
634
|
|
|
$product_id = $parent_post->ID; |
635
|
|
|
} |
636
|
|
|
} |
637
|
|
|
|
638
|
|
|
if ( !in_array($product_id, $products) ) { |
639
|
|
|
$products[] = $product_id; |
640
|
|
|
} |
641
|
|
|
} |
642
|
|
|
} |
643
|
|
|
} |
644
|
|
|
if ( !empty($products) ) { |
645
|
|
|
$products_id = implode(",", $products); |
646
|
|
|
$output = wpshop_display::display_template_element('latest_products_ordered', array('LATEST_PRODUCTS_ORDERED' => do_shortcode('[wpshop_products pid="' .$products_id. '"]')) ); |
647
|
|
|
} |
648
|
|
|
} |
649
|
|
|
return $output; |
650
|
|
|
} |
651
|
|
|
|
652
|
|
|
function get_order_list_for_customer( $customer_id ) { |
|
|
|
|
653
|
|
|
global $wpdb; |
654
|
|
|
$output = ''; |
655
|
|
|
|
656
|
|
|
if( !empty($customer_id) ) { |
657
|
|
|
$query = $wpdb->prepare( 'SELECT * |
658
|
|
|
FROM ' .$wpdb->posts. ' |
659
|
|
|
WHERE post_author = %d |
660
|
|
|
AND post_type = %s', $customer_id, WPSHOP_NEWTYPE_IDENTIFIER_CUSTOMERS ); |
661
|
|
|
$orders = $wpdb->get_results( $query ); |
662
|
|
|
|
663
|
|
|
foreach( $orders as $order ) { |
|
|
|
|
664
|
|
|
|
665
|
|
|
} |
666
|
|
|
} |
667
|
|
|
|
668
|
|
|
return $output; |
669
|
|
|
} |
670
|
|
|
static function display_customer_pay_quotation( $state, $oid ) { |
|
|
|
|
671
|
|
|
$label = ( ( $state ) ? __('Invalid quotation', 'wpshop') : __('Valid quotation', 'wpshop') ); |
672
|
|
|
$btn = '<p><a role="button" data-nonce="' . wp_create_nonce( 'wps_quotation_is_payable_by_customer' ) . '" class="wps-bton-' . ( ( $state ) ? 'third' : 'second' ) . '-mini-rounded quotation_is_payable_by_customer" href="#" >'.$label.'</a></p>'; |
673
|
|
|
if( $state ) { |
674
|
|
|
//$btn .= '<a target="_blank" href="' . admin_url( 'admin-ajax.php?action=wps_checkout_quotation&order_id=' . $oid . '&is_link=link' ) . '">' . __( 'Pay link', 'wpshop' ) . '</a>'; |
675
|
|
|
$btn .= '<span><input id="wps_direct_link_url" type="text" value="' . wpshop_checkout::wps_direct_payment_link_url( $oid ) . '"/><a class="button" data-copy-target="#wps_direct_link_url" title="' . __( 'Copy', 'wpshop' ) . '"><span class="dashicons dashicons-clipboard"></span></a><a data-nonce="' . wp_create_nonce( 'wps_send_direct_payment_link' ) . '" role="button" class="button" href="#" title="' . __( 'Send by mail', 'wpshop' ) . '"><span class="dashicons dashicons-email"></span></a></span><span>' . sprintf( __( 'Link is valid until %s', 'wpshop' ), mysql2date( get_option( 'date_format' ), date_format( date_create( date('Y-m') . ' + 2month - 1day' ), 'Y-m-d H:i:s' ), true ) ) . '</span>'; |
676
|
|
|
} |
677
|
|
|
return $btn; |
678
|
|
|
} |
679
|
|
|
} |
680
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.