diff --git a/htdocs/product/list.php b/htdocs/product/list.php
index 8c3196e1ec6..62abae9792e 100644
--- a/htdocs/product/list.php
+++ b/htdocs/product/list.php
@@ -936,6 +936,949 @@ if ($resql)
if (! $i) $totalarray['nbfield']++;
}
+ // Status (to sell)
+ if (! empty($arrayfields['p.tosell']['checked']))
+ {
+ print '
';
+ if (! empty($conf->use_javascript_ajax) && $user->rights->produit->creer && ! empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) {
+
+ * Copyright (C) 2004-2018 Laurent Destailleur
+ * Copyright (C) 2005-2012 Regis Houssin
+ * Copyright (C) 2012-2016 Marcos García
+ * Copyright (C) 2013-2018 Juanjo Menent
+ * Copyright (C) 2013-2015 Raphaël Doursenaud
+ * Copyright (C) 2013 Jean Heimburger
+ * Copyright (C) 2013 Cédric Salvador
+ * Copyright (C) 2013 Florian Henry
+ * Copyright (C) 2013 Adolfo segura
+ * Copyright (C) 2015 Jean-François Ferry
+ * Copyright (C) 2016 Ferran Marcet
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/**
+ * \file htdocs/product/list.php
+ * \ingroup produit
+ * \brief Page to list products and services
+ */
+
+require '../main.inc.php';
+require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
+require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
+if (! empty($conf->categorie->enabled))
+ require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
+
+// Load translation files required by the page
+$langs->loadLangs(array('products', 'stocks', 'suppliers', 'companies'));
+if (! empty($conf->productbatch->enabled)) $langs->load("productbatch");
+
+$action=GETPOST('action','alpha');
+$massaction=GETPOST('massaction','alpha');
+$show_files=GETPOST('show_files','int');
+$confirm=GETPOST('confirm','alpha');
+$toselect = GETPOST('toselect', 'array');
+
+$sall=trim((GETPOST('search_all', 'alphanohtml')!='')?GETPOST('search_all', 'alphanohtml'):GETPOST('sall', 'alphanohtml'));
+$search_ref=GETPOST("search_ref");
+$search_barcode=GETPOST("search_barcode");
+$search_label=GETPOST("search_label");
+$search_type = GETPOST("search_type", 'int');
+$search_sale = GETPOST("search_sale");
+$search_categ = GETPOST("search_categ",'int');
+$search_tosell = GETPOST("search_tosell", 'int');
+$search_tobuy = GETPOST("search_tobuy", 'int');
+$fourn_id = GETPOST("fourn_id",'int');
+$catid = GETPOST('catid','int');
+$search_tobatch = GETPOST("search_tobatch",'int');
+$search_accountancy_code_sell = GETPOST("search_accountancy_code_sell",'alpha');
+$search_accountancy_code_buy = GETPOST("search_accountancy_code_buy",'alpha');
+$optioncss = GETPOST('optioncss','alpha');
+$type=GETPOST("type","int");
+
+//Show/hide child products
+if (!empty($conf->variants->enabled) && ! empty($conf->global->PRODUIT_ATTRIBUTES_HIDECHILD)) {
+ $show_childproducts = GETPOST('search_show_childproducts');
+} else {
+ $show_childproducts = '';
+}
+
+$diroutputmassaction=$conf->product->dir_output . '/temp/massgeneration/'.$user->id;
+
+$limit = GETPOST('limit','int')?GETPOST('limit','int'):$conf->liste_limit;
+$sortfield = GETPOST("sortfield",'alpha');
+$sortorder = GETPOST("sortorder",'alpha');
+$page = (GETPOST("page",'int')?GETPOST("page", 'int'):0);
+if (empty($page) || $page == -1) { $page = 0; } // If $page is not defined, or '' or -1
+$offset = $limit * $page;
+$pageprev = $page - 1;
+$pagenext = $page + 1;
+if (! $sortfield) $sortfield="p.ref";
+if (! $sortorder) $sortorder="ASC";
+
+// Initialize context for list
+$contextpage=GETPOST('contextpage','aZ')?GETPOST('contextpage','aZ'):'productservicelist';
+if ((string) $type == '1') { $contextpage='servicelist'; if ($search_type=='') $search_type='1'; }
+if ((string) $type == '0') { $contextpage='productlist'; if ($search_type=='') $search_type='0'; }
+
+// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array of hooks
+$object=new Product($db);
+$hookmanager->initHooks(array('productservicelist'));
+$extrafields = new ExtraFields($db);
+$form=new Form($db);
+
+// fetch optionals attributes and labels
+$extralabels = $extrafields->fetch_name_optionals_label('product');
+$search_array_options=$extrafields->getOptionalsFromPost($object->table_element,'','search_');
+
+if (empty($action)) $action='list';
+
+// Get object canvas (By default, this is not defined, so standard usage of dolibarr)
+$canvas=GETPOST("canvas");
+$objcanvas=null;
+if (! empty($canvas))
+{
+ require_once DOL_DOCUMENT_ROOT.'/core/class/canvas.class.php';
+ $objcanvas = new Canvas($db,$action);
+ $objcanvas->getCanvas('product','list',$canvas);
+}
+
+// Security check
+if ($search_type=='0') $result=restrictedArea($user,'produit','','','','','',$objcanvas);
+else if ($search_type=='1') $result=restrictedArea($user,'service','','','','','',$objcanvas);
+else $result=restrictedArea($user,'produit|service','','','','','',$objcanvas);
+
+// Define virtualdiffersfromphysical
+$virtualdiffersfromphysical=0;
+if (! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT) || ! empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER))
+{
+ $virtualdiffersfromphysical=1; // According to increase/decrease stock options, virtual and physical stock may differs.
+}
+
+// List of fields to search into when doing a "search in all"
+$fieldstosearchall = array(
+ 'p.ref'=>"Ref",
+ 'pfp.ref_fourn'=>"RefSupplier",
+ 'p.label'=>"ProductLabel",
+ 'p.description'=>"Description",
+ "p.note"=>"Note",
+);
+// multilang
+if (! empty($conf->global->MAIN_MULTILANGS))
+{
+ $fieldstosearchall['pl.label']='ProductLabelTranslated';
+ $fieldstosearchall['pl.description']='ProductDescriptionTranslated';
+ $fieldstosearchall['pl.note']='ProductNoteTranslated';
+}
+if (! empty($conf->barcode->enabled)) {
+ $fieldstosearchall['p.barcode']='Gencod';
+}
+
+if (empty($conf->global->PRODUIT_MULTIPRICES))
+{
+ $titlesellprice=$langs->trans("SellingPrice");
+ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES))
+ {
+ $titlesellprice=$form->textwithpicto($langs->trans("SellingPrice"), $langs->trans("DefaultPriceRealPriceMayDependOnCustomer"));
+ }
+}
+
+// Definition of fields for lists
+$arrayfields=array(
+ 'p.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1),
+ //'pfp.ref_fourn'=>array('label'=>$langs->trans("RefSupplier"), 'checked'=>1, 'enabled'=>(! empty($conf->barcode->enabled))),
+ 'p.label'=>array('label'=>$langs->trans("Label"), 'checked'=>1),
+ 'p.fk_product_type'=>array('label'=>$langs->trans("Type"), 'checked'=>0, 'enabled'=>(! empty($conf->produit->enabled) && ! empty($conf->service->enabled))),
+ 'p.barcode'=>array('label'=>$langs->trans("Gencod"), 'checked'=>($contextpage != 'servicelist'), 'enabled'=>(! empty($conf->barcode->enabled))),
+ 'p.duration'=>array('label'=>$langs->trans("Duration"), 'checked'=>($contextpage != 'productlist'), 'enabled'=>(! empty($conf->service->enabled))),
+ 'p.sellprice'=>array('label'=>$langs->trans("SellingPrice"), 'checked'=>1, 'enabled'=>empty($conf->global->PRODUIT_MULTIPRICES)),
+ 'p.minbuyprice'=>array('label'=>$langs->trans("BuyingPriceMinShort"), 'checked'=>1, 'enabled'=>(! empty($user->rights->fournisseur->lire))),
+ 'p.numbuyprice'=>array('label'=>$langs->trans("BuyingPriceNumShort"), 'checked'=>0, 'enabled'=>(! empty($user->rights->fournisseur->lire))),
+ 'p.pmp'=>array('label'=>$langs->trans("PMPValueShort"), 'checked'=>0, 'enabled'=>(! empty($user->rights->fournisseur->lire))),
+ 'p.seuil_stock_alerte'=>array('label'=>$langs->trans("StockLimit"), 'checked'=>0, 'enabled'=>(! empty($conf->stock->enabled) && $user->rights->stock->lire && $contextpage != 'service')),
+ 'p.desiredstock'=>array('label'=>$langs->trans("DesiredStock"), 'checked'=>1, 'enabled'=>(! empty($conf->stock->enabled) && $user->rights->stock->lire && $contextpage != 'service')),
+ 'p.stock'=>array('label'=>$langs->trans("PhysicalStock"), 'checked'=>1, 'enabled'=>(! empty($conf->stock->enabled) && $user->rights->stock->lire && $contextpage != 'service')),
+ 'stock_virtual'=>array('label'=>$langs->trans("VirtualStock"), 'checked'=>1, 'enabled'=>(! empty($conf->stock->enabled) && $user->rights->stock->lire && $contextpage != 'service' && $virtualdiffersfromphysical)),
+ 'p.tobatch'=>array('label'=>$langs->trans("ManageLotSerial"), 'checked'=>0, 'enabled'=>(! empty($conf->productbatch->enabled))),
+ 'p.accountancy_code_sell'=>array('label'=>$langs->trans("ProductAccountancySellCode"), 'checked'=>0),
+ 'p.accountancy_code_buy'=>array('label'=>$langs->trans("ProductAccountancyBuyCode"), 'checked'=>0),
+ 'p.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500),
+ 'p.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500),
+ 'p.tosell'=>array('label'=>$langs->trans("Status").' ('.$langs->trans("Sell").')', 'checked'=>1, 'position'=>1000),
+ 'p.tobuy'=>array('label'=>$langs->trans("Status").' ('.$langs->trans("Buy").')', 'checked'=>1, 'position'=>1000)
+);
+// Extra fields
+if (is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label']))
+{
+ foreach($extrafields->attributes[$object->table_element]['label'] as $key => $val)
+ {
+ if (! empty($extrafields->attributes[$object->table_element]['list'][$key]))
+ $arrayfields["ef.".$key]=array('label'=>$extrafields->attributes[$object->table_element]['label'][$key], 'checked'=>(($extrafields->attributes[$object->table_element]['list'][$key]<0)?0:1), 'position'=>$extrafields->attributes[$object->table_element]['pos'][$key], 'enabled'=>(abs($extrafields->attributes[$object->table_element]['list'][$key])!=3 && $extrafields->attributes[$object->table_element]['perms'][$key]));
+ }
+}
+$object->fields = dol_sort_array($object->fields, 'position');
+$arrayfields = dol_sort_array($arrayfields, 'position');
+
+
+
+/*
+ * Actions
+ */
+
+if (GETPOST('cancel','alpha')) { $action='list'; $massaction=''; }
+if (! GETPOST('confirmmassaction','alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') { $massaction=''; }
+
+$parameters=array();
+$reshook=$hookmanager->executeHooks('doActions',$parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
+if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+
+if (empty($reshook))
+{
+ // Selection of new fields
+ include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
+
+ // Purge search criteria
+ if (GETPOST('button_removefilter_x','alpha') || GETPOST('button_removefilter.x','alpha') || GETPOST('button_removefilter','alpha')) // All tests are required to be compatible with all browsers
+ {
+ $sall="";
+ $search_ref="";
+ $search_label="";
+ $search_barcode="";
+ $search_categ=0;
+ $search_tosell="";
+ $search_tobuy="";
+ $search_tobatch='';
+ //$search_type=''; // There is 2 types of list: a list of product and a list of services. No list with both. So when we clear search criteria, we must keep the filter on type.
+
+ $show_childproducts = '';
+ $search_accountancy_code_sell='';
+ $search_accountancy_code_buy='';
+ $search_array_options=array();
+ }
+
+ // Mass actions
+ $objectclass='Product';
+ if ((string) $search_type == '1') { $objectlabel='Services'; }
+ if ((string) $search_type == '0') { $objectlabel='Products'; }
+
+ $permtoread = $user->rights->produit->lire;
+ $permtodelete = $user->rights->produit->supprimer;
+ $uploaddir = $conf->product->dir_output;
+ include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
+}
+
+
+/*
+ * View
+ */
+
+$htmlother=new FormOther($db);
+
+$title=$langs->trans("ProductsAndServices");
+
+if ($search_type != '' && $search_type != '-1')
+{
+ if ($search_type == 1)
+ {
+ $texte = $langs->trans("Services");
+ }
+ else
+ {
+ $texte = $langs->trans("Products");
+ }
+}
+else
+{
+ $texte = $langs->trans("ProductsAndServices");
+}
+
+$sql = 'SELECT DISTINCT p.rowid, p.ref, p.label, p.fk_product_type, p.barcode, p.price, p.price_ttc, p.price_base_type, p.entity,';
+$sql.= ' p.fk_product_type, p.duration, p.tosell, p.tobuy, p.seuil_stock_alerte, p.desiredstock,';
+$sql.= ' p.tobatch, p.accountancy_code_sell, p.accountancy_code_sell_intra, p.accountancy_code_sell_export, p.accountancy_code_buy,';
+$sql.= ' p.datec as date_creation, p.tms as date_update, p.pmp,';
+$sql.= ' MIN(pfp.unitprice) as minsellprice';
+if (!empty($conf->variants->enabled) && (!empty($conf->global->PRODUIT_ATTRIBUTES_HIDECHILD) && ! $show_childproducts )) {
+ $sql .= ', pac.rowid prod_comb_id';
+}
+// Add fields from extrafields
+if (! empty($extrafields->attributes[$object->table_element]['label'])) {
+ foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) $sql.=($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key.' as options_'.$key : '');
+}
+// Add fields from hooks
+$parameters=array();
+$reshook=$hookmanager->executeHooks('printFieldListSelect',$parameters); // Note that $action and $object may have been modified by hook
+$sql.=$hookmanager->resPrint;
+$sql.= ' FROM '.MAIN_DB_PREFIX.'product as p';
+if (is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_extrafields as ef on (p.rowid = ef.fk_object)";
+if (! empty($search_categ) || ! empty($catid)) $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_product as cp ON p.rowid = cp.fk_product"; // We'll need this table joined to the select in order to filter by categ
+$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_fournisseur_price as pfp ON p.rowid = pfp.fk_product";
+// multilang
+if (! empty($conf->global->MAIN_MULTILANGS)) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_lang as pl ON pl.fk_product = p.rowid AND pl.lang = '".$langs->getDefaultLang() ."'";
+
+if (!empty($conf->variants->enabled) && (!empty($conf->global->PRODUIT_ATTRIBUTES_HIDECHILD) && ! $show_childproducts )) {
+ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product_attribute_combination pac ON pac.fk_product_child = p.rowid";
+}
+
+
+$sql.= ' WHERE p.entity IN ('.getEntity('product').')';
+if ($sall) $sql .= natural_search(array_keys($fieldstosearchall), $sall);
+// if the type is not 1, we show all products (type = 0,2,3)
+if (dol_strlen($search_type) && $search_type != '-1')
+{
+ if ($search_type == 1) $sql.= " AND p.fk_product_type = 1";
+ else $sql.= " AND p.fk_product_type <> 1";
+}
+
+if (!empty($conf->variants->enabled) && (!empty($conf->global->PRODUIT_ATTRIBUTES_HIDECHILD) && ! $show_childproducts )) {
+ $sql .= " AND pac.rowid IS NULL";
+}
+
+if ($search_ref) $sql .= natural_search('p.ref', $search_ref);
+if ($search_label) $sql .= natural_search('p.label', $search_label);
+if ($search_barcode) $sql .= natural_search('p.barcode', $search_barcode);
+if (isset($search_tosell) && dol_strlen($search_tosell) > 0 && $search_tosell!=-1) $sql.= " AND p.tosell = ".$db->escape($search_tosell);
+if (isset($search_tobuy) && dol_strlen($search_tobuy) > 0 && $search_tobuy!=-1) $sql.= " AND p.tobuy = ".$db->escape($search_tobuy);
+if (dol_strlen($canvas) > 0) $sql.= " AND p.canvas = '".$db->escape($canvas)."'";
+if ($catid > 0) $sql.= " AND cp.fk_categorie = ".$catid;
+if ($catid == -2) $sql.= " AND cp.fk_categorie IS NULL";
+if ($search_categ > 0) $sql.= " AND cp.fk_categorie = ".$db->escape($search_categ);
+if ($search_categ == -2) $sql.= " AND cp.fk_categorie IS NULL";
+if ($fourn_id > 0) $sql.= " AND pfp.fk_soc = ".$fourn_id;
+if ($search_tobatch != '' && $search_tobatch >= 0) $sql.= " AND p.tobatch = ".$db->escape($search_tobatch);
+if ($search_accountancy_code_sell) $sql.= natural_search('p.accountancy_code_sell', $search_accountancy_code_sell);
+if ($search_accountancy_code_buy) $sql.= natural_search('p.accountancy_code_buy', $search_accountancy_code_buy);
+
+// Add where from extra fields
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
+// Add where from hooks
+$parameters=array();
+$reshook=$hookmanager->executeHooks('printFieldListWhere',$parameters); // Note that $action and $object may have been modified by hook
+$sql.=$hookmanager->resPrint;
+$sql.= " GROUP BY p.rowid, p.ref, p.label, p.barcode, p.price, p.price_ttc, p.price_base_type,";
+$sql.= " p.fk_product_type, p.duration, p.tosell, p.tobuy, p.seuil_stock_alerte, p.desiredstock,";
+$sql.= ' p.datec, p.tms, p.entity, p.tobatch, p.accountancy_code_sell, p.accountancy_code_sell_intra, p.accountancy_code_sell_export, p.accountancy_code_buy, p.pmp';
+
+if (!empty($conf->variants->enabled) && (!empty($conf->global->PRODUIT_ATTRIBUTES_HIDECHILD) && ! $show_childproducts )) {
+ $sql .= ', pac.rowid';
+}
+// Add fields from extrafields
+if (! empty($extrafields->attributes[$object->table_element]['label'])) {
+ foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) $sql.=($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key : '');
+}
+// Add fields from hooks
+$parameters=array();
+$reshook=$hookmanager->executeHooks('printFieldSelect',$parameters); // Note that $action and $object may have been modified by hook
+$sql.=$hookmanager->resPrint;
+//if (GETPOST("toolowstock")) $sql.= " HAVING SUM(s.reel) < p.seuil_stock_alerte"; // Not used yet
+$sql.= $db->order($sortfield,$sortorder);
+
+$nbtotalofrecords = '';
+if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST))
+{
+ $result = $db->query($sql);
+ $nbtotalofrecords = $db->num_rows($result);
+ if (($page * $limit) > $nbtotalofrecords) // if total resultset is smaller then paging size (filtering), goto and load page 0
+ {
+ $page = 0;
+ $offset = 0;
+ }
+}
+
+$sql.= $db->plimit($limit + 1, $offset);
+
+$resql = $db->query($sql);
+
+if ($resql)
+{
+ $num = $db->num_rows($resql);
+
+ $arrayofselected=is_array($toselect)?$toselect:array();
+
+ if ($num == 1 && ! empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $sall)
+ {
+ $obj = $db->fetch_object($resql);
+ $id = $obj->rowid;
+ header("Location: ".DOL_URL_ROOT.'/product/card.php?id='.$id);
+ exit;
+ }
+
+ $helpurl='';
+ if ($search_type != '')
+ {
+ if ($search_type == 0)
+ {
+ $helpurl='EN:Module_Products|FR:Module_Produits|ES:Módulo_Productos';
+ }
+ else if ($search_type == 1)
+ {
+ $helpurl='EN:Module_Services_En|FR:Module_Services|ES:Módulo_Servicios';
+ }
+ }
+
+ llxHeader('',$title,$helpurl,'');
+
+ // Displays product removal confirmation
+ if (GETPOST('delprod')) {
+ setEventMessages($langs->trans("ProductDeleted", GETPOST('delprod')), null, 'mesgs');
+ }
+
+ $param='';
+ if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.urlencode($contextpage);
+ if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.urlencode($limit);
+ if ($sall) $param.="&sall=".urlencode($sall);
+ if ($search_categ > 0) $param.="&search_categ=".urlencode($search_categ);
+ if ($search_ref) $param="&search_ref=".urlencode($search_ref);
+ if ($search_ref_supplier) $param="&search_ref_supplier=".urlencode($search_ref_supplier);
+ if ($search_barcode) $param.=($search_barcode?"&search_barcode=".urlencode($search_barcode):"");
+ if ($search_label) $param.="&search_label=".urlencode($search_label);
+ if ($search_tosell != '') $param.="&search_tosell=".urlencode($search_tosell);
+ if ($search_tobuy != '') $param.="&search_tobuy=".urlencode($search_tobuy);
+ if ($fourn_id > 0) $param.=($fourn_id?"&fourn_id=".$fourn_id:"");
+ if ($seach_categ) $param.=($search_categ?"&search_categ=".urlencode($search_categ):"");
+ if ($show_childproducts) $param.=($show_childproducts?"&search_show_childproducts=".urlencode($show_childproducts):"");
+ if ($type != '') $param.='&type='.urlencode($type);
+ if ($search_type != '') $param.='&search_type='.urlencode($search_type);
+ if ($optioncss != '') $param.='&optioncss='.urlencode($optioncss);
+ if ($search_tobatch) $param="&search_ref_supplier=".urlencode($search_ref_supplier);
+ if ($search_accountancy_code_sell) $param="&search_accountancy_code_sell=".urlencode($search_accountancy_code_sell);
+ if ($search_accountancy_code_buy) $param="&search_accountancy_code_buy=".urlencode($search_accountancy_code_buy);
+ // Add $param from extra fields
+ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
+
+ // List of mass actions available
+ $arrayofmassactions = array(
+ //'presend'=>$langs->trans("SendByMail"),
+ //'builddoc'=>$langs->trans("PDFMerge"),
+ );
+ if ($user->rights->produit->supprimer) $arrayofmassactions['predelete']=$langs->trans("Delete");
+ if (in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array();
+ $massactionbutton=$form->selectMassAction('', $arrayofmassactions);
+
+ $newcardbutton='';
+ $rightskey='produit';
+ if($type == Product::TYPE_SERVICE) $rightskey='service';
+ if($user->rights->{$rightskey}->creer)
+ {
+ $label='NewProduct';
+ if($type == Product::TYPE_SERVICE) $label='NewService';
+ $newcardbutton=''.$langs->trans($label).'';
+ $newcardbutton.= '';
+ $newcardbutton.= '';
+ }
+
+ print ' |