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 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 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 fetch_service_schemas_from_connect_server()
 {
     $response_body = $this->api_client->get_service_schemas();
     if (is_wp_error($response_body)) {
         $this->logger->log($response_body, __FUNCTION__);
         return;
     }
     $this->logger->log('Successfully loaded service schemas from server response.', __FUNCTION__);
     $this->update_last_fetch_timestamp();
     $this->maybe_update_heartbeat();
     // If we made it this far, it is safe to store the object
     $this->update_service_schemas($response_body);
 }
 /**
  *
  * @param WP_REST_Request $request - See WC_Connect_API_Client::get_label_rates()
  * @return array|WP_Error
  */
 public function update_items($request)
 {
     $request_body = $request->get_body();
     $payload = json_decode($request_body, true, WOOCOMMERCE_CONNECT_MAX_JSON_DECODE_DEPTH);
     // Hardcode USPS rates for now
     $payload['carrier'] = 'usps';
     $response = $this->api_client->get_label_rates($payload);
     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;
     }
     return array('success' => true, 'rates' => property_exists($response, 'rates') ? $response->rates : new stdClass());
 }
 public function fetch_payment_methods_from_connect_server()
 {
     $response_body = $this->api_client->get_payment_methods();
     if (is_wp_error($response_body)) {
         $this->logger->log($response_body, __FUNCTION__);
         return;
     }
     $payment_methods = $this->get_payment_methods_from_response_body($response_body);
     if (is_wp_error($payment_methods)) {
         $this->logger->log($payment_methods, __FUNCTION__);
         return;
     }
     // If we made it this far, it is safe to store the object
     $this->update_payment_methods($payment_methods);
     $this->potentially_update_selected_payment_method_from_payment_methods($payment_methods);
 }
 /**
  * Given id and possibly instance, validates the settings and, if they validate, saves them to options
  *
  * @return bool|WP_Error
  */
 public function validate_and_possibly_update_settings($settings, $id, $instance = false)
 {
     // Validate instance or at least id if no instance is given
     if (!empty($instance)) {
         $service_schema = $this->service_schemas_store->get_service_schema_by_instance_id($instance);
         if (!$service_schema) {
             wp_send_json_error(array('error' => 'bad_instance_id', 'message' => __('An invalid service instance was received.', 'connectforwoocommerce')));
         }
     } else {
         $service_schema = $this->service_schemas_store->get_service_schema_by_id($id);
         if (!$service_schema) {
             wp_send_json_error(array('error' => 'bad_service_id', 'message' => __('An invalid service ID was received.', 'connectforwoocommerce')));
         }
     }
     // Validate settings with WCC server
     $response_body = $this->api_client->validate_service_settings($id, $settings);
     if (is_wp_error($response_body)) {
         // TODO - handle multiple error messages when the validation endpoint can return them
         wp_send_json_error(array('error' => 'validation_failure', 'message' => $response_body->get_error_message(), 'data' => $response_body->get_error_data()));
     }
     // On success, save the settings to the database and exit
     update_option($this->get_service_settings_key($id, $instance), $settings);
     do_action('wc_connect_saved_service_settings', $id, $instance, $settings);
     return true;
 }
 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 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);
 }
 public function calculate_shipping($package = array())
 {
     if (!$this->is_valid_package_destination($package)) {
         return;
     }
     $service_settings = $this->get_service_settings();
     $settings_keys = get_object_vars($service_settings);
     if (empty($settings_keys)) {
         return $this->log(sprintf('Service settings empty. Skipping %s rate request (instance id %d).', $this->id, $this->instance_id), __FUNCTION__);
     }
     // TODO: Request rates for all Connect for WooCommerce powered methods in
     // the current shipping zone to avoid each method making an independent request
     $services = array(array('id' => $this->id, 'instance' => $this->instance_id, 'service_settings' => $service_settings));
     $boxes = $this->service_settings_store->get_packages();
     $response_body = $this->api_client->get_shipping_rates($services, $package, $boxes);
     if (is_wp_error($response_body)) {
         $this->log(sprintf('Error. Unable to get shipping rate(s) for %s instance id %d.', $this->id, $this->instance_id), __FUNCTION__);
         $this->set_last_request_failed();
         $this->log($response_body, __FUNCTION__);
         return;
     }
     if (!property_exists($response_body, 'rates')) {
         $this->set_last_request_failed();
         return;
     }
     $instances = $response_body->rates;
     foreach ((array) $instances as $instance) {
         if (!property_exists($instance, 'rates')) {
             continue;
         }
         $packaging_lookup = $this->service_settings_store->get_package_lookup_for_service($instance->id);
         foreach ((array) $instance->rates as $rate_idx => $rate) {
             $package_names = array();
             foreach ($rate->packages as $rate_package) {
                 $package_format = '';
                 $items = array();
                 foreach ($rate_package->items as $package_item) {
                     $product = $this->lookup_product($package, $package_item->product_id);
                     if ($product) {
                         $items[] = $product->get_title();
                     }
                 }
                 if (!property_exists($rate_package, 'box_id')) {
                     $package_format = __('Unknown package (%s)', 'connectforwoocommerce');
                 } else {
                     if ('individual' === $rate_package->box_id) {
                         $package_format = __('Individual packaging (%s)', 'connectforwoocommerce');
                     } else {
                         if (isset($packaging_lookup[$rate_package->box_id]) && isset($packaging_lookup[$rate_package->box_id]['name'])) {
                             $package_format = $packaging_lookup[$rate_package->box_id]['name'] . ' (%s)';
                         }
                     }
                 }
                 $package_names[] = sprintf($package_format, implode(', ', $items));
             }
             $packaging_info = implode(', ', $package_names);
             $rate_to_add = array('id' => self::format_rate_id($instance->id, $instance->instance, $rate_idx), 'label' => self::format_rate_title($rate->title), 'cost' => $rate->rate, 'calc_tax' => 'per_item', 'meta_data' => array('wc_connect_packages' => json_encode($rate->packages), __('Packaging', 'connectforwoocommerce') => $packaging_info));
             $this->add_rate($rate_to_add);
         }
     }
     $this->update_last_rate_request_timestamp();
     $this->set_last_request_failed(0);
 }