protected function potentially_update_selected_payment_method_from_payment_methods($payment_methods)
 {
     $payment_method_count = count($payment_methods);
     // No payment methods at all? Clear anything we have stored
     if (0 === $payment_method_count) {
         $this->service_settings_store->set_selected_payment_method_id(0);
         return;
     }
     $payment_method_ids = array();
     foreach ((array) $payment_methods as $payment_method) {
         $payment_method_id = intval($payment_method->payment_method_id);
         if (0 !== $payment_method_id) {
             $payment_method_ids[] = $payment_method_id;
         }
     }
     // Just one? Go ahead and use it
     if (1 === $payment_method_count) {
         $this->service_settings_store->set_selected_payment_method_id($payment_method_ids[0]);
         return;
     }
     // Is the stored method id not in the list? Select the first one
     $selected_payment_method_id = $this->service_settings_store->get_selected_payment_method_id();
     if (!in_array($selected_payment_method_id, $payment_method_ids)) {
         $this->service_settings_store->set_selected_payment_method_id($payment_method_ids[0]);
     }
 }
 /**
  * Attempts to update the settings on a particular service and instance
  */
 public function update_item($request)
 {
     $request_params = $request->get_params();
     $id = array_key_exists('id', $request_params) ? $request_params['id'] : '';
     $instance = array_key_exists('instance', $request_params) ? absint($request_params['instance']) : false;
     if (empty($id)) {
         $error = new WP_Error('service_id_missing', __('Unable to update service settings. Form data is missing service ID.', 'connectforwoocommerce'), array('status' => 400));
         $this->logger->log($error, __CLASS__);
         return $error;
     }
     $request_body = $request->get_body();
     $settings = json_decode($request_body, false, WOOCOMMERCE_CONNECT_MAX_JSON_DECODE_DEPTH);
     if (empty($settings)) {
         $error = new WP_Error('bad_form_data', __('Unable to update service settings. The form data could not be read.', 'connectforwoocommerce'), array('status' => 400));
         $this->logger->log($error, __CLASS__);
         return $error;
     }
     $validation_result = $this->service_settings_store->validate_and_possibly_update_settings($settings, $id, $instance);
     if (is_wp_error($validation_result)) {
         $error = new WP_Error('validation_failed', sprintf(__('Unable to update service settings. Validation failed. %s', 'connectforwoocommerce'), $validation_result->get_error_message()), array_merge(array('status' => 400), $validation_result->get_error_data()));
         $this->logger->log($error, __CLASS__);
         return $error;
     }
     return new WP_REST_Response(array('success' => true), 200);
 }
 public function get_item($request)
 {
     $raw_params = $request->get_params();
     $params = array();
     $params['paper_size'] = $raw_params['paper_size'];
     $this->settings_store->set_preferred_paper_size($params['paper_size']);
     $n_label_ids = isset($raw_params['label_ids']) ? count($raw_params['label_ids']) : 0;
     $n_captions = isset($raw_params['captions']) ? count($raw_params['captions']) : 0;
     // Either there are the same number of captions as labels, or no captions at all
     if (!$n_label_ids || $n_captions && $n_captions !== $n_label_ids) {
         $message = __('Invalid PDF request.', 'woocommerce');
         $error = new WP_Error('invalid_pdf_request', $message, array('message' => $message, 'status' => 400));
         $this->logger->log($error, __CLASS__);
         return $error;
     }
     $params['labels'] = array();
     for ($i = 0; $i < $n_label_ids; $i++) {
         $params['labels'][$i] = array();
         $params['labels'][$i]['label_id'] = (int) $raw_params['label_ids'][$i];
         if ($n_captions) {
             $params['labels'][$i]['caption'] = $raw_params['captions'][$i];
         }
     }
     $raw_response = $this->api_client->get_labels_print_pdf($params);
     if (is_wp_error($raw_response)) {
         $this->logger->log($raw_response, __CLASS__);
         return $raw_response;
     }
     header('content-type: ' . $raw_response['headers']['content-type']);
     echo $raw_response['body'];
     die;
 }
 public function update_items($request)
 {
     $request = json_decode($request->get_body(), false, WOOCOMMERCE_CONNECT_MAX_JSON_DECODE_DEPTH);
     $name = $request->address->name;
     unset($request->address->name);
     $company = $request->address->company;
     unset($request->address->company);
     $phone = $request->address->phone;
     unset($request->address->phone);
     $body = array('destination' => $request->address, 'carrier' => 'usps');
     $response = $this->api_client->send_address_normalization_request($body);
     if (is_wp_error($response)) {
         $error = new WP_Error($response->get_error_code(), $response->get_error_message(), array('message' => $response->get_error_message()));
         $this->logger->log($error, __CLASS__);
         return $error;
     }
     if (isset($response->error)) {
         $error = new WP_Error($response->error->code, $response->error->message, array('message' => $response->error->message));
         $this->logger->log($error, __CLASS__);
         return $error;
     }
     $response->normalized->name = $name;
     $response->normalized->company = $company;
     $response->normalized->phone = $phone;
     if ('origin' === $request->type) {
         $this->settings_store->update_origin_address($response->normalized);
     }
     return array('success' => true, 'normalized' => $response->normalized);
 }
 public function update_items($request)
 {
     $request_body = $request->get_body();
     $packages = json_decode($request_body, true, WOOCOMMERCE_CONNECT_MAX_JSON_DECODE_DEPTH);
     $this->service_settings_store->update_packages($packages['custom']);
     $this->service_settings_store->update_predefined_packages($packages['predefined']);
     return new WP_REST_Response(array('success' => true), 200);
 }
 public function get_item($request)
 {
     $response = $this->api_client->get_label_status($request['label_id']);
     if (is_wp_error($response)) {
         $error = new WP_Error($response->get_error_code(), $response->get_error_message(), array('message' => $response->get_error_message()));
         $this->logger->log($error, __CLASS__);
         return $error;
     }
     $this->settings_store->update_label_order_meta_data($request['order_id'], $response->label);
     return array('success' => true, 'label' => $response->label);
 }
 public function update_items($request)
 {
     $request_body = $request->get_body();
     $settings = json_decode($request_body, true, WOOCOMMERCE_CONNECT_MAX_JSON_DECODE_DEPTH);
     $result = $this->settings_store->update_account_settings($settings);
     if (is_wp_error($result)) {
         $error = new WP_Error('save_failed', sprintf(__('Unable to update settings. %s', 'connectforwoocommerce'), $result->get_error_message()), array_merge(array('status' => 400), $result->get_error_data()));
         $this->logger->log($error, __CLASS__);
         return $error;
     }
     return new WP_REST_Response(array('success' => true), 200);
 }
 public function set_last_request_failed($timestamp = null)
 {
     if (is_null($timestamp)) {
         $timestamp = time();
     }
     update_option($this->service_settings_store->get_service_failure_timestamp_key($this->id, $this->instance_id), $timestamp);
 }
        public function meta_box($post)
        {
            $order = wc_get_order($post);
            $debug_page_uri = esc_url(add_query_arg(array('page' => 'wc-status', 'tab' => 'connect'), admin_url('admin.php')));
            $store_options = $this->settings_store->get_store_options();
            $root_view = 'wc-connect-create-shipping-label';
            $admin_array = array('purchaseURL' => get_rest_url(null, '/wc/v1/connect/label/purchase'), 'addressNormalizationURL' => get_rest_url(null, '/wc/v1/connect/normalize-address'), 'getRatesURL' => get_rest_url(null, '/wc/v1/connect/shipping-rates'), 'labelStatusURL' => get_rest_url(null, '/wc/v1/connect/label/' . $order->id . '-%d'), 'labelRefundURL' => get_rest_url(null, '/wc/v1/connect/label/' . $order->id . '-%d/refund'), 'labelsPreviewURL' => get_rest_url(null, '/wc/v1/connect/labels/preview'), 'labelsPrintURL' => get_rest_url(null, '/wc/v1/connect/labels/print'), 'paperSize' => $this->get_paper_size(), 'nonce' => wp_create_nonce('wp_rest'), 'rootView' => $root_view);
            $labels_data = get_post_meta($order->id, 'wc_connect_labels', true);
            if ($labels_data) {
                $admin_array['labelsData'] = json_decode($labels_data, true, WOOCOMMERCE_CONNECT_MAX_JSON_DECODE_DEPTH);
            } else {
                $store_options['countriesData'] = $this->get_states_map();
                $admin_array['formData'] = $this->get_form_data($order);
            }
            $admin_array['storeOptions'] = $store_options;
            wp_localize_script('wc_connect_admin', 'wcConnectData', $admin_array);
            wp_enqueue_script('wc_connect_admin');
            wp_enqueue_style('wc_connect_admin');
            ?>
			<div class="wc-connect-admin-container" id="<?php 
            echo esc_attr($root_view);
            ?>
">
				<span class="form-troubles" style="opacity: 0">
					<?php 
            printf(__('Shipping labels not loading? Visit the <a href="%s">status page</a> for troubleshooting steps.', 'connectforwoocommerce'), $debug_page_uri);
            ?>
				</span>
			</div>
			<?php 
        }
 public function update_items($request)
 {
     $response = $this->api_client->send_shipping_label_refund_request($request['label_id']);
     if (isset($response->error)) {
         $response = new WP_Error(property_exists($response->error, 'code') ? $response->error->code : 'refund_error', property_exists($response->error, 'message') ? $response->error->message : '');
     }
     if (is_wp_error($response)) {
         $response->add_data(array('message' => $response->get_error_message()), $response->get_error_code());
         $this->logger->log($response, __CLASS__);
         return $response;
     }
     // TODO: use $response->refund->amount ?
     $label_refund = (object) array('label_id' => (int) $response->label->id, 'refunded_time' => time() * 1000);
     $this->settings_store->update_label_order_meta_data($request['order_id'], $label_refund);
     return array('success' => true, 'label' => $label_refund);
 }
        public function output_packages_screen()
        {
            $debug_page_uri = esc_url(add_query_arg(array('page' => 'wc-status', 'tab' => 'connect'), admin_url('admin.php')));
            $store_options = $this->service_settings_store->get_store_options();
            $root_view = 'wc-connect-packages';
            $admin_array = array('storeOptions' => $store_options, 'formSchema' => $this->get_packages_form_schema(), 'formData' => $this->get_packages_form_data(), 'callbackURL' => get_rest_url(null, '/wc/v1/connect/packages'), 'nonce' => wp_create_nonce('wp_rest'), 'submitMethod' => 'POST', 'rootView' => $root_view);
            wp_localize_script('wc_connect_admin', 'wcConnectData', $admin_array);
            wp_enqueue_script('wc_connect_admin');
            wp_enqueue_style('wc_connect_admin');
            // hiding the save button because the react container has its own
            global $hide_save_button;
            $hide_save_button = true;
            ?>
			<div class="wc-connect-admin-container" id="<?php 
            echo esc_attr($root_view);
            ?>
">
				<span class="form-troubles" style="opacity: 0">
					<?php 
            printf(__('Settings not loading? Visit the <a href="%s">status page</a> for troubleshooting steps.', 'connectforwoocommerce'), $debug_page_uri);
            ?>
				</span>
			</div>
			<?php 
        }
 public function get_item($request)
 {
     $raw_params = $request->get_params();
     $params = array();
     $params['paper_size'] = $raw_params['paper_size'];
     $this->settings_store->set_preferred_paper_size($params['paper_size']);
     $params['carrier'] = 'usps';
     $params['labels'] = array();
     foreach ($raw_params['captions'] as $caption) {
         $params['labels'][] = array('caption' => $caption);
     }
     $raw_response = $this->api_client->get_labels_preview_pdf($params);
     if (is_wp_error($raw_response)) {
         $this->logger->log($raw_response, __CLASS__);
         return $raw_response;
     }
     header('content-type: ' . $raw_response['headers']['content-type']);
     echo $raw_response['body'];
     die;
 }
 public function update_items($request)
 {
     $request_body = $request->get_body();
     $settings = json_decode($request_body, true, WOOCOMMERCE_CONNECT_MAX_JSON_DECODE_DEPTH);
     $order_id = $settings['order_id'];
     $settings['payment_method_id'] = $this->settings_store->get_selected_payment_method_id();
     $settings['carrier'] = 'usps';
     $settings['label_size'] = 'default';
     $settings['ship_date'] = date('Y-m-d', time() + 86400);
     // tomorrow
     $service_names = array();
     foreach ($settings['packages'] as $index => $package) {
         $service_names[] = $package['service_name'];
         unset($package['service_name']);
         $settings['packages'][$index] = $package;
     }
     $response = $this->api_client->send_shipping_label_request($settings);
     if (is_wp_error($response)) {
         $error = new WP_Error($response->get_error_code(), $response->get_error_message(), array('message' => $response->get_error_message()));
         $this->logger->log($error, __CLASS__);
         return $error;
     }
     $labels_order_meta = array();
     $labels_data = array();
     foreach ($response->labels as $index => $label_data) {
         if (isset($label_data->error)) {
             $error = new WP_Error($label_data->error->code, $label_data->error->message, array('message' => $label_data->error->message));
             $this->logger->log($error, __CLASS__);
             return $error;
         }
         $labels_data[] = $label_data->label;
         $labels_order_meta[] = array('label_id' => $label_data->label->label_id, 'tracking' => $label_data->label->tracking_id, 'refundable_amount' => $label_data->label->refundable_amount, 'created' => $label_data->label->created, 'carrier_id' => $settings['carrier'], 'service_name' => $service_names[$index]);
     }
     update_post_meta($order_id, 'wc_connect_labels', json_encode($labels_order_meta));
     return array('labels' => $labels_order_meta, 'success' => true);
 }
        /**
         * Localizes the bootstrap, enqueues the script and styles for the help page
         */
        public function page()
        {
            $this->help_sections = array();
            $this->add_fieldset('health', _x('Health', 'This section displays the overall health of Connect for WooCommerce and the things it depends on', 'connectforwoocommerce'), $this->get_health_items());
            $this->add_fieldset('services', __('Services', 'connectforwoocommerce'), $this->get_services_items());
            $this->add_fieldset('debug', __('Debug', 'connectforwoocommerce'), $this->get_debug_items());
            $this->add_fieldset('support', __('Support', 'connectforwoocommerce'), $this->get_support_items());
            $root_view = 'wc-connect-admin-help';
            $admin_array = array('storeOptions' => $this->service_settings_store->get_store_options(), 'formSchema' => $this->get_form_schema(), 'formLayout' => $this->get_form_layout(), 'formData' => $this->get_form_data(), 'predefinedPackages' => array(), 'callbackURL' => get_rest_url(null, "/wc/v1/connect/self-help"), 'nonce' => wp_create_nonce('wp_rest'), 'rootView' => $root_view);
            wp_localize_script('wc_connect_admin', 'wcConnectData', $admin_array);
            wp_enqueue_script('wc_connect_admin');
            wp_enqueue_style('wc_connect_admin');
            ?>
				<h2>
					<?php 
            _e('Connect for WooCommerce Status', 'woocommerce');
            ?>
				</h2>
				<div class="wc-connect-admin-container" id="<?php 
            echo esc_attr($root_view);
            ?>
"></div>
			<?php 
        }