You may pay someone to create your store, or you visit our seminar and become a professional yourself with the silver certification
public function updateStockInDB ($product, $amount, $signInStock, $signOrderedStock) {
// Get the currently logged-in user
$user = Factory::getUser();
$userId = $user->id;
$username = $user->username;
// Log the start of the stock update process
JLog::addLogger(
array(
'text_file' => 'com_virtuemart.log.php', // Name of the log file
'text_entry_format' => '{DATETIME} {PRIORITY} {CATEGORY} {MESSAGE}' // Log entry format
),
JLog::ALL, // Log all levels of messages
array('com_virtuemart') // Categories to log
);
JLog::add(
sprintf(
'User %s (ID: %d) is attempting to update stock for product ID %d with amount %f, signInStock %s, signOrderedStock %s',
$username, $userId, $product->virtuemart_product_id, $amount, $signInStock, $signOrderedStock
),
Log::INFO,
'com_virtuemart'
);
vmdebug('updateStockInDB start ', $signInStock, $signOrderedStock);
$validFields = array('=', '+', '-');
if (!in_array ($signInStock, $validFields)) {
return FALSE;
}
if (!in_array ($signOrderedStock, $validFields)) {
return FALSE;
}
$lproduct = $this->getProductSingle($product->virtuemart_product_id);
if($lproduct->shared_stock){
$productId = $lproduct->product_parent_id;
} else {
$productId = $product->virtuemart_product_id;
}
$amount = (float)$amount;
$update = array();
if ($signInStock != '=' or $signOrderedStock != '=') {
if ($signInStock != '=') {
$update[] = '`product_in_stock` = `product_in_stock` ' . $signInStock . $amount;
if (strpos ($signInStock, '+') !== FALSE) {
$signInStock = '-';
}
else {
$signInStock = '+';
}
$update[] = '`product_sales` = `product_sales` ' . $signInStock . $amount;
}
if ($signOrderedStock != '=') {
$update[] = '`product_ordered` = `product_ordered` ' . $signOrderedStock . $amount;
}
$q = 'UPDATE `#__virtuemart_products` SET ' . implode (", ", $update) . ' WHERE `virtuemart_product_id` = ' . (int)$productId;
$db = JFactory::getDbo();
$db->setQuery ($q);
$db->execute ();
//vmdebug('updateStockInDB executed query ', $q);
//The low on stock notification comes now, when the people ordered.
//You need to know that the stock is going low before you actually sent the wares, because then you ususally know it already yourself
//note by Max Milbers
if ($signInStock == '+' or $signOrderedStock == '+') {
$q = 'SELECT (IFNULL(`product_in_stock`,"0")-IFNULL(`product_ordered`,"0")) < IFNULL(`low_stock_notification`,"0") '
. 'FROM `#__virtuemart_products` '
. 'WHERE `virtuemart_product_id` = ' . (int)$productId;
$db->setQuery ( $q );
//vmdebug('Check for low stock ',$q);
if ($db->loadResult () == 1) {
vmdebug('Check for low stock said therre is a low stock ');
$this->lowStockWarningEmail( $productId) ;
}
}
}
}
public function store (&$data) {
vRequest::vmCheckToken();
if(!vmAccess::manager('product.edit')){
vmError('You are not a vendor or administrator, storing of product cancelled');
return FALSE;
}
if ($data and is_object($data)) {
$data = get_object_vars($data);
}
$isChild = FALSE;
if(!empty($data['isChild'])) $isChild = $data['isChild'];
if (isset($data['intnotes'])) {
$data['intnotes'] = trim ($data['intnotes']);
}
// Setup some place holders
$product_data = $this->getTable ('products');
$data['new'] = '1';
if(!empty($data['virtuemart_product_id'])){
$product_data -> load($data['virtuemart_product_id']);
$data['new'] = '0';
}
if( (empty($data['virtuemart_product_id']) or empty($product_data->virtuemart_product_id)) and !vmAccess::manager('product.create')){
vmWarn('Insufficient permission to create product');
return false;
}
$vendorId = vmAccess::isSuperVendor();
$vM = VmModel::getModel('vendor');
$ven = $vM->getVendor($vendorId);
if(VmConfig::get('multix','none')!='none' and !vmAccess::manager('core')){
if($ven->max_products!=-1){
$this->setGetCount (true);
//$this->setDebugSql(true);
parent::exeSortSearchListQuery(2,'virtuemart_product_id',' FROM #__virtuemart_products',' WHERE ( `virtuemart_vendor_id` = "'.$vendorId.'" AND `published`="1") ');
$this->setGetCount (false);
if($ven->max_products<($this->_total+1)){
vmWarn('You are not allowed to create more than '.$ven->max_products.' products');
return false;
}
}
}
if(!vmAccess::manager('product.edit.state')){
if( (empty($data['virtuemart_product_id']) or empty($product_data->virtuemart_product_id))){
$data['published'] = 0;
} else {
$data['published'] = $product_data->published;
}
}
//Set the decimals like product packaging
foreach(self::$decimals as $decimal){
if (array_key_exists ($decimal, $data)) {
if(!empty($data[$decimal])){
$data[$decimal] = str_replace(',','.',$data[$decimal]);
//vmdebug('Store product '.$data['virtuemart_product_id'].', set $decimal '.$decimal.' = '.$data[$decimal]);
} else {
$data[$decimal] = null;
$product_data->{$decimal} = null;
//vmdebug('Store product '.$data['virtuemart_product_id'].', set $decimal '.$decimal.' = null');
}
}
}
if($ven->force_product_pattern>0 and empty($data['product_parent_id']) and $ven->force_product_pattern!=$data['virtuemart_product_id']){
$data['product_parent_id'] = $ven->force_product_pattern;
}
//We prevent with this line, that someone is storing a product as its own parent
if(!empty($data['product_parent_id']) and !empty($data['virtuemart_product_id']) and $data['product_parent_id'] == $data['virtuemart_product_id']){
$data['product_parent_id'] = 0;
}
$product_data->has_prices = (isset($data['mprices']['product_price']) and count($data['mprices']['product_price']) > 0)? 1:0;
if (!$isChild) {
$product_data->has_shoppergroups = empty($data['virtuemart_shoppergroup_id'])? 0:1;
$product_data->has_manufacturers = empty($data['virtuemart_manufacturer_id'])? 0:1;
//$product_data->has_medias = !empty($data['virtuemart_media_id']) or !empty($data['media']['virtuemart_media_id'])? 1:0;
$product_data->has_categories = empty($data['categories'])? 0:1;
if(!empty($data['virtuemart_media_id']) or !empty($data['media']['virtuemart_media_id']) or !empty($data['media']['media_action'])){
$product_data->has_medias = 1;
} else {
$product_data->has_medias = 0;
}
}
vDispatcher::importVMPlugins('vmcustom');
vDispatcher::trigger('plgVmBeforeStoreProduct',array(&$data, &$product_data));
$stored = $product_data->bindChecknStore($data, false);
if(!$stored ){
vmError('You are not an administrator or the correct vendor, storing of product cancelled');
vmdebug('You are not an administrator or the correct vendor, storing of product cancelled', $data, $product_data->loadFieldValues());
return FALSE;
}
$this->_id = $data['virtuemart_product_id'] = (int)$product_data->virtuemart_product_id;
if (empty($this->_id)) {
vmError('Product not stored, no id');
return FALSE;
}
//We may need to change this, the reason it is not in the other list of commands for parents
if (!$isChild) {
$modelCustomfields = VmModel::getModel ('Customfields');
$modelCustomfields->storeProductCustomfields ('product', $data, $product_data->virtuemart_product_id);
}
// Get old IDS
$old_price_ids = $this->loadProductPrices($this->_id,array(0),false);
if (isset($data['mprices']['product_price']) and count($data['mprices']['product_price']) > 0){
foreach($data['mprices']['product_price'] as $k => $product_price){
$pricesToStore = array();
$pricesToStore['virtuemart_product_id'] = $this->_id;
$pricesToStore['virtuemart_product_price_id'] = (int)$data['mprices']['virtuemart_product_price_id'][$k];
if (!$isChild){
//$pricesToStore['basePrice'] = $data['mprices']['basePrice'][$k];
$pricesToStore['product_override_price'] = $data['mprices']['product_override_price'][$k];
$pricesToStore['override'] = isset($data['mprices']['override'][$k])?(int)$data['mprices']['override'][$k]:0;
$pricesToStore['virtuemart_shoppergroup_id'] = (int)$data['mprices']['virtuemart_shoppergroup_id'][$k];
$pricesToStore['product_tax_id'] = !empty($data['mprices']['product_tax_id'][$k])? (int)$data['mprices']['product_tax_id'][$k]:0;
$pricesToStore['product_discount_id'] = !empty($data['mprices']['product_discount_id'][$k])? (int)$data['mprices']['product_discount_id'][$k]:0;
$pricesToStore['product_currency'] = !empty($data['mprices']['product_currency'][$k])? (int)$data['mprices']['product_currency'][$k] : $ven->vendor_currency;
$pricesToStore['product_price_publish_up'] = !empty($data['mprices']['product_price_publish_up'][$k])? $data['mprices']['product_price_publish_up'][$k]:0;
$pricesToStore['product_price_publish_down'] = !empty($data['mprices']['product_price_publish_down'][$k])? $data['mprices']['product_price_publish_down'][$k]:0;
$pricesToStore['price_quantity_start'] = !empty($data['mprices']['price_quantity_start'][$k])? (int)$data['mprices']['price_quantity_start'][$k]:0;
$pricesToStore['price_quantity_end'] = !empty($data['mprices']['price_quantity_end'][$k])? (int)$data['mprices']['price_quantity_end'][$k]:0;
}
if (!$isChild and isset($data['mprices']['use_desired_price'][$k]) and $data['mprices']['use_desired_price'][$k] == "1") {
$calculator = calculationHelper::getInstance ();
if(isset($data['mprices']['salesPrice'][$k])){
$data['mprices']['salesPrice'][$k] = str_replace(array(',',' '),array('.',''),$data['mprices']['salesPrice'][$k]);
}
$pricesToStore['salesPrice'] = $data['mprices']['salesPrice'][$k];
$pricesToStore['product_price'] = $data['mprices']['product_price'][$k] = $calculator->calculateCostprice ($this->_id, $pricesToStore);
unset($data['mprices']['use_desired_price'][$k]);
} else {
if(isset($data['mprices']['product_price'][$k]) ){
$pricesToStore['product_price'] = $data['mprices']['product_price'][$k];
}
}
if ($isChild) $childPrices = $this->loadProductPrices($this->_id,array(0),false);
if ((isset($pricesToStore['product_price']) and $pricesToStore['product_price']!='' and $pricesToStore['product_price']!=='0') || (isset($childPrices) and is_array($childPrices) and count($childPrices)>1)) {
if ($isChild) {
if(is_array($old_price_ids) and count($old_price_ids)>1){
//We do not touch multiple child prices. Because in the parent list, we see no price, the gui is
//missing to reflect the information properly.
$pricesToStore = false;
$old_price_ids = array();
} else {
unset($data['mprices']['product_override_price'][$k]);
unset($pricesToStore['product_override_price']);
unset($data['mprices']['override'][$k]);
unset($pricesToStore['override']);
}
}
if($pricesToStore){
$toUnset = array();
if (!empty($old_price_ids) and count($old_price_ids) ) {
foreach($old_price_ids as $key => $oldprice){
if($pricesToStore['virtuemart_product_price_id'] == $oldprice['virtuemart_product_price_id'] ){
$pricesToStore = array_merge($oldprice,$pricesToStore);
$toUnset[] = $key;
}
}
}
$this->updateXrefAndChildTables ($pricesToStore, 'product_prices',$isChild);
foreach($toUnset as $key){
unset( $old_price_ids[ $key ] );
}
}
}
}
}
if (!empty($old_price_ids) and count($old_price_ids) ) {
$oldPriceIdsSql = array();
foreach($old_price_ids as $oldPride){
$oldPriceIdsSql[] = $oldPride['virtuemart_product_price_id'];
}
$db = JFactory::getDbo();
// delete old unused Prices
$db->setQuery( 'DELETE FROM `#__virtuemart_product_prices` WHERE `virtuemart_product_price_id` in ("'.implode('","', $oldPriceIdsSql ).'") ');
$err = '';
try {
$db->execute();
} catch(Exception $e) {
$err = $e->getMessage();
}
if(!empty($err)){
vmWarn('In store prodcut, deleting old price error',$err);
}
}
if (!empty($data['childs'])) {
foreach ($data['childs'] as $productId => $child) {
if(empty($productId)) continue;
if($productId!=$data['virtuemart_product_id']){
if(empty($child['product_parent_id'])) $child['product_parent_id'] = $data['virtuemart_product_id'];
$child['virtuemart_product_id'] = $productId;
if(!empty($child['product_parent_id']) and $child['product_parent_id'] == $child['virtuemart_product_id']){
$child['product_parent_id'] = 0;
}
$child['isChild'] = $this->_id;
$this->store ($child);
}
}
}
if (!$isChild) {
$data = $this->updateXrefAndChildTables ($data, 'product_shoppergroups');
$data = $this->updateXrefAndChildTables ($data, 'product_manufacturers');
$storeCats = false;
if (empty($data['categories']) or (!empty($data['categories'][0]) and $data['categories'][0]!="-2")){
$storeCats = true;
}
if($storeCats){
if (!empty($data['categories']) && count ($data['categories']) > 0) {
if(VmConfig::get('multix','none')!='none' and !vmAccess::manager('managevendors')){
if($ven->max_cats_per_product>=0){
while($ven->max_cats_per_product<count($data['categories'])){
array_pop($data['categories']);
}
}
}
$data['virtuemart_category_id'] = $data['categories'];
} else {
$data['virtuemart_category_id'] = array();
}
$data = $this->updateXrefAndChildTables ($data, 'product_categories');
}
// Update waiting list
if (!empty($data['notify_users'])) {
if ($data['product_in_stock'] > 0 && $data['notify_users'] == '1') {
$waitinglist = VmModel::getModel ('Waitinglist');
$waitinglist->notifyList ($data['virtuemart_product_id']);
}
}
// Process the images
$mediaModel = VmModel::getModel ('Media');
$mediaModel->storeMedia ($data, 'product');
}
$oldStock = $product_data->product_in_stock;
// Attempt to store product data
// Get the currently logged-in user
$user = Factory::getUser();
$userId = $user->id;
$username = $user->username;
// Initialize the logger
Log::addLogger(
array(
'text_file' => 'com_virtuemart.log.php', // Name of the log file
'text_entry_format' => '{DATETIME} {PRIORITY} {CATEGORY} {MESSAGE}' // Log entry format
),
Log::ALL, // Log all levels of messages
array('com_virtuemart') // Categories to log
);
// Check if the stock has changed and log the changes
if ($oldStock != $data['product_in_stock']) {
Log::add(
sprintf(
'User %s (ID: %d) changed stock for product ID %d from %d to %d',
$username, $userId, $product_data->virtuemart_product_id, $oldStock, $data['product_in_stock']
),
Log::INFO,
'com_virtuemart'
);
}
$cache = VmConfig::getCache('com_virtuemart_orderby_manus','callback');
$cache->clean();
vDispatcher::trigger('plgVmAfterStoreProduct',array(&$data, &$product_data));
return $product_data->virtuemart_product_id;
}
Page created in 0.047 seconds with 13 queries.