_loggable = TRUE; $this->_tablepkey = 'id'; $this->_tableId = 'id'; $this->tableFields = array_keys ($this->getTableSQLFields ()); $varsToPush = $this->getVarsToPush (); $this->addVarsToPushCore($varsToPush,0); $this->setConfigParameterable ($this->_configTableFieldName, $varsToPush); $this->setConvertable(array('min_amount','max_amount','shipment_cost','package_fee','free_shipment')); } /** * Create the table for this plugin if it does not yet exist. * @deprecated * @author Valérie Isaksen * public function getVmPluginCreateTableSQL () { return $this->createTableSQL ('Shipment Weight Countries Table'); }*/ /** * @return array */ function getTableSQLFields () { $SQLfields = array( 'id' => 'int(1) UNSIGNED NOT NULL AUTO_INCREMENT', 'virtuemart_order_id' => 'int(11) UNSIGNED', 'order_number' => 'char(32)', 'virtuemart_shipmentmethod_id' => 'mediumint(1) UNSIGNED', 'shipment_name' => 'varchar(5000)', 'order_weight' => 'decimal(10,4)', 'shipment_weight_unit' => 'char(3) DEFAULT \'KG\'', 'shipment_cost' => 'decimal(10,2)', 'shipment_package_fee' => 'decimal(10,2)', 'tax_id' => 'smallint(1)' ); return $SQLfields; } /** * This method is fired when showing the order details in the frontend. * It displays the shipment-specific data. * * @param integer $virtuemart_order_id The order ID * @param integer $virtuemart_shipmentmethod_id The selected shipment method id * @param string $shipment_name Shipment Name * @return mixed Null for shipments that aren't active, text (HTML) otherwise * @author Valérie Isaksen * @author Max Milbers */ public function plgVmOnShowOrderFEShipment ($virtuemart_order_id, $virtuemart_shipmentmethod_id, &$shipment_name) { $this->onShowOrderFE ($virtuemart_order_id, $virtuemart_shipmentmethod_id, $shipment_name); } /** * This event is fired after the order has been stored; it gets the shipment method- * specific data. * * @param int $order_id The order_id being processed * @param object $cart the cart * @param array $order The actual order saved in the DB * @return mixed Null when this method was not selected, otherwise true * @author Valerie Isaksen */ function plgVmConfirmedOrder (VirtueMartCart $cart, $order) { if (!($method = $this->getVmPluginMethod ($order['details']['BT']->virtuemart_shipmentmethod_id))) { return NULL; // Another method was selected, do nothing } if (!$this->selectedThisElement ($method->shipment_element)) { return FALSE; } $values['virtuemart_order_id'] = $order['details']['BT']->virtuemart_order_id; $values['order_number'] = $order['details']['BT']->order_number; $values['virtuemart_shipmentmethod_id'] = $order['details']['BT']->virtuemart_shipmentmethod_id; $values['shipment_name'] = $this->renderPluginName ($method); $values['order_weight'] = $this->getOrderWeight ($cart, $method->weight_unit); $values['shipment_weight_unit'] = $method->weight_unit; $costs = $this->getCosts($cart,$method,$cart->cartPrices); if(!empty($costs)){ $values['shipment_cost'] = $method->shipment_cost; $values['shipment_package_fee'] = $method->package_fee; } if(empty($values['shipment_cost'])) $values['shipment_cost'] = 0.0; if(empty($values['shipment_package_fee'])) $values['shipment_package_fee'] = 0.0; $values['tax_id'] = $method->tax_id; $this->storePSPluginInternalData ($values); $extra = $this->renderByLayout( 'orderdone', array("method" => $this->_currentMethod, 'order' => $order, 'cart'=>$cart) ); if(!empty($extra)){ $cart->orderdoneHtml = $extra; // $cart->setCartIntoSession(false,true); } return TRUE; } /** * This method is fired when showing the order details in the backend. * It displays the shipment-specific data. * NOTE, this plugin should NOT be used to display form fields, since it's called outside * a form! Use plgVmOnUpdateOrderBE() instead! * * @param integer $virtuemart_order_id The order ID * @param integer $virtuemart_shipmentmethod_id The order shipment method ID * @return mixed Null for shipments that aren't active, text (HTML) otherwise * @author Valerie Isaksen */ public function plgVmOnShowOrderBEShipment ($virtuemart_order_id, $virtuemart_shipmentmethod_id) { if (!($this->selectedThisByMethodId ($virtuemart_shipmentmethod_id))) { return NULL; } $html = $this->getOrderShipmentHtml ($virtuemart_order_id); return $html; } /** * @param $virtuemart_order_id * @return string */ function getOrderShipmentHtml ($virtuemart_order_id) { $db = JFactory::getDBO (); $q = 'SELECT * FROM `' . $this->_tablename . '` ' . 'WHERE `virtuemart_order_id` = ' . $virtuemart_order_id; $db->setQuery ($q); if (!($shipinfo = $db->loadObject ())) { $msg=vmText::sprintf('VMSHIPMENT_WEIGHT_COUNTRIES_NO_ENTRY_FOUND', $virtuemart_order_id); //vmWarn ($msg); //vmDebug($msg, $q ); return $msg; } $currency = CurrencyDisplay::getInstance (); $tax = ShopFunctions::getTaxByID ($shipinfo->tax_id); $taxDisplay = is_array ($tax) ? $tax['calc_value'] . ' ' . $tax['calc_value_mathop'] : $shipinfo->tax_id; $taxDisplay = ($taxDisplay == -1) ? vmText::_ ('COM_VIRTUEMART_PRODUCT_TAX_NONE') : $taxDisplay; $html = '' . "\n"; $html .= $this->getHtmlHeaderBE (); $html .= $this->getHtmlRowBE ('COM_VIRTUEMART_SHIPMENT_NAME', $shipinfo->shipment_name); $html .= $this->getHtmlRowBE ('VMSHIPMENT_WEIGHT_COUNTRIES_WEIGHT', $shipinfo->order_weight . ' ' . ShopFunctions::renderWeightUnit ($shipinfo->shipment_weight_unit)); $html .= $this->getHtmlRowBE ('VMSHIPMENT_WEIGHT_COUNTRIES_COST', $currency->priceDisplay ($shipinfo->shipment_cost)); $html .= $this->getHtmlRowBE ('VMSHIPMENT_WEIGHT_COUNTRIES_PACKAGE_FEE', $currency->priceDisplay ($shipinfo->shipment_package_fee)); $html .= $this->getHtmlRowBE ('VMSHIPMENT_WEIGHT_COUNTRIES_TAX', $taxDisplay); $html .= '
' . "\n"; return $html; } /** * @param VirtueMartCart $cart * @param $method * @param $cart_prices * @return int */ function getCosts (VirtueMartCart $cart, $method, $cart_prices) { if ($method->free_shipment && $cart_prices['salesPrice'] >= $method->free_shipment) { return 0.0; } else { if(empty($method->shipment_cost)) $method->shipment_cost = 0.0; if(empty($method->package_fee)) $method->package_fee = 0.0; return $method->shipment_cost + $method->package_fee; } } /** * @param \VirtueMartCart $cart * @param int $method * @param array $cart_prices * @return bool */ protected function checkConditions ($cart, $method, $cart_prices) { static $result = array(); if($cart->STsameAsBT == 0){ $type = 'ST'; } else { $type = 'BT'; } $address = $cart -> getST(); if(!is_array($address)) $address = array(); if(isset($cart_prices['salesPrice'])){ $hashSalesPrice = $this->getCartAmount($cart_prices,true); ;//$cart_prices['salesPrice']; } else { $hashSalesPrice = ''; } if(empty($address['virtuemart_country_id'])) $address['virtuemart_country_id'] = 0; if(empty($address['zip'])) $address['zip'] = 0; $hash = $method->virtuemart_shipmentmethod_id.$type.$address['virtuemart_country_id'].'_'.$address['zip'].'_'.$hashSalesPrice; if(isset($result[$hash])){ return $result[$hash]; } $this->convert ($method); $result[$hash] = parent::checkConditions($cart, $method, $cart_prices); if(!$result[$hash]) return false; $orderWeight = $this->getOrderWeight ($cart, $method->weight_unit); $weight_cond = $this->testRange($orderWeight,$method,'weight_start','weight_stop','weight'); $nbproducts_cond = $this->_nbproductsCond ($cart, $method); $userFieldsModel =VmModel::getModel('Userfields'); if ($userFieldsModel->fieldPublished('zip', $type)){ if (!isset($address['zip'])) { $address['zip'] = ''; } $zip_cond = $this->testRange($address['zip'],$method,'zip_start','zip_stop','zip'); } else { $zip_cond = true; } $allconditions = (int) $weight_cond + (int)$zip_cond + (int)$nbproducts_cond; if($allconditions === 3){ $result[$hash] = true; return TRUE; } else { $result[$hash] = false; //vmdebug('checkConditions '.$method->shipment_name.' does not fit ',(int)$weight_cond,(int)$zip_cond,(int)$nbproducts_cond,(int)$orderamount_cond,(int)$country_cond); return FALSE; } $result[$hash] = false; return FALSE; } /** * @param $method */ function convert (&$method) { //$method->weight_start = (float) $method->weight_start; //$method->weight_stop = (float) $method->weight_stop; $method->min_amount = (float)str_replace(',','.',$method->min_amount); $method->max_amount = (float)str_replace(',','.',$method->max_amount); $method->zip_start = (int)$method->zip_start; $method->zip_stop = (int)$method->zip_stop; $method->nbproducts_start = (int)$method->nbproducts_start; $method->nbproducts_stop = (int)$method->nbproducts_stop; $method->free_shipment = (float)str_replace(',','.',$method->free_shipment); } /** * @param $cart * @param $method * @return bool */ private function _nbproductsCond ($cart, $method) { if (empty($method->nbproducts_start) and empty($method->nbproducts_stop)) { //vmdebug('_nbproductsCond',$method); return true; } $nbproducts = 0; foreach ($cart->products as $product) { $nbproducts += $product->quantity; } if ($nbproducts) { $nbproducts_cond = $this->testRange($nbproducts,$method,'nbproducts_start','nbproducts_stop','products quantity'); } else { $nbproducts_cond = false; } return $nbproducts_cond; } private function testRange($value, $method, $floor, $ceiling,$name){ $cond = true; if(!empty($method->{$floor}) and !empty($method->{$ceiling})){ $cond = (($value >= $method->{$floor} AND $value <= $method->{$ceiling})); if(!$cond){ $result = 'FALSE'; $reason = 'is NOT within Range of the condition from '.$method->{$floor}.' to '.$method->{$ceiling}; } else { $result = 'TRUE'; $reason = 'is within Range of the condition from '.$method->{$floor}.' to '.$method->{$ceiling}; } } else if(!empty($method->{$floor})){ $cond = ($value >= $method->{$floor}); if(!$cond){ $result = 'FALSE'; $reason = 'is not at least '.$method->{$floor}; } else { $result = 'TRUE'; $reason = 'is over min limit '.$method->{$floor}; } } else if(!empty($method->{$ceiling})){ $cond = ($value <= $method->{$ceiling}); if(!$cond){ $result = 'FALSE'; $reason = 'is over '.$method->{$ceiling}; } else { $result = 'TRUE'; $reason = 'is lower than the set '.$method->{$ceiling}; } } else { $result = 'TRUE'; $reason = 'no boundary conditions set'; } if($reason != 'no boundary conditions set') vmdebug('shipmentmethod '.$method->shipment_name.' = '.$result.' for variable '.$name.' = '.$value.' Reason: '.$reason); return $cond; } function plgVmOnProductDisplayShipment($product, &$productDisplayShipments){ if ($this->getPluginMethods($product->virtuemart_vendor_id) === 0) { return FALSE; } $html = array(); $currency = CurrencyDisplay::getInstance(); foreach ($this->methods as $this->_currentMethod) { if($this->_currentMethod->show_on_pdetails){ if(!isset($cart)){ $cart = VirtueMartCart::getCart(); $cart->products['virtual'] = $product; $cart->_productAdded = true; $cart->prepareCartData(); } if($this->checkConditions($cart,$this->_currentMethod,$cart->cartPrices)){ $product->prices['shipmentPrice'] = $this->getCosts($cart,$this->_currentMethod,$cart->cartPrices); if(isset($product->prices['VatTax']) and count($product->prices['VatTax'])>0){ reset($product->prices['VatTax']); $rule = current($product->prices['VatTax']); if(isset($rule[1])){ $product->prices['shipmentTax'] = $product->prices['shipmentPrice'] * $rule[1]/100.0; $product->prices['shipmentPrice'] = $product->prices['shipmentPrice'] * (1 + $rule[1]/100.0); } } $html[$this->_currentMethod->virtuemart_shipmentmethod_id] = $this->renderByLayout( 'default', array("method" => $this->_currentMethod, "cart" => $cart,"product" => $product,"currency" => $currency) ); } } } if(isset($cart)){ unset($cart->products['virtual']); $cart->_productAdded = true; $cart->prepareCartData(); } $productDisplayShipments[] = $html; } /** * Create the table for this plugin if it does not yet exist. * This functions checks if the called plugin is active one. * When yes it is calling the standard method to create the tables * * @author Valérie Isaksen * */ function plgVmOnStoreInstallShipmentPluginTable ($jplugin_id) { return $this->onStoreInstallPluginTable ($jplugin_id); } /** * @param VirtueMartCart $cart * @return null */ public function plgVmOnSelectCheckShipment (VirtueMartCart &$cart) { return $this->OnSelectCheck ($cart); } /** * plgVmDisplayListFE * This event is fired to display the pluginmethods in the cart (edit shipment/payment) for example * * @param object $cart Cart object * @param integer $selected ID of the method selected * @return boolean True on success, false on failures, null when this plugin was not selected. * On errors, JError::raiseWarning (or JError::raiseError) must be used to set a message. * * @author Valerie Isaksen * @author Max Milbers */ public function plgVmDisplayListFEShipment (VirtueMartCart $cart, $selected, &$htmlIn) { return $this->displayListFE ($cart, $selected, $htmlIn); } /** * @param VirtueMartCart $cart * @param array $cart_prices * @param $cart_prices_name * @return bool|null */ public function plgVmOnSelectedCalculatePriceShipment (VirtueMartCart $cart, array &$cart_prices, &$cart_prices_name) { return $this->onSelectedCalculatePrice ($cart, $cart_prices, $cart_prices_name); } /** * plgVmOnCheckAutomaticSelected * Checks how many plugins are available. If only one, the user will not have the choice. Enter edit_xxx page * The plugin must check first if it is the correct type * * @author Valerie Isaksen * @param VirtueMartCart cart: the cart object * @return null if no plugin was found, 0 if more then one plugin was found, virtuemart_xxx_id if only one plugin is found * */ function plgVmOnCheckAutomaticSelectedShipment (VirtueMartCart $cart, array $cart_prices, &$shipCounter) { return $this->onCheckAutomaticSelected ($cart, $cart_prices, $shipCounter); } function plgVmOnCheckoutCheckDataShipment(VirtueMartCart $cart){ if(empty($cart->virtuemart_shipmentmethod_id)) return false; if ($this->getPluginMethods($cart->vendorId) === 0) { return NULL; } foreach ($this->methods as $this->_currentMethod) { if($cart->virtuemart_shipmentmethod_id == $this->_currentMethod->virtuemart_shipmentmethod_id){ if(!$this->checkConditions($cart,$this->_currentMethod,$cart->cartPrices)){ return false; } else { //return true; } break; } } } /** * This method is fired when showing when priting an Order * It displays the the payment method-specific data. * * @param integer $_virtuemart_order_id The order ID * @param integer $method_id method used for this order * @return mixed Null when for payment methods that were not selected, text (HTML) otherwise * @author Valerie Isaksen */ function plgVmOnShowOrderPrint ($order_number, $method_id) { return $this->onShowOrderPrint ($order_number, $method_id); } function plgVmDeclarePluginParamsShipmentVM3 (&$data) { return $this->declarePluginParams ('shipment', $data); } /** * @author Max Milbers * @param $data * @param $table * @return bool */ function plgVmSetOnTablePluginShipment(&$data,&$table){ $name = $data['shipment_element']; $id = $data['shipment_jplugin_id']; if (!empty($this->_psType) and !$this->selectedThis ($this->_psType, $name, $id)) { return FALSE; } else { $tCon = array('weight_start','weight_stop','min_amount','max_amount','shipment_cost','package_fee'); foreach($tCon as $f){ if(!empty($data[$f])){ $data[$f] = str_replace(array(',',' '),array('.',''),$data[$f]); } } $data['nbproducts_start'] = (int) $data['nbproducts_start']; $data['nbproducts_stop'] = (int) $data['nbproducts_stop']; //Reasonable tests: if(!empty($data['zip_start']) and !empty($data['zip_stop']) and (int)$data['zip_start']>=(int)$data['zip_stop']){ vmWarn('VMSHIPMENT_WEIGHT_COUNTRIES_ZIP_CONDITION_WRONG'); } if(!empty($data['weight_start']) and !empty($data['weight_stop']) and (float)$data['weight_start']>=(float)$data['weight_stop']){ vmWarn('VMSHIPMENT_WEIGHT_COUNTRIES_WEIGHT_CONDITION_WRONG'); } if(!empty($data['min_order']) and !empty($data['max_order']) and (float)$data['min_order']>=(float)$data['max_order']){ vmWarn('VMSHIPMENT_WEIGHT_COUNTRIES_AMOUNT_CONDITION_WRONG'); } if(!empty($data['nbproducts_start']) and !empty($data['nbproducts_stop']) and (float)$data['nbproducts_start']>=(float)$data['nbproducts_stop']){ vmWarn('VMSHIPMENT_WEIGHT_COUNTRIES_NBPRODUCTS_CONDITION_WRONG'); } //$data['orderamount_start'] = $data['min_amount']; //$data['orderamount_stop'] = $data['max_amount']; //$data['show_on_pdetails'] = (int) $data['show_on_pdetails']; return $this->setOnTablePluginParams ($name, $id, $table); } } } // No closing tag