From abc96b51fa815cd039f340984927e14b768aeead Mon Sep 17 00:00:00 2001 From: Laurent Destailleur <eldy@destailleur.fr> Date: Sun, 16 Feb 2014 23:51:29 +0100 Subject: [PATCH] Enable extrafields for customer order, proposal and invoice lines. This feature was developed for 3.5 but was disabled (hidden) because of a bug not possible to fix enough quickly for 3.5.0 release. --- ChangeLog | 3 + htdocs/comm/propal.php | 2 +- htdocs/commande/fiche.php | 12 ++-- htdocs/compta/facture.php | 4 +- htdocs/core/class/commonobject.class.php | 9 +-- htdocs/core/class/extrafields.class.php | 55 ++++++++++--------- htdocs/core/lib/invoice.lib.php | 3 - htdocs/core/lib/order.lib.php | 3 - htdocs/core/lib/propal.lib.php | 3 - .../core/tpl/freeproductline_create.tpl.php | 9 ++- .../tpl/predefinedproductline_create.tpl.php | 9 ++- 11 files changed, 62 insertions(+), 50 deletions(-) diff --git a/ChangeLog b/ChangeLog index 90b6922d60b..22a2884e5fe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -22,6 +22,9 @@ Fix: Page load not ending when large number of thirdparies. We combo feature that is root cause of problem. Fix: [ bug #1231 ] PDF always generated in interventions Fix: Be sure there is no duplicate default rib. +Fix: Enable extrafields for customer order, proposal and invoice lines. This feature + was developed for 3.5 but was disabled (hidden) because of a bug not possible to + fix enough quickly for 3.5.0 release. ***** ChangeLog for 3.5 compared to 3.4.* ***** For users: diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index ef37fa534bd..48cd8531a69 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -665,7 +665,7 @@ else if (($action == 'addline' || $action == 'addline_predef') && $user->rights- //Extrafields $extrafieldsline = new ExtraFields($db); $extralabelsline =$extrafieldsline->fetch_name_optionals_label($object->table_element_line); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline); + $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline,$predef); //Unset extrafield if (is_array($extralabelsline)) { diff --git a/htdocs/commande/fiche.php b/htdocs/commande/fiche.php index 4c400f37a7f..7a5b74165bb 100644 --- a/htdocs/commande/fiche.php +++ b/htdocs/commande/fiche.php @@ -599,7 +599,7 @@ else if ($action == 'addline' && $user->rights->commande->creer) //Extrafields $extrafieldsline = new ExtraFields($db); $extralabelsline =$extrafieldsline->fetch_name_optionals_label($object->table_element_line); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline); + $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline,$predef); //Unset extrafield if (is_array($extralabelsline)) { @@ -613,12 +613,12 @@ else if ($action == 'addline' && $user->rights->commande->creer) if ((empty($idprod) || GETPOST('usenewaddlineform')) && ($price_ht < 0) && ($qty < 0)) { setEventMessage($langs->trans('ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv('UnitPriceHT'), $langs->transnoentitiesnoconv('Qty')), 'errors'); - $error = true; + $error++; } if (empty($idprod) && GETPOST('type') < 0) { setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Type')), 'errors'); - $error = true; + $error++; } if ((empty($idprod) || GETPOST('usenewaddlineform')) && (!($price_ht >= 0) || $price_ht == '')) // Unit price can be 0 but not '' { @@ -628,12 +628,12 @@ else if ($action == 'addline' && $user->rights->commande->creer) if ($qty == '') { setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Qty')), 'errors'); - $error = true; + $error++; } if (empty($idprod) && empty($product_desc)) { setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Description')), 'errors'); - $error = true; + $error++; } if (! $error && ($qty >= 0) && (! empty($product_desc) || ! empty($idprod))) @@ -2484,7 +2484,7 @@ else } // Create bill and Classify billed - // Note: Even if module invoice is not enabled, we should be able to use button "Classified billed" + // Note: Even if module invoice is not enabled, we should be able to use button "Classified billed" if ($object->statut > 0 && ! $object->billed) { if (! empty($conf->facture->enabled) && $user->rights->facture->creer && empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index a03dddfc515..9a665578c28 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -1157,13 +1157,13 @@ else if (($action == 'addline' || $action == 'addline_predef') && $user->rights- //Extrafields $extrafieldsline = new ExtraFields($db); $extralabelsline =$extrafieldsline->fetch_name_optionals_label($object->table_element_line); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline); + $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline,$predef); //Unset extrafield if (is_array($extralabelsline)) { // Get extra fields foreach ($extralabelsline as $key => $value) { - unset($_POST["options_".$key]); + unset($_POST["options_".$key.$predef]); } } diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 8f45a53e059..2581151a649 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -2236,13 +2236,14 @@ abstract class CommonObject /** * Function to show lines of extrafields with output datas * - * @param object $extrafields extrafield Object + * @param object $extrafields Extrafield Object * @param string $mode Show output (view) or input (edit) for extrafield - * @param array $params optionnal parameters + * @param array $params Optionnal parameters + * @param string $keyprefix Prefix string to add into name and id of field (can be used to avoid duplicate names) * * @return string */ - function showOptionals($extrafields,$mode='view',$params=0) + function showOptionals($extrafields, $mode='view', $params=0, $keyprefix='') { global $_POST; @@ -2310,7 +2311,7 @@ abstract class CommonObject $out .= $extrafields->showOutputField($key,$value); break; case "edit": - $out .= $extrafields->showInputField($key,$value); + $out .= $extrafields->showInputField($key,$value,'',$keyprefix); break; } diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index 8227bfbc0e7..399a87d30af 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -571,14 +571,15 @@ class ExtraFields /** - * Return HTML string to put an input field into a page + * Return HTML string to put an input field into a page * - * @param string $key Key of attribute - * @param string $value Value to show (for date type it must be in timestamp format) - * @param string $moreparam To add more parametes on html input tag - * @return void + * @param string $key Key of attribute + * @param string $value Value to show (for date type it must be in timestamp format) + * @param string $moreparam To add more parametes on html input tag + * @param string $keyprefix Prefix string to add into name and id of field (can be used to avoid duplicate names) + * @return void */ - function showInputField($key,$value,$moreparam='') + function showInputField($key,$value,$moreparam='',$keyprefix='') { global $conf,$langs; @@ -620,23 +621,23 @@ class ExtraFields if(!$required && $value == '') $value = '-1'; - $out = $formstat->select_date($value, 'options_'.$key, $showtime, $showtime, $required, '', 1, 1, 1, 0, 1); - //$out='<input type="text" name="options_'.$key.'" size="'.$showsize.'" maxlength="'.$newsize.'" value="'.$value.'"'.($moreparam?$moreparam:'').'>'; + $out = $formstat->select_date($value, 'options_'.$key.$keyprefix, $showtime, $showtime, $required, '', 1, 1, 1, 0, 1); + // TODO Missing to add $moreparam } elseif (in_array($type,array('int'))) { $tmp=explode(',',$size); $newsize=$tmp[0]; - $out='<input type="text" class="flat" name="options_'.$key.'" size="'.$showsize.'" maxlength="'.$newsize.'" value="'.$value.'"'.($moreparam?$moreparam:'').'>'; + $out='<input type="text" class="flat" name="options_'.$key.$keyprefix.'" size="'.$showsize.'" maxlength="'.$newsize.'" value="'.$value.'"'.($moreparam?$moreparam:'').'>'; } elseif ($type == 'varchar') { - $out='<input type="text" class="flat" name="options_'.$key.'" size="'.$showsize.'" maxlength="'.$size.'" value="'.$value.'"'.($moreparam?$moreparam:'').'>'; + $out='<input type="text" class="flat" name="options_'.$key.$keyprefix.'" size="'.$showsize.'" maxlength="'.$size.'" value="'.$value.'"'.($moreparam?$moreparam:'').'>'; } elseif ($type == 'text') { require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; - $doleditor=new DolEditor('options_'.$key,$value,'',200,'dolibarr_notes','In',false,false,! empty($conf->fckeditor->enabled) && $conf->global->FCKEDITOR_ENABLE_SOCIETE,5,100); + $doleditor=new DolEditor('options_'.$key.$keyprefix,$value,'',200,'dolibarr_notes','In',false,false,! empty($conf->fckeditor->enabled) && $conf->global->FCKEDITOR_ENABLE_SOCIETE,5,100); $out=$doleditor->Create(1); } elseif ($type == 'boolean') @@ -647,30 +648,30 @@ class ExtraFields } else { $checked=' value="1" '; } - $out='<input type="checkbox" class="flat" name="options_'.$key.'" '.$checked.' '.($moreparam?$moreparam:'').'>'; + $out='<input type="checkbox" class="flat" name="options_'.$key.$keyprefix.'" '.$checked.' '.($moreparam?$moreparam:'').'>'; } elseif ($type == 'mail') { - $out='<input type="text" class="flat" name="options_'.$key.'" size="32" value="'.$value.'">'; + $out='<input type="text" class="flat" name="options_'.$key.$keyprefix.'" size="32" value="'.$value.'" '.($moreparam?$moreparam:'').'>'; } elseif ($type == 'phone') { - $out='<input type="text" class="flat" name="options_'.$key.'" size="20" value="'.$value.'">'; + $out='<input type="text" class="flat" name="options_'.$key.$keyprefix.'" size="20" value="'.$value.'" '.($moreparam?$moreparam:'').'>'; } elseif ($type == 'price') { - $out='<input type="text" class="flat" name="options_'.$key.'" size="6" value="'.price($value).'"> '.$langs->getCurrencySymbol($conf->currency); + $out='<input type="text" class="flat" name="options_'.$key.$keyprefix.'" size="6" value="'.price($value).'" '.($moreparam?$moreparam:'').'> '.$langs->getCurrencySymbol($conf->currency); } elseif ($type == 'double') { if (!empty($value)) { $value=price($value); } - $out='<input type="text" class="flat" name="options_'.$key.'" size="6" value="'.$value.'"> '; + $out='<input type="text" class="flat" name="options_'.$key.$keyprefix.'" size="6" value="'.$value.'" '.($moreparam?$moreparam:'').'> '; } elseif ($type == 'select') { - $out='<select class="flat" name="options_'.$key.'">'; + $out='<select class="flat" name="options_'.$key.$keyprefix.'" '.($moreparam?$moreparam:'').'>'; foreach ($param['options'] as $key=>$val ) { list($val, $parent) = explode('|', $val); @@ -683,7 +684,7 @@ class ExtraFields } elseif ($type == 'sellist') { - $out='<select class="flat" name="options_'.$key.'">'; + $out='<select class="flat" name="options_'.$key.$keyprefix.'" '.($moreparam?$moreparam:'').'>'; if (is_array($param['options'])) { $param_list=array_keys($param['options']); @@ -820,7 +821,7 @@ class ExtraFields foreach ($param['options'] as $keyopt=>$val ) { - $out.='<input class="flat" type="checkbox" name="options_'.$key.'[]"'; + $out.='<input class="flat" type="checkbox" name="options_'.$key.$keyprefix.'[]" '.($moreparam?$moreparam:''); $out.=' value="'.$keyopt.'"'; if ((is_array($value_arr)) && in_array($keyopt,$value_arr)) { @@ -837,7 +838,7 @@ class ExtraFields $out=''; foreach ($param['options'] as $keyopt=>$val ) { - $out.='<input class="flat" type="radio" name="options_'.$key.'"'; + $out.='<input class="flat" type="radio" name="options_'.$key.$keyprefix.'" '.($moreparam?$moreparam:''); $out.=' value="'.$keyopt.'"'; $out.= ($value==$keyopt?'checked="checked"':''); $out.='/>'.$val.'<br>'; @@ -1085,9 +1086,10 @@ class ExtraFields * return array_options array for object by extrafields value (using for data send by forms) * * @param array $extralabels $array of extrafields + * @param string $keyprefix Prefix string to add into name and id of field (can be used to avoid duplicate names) * @return int 1 if array_options set / 0 if no value */ - function getOptionalsFromPost($extralabels) + function getOptionalsFromPost($extralabels,$keyprefix='') { global $_POST; @@ -1102,23 +1104,24 @@ class ExtraFields if (in_array($key_type,array('date','datetime'))) { // Clean parameters - $value_key=dol_mktime($_POST["options_".$key."hour"], $_POST["options_".$key."min"], 0, $_POST["options_".$key."month"], $_POST["options_".$key."day"], $_POST["options_".$key."year"]); + $value_key=dol_mktime($_POST["options_".$key.$keyprefix."hour"], $_POST["options_".$key.$keyprefix."min"], 0, $_POST["options_".$key.$keyprefix."month"], $_POST["options_".$key.$keyprefix."day"], $_POST["options_".$key.$keyprefix."year"]); } else if (in_array($key_type,array('checkbox'))) { - $value_arr=GETPOST("options_".$key); + $value_arr=GETPOST("options_".$key.$keyprefix); $value_key=implode($value_arr,','); } else if (in_array($key_type,array('price','double'))) { - $value_arr=GETPOST("options_".$key); + $value_arr=GETPOST("options_".$key.$keyprefix); $value_key=price2num($value_arr); } else { - $value_key=GETPOST("options_".$key); + $value_key=GETPOST("options_".$key.$keyprefix); } - $array_options["options_".$key]=$value_key; + + $array_options["options_".$key]=$value_key; // No keyprefix here. keyprefix is used only for read. } return $array_options; diff --git a/htdocs/core/lib/invoice.lib.php b/htdocs/core/lib/invoice.lib.php index b3983a0c5ab..0142bfae113 100644 --- a/htdocs/core/lib/invoice.lib.php +++ b/htdocs/core/lib/invoice.lib.php @@ -132,13 +132,10 @@ function invoice_admin_prepare_head($object) $head[$h][2] = 'attributes'; $h++; - if ($conf->global->MAIN_FEATURES_LEVEL >= 2) // FIXME This feature will works when form for predefined and free product will be merged, otherwise there is duplicate fields with same name - { $head[$h][0] = DOL_URL_ROOT.'/compta/facture/admin/facturedet_cust_extrafields.php'; $head[$h][1] = $langs->trans("ExtraFieldsLines"); $head[$h][2] = 'attributeslines'; $h++; - } complete_head_from_modules($conf,$langs,$object,$head,$h,'invoice_admin','remove'); diff --git a/htdocs/core/lib/order.lib.php b/htdocs/core/lib/order.lib.php index 46dca55fb3a..216887139d4 100644 --- a/htdocs/core/lib/order.lib.php +++ b/htdocs/core/lib/order.lib.php @@ -138,13 +138,10 @@ function order_admin_prepare_head($object) $head[$h][2] = 'attributes'; $h++; - if ($conf->global->MAIN_FEATURES_LEVEL >= 2) // FIXME This feature will works when form for predefined and free product will be merged, otherwise there is duplicate fields with same name - { $head[$h][0] = DOL_URL_ROOT.'/admin/orderdet_extrafields.php'; $head[$h][1] = $langs->trans("ExtraFieldsLines"); $head[$h][2] = 'attributeslines'; $h++; - } complete_head_from_modules($conf,$langs,$object,$head,$h,'order_admin','remove'); diff --git a/htdocs/core/lib/propal.lib.php b/htdocs/core/lib/propal.lib.php index 8f5e61eecee..d43885adf95 100644 --- a/htdocs/core/lib/propal.lib.php +++ b/htdocs/core/lib/propal.lib.php @@ -136,13 +136,10 @@ function propal_admin_prepare_head($object) $head[$h][2] = 'attributes'; $h++; - if ($conf->global->MAIN_FEATURES_LEVEL >= 2) // FIXME This feature will works when form for predefined and free product will be merged, otherwise there is duplicate fields with same name - { $head[$h][0] = DOL_URL_ROOT.'/comm/admin/propaldet_extrafields.php'; $head[$h][1] = $langs->trans("ExtraFieldsLines"); $head[$h][2] = 'attributeslines'; $h++; - } complete_head_from_modules($conf,$langs,$object,$head,$h,'propal_admin','remove'); diff --git a/htdocs/core/tpl/freeproductline_create.tpl.php b/htdocs/core/tpl/freeproductline_create.tpl.php index f88d7741ed8..41eccdddda9 100644 --- a/htdocs/core/tpl/freeproductline_create.tpl.php +++ b/htdocs/core/tpl/freeproductline_create.tpl.php @@ -126,13 +126,20 @@ else { <input type="text" size="5" name="buying_price" class="flat" value="<?php echo (isset($_POST["buying_price"])?$_POST["buying_price"]:''); ?>"> </td> <?php + $colspan++; + $coldisplay++; + if ($user->rights->margins->creer) { if (! empty($conf->global->DISPLAY_MARGIN_RATES)) { echo '<td align="right" class="nowrap"><input type="text" size="2" name="np_marginRate" value="'.(isset($_POST["np_marginRate"])?$_POST["np_marginRate"]:'').'"><span class="hideonsmartphone">%</span></td>'; + $colspan++; + $coldisplay++; } if (! empty($conf->global->DISPLAY_MARK_RATES)) { echo '<td align="right" class="nowrap"><input type="text" size="2" name="np_markRate" value="'.(isset($_POST["np_markRate"])?$_POST["np_markRate"]:'').'"><span class="hideonsmartphone">%</span></td>'; + $colspan++; + $coldisplay++; } } else @@ -164,7 +171,7 @@ else { $newline = new FactureLigne($this->db); } if (is_object($newline)) { - print $newline->showOptionals($extrafieldsline,'edit',array('style'=>$bcnd[$var],'colspan'=>$coldisplay+8)); + print $newline->showOptionals($extrafieldsline, 'edit', array('style'=>$bcnd[$var], 'colspan'=>$coldisplay+8)); } } ?> diff --git a/htdocs/core/tpl/predefinedproductline_create.tpl.php b/htdocs/core/tpl/predefinedproductline_create.tpl.php index ec430015135..acd06c807d3 100644 --- a/htdocs/core/tpl/predefinedproductline_create.tpl.php +++ b/htdocs/core/tpl/predefinedproductline_create.tpl.php @@ -134,13 +134,20 @@ else { <input type="text" size="5" id="buying_price_predef" name="buying_price_predef" class="flat" value="<?php echo (isset($_POST["buying_price_predef"])?$_POST["buying_price_predef"]:''); ?>"> </td> <?php + $colspan++; + $coldisplay++; + if ($user->rights->margins->creer) { if (! empty($conf->global->DISPLAY_MARGIN_RATES)) { echo '<td align="right"><input type="text" size="2" name="np_marginRate_predef" value="'.(isset($_POST["np_marginRate_predef"])?$_POST["np_marginRate_predef"]:'').'">%</td>'; + $colspan++; + $coldisplay++; } if (! empty($conf->global->DISPLAY_MARK_RATES)) { echo '<td align="right"><input type="text" size="2" name="np_markRate_predef" value="'.(isset($_POST["np_markRate_predef"])?$_POST["np_markRate_predef"]:'').'">%</td>'; + $colspan++; + $coldisplay++; } } else @@ -172,7 +179,7 @@ else { $newline = new FactureLigne($this->db); } if (is_object($newline)) { - print $newline->showOptionals($extrafieldsline,'edit',array('style'=>$bcnd[$var],'colspan'=>$coldisplay+5)); + print $newline->showOptionals($extrafieldsline, 'edit', array('style'=>$bcnd[$var],'colspan'=>$coldisplay+5), '_predef'); } } ?> -- GitLab