- Posts: 18
- Thank you received: 0
Change Price Based on Cost Prive + Margin Fields
11 years 2 months ago #207081
by Geoffc
Change Price Based on Cost Prive + Margin Fields was created by Geoffc
-- HikaShop version -- : Business: 2.4.0
-- Joomla version -- : 3.4.2
Hi,
Is there a way to update the price (before tax) in the back end based on the value of custom fields. For example a custom field for "cost price" and a custom field for "margin" and I want the price before tax to be the cost price + margin when I save the item in the product editor in background. I am not talking about bulk changes or bulk actions, just editing the cost price and profit margin for a product in the backend product editor and having the price change.
This is a fundamental part of a retail business with multiple suppliers who are often changing their cost prices and I can not find a simple way to do it in HikaShop.
Thanks,
Geoff
-- Joomla version -- : 3.4.2
Hi,
Is there a way to update the price (before tax) in the back end based on the value of custom fields. For example a custom field for "cost price" and a custom field for "margin" and I want the price before tax to be the cost price + margin when I save the item in the product editor in background. I am not talking about bulk changes or bulk actions, just editing the cost price and profit margin for a product in the backend product editor and having the price change.
This is a fundamental part of a retail business with multiple suppliers who are often changing their cost prices and I can not find a simple way to do it in HikaShop.
Thanks,
Geoff
Please Log in or Create an account to join the conversation.
11 years 2 months ago - 11 years 2 months ago #207083
by nicolas
Replied by nicolas on topic Change Price Based on Cost Prive + Margin Fields
Hi,
You can do that with a mass action.
Mass actions can be used for bulk operations, but they can also be used on specific actions.
So for example, if you have two custom fields with the column names costprice and margin, you could create such mass action:
take.ms/egFnL
Please replace the function "updateValuesSecure()" by:
in "administrator/components/com_hikashop/classes/massaction.php"
Then, the calculation would be done automatically for you each time you save a product.
You can do that with a mass action.
Mass actions can be used for bulk operations, but they can also be used on specific actions.
So for example, if you have two custom fields with the column names costprice and margin, you could create such mass action:
take.ms/egFnL
Please replace the function "updateValuesSecure()" by:
Code:
function updateValuesSecure(&$action,&$possibleTables = array(),&$queryTables = array()){
$db = JFactory::getDBO();
$app = JFactory::getApplication();
$tableType = explode('_',$action['type']);
// Special cases
if(preg_match('/order_product/',$action['type'])) $tableType = array('order_product');
if($tableType[0] == 'joomla') $queryTables[] = $tableType[0].'_'.$tableType[1];
else $queryTables[] = $tableType[0];
// check if the column type match with the action type
$mainFields = array();
foreach($possibleTables as $possibleTable){
if(!is_string($possibleTable)) continue;
if(version_compare(JVERSION,'3.0','<')){
if(preg_match('/joomla_/',$possibleTable)){
$fieldsTable = $db->getTableFields('#__'.str_replace('joomla_','',$possibleTable));
$fields = reset($fieldsTable);
// foreach($fields as $key => $field){
// $fields['joomla_'.$key] = $fields[$key];
// unset($fields[$key]);
// }
$fieldsTable = $fields;
}
else{
$fieldsTable = $db->getTableFields('#__hikashop_'.$possibleTable);
$fields = reset($fieldsTable);
}
} else {
if(preg_match('/joomla_/',$possibleTable)){
$fields = $db->getTableColumns('#__'.str_replace('joomla_','',$possibleTable));
// foreach($fields as $key => $field){
// $fields['joomla_'.$key] = $fields[$key];
// unset($fields[$key]);
// }
}
else $fields = $db->getTableColumns('#__hikashop_'.$possibleTable);
}
$mainFields = array_merge($mainFields,$fields);
}
foreach($mainFields as $key => $field){
$field = str_replace(',','',$field);
if($key == $action['type']){
switch($action['operation']){
case 'int':
if(in_array($field,array('boolean'))){
$app->enqueueMessage(JText::sprintf( 'WRONG_COLUMN_TYPE', $field));
$queryTables = '';
}
break;
case 'float':
if(in_array($field,array('int','boolean'))){
$app->enqueueMessage(JText::sprintf( 'WRONG_COLUMN_TYPE', $field));
$queryTables = '';
}
break;
case 'string':
if(!in_array($field,array('varchar','text','char'))){
$app->enqueueMessage(JText::sprintf( 'WRONG_COLUMN_TYPE', $field));
$queryTables = '';
}
break;
}
}
}
if($action['operation'] == 'int'){$value = (int)$action['value'];}
elseif($action['operation'] == 'float'){$value = (float)$action['value'];}
elseif($action['operation'] == 'string'){$value = $db->quote($action['value']);}
elseif($action['operation'] == 'operation'){
// Regex
$symbols = array('%','+','-','/','*','(',')');
$string = str_replace($symbols,'||',$action['value']);
$entry = array();
$entries = explode('||',$string);
foreach($entries as $entry){
$data = explode('.',$entry);
if(!in_array($data[0],$possibleTables))
continue;
$strings[]['table'] = $data[0];
$strings[]['column'] = $data[1];
}
$type = 'table';
if(!empty($mainFields)){
foreach($strings as $string){
if(isset($string['table']) && $type == 'table'){
if(!in_array($string['table'], $possibleTables)){
$app->enqueueMessage(JText::sprintf('TABLE_NOT_EXIST',$string['table']));
$queryTables = '';
continue;
}
if(!in_array($string, $queryTables)){
$queryTables[] = 'hk_'.$string;
}
$type = 'column';
}elseif(isset($string['column']) && $type == 'column'){
$colKey = array();
foreach($mainFields as $key => $field){
$colKey[] = $key;
}
if(!in_array($string['column'], $colKey)){
$app->enqueueMessage(JText::sprintf('COLUMN_NOT_EXIST',$string['column']));
$queryTables = '';
}
$type = 'table';
}
}
}
// if !number
if(!preg_match('/^(?:\d+|\d*\.\d+)$/',$action['value'])){
// if operation (ex: +5, -2) increment the value in the type selected table
if(in_array($action['value'][0], array('+','-'))){
$value = $action['type'].$action['value'];
}
// else add the prefix
else{
$value = $action['value'];
// Group the available tables in only one entry
$tables = array();
foreach($strings as $string){
if(isset($string['table'])){
$tables[$string['table']] = $string['table'];
}
}
// add the prefix
foreach($tables as $table){
$value = str_replace($table.'.','hk_'.$table.'.',$value);
}
}
$value = strip_tags($value);
}
// default value
else{
$value = $db->quote($action['value']);
}
}else{$value = '';}
return $value;
}
Then, the calculation would be done automatically for you each time you save a product.
Last edit: 11 years 2 months ago by Xavier.
Please Log in or Create an account to join the conversation.
Time to create page: 0.197 seconds