nt.', 'woocommerce-pdf-invoices-packing-slips' ), $mail->title ), false, true ); } } } do_action( 'woocommerce_after_resend_order_email', $order, $email_to_send ); // Restore user locale. wc_restore_locale(); // Change the post saved message. add_filter( 'redirect_post_location', function( $location ) { // messages in includes/admin/class-wc-admin-post-types.php // 11 => 'Order updated and sent.' return esc_url_raw( add_query_arg( 'message', 11, $location ) ); } ); } } } /** * Add invoice number to order search scope */ public function search_fields ( $custom_fields ) { $custom_fields[] = '_wcpdf_invoice_number'; $custom_fields[] = '_wcpdf_formatted_invoice_number'; return $custom_fields; } /** * Check if this is a shop_order page (edit or list) */ public function is_order_page() { $screen = get_current_screen(); if ( ! is_null( $screen ) && in_array( $screen->id, array( 'shop_order', 'edit-shop_order', 'woocommerce_page_wc-orders' ) ) ) { return true; } else { return false; } } public function user_can_manage_document( $document_type ) { return apply_filters( 'wpo_wcpdf_current_user_is_allowed', ( current_user_can( 'manage_woocommerce_orders' ) || current_user_can( 'edit_shop_orders' ) ), $document_type ); } /** * Save, regenerate or delete a document from AJAX request */ public function ajax_crud_document() { if ( check_ajax_referer( 'wpo_wcpdf_regenerate_document', 'security', false ) === false && check_ajax_referer( 'wpo_wcpdf_save_document', 'security', false ) === false && check_ajax_referer( 'wpo_wcpdf_delete_document', 'security', false ) === false ) { wp_send_json_error( array( 'message' => esc_html__( 'Nonce expired!', 'woocommerce-pdf-invoices-packing-slips' ), ) ); } if ( ! isset($_POST['action']) || ! in_array( $_POST['action'], array( 'wpo_wcpdf_regenerate_document', 'wpo_wcpdf_save_document', 'wpo_wcpdf_delete_document' ) ) ) { wp_send_json_error( array( 'message' => esc_html__( 'Bad action!', 'woocommerce-pdf-invoices-packing-slips' ), ) ); } if( empty($_POST['order_id']) || empty($_POST['document_type']) || empty($_POST['action_type']) ) { wp_send_json_error( array( 'message' => esc_html__( 'Incomplete request!', 'woocommerce-pdf-invoices-packing-slips' ), ) ); } if ( ! $this->user_can_manage_document( sanitize_text_field( $_POST['document_type'] ) ) ) { wp_send_json_error( array( 'message' => esc_html__( 'No permissions!', 'woocommerce-pdf-invoices-packing-slips' ), ) ); } $order_id = absint( $_POST['order_id'] ); $order = wc_get_order( $order_id ); $document_type = sanitize_text_field( $_POST['document_type'] ); $action_type = sanitize_text_field( $_POST['action_type'] ); $notice = sanitize_text_field( $_POST['wpcdf_document_data_notice'] ); // parse form data parse_str( $_POST['form_data'], $form_data ); if ( is_array( $form_data ) ) { foreach ( $form_data as $key => &$value ) { if ( is_array( $value ) && !empty( $value[$order_id] ) ) { $value = $value[$order_id]; } } } $form_data = stripslashes_deep( $form_data ); // notice messages $notice_messages = array( 'saved' => array( 'success' => __( 'Document data saved!', 'woocommerce-pdf-invoices-packing-slips' ), 'error' => __( 'An error occurred while saving the document data!', 'woocommerce-pdf-invoices-packing-slips' ), ), 'regenerated' => array( 'success' => __( 'Document regenerated!', 'woocommerce-pdf-invoices-packing-slips' ), 'error' => __( 'An error occurred while regenerating the document!', 'woocommerce-pdf-invoices-packing-slips' ), ), 'deleted' => array( 'success' => __( 'Document deleted!', 'woocommerce-pdf-invoices-packing-slips' ), 'error' => __( 'An error occurred while deleting the document!', 'woocommerce-pdf-invoices-packing-slips' ), ), ); try { $document = wcpdf_get_document( $document_type, wc_get_order( $order_id ) ); if( ! empty( $document ) ) { // perform legacy date fields replacements check if( isset( $form_data["_wcpdf_{$document->slug}_date"] ) && ! is_array( $form_data["_wcpdf_{$document->slug}_date"] ) ) { $form_data = $this->legacy_date_fields_replacements( $form_data, $document->slug ); } // save document data $document_data = $this->process_order_document_form_data( $form_data, $document->slug ); // on regenerate if( $action_type == 'regenerate' && $document->exists() ) { $document->regenerate( $order, $document_data ); WPO_WCPDF()->main->log_document_creation_trigger_to_order_meta( $document, 'document_data', true ); $response = array( 'message' => $notice_messages[$notice]['success'], ); // on delete } elseif( $action_type == 'delete' && $document->exists() ) { $document->delete(); $response = array( 'message' => $notice_messages[$notice]['success'], ); // on save } elseif( $action_type == 'save' ) { $is_new = false === $document->exists(); $document->set_data( $document_data, $order ); // check if we have number, and if not generate one if( $document->get_date() && ! $document->get_number() && is_callable( array( $document, 'init_number' ) ) ) { $document->init_number(); } $document->save(); if ( $is_new ) { WPO_WCPDF()->main->log_document_creation_to_order_notes( $document, 'document_data' ); WPO_WCPDF()->main->log_document_creation_trigger_to_order_meta( $document, 'document_data' ); WPO_WCPDF()->main->mark_document_printed( $document, 'document_data' ); } $response = array( 'message' => $notice_messages[$notice]['success'], ); // document not exist } else { $message_complement = __( 'Document does not exist.', 'woocommerce-pdf-invoices-packing-slips' ); wp_send_json_error( array( 'message' => wp_kses_post( $notice_messages[$notice]['error'] . ' ' . $message_complement ), ) ); } // clean/escape response message if ( ! empty( $response['message'] ) ) { $response['message'] = wp_kses_post( $response['message'] ); } wp_send_json_success( $response ); } else { $message_complement = __( 'Document is empty.', 'woocommerce-pdf-invoices-packing-slips' ); wp_send_json_error( array( 'message' => wp_kses_post( $notice_messages[$notice]['error'] . ' ' . $message_complement ), ) ); } } catch ( \Throwable $e ) { wp_send_json_error( array( 'message' => wp_kses_post( $notice_messages[$notice]['error'] . ' ' . $e->getMessage() ), ) ); } } public function legacy_date_fields_replacements( $form_data, $document_slug ) { $legacy_date = sanitize_text_field( $form_data["_wcpdf_{$document_slug}_date"] ); $legacy_hour = sanitize_text_field( $form_data["_wcpdf_{$document_slug}_date_hour"] ); $legacy_minute = sanitize_text_field( $form_data["_wcpdf_{$document_slug}_date_minute"] ); unset( $form_data["_wcpdf_{$document_slug}_date_hour"] ); unset( $form_data["_wcpdf_{$document_slug}_date_minute"] ); $form_data["_wcpdf_{$document_slug}_date"] = array( 'date' => $legacy_date, 'hour' => $legacy_hour, 'minute' => $legacy_minute, ); return $form_data; } public function debug_enabled_warning( $wp_admin_bar ) { if ( isset(WPO_WCPDF()->settings->debug_settings['enable_debug']) && current_user_can( 'administrator' ) ) { $status_settings_url = 'admin.php?page=wpo_wcpdf_options_page&tab=debug'; $title = __( 'DEBUG output enabled', 'woocommerce-pdf-invoices-packing-slips' ); $args = array( 'id' => 'admin_bar_wpo_debug_mode', 'title' => sprintf( '%s', esc_attr( $status_settings_url ), esc_html( $title ) ), ); $wp_admin_bar->add_node( $args ); } } public function process_order_document_form_data( $form_data, $document_slug ) { $data = array(); if( isset( $form_data['_wcpdf_'.$document_slug.'_number'] ) ) { $data['number'] = sanitize_text_field( $form_data['_wcpdf_'.$document_slug.'_number'] ); } $date_entered = ! empty( $form_data['_wcpdf_'.$document_slug.'_date'] ) && ! empty( $form_data['_wcpdf_'.$document_slug.'_date']['date'] ); if( $date_entered ) { $date = $form_data['_wcpdf_'.$document_slug.'_date']['date']; $hour = ! empty( $form_data['_wcpdf_'.$document_slug.'_date']['hour'] ) ? $form_data['_wcpdf_'.$document_slug.'_date']['hour'] : '00'; $minute = ! empty( $form_data['_wcpdf_'.$document_slug.'_date']['minute'] ) ? $form_data['_wcpdf_'.$document_slug.'_date']['minute'] : '00'; // clean & sanitize input $date = date( 'Y-m-d', strtotime( $date ) ); $hour = sprintf('%02d', intval( $hour )); $minute = sprintf('%02d', intval( $minute ) ); $data['date'] = "{$date} {$hour}:{$minute}:00"; } elseif ( ! $date_entered && !empty( $_POST['_wcpdf_'.$document_slug.'_number'] ) ) { $data['date'] = current_time( 'timestamp', true ); } if ( isset( $form_data['_wcpdf_'.$document_slug.'_notes'] ) ) { // allowed HTML $allowed_html = array( 'a' => array( 'href' => array(), 'title' => array(), 'id' => array(), 'class' => array(), 'style' => array(), ), 'br' => array(), 'em' => array(), 'strong'=> array(), 'div' => array( 'id' => array(), 'class' => array(), 'style' => array(), ), 'span' => array( 'id' => array(), 'class' => array(), 'style' => array(), ), 'p' => array( 'id' => array(), 'class' => array(), 'style' => array(), ), 'b' => array(), ); $data['notes'] = wp_kses( $form_data['_wcpdf_'.$document_slug.'_notes'], $allowed_html ); } return $data; } public function add_invoice_number_to_order_report( $response ) { $order = wc_get_order( $response->data['order_id'] ); if ( ! empty( $order ) ) { $response->data['invoice_number'] = $order->get_meta( '_wcpdf_invoice_number' ); } return $response; } public function add_invoice_number_header_to_order_export( $export_columns ) { $export_columns['invoice_number'] = __( 'Invoice Number', 'woocommerce-pdf-invoices-packing-slips' ); return $export_columns; } public function add_invoice_number_value_to_order_export( $export_item, $item ) { if ( ! empty( $item['invoice_number'] ) ) { $export_item['invoice_number'] = $item['invoice_number']; } return $export_item; } } endif; // class_exists