diff --git a/class/api_discountrule.class.php b/class/api_discountrule.class.php deleted file mode 100644 index 59d4fa6..0000000 --- a/class/api_discountrule.class.php +++ /dev/null @@ -1,293 +0,0 @@ - - * Copyright (C) ---Put here your own copyright and developer email--- - * - * 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 . - */ - -use Luracast\Restler\RestException; - -/** - * \file class/api_discountrule.class.php - * \ingroup discountrules - * \brief File for API management of discountrule. - */ - -/** - * API class for discountrules discountrule - * - * @smart-auto-routing false - * @access protected - * @class DolibarrApiAccess {@requires user,external} - */ -class discountruleApi extends DolibarrApi -{ - /** - * @var array $FIELDS Mandatory fields, checked when create and update object - */ - static $FIELDS = array( - 'name' - ); - - /** - * @var DiscountRule $discountrule {@type DiscountRule} - */ - public $discountrule; - - /** - * Constructor - * - * @url GET discountrule/ - * - */ - function __construct() - { - global $db, $conf; - $this->db = $db; - $this->discountrule = new DiscountRule($this->db); - } - - /** - * Get properties of a discountrule object - * - * Return an array with discountrule informations - * - * @param int $id ID of discountrule - * @return array|mixed data without useless information - * - * @url GET discountrule/{id} - * @throws RestException - */ - function get($id) - { - if(! DolibarrApiAccess::$user->hasRight('discountrules','read')) { - throw new RestException(401); - } - - $result = $this->discountrule->fetch($id); - if( ! $result ) { - throw new RestException(404, 'discountrule not found'); - } - - if( ! DolibarrApi::_checkAccessToResource('discountrule',$this->discountrule->id)) { - throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); - } - - return $this->_cleanObjectDatas($this->discountrule); - } - - /** - * List discountrules - * - * Get a list of discountrules - * - * @param int $mode Use this param to filter list - * @param string $sortfield Sort field - * @param string $sortorder Sort order - * @param int $limit Limit for list - * @param int $page Page number - * @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.ref:like:'SO-%') and (t.date_creation:<:'20160101') or (t.import_key:=:'20160101')" - * @return array Array of discountrule objects - * - * @url GET /discountrules/ - */ - function index($mode, $sortfield = "t.rowid", $sortorder = 'ASC', $limit = 0, $page = 0, $sqlfilters = '') { - global $db, $conf; - - $obj_ret = array(); - - $socid = DolibarrApiAccess::$user->societe_id ? DolibarrApiAccess::$user->societe_id : ''; - - // If the internal user must only see his customers, force searching by him - if (! DolibarrApiAccess::$user->hasRight('societe','client','voir') && !$socid) $search_sale = DolibarrApiAccess::$user->id; - - $sql = "SELECT s.rowid"; - if ((!DolibarrApiAccess::$user->hasRight('societe','client','voir') && !$socid) || $search_sale > 0) $sql .= ", sc.fk_soc, sc.fk_user"; // We need these fields in order to filter by sale (including the case where the user can only see his prospects) - $sql.= " FROM ".$this->db->prefix()."discountrule as s"; - - if ((!DolibarrApiAccess::$user->hasRight('societe','client','voir') && !$socid) || $search_sale > 0) $sql.= ", ".$this->db->prefix()."societe_commerciaux as sc"; // We need this table joined to the select in order to filter by sale - $sql.= ", ".$this->db->prefix()."c_stcomm as st"; - $sql.= " WHERE s.fk_stcomm = st.id"; - - // Example of use $mode - //if ($mode == 1) $sql.= " AND s.client IN (1, 3)"; - //if ($mode == 2) $sql.= " AND s.client IN (2, 3)"; - - $sql.= ' AND s.entity IN ('.getEntity('discountrule').')'; - if ((!DolibarrApiAccess::$user->hasRight('societe','client','voir') && !$socid) || $search_sale > 0) $sql.= " AND s.fk_soc = sc.fk_soc"; - if ($socid) $sql.= " AND s.fk_soc = ".$socid; - if ($search_sale > 0) $sql.= " AND s.rowid = sc.fk_soc"; // Join for the needed table to filter by sale - // Insert sale filter - if ($search_sale > 0) - { - $sql .= " AND sc.fk_user = ".$search_sale; - } - if ($sqlfilters) - { - if (! DolibarrApi::_checkFilters($sqlfilters)) - { - throw new RestException(503, 'Error when validating parameter sqlfilters '.$sqlfilters); - } - $regexstring='\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)'; - $sql.=" AND (".preg_replace_callback('/'.$regexstring.'/', 'DolibarrApi::_forge_criteria_callback', $sqlfilters).")"; - } - - $sql.= $db->order($sortfield, $sortorder); - if ($limit) { - if ($page < 0) - { - $page = 0; - } - $offset = $limit * $page; - - $sql.= $db->plimit($limit + 1, $offset); - } - - $result = $db->query($sql); - if ($result) - { - $num = $db->num_rows($result); - while ($i < $num) - { - $obj = $db->fetch_object($result); - $discountrule_static = new DiscountRule($db); - if($discountrule_static->fetch($obj->rowid)) { - $obj_ret[] = parent::_cleanObjectDatas($discountrule_static); - } - $i++; - } - } - else { - throw new RestException(503, 'Error when retrieve discountrule list'); - } - if( ! count($obj_ret)) { - throw new RestException(404, 'No discountrule found'); - } - return $obj_ret; - } - - /** - * Create discountrule object - * - * @param array $request_data Request datas - * @return int ID of discountrule - * - * @url POST discountrule/ - */ - function post($request_data = NULL) - { - if(! DolibarrApiAccess::$user->hasRight('discountrules','create')) { - throw new RestException(401); - } - // Check mandatory fields - $result = $this->_validate($request_data); - - foreach($request_data as $field => $value) { - $this->discountrule->$field = $value; - } - if( ! $this->discountrule->create(DolibarrApiAccess::$user)) { - throw new RestException(500); - } - return $this->discountrule->id; - } - - /** - * Update discountrule - * - * @param int $id Id of discountrule to update - * @param array $request_data Datas - * @return int - * - * @url PUT discountrule/{id} - */ - function put($id, $request_data = NULL) - { - if(! DolibarrApiAccess::$user->hasRight('discountrules','create')) { - throw new RestException(401); - } - - $result = $this->discountrule->fetch($id); - if( ! $result ) { - throw new RestException(404, 'discountrule not found'); - } - - if( ! DolibarrApi::_checkAccessToResource('discountrule',$this->discountrule->id)) { - throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); - } - - foreach($request_data as $field => $value) { - $this->discountrule->$field = $value; - } - - if($this->discountrule->update($id, DolibarrApiAccess::$user)) - return $this->get ($id); - - return false; - } - - /** - * Delete discountrule - * - * @param int $id discountrule ID - * @return array - * - * @url DELETE discountrule/{id} - */ - function delete($id) - { - if(! DolibarrApiAccess::$user->hasRight('discountrules','delete')) { - throw new RestException(401); - } - $result = $this->discountrule->fetch($id); - if( ! $result ) { - throw new RestException(404, 'discountrule not found'); - } - - if( ! DolibarrApi::_checkAccessToResource('discountrule',$this->discountrule->id)) { - throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); - } - - if( !$this->discountrule->delete($id)) - { - throw new RestException(500); - } - - return array( - 'success' => array( - 'code' => 200, - 'message' => 'discountrule deleted' - ) - ); - - } - - /** - * Validate fields before create or update object - * - * @param array $data Data to validate - * @return array - * - * @throws RestException - */ - function _validate($data) - { - $discountrule = array(); - foreach (discountruleApi::$FIELDS as $field) { - if (!isset($data[$field])) - throw new RestException(400, "$field field missing"); - $discountrule[$field] = $data[$field]; - } - return $discountrule; - } -} diff --git a/class/api_discountrules.class.php b/class/api_discountrules.class.php new file mode 100644 index 0000000..e0e8385 --- /dev/null +++ b/class/api_discountrules.class.php @@ -0,0 +1,461 @@ + + * Copyright (C) 2025 Noé Cendrier + * + * 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 . + */ + +use Luracast\Restler\RestException; + +dol_include_once('/discountrules/class/discountrule.class.php'); + + + +/** + * \file discountrules/class/api_discountrules.class.php + * \ingroup discountrules + * \brief File for API management of discountrule. + */ + +/** + * API class for discountrules discountrule + * + * @access protected + * @class DolibarrApiAccess {@requires user,external} + */ +class DiscountrulesApi extends DolibarrApi +{ + /** + * @var DiscountRule $discountrule {@type DiscountRule} + */ + public $discountrule; + + /** + * Constructor + * + * @url GET / + * + */ + public function __construct() + { + global $db; + $this->db = $db; + $this->discountrule = new DiscountRule($this->db); + } + + /*begin methods CRUD*/ + /*CRUD FOR DISCOUNTRULE*/ + + /** + * Get properties of a discountrule object + * + * Return an array with discountrule informations + * + * @param int $id ID of discountrule + * @return Object Object with cleaned properties + * + * @url GET discountrules/{id} + * + * @throws RestException 401 Not allowed + * @throws RestException 404 Not found + */ + public function get($id) + { + if (!DolibarrApiAccess::$user->hasRight('discountrules','read')) { + throw new RestException(401); + } + + $result = $this->discountrule->fetch($id); + if (!$result) { + throw new RestException(404, 'DiscountRule not found'); + } + + if (!DolibarrApi::_checkAccessToResource('discountrule', $this->discountrule->id, 'discountrules_discountrule')) { + throw new RestException(401, 'Access to instance id='.$this->discountrule->id.' of object not allowed for login '.DolibarrApiAccess::$user->login); + } + + return $this->_cleanObjectDatas($this->discountrule); + } + + + /** + * List discountrules + * + * Get a list of discountrules + * + * @param string $sortfield Sort field + * @param string $sortorder Sort order + * @param int $limit Limit for list + * @param int $page Page number + * @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.ref:like:'SO-%') and (t.date_creation:<:'20160101')" + * @return array Array of order objects + * + * @throws RestException + * + * @url GET /discountrules/ + */ + public function index($sortfield = "t.rowid", $sortorder = 'ASC', $limit = 100, $page = 0, $sqlfilters = '') + { + // global $db, $conf; + + $obj_ret = array(); + $tmpobject = new DiscountRule($this->db); + + if (!DolibarrApiAccess::$user->rights->discountrules->read) { + throw new RestException(401); + } + + $socid = DolibarrApiAccess::$user->socid ? DolibarrApiAccess::$user->socid : ''; + + $restrictonsocid = 0; // Set to 1 if there is a field socid in table of object + + // If the internal user must only see his customers, force searching by him + $search_sale = 0; + if ($restrictonsocid && !DolibarrApiAccess::$user->hasRight('societe','client','voir') && !$socid) { + $search_sale = DolibarrApiAccess::$user->id; + } + + $sql = "SELECT t.rowid"; + if ($restrictonsocid && (!DolibarrApiAccess::$user->hasRight('societe','client','voir') && !$socid) || $search_sale > 0) { + $sql .= ", sc.fk_soc, sc.fk_user"; // We need these fields in order to filter by sale (including the case where the user can only see his prospects) + } + $sql .= " FROM ".$this->db->prefix().$tmpobject->table_element." AS t LEFT JOIN ".$this->db->prefix().$tmpobject->table_element."_extrafields AS ef ON (ef.fk_object = t.rowid)"; // Modification VMR Global Solutions to include extrafields as search parameters in the API GET call, so we will be able to filter on extrafields + + if ($restrictonsocid && (!DolibarrApiAccess::$user->hasRight('societe','client','voir') && !$socid) || $search_sale > 0) { + $sql .= ", ".$this->db->prefix()."societe_commerciaux as sc"; // We need this table joined to the select in order to filter by sale + } + $sql .= " WHERE 1 = 1"; + + // Example of use $mode + //if ($mode == 1) $sql.= " AND s.client IN (1, 3)"; + //if ($mode == 2) $sql.= " AND s.client IN (2, 3)"; + + if ($tmpobject->ismultientitymanaged) { + $sql .= ' AND t.entity IN ('.getEntity($tmpobject->element).')'; + } + if ($restrictonsocid && (!DolibarrApiAccess::$user->hasRight('societe','client','voir') && !$socid) || $search_sale > 0) { + $sql .= " AND t.fk_soc = sc.fk_soc"; + } + if ($restrictonsocid && $socid) { + $sql .= " AND t.fk_soc = ".((int) $socid); + } + if ($restrictonsocid && $search_sale > 0) { + $sql .= " AND t.rowid = sc.fk_soc"; // Join for the needed table to filter by sale + } + // Insert sale filter + if ($restrictonsocid && $search_sale > 0) { + $sql .= " AND sc.fk_user = ".((int) $search_sale); + } + if ($sqlfilters) { + $errormessage = ''; + $sql .= forgeSQLFromUniversalSearchCriteria($sqlfilters, $errormessage); + if ($errormessage) { + throw new RestException(400, 'Error when validating parameter sqlfilters -> '.$errormessage); + } + } + + $sql .= $this->db->order($sortfield, $sortorder); + if ($limit) { + if ($page < 0) { + $page = 0; + } + $offset = $limit * $page; + + $sql .= $this->db->plimit($limit + 1, $offset); + } + + $result = $this->db->query($sql); + $i = 0; + if ($result) { + $num = $this->db->num_rows($result); + while ($i < $num) { + $obj = $this->db->fetch_object($result); + $tmp_object = new DiscountRule($this->db); + if ($tmp_object->fetch($obj->rowid)) { + $obj_ret[] = $this->_cleanObjectDatas($tmp_object); + } + $i++; + } + } else { + throw new RestException(503, 'Error when retrieving discountrule list: '.$this->db->lasterror()); + } + if (!count($obj_ret)) { + throw new RestException(404, 'No discountrule found'); + } + return $obj_ret; + } + + /** + * Create discountrule object + * + * @param array $request_data Request datas + * @return int ID of discountrule + * + * @throws RestException + * + * @url POST discountrules/ + */ + public function post($request_data = null) + { + if (!DolibarrApiAccess::$user->hasRight('discountrules','create')) { + throw new RestException(401); + } + + // Check mandatory fields + $result = $this->_validate($request_data); + + foreach ($request_data as $field => $value) { + $this->discountrule->$field = $this->_checkValForAPI($field, $value, $this->discountrule); + } + + // Clean data + // $this->discountrule->abc = sanitizeVal($this->discountrule->abc, 'alphanohtml'); + + if ($this->discountrule->createCommon(DolibarrApiAccess::$user)<0) { + throw new RestException(500, "Error creating DiscountRule", array_merge(array($this->discountrule->error), $this->discountrule->errors)); + } + return $this->discountrule->id; + } + + /** + * Update discountrule + * + * @param int $id Id of discountrule to update + * @param array $request_data Datas + * @return int + * + * @throws RestException + * + * @url PUT discountrules/{id} + */ + public function put($id, $request_data = null) + { + if (!DolibarrApiAccess::$user->hasRight('discountrules','create')) { + throw new RestException(401); + } + + $result = $this->discountrule->fetch($id); + if (!$result) { + throw new RestException(404, 'DiscountRule not found'); + } + + if (!DolibarrApi::_checkAccessToResource('discountrule', $this->discountrule->id, 'discountrules_discountrule')) { + throw new RestException(401, 'Access to instance id='.$this->discountrule->id.' of object not allowed for login '.DolibarrApiAccess::$user->login); + } + + foreach ($request_data as $field => $value) { + if ($field == 'id') { + continue; + } + $this->discountrule->$field = $this->_checkValForAPI($field, $value, $this->discountrule); + } + + // Clean data + // $this->discountrule->abc = sanitizeVal($this->discountrule->abc, 'alphanohtml'); + + if ($this->discountrule->updateCommon(DolibarrApiAccess::$user, false) > 0) { + return $this->get($id); + } else { + throw new RestException(500, $this->discountrule->error); + } + } + + /** + * Delete discountrule + * + * @param int $id DiscountRule ID + * @return array + * + * @throws RestException + * + * @url DELETE discountrules/{id} + */ + public function delete($id) + { + if (!DolibarrApiAccess::$user->hasRight('discountrules','delete')) { + throw new RestException(401); + } + $result = $this->discountrule->fetch($id); + if (!$result) { + throw new RestException(404, 'DiscountRule not found'); + } + + if (!DolibarrApi::_checkAccessToResource('discountrule', $this->discountrule->id, 'discountrules_discountrule')) { + throw new RestException(401, 'Access to instance id='.$this->discountrule->id.' of object not allowed for login '.DolibarrApiAccess::$user->login); + } + + if ($this->discountrule->delete(DolibarrApiAccess::$user) == 0) { + throw new RestException(409, 'Error when deleting DiscountRule : '.$this->discountrule->error); + } elseif ($this->discountrule->delete(DolibarrApiAccess::$user) < 0) { + throw new RestException(500, 'Error when deleting DiscountRule : '.$this->discountrule->error); + } + + return array( + 'success' => array( + 'code' => 200, + 'message' => 'DiscountRule deleted' + ) + ); + } + + + /** + * Validate fields before create or update object + * + * @param array $data Array of data to validate + * @return array + * + * @throws RestException + */ + private function _validate($data) + { + $discountrule = array(); + foreach ($this->discountrule->fields as $field => $propfield) { + if (in_array($field, array('rowid', 'entity', 'date_creation', 'tms', 'fk_user_creat')) || $propfield['notnull'] != 1) { + continue; // Not a mandatory field + } + if (!isset($data[$field])) { + throw new RestException(400, "$field field missing"); + } + $discountrule[$field] = $data[$field]; + } + return $discountrule; + } + + /*END CRUD FOR DISCOUNTRULE*/ + /*end methods CRUD*/ + + /** + * List discountrules + * + * Get a list of discountrules + * + * @param int $product ID of Product object + * @param int $thirdparty ID of Societe object + * @return array Array of discountrule infos + * + * @throws RestException + * + * @url GET /getdiscount/{product}/{thirdparty} + */ + public function getdiscount($product, $thirdparty) + { + if (!DolibarrApiAccess::$user->hasRight('discountrules','read')) { + throw new RestException(401); + } + + $result = $this->discountrule->fetchByCrit(0, $product, 0, 0, $thirdparty); + if (!$result) { + throw new RestException(404, 'DiscountRule not found for product/client pair'); + } + + if (!DolibarrApi::_checkAccessToResource('discountrule', $this->discountrule->id, 'discountrules_discountrule')) { + throw new RestException(401, 'Access to instance id='.$this->discountrule->id.' of object not allowed for login '.DolibarrApiAccess::$user->login); + } + + $resarray = array( + 'fk_product' => $product, + 'socid' => $thirdparty, + 'discount_rule' => $this->discountrule->id, + 'catalog_price' => $this->discountrule->getDiscountSellPrice($product, $thirdparty), + 'discount_rate' => $this->discountrule->reduction, + 'discounted_subprice' => (float) $this->discountrule->getDiscountSellPrice($product, $thirdparty) - ((float) $this->discountrule->getDiscountSellPrice($product, $thirdparty) * (float) $this->discountrule->reduction / 100), + ); + + return $resarray; + } + + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore + /** + * Clean sensible object datas + * + * @param DiscountRule $object Object to clean + * @return Object Object with cleaned properties + */ + protected function _cleanObjectDatas($object) + { + // phpcs:enable + $object = parent::_cleanObjectDatas($object); + + unset($object->rowid); + unset($object->canvas); + + unset($object->reserror); + unset($object->entity); + unset($object->status); + unset($object->product); + unset($object->array_languages); + unset($object->contacts_ids); + unset($object->linked_objects); + unset($object->linkedObjectsIds); + unset($object->oldref); + unset($object->contact_id); + unset($object->user); + unset($object->origin); + unset($object->origin_id); + unset($object->ref_ext); + unset($object->statut); + unset($object->country_id); + unset($object->country_code); + unset($object->state_id); + unset($object->region_id); + unset($object->barcode_type); + unset($object->barcode_type_coder); + unset($object->mode_reglement_id); + unset($object->cond_reglement_id); + unset($object->demand_reason_id); + unset($object->transport_mode_id); + unset($object->shipping_method_id); + unset($object->shipping_method); + unset($object->multicurrency_code); + unset($object->multicurrency_tx); + unset($object->model_pdf); + unset($object->last_main_doc); + unset($object->fk_bank); + unset($object->fk_account); + unset($object->note_public); + unset($object->note_private); + unset($object->total_ht); + unset($object->total_tva); + unset($object->total_localtax1); + unset($object->total_localtax2); + unset($object->total_ttc); + unset($object->lines); + unset($object->name); + unset($object->lastname); + unset($object->firstname); + unset($object->civility_id); + unset($object->date_validation); + unset($object->date_modification); + unset($object->date_update); + unset($object->date_cloture); + unset($object->user_author); + unset($object->user_creation); + unset($object->user_creation_id); + unset($object->user_valid); + unset($object->user_validation); + unset($object->user_validation_id); + unset($object->user_closing_id); + unset($object->user_modification); + unset($object->user_modification_id); + unset($object->specimen); + unset($object->labelStatus); + unset($object->showphoto_on_popup); + unset($object->nb); + unset($object->output); + unset($object->extraparams); + + return $object; + } +} diff --git a/class/discountrule.class.php b/class/discountrule.class.php index 3b2e2d2..0d4640f 100644 --- a/class/discountrule.class.php +++ b/class/discountrule.class.php @@ -1113,6 +1113,27 @@ public function fetchByCrit($from_quantity = 1, $fk_product = 0, $fk_category_pr $product = $this->getProductCache($fk_product); + if (empty($fk_category_product) && !empty($fk_product)) { + require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php'; + $prod = new Product($this->db); + $prod->id = $fk_product; + $fk_category_product = $prod->getCategoriesCommon('product'); + } + + if (empty($fk_category_company) && !empty($fk_company)) { + require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php'; + $company = new Societe($this->db); + $company->id = $fk_company; + $fk_category_company = $company->getCategoriesCommon('customer'); + } + + if (empty($fk_category_project) && !empty($fk_project)) { + require_once DOL_DOCUMENT_ROOT . '/projet/class/project.class.php'; + $proj = new Project($this->db); + $proj->id = $fk_project; + $fk_category_project = $project->getCategoriesCommon('project'); + } + $baseSubprice = 0; if(!empty($product)){ @@ -1143,17 +1164,24 @@ public function fetchByCrit($from_quantity = 1, $fk_product = 0, $fk_category_pr $sql.= ' WHERE from_quantity <= '.floatval($from_quantity).' AND `fk_status` = 1 ' ; - $sql.= self::prepareSearch('fk_country', $fk_country); - $sql.= self::prepareSearch('fk_c_typent', $fk_c_typent); - $sql.= self::prepareSearch('fk_company', $fk_company); - $sql.= self::prepareSearch('fk_project', $fk_project); - - $sql.= self::prepareSearch('fk_product', $fk_product); - + if (!empty($fk_country)) { + $sql.= self::prepareSearch('fk_country', $fk_country); + } + if (!empty($fk_c_typent)) { + $sql.= self::prepareSearch('fk_c_typent', $fk_c_typent); + } + if (!empty($fk_company)) { + $sql.= self::prepareSearch('fk_company', $fk_company); + } + if (!empty($fk_project)) { + $sql.= self::prepareSearch('fk_project', $fk_project); + } + if (!empty($fk_product)) { + $sql.= self::prepareSearch('fk_product', $fk_product); + } $this->lastFetchByCritResult = false; - if(!empty($date)){ $date = $this->db->idate($date); } @@ -1165,9 +1193,15 @@ public function fetchByCrit($from_quantity = 1, $fk_product = 0, $fk_category_pr $sql.= ' AND ( date_to >= \''.$date.'\' OR date_to IS NULL OR YEAR(`date_to`) = 0 )'; // le YEAR(`date_to`) = 0 est une astuce MySQL pour chercher les dates vides le tout compatible avec les diférentes versions de MySQL // test for "FOR ALL CAT" - $sql.= ' AND ( (d.all_category_product > 0 AND cp.fk_category_product IS NULL) OR (d.all_category_product = 0 AND cp.fk_category_product > 0 '.self::prepareSearch('cp.fk_category_product', $fk_category_product).' )) '; - $sql.= ' AND ( (d.all_category_company > 0 AND cc.fk_category_company IS NULL) OR (d.all_category_company = 0 AND cc.fk_category_company > 0 '.self::prepareSearch('cc.fk_category_company', $fk_category_company).' )) '; - $sql.= ' AND ( (d.all_category_project > 0 AND cpj.fk_category_project IS NULL) OR (d.all_category_project = 0 AND cpj.fk_category_project > 0 '.self::prepareSearch('cpj.fk_category_project', $fk_category_project).' )) '; + if (!empty($fk_category_product)) { + $sql.= ' AND ( (d.all_category_product > 0 AND cp.fk_category_product IS NULL) OR (d.all_category_product = 0 AND cp.fk_category_product > 0 '.self::prepareSearch('cp.fk_category_product', $fk_category_product).' )) '; + } + if (!empty($fk_category_company)) { + $sql.= ' AND ( (d.all_category_company > 0 AND cc.fk_category_company IS NULL) OR (d.all_category_company = 0 AND cc.fk_category_company > 0 '.self::prepareSearch('cc.fk_category_company', $fk_category_company).' )) '; + } + if (!empty($fk_category_project)) { + $sql.= ' AND ( (d.all_category_project > 0 AND cpj.fk_category_project IS NULL) OR (d.all_category_project = 0 AND cpj.fk_category_project > 0 '.self::prepareSearch('cpj.fk_category_project', $fk_category_project).' )) '; + } $sql.= ' ORDER BY '; @@ -1178,9 +1212,15 @@ public function fetchByCrit($from_quantity = 1, $fk_product = 0, $fk_category_pr if(!empty($fk_product)){ $sql.= ' net_subprice ASC, ' ; } - $sql.= ' reduction DESC, from_quantity DESC, fk_company DESC, '.self::prepareOrderByCase('fk_category_company', $fk_category_company).', '.self::prepareOrderByCase('fk_category_product', $fk_category_product); + $sql.= ' reduction DESC, from_quantity DESC, fk_company DESC'; + if (!empty($fk_category_company)) { + $sql .= ', ' . self::prepareOrderByCase('fk_category_company', $fk_category_company); + } + if (!empty($fk_category_product)) { + $sql .= ', '.self::prepareOrderByCase('fk_category_product', $fk_category_product); + } - $sql.= ' LIMIT 1'; + $sql.= ' LIMIT 1'; $res = $this->db->query($sql); $this->lastquery = $this->db->lastquery;