%PDF- %PDF-
Direktori : /home/lightco1/upgrade.lightco.com.au/administrator/components/com_virtuemart/models/ |
Current File : /home/lightco1/upgrade.lightco.com.au/administrator/components/com_virtuemart/models/orders.php |
<?php /** * * Description * * @package VirtueMart * @subpackage * @author Oscar van Eijk * @author Max Milbers * @author Patrick Kohl * @author Valerie Isaksen * @link http://www.virtuemart.net * @copyright Copyright (c) 2004 - 2010 VirtueMart Team. All rights reserved. * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php * VirtueMart is free software. This version may have been modified pursuant * to the GNU General Public License, and as distributed it includes or * is derivative of works licensed under the GNU General Public License or * other free or open source software licenses. * @version $Id: orders.php 9029 2015-10-28 12:51:49Z Milbo $ */ // Check to ensure this file is included in Joomla! defined('_JEXEC') or die('Restricted access'); if(!class_exists('VmModel')) require(VMPATH_ADMIN.DS.'helpers'.DS.'vmmodel.php'); /** * Model for VirtueMart Orders * WHY $this->db is never used in the model ? * @package VirtueMart */ class VirtueMartModelOrders extends VmModel { /** * constructs a VmModel * setMainTable defines the maintable of the model * @author Max Milbers */ function __construct() { parent::__construct(); $this->setMainTable('orders'); $this->addvalidOrderingFieldName(array('order_name','order_email','payment_method','virtuemart_order_id' ) ); } /** * This function gets the orderId, for anonymous users * @author Max Milbers */ public function getOrderIdByOrderPass($orderNumber,$orderPass){ $db = JFactory::getDBO(); $q = 'SELECT `virtuemart_order_id` FROM `#__virtuemart_orders` WHERE `order_pass`="'.$db->escape($orderPass).'" AND `order_number`="'.$db->escape($orderNumber).'"'; $db->setQuery($q); $orderId = $db->loadResult(); if(empty($orderId)) vmdebug('getOrderIdByOrderPass no Order found $orderNumber = '.$orderNumber.' $orderPass = '.$orderPass.' $q = '.$q); return $orderId; } /** * This function gets the orderId, for payment response * author Valerie Isaksen */ public static function getOrderIdByOrderNumber($orderNumber){ $db = JFactory::getDBO(); $q = 'SELECT `virtuemart_order_id` FROM `#__virtuemart_orders` WHERE `order_number`="'.$db->escape($orderNumber).'"'; $db->setQuery($q); $orderId = $db->loadResult(); return $orderId; } /** * This function seems completly broken, JRequests are not allowed in the model, sql not escaped * This function gets the secured order Number, to send with paiement * */ public function getOrderNumber($virtuemart_order_id){ $db = JFactory::getDBO(); $q = 'SELECT `order_number` FROM `#__virtuemart_orders` WHERE virtuemart_order_id="'.(int)$virtuemart_order_id.'" '; $db->setQuery($q); $OrderNumber = $db->loadResult(); return $OrderNumber; } /** * Was also broken, actually used? * * get next/previous order id * */ public function getOrderId($order_id, $direction ='DESC') { if ($direction == 'ASC') { $arrow ='>'; } else { $arrow ='<'; } $db = JFactory::getDBO(); $q = 'SELECT `virtuemart_order_id` FROM `#__virtuemart_orders` WHERE `virtuemart_order_id`'.$arrow.(int)$order_id; $q.= ' ORDER BY `virtuemart_order_id` '.$direction ; $db->setQuery($q); if ($oderId = $db->loadResult()) { return $oderId ; } return 0 ; } /** * This is a proxy function to return an order safely, we may set the getOrder function to private * Maybe the right place would be the controller, cause there are JRequests in it. But for a fast solution, * still better than to have it 3-4 times in the view.html.php of the views. * @author Max Milbers * * @return array */ public function getMyOrderDetails($orderID = 0, $orderNumber = false, $orderPass = false){ $_currentUser = JFactory::getUser(); $cuid = $_currentUser->get('id'); $orderDetails = false; // If the user is not logged in, we will check the order number and order pass if(empty($cuid)){ $sess = JFactory::getSession(); $orderNumber = vRequest::getString('order_number',$orderNumber); $tries = $sess->get('getOrderDetails.'.$orderNumber,0); if($tries>5){ vmDebug ('Too many tries, Invalid order_number/password '.vmText::_('COM_VIRTUEMART_RESTRICTED_ACCESS')); return false; } // If the user is not logged in, we will check the order number and order pass if ($orderPass = vRequest::getString('order_pass',$orderPass)){ $orderId = $this->getOrderIdByOrderPass($orderNumber,$orderPass); if(empty($orderId)){ echo vmText::_('COM_VIRTUEMART_RESTRICTED_ACCESS'); vmdebug('getMyOrderDetails COM_VIRTUEMART_RESTRICTED_ACCESS',$orderNumber, $orderPass, $tries); $tries++; $sess->set('getOrderDetails.'.$orderNumber,$tries); return false; } $orderDetails = $this->getOrder($orderId); } } else { // If the user is logged in, we will check if the order belongs to him $virtuemart_order_id = vRequest::getInt('virtuemart_order_id',$orderID) ; if (!$virtuemart_order_id) { $virtuemart_order_id = VirtueMartModelOrders::getOrderIdByOrderNumber(vRequest::getString('order_number')); } $orderDetails = $this->getOrder($virtuemart_order_id); $user = JFactory::getUser(); if(!vmAccess::manager('orders')){ if(!isset($orderDetails['details']['BT']->virtuemart_user_id)){ $orderDetails['details']['BT']->virtuemart_user_id = 0; } if ($orderDetails['details']['BT']->virtuemart_user_id != $cuid) { echo vmText::_('COM_VIRTUEMART_RESTRICTED_ACCESS'); return false; } } } return $orderDetails; } /** * Load a single order, Attention, this function is not protected! Do the right manangment before, to be certain * we suggest to use getMyOrderDetails */ public function getOrder($virtuemart_order_id){ //sanitize id $virtuemart_order_id = (int)$virtuemart_order_id; $db = JFactory::getDBO(); $order = array(); // Get the order details $q = "SELECT o.*,u.*, s.order_status_name FROM #__virtuemart_orders o LEFT JOIN #__virtuemart_orderstates s ON s.order_status_code = o.order_status LEFT JOIN #__virtuemart_order_userinfos u ON u.virtuemart_order_id = o.virtuemart_order_id WHERE o.virtuemart_order_id=".$virtuemart_order_id; $db->setQuery($q); $order['details'] = $db->loadObjectList('address_type'); if($order['details']){ $concat = array(); if(isset($order['details']['BT']->company)) $concat[]= $order['details']['BT']->company; if(isset($order['details']['BT']->first_name)) $concat[]= $order['details']['BT']->first_name; if(isset($order['details']['BT']->middle_name)) $concat[]= $order['details']['BT']->middle_name; if(isset($order['details']['BT']->last_name)) $concat[]= $order['details']['BT']->last_name; $order['details']['BT']->order_name = ''; foreach($concat as $c){ $order['details']['BT']->order_name .= $c; } $order['details']['BT']->order_name = htmlspecialchars(strip_tags(htmlspecialchars_decode($order['details']['BT']->order_name))); } // Get the order history $q = "SELECT * FROM #__virtuemart_order_histories WHERE virtuemart_order_id=".$virtuemart_order_id." ORDER BY virtuemart_order_history_id ASC"; $db->setQuery($q); $order['history'] = $db->loadObjectList(); // Get the order items $q = 'SELECT virtuemart_order_item_id, product_quantity, order_item_name, order_item_sku, i.virtuemart_product_id, product_item_price, product_final_price, product_basePriceWithTax, product_discountedPriceWithoutTax, product_priceWithoutTax, product_subtotal_with_tax, product_subtotal_discount, product_tax, product_attribute, order_status, p.product_available_date, p.product_availability, intnotes, virtuemart_category_id, p.product_mpn FROM (#__virtuemart_order_items i LEFT JOIN #__virtuemart_products p ON p.virtuemart_product_id = i.virtuemart_product_id) LEFT JOIN #__virtuemart_product_categories c ON p.virtuemart_product_id = c.virtuemart_product_id WHERE `virtuemart_order_id`="'.$virtuemart_order_id.'" group by `virtuemart_order_item_id`'; //group by `virtuemart_order_id`'; Why ever we added this, it makes trouble, only one order item is shown then. // without group by we get the product 3 times, when it is in 3 categories and similar, so we need a group by //lets try group by `virtuemart_order_item_id` $db->setQuery($q); $order['items'] = $db->loadObjectList(); $customfieldModel = VmModel::getModel('customfields'); $pModel = VmModel::getModel('product'); foreach($order['items'] as &$item){ $item->customfields = array(); $ids = array(); $product = $pModel->getProduct($item->virtuemart_product_id); if(!empty($item->product_attribute)){ //Format now {"9":7,"20":{"126":{"comment":"test1"},"127":{"comment":"t2"},"128":{"comment":"topic 3"},"129":{"comment":"4 44 4 4 44 "}}} //$old = '{"46":" <span class=\"costumTitle\">Cap Size<\/span><span class=\"costumValue\" >S<\/span>","109":{"textinput":{"comment":"test"}}}'; //$myCustomsOld = @json_decode($old,true); $myCustoms = @json_decode($item->product_attribute,true); $myCustoms = (array) $myCustoms; foreach($myCustoms as $custom){ if(!is_array($custom)){ $custom = array( $custom =>false); } foreach($custom as $id=>$field){ $item->customfields[] = $customfieldModel-> getCustomEmbeddedProductCustomField($id); $ids[] = $id; } } } if(!empty($product->customfields)){ foreach($product->customfields as $customfield){ if(!in_array($customfield->virtuemart_customfield_id,$ids) and $customfield->field_type=='E' and ($customfield->is_input or $customfield->is_cart_attribute)){ $item->customfields[] = $customfield; } } } } // Get the order items $q = "SELECT * FROM #__virtuemart_order_calc_rules AS z WHERE virtuemart_order_id=".$virtuemart_order_id; $db->setQuery($q); $order['calc_rules'] = $db->loadObjectList(); return $order; } /** * Select the products to list on the product list page * @param $uid integer Optional user ID to get the orders of a single user * @param $_ignorePagination boolean If true, ignore the Joomla pagination (for embedded use, default false) */ public function getOrdersList($uid = 0, $noLimit = false) { // vmdebug('getOrdersList'); $tUserInfos = $this->getTable('userinfos'); $this->_noLimit = $noLimit; $concat = array(); if(property_exists($tUserInfos,'company')) $concat[]= 'u.company'; if(property_exists($tUserInfos,'first_name')) $concat[]= 'u.first_name'; if(property_exists($tUserInfos,'middle_name')) $concat[]= 'u.middle_name'; if(property_exists($tUserInfos,'last_name')) $concat[]= 'u.last_name'; if(!empty($concat)){ $concatStr = "CONCAT_WS(' ',".implode(',',$concat).")"; } else { $concatStr = 'o.order_number'; } // quorvia added phone, zip, city and shipping details and ST data $select = " o.*, ".$concatStr." AS order_name " .',u.email as order_email, pm.payment_name AS payment_method, u.company AS company, u.city AS city, u.zip AS zip, u.phone_1 AS phone, st.address_type AS st_type, st.company AS st_company, st.city AS st_city, st.zip AS st_zip, u.customer_note AS customer_note'; $from = $this->getOrdersListQuery(); $where = array(); $virtuemart_vendor_id = vmAccess::isSuperVendor(); if(vmAccess::manager('managevendors')){ vmdebug('Vendor is core.admin and should see all'); $virtuemart_vendor_id = vRequest::get('virtuemart_vendor_id',$virtuemart_vendor_id); if($virtuemart_vendor_id){ $where[]= ' o.virtuemart_vendor_id = "'.$virtuemart_vendor_id.'" '; } if(!empty($uid)){ $where[]= ' u.virtuemart_user_id = ' . (int)$uid.' '; } } else if( vmAccess::manager('orders')){ vmdebug('Vendor is manager and should only see its own orders venodorId '.$virtuemart_vendor_id); if(!empty($virtuemart_vendor_id)){ $where[]= ' (o.virtuemart_vendor_id = '.$virtuemart_vendor_id.' OR u.virtuemart_user_id = ' . (int)$uid.') '; $uid = 0; } else { //We map here as fallback to vendor 1. $where[]= ' u.virtuemart_user_id = ' . (int)$uid; } } else { //A normal user is only allowed to see its own orders, we map $uid to the user id $user = JFactory::getUser(); $uid = (int)$user->id; $where = array(); } if(!empty($uid)){ $where[]= ' u.virtuemart_user_id = ' . (int)$uid.' '; } if ($search = vRequest::getString('search', false)){ $db = JFactory::getDBO(); $search = '"%' . $db->escape( $search, true ) . '%"' ; $search = str_replace(' ','%',$search); $searchFields = array(); $searchFields[] = 'u.first_name'; $searchFields[] = 'u.middle_name'; $searchFields[] = 'u.last_name'; $searchFields[] = 'o.order_number'; $searchFields[] = 'u.company'; $searchFields[] = 'u.email'; $searchFields[] = 'u.phone_1'; $searchFields[] = 'u.address_1'; $searchFields[] = 'u.zip'; //quorvia addedd ST data searches $searchFields[] = 'st.company'; $searchFields[] = 'st.last_name'; $searchFields[] = 'st.city'; $searchFields[] = 'st.zip'; $where[] = implode (' LIKE '.$search.' OR ', $searchFields) . ' LIKE '.$search.' '; //$where[] = ' ( u.first_name LIKE '.$search.' OR u.middle_name LIKE '.$search.' OR u.last_name LIKE '.$search.' OR `order_number` LIKE '.$search.')'; } $order_status_code = vRequest::getString('order_status_code', false); if ($order_status_code and $order_status_code!=-1){ $where[] = ' o.order_status = "'.$order_status_code.'" '; } if (count ($where) > 0) { $whereString = ' WHERE (' . implode (' AND ', $where) . ') '; } else { $whereString = ''; } if ( vRequest::getCmd('view') == 'orders') { $ordering = $this->_getOrdering(); } else { $ordering = ' order by o.modified_on DESC'; } $this->_data = $this->exeSortSearchListQuery(0,$select,$from,$whereString,'',$ordering); if($this->_data){ foreach($this->_data as $k=>$d){ $this->_data[$k]->order_name = htmlspecialchars(strip_tags(htmlspecialchars_decode($d->order_name))); } } return $this->_data ; } /** * List of tables to include for the product query */ private function getOrdersListQuery() { return ' FROM #__virtuemart_orders as o LEFT JOIN #__virtuemart_order_userinfos as u ON u.virtuemart_order_id = o.virtuemart_order_id AND u.address_type="BT" LEFT JOIN #__virtuemart_order_userinfos as st ON st.virtuemart_order_id = o.virtuemart_order_id AND st.address_type="ST" LEFT JOIN #__virtuemart_paymentmethods_'.VmConfig::$vmlang.' as pm ON o.virtuemart_paymentmethod_id = pm.virtuemart_paymentmethod_id'; } /** * Update an order item status * @author Max Milbers * @author Ondřej Spilka - used for item edit also * @author Maik Künnemann */ public function updateSingleItem($virtuemart_order_item_id, &$orderdata, $orderUpdate = false) { $virtuemart_order_item_id = (int)$virtuemart_order_item_id; //vmdebug('updateSingleItem',$virtuemart_order_item_id,$orderdata); $table = $this->getTable('order_items'); if(!empty($virtuemart_order_item_id)){ $table->load($virtuemart_order_item_id); $oldOrderStatus = $table->order_status; } //vmdebug('my order table ',$virtuemart_order_item_id,$table->virtuemart_order_id); if(empty($oldOrderStatus)){ $oldOrderStatus = $orderdata->current_order_status; if($orderUpdate and empty($oldOrderStatus)){ $oldOrderStatus = 'P'; } } $dataT = get_object_vars($table); $orderdatacopy = $orderdata; $data = array_merge($dataT,(array)$orderdatacopy); if (!class_exists('CurrencyDisplay')) { require(VMPATH_ADMIN . DS . 'helpers' . DS . 'currencydisplay.php'); } $this->_currencyDisplay = CurrencyDisplay::getInstance(); $rounding = $this->_currencyDisplay->_priceConfig['salesPrice'][1]; if ( $orderUpdate and !empty($data['virtuemart_order_item_id'])) { //get tax calc_value of product VatTax $db = JFactory::getDBO(); $sql = "SELECT `calc_value` FROM `#__virtuemart_order_calc_rules` WHERE `virtuemart_order_id` = ".$data['virtuemart_order_id']." AND `virtuemart_order_item_id` = ".$data['virtuemart_order_item_id']." AND `calc_kind` = 'VatTax' "; $db->setQuery($sql); $taxCalcValue = $db->loadResult(); if($data['calculate_product_tax']) { if(!$taxCalcValue){ //Could be a new item, missing the tax rules, we try to get one of another product. //get tax calc_value of product VatTax $db = JFactory::getDBO(); $sql = "SELECT `calc_value` FROM `#__virtuemart_order_calc_rules` WHERE `virtuemart_order_id` = ".$data['virtuemart_order_id']." AND `calc_kind` = 'VatTax' "; $db->setQuery($sql); $taxCalcValue = $db->loadResult(); } if(empty($data['product_subtotal_discount']))$data['product_subtotal_discount'] = 0.0; // "",null,0,NULL, FALSE => 0.0 //We do two cases, either we have the final amount and discount if(!empty($data['product_final_price']) and $data['product_final_price']!=0){ if(empty($data['product_tax']) or $data['product_tax']==0){ $data['product_tax'] = $data['product_final_price'] * $taxCalcValue / ($taxCalcValue + 100); //vmdebug($data['product_final_price'] .' * '.$taxCalcValue.' / '.($taxCalcValue + 100).' = '.$data['product_tax']); } if(empty($data['product_item_price']) or $data['product_item_price']==0){ if(empty($data['product_tax']))$data['product_tax'] = 0.0; $data['product_item_price'] = round($data['product_final_price'], $rounding) - $data['product_tax']; $data['product_discountedPriceWithoutTax'] = 0.0;// round($data['product_final_price'], $rounding) ; $data['product_priceWithoutTax'] = 0.0; $data['product_basePriceWithTax'] = round($data['product_final_price'], $rounding) - $data['product_subtotal_discount']; } } else //or we have the base price and a manually set discount. if(!empty($data['product_item_price']) and $data['product_item_price']!=0){ if(empty($data['product_tax']) or $data['product_tax']==0){ $data['product_tax'] = ($data['product_item_price']-$data['product_subtotal_discount']) * ($taxCalcValue/100.0); } $data['product_discountedPriceWithoutTax'] = 0.0; $data['product_priceWithoutTax'] = 0.0; $data['product_final_price'] = round($data['product_item_price'], $rounding) + $data['product_tax'] + $data['product_subtotal_discount']; $data['product_basePriceWithTax'] = round($data['product_final_price'], $rounding) - $data['product_subtotal_discount']; } } //$data['product_subtotal_discount'] = (round($orderdata->product_final_price, $rounding) - round($data['product_basePriceWithTax'], $rounding)) * $orderdata->product_quantity; $data['product_subtotal_with_tax'] = round($data['product_final_price'], $rounding) * $orderdata->product_quantity; } if(!empty($table->virtuemart_vendor_id)){ $data['virtuemart_vendor_id'] = $table->virtuemart_vendor_id; } $table->bindChecknStore($data); if ( $orderUpdate ) { if ( empty($data['order_item_sku']) and !empty($virtuemart_order_item_id) ) { //update product identification $db = JFactory::getDBO(); $prolang = '#__virtuemart_products_' . VmConfig::$vmlang; $oi = " #__virtuemart_order_items"; $protbl = "#__virtuemart_products"; $sql = 'UPDATE '.$oi.', '.$protbl.', '.$prolang . ' SET '.$oi.'.order_item_sku='.$protbl.'.product_sku, '.$oi.'.order_item_name='.$prolang.'.product_name WHERE '.$oi.'.virtuemart_product_id='.$protbl.'.virtuemart_product_id and '.$oi.'.virtuemart_product_id='.$prolang.'.virtuemart_product_id and '.$oi.'.virtuemart_order_item_id='.(int)$virtuemart_order_item_id; $db->setQuery($sql); if ($db->execute() === false) { vmError('updateSingleItem '.$sql,'Error updating order'); } } } //OSP update cartRules/shipment/payment //it would seem strange this is via item edit //but in general, shipment and payment would be tractated as another items of the order //in datas they are not, bu okay we have it here and functional //moreover we can compute all aggregate values here via one aggregate SQL if ( $orderUpdate and !empty( $table->virtuemart_order_id)) { $db = JFactory::getDBO(); $ordid = $table->virtuemart_order_id; ///vmdebug('my order table ',$table); //cartRules $calc_rules = vRequest::getVar('calc_rules','', '', 'array'); $calc_rules_amount = 0; $calc_rules_discount_amount = 0; $calc_rules_tax_amount = 0; if(!empty($calc_rules)) { foreach($calc_rules as $calc_kind => $calc_rule) { foreach($calc_rule as $virtuemart_order_calc_rule_id => $calc_amount) { $sql = 'UPDATE `#__virtuemart_order_calc_rules` SET `calc_amount`="'.$calc_amount.'" WHERE `virtuemart_order_calc_rule_id`="'.$virtuemart_order_calc_rule_id.'"'; $db->setQuery($sql); if(isset($calc_amount)) $calc_rules_amount += $calc_amount; if ($calc_kind == 'DBTaxRulesBill' || $calc_kind == 'DATaxRulesBill') { $calc_rules_discount_amount += $calc_amount; } if ($calc_kind == 'taxRulesBill') { $calc_rules_tax_amount += $calc_amount; } if ($db->execute() === false) { vmError($db->getError()); } } } } //shipment $os = vRequest::getString('order_shipment'); $ost = vRequest::getString('order_shipment_tax'); if ( $os!="" ) { $sql = 'UPDATE `#__virtuemart_orders` SET `order_shipment`="'.$os.'",`order_shipment_tax`="'.$ost.'" WHERE `virtuemart_order_id`="'.$ordid.'"'; $db->setQuery($sql); if ($db->execute() === false) { vmError('updateSingleItem Error updating order_shipment '.$sql); } } //payment $op = vRequest::getString('order_payment'); $opt = vRequest::getString('order_payment_tax'); if ( $op!="" ) { $sql = 'UPDATE `#__virtuemart_orders` SET `order_payment`="'.$op.'",`order_payment_tax`="'.$opt.'" WHERE `virtuemart_order_id`="'.$ordid.'"'; $db->setQuery($sql); if ($db->execute() === false) { vmError('updateSingleItem Error updating order payment'.$sql); } } $sql = 'UPDATE `#__virtuemart_orders` SET '. '`order_total`=(SELECT sum(product_final_price*product_quantity) FROM #__virtuemart_order_items where `virtuemart_order_id`='.$ordid.')+`order_shipment`+`order_shipment_tax`+`order_payment`+`order_payment_tax`+'.$calc_rules_amount.', `order_discountAmount`=(SELECT sum(product_subtotal_discount) FROM #__virtuemart_order_items where `virtuemart_order_id`='.$ordid.'), `order_billDiscountAmount`=`order_discountAmount`+'.$calc_rules_discount_amount.', `order_salesPrice`=(SELECT sum(product_final_price*product_quantity) FROM #__virtuemart_order_items where `virtuemart_order_id`='.$ordid.'), `order_tax`=(SELECT sum( product_tax*product_quantity) FROM #__virtuemart_order_items where `virtuemart_order_id`='.$ordid.'), `order_subtotal`=(SELECT sum(ROUND(product_item_price, '. $rounding .')*product_quantity) FROM #__virtuemart_order_items where `virtuemart_order_id`='.$ordid.'),'; if(vRequest::getString('calculate_billTaxAmount')) { $sql .= '`order_billTaxAmount`=(SELECT sum( product_tax*product_quantity) FROM #__virtuemart_order_items where `virtuemart_order_id`='.$ordid.')+`order_shipment_tax`+`order_payment_tax`+ '.$calc_rules_tax_amount.' '; } else { $sql .= '`order_billTaxAmount`="'.vRequest::getString('order_billTaxAmount').'"'; } $sql .= ' WHERE `virtuemart_order_id`='.$ordid; $db->setQuery($sql); if ($db->execute() === false) { vmError('updateSingleItem '.$db->getError().' and '.$sql); } } $this->handleStockAfterStatusChangedPerProduct($orderdata->order_status, $oldOrderStatus, $table,$table->product_quantity); } /** * Strange name is just temporarly * * @param unknown_type $order_id * @param unknown_type $order_status * @author Max Milbers */ var $useDefaultEmailOrderStatus = true; public function updateOrderStatus($orders=0, $order_id =0,$order_status=0){ //General change of orderstatus $total = 1 ; if(empty($orders)){ $orders = array(); $orderslist = vRequest::getVar('orders', array()); $total = 0 ; // Get the list of orders in post to update foreach ($orderslist as $key => $order) { if ( $orderslist[$key]['order_status'] !== $orderslist[$key]['current_order_status'] ) { $orders[$key] = $orderslist[$key]; $total++; } } } if(!is_array($orders)){ $orders = array($orders); } /* Process the orders to update */ $updated = 0; $error = 0; if ($orders) { // $notify = vRequest::getVar('customer_notified', array()); // ??? // $comments = vRequest::getVar('comments', array()); // ??? foreach ($orders as $virtuemart_order_id => $order) { if ($order_id >0) $virtuemart_order_id= $order_id; $this->useDefaultEmailOrderStatus = false; if($this->updateStatusForOneOrder($virtuemart_order_id,$order,true)){ $updated ++; } else { $error++; } } } $result = array( 'updated' => $updated , 'error' =>$error , 'total' => $total ) ; return $result ; } /** * Attention, if you use this function within your trigger take care of the last parameter, * you should define it, this parameter maybe set to false in future releases * * IMPORTANT: The $inputOrder can contain extra data by plugins * * @param $virtuemart_order_id * @param $inputOrder * @param bool $useTriggers * @return bool */ function updateStatusForOneOrder($virtuemart_order_id,$inputOrder,$useTriggers=true){ // vmdebug('updateStatusForOneOrder', $inputOrder); /* Update the order */ $data = $this->getTable('orders'); $data->load($virtuemart_order_id); $old_order_status = $data->order_status; if(empty($inputOrder['virtuemart_order_id'])){ unset($inputOrder['virtuemart_order_id']); } $data->bind($inputOrder); $cp_rm = VmConfig::get('cp_rm',array('C')); if(!is_array($cp_rm)) $cp_rm = array($cp_rm); if ( in_array((string) $data->order_status,$cp_rm) ){ if (!empty($data->coupon_code)) { if (!class_exists('CouponHelper')) require(VMPATH_SITE . DS . 'helpers' . DS . 'coupon.php'); CouponHelper::RemoveCoupon($data->coupon_code); } } //First we must call the payment, the payment manipulates the result of the order_status if($useTriggers){ if(!class_exists('vmPSPlugin')) require(VMPATH_PLUGINLIBS.DS.'vmpsplugin.php'); JPluginHelper::importPlugin('vmcalculation'); JPluginHelper::importPlugin('vmcustom'); JPluginHelper::importPlugin('vmshipment'); $_dispatcher = JDispatcher::getInstance(); //Should we add this? $inputOrder $_returnValues = $_dispatcher->trigger('plgVmOnUpdateOrderShipment',array(&$data,$old_order_status)); // Payment decides what to do when order status is updated JPluginHelper::importPlugin('vmpayment'); $_dispatcher = JDispatcher::getInstance(); //Should we add this? $inputOrder $_returnValues = $_dispatcher->trigger('plgVmOnUpdateOrderPayment',array(&$data,$old_order_status)); foreach ($_returnValues as $_returnValue) { if ($_returnValue === true) { break; // Plugin was successfull } elseif ($_returnValue === false) { return false; // Plugin failed } // Ignore null status and look for the next returnValue } /** * If an order gets cancelled, fire a plugin event, perhaps * some authorization needs to be voided */ if ($data->order_status == "X") { $_dispatcher = JDispatcher::getInstance(); //Should be renamed to plgVmOnCancelOrder $_dispatcher->trigger('plgVmOnCancelPayment',array(&$data,$old_order_status)); } } if(empty($data->delivery_date)){ $del_date_type = VmConfig::get('del_date_type','m'); if(strpos($del_date_type,'os')!==FALSE){ //for example osS $os = substr($del_date_type,2); if($data->order_status == $os){ $date = JFactory::getDate(); $data->delivery_date = $date->toSQL(); } } else { VmConfig::loadJLang('com_virtuemart_orders', true); $data->delivery_date = vmText::_('COM_VIRTUEMART_DELDATE_INV'); } } if ($data->store()) { $task= vRequest::getCmd('task',0); $view= vRequest::getCmd('view',0); $item_ids = vRequest::getVar('item_id',false); if($item_ids){ foreach ($item_ids as $item_id => $order_item_data) { $order_item_data['current_order_status'] = $order_item_data['order_status']; if (!isset($order_item_data['comments'])) $order_item_data['comments'] = ''; $order_item_data = (object)$order_item_data; $order_item_data->virtuemart_order_id = $virtuemart_order_id; //$this->updateSingleItem($order_item->virtuemart_order_item_id, $data->order_status, $order['comments'] , $virtuemart_order_id, $data->order_pass); if(empty($item_id)){ $inputOrder['comments'] .= ' '.vmText::sprintf('COM_VIRTUEMART_ORDER_PRODUCT_ADDED',$order_item_data->order_item_name); } $this->updateSingleItem($item_id, $order_item_data,true); } } else { /*if($task=='edit'){ $update_lines = vRequest::getInt('update_lines'); } else /*/ if ($task=='updatestatus' and $view=='orders') { $lines = vRequest::getVar('orders'); $update_lines = $lines[$virtuemart_order_id]['update_lines']; } else { $update_lines = 1; } if($update_lines==1){ vmdebug('$update_lines '.$update_lines); $q = 'SELECT virtuemart_order_item_id FROM #__virtuemart_order_items WHERE virtuemart_order_id="'.$virtuemart_order_id.'"'; $db = JFactory::getDBO(); $db->setQuery($q); $order_items = $db->loadObjectList(); if ($order_items) { // vmdebug('updateStatusForOneOrder',$data); foreach ($order_items as $order_item) { //$this->updateSingleItem($order_item->virtuemart_order_item_id, $data->order_status, $order['comments'] , $virtuemart_order_id, $data->order_pass); $this->updateSingleItem($order_item->virtuemart_order_item_id, $data); } } } } $inputOrder['comments'] = trim($inputOrder['comments']); /* Update the order history */ $this->_updateOrderHist($virtuemart_order_id, $data->order_status, $inputOrder['customer_notified'], $inputOrder['comments']); //We need a new invoice, therefore rename the old one. $inv_os = VmConfig::get('inv_os',array('C')); if(!is_array($inv_os)) $inv_os = array($inv_os); if($old_order_status!=$data->order_status and in_array($data->order_status,$inv_os)){ $this->renameInvoice($data->virtuemart_order_id); } // When the plugins did not already notified the user, do it here (the normal way) //Attention the ! prevents at the moment that an email is sent. But it should used that way. // if (!$inputOrder['customer_notified']) { $this->notifyCustomer( $data->virtuemart_order_id , $inputOrder ); // } JPluginHelper::importPlugin('vmcoupon'); $dispatcher = JDispatcher::getInstance(); $returnValues = $dispatcher->trigger('plgVmCouponUpdateOrderStatus', array($data, $old_order_status)); if(!empty($returnValues)){ foreach ($returnValues as $returnValue) { if ($returnValue !== null ) { return $returnValue; } } } return true; } else { return false; } } /** * Get the information from the cart and create an order from it * * @author Oscar van Eijk * @param object $_cart The cart data * @return mixed The new ordernumber, false on errors */ public function createOrderFromCart($cart) { if ($cart === null) { vmError('createOrderFromCart() called without a cart - that\'s a programming bug','Can\'t create order, sorry.'); return false; } $usr = JFactory::getUser(); //$prices = $cart->getCartPrices(); if (($orderID = $this->_createOrder($cart, $usr)) == 0) { vmError('Couldn\'t create order','Couldn\'t create order'); return false; } if (!$this->_createOrderLines($orderID, $cart)) { vmError('Couldn\'t create order items','Couldn\'t create order items'); return false; } if (!$this-> _createOrderCalcRules($orderID, $cart) ) { vmError('Couldn\'t create order items','Couldn\'t create order items'); return false; } $this->_updateOrderHist($orderID); if (!$this->_writeUserInfo($orderID, $usr, $cart)) { vmError('Couldn\'t create order userinfo','Couldn\'t create order userinfo'); return false; } return $orderID; } /** * Write the order header record * * @author Oscar van Eijk * @param object $_cart The cart data * @param object $_usr User object * @param array $_prices Price data * @return integer The new ordernumber */ private function _createOrder($_cart, $_usr) { // TODO We need tablefields for the new values: // Shipment: // $_prices['shipmentValue'] w/out tax // $_prices['shipmentTax'] Tax // $_prices['salesPriceShipment'] Total // // Payment: // $_prices['paymentValue'] w/out tax // $_prices['paymentTax'] Tax // $_prices['paymentDiscount'] Discount // $_prices['salesPricePayment'] Total $_orderData = new stdClass(); $_orderData->virtuemart_order_id = null; $_orderData->virtuemart_user_id = $_usr->get('id'); $_orderData->virtuemart_vendor_id = $_cart->vendorId; $_orderData->customer_number = $_cart->customer_number; $_prices = $_cart->cartPrices; //Note as long we do not have an extra table only storing addresses, the virtuemart_userinfo_id is not needed. //The virtuemart_userinfo_id is just the id of a stored address and is only necessary in the user maintance view or for choosing addresses. //the saved order should be an snapshot with plain data written in it. // $_orderData->virtuemart_userinfo_id = 'TODO'; // $_cart['BT']['virtuemart_userinfo_id']; // TODO; Add it in the cart... but where is this used? Obsolete? $_orderData->order_total = $_prices['billTotal']; $_orderData->order_salesPrice = $_prices['salesPrice']; $_orderData->order_billTaxAmount = $_prices['billTaxAmount']; $_orderData->order_billDiscountAmount = $_prices['billDiscountAmount']; $_orderData->order_discountAmount = $_prices['discountAmount']; $_orderData->order_subtotal = $_prices['priceWithoutTax']; $_orderData->order_tax = $_prices['taxAmount']; $_orderData->order_shipment = $_prices['shipmentValue']; $_orderData->order_shipment_tax = $_prices['shipmentTax']; $_orderData->order_payment = $_prices['paymentValue']; $_orderData->order_payment_tax = $_prices['paymentTax']; if (!empty($_cart->cartData['VatTax'])) { $taxes = array(); foreach($_cart->cartData['VatTax'] as $k=>$VatTax) { $taxes[$k]['virtuemart_calc_id'] = $k; $taxes[$k]['calc_name'] = $VatTax['calc_name']; $taxes[$k]['calc_value'] = $VatTax['calc_value']; $taxes[$k]['result'] = $VatTax['result']; } $_orderData->order_billTax = json_encode($taxes); } if (!empty($_cart->couponCode)) { $_orderData->coupon_code = $_cart->couponCode; $_orderData->coupon_discount = $_prices['salesPriceCoupon']; } $_orderData->order_discount = $_prices['discountAmount']; // discount order_items $_orderData->order_status = 'P'; $_orderData->order_currency = $this->getVendorCurrencyId($_orderData->virtuemart_vendor_id); if (!class_exists('CurrencyDisplay')) { require(VMPATH_ADMIN . '/helpers/currencydisplay.php'); } if (isset($_cart->pricesCurrency)) { $_orderData->user_currency_id = $_cart->paymentCurrency ;//$this->getCurrencyIsoCode($_cart->pricesCurrency); $currency = CurrencyDisplay::getInstance($_orderData->user_currency_id); if($_orderData->user_currency_id != $_orderData->order_currency){ $_orderData->user_currency_rate = $currency->convertCurrencyTo($_orderData->user_currency_id ,1.0,false); } else { $_orderData->user_currency_rate=1.0; } } $_orderData->virtuemart_paymentmethod_id = $_cart->virtuemart_paymentmethod_id; $_orderData->virtuemart_shipmentmethod_id = $_cart->virtuemart_shipmentmethod_id; //Some payment plugins need a new order_number for any try $_orderData->order_number = ''; $_orderData->order_pass = ''; $_orderData->order_language = $_cart->order_language; $_orderData->ip_address = $_SERVER['REMOTE_ADDR']; $maskIP = VmConfig::get('maskIP','last'); if($maskIP=='last'){ $rpos = strrpos($_orderData->ip_address,'.'); $_orderData->ip_address = substr($_orderData->ip_address,0,($rpos+1)).'xx'; } if($_cart->_inConfirm){ $order = false; $db = JFactory::getDbo(); $q = 'SELECT * FROM `#__virtuemart_orders` '; if(!empty($_cart->virtuemart_order_id)){ $db->setQuery($q . ' WHERE `order_number`= "'.$_cart->virtuemart_order_id.'" AND `order_status` = "P" '); $order = $db->loadAssoc(); if(!$order){ vmdebug('This should not happen, there is a cart with order_number, but not order stored '.$_cart->virtuemart_order_id); } } if(VmConfig::get('reuseorders',true) and !$order){ $jnow = JFactory::getDate(); $jnow->sub(new DateInterval('PT1H')); $minushour = $jnow->toSQL(); $q .= ' WHERE `customer_number`= "'.$_orderData->customer_number.'" '; $q .= ' AND `order_status` = "P" AND `created_on` > "'.$minushour.'" '; $db->setQuery($q); $order = $db->loadAssoc(); } if($order){ if(!empty($order['virtuemart_order_id'])){ $_orderData->virtuemart_order_id = $order['virtuemart_order_id']; } //Dirty hack $this->removeOrderItems($order['virtuemart_order_id']); } } JPluginHelper::importPlugin('vmshopper'); $dispatcher = JDispatcher::getInstance(); $plg_datas = $dispatcher->trigger('plgVmOnUserOrder',array(&$_orderData)); foreach($plg_datas as $plg_data){ // $data = array_merge($plg_data,$data); } if(empty($_orderData->order_number)){ $_orderData->order_number = $this->genStdOrderNumber($_orderData->virtuemart_vendor_id); } if(empty($_orderData->order_pass)){ $_orderData->order_pass = $this->genStdOrderPass(); } if(empty($_orderData->order_create_invoice_pass)){ $_orderData->order_create_invoice_pass = $this->genStdCreateInvoicePass(); } $orderTable = $this->getTable('orders'); $orderTable -> bindChecknStore($_orderData); $db = JFactory::getDBO(); if (!empty($_cart->couponCode)) { //set the virtuemart_order_id in the Request for 3rd party coupon components (by Seyi and Max) vRequest::setVar ( 'virtuemart_order_id', $orderTable->virtuemart_order_id ); // If a gift coupon was used, remove it now CouponHelper::setInUseCoupon($_cart->couponCode, true); } // the order number is saved into the session to make sure that the correct cart is emptied with the payment notification $_cart->order_number = $orderTable->order_number; $_cart->order_pass = $_orderData->order_pass; $_cart->virtuemart_order_id = $orderTable->virtuemart_order_id; $_cart->setCartIntoSession (); return $orderTable->virtuemart_order_id; } private function getVendorCurrencyId($vendorId){ $q = 'SELECT `vendor_currency` FROM `#__virtuemart_vendors` WHERE `virtuemart_vendor_id`="'.$vendorId.'" '; $db = JFactory::getDBO(); $db->setQuery($q); $vendorCurrency = $db->loadResult(); return $vendorCurrency; } /** * Write the BillTo record, and if set, the ShipTo record * * @author Oscar van Eijk * @param integer $_id Order ID * @param object $_usr User object * @param object $_cart Cart object * @return boolean True on success */ private function _writeUserInfo($_id, &$_usr, $_cart) { $_userInfoData = array(); if(!class_exists('VirtueMartModelUserfields')) require(VMPATH_ADMIN.DS.'models'.DS.'userfields.php'); $_userFieldsModel = VmModel::getModel('userfields'); $_userFieldsBT = $_userFieldsModel->getUserFields('account' , array('delimiters'=>true, 'captcha'=>true) , array('username', 'password', 'password2', 'user_is_vendor') ); $userFieldsCart = $_userFieldsModel->getUserFields( 'cart' , array('captcha' => true, 'delimiters' => true) // Ignore these types , array('user_is_vendor' ,'username','password', 'password2', 'agreed', 'address_type') // Skips ); $_userFieldsBT = array_merge($_userFieldsBT,$userFieldsCart); foreach ($_userFieldsBT as $_fld) { $_name = $_fld->name; if(!empty( $_cart->BT[$_name])){ if (is_array( $_cart->BT[$_name])) { $_userInfoData[$_name] = implode("|*|",$_cart->BT[$_name]); } else { $_userInfoData[$_name] = $_cart->BT[$_name]; } } } $_userInfoData['virtuemart_order_id'] = $_id; $_userInfoData['virtuemart_user_id'] = $_usr->get('id'); $_userInfoData['address_type'] = 'BT'; $db = JFactory::getDBO(); $q = ' SELECT `virtuemart_order_userinfo_id` FROM `#__virtuemart_order_userinfos` '; $q .= ' WHERE `virtuemart_order_id` = "'.$_id.'" AND `address_type` = "BT" '; $db->setQuery($q); if($vmOId = $db->loadResult()){ $_userInfoData['virtuemart_order_userinfo_id'] = $vmOId; } $order_userinfosTable = $this->getTable('order_userinfos'); if (!$order_userinfosTable->bindChecknStore($_userInfoData)){ return false; } if ($_cart->ST and empty($_cart->STsameAsBT)) { $_userInfoData = array(); $_userFieldsST = $_userFieldsModel->getUserFields('shipment' , array('delimiters'=>true, 'captcha'=>true) , array('username', 'password', 'password2', 'user_is_vendor') ); foreach ($_userFieldsST as $_fld) { $_name = $_fld->name; if(!empty( $_cart->ST[$_name])){ $_userInfoData[$_name] = $_cart->ST[$_name]; } } $_userInfoData['virtuemart_order_id'] = $_id; $_userInfoData['virtuemart_user_id'] = $_usr->get('id'); $_userInfoData['address_type'] = 'ST'; $q = ' SELECT `virtuemart_order_userinfo_id` FROM `#__virtuemart_order_userinfos` '; $q .= ' WHERE `virtuemart_order_id` = "'.$_id.'" AND `address_type` = "ST" '; $db->setQuery($q); if($vmOId = $db->loadResult()){ $_userInfoData['virtuemart_order_userinfo_id'] = $vmOId; } $order_userinfosTable = $this->getTable('order_userinfos'); if (!$order_userinfosTable->bindChecknStore($_userInfoData)){ return false; } } return true; } function handleStockAfterStatusChangedPerProduct($newState, $oldState,$tableOrderItems, $quantity) { if($newState == $oldState) return; // $StatutWhiteList = array('P','C','X','R','S','N'); $db = JFactory::getDBO(); $db->setQuery('SELECT * FROM `#__virtuemart_orderstates` '); $StatutWhiteList = $db->loadAssocList('order_status_code'); // new product is statut N $StatutWhiteList['N'] = Array ( 'order_status_id' => 0 , 'order_status_code' => 'N' , 'order_stock_handle' => 'A'); if(!array_key_exists($oldState,$StatutWhiteList) or !array_key_exists($newState,$StatutWhiteList)) { vmError('The workflow for '.$newState.' or '.$oldState.' is unknown, take a look on model/orders function handleStockAfterStatusChanged','Can\'t process workflow, contact the shopowner. Status is '.$newState); return ; } //vmdebug( 'updatestock qt :' , $quantity.' id :'.$productId); // P Pending // C Confirmed // X Cancelled // R Refunded // S Shipped // N New or coming from cart // TO have no product setted as ordered when added to cart simply delete 'P' FROM array Reserved // don't set same values in the 2 arrays !!! // stockOut is in normal case shipped product //order_stock_handle // 'A' : stock Available // 'O' : stock Out // 'R' : stock reserved // the status decreasing real stock ? // $stockOut = array('S'); if ($StatutWhiteList[$newState]['order_stock_handle'] == 'O') $isOut = 1; else $isOut = 0; if ($StatutWhiteList[$oldState]['order_stock_handle'] == 'O') $wasOut = 1; else $wasOut = 0; // Stock change ? if ($isOut && !$wasOut) $product_in_stock = '-'; else if ($wasOut && !$isOut ) $product_in_stock = '+'; else $product_in_stock = '='; // the status increasing reserved stock(virtual Stock = product_in_stock - product_ordered) // $Reserved = array('P','C'); if ($StatutWhiteList[$newState]['order_stock_handle'] == 'R') $isReserved = 1; else $isReserved = 0; if ($StatutWhiteList[$oldState]['order_stock_handle'] == 'R') $wasReserved = 1; else $wasReserved = 0; if ($isReserved && !$wasReserved ) $product_ordered = '+'; else if (!$isReserved && $wasReserved ) $product_ordered = '-'; else $product_ordered = '='; //Here trigger plgVmGetProductStockToUpdateByCustom $productModel = VmModel::getModel('product'); if (!empty($tableOrderItems->product_attribute)) { if(!class_exists('VirtueMartModelCustomfields'))require(VMPATH_ADMIN.DS.'models'.DS.'customfields.php'); $virtuemart_product_id = $tableOrderItems->virtuemart_product_id; $product_attributes = json_decode($tableOrderItems->product_attribute,true); foreach ($product_attributes as $virtuemart_customfield_id=>$param){ if ($param) { if(is_array($param)){ reset($param); $customfield_id = key($param); } else { $customfield_id = $param; } if ($customfield_id) { if ($productCustom = VirtueMartModelCustomfields::getCustomEmbeddedProductCustomField ($customfield_id ) ) { if ($productCustom->field_type == "E") { if(!class_exists('vmCustomPlugin')) require(VMPATH_PLUGINLIBS.DS.'vmcustomplugin.php'); JPluginHelper::importPlugin('vmcustom'); $dispatcher = JDispatcher::getInstance(); $dispatcher->trigger('plgVmGetProductStockToUpdateByCustom',array(&$tableOrderItems,$param, $productCustom)); } } } } } // we can have more then one product in case of pack // in case of child, ID must be the child ID // TO DO use $prod->amount change for packs(eg. 1 computer and 2 HDD) if (is_array($tableOrderItems)) foreach ($tableOrderItems as $prod ) $productModel->updateStockInDB($prod, $quantity,$product_in_stock,$product_ordered); else $productModel->updateStockInDB($tableOrderItems, $quantity,$product_in_stock,$product_ordered); } else { $productModel->updateStockInDB ($tableOrderItems, $quantity,$product_in_stock,$product_ordered); } } /** * Create the ordered item records * * @author Oscar van Eijk * @author Kohl Patrick * @param integer $_id integer Order ID * @param object $_cart array The cart data * @return boolean True on success */ private function _createOrderLines($virtuemart_order_id, $cart) { $_orderItems = $this->getTable('order_items'); foreach ($cart->products as $priceKey=>$product) { $_orderItems->product_attribute = vmJsApi::safe_json_encode($product->customProductData); $_orderItems->virtuemart_order_item_id = null; $_orderItems->virtuemart_order_id = $virtuemart_order_id; $_orderItems->virtuemart_vendor_id = $product->virtuemart_vendor_id; $_orderItems->virtuemart_product_id = $product->virtuemart_product_id; $_orderItems->order_item_sku = $product->product_sku; $_orderItems->order_item_name = $product->product_name; $_orderItems->product_quantity = $product->quantity; $_orderItems->product_item_price = $product->allPrices[$product->selectedPrice]['basePriceVariant']; $_orderItems->product_basePriceWithTax = $product->allPrices[$product->selectedPrice]['basePriceWithTax']; //$_orderItems->product_tax = $_cart->pricesUnformatted[$priceKey]['subtotal_tax_amount']; $_orderItems->product_tax = $product->allPrices[$product->selectedPrice]['taxAmount']; $_orderItems->product_final_price = $product->allPrices[$product->selectedPrice]['salesPrice']; $_orderItems->product_subtotal_discount = $product->allPrices[$product->selectedPrice]['subtotal_discount']; $_orderItems->product_subtotal_with_tax = $product->allPrices[$product->selectedPrice]['subtotal_with_tax']; $_orderItems->product_priceWithoutTax = $product->allPrices[$product->selectedPrice]['priceWithoutTax']; $_orderItems->product_discountedPriceWithoutTax = $product->allPrices[$product->selectedPrice]['discountedPriceWithoutTax']; $_orderItems->order_status = 'P'; if (!$_orderItems->check()) { return false; } // Save the record to the database if (!$_orderItems->store()) { return false; } $product->virtuemart_order_item_id = $_orderItems->virtuemart_order_item_id; $this->handleStockAfterStatusChangedPerProduct( $_orderItems->order_status,'N',$_orderItems,$_orderItems->product_quantity); } return true; } /** * Create the ordered item records * * @author Valerie Isaksen * @param integer $_id integer Order ID * @param object $_cart array The cart data * @return boolean True on success */ private function _createOrderCalcRules($order_id, $_cart) { $productKeys = array_keys($_cart->products); $calculation_kinds = array('DBTax','Tax','VatTax','DATax'); foreach($productKeys as $key){ foreach($calculation_kinds as $calculation_kind) { if(!isset($_cart->cartPrices[$key][$calculation_kind])) continue; $productRules = $_cart->cartPrices[$key][$calculation_kind]; foreach($productRules as $rule){ $orderCalcRules = $this->getTable('order_calc_rules'); $orderCalcRules->virtuemart_order_calc_rule_id= null; $orderCalcRules->virtuemart_calc_id= $rule[7]; $orderCalcRules->virtuemart_order_item_id = $_cart->products[$key]->virtuemart_order_item_id; $orderCalcRules->calc_rule_name = $rule[0]; $orderCalcRules->calc_amount = 0; $orderCalcRules->calc_result = 0; if ($calculation_kind == 'VatTax') { $orderCalcRules->calc_amount = $_cart->cartPrices[$key]['taxAmount']; $orderCalcRules->calc_result = $_cart->cartData['VatTax'][$rule[7]]['result']; } $orderCalcRules->calc_value = $rule[1]; $orderCalcRules->calc_mathop = $rule[2]; $orderCalcRules->calc_kind = $calculation_kind; $orderCalcRules->calc_currency = $rule[4]; $orderCalcRules->calc_params = $rule[5]; $orderCalcRules->virtuemart_vendor_id = $rule[6]; $orderCalcRules->virtuemart_order_id = $order_id; if (!$orderCalcRules->check()) { vmdebug('_createOrderCalcRules check product rule ',$this); return false; } // Save the record to the database if (!$orderCalcRules->store()) { vmdebug('_createOrderCalcRules store product rule ',$this); return false; } } } } $Bill_calculation_kinds=array('DBTaxRulesBill', 'taxRulesBill', 'DATaxRulesBill'); foreach($Bill_calculation_kinds as $calculation_kind) { foreach($_cart->cartData[$calculation_kind] as $rule){ $orderCalcRules = $this->getTable('order_calc_rules'); $orderCalcRules->virtuemart_order_calc_rule_id = null; $orderCalcRules->virtuemart_calc_id= $rule['virtuemart_calc_id']; $orderCalcRules->calc_rule_name= $rule['calc_name']; $orderCalcRules->calc_amount = $_cart->cartPrices[$rule['virtuemart_calc_id'].'Diff']; if ($calculation_kind == 'taxRulesBill' and !empty($_cart->cartData['VatTax'][$rule['virtuemart_calc_id']]['result'])) { $orderCalcRules->calc_result = $_cart->cartData['VatTax'][$rule['virtuemart_calc_id']]['result']; } $orderCalcRules->calc_kind=$calculation_kind; $orderCalcRules->calc_mathop=$rule['calc_value_mathop']; $orderCalcRules->virtuemart_order_id=$order_id; $orderCalcRules->calc_params=$rule['calc_params']; $orderCalcRules->virtuemart_vendor_id = $rule['virtuemart_vendor_id']; if (!$orderCalcRules->check()) { return false; } // Save the record to the database if (!$orderCalcRules->store()) { return false; } } } if(!empty($_cart->virtuemart_paymentmethod_id)){ $orderCalcRules = $this->getTable('order_calc_rules'); $calcModel = VmModel::getModel('calc'); $calcModel->setId($_cart->cartPrices['payment_calc_id']); $calc = $calcModel->getCalc(); $orderCalcRules->virtuemart_order_calc_rule_id = null; $orderCalcRules->virtuemart_calc_id = $calc->virtuemart_calc_id; $orderCalcRules->calc_kind = 'payment'; $orderCalcRules->calc_rule_name = $calc->calc_name; $orderCalcRules->calc_amount = $_cart->cartPrices['paymentTax']; $orderCalcRules->calc_value = $calc->calc_value; $orderCalcRules->calc_mathop = $calc->calc_value_mathop; $orderCalcRules->calc_currency = $calc->calc_currency; $orderCalcRules->calc_params = $calc->calc_params; $orderCalcRules->virtuemart_vendor_id = $calc->virtuemart_vendor_id; $orderCalcRules->virtuemart_order_id = $order_id; if (!$orderCalcRules->check()) { return false; } // Save the record to the database if (!$orderCalcRules->store()) { return false; } } if(!empty($_cart->virtuemart_shipmentmethod_id)){ $orderCalcRules = $this->getTable('order_calc_rules'); $calcModel = VmModel::getModel('calc'); $calcModel->setId($_cart->cartPrices['shipment_calc_id']); $calc = $calcModel->getCalc(); $orderCalcRules->virtuemart_order_calc_rule_id = null; $orderCalcRules->virtuemart_calc_id = $calc->virtuemart_calc_id; $orderCalcRules->calc_kind = 'shipment'; $orderCalcRules->calc_rule_name = $calc->calc_name; $orderCalcRules->calc_amount = $_cart->cartPrices['shipmentTax']; $orderCalcRules->calc_value = $calc->calc_value; $orderCalcRules->calc_mathop = $calc->calc_value_mathop; $orderCalcRules->calc_currency = $calc->calc_currency; $orderCalcRules->calc_params = $calc->calc_params; $orderCalcRules->virtuemart_vendor_id = $calc->virtuemart_vendor_id; $orderCalcRules->virtuemart_order_id = $order_id; if (!$orderCalcRules->check()) { return false; } // Save the record to the database if (!$orderCalcRules->store()) { return false; } } return true; } /** * Update the order history * * @author Oscar van Eijk * @param $_id Order ID * @param $_status New order status (default: P) * @param $_notified 1 (default) if the customer was notified, 0 otherwise * @param $_comment (Customer) comment, default empty */ public function _updateOrderHist($_id, $_status = 'P', $_notified = 0, $_comment = '') { $_orderHist = $this->getTable('order_histories'); $_orderHist->virtuemart_order_id = $_id; $_orderHist->order_status_code = $_status; //$_orderHist->date_added = date('Y-m-d G:i:s', time()); $_orderHist->customer_notified = $_notified; $_orderHist->comments = nl2br($_comment); $_orderHist->store(); } /** * Update the order item history * * @author Oscar van Eijk,kohl patrick * @param $_id Order ID * @param $_status New order status (default: P) * @param $_notified 1 (default) if the customer was notified, 0 otherwise * @param $_comment (Customer) comment, default empty */ private function _updateOrderItemHist($_id, $status = 'P', $notified = 1, $comment = '') { $_orderHist = $this->getTable('order_item_histories'); $_orderHist->virtuemart_order_item_id = $_id; $_orderHist->order_status_code = $status; $_orderHist->customer_notified = $notified; $_orderHist->comments = $comment; $_orderHist->store(); } /** * Creates a standard order password */ static public function genStdOrderPass(){ if(!class_exists('vmCrypt')) require(VMPATH_ADMIN.DS.'helpers'.DS.'vmcrypt.php'); $chrs = "ABCDEFGHJKLMNPQRSTUVWXYZ"; $chrs.= "abcdefghijkmnopqrstuvwxyz"; $chrs.= "123456789"; return 'p_'.vmCrypt::getToken(VmConfig::get('randOrderPw',8),$chrs); } static public function genStdCreateInvoicePass(){ if(!class_exists('vmCrypt')) require(VMPATH_ADMIN.DS.'helpers'.DS.'vmcrypt.php'); return vmCrypt::getToken(8); } /** * Generate a unique ordernumber using getHumanToken, which is a random token * with only upper case chars and without 0 and O to prevent missreadings * @author Max Milbers * @param integer $virtuemart_vendor_id For the correct count * @return string A unique ordernumber */ static public function genStdOrderNumber($virtuemart_vendor_id=1){ $db = JFactory::getDBO(); $q = 'SELECT COUNT(1) FROM #__virtuemart_orders WHERE `virtuemart_vendor_id`="'.$virtuemart_vendor_id.'"'; $db->setQuery($q); //We can use that here, because the order_number is free to set, the invoice_number must often follow special rules $c = $db->loadResult(); $c = $c + (int)VM_ORDER_OFFSET; if(!class_exists('vmCrypt')) require(VMPATH_ADMIN.DS.'helpers'.DS.'vmcrypt.php'); $str = vmCrypt::getHumanToken(VmConfig::get('randOrderNr',4)).'0'.$c; return $str; } /** * Generate a unique ordernumber. This is done in a similar way as VM1.1.x, although * the reason for this is unclear to me :-S * @deprecated * @param integer $uid The user ID. Defaults to 0 for guests * @return string A unique ordernumber */ static public function generateOrderNumber($uid = 0,$length=4, $virtuemart_vendor_id=1) { $db = JFactory::getDBO(); $q = 'SELECT COUNT(1) FROM #__virtuemart_orders WHERE `virtuemart_vendor_id`="'.$virtuemart_vendor_id.'"'; $db->setQuery($q); //We can use that here, because the order_number is free to set, the invoice_number must often follow special rules $count = $db->loadResult(); $count = $count + (int)VM_ORDER_OFFSET; if(!class_exists('vmCrypt')) require(VMPATH_ADMIN.DS.'helpers'.DS.'vmcrypt.php'); $data = vmCrypt::getHumanToken($length).'0'.$count; return $data; } /* * returns true if an invoice number has been created * returns false if an invoice number has not been created due to some configuration parameters */ function createInvoiceNumber($orderDetails, &$invoiceNumber){ $orderDetails = (array)$orderDetails; $db = JFactory::getDBO(); if(!isset($orderDetails['virtuemart_order_id'])){ vmWarn('createInvoiceNumber $orderDetails has no virtuemart_order_id ',$orderDetails); vmdebug('createInvoiceNumber $orderDetails has no virtuemart_order_id ',$orderDetails); } $q = 'SELECT * FROM `#__virtuemart_invoices` WHERE `virtuemart_order_id`= "'.$orderDetails['virtuemart_order_id'].'" '; // AND `order_status` = "'.$orderDetails->order_status.'" '; $db->setQuery($q); $result = $db->loadAssoc(); if (!class_exists('ShopFunctions')) require(VMPATH_ADMIN . DS . 'helpers' . DS . 'shopfunctions.php'); if(!$result or empty($result['invoice_number']) ){ $data['virtuemart_order_id'] = $orderDetails['virtuemart_order_id']; $data['order_status'] = $orderDetails['order_status']; $data['virtuemart_vendor_id'] = $orderDetails['virtuemart_vendor_id']; JPluginHelper::importPlugin('vmshopper'); JPluginHelper::importPlugin('vmpayment'); $dispatcher = JDispatcher::getInstance(); // plugin returns invoice number, 0 if it does not want an invoice number to be created by Vm $plg_datas = $dispatcher->trigger('plgVmOnUserInvoice',array($orderDetails,&$data)); if(!isset($data['invoice_number']) ) { // check the default configuration $orderstatusForInvoice = VmConfig::get('inv_os',array('C')); if(!is_array($orderstatusForInvoice)) $orderstatusForInvoice = array($orderstatusForInvoice); //for backward compatibility 2.0.8e $pdfInvoice = (int)VmConfig::get('pdf_invoice', 0); // backwards compatible $force_create_invoice=vRequest::getCmd('create_invoice', -1); // florian : added if pdf invoice are enabled if ( in_array($orderDetails['order_status'],$orderstatusForInvoice) or $pdfInvoice==1 or $force_create_invoice==$orderDetails['order_create_invoice_pass'] ){ $q = 'SELECT COUNT(1) FROM `#__virtuemart_invoices` WHERE `virtuemart_vendor_id`= "'.$orderDetails['virtuemart_vendor_id'].'" '; // AND `order_status` = "'.$orderDetails->order_status.'" '; $db->setQuery($q); $count = $db->loadResult()+1; if(empty($data['invoice_number'])) { $date = date("Y-m-d"); if(!class_exists('vmCrypt')) require(VMPATH_ADMIN.DS.'helpers'.DS.'vmcrypt.php'); $data['invoice_number'] = str_replace('-', '', substr($date,2,8)).vmCrypt::getHumanToken(4).'0'.$count; } } else { return false; } } $table = $this->getTable('invoices'); $table->bindChecknStore($data); $invoiceNumber= array($table->invoice_number,$table->created_on); } elseif (ShopFunctions::InvoiceNumberReserved($result['invoice_number']) ) { $invoiceNumber = array($result['invoice_number'],$result['created_on']); return true; } else { $invoiceNumber = array($result['invoice_number'],$result['created_on']); } return true; } /* * @author Valérie Isaksen */ function getInvoiceNumber($virtuemart_order_id){ $db = JFactory::getDBO(); $q = 'SELECT `invoice_number` FROM `#__virtuemart_invoices` WHERE `virtuemart_order_id`= "'.$virtuemart_order_id.'" '; $db->setQuery($q); return $db->loadresult(); } /** * Notifies the customer that the Order Status has been changed * * @author Christopher Roussel, Valérie Isaksen, Max Milbers * */ public function notifyCustomer($virtuemart_order_id, $newOrderData = 0 ) { if (isset($newOrderData['customer_notified']) && $newOrderData['customer_notified']==0) { return true; } if(!class_exists('shopFunctionsF')) require(VMPATH_SITE.DS.'helpers'.DS.'shopfunctionsf.php'); //Important, the data of the order update mails, payments and invoice should //always be in the database, so using getOrder is the right method $orderModel=VmModel::getModel('orders'); $order = $orderModel->getOrder($virtuemart_order_id); $payment_name = $shipment_name=''; if (!class_exists('vmPSPlugin')) require(VMPATH_PLUGINLIBS . DS . 'vmpsplugin.php'); JPluginHelper::importPlugin('vmshipment'); JPluginHelper::importPlugin('vmpayment'); $dispatcher = JDispatcher::getInstance(); $returnValues = $dispatcher->trigger('plgVmOnShowOrderFEShipment',array( $order['details']['BT']->virtuemart_order_id, $order['details']['BT']->virtuemart_shipmentmethod_id, &$shipment_name)); $returnValues = $dispatcher->trigger('plgVmOnShowOrderFEPayment',array( $order['details']['BT']->virtuemart_order_id, $order['details']['BT']->virtuemart_paymentmethod_id, &$payment_name)); $order['shipmentName']=$shipment_name; $order['paymentName']=$payment_name; if($newOrderData!=0){ //We do not really need that $vars['newOrderData'] = (array)$newOrderData; } $vars['orderDetails']=$order; //$vars['includeComments'] = vRequest::getVar('customer_notified', array()); //I think this is misleading, I think it should always ask for example $vars['newOrderData']['doVendor'] directly //Using this function garantue us that it is always there. If the vendor should be informed should be done by the plugins //We may add later something to the method, defining this better $vars['url'] = 'url'; if(!isset($newOrderData['doVendor'])) $vars['doVendor'] = false; else $vars['doVendor'] = $newOrderData['doVendor']; $virtuemart_vendor_id = $order['details']['BT']->virtuemart_vendor_id; $vendorModel = VmModel::getModel('vendor'); $vendor = $vendorModel->getVendor($virtuemart_vendor_id); $vars['vendor'] = $vendor; $vendorEmail = $vendorModel->getVendorEmail($virtuemart_vendor_id); $vars['vendorEmail'] = $vendorEmail; // florian : added if pdf invoice are enabled $invoiceNumberDate = array(); if ($orderModel->createInvoiceNumber($order['details']['BT'], $invoiceNumberDate )) { $orderstatusForInvoice = VmConfig::get('inv_os',array('C')); if(!is_array($orderstatusForInvoice)) $orderstatusForInvoice = array($orderstatusForInvoice); // for backward compatibility 2.0.8e $pdfInvoice = (int)VmConfig::get('pdf_invoice', 0); // backwards compatible $force_create_invoice=vRequest::getInt('create_invoice', -1); //TODO we need an array of orderstatus if ( (in_array($order['details']['BT']->order_status,$orderstatusForInvoice)) or $pdfInvoice==1 or $force_create_invoice==1 ){ if (!shopFunctions::InvoiceNumberReserved($invoiceNumberDate[0])) { if(!class_exists('VirtueMartControllerInvoice')) require( VMPATH_SITE.DS.'controllers'.DS.'invoice.php' ); $controller = new VirtueMartControllerInvoice( array( 'model_path' => VMPATH_SITE.DS.'models', 'view_path' => VMPATH_SITE.DS.'views' )); $vars['mediaToSend'][] = $controller->getInvoicePDF($order); } } } // Send the email $res = shopFunctionsF::renderMail('invoice', $order['details']['BT']->email, $vars, null,$vars['doVendor'],$this->useDefaultEmailOrderStatus); if(is_object($res) or !$res){ $string = 'COM_VIRTUEMART_NOTIFY_CUSTOMER_ERR_SEND'; vmdebug('notifyCustomer function shopFunctionsF::renderMail throws JException'); $res = 0; } //We need this, to prevent that a false alert is thrown. else if ($res and $res!=-1) { $string = 'COM_VIRTUEMART_NOTIFY_CUSTOMER_SEND_MSG'; } if($res!=-1){ vmInfo( vmText::_($string,false).' '.$order['details']['BT']->first_name.' '.$order['details']['BT']->last_name. ', '.$order['details']['BT']->email); } //quicknDirty to prevent that an email is sent twice $app = JFactory::getApplication(); if($app->isSite()){ if (!class_exists('VirtueMartCart')) require(VMPATH_SITE . DS . 'helpers' . DS . 'cart.php'); $cart = VirtueMartCart::getCart(); $cart->customer_notified = true; } return true; } /** * Retrieve the details for an order line item. * * @author RickG * @param string $orderId Order id number * @param string $orderLineId Order line item number * @return object Object containing the order item details. */ function getOrderLineDetails($orderId, $orderLineId) { $table = $this->getTable('order_items'); if ($table->load((int)$orderLineId)) { return $table; } else { $table->reset(); $table->virtuemart_order_id = $orderId; return $table; } } /** * Save an order line item. * * @author RickG * @return boolean True of remove was successful, false otherwise */ function saveOrderLineItem($data) { $table = $this->getTable('order_items'); //Done in the table already if (!class_exists('vmPSPlugin')) require(VMPATH_PLUGINLIBS . DS . 'vmpsplugin.php'); JPluginHelper::importPlugin('vmshipment'); $_dispatcher = JDispatcher::getInstance(); $_returnValues = $_dispatcher->trigger('plgVmOnUpdateOrderLineShipment',array( $data)); foreach ($_returnValues as $_retVal) { if ($_retVal === false) { // Stop as soon as the first active plugin returned a failure status return; } } if (!class_exists('vmPSPlugin')) require(VMPATH_PLUGINLIBS . DS . 'vmpsplugin.php'); JPluginHelper::importPlugin('vmpayment'); $_returnValues = $_dispatcher->trigger('plgVmOnUpdateOrderLinePayment',array( $data)); foreach ($_returnValues as $_retVal) { if ($_retVal === false) { // Stop as soon as the first active plugin returned a failure status return; } } $table->bindChecknStore($data); return true; } /* *remove product from order item table *@var $virtuemart_order_id Order to clear */ function removeOrderItems ($virtuemart_order_id){ $q ='DELETE from `#__virtuemart_order_items` WHERE `virtuemart_order_id` = ' .(int) $virtuemart_order_id; $db = JFactory::getDBO(); $db->setQuery($q); if ($db->execute() === false) { vmError($db->getError()); return false; } return true; } /** * Remove an order line item. * * @author RickG * @param string $orderLineId Order line item number * @return boolean True of remove was successful, false otherwise */ function removeOrderLineItem($orderLineId) { $item = $this->getTable('order_items'); if (!$item->load($orderLineId)) { return false; } $this->handleStockAfterStatusChangedPerProduct('X', $item->order_status, $item,$item->product_quantity); //TODO Why should the stock change, when the order is deleted? Paypal? Valerie? if ($item->delete($orderLineId)) { return true; } else { return false; } } /** * Delete all record ids selected * * @author Max Milbers * @author Patrick Kohl * @return boolean True is the delete was successful, false otherwise. */ public function remove($ids) { $table = $this->getTable($this->_maintablename); foreach($ids as $id) { $order = $this->getOrder($id); if(!empty($order['items'])){ foreach($order['items'] as $it){ $this->removeOrderLineItem($it->virtuemart_order_item_id); } } $this->removeOrderItems($id); $q = "DELETE FROM `#__virtuemart_order_histories` WHERE `virtuemart_order_id`=".$id; $this->_db->setQuery($q); $this->_db->execute(); $q = "DELETE FROM `#__virtuemart_order_calc_rules` WHERE `virtuemart_order_id`=".$id; $this->_db->setQuery($q); $this->_db->execute(); // rename invoice number by adding the date, and update the invoice table $this->renameInvoice($id ); if (!$table->delete((int)$id)) { return false; } } return true; } /** Update order head record * * @author Ondřej Spilka * @author Maik Künnemann * @return boolean True is the update was successful, otherwise false. */ public function UpdateOrderHead($virtuemart_order_id, $_orderData) { $orderTable = $this->getTable('orders'); $orderTable->load($virtuemart_order_id); if (!$orderTable->bindChecknStore($_orderData, true)){ return false; } $_userInfoData = array(); if(!class_exists('VirtueMartModelUserfields')) require(VMPATH_ADMIN.DS.'models'.DS.'userfields.php'); $_userFieldsModel = VmModel::getModel('userfields'); //bill to $_userFieldsCart = $_userFieldsModel->getUserFields('account' , array('delimiters'=>true, 'captcha'=>true) , array('username', 'password', 'password2', 'user_is_vendor') ); $_userFieldsBT = $_userFieldsModel->getUserFields('cart' , array('delimiters'=>true, 'captcha'=>true) , array('username', 'password', 'password2', 'user_is_vendor') ); $_userFieldsBT = array_merge((array)$_userFieldsBT,(array)$_userFieldsCart); foreach ($_userFieldsBT as $_fld) { $_name = $_fld->name; if(isset( $_orderData["BT_{$_name}"])){ $_userInfoData[$_name] = $_orderData["BT_{$_name}"]; } } $_userInfoData['virtuemart_order_id'] = $virtuemart_order_id; $_userInfoData['address_type'] = 'BT'; $order_userinfosTable = $this->getTable('order_userinfos'); $order_userinfosTable->load($virtuemart_order_id, 'virtuemart_order_id'," AND address_type='BT'"); if (!$order_userinfosTable->bindChecknStore($_userInfoData, true)){ return false; } //ship to $_userFieldsST = $_userFieldsModel->getUserFields('account' , array('delimiters'=>true, 'captcha'=>true) , array('username', 'password', 'password2', 'user_is_vendor') ); $_userInfoData = array(); foreach ($_userFieldsST as $_fld) { $_name = $_fld->name; if(isset( $_orderData["ST_{$_name}"])){ $_userInfoData[$_name] = $_orderData["ST_{$_name}"]; } } $_userInfoData['virtuemart_order_id'] = $virtuemart_order_id; $_userInfoData['address_type'] = 'ST'; $order_userinfosTable = $this->getTable('order_userinfos'); $order_userinfosTable->load($virtuemart_order_id, 'virtuemart_order_id'," AND address_type='ST'"); if (!$order_userinfosTable->bindChecknStore($_userInfoData, true)){ return false; } $orderModel = VmModel::getModel('orders'); $order = $orderModel->getOrder($virtuemart_order_id); $dispatcher = JDispatcher::getInstance(); if (!class_exists ('CurrencyDisplay')) { require(VMPATH_ADMIN . DS . 'helpers' . DS . 'currencydisplay.php'); } // Update Payment Method if($_orderData['old_virtuemart_paymentmethod_id'] != $_orderData['virtuemart_paymentmethod_id']) { $db = JFactory::getDBO(); $db->setQuery( 'SELECT `payment_element` FROM `#__virtuemart_paymentmethods` , `#__virtuemart_orders` WHERE `#__virtuemart_paymentmethods`.`virtuemart_paymentmethod_id` = `#__virtuemart_orders`.`virtuemart_paymentmethod_id` AND `virtuemart_order_id` = ' . $virtuemart_order_id ); $paymentTable = '#__virtuemart_payment_plg_'. $db->loadResult(); $db->setQuery("DELETE from `". $paymentTable ."` WHERE `virtuemart_order_id` = " . $virtuemart_order_id); if ($db->execute() === false) { vmError($db->getError()); return false; } else { JPluginHelper::importPlugin('vmpayment'); } } // Update Shipment Method if($_orderData['old_virtuemart_shipmentmethod_id'] != $_orderData['virtuemart_shipmentmethod_id']) { $db->setQuery( 'SELECT `shipment_element` FROM `#__virtuemart_shipmentmethods` , `#__virtuemart_orders` WHERE `#__virtuemart_shipmentmethods`.`virtuemart_shipmentmethod_id` = `#__virtuemart_orders`.`virtuemart_shipmentmethod_id` AND `virtuemart_order_id` = ' . $virtuemart_order_id ); $shipmentTable = '#__virtuemart_shipment_plg_'. $db->loadResult(); $db->setQuery("DELETE from `". $shipmentTable ."` WHERE `virtuemart_order_id` = " . $virtuemart_order_id); if ($db->execute() === false) { vmError($db->getError()); return false; } else { JPluginHelper::importPlugin('vmshipment'); } } if (!class_exists('VirtueMartCart')) require(VMPATH_SITE . DS . 'helpers' . DS . 'cart.php'); $cart = VirtueMartCart::getCart(); $cart->virtuemart_paymentmethod_id = $_orderData['virtuemart_paymentmethod_id']; $cart->virtuemart_shipmentmethod_id = $_orderData['virtuemart_shipmentmethod_id']; $order['order_status'] = $order['details']['BT']->order_status; $order['customer_notified'] = 0; $order['comments'] = ''; $returnValues = $dispatcher->trigger('plgVmConfirmedOrder', array($cart, $order)); return true; } /** Create empty order head record from admin only * * @author Ondřej Spilka * @return ID of the newly created order */ public function CreateOrderHead() { $usrid = 0; $_orderData = new stdClass(); $_orderData->virtuemart_order_id = null; $_orderData->virtuemart_user_id = 0; $_orderData->virtuemart_vendor_id = 1; //TODO $_orderData->order_total = 0; $_orderData->order_salesPrice = 0; $_orderData->order_billTaxAmount = 0; $_orderData->order_billDiscountAmount = 0; $_orderData->order_discountAmount = 0; $_orderData->order_subtotal = 0; $_orderData->order_tax = 0; $_orderData->order_shipment = 0; $_orderData->order_shipment_tax = 0; $_orderData->order_payment = 0; $_orderData->order_payment_tax = 0; $_orderData->order_discount = 0; $_orderData->order_status = 'P'; $_orderData->order_currency = $this->getVendorCurrencyId($_orderData->virtuemart_vendor_id); $_orderData->virtuemart_paymentmethod_id = vRequest::getInt('virtuemart_paymentmethod_id'); $_orderData->virtuemart_shipmentmethod_id = vRequest::getInt('virtuemart_shipmentmethod_id'); //$_orderData->customer_note = ''; $_orderData->ip_address = $_SERVER['REMOTE_ADDR']; $_orderData->order_number =''; JPluginHelper::importPlugin('vmshopper'); $dispatcher = JDispatcher::getInstance(); $_orderData->order_number = $this->genStdOrderNumber($_orderData->virtuemart_vendor_id); $_orderData->order_pass = $this->genStdOrderPass(); $_orderData->order_create_invoice_pass = $this->genStdCreateInvoicePass(); $orderTable = $this->getTable('orders'); $orderTable -> bindChecknStore($_orderData); $db = JFactory::getDBO(); $_orderID = $db->insertid(); $_usr = JFactory::getUser(); if (!$this->_writeUserInfo($_orderID, $_usr, array())) { vmError('Problem writing user info to order'); } $orderModel = VmModel::getModel('orders'); $order= $orderModel->getOrder($_orderID); $dispatcher = JDispatcher::getInstance(); JPluginHelper::importPlugin('vmcustom'); JPluginHelper::importPlugin('vmshipment'); JPluginHelper::importPlugin('vmpayment'); if (!class_exists('VirtueMartCart')) require(VMPATH_SITE . DS . 'helpers' . DS . 'cart.php'); $cart = VirtueMartCart::getCart(); $returnValues = $dispatcher->trigger('plgVmConfirmedOrder', array($cart, $order)); return $_orderID; } /** Rename Invoice (when an order is deleted) * * @author Valérie Isaksen * @author Max Milbers * @param $order_id Id of the order * @return boolean true if deleted successful, false if there was a problem */ function renameInvoice($order_id ) { $table = $this->getTable('invoices'); $table->load($order_id,'virtuemart_order_id'); if(empty($table->invoice_number)){ return false; } if (!class_exists ('shopFunctionsF')) require(VMPATH_SITE . DS . 'helpers' . DS . 'shopfunctionsf.php'); // rename invoice pdf file $path = shopFunctions::getInvoicePath(VmConfig::get('forSale_path',0)); $name = shopFunctionsF::getInvoiceName($table->invoice_number); $invoice_name_src = $path.DS.$name.'.pdf'; if(!file_exists($invoice_name_src)){ // may be it was already deleted when changing order items $data['invoice_number'] = $table->invoice_number; //$data['invoice_number'] = $data['invoice_number'].' not found.'; } else { $date = date("Ymd"); // We change the invoice number in the invoice table only. The order's invoice number is not modified! $data['invoice_number'] = $table->invoice_number.'_'.$date.'_'.$table->order_status; // We the sanitized file name as the invoice number might contain strange characters like 2015/01. $invoice_name_dst = $path.DS.$name.'_deprecated'.$date.'_'.$table->order_status.'.pdf'; if(!class_exists('JFile')) require(VMPATH_LIBS.DS.'joomla'.DS.'filesystem'.DS.'file.php'); if (!JFile::move($invoice_name_src, $invoice_name_dst)) { vmError ('Could not rename Invoice '.$invoice_name_src.' to '. $invoice_name_dst ); } } $table = $this->getTable('invoices'); $table->bindChecknStore($data); return true; } /** Delete Invoice when an item is updated * * @author Valérie Isaksen * @param $order_id Id of the order * @return boolean true if deleted successful, false if there was a problem */ function deleteInvoice($order_id ) { return $this->renameInvoice($order_id); } } // No closing tag