public function calculate_shipping($package)
 {
     $package = WbsPackage::fromWcPackage($package);
     if (!$this->weight->includes($package->getWeight()) || !$this->subtotal->includes($package->getPrice($this->subtotalWithTax))) {
         return;
     }
     $defaultRate = new WbsBucketRate('___wbs_base_pseudo_class', $this->fee, $this->weightRate);
     /** @var WbsItemBucket[] $buckets */
     $buckets = array();
     foreach ($package->getLines() as $line) {
         $product = $line->getProduct();
         $class = $product->get_shipping_class();
         $rate = $this->shippingClassRates->findById($class);
         if ($rate == null) {
             $rate = $defaultRate;
         }
         $class = $rate->getId();
         if (!isset($buckets[$class])) {
             $buckets[$class] = new WbsItemBucket(0, $rate);
         }
         $buckets[$class]->add($line->getWeight());
     }
     $defaultClass = $defaultRate->getId();
     if (!isset($buckets[$defaultClass])) {
         $buckets[$defaultClass] = new WbsItemBucket(0, $defaultRate);
     }
     $price = 0;
     foreach ($buckets as $bucket) {
         $price += $bucket->calculate();
     }
     $price = $this->priceClamp->clamp($price);
     $this->add_rate(array('id' => $this->id, 'label' => $this->title, 'cost' => $price, 'taxes' => '', 'calc_tax' => 'per_order'));
 }
 private function shippingClassRateRow($inputNamePrefix, $rateId, WbsBucketRate $rate = null, $class = null)
 {
     return '
         <tr class="flat_rate ' . esc_html($class) . '">
             <th class="check-column">
                 <input type="checkbox" name="select" />
             </th>
             <td class="flat_rate_class">
                 ' . $this->shippingClassSelect("{$inputNamePrefix}[{$rateId}][class]", $rate ? $rate->getId() : null) . '
             </td>
             <td>' . $this->decimalInput(array('value' => $rate ? $rate->getFlatRate() : null, 'name' => "{$inputNamePrefix}[{$rateId}][fee]")) . '
             </td>
             <td>' . $this->weightRate("{$inputNamePrefix}[{$rateId}][weight_rate]", $rate ? $rate->getProgressiveRate()->toArray() : null, false) . '
             </td>
         </tr>
     ';
 }
 public function add(WbsBucketRate $rate)
 {
     $this->rates[$rate->getId()] = $rate;
 }
 public function calculate()
 {
     return $this->rate->rate($this->quantity);
 }