You are here

function uc_fedex_confirm_shipment_submit in FedEx Shipping 7.2

Same name and namespace in other branches
  1. 6.2 uc_fedex.ship.inc \uc_fedex_confirm_shipment_submit()

Generates shipping labels.

See also

uc_fedex_confirm_shipment()

File

./uc_fedex.ship.inc, line 358
FedEx Web Services Rate / Available Services Quote.

Code

function uc_fedex_confirm_shipment_submit($form, &$form_state) {

  // Recover shipment data from session.
  $order_id = $_SESSION['fedex']['order_id'];
  $packages = $_SESSION['fedex']['packages'];
  $origin = $_SESSION['fedex']['origin'];
  $destination = $_SESSION['fedex']['destination'];

  //
  // Assemble the label request and send it off to FedEx.
  //
  $mp_response = uc_fedex_shipment_request($_SESSION['fedex']['packages'], $origin, $destination, $_SESSION['fedex']['service']);

  //
  // Loop over responses, to handle case of multi-package shipments.
  //
  foreach ($mp_response as $response) {

    // Package tracking numbers.
    $tracking[] = $response->CompletedShipmentDetail->CompletedPackageDetails->TrackingIds->TrackingNumber;
    if (isset($response->CompletedShipmentDetail->RoutingDetail->DeliveryDate)) {
      $exp_delivery[] = date_parse($response->CompletedShipmentDetail->RoutingDetail->DeliveryDate);
    }
    else {
      $exp_delivery[] = array(
        'month' => 0,
        'day' => 0,
        'year' => 0,
      );

      // Ground and Home Delivery don't have DeliveryDate,
      // they have TransitTime instead.
    }
  }

  // Final package in shipment contains summary information.
  $last_package = end($mp_response);
  $rating = $last_package->CompletedShipmentDetail->ShipmentRating;

  // Check to see if we're quoting ACCOUNT or LIST rates.
  if (variable_get('uc_fedex_quote_type', 'list') == 'list') {

    // LIST rate
    // LIST quotes return ACCOUNT rates (in ShipmentRateDetails[0])
    // and LIST rates (in ShipmentRateDetails[1]).
    $ratedetail = $rating->ShipmentRateDetails[1];
  }
  else {

    // ACCOUNT rate
    // ACCOUNT quotes may return either ACCOUNT rates only OR
    // ACCOUNT rates and LIST rates.  Check.
    if (is_array($rating->ShipmentRateDetails)) {
      $ratedetail = $rating->ShipmentRateDetails[0];
    }
    else {
      $ratedetail = $rating->ShipmentRateDetails;
    }
  }
  $shipment_charge = $ratedetail->TotalNetCharge;

  // Build $shipment object to return to uc_shipment.
  $shipment = new stdClass();
  $shipment->order_id = $order_id;
  $shipment->origin = clone $_SESSION['fedex']['origin'];
  $shipment->destination = clone $_SESSION['fedex']['destination'];
  $shipment->packages = $_SESSION['fedex']['packages'];
  $shipment->shipping_method = 'fedex';
  $shipment->accessorials = $_SESSION['fedex']['service'];
  $shipment->carrier = t('FedEx');
  $shipment->cost = (string) $shipment_charge->Amount;
  $shipment->tracking_number = (string) $tracking[0];
  $ship_date = $_SESSION['fedex']['ship_date'];
  $shipment->ship_date = gmmktime(12, 0, 0, $ship_date['month'], $ship_date['day'], $ship_date['year']);
  $shipment->expected_delivery = gmmktime(12, 0, 0, $exp_delivery[0]['month'], $exp_delivery[0]['day'], $exp_delivery[0]['year']);

  // Loop over packages in shipment to store labels and tracking numbers.
  foreach ($mp_response as $package_results) {
    $package =& current($shipment->packages);
    $package->tracking_number = (string) $package_results->CompletedShipmentDetail->CompletedPackageDetails->TrackingIds->TrackingNumber;
    $label_image = $package_results->CompletedShipmentDetail->CompletedPackageDetails->Label->Parts->Image;

    // Save the label.
    $directory = 'public://fedex_labels';
    if (file_prepare_directory($directory, FILE_CREATE_DIRECTORY)) {
      $label_path = $directory . '/label-' . $package->tracking_number . '.' . strtolower(variable_get('uc_fedex_label_image_format', 'PDF'));
      if ($label_file = file_save_data($label_image, $label_path, FILE_EXISTS_REPLACE)) {
        file_usage_add($label_file, 'uc_shipping', 'package', $package->package_id);
        $package->label_image = $label_file;
      }
      else {
        drupal_set_message(t('Could not open a file to save the label image.'), 'error');
      }
    }
    else {
      drupal_set_message(t('Could not find or create the directory %directory in the file system path.', array(
        '%directory' => $directory,
      )), 'error');
    }
    unset($package);
    next($shipment->packages);
  }
  uc_shipping_shipment_save($shipment);
  unset($_SESSION['fedex']);
  $form_state['redirect'] = 'admin/store/orders/' . $order_id . '/shipments';
}