function setAsset(&$PDOdb, &$AssetOf, $forReal = false) { global $db, $user, $conf; if (!$conf->global->USE_LOT_IN_OF || empty($this->lot_number)) { return true; } dol_include_once('/asset/class/asset.class.php'); $completeSql = ''; $sql = 'SELECT rowid FROM ' . MAIN_DB_PREFIX . 'asset'; $is_cumulate = TAsset_type::getIsCumulate($PDOdb, $this->fk_product); $is_perishable = TAsset_type::getIsPerishable($PDOdb, $this->fk_product); //si on cherche à déstocker 5 * 0.10 Kg alors on ne cherche pas un équipement avec + de 5Kg en stock mais bien + de 0.50Kg list($qty, $qty_stock) = $this->convertQty(); //echo $this->qty;exit; //Si type equipement est cumulable alors on destock 1 ou +sieurs équipements jusqu'à avoir la qté nécéssaire if ($is_cumulate) { $sql .= ' WHERE status != "USED" '; if (!$conf->global->ASSET_NEGATIVE_DESTOCK) { $sql .= ' AND contenancereel_value > 0 '; } if ($is_perishable) { $completeSql = ' AND DATE_FORMAT(dluo, "%Y-%m-%d") >= DATE_FORMAT(NOW(), "%Y-%m-%d") ORDER BY dluo ASC, date_cre ASC, contenancereel_value ASC'; } else { $completeSql = ' ORDER BY date_cre ASC, contenancereel_value ASC'; } } else { $sql .= ' WHERE status != "USED" '; if (!$conf->global->ASSET_NEGATIVE_DESTOCK) { $sql .= ' AND contenancereel_value >= ' . ($qty - $qty_sotck) . ' '; } // - la quantité déjà utilisé if ($is_perishable) { $completeSql = ' AND DATE_FORMAT(dluo, "%Y-%m-%d") >= DATE_FORMAT(NOW(), "%Y-%m-%d") ORDER BY dluo ASC, contenancereel_value ASC, date_cre ASC LIMIT 1'; } else { $completeSql = ' ORDER BY contenancereel_value ASC, date_cre ASC LIMIT 1'; } } $sql .= ' AND fk_product = ' . $this->fk_product; if ($conf->global->USE_LOT_IN_OF) { $sql .= ' AND lot_number = "' . $this->lot_number . '"'; } $sql .= $completeSql; //echo $sql.'<br>'; $Tab = $PDOdb->ExecuteAsArray($sql); $no_error = true; if ($this->type == 'NEEDED' && ($AssetOf->status == 'OPEN' || !$forReal)) { if ($qty_stock == $qty) { return true; } //qty_stock = qté déjà utilisé et qty = qté de besoin, donc si egal alors pas besoin de chercher d'autre équipement $nbAssetFound = count($Tab); $mvmt_stock_already_done = $nbAssetFound > 0 ? true : false; $qty_needed = $qty - $qty_stock; // - la quantité déjà utilisé if ($nbAssetFound == 0 && !$conf->global->ASSET_NEGATIVE_DESTOCK) { $AssetOf->errors[] = "La quantité d'équipement pour le produit ID " . $this->fk_product . " dans le lot n°" . $this->lot_number . ", est insuffisante pour la conception du ou des produits à créer."; $no_error = false; } else { //On fait un 1er tour pour vérifier la qté $qtyIsEnough = $this->checkAddAssetLink($PDOdb, $Tab, $qty_needed, $forReal, false); if (!$qtyIsEnough && !$conf->global->ASSET_NEGATIVE_DESTOCK) { $AssetOf->errors[] = "La quantité d'équipement pour le produit ID " . $this->fk_product . " dans le lot n°" . $this->lot_number . ", est insuffisante pour la conception du ou des produits à créer."; } else { $this->checkAddAssetLink($PDOdb, $Tab, $qty_needed, $forReal); } $no_error = $qtyIsEnough; } } //TODO on créé un équipement si non trouver, voir pour réintégrer ce comportement sur paramétrage /* $this->fk_asset = $idAsset; $this->save($PDOdb, $conf); */ if (!$no_error && !$conf->global->ASSET_NEGATIVE_DESTOCK) { return false; } else { return true; } }