PluginProbe
WCPOS – Point of Sale (POS) plugin for WooCommerce / 1.9.14
WCPOS – Point of Sale (POS) plugin for WooCommerce v1.9.14
1.10.19 1.10.18 1.10.17 1.10.16 1.10.15 1.10.13 1.10.14 1.10.12 1.10.11 1.10.10 1.10.9 1.10.8 untagged-3d9b7ccddc54df87c672 1.10.7 1.10.6 1.10.5 1.10.3 1.10.4 1.10.2 1.10.1 1.10.0 1.9.17 1.9.15 1.9.16 1.9.14 All 163 releases
woocommerce-pos / includes / Admin / Orders / Single_Order.php

Single_Order.php in WCPOS – Point of Sale (POS) plugin for WooCommerce 1.9.14, at includes/Admin/Orders/Single_Order.php

135 lines 4.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Single Order
4 *
5 * @package WCPOS\WooCommercePOS
6 */
7
8 namespace WCPOS\WooCommercePOS\Admin\Orders;
9
10 use WC_Abstract_Order;
11
12 /**
13 * Single_Order class.
14 */
15 class Single_Order {
16
17 /**
18 * Constructor.
19 */
20 public function __construct() {
21 add_filter( 'wc_order_is_editable', array( $this, 'wc_order_is_editable' ), 10, 2 );
22 add_action( 'woocommerce_admin_order_data_after_order_details', array( $this, 'add_cashier_select' ) );
23 add_action( 'woocommerce_process_shop_order_meta', array( $this, 'save_cashier_select' ) );
24
25 $this->add_available_gateways();
26 }
27
28 /**
29 * We need to add the POS gateways to the available gateways for the edit order dropdown.
30 * It's possible another plugin could just re-init after us, but this will work for most cases.
31 */
32 public function add_available_gateways() {
33 // @phpstan-ignore-next-line
34 if ( WC()->payment_gateways() ) {
35 $payment_gateways = WC()->payment_gateways->payment_gateways;
36 $settings = woocommerce_pos_get_settings( 'payment_gateways' );
37
38 // Add POS gateways to the available gateways for the edit order dropdown.
39 foreach ( $payment_gateways as $gateway ) {
40 if ( isset( $settings['gateways'][ $gateway->id ] ) && $settings['gateways'][ $gateway->id ]['enabled'] ) {
41 $gateway->enabled = 'yes';
42 }
43 }
44
45 // Directly set the modified gateways back to the WooCommerce Payment Gateways instance.
46 WC()->payment_gateways->payment_gateways = $payment_gateways;
47 }
48 }
49
50 /**
51 * Makes POS orders editable by default.
52 *
53 * @param bool $is_editable Whether the order is editable.
54 * @param WC_Abstract_Order $order The order object.
55 *
56 * @return bool
57 */
58 public function wc_order_is_editable( $is_editable, WC_Abstract_Order $order ) {
59 if ( 'pos-open' == $order->get_status() ) {
60 return true;
61 }
62
63 return $is_editable;
64 }
65
66 /**
67 * Add cashier select to order page.
68 *
69 * @param WC_Abstract_Order $order Order object.
70 */
71 public function add_cashier_select( $order ): void {
72 // only show if order created by POS.
73 if ( ! woocommerce_pos_is_pos_order( $order ) ) {
74 return;
75 }
76
77 $cashier_id = $order->get_meta( '_pos_user' );
78
79 // Create nonce for security.
80 wp_nonce_field( 'pos_cashier_select_action', 'pos_cashier_select_nonce' );
81
82 echo '<p class="form-field form-field-wide">';
83 echo '<label for="_pos_user">' . /* translators: Order list label shown in WooCommerce admin for POS orders. */ esc_html__( 'POS Cashier', 'woocommerce-pos' ) . ':</label>';
84 echo '<select class="wc-customer-search" id="_pos_user" name="_pos_user" data-placeholder="' . /* translators: Order list label shown in WooCommerce admin for POS orders. */ esc_attr__( 'Search for a cashier&hellip;', 'woocommerce-pos' ) . '" data-allow_clear="true" style="width: 100%;">';
85 if ( $cashier_id ) {
86 $user = get_user_by( 'id', $cashier_id );
87 if ( $user ) {
88 echo '<option value="' . esc_attr( (string) $user->ID ) . '"' . selected( true, true, false ) . '>' . esc_html( $user->display_name . ' (#' . $user->ID . ' &ndash; ' . $user->user_email ) . ')</option>';
89 }
90 }
91 echo '</select>';
92 echo '</p>';
93 }
94
95 /**
96 * Save store select in order admin.
97 *
98 * @param int $post_id The post ID.
99 */
100 public function save_cashier_select( $post_id ): void {
101 // Security checks.
102 if ( ! isset( $_POST['pos_cashier_select_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['pos_cashier_select_nonce'] ) ), 'pos_cashier_select_action' ) ) {
103 return;
104 }
105
106 /**
107 * NOTE: HPOS adds a second arg for WC_Abstract_Order, but we will make it backwards compatible.
108 */
109 $order = wc_get_order( $post_id );
110
111 // Check if $order is instance of WC_Abstract_Order and $_POST['_pos_user'] is set.
112 if ( $order instanceof WC_Abstract_Order && isset( $_POST['_pos_user'] ) ) {
113 $new_pos_cashier = (int) sanitize_text_field( wp_unslash( $_POST['_pos_user'] ) );
114 $current_pos_cashier = (int) $order->get_meta( '_pos_user' );
115
116 // Update meta only if _pos_user has changed.
117 if ( $current_pos_cashier !== $new_pos_cashier ) {
118 $order->update_meta_data( '_pos_user', (string) $new_pos_cashier );
119 $order->save();
120
121 // Add an order note indicating the change.
122 $current_cashier = get_userdata( $current_pos_cashier );
123 $new_cashier = get_userdata( $new_pos_cashier );
124 $note = sprintf(
125 // translators: 1: old POS cashier, 2: new POS cashier.
126 __( 'POS cashier changed from %1$s to %2$s.', 'woocommerce-pos' ),
127 $current_cashier ? $current_cashier->display_name : /* translators: Fallback cashier name shown when the POS cashier user cannot be found. */ __( 'Unknown', 'woocommerce-pos' ),
128 $new_cashier ? $new_cashier->display_name : /* translators: Fallback cashier name shown when the POS cashier user cannot be found. */ __( 'Unknown', 'woocommerce-pos' )
129 );
130 $order->add_order_note( $note );
131 }
132 }
133 }
134 }
135