Merge pull request #20615 from Easya-Solutions/new-inventory-list-with-product-categories-filter

NEW product categories filter on inventory list
This commit is contained in:
Laurent Destailleur 2022-07-07 22:54:24 +02:00 committed by GitHub
commit 17016d5296
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -27,6 +27,9 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
require_once DOL_DOCUMENT_ROOT.'/product/inventory/class/inventory.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("stocks", "other"));
@ -88,6 +91,13 @@ foreach ($object->fields as $key => $val) {
$search[$key.'_dtend'] = dol_mktime(23, 59, 59, GETPOST('search_'.$key.'_dtendmonth', 'int'), GETPOST('search_'.$key.'_dtendday', 'int'), GETPOST('search_'.$key.'_dtendyear', 'int'));
}
}
$searchCategoryProductOperator = 0;
if (GETPOSTISSET('formfilteraction')) {
$searchCategoryProductOperator = GETPOST('search_category_product_operator', 'int');
} elseif (!empty($conf->global->MAIN_SEARCH_CAT_OR_BY_DEFAULT)) {
$searchCategoryProductOperator = $conf->global->MAIN_SEARCH_CAT_OR_BY_DEFAULT;
}
$searchCategoryProductList = GETPOST('search_category_product_list', 'array');
// List of fields to search into when doing a "search in all"
$fieldstosearchall = array();
@ -166,6 +176,7 @@ if (empty($reshook)) {
$search[$key.'_dtend'] = '';
}
}
$searchCategoryProductList = array();
$toselect = array();
$search_array_options = array();
}
@ -259,6 +270,50 @@ foreach ($search as $key => $val) {
if ($search_all) {
$sql .= natural_search(array_keys($fieldstosearchall), $search_all);
}
$searchCategoryProductSqlList = array();
if ($searchCategoryProductOperator == 1) {
$existsCategoryProductList = array();
foreach ($searchCategoryProductList as $searchCategoryProduct) {
if (intval($searchCategoryProduct) == -2) {
$sqlCategoryProductNotExists = " NOT EXISTS (";
$sqlCategoryProductNotExists .= " SELECT cp.fk_product";
$sqlCategoryProductNotExists .= " FROM ".$db->prefix()."categorie_product AS cp";
$sqlCategoryProductNotExists .= " WHERE cp.fk_product = t.fk_product";
$sqlCategoryProductNotExists .= " )";
$searchCategoryProductSqlList[] = $sqlCategoryProductNotExists;
} elseif (intval($searchCategoryProduct) > 0) {
$existsCategoryProductList[] = $db->escape($searchCategoryProduct);
}
}
if (!empty($existsCategoryProductList)) {
$sqlCategoryProductExists = " EXISTS (";
$sqlCategoryProductExists .= " SELECT cp.fk_product";
$sqlCategoryProductExists .= " FROM ".$db->prefix()."categorie_product AS cp";
$sqlCategoryProductExists .= " WHERE cp.fk_product = t.fk_product";
$sqlCategoryProductExists .= " AND cp.fk_categorie IN (".$db->sanitize(implode(',', $existsCategoryProductList)).")";
$sqlCategoryProductExists .= " )";
$searchCategoryProductSqlList[] = $sqlCategoryProductExists;
}
if (!empty($searchCategoryProductSqlList)) {
$sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
}
} else {
foreach ($searchCategoryProductList as $searchCategoryProduct) {
if (intval($searchCategoryProduct) == -2) {
$sqlCategoryProductNotExists = " NOT EXISTS (";
$sqlCategoryProductNotExists .= " SELECT cp.fk_product";
$sqlCategoryProductNotExists .= " FROM ".$db->prefix()."categorie_product AS cp";
$sqlCategoryProductNotExists .= " WHERE cp.fk_product = t.fk_product";
$sqlCategoryProductNotExists .= " )";
$searchCategoryProductSqlList[] = $sqlCategoryProductNotExists;
} elseif (intval($searchCategoryProduct) > 0) {
$searchCategoryProductSqlList[] = "t.fk_product IN (SELECT fk_product FROM ".$db->prefix()."categorie_product WHERE fk_categorie = ".((int) $searchCategoryProduct).")";
}
}
if (!empty($searchCategoryProductSqlList)) {
$sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
}
}
//$sql.= dolSqlDateFilter("t.field", $search_xxxday, $search_xxxmonth, $search_xxxyear);
// Add where from extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
@ -348,6 +403,9 @@ foreach ($search as $key => $val) {
if ($optioncss != '') {
$param .= '&optioncss='.urlencode($optioncss);
}
foreach ($searchCategoryProductList as $searchCategoryProduct) {
$param .= "&search_category_product_list[]=".urlencode($searchCategoryProduct);
}
// Add $param from extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
// Add $param from hooks
@ -405,6 +463,19 @@ $moreforfilter = '';
$moreforfilter.= $langs->trans('MyFilter') . ': <input type="text" name="search_myfield" value="'.dol_escape_htmltag($search_myfield).'">';
$moreforfilter.= '</div>';*/
// Filter on categories
if (!empty($conf->global->MAIN_SEARCH_CATEGORY_PRODUCT_ON_LISTS) && !empty($conf->categorie->enabled) && $user->rights->categorie->lire) {
$moreforfilter .= '<div class="divsearchfield">';
$tmptitle = $langs->transnoentities('ProductsCategoriesShort');
$moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"');
$categoriesProductArr = $form->select_all_categories(Categorie::TYPE_PRODUCT, '', '', 64, 0, 1);
$categoriesProductArr[-2] = '- '.$langs->trans('NotCategorized').' -';
$moreforfilter .= Form::multiselectarray('search_category_product_list', $categoriesProductArr, $searchCategoryProductList, 0, 0, 'minwidth300', 0, 0, '', 'category', $tmptitle);
$moreforfilter .= ' <input type="checkbox" class="valignmiddle" id="search_category_product_operator" name="search_category_product_operator" value="1"'.($searchCategoryProductOperator == 1 ? ' checked="checked"' : '').'/>';
$moreforfilter .= $form->textwithpicto('', $langs->trans('UseOrOperatorForCategories') . ' : ' . $tmptitle, 1, 'help', '', 0, 2, 'tooltip_cat_pro'); // Tooltip on click
$moreforfilter .= '</div>';
}
$parameters = array();
$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
if (empty($reshook)) {