public static function display($productId)
 {
     $discount = Discounts::whereStatus('active')->whereProductId($productId)->first();
     if ($discount) {
         return $discount->discount_type == 'percentage' ? $discount->amount . '%' : $discount->amount;
     } else {
         return null;
     }
 }
 public static function dropdownList($exludeDiscounted = false)
 {
     $discountedProducts = Discounts::select('product_id')->get()->lists('product_id');
     if ($exludeDiscounted && $discountedProducts) {
         $products = Products::whereNotIn('id', Discounts::select('product_id')->get()->lists('product_id'))->orderBy('name', 'asc')->select('id', DB::raw('CONCAT(name, " - Rs ",  sp) as name'))->get();
     } else {
         $products = Products::orderBy('name', 'asc')->select('id', DB::raw('CONCAT(name, " - Rs ",  sp) as name'))->get();
     }
     return array('' => 'Select Product') + $products->lists('name', 'id');
 }
 public function approvingDiscounts()
 {
     if (Auth::check()) {
         $inputs = Input::all();
         $send_details = Discounts::approveDiscounts($inputs);
         if ($send_details) {
             return Response::json(array("status" => 'success', $send_details));
         } else {
             return Response::json(array("status" => 'failure', $send_details));
         }
     }
 }
Beispiel #4
0
 function initQuery($params)
 {
     $cost_type_id = $params['cost_type_id'];
     $b_active_only = $params['b_active_only'];
     $tables = Discounts::getTables();
     $tr = $tables['discounts_global_discount_rates_table']['columns'];
     $this->addSelectField($tr["id"], "id");
     $this->addSelectField($tr["rv_from"], "rv_from");
     $this->addSelectField($tr["rv_to"], "rv_to");
     $this->addSelectField($tr["cost_type_id"], "cost_type_id");
     $this->addSelectField($tr["b_active"], "b_active");
     $this->addSelectField($tr["cost"], "cost");
     $this->WhereValue('', '', '1');
     if ($cost_type_id !== NULL) {
         $this->WhereAnd();
         $this->WhereValue($tr["cost_type_id"], DB_EQ, $cost_type_id);
     }
     if ($b_active_only === true) {
         $this->WhereAND();
         $this->WhereValue($tr["b_active"], DB_EQ, 1);
     }
     $this->SelectOrder($tr['rv_from']);
 }
 /**
  * Remove the specified resource from storage.
  *
  * @param  int $id
  * @return Response
  */
 public function destroy($id)
 {
     if (!$id) {
         return Redirect::route('discounts.index')->with('error', 'Please provide discount id');
     }
     $discount = Discounts::find($id);
     if (empty($discount)) {
         return Redirect::route('discounts.index')->with('error', 'Discount not found');
     }
     Discounts::destroy($id);
     return Redirect::route('discounts.index')->with('success', 'Discount deleted successfully');
 }
Beispiel #6
0
 /**
  * Compares the discount options applicable for the vehicle by their orders
  * @param Reduceri $option1
  * @param Reduceri $option2
  * @return int &lt; 0 if <i>order1</i> is less than
  * <i>order2</i>; &gt; 0 if <i>order1</i>
  * is greater than <i>order2</i>, and 0 if they are
  * equal.
  */
 public function compareDiscountOptions(Discounts $option1, Discounts $option2)
 {
     return strcmp($option1->getOrder(), $option2->getOrder());
 }
Beispiel #7
0
 /**
  * Get shipping methods.
  */
 function get_shipping_methods($cart)
 {
     // Let cart override?
     if ($cart['shipping_methods']) {
         $methods = $cart['shipping_methods'];
     } else {
         // Zip and weight required.
         if (!$cart['order']['shipping']['zip'] || !$cart['weight']) {
             return false;
         }
         // Params used to cache shipping methods.
         $params = array('country' => $cart['order']['shipping']['country'], 'zip' => $cart['order']['shipping']['zip'], 'weight' => $cart['weight'], 'discounts' => $cart['discounts']);
         // Cache for 1 hour.
         $cache_uri = "/cache/shipping_methods/" . md5(serialize($params)) . "?expire=3600";
         $methods = get($cache_uri);
         // Not cached?
         if (count($methods) == 0) {
             // Get available methods.
             $methods = get("/shipments/methods", $params);
             // Put result in cache?
             if ($methods && !$methods['errors']) {
                 put($cache_uri, $methods);
             }
         }
     }
     // Apply discounts.
     $methods = Discounts::apply_shipping($cart, $methods, $cart['discounts']);
     return $methods;
 }
 /**
  * Uninstall the module.
  *                           .
  *
  *       uninstall()                      .
  *
  *                                          ,         ,
  * Discounts::getTables()        $this->getTables()
  */
 function uninstall()
 {
     $query = new DB_Table_Delete(Discounts::getTables());
     global $application;
     $application->db->getDB_Result($query);
 }
Beispiel #9
0
 /**
  * @return int
  */
 private function discount()
 {
     return $this->discounts->calculate($this->books);
 }
Beispiel #10
0
/**
 * Get UPS rate quotes.
 */
function fwd_ups_rates($params, $settings)
{
    // Configurable UPS service methods.
    $service_list = array('01' => 'UPS Next Day Air', '02' => 'UPS Second Day Air', '03' => 'UPS Ground', '11' => 'UPS Standard', '12' => 'UPS Three-Day Select', '13' => 'UPS Next Day Air Saver', '65' => 'UPS Worldwide Saver', '07' => 'UPS Worldwide Express', '08' => 'UPS Worldwide Expedited', '14' => 'UPS Next Day Air Early A.M.', '54' => 'UPS Worldwide Express Plus', '59' => 'UPS Second Day Air A.M.');
    // If params are empty, return available methods only.
    if (empty($params)) {
        $methods = array();
        foreach ((array) $settings['methods'] as $key => $method) {
            if ($method) {
                $method = is_array($method) ? $method : array();
                $methods[] = array('id' => $key, 'name' => $method['name'] ?: $service_list[$key]);
            }
        }
        return $methods;
    }
    // Get shipper, default or specific settings.
    $shipper = array_merge(array('package_weight' => 100), (array) $settings['shippers'][0], (array) $settings['shippers'][$params['shipper']]);
    // Split package by weight limit?
    if ($shipper['package_weight'] && $params['weight'] > $shipper['package_weight']) {
        $num_packages = ceil($params['weight'] / $shipper['package_weight']);
        for ($i = 0; $i < $num_packages; $i++) {
            if ($i >= 200) {
                break;
            }
            $params['packages'][$i] = array('weight' => $params['weight'] / $num_packages, 'units' => $params['units']);
        }
    } else {
        $params['packages'][1] = array('weight' => $params['weight'] ?: 1, 'units' => $params['units']);
    }
    // Add package(s) to request.
    foreach ($params['packages'] as $package) {
        // Dimensions?
        if ($package['dimensions']) {
            $package_dimensions = "\n\t\t\t\t<Dimensions>\n\t\t\t\t\t<Length>{$package['dimensions']['length']}</Length>\n\t\t\t\t\t<Width>{$package['dimensions']['width']}</Width>\n\t\t\t\t\t<Height>{$package['dimensions']['height']}</Height>\n\t\t\t\t\t<UnitOfMeasurement>\n\t\t\t\t\t\t<Code>" . ($package['dimensions']['units'] ?: 'IN') . "</Code>\n\t\t\t\t\t</UnitOfMeasurement>\n\t\t\t\t</Dimensions>\n\t\t\t";
        } else {
            $package_dimensions = null;
        }
        $request_packages .= "\n\t\t\t<Package>\n\t\t\t\t<PackagingType>\n\t\t\t\t\t<Code>02</Code>\n\t\t\t\t</PackagingType>\n\t\t\t\t<PackageWeight>\n\t\t\t\t\t<UnitOfMeasurement>\n\t\t\t\t\t\t<Code>" . ($package['units'] ? "{$package['units']}S" : 'LBS') . "</Code>\n\t\t\t\t\t</UnitOfMeasurement>\n\t\t\t\t\t<Weight>{$package['weight']}</Weight>\n\t\t\t\t</PackageWeight>\n\t\t\t\t{$package_dimensions}\n\t\t\t</Package>\n\t\t";
    }
    // XML API call.
    $request = "\n\t\t<?xml version=\"1.0\" ?>\n\t\t<AccessRequest xml:lang='en-US'>\n\t\t\t<AccessLicenseNumber>{$settings['license']}</AccessLicenseNumber>\n\t\t\t<UserId>{$settings['login']}</UserId>\n\t\t\t<Password>{$settings['password']}</Password>\n\t\t</AccessRequest>\n\t\t<?xml version=\"1.0\" ?>\n\t\t<RatingServiceSelectionRequest>\n\t\t\t<Request>\n\t\t\t\t<RequestAction>Rate</RequestAction>\n\t\t\t\t<RequestOption>Shop</RequestOption>\n\t\t\t</Request>\n\t\t\t<PickupType>\n\t\t\t\t<Code>01</Code>\n\t\t\t</PickupType>\n\n\t\t\t<Shipment>\n\t\t\t\t<Shipper>\n\t\t\t\t\t<ShipperNumber>" . ($shipper['account'] ?: $settings['account']) . "</ShipperNumber>\n\t\t\t\t\t<Address>\n\t\t\t\t\t\t<City>{$shipper['city']}</City>\n\t\t\t\t\t\t<PostalCode>{$shipper['zip']}</PostalCode>\n\t\t\t\t\t\t<CountryCode>" . ($shipper['country'] ?: 'US') . "</CountryCode>\n\t\t\t\t\t</Address>\n\t\t\t\t</Shipper>\n\n\t\t\t\t<ShipTo>\n\t\t\t\t\t<Address>\n\t\t\t\t\t\t<City>{$params['city']}</City>\n\t\t\t\t\t\t<StateProvinceCode>{$params['state']}</StateProvinceCode>\n\t\t\t\t\t\t<PostalCode>{$params['zip']}</PostalCode>\n\t\t\t\t\t\t<CountryCode>" . ($params['country'] ?: 'US') . "</CountryCode>\n\t\t\t\t\t\t<ResidentialAddressIndicator/>\n\t\t\t\t\t</Address>\n\t\t\t\t</ShipTo>\n\n\t\t\t\t{$request_packages}\n\n\t\t\t</Shipment>\n\n\t\t</RatingServiceSelectionRequest>\n\t";
    // Initialize connection with UPS service.
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $settings['host'] ?: "https://wwwcie.ups.com/ups.app/xml/Rate");
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($ch);
    curl_close($ch);
    if ($response) {
        $doc = new SimpleXMLElement($response);
        $response_code = (string) $doc->Response[0]->ResponseStatusCode;
    }
    switch ($response_code) {
        // Good response.
        case 1:
            foreach ($doc->RatedShipment as $shipment) {
                if ($service_type = (string) $shipment->Service[0]->Code) {
                    $price = (double) $shipment->TotalCharges[0]->MonetaryValue;
                    // Markup?
                    if ($settings['markup']) {
                        $price = Discounts::apply_value($price, '+' . $settings['markup']);
                    }
                    // Discount?
                    if ($settings['discount']) {
                        $price = Discounts::apply_value($price, $settings['markup']);
                    }
                    // Rated method configured/available?
                    if ($method = $settings['methods'][$service_type]) {
                        $method = is_array($method) ? $method : array();
                        $service_name = $method['name'] ?: $service_list[$service_type];
                        $service_price = round($price, 2);
                        $shipment_rates[] = array('id' => $service_type, 'name' => $service_name, 'price' => $service_price);
                    }
                }
            }
            break;
            // Bad response.
        // Bad response.
        case 0:
            throw new Exception((string) $doc->Response[0]->Error[0]->ErrorDescription[0]);
            break;
            // No response?
        // No response?
        default:
            throw new Exception("Unknown response from UPS Rating Service");
    }
    return $shipment_rates;
}
Beispiel #11
0
 public function getDiscount()
 {
     $inputs = Input::all();
     //return Response::json(array('status'=>'success'));
     $discount_second_child;
     $discount_second_class;
     $discount_second_child_elligible = 0;
     $discount_second_class_elligible = 0;
     $DiscountApprove = Discounts::where('franchiseId', '=', Session::get('franchiseId'))->first();
     if ($DiscountApprove['discount_second_child_approve'] != 0 && $DiscountApprove['discount_second_class_approve'] != 0) {
         $discount_second_child_elligible = 1;
         $discount_second_class_elligible = 1;
         $discount_second_child = $DiscountApprove['discount_second_child'];
         $discount_second_class = $DiscountApprove['discount_second_class'];
     } elseif ($DiscountApprove['discount_second_child_approve'] == 0 && $DiscountApprove['discount_second_class_approve'] != 0) {
         $discount_second_class_elligible = 1;
         $discount_second_class = $DiscountApprove['discount_second_class'];
     } elseif ($DiscountApprove['discount_second_child_approve'] != 0 && $DiscountApprove['discount_second_class_approve'] == 0) {
         $discount_second_child_elligible = 1;
         $discount_second_child = $DiscountApprove['discount_second_child'];
     }
     if ($discount_second_class) {
     }
     return Response::json(array('status' => 'success', 'discount_second_child' => $discount_second_child, 'discount_second_class' => $discount_second_class));
     //        $inputs=Input::all();
     //        $classes_count=  StudentClasses::where('student_id','=',$inputs['studentId'])
     //                                        ->where('status','=','enrolled')
     //                                        //->whereDate('enrollment_start_date','>=',date("Y-m-d"))
     //                                        //->whereDate('enrollment_end_date','<=',date("Y-m-d"))
     //                                        ->distinct('class_id')
     //                                        ->count();
     //        $discount=0;
     //        if($classes_count>=1){
     //            $discount_data= Discounts::where('season_id','=',$inputs['seasonId'])->get();
     //            $discount=$discount_data[0]['discount_second_class'];
     //        }else{
     //
     //            $student_data = Students::where('id','=',$inputs['studentId'])->get();
     //            $student_data = Students::where('customer_id','=',$student_data[0]['customer_id'])->get();
     //            $sid;
     //            foreach($student_data as $s){
     //                $sid[]=$s['id'];
     //            }
     //            $count=0;
     //            for($i=0;$i<count($sid);$i++){
     //                if(StudentClasses::where('student_id','=',$sid[$i])->exists()){
     //                 $count++;
     //                }
     //            }
     //            if($count>=1){
     //                $discount_data= Discounts::where('season_id','=',$inputs['seasonId'])->get();
     //                $discount=$discount_data[0]['discount_second_child'];
     //            }
     //
     //        }
     //        return Response::json(array('status'=>'success','discount'=>$discount));
 }
Beispiel #12
0
 /**
  * Show the form for creating a new resource.
  *
  * @return Response
  */
 public function view($id)
 {
     if (Auth::check()) {
         $currentPage = "STUDENTS_LIST";
         $mainMenu = "STUDENTS_MAIN";
         $student = Students::getStudentById($id);
         $franchiseeCourses = Courses::getFranchiseCoursesList(Session::get('franchiseId'));
         $studentEnrollments = StudentClasses::getStudentEnrollments($id);
         $paymentDues = PaymentDues::getAllPaymentDuesByStudent($id);
         $customermembership = CustomerMembership::getCustomerMembership($student['0']->customer_id);
         $scheduledIntroVisits = IntroVisit::getIntrovisitByStudentId($id);
         $discountEligibility = StudentClasses::discount($id, $student['0']->customer_id);
         //$paidDue= PaymentDues::getAllPaymentsMade($id);
         //$Due=PaymentDues::getAllDue($id);
         //for paid payment
         /* on hold for changing enrollment
            $paidAmountdata= PaymentDues::getAllPaymentsMade($id);
            for($i=0;$i<count($paidAmountdata);$i++){
                $studentclasssectiondata=  Classes::getstudentclasses($paidAmountdata[$i]['class_id']);
                $paidAmountdata[$i]['class_name']=$studentclasssectiondata[0]['class_name'];
                $user_Data=User::getUsersByUserId($paidAmountdata[$i]['created_by']);
                $paidAmountdata[$i]['receivedname']=$user_Data[0]['first_name'].$user_Data[0]['last_name'];
                $order_data=  Orders::getOrderDetailsbyPaydueId($paidAmountdata[$i]['id']);
                $paidAmountdata[$i]['printurl']=  url().'/orders/print/'.Crypt::encrypt($order_data[0]['id']);
                
            }
            */
         /*
                                 
                                 $paidAmountdata= Orders::getAllPaymentsMade($id);
                                 
                                 for($i=0;$i<count($paidAmountdata);$i++){
            $studentClassdata=StudentClasses::getStudentClassbyId($paidAmountdata[$i]['student_classes_id']);
            $paidAmountdata[$i]['enrollment_start_date']=$studentClassdata[0]['enrollment_start_date'];
            $paidAmountdata[$i]['enrollment_end_date']=$studentClassdata[0]['enrollment_end_date'];
            $paidAmountdata[$i]['selected_sessions']=$studentClassdata[0]['selected_sessions'];
            $studentclasssectiondata=  Classes::getstudentclasses($studentClassdata[0]['class_id']);
            $paidAmountdata[$i]['class_name']=$studentclasssectiondata[0]['class_name'];
            $user_Data=User::getUsersByUserId($paidAmountdata[$i]['created_by']);
            $paidAmountdata[$i]['receivedname']=$user_Data[0]['first_name'].$user_Data[0]['last_name'];
            $paidAmountdata[$i]['printurl']=  url().'/orders/print/'.Crypt::encrypt($paidAmountdata[0]['id']);
            
                                 }
         * 
         */
         //for dues
         //  $order_due_data=Orders::getpendingPaymentsid($id);
         $order_due_data = PaymentDues::getAllDuebyStudentId($id);
         //  $dueAmountdata=PaymentDues::getAllDue($id);
         for ($i = 0; $i < count($order_due_data); $i++) {
             $studentclasssectiondata = Classes::getstudentclasses($order_due_data[0]['class_id']);
             $order_due_data[$i]['class_name'] = $studentclasssectiondata[0]['class_name'];
             $user_Data = User::getUsersByUserId($order_due_data[$i]['created_by']);
             $order_due_data[$i]['receivedname'] = $user_Data[0]['first_name'] . $user_Data[0]['last_name'];
         }
         //getting values for present Discount for enrollment
         $discount_second_child = 0;
         $discount_second_class = 0;
         $discount_second_child_elligible = 0;
         $discount_second_class_elligible = 0;
         $count = 0;
         $DiscountApprove = Discounts::where('franchisee_id', '=', Session::get('franchiseId'))->first();
         if ($DiscountApprove['discount_second_child_approve'] == 1) {
             $discount_second_child_elligible = 1;
             $discount_second_child = $DiscountApprove['discount_second_child'];
         }
         if ($DiscountApprove['discount_second_class_approve'] == 1) {
             $discount_second_class_elligible = 1;
             $discount_second_class = $DiscountApprove['discount_second_class'];
         }
         if ($discount_second_class_elligible) {
             $classes_count = StudentClasses::where('student_id', '=', $student[0]['id'])->where('status', '=', 'enrolled')->count();
             if ($classes_count > 1) {
                 $discount_second_class_elligible = 1;
             } else {
                 $discount_second_class_elligible = 0;
             }
         }
         if ($discount_second_child_elligible) {
             $student_ids = Students::where('customer_id', '=', $student[0]['customer_id'])->select('id')->get()->toArray();
             for ($i = 0; $i < count($student_ids); $i++) {
                 if (StudentClasses::where('student_id', '=', $student_ids[$i]['id'])->where('status', '=', 'enrolled')->exists()) {
                     $count++;
                 }
             }
             //$discount_second_class_elligible=($count>1)?1:0;
             if ($count > 1) {
                 $discount_second_class_elligible = 1;
             } else {
                 $discount_second_class_elligible = 0;
             }
         }
         $discountEnrollmentData = Discounts::getEnrollmentDiscontByFranchiseId();
         $dataToView = array("student", 'currentPage', 'mainMenu', 'franchiseeCourses', 'discountEnrollmentData', 'discount_second_class_elligible', 'discount_second_child_elligible', 'discount_second_child', 'discount_second_class', 'studentEnrollments', 'customermembership', 'paymentDues', 'scheduledIntroVisits', 'introvisit', 'discountEligibility', 'paidAmountdata', 'order_due_data');
         return View::make('pages.students.details', compact($dataToView));
     } else {
         return Redirect::to("/");
     }
 }
Beispiel #13
0
 static function approveDiscounts($data)
 {
     return Discounts::where('franchisee_id', '=', Session::get('franchiseId'))->update(array('discount_second_class_approve' => $data['classCheck'], 'discount_second_child_approve' => $data['childCheck']));
 }
Beispiel #14
0
 /**
  * Apply sub total discount.
  */
 function apply_sub_total($cart, $sub_total, $discounts)
 {
     foreach ((array) $discounts as $discount) {
         foreach ((array) $discount['rules'] as $rule) {
             if ($rule['enabled'] !== null && !$rule['enabled']) {
                 continue;
             }
             switch ($rule['type']) {
                 case 'product':
                     foreach ((array) $cart['items'] as $item) {
                         if ($item['id'] != $rule['product_id']) {
                             continue;
                         }
                         $d_qty = $discount_qty[$item['id']];
                         // Limit discount quantity?
                         if ($rule['quantity']) {
                             $qty = $rule['quantity'] > $item['quantity'] ? $item['quantity'] : $rule['quantity'];
                             if ($d_qty + $qty >= $rule['quantity']) {
                                 $qty = $qty - ($discout_qty + $qty - $rule['quantity']);
                             }
                         } else {
                             $qty = $item['quantity'];
                         }
                         // Subtract item from total.
                         $sub_total -= $item['price'] * $qty;
                         // Apply discount value to price.
                         $item_price = self::apply_value($item['price'], $rule['value']);
                         // Add new item price back to total.
                         $sub_total += $item_price * $qty;
                         // Track total qty discounted.
                         $discount_qty[$item['id']] += $qty;
                     }
                     break;
                 case 'category':
                     foreach ((array) $cart['items'] as $item) {
                         if (in_array($rule['category_id'], (array) $item['category_ids'])) {
                             $d_qty = $discount_qty[$item['id']];
                             // Limit discount quantity?
                             if ($rule['quantity']) {
                                 $qty = $rule['quantity'] > $item['quantity'] ? $item['quantity'] : $rule['quantity'];
                                 if ($d_qty + $qty > $rule['quantity']) {
                                     $qty = $qty - ($discout_qty + $qty - $rule['quantity']);
                                 }
                             } else {
                                 $qty = $item['quantity'];
                             }
                             // Subtract item from total.
                             $sub_total -= $item['price'] * $qty;
                             // Apply discount value to price.
                             $item_price = self::apply_value($item['price'], $rule['value']);
                             // Add new item price back to total.
                             $sub_total += $item_price * $qty;
                             // Track total qty discounted.
                             $discount_qty[$item['id']] += $qty;
                             $items_discounted++;
                         }
                         // Break if reached category limit.
                         if ($rule['limit'] && $items_discounted >= $rule['limit']) {
                             break;
                         }
                     }
                     break;
                 case '':
                 case 'total':
                     $sub_total = Discounts::apply_value($sub_total, $rule['value']);
                     break;
             }
         }
     }
     return $sub_total;
 }
Beispiel #15
0
/**
 * Get FedEx rate quotes.
 */
function fwd_fedex_rates($params, $settings)
{
    // Configurable FedEx service methods.
    $service_list = array('FEDEX_GROUND' => 'Fedex Ground', 'FEDEX_EXPRESS_SAVER' => 'Fedex Express Saver', 'FEDEX_2_DAY' => 'Fedex 2-Day Air', 'FEDEX_2_DAY_AM' => 'Fedex 2-Day Air A.M.', 'STANDARD_OVERNIGHT' => 'Fedex Standard Overnight', 'PRIORITY_OVERNIGHT' => 'Fedex Priority Overnight', 'FIRST_OVERNIGHT' => 'Fedex First Overnight', 'INTERNATIONAL_PRIORITY' => 'Fedex Priority International');
    // If params are empty, return available methods only.
    if (empty($params)) {
        $methods = array();
        foreach ((array) $settings['methods'] as $key => $method) {
            if ($method) {
                $method = is_array($method) ? $method : array();
                $methods[] = array('id' => $key, 'name' => $method['name'] ?: $service_list[$key]);
            }
        }
        return $methods;
    }
    // Get shipper, default or specific.
    $shipper = array_merge(array('package_weight' => 100), (array) $settings['shippers'][0], (array) $settings['shippers'][$params['shipper']]);
    // Disable WSDL caching.
    ini_set('soap.wsdl_cache_enabled', '0');
    // Create SOAP client with Fedex RateService WSDL.
    $client = new SoapClient(dirname(__FILE__) . '/wsdl/RateService_v10.wsdl', array('trace' => 1));
    // Set endpoint host?
    if ($settings['host']) {
        $client->__setLocation($settings['host']);
    }
    // Split package by weight limit?
    if ($shipper['package_weight'] && $params['weight'] > $shipper['package_weight']) {
        $num_packages = ceil($params['weight'] / $shipper['package_weight']);
        for ($i = 0; $i < $num_packages; $i++) {
            if ($i >= 200) {
                break;
            }
            $params['packages'][$i] = array('insurance_amount' => $params['insurance_amount'] / $num_packages, 'insurance_currency' => $params['insurance_currency'], 'weight' => $params['weight'] / $num_packages, 'units' => $params['units']);
        }
    }
    // Setup request.
    $request = array('WebAuthenticationDetail' => array('UserCredential' => array('Key' => $settings['key'], 'Password' => $settings['password'])), 'ClientDetail' => array('AccountNumber' => $settings['account'], 'MeterNumber' => $settings['meter']), 'TransactionDetail' => array('CustomerTransactionId' => '*** Rate Request v10 using PHP ***'), 'Version' => array('ServiceId' => 'crs', 'Major' => '10', 'Intermediate' => '0', 'Minor' => '0'), 'ReturnTransitAndCommit' => true, 'RequestedShipment' => array('DropoffType' => 'REGULAR_PICKUP', 'ShipTimestamp' => date('c'), 'PackagingType' => 'YOUR_PACKAGING', 'Shipper' => array('Address' => array('StreetLines' => array($shipper['address']), 'City' => $shipper['city'], 'StateOrProvinceCode' => $shipper['state'], 'PostalCode' => $shipper['zip'], 'CountryCode' => $shipper['country'] ?: 'US')), 'Recipient' => array('Address' => array('StreetLines' => array($params['address']), 'City' => $params['city'], 'StateOrProvinceCode' => $params['state'], 'PostalCode' => $params['zip'], 'CountryCode' => $params['country'] ?: 'US')), 'ShippingChargesPayment' => array('PaymentType' => 'SENDER', 'Payor' => array('AccountNumber' => $shipper['account'] ?: $settings['account'], 'CountryCode' => $shipper['country'] ?: 'US')), 'RateRequestTypes' => 'ACCOUNT', 'RateRequestTypes' => 'LIST', 'PackageCount' => $params['packages'] ? count($params['packages']) : '1', 'RequestedPackages' => array()));
    // Default single package?
    if (count($params['packages']) == 0) {
        $params['packages'][0] = array('insurance_amount' => $params['insurance_amount'], 'insurance_currency' => $params['insurance_currency'], 'weight' => $params['weight'] ?: 1, 'units' => $params['units']);
        if ($params['dimensions']) {
            $params['packages'][0]['dimensions'] = array('length' => $params['dimensions']['length'], 'width' => $params['dimensions']['width'], 'height' => $params['dimensions']['height'], 'units' => $params['dimensions']['units']);
        }
    }
    // Add package(s) to request.
    foreach ($params['packages'] as $seq => $package) {
        $request['RequestedShipment']['RequestedPackageLineItems'][$seq] = array('SequenceNumber' => $seq + 1, 'GroupPackageCount' => 1, 'InsuredValue' => array('Amount' => $package['insurance_amount'] ?: 0, 'Currency' => $package['insurance_currency'] ?: 'USD'), 'Weight' => array('Value' => $package['weight'], 'Units' => $package['units'] ?: 'LB'));
        // Dimensions?
        if ($package['dimensions']) {
            $request['RequestedShipment']['RequestedPackageLineItems'][$seq]['Dimensions'] = array('Length' => $package['dimensions']['length'], 'Width' => $package['dimensions']['width'], 'Height' => $package['dimensions']['height'], 'Units' => $package['dimensions']['units'] ?: 'IN');
        }
    }
    // Try the request.
    try {
        $response = $client->getRates($request);
        if ($response->HighestSeverity != 'FAILURE' && $response->HighestSeverity != 'ERROR') {
            if (!is_array($response->RateReplyDetails)) {
                $response->RateReplyDetails = array($response->RateReplyDetails);
            }
            foreach ($response->RateReplyDetails as $RateReplyDetail) {
                $service_type = $RateReplyDetail->ServiceType;
                if ($service_list[$service_type]) {
                    $rsd = end($RateReplyDetail->RatedShipmentDetails);
                    $tnc = $rsd->ShipmentRateDetail->TotalNetCharge;
                    $price = (double) preg_replace('/[^\\d\\.]/i', '', $tnc->Amount);
                    // Markup?
                    if ($settings['markup']) {
                        $price = Discounts::apply_value($price, '+' . $settings['markup']);
                    }
                    // Discount?
                    if ($settings['discount']) {
                        $price = Discounts::apply_value($price, $settings['markup']);
                    }
                    // Rated method configured/available?
                    if ($method = $settings['methods'][$service_type]) {
                        $method = is_array($method) ? $method : array();
                        $service_name = $method['name'] ?: $service_list[$service_type];
                        $service_price = round($price, 2);
                        $shipment_rates[] = array('id' => $service_type, 'name' => $service_name, 'price' => $service_price);
                    }
                }
            }
        } elseif ($response->HighestSeverity == 'FAILURE' || $response->HighestSeverity == 'ERROR') {
            throw new Exception($response->Notifications->LocalizedMessage ?: $response->Notifications->Message);
        }
    } catch (SoapFault $e) {
        throw new Exception($e->getMessage());
    }
    return $shipment_rates;
}