} if (!$error) { $supplier = new Fournisseur($db); $result = $supplier->fetch($id_fourn); if (isset($_POST['ref_fourn_price_id'])) { $object->fetch_product_fournisseur_price($_POST['ref_fourn_price_id']); } $ret = $object->update_buyprice($quantity, $_POST["price"], $user, $_POST["price_base_type"], $supplier, $_POST["oselDispo"], $ref_fourn, $tva_tx, $_POST["charges"], $remise_percent, 0, $npr, $delivery_time_days); if ($ret < 0) { $error++; setEventMessage($object->error, $object->errors, 'errors'); } else { if ($price_expression !== '') { //Check the expression validity by parsing it $priceparser = new PriceParser($db); $price_result = $priceparser->parseProductSupplier($id, $price_expression, $quantity, $tva_tx); if ($price_result < 0) { //Expression is not valid $error++; setEventMessage($priceparser->translatedError(), 'errors'); } } if (!$error && !empty($conf->dynamicprices->enabled)) { $ret = $object->setPriceExpression($price_expression); if ($ret < 0) { $error++; setEventMessage($object->error, 'errors'); } } } }
/** * Read price used by a provider * We enter as input couple prodfournprice/qty or triplet qty/product_id/fourn_ref * * @param int $prodfournprice Id du tarif = rowid table product_fournisseur_price * @param double $qty Quantity asked * @param int $product_id Filter on a particular product id * @param string $fourn_ref Filter on a supplier ref * @return int <-1 if KO, -1 if qty not enough, 0 si ok mais rien trouve, id_product si ok et trouve. May also initialize some properties like (->ref_supplier, buyprice, fourn_pu, vatrate_supplier...) */ function get_buyprice($prodfournprice, $qty, $product_id = 0, $fourn_ref = 0) { $result = 0; // We do select by searching with qty and prodfournprice $sql = "SELECT pfp.rowid, pfp.price as price, pfp.quantity as quantity,"; $sql .= " pfp.fk_product, pfp.ref_fourn, pfp.fk_soc, pfp.tva_tx, pfp.fk_supplier_price_expression"; $sql .= " FROM " . MAIN_DB_PREFIX . "product_fournisseur_price as pfp"; $sql .= " WHERE pfp.rowid = " . $prodfournprice; if ($qty) { $sql .= " AND pfp.quantity <= " . $qty; } dol_syslog(get_class($this) . "::get_buyprice", LOG_DEBUG); $resql = $this->db->query($sql); if ($resql) { $obj = $this->db->fetch_object($resql); if ($obj && $obj->quantity > 0) { if (!empty($obj->fk_supplier_price_expression)) { require_once DOL_DOCUMENT_ROOT . '/product/dynamic_price/class/price_parser.class.php'; $priceparser = new PriceParser($this->db); $price_result = $priceparser->parseProductSupplier($obj->fk_product, $obj->fk_supplier_price_expression, $obj->quantity, $obj->tva_tx); if ($price_result >= 0) { $obj->price = $price_result; } } $this->buyprice = $obj->price; // deprecated $this->fourn_pu = $obj->price / $obj->quantity; // Prix unitaire du produit pour le fournisseur $fourn_id $this->ref_fourn = $obj->ref_fourn; // Ref supplier $this->vatrate_supplier = $obj->tva_tx; // Vat ref supplier $result = $obj->fk_product; return $result; } else { // We do same select again but searching with qty, ref and id product $sql = "SELECT pfp.rowid, pfp.price as price, pfp.quantity as quantity, pfp.fk_soc,"; $sql .= " pfp.fk_product, pfp.ref_fourn as ref_supplier, pfp.tva_tx, pfp.fk_supplier_price_expression"; $sql .= " FROM " . MAIN_DB_PREFIX . "product_fournisseur_price as pfp"; $sql .= " WHERE pfp.ref_fourn = '" . $fourn_ref . "'"; $sql .= " AND pfp.fk_product = " . $product_id; $sql .= " AND pfp.quantity <= " . $qty; $sql .= " ORDER BY pfp.quantity DESC"; $sql .= " LIMIT 1"; dol_syslog(get_class($this) . "::get_buyprice", LOG_DEBUG); $resql = $this->db->query($sql); if ($resql) { $obj = $this->db->fetch_object($resql); if ($obj && $obj->quantity > 0) { if (!empty($obj->fk_supplier_price_expression)) { require_once DOL_DOCUMENT_ROOT . '/product/dynamic_price/class/price_parser.class.php'; $priceparser = new PriceParser($this->db); $price_result = $priceparser->parseProductSupplier($obj->fk_product, $obj->fk_supplier_price_expression, $obj->quantity, $obj->tva_tx); if ($result >= 0) { $obj->price = $price_result; } } $this->buyprice = $obj->price; // deprecated $this->fourn_qty = $obj->quantity; // min quantity for price $this->fourn_pu = $obj->price / $obj->quantity; // Prix unitaire du produit pour le fournisseur $fourn_id $this->ref_fourn = $obj->ref_supplier; // deprecated $this->ref_supplier = $obj->ref_supplier; // Ref supplier $this->vatrate_supplier = $obj->tva_tx; // Vat ref supplier $result = $obj->fk_product; return $result; } else { return -1; // Ce produit n'existe pas avec cette ref fournisseur ou existe mais qte insuffisante } } else { $this->error = $this->db->lasterror(); return -3; } } } else { $this->error = $this->db->lasterror(); return -2; } }
/** * Load properties for minimum price * * @param int $prodid Product id * @param int $qty Minimum quantity * @return int <0 if KO, 0=Not found of no product id provided, >0 if OK */ function find_min_price_product_fournisseur($prodid, $qty = 0) { global $conf; if (empty($prodid)) { dol_syslog("Warning function find_min_price_product_fournisseur were called with prodid empty. May be a bug.", LOG_WARNING); return 0; } $this->product_fourn_price_id = ''; $this->product_fourn_id = ''; $this->fourn_ref = ''; $this->fourn_price = ''; $this->fourn_qty = ''; $this->fourn_remise_percent = ''; $this->fourn_remise = ''; $this->fourn_unitprice = ''; $this->fourn_id = ''; $this->fourn_name = ''; $this->delivery_time_days = ''; $this->id = ''; $sql = "SELECT s.nom as supplier_name, s.rowid as fourn_id,"; $sql .= " pfp.rowid as product_fourn_price_id, pfp.ref_fourn,"; $sql .= " pfp.price, pfp.quantity, pfp.unitprice, pfp.tva_tx, pfp.charges, pfp.unitcharges, "; $sql .= " pfp.remise, pfp.remise_percent, pfp.fk_supplier_price_expression, pfp.delivery_time_days"; $sql .= " FROM " . MAIN_DB_PREFIX . "societe as s, " . MAIN_DB_PREFIX . "product_fournisseur_price as pfp"; $sql .= " WHERE s.entity IN (" . getEntity('societe', 1) . ")"; $sql .= " AND pfp.fk_product = " . $prodid; $sql .= " AND pfp.fk_soc = s.rowid"; if ($qty > 0) { $sql .= " AND pfp.quantity <= " . $qty; } dol_syslog(get_class($this) . "::find_min_price_product_fournisseur", LOG_DEBUG); $resql = $this->db->query($sql); if ($resql) { $record_array = array(); //Store each record to array for later search of min while ($record = $this->db->fetch_array($resql)) { $record_array[] = $record; } if (count($record_array) == 0) { $this->db->free($resql); return 0; } else { $min = -1; foreach ($record_array as $record) { $fourn_price = $record["price"]; $fourn_unitprice = $record["unitprice"]; if (!empty($record["fk_supplier_price_expression"])) { $priceparser = new PriceParser($this->db); $price_result = $priceparser->parseProductSupplier($prodid, $record["fk_supplier_price_expression"], $record["quantity"], $record["tva_tx"]); if ($price_result >= 0) { $fourn_price = price2num($price_result, 'MU'); if ($record["quantity"] != 0) { $fourn_unitprice = price2num($fourn_price / $record["quantity"], 'MU'); } else { $fourn_unitprice = $fourn_price; } } } if ($fourn_unitprice < $min || $min == -1) { $this->product_fourn_price_id = $record["product_fourn_price_id"]; $this->fourn_ref = $record["ref_fourn"]; $this->fourn_price = $fourn_price; $this->fourn_qty = $record["quantity"]; $this->fourn_remise_percent = $record["remise_percent"]; $this->fourn_remise = $record["remise"]; $this->fourn_unitprice = $fourn_unitprice; $this->fourn_charges = $record["charges"]; // deprecated $this->fourn_unitcharges = $record["unitcharges"]; // deprecated $this->fourn_tva_tx = $record["tva_tx"]; $this->fourn_id = $record["fourn_id"]; $this->fourn_name = $record["supplier_name"]; $this->delivery_time_days = $record["delivery_time_days"]; $this->fk_supplier_price_expression = $record["fk_supplier_price_expression"]; $this->id = $prodid; $min = $this->fourn_unitprice; } } } $this->db->free($resql); return 1; } else { $this->error = $this->db->error(); return -1; } }
$sql .= " WHERE pfp.fk_product = " . $idprod; $sql .= " AND p.tobuy = 1"; $sql .= " AND s.fournisseur = 1"; $sql .= " ORDER BY s.nom, pfp.ref_fourn DESC"; dol_syslog("Ajax::getSupplierPrices", LOG_DEBUG); $result = $db->query($sql); if ($result) { $num = $db->num_rows($result); if ($num) { require_once DOL_DOCUMENT_ROOT . '/product/dynamic_price/class/price_parser.class.php'; $i = 0; while ($i < $num) { $objp = $db->fetch_object($result); if (!empty($objp->fk_supplier_price_expression)) { $priceparser = new PriceParser($db); $price_result = $priceparser->parseProductSupplier($idprod, $objp->fk_supplier_price_expression, $objp->quantity, $objp->tva_tx); if ($price_result >= 0) { $objp->fprice = $price_result; if ($objp->quantity >= 1) { $objp->unitprice = $objp->fprice / $objp->quantity; } } } $price = $objp->fprice * (1 - $objp->remise_percent / 100); $unitprice = $objp->unitprice * (1 - $objp->remise_percent / 100); $title = $objp->name . ' - ' . $objp->ref_fourn . ' - '; if ($objp->quantity == 1) { $title .= price($price, 0, $langs, 0, 0, -1, $conf->currency) . "/"; } $title .= $objp->quantity . ' ' . ($objp->quantity == 1 ? $langs->trans("Unit") : $langs->trans("Units")); if ($objp->quantity > 1) {
/** * Return list of suppliers prices for a product * * @param int $productid Id of product * @param string $htmlname Name of HTML field * @return void */ function select_product_fourn_price($productid, $htmlname = 'productfournpriceid') { global $langs, $conf; $langs->load('stocks'); $sql = "SELECT p.rowid, p.label, p.ref, p.price, p.duration,"; $sql .= " pfp.ref_fourn, pfp.rowid as idprodfournprice, pfp.price as fprice, pfp.quantity, pfp.unitprice,"; $sql .= " pfp.fk_supplier_price_expression, pfp.fk_product, pfp.tva_tx, s.nom as name"; $sql .= " FROM " . MAIN_DB_PREFIX . "product as p"; $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product_fournisseur_price as pfp ON p.rowid = pfp.fk_product"; $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "societe as s ON pfp.fk_soc = s.rowid"; $sql .= " WHERE p.entity IN (" . getEntity('product', 1) . ")"; $sql .= " AND p.tobuy = 1"; $sql .= " AND s.fournisseur = 1"; $sql .= " AND p.rowid = " . $productid; $sql .= " ORDER BY s.nom, pfp.ref_fourn DESC"; dol_syslog(get_class($this) . "::select_product_fourn_price", LOG_DEBUG); $result = $this->db->query($sql); if ($result) { $num = $this->db->num_rows($result); $form = '<select class="flat" name="' . $htmlname . '">'; if (!$num) { $form .= '<option value="0">-- ' . $langs->trans("NoSupplierPriceDefinedForThisProduct") . ' --</option>'; } else { require_once DOL_DOCUMENT_ROOT . '/product/dynamic_price/class/price_parser.class.php'; $form .= '<option value="0"> </option>'; $i = 0; while ($i < $num) { $objp = $this->db->fetch_object($result); $opt = '<option value="' . $objp->idprodfournprice . '"'; //if there is only one supplier, preselect it if ($num == 1) { $opt .= ' selected'; } $opt .= '>' . $objp->name . ' - ' . $objp->ref_fourn . ' - '; if (!empty($objp->fk_supplier_price_expression)) { $priceparser = new PriceParser($this->db); $price_result = $priceparser->parseProductSupplier($objp->fk_product, $objp->fk_supplier_price_expression, $objp->quantity, $objp->tva_tx); if ($price_result >= 0) { $objp->fprice = $price_result; if ($objp->quantity >= 1) { $objp->unitprice = $objp->fprice / $objp->quantity; } } } if ($objp->quantity == 1) { $opt .= price($objp->fprice, 1, $langs, 0, 0, -1, $conf->currency) . "/"; } $opt .= $objp->quantity . ' '; if ($objp->quantity == 1) { $opt .= $langs->trans("Unit"); } else { $opt .= $langs->trans("Units"); } if ($objp->quantity > 1) { $opt .= " - "; $opt .= price($objp->unitprice, 1, $langs, 0, 0, -1, $conf->currency) . "/" . $langs->trans("Unit"); } if ($objp->duration) { $opt .= " - " . $objp->duration; } $opt .= "</option>\n"; $form .= $opt; $i++; } $form .= '</select>'; $this->db->free($result); } return $form; } else { dol_print_error($this->db); } }