?i»?
Current Path : /home/scgforma/www/soc064/htdocs/product/ |
Current File : /home/scgforma/www/soc064/htdocs/product/price.php |
<?php /* Copyright (C) 2001-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org> * Copyright (C) 2004-2014 Laurent Destailleur <eldy@users.sourceforge.net> * Copyright (C) 2005 Eric Seigne <eric.seigne@ryxeo.com> * Copyright (C) 2005-2017 Regis Houssin <regis.houssin@inodbox.com> * Copyright (C) 2006 Andre Cianfarani <acianfa@free.fr> * Copyright (C) 2014 Florian Henry <florian.henry@open-concept.pro> * Copyright (C) 2014-2018 Juanjo Menent <jmenent@2byte.es> * Copyright (C) 2014-2019 Philippe Grand <philippe.grand@atoo-net.com> * Copyright (C) 2014 Ion agorria <ion@agorria.com> * Copyright (C) 2015 Alexandre Spangaro <aspangaro@open-dsi.fr> * Copyright (C) 2015 Marcos GarcĂa <marcosgdf@gmail.com> * Copyright (C) 2016 Ferran Marcet <fmarcet@2byte.es> * Copyright (C) 2018 FrĂ©dĂ©ric France <frederic.france@netlogic.fr> * Copyright (C) 2018 Nicolas ZABOURI <info@inovea-conseil.com> * * 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 <http://www.gnu.org/licenses/>. */ /** * \file htdocs/product/price.php * \ingroup product * \brief Page to show product prices */ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/product.lib.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/price.lib.php'; require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php'; require_once DOL_DOCUMENT_ROOT . '/product/dynamic_price/class/price_expression.class.php'; require_once DOL_DOCUMENT_ROOT . '/product/dynamic_price/class/price_parser.class.php'; if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) { require_once DOL_DOCUMENT_ROOT . '/product/class/productcustomerprice.class.php'; $prodcustprice = new Productcustomerprice($db); } // Load translation files required by the page $langs->loadLangs(array('products', 'bills', 'companies', 'other')); $mesg=''; $error=0; $errors=array(); $id = GETPOST('id', 'int'); $ref = GETPOST('ref', 'alpha'); $action = GETPOST('action', 'alpha'); $cancel = GETPOST('cancel', 'alpha'); $eid = GETPOST('eid', 'int'); $search_soc = GETPOST('search_soc'); // Security check $fieldvalue = (! empty($id) ? $id : (! empty($ref) ? $ref : '')); $fieldtype = (! empty($ref) ? 'ref' : 'rowid'); if ($user->societe_id) $socid = $user->societe_id; $result = restrictedArea($user, 'produit|service', $fieldvalue, 'product&product', '', '', $fieldtype); if ($id > 0 || ! empty($ref)) { $object = new Product($db); $object->fetch($id, $ref); } // Clean param if ((! empty($conf->global->PRODUIT_MULTIPRICES) || ! empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) && empty($conf->global->PRODUIT_MULTIPRICES_LIMIT)) $conf->global->PRODUIT_MULTIPRICES_LIMIT = 5; // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context $hookmanager->initHooks(array('productpricecard','globalcard')); /* * Actions */ if ($cancel) $action=''; $parameters=array('id'=>$id, 'ref'=>$ref); $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)) { 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 { $search_soc = ''; } if ($action == 'setlabelsellingprice' && $user->admin) { require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php'; $keyforlabel = 'PRODUIT_MULTIPRICES_LABEL'.GETPOST('pricelevel'); dolibarr_set_const($db, $keyforlabel, GETPOST('labelsellingprice', 'alpha'), 'chaine', 0, '', $conf->entity); $action = ''; } if (($action == 'update_vat') && !$cancel && ($user->rights->produit->creer || $user->rights->service->creer)) { $tva_tx_txt = GETPOST('tva_tx', 'alpha'); // tva_tx can be '8.5' or '8.5*' or '8.5 (XXX)' or '8.5* (XXX)' // We must define tva_tx, npr and local taxes $tva_tx = $tva_tx_txt; $vatratecode = ''; if (preg_match('/\((.*)\)/', $tva_tx_txt, $reg)) { $vat_src_code = $reg[1]; $tva_tx = preg_replace('/\s*\(.*\)/', '', $tva_tx_txt); // Remove code into vatrate. } $tva_tx = price2num(preg_replace('/\*/', '', $tva_tx)); // keep remove all after the numbers and dot $npr = preg_match('/\*/', $tva_tx_txt) ? 1 : 0; $localtax1 = 0; $localtax2 = 0; $localtax1_type = '0'; $localtax2_type = '0'; // If value contains the unique code of vat line (new recommanded method), we use it to find npr and local taxes if (preg_match('/\((.*)\)/', $tva_tx_txt, $reg)) { // We look into database using code (we can't use get_localtax() because it depends on buyer that is not known). Same in create product. $vatratecode=$reg[1]; // Get record from code $sql = "SELECT t.rowid, t.code, t.recuperableonly, t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type"; $sql.= " FROM ".MAIN_DB_PREFIX."c_tva as t, ".MAIN_DB_PREFIX."c_country as c"; $sql.= " WHERE t.fk_pays = c.rowid AND c.code = '".$mysoc->country_code."'"; $sql.= " AND t.taux = ".((float) $tva_tx)." AND t.active = 1"; $sql.= " AND t.code ='".$vatratecode."'"; $resql=$db->query($sql); if ($resql) { $obj = $db->fetch_object($resql); $npr = $obj->recuperableonly; $localtax1 = $obj->localtax1; $localtax2 = $obj->localtax2; $localtax1_type = $obj->localtax1_type; $localtax2_type = $obj->localtax2_type; } } $object->default_vat_code = $vatratecode; $object->tva_tx = $tva_tx; $object->tva_npr = $npr; $object->localtax1_tx = $localtax1; $object->localtax2_tx = $localtax2; $object->localtax1_type = $localtax1_type; $object->localtax2_type = $localtax2_type; $db->begin(); $resql = $object->update($object->id, $user); if ($resql <= 0) { $error++; setEventMessages($object->error, $object->errors, 'errors'); } if ($error) { //$localtaxarray=array('0'=>$localtax1_type,'1'=>$localtax1,'2'=>$localtax2_type,'3'=>$localtax2); $localtaxarray=array(); // We do not store localtaxes into product, we will use instead the "vat code" to retreive them. $object->updatePrice(0, $object->price_base_type, $user, $tva_tx, '', 0, $npr, 0, 0, $localtaxarray, $vatratecode); } if (! $error) { $db->commit(); } else { $db->rollback(); } $action=''; } if (($action == 'update_price') && !$cancel && $object->getRights()->creer) { $error = 0; $pricestoupdate = array(); $psq = GETPOST('psqflag'); $psq = empty($newpsq) ? 0 : $newpsq; $maxpricesupplier = $object->min_recommended_price(); if (!empty($conf->dynamicprices->enabled)) { $object->fk_price_expression = empty($eid) ? 0 : $eid; //0 discards expression if ($object->fk_price_expression != 0) { //Check the expression validity by parsing it $priceparser = new PriceParser($db); if ($priceparser->parseProduct($object) < 0) { $error ++; setEventMessages($priceparser->translatedError(), null, 'errors'); } } } // Multiprices if (! $error && (! empty($conf->global->PRODUIT_MULTIPRICES) || ! empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES))) { $newprice = GETPOST('price', 'array'); $newprice_min = GETPOST('price_min', 'array'); $newpricebase = GETPOST('multiprices_base_type', 'array'); $newvattx = GETPOST('tva_tx', 'array'); $newvatnpr = GETPOST('tva_npr', 'array'); $newlocaltax1_tx = GETPOST('localtax1_tx', 'array'); $newlocaltax1_type = GETPOST('localtax1_type', 'array'); $newlocaltax2_tx = GETPOST('localtax2_tx', 'array'); $newlocaltax2_type = GETPOST('localtax2_type', 'array'); //Shall we generate prices using price rules? $object->price_autogen = GETPOST('usePriceRules') == 'on'; for ($i = 1; $i <= $conf->global->PRODUIT_MULTIPRICES_LIMIT; $i ++) { if (!isset($newprice[$i])) { continue; } $tva_tx_txt = $newvattx[$i]; $tva_tx = $tva_tx_txt; $vatratecode = ''; if (preg_match('/\((.*)\)/', $tva_tx_txt, $reg)) { $vat_src_code = $reg[1]; $tva_tx = preg_replace('/\s*\(.*\)/', '', $tva_tx_txt); // Remove code into vatrate. } $tva_tx = price2num(preg_replace('/\*/', '', $tva_tx)); // keep remove all after the numbers and dot $npr = preg_match('/\*/', $tva_tx_txt) ? 1 : 0; $localtax1 = $newlocaltax1_tx[$i]; $localtax1_type = $newlocaltax1_type[$i]; $localtax2 = $newlocaltax2_tx[$i]; $localtax2_type = $newlocaltax2_type[$i]; if (preg_match('/\((.*)\)/', $tva_tx_txt, $reg)) { // We look into database using code $vatratecode=$reg[1]; // Get record from code $sql = "SELECT t.rowid, t.code, t.recuperableonly, t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type"; $sql.= " FROM ".MAIN_DB_PREFIX."c_tva as t, ".MAIN_DB_PREFIX."c_country as c"; $sql.= " WHERE t.fk_pays = c.rowid AND c.code = '".$mysoc->country_code."'"; $sql.= " AND t.taux = ".((float) $tva_tx)." AND t.active = 1"; $sql.= " AND t.code ='".$vatratecode."'"; $resql=$db->query($sql); if ($resql) { $obj = $db->fetch_object($resql); $npr = $obj->recuperableonly; $localtax1 = $obj->localtax1; $localtax2 = $obj->localtax2; $localtax1_type = $obj->localtax1_type; $localtax2_type = $obj->localtax2_type; } } $pricestoupdate[$i] = array( 'price' => $newprice[$i], 'price_min' => $newprice_min[$i], 'price_base_type' => $newpricebase[$i], 'default_vat_code' => $vatratecode, 'vat_tx' => $tva_tx, // default_vat_code should be used in priority in a future 'npr' => $npr, // default_vat_code should be used in priority in a future 'localtaxes_array' => array('0'=>$localtax1_type, '1'=>$localtax1, '2'=>$localtax2_type, '3'=>$localtax2) // default_vat_code should be used in priority in a future ); //If autogeneration is enabled, then we only set the first level if ($object->price_autogen) { break; } } } elseif (! $error) { $tva_tx_txt = GETPOST('tva_tx', 'alpha'); // tva_tx can be '8.5' or '8.5*' or '8.5 (XXX)' or '8.5* (XXX)' $tva_tx = $tva_tx_txt; $vatratecode = ''; if (preg_match('/\((.*)\)/', $tva_tx_txt, $reg)) { $vat_src_code = $reg[1]; $tva_tx = preg_replace('/\s*\(.*\)/', '', $tva_tx_txt); // Remove code into vatrate. } $tva_tx = price2num(preg_replace('/\*/', '', $tva_tx)); // keep remove all after the numbers and dot $npr = preg_match('/\*/', $tva_tx_txt) ? 1 : 0; $localtax1 = 0; $localtax2 = 0; $localtax1_type = '0'; $localtax2_type = '0'; // If value contains the unique code of vat line (new recommanded method), we use it to find npr and local taxes if (preg_match('/\((.*)\)/', $tva_tx_txt, $reg)) { // We look into database using code $vatratecode=$reg[1]; // Get record from code $sql = "SELECT t.rowid, t.code, t.recuperableonly, t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type"; $sql.= " FROM ".MAIN_DB_PREFIX."c_tva as t, ".MAIN_DB_PREFIX."c_country as c"; $sql.= " WHERE t.fk_pays = c.rowid AND c.code = '".$mysoc->country_code."'"; $sql.= " AND t.taux = ".$tva_tx." AND t.active = 1"; $sql.= " AND t.code ='".$vatratecode."'"; $resql=$db->query($sql); if ($resql) { $obj = $db->fetch_object($resql); $npr = $obj->recuperableonly; $localtax1 = $obj->localtax1; $localtax2 = $obj->localtax2; $localtax1_type = $obj->localtax1_type; $localtax2_type = $obj->localtax2_type; // If spain, we don't use the localtax found into tax record in database with same code, but using the get_localtax rule if (in_array($mysoc->country_code, array('ES'))) { $localtax1 = get_localtax($tva_tx, 1); $localtax2 = get_localtax($tva_tx, 2); } } } $pricestoupdate[0] = array( 'price' => $_POST["price"], 'price_min' => $_POST["price_min"], 'price_base_type' => $_POST["price_base_type"], 'default_vat_code' => $vatratecode, 'vat_tx' => $tva_tx, // default_vat_code should be used in priority in a future 'npr' => $npr, // default_vat_code should be used in priority in a future 'localtaxes_array' => array('0'=>$localtax1_type, '1'=>$localtax1, '2'=>$localtax2_type, '3'=>$localtax2) // default_vat_code should be used in priority in a future ); } if (!$error) { $db->begin(); foreach ($pricestoupdate as $key => $val) { $newprice = $val['price']; if ($val['price'] < $val['price_min'] && !empty($object->fk_price_expression)) { $newprice = $val['price_min']; //Set price same as min, the user will not see the } $newprice = price2num($newprice, 'MU'); $newprice_min = price2num($val['price_min'], 'MU'); if (!empty($conf->global->PRODUCT_MINIMUM_RECOMMENDED_PRICE) && $newprice_min < $maxpricesupplier) { setEventMessages($langs->trans("MinimumPriceLimit", price($maxpricesupplier, 0, '', 1, - 1, - 1, 'auto')), null, 'errors'); $error ++; break; } if($object->multiprices[$key]!=$newprice || $object->multiprices_min[$key]!=$newprice_min || $object->multiprices_base_type[$key]!=$val['price_base_type']) $res = $object->updatePrice($newprice, $val['price_base_type'], $user, $val['vat_tx'], $newprice_min, $key, $val['npr'], $psq, 0, $val['localtaxes_array'], $val['default_vat_code']); else $res=0; if ($res < 0) { $error ++; setEventMessages($object->error, $object->errors, 'errors'); break; } } } if (!$error && $object->update($object->id, $user) < 0) { $error++; setEventMessages($object->error, $object->errors, 'errors'); } if (empty($error)) { $action = ''; setEventMessages($langs->trans("RecordSaved"), null, 'mesgs'); $db->commit(); } else { $action = 'edit_price'; $db->rollback(); } } if ($action == 'delete' && $user->rights->produit->supprimer) { $result = $object->log_price_delete($user, GETPOST('lineid', 'int')); if ($result < 0) { setEventMessages($object->error, $object->errors, 'errors'); } } // Set Price by quantity if ($action == 'activate_price_by_qty') { // Activating product price by quantity add a new price line with price_by_qty set to 1 $level = GETPOST('level', 'int'); $object->updatePrice(0, $object->price_base_type, $user, $object->tva_tx, 0, $level, $object->tva_npr, 1); } // Unset Price by quantity if ($action == 'disable_price_by_qty') { // Disabling product price by quantity add a new price line with price_by_qty set to 0 $level = GETPOST('level', 'int'); $object->updatePrice(0, $object->price_base_type, $user, $object->tva_tx, 0, $level, $object->tva_npr, 0); } if ($action == 'edit_price_by_qty') { // Edition d'un prix par quantitĂ© $rowid = GETPOST('rowid', 'int'); } // Add or update price by quantity if ($action == 'update_price_by_qty') { // RĂ©cupĂ©ration des variables $rowid = GETPOST('rowid', 'int'); $priceid = GETPOST('priceid', 'int'); $newprice = price2num(GETPOST("price", 'alpha'), 'MU'); // $newminprice=price2num(GETPOST("price_min"),'MU'); // TODO : Add min price management $quantity = GETPOST('quantity', 'int'); $remise_percent = price2num(GETPOST('remise_percent', 'alpha')); $remise = 0; // TODO : allow discount by amount when available on documents if (empty($quantity)) { $error++; setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Qty")), null, 'errors'); } if (empty($newprice)) { $error++; setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Price")), null, 'errors'); } if (! $error) { // Calcul du prix HT et du prix unitaire if ($object->price_base_type == 'TTC') { $price = price2num($newprice) / (1 + ($object->tva_tx / 100)); } $price = price2num($newprice, 'MU'); $unitPrice = price2num($price / $quantity, 'MU'); // Ajout / mise Ă jour if ($rowid > 0) { $sql = "UPDATE " . MAIN_DB_PREFIX . "product_price_by_qty SET"; $sql .= " price='" . $price . "',"; $sql .= " unitprice=" . $unitPrice . ","; $sql .= " quantity=" . $quantity . ","; $sql .= " remise_percent=" . $remise_percent . ","; $sql .= " remise=" . $remise; $sql .= " WHERE rowid = " . $rowid; $result = $db->query($sql); if (! $result) dol_print_error($db); } else { $sql = "INSERT INTO " . MAIN_DB_PREFIX . "product_price_by_qty (fk_product_price,price,unitprice,quantity,remise_percent,remise) values ("; $sql .= $priceid . ',' . $price . ',' . $unitPrice . ',' . $quantity . ',' . $remise_percent . ',' . $remise . ')'; $result = $db->query($sql); if (! $result) dol_print_error($db); } } } if ($action == 'delete_price_by_qty') { $rowid = GETPOST('rowid', 'int'); if (!empty($rowid)) { $sql = "DELETE FROM " . MAIN_DB_PREFIX . "product_price_by_qty"; $sql .= " WHERE rowid = " . $rowid; $result = $db->query($sql); } else { setEventMessages(('delete_price_by_qty'.$langs->transnoentities(MissingIds)), null, 'errors'); } } if ($action == 'delete_all_price_by_qty') { $priceid = GETPOST('priceid', 'int'); if (!empty($rowid)) { $sql = "DELETE FROM " . MAIN_DB_PREFIX . "product_price_by_qty"; $sql .= " WHERE fk_product_price = " . $priceid; $result = $db->query($sql); } else { setEventMessages(('delete_price_by_qty'.$langs->transnoentities(MissingIds)), null, 'errors'); } } /** * *************************************************** * Price by customer * **************************************************** */ if ($action == 'add_customer_price_confirm' && !$cancel && ($user->rights->produit->creer || $user->rights->service->creer)) { $maxpricesupplier = $object->min_recommended_price(); $update_child_soc = GETPOST('updatechildprice', 'int'); // add price by customer $prodcustprice->fk_soc = GETPOST('socid', 'int'); $prodcustprice->fk_product = $object->id; $prodcustprice->price = price2num(GETPOST("price"), 'MU'); $prodcustprice->price_min = price2num(GETPOST("price_min"), 'MU'); $prodcustprice->price_base_type = GETPOST("price_base_type", 'alpha'); $tva_tx_txt = GETPOST("tva_tx", 'alpha'); $tva_tx = $tva_tx_txt; $vatratecode = ''; if (preg_match('/\((.*)\)/', $tva_tx_txt, $reg)) { $vat_src_code = $reg[1]; $tva_tx = preg_replace('/\s*\(.*\)/', '', $tva_tx_txt); // Remove code into vatrate. } $tva_tx = price2num(preg_replace('/\*/', '', $tva_tx)); // keep remove all after the numbers and dot $npr = preg_match('/\*/', $tva_tx_txt) ? 1 : 0; $localtax1 = 0; $localtax2 = 0; $localtax1_type = '0'; $localtax2_type = '0'; // If value contains the unique code of vat line (new recommanded method), we use it to find npr and local taxes if (preg_match('/\((.*)\)/', $tva_tx_txt, $reg)) { // We look into database using code $vatratecode=$reg[1]; // Get record from code $sql = "SELECT t.rowid, t.code, t.recuperableonly, t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type"; $sql.= " FROM ".MAIN_DB_PREFIX."c_tva as t, ".MAIN_DB_PREFIX."c_country as c"; $sql.= " WHERE t.fk_pays = c.rowid AND c.code = '".$mysoc->country_code."'"; $sql.= " AND t.taux = ".$tva_tx." AND t.active = 1"; $sql.= " AND t.code ='".$vatratecode."'"; $resql=$db->query($sql); if ($resql) { $obj = $db->fetch_object($resql); $npr = $obj->recuperableonly; $localtax1 = $obj->localtax1; $localtax2 = $obj->localtax2; $localtax1_type = $obj->localtax1_type; $localtax2_type = $obj->localtax2_type; } } $prodcustprice->default_vat_code = $vatratecode; $prodcustprice->tva_tx = $tva_tx; $prodcustprice->recuperableonly = $npr; $prodcustprice->localtax1_tx = $localtax1; $prodcustprice->localtax2_tx = $localtax2; $prodcustprice->localtax1_type = $localtax1_type; $prodcustprice->localtax2_type = $localtax2_type; if (! ($prodcustprice->fk_soc > 0)) { $langs->load("errors"); setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ThirdParty")), null, 'errors'); $error++; $action='add_customer_price'; } if (! empty($conf->global->PRODUCT_MINIMUM_RECOMMENDED_PRICE) && $prodcustprice->price_min < $maxpricesupplier) { $langs->load("errors"); setEventMessages($langs->trans("MinimumPriceLimit", price($maxpricesupplier, 0, '', 1, -1, -1, 'auto')), null, 'errors'); $error++; $action='add_customer_price'; } if (! $error) { $result = $prodcustprice->create($user, 0, $update_child_soc); if ($result < 0) { setEventMessages($prodcustprice->error, $prodcustprice->errors, 'errors'); } else { setEventMessages($langs->trans('RecordSaved'), null, 'mesgs'); } $action = ''; } } if ($action == 'delete_customer_price' && ($user->rights->produit->supprimer || $user->rights->service->supprimer)) { // Delete price by customer $prodcustprice->id = GETPOST('lineid'); $result = $prodcustprice->delete($user); if ($result < 0) { setEventMessages($prodcustprice->error, $prodcustprice->errors, 'errors'); } else { setEventMessages($langs->trans('RecordDeleted'), null, 'mesgs'); } $action = ''; } if ($action == 'update_customer_price_confirm' && !$cancel && ($user->rights->produit->creer || $user->rights->service->creer)) { $maxpricesupplier = $object->min_recommended_price(); $update_child_soc = GETPOST('updatechildprice', 'int'); $prodcustprice->fetch(GETPOST('lineid', 'int')); // update price by customer $prodcustprice->price = price2num(GETPOST("price"), 'MU'); $prodcustprice->price_min = price2num(GETPOST("price_min"), 'MU'); $prodcustprice->price_base_type = GETPOST("price_base_type", 'alpha'); $tva_tx_txt = GETPOST("tva_tx"); $tva_tx = $tva_tx_txt; $vatratecode = ''; if (preg_match('/\((.*)\)/', $tva_tx_txt, $reg)) { $vat_src_code = $reg[1]; $tva_tx = preg_replace('/\s*\(.*\)/', '', $tva_tx_txt); // Remove code into vatrate. } $tva_tx = price2num(preg_replace('/\*/', '', $tva_tx)); // keep remove all after the numbers and dot $npr = preg_match('/\*/', $tva_tx_txt) ? 1 : 0; $localtax1 = 0; $localtax2 = 0; $localtax1_type = '0'; $localtax2_type = '0'; // If value contains the unique code of vat line (new recommanded method), we use it to find npr and local taxes if (preg_match('/\((.*)\)/', $tva_tx_txt, $reg)) { // We look into database using code $vatratecode=$reg[1]; // Get record from code $sql = "SELECT t.rowid, t.code, t.recuperableonly, t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type"; $sql.= " FROM ".MAIN_DB_PREFIX."c_tva as t, ".MAIN_DB_PREFIX."c_country as c"; $sql.= " WHERE t.fk_pays = c.rowid AND c.code = '".$mysoc->country_code."'"; $sql.= " AND t.taux = ".$tva_tx." AND t.active = 1"; $sql.= " AND t.code ='".$vatratecode."'"; $resql=$db->query($sql); if ($resql) { $obj = $db->fetch_object($resql); $npr = $obj->recuperableonly; $localtax1 = $obj->localtax1; $localtax2 = $obj->localtax2; $localtax1_type = $obj->localtax1_type; $localtax2_type = $obj->localtax2_type; } } $prodcustprice->default_vat_code = $vatratecode; $prodcustprice->tva_tx = $tva_tx; $prodcustprice->recuperableonly = $npr; $prodcustprice->localtax1_tx = $localtax1; $prodcustprice->localtax2_tx = $localtax2; $prodcustprice->localtax1_type = $localtax1_type; $prodcustprice->localtax2_type = $localtax2_type; if ($prodcustprice->price_min < $maxpricesupplier && !empty($conf->global->PRODUCT_MINIMUM_RECOMMENDED_PRICE)) { setEventMessages($langs->trans("MinimumPriceLimit", price($maxpricesupplier, 0, '', 1, -1, -1, 'auto')), null, 'errors'); $error++; $action='update_customer_price'; } if ( ! $error) { $result = $prodcustprice->update($user, 0, $update_child_soc); if ($result < 0) { setEventMessages($prodcustprice->error, $prodcustprice->errors, 'errors'); } else { setEventMessages($langs->trans('Save'), null, 'mesgs'); } $action = ''; } } } /* * View */ $form = new Form($db); if (! empty($id) || ! empty($ref)) { // fetch updated prices $object->fetch($id, $ref); } $title = $langs->trans('ProductServiceCard'); $helpurl = ''; $shortlabel = dol_trunc($object->label, 16); if (GETPOST("type") == '0' || ($object->type == Product::TYPE_PRODUCT)) { $title = $langs->trans('Product')." ". $shortlabel ." - ".$langs->trans('SellingPrices'); $helpurl='EN:Module_Products|FR:Module_Produits|ES:Módulo_Productos'; } if (GETPOST("type") == '1' || ($object->type == Product::TYPE_SERVICE)) { $title = $langs->trans('Service')." ". $shortlabel ." - ".$langs->trans('SellingPrices'); $helpurl='EN:Module_Services_En|FR:Module_Services|ES:Módulo_Servicios'; } llxHeader('', $title, $helpurl); $head = product_prepare_head($object); $titre = $langs->trans("CardProduct" . $object->type); $picto = ($object->type == Product::TYPE_SERVICE ? 'service' : 'product'); dol_fiche_head($head, 'price', $titre, -1, $picto); $linkback = '<a href="'.DOL_URL_ROOT.'/product/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>'; $object->next_prev_filter=" fk_product_type = ".$object->type; $shownav = 1; if ($user->societe_id && ! in_array('product', explode(',', $conf->global->MAIN_MODULES_FOR_EXTERNAL))) $shownav=0; dol_banner_tab($object, 'ref', $linkback, $shownav, 'ref'); print '<div class="fichecenter">'; print '<div class="underbanner clearboth"></div>'; print '<table class="border tableforfield" width="100%">'; // Price per customer segment/level if (! empty($conf->global->PRODUIT_MULTIPRICES) || ! empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) { // Price and min price are variable (depends on level of company). if (! empty($socid)) { $soc = new Societe($db); $soc->id = $socid; $soc->fetch($socid); // Selling price print '<tr><td class="titlefield">'; print $langs->trans("SellingPrice"); print '</td>'; print '<td colspan="2">'; if ($object->multiprices_base_type[$soc->price_level] == 'TTC') { print price($object->multiprices_ttc[$soc->price_level]); } else { print price($object->multiprices[$soc->price_level]); } if ($object->multiprices_base_type[$soc->price_level]) { print ' ' . $langs->trans($object->multiprices_base_type[$soc->price_level]); } else { print ' ' . $langs->trans($object->price_base_type); } print '</td></tr>'; // Price min print '<tr><td>' . $langs->trans("MinPrice") . '</td><td colspan="2">'; if ($object->multiprices_base_type[$soc->price_level] == 'TTC') { print price($object->multiprices_min_ttc[$soc->price_level]) . ' ' . $langs->trans($object->multiprices_base_type[$soc->price_level]); } else { print price($object->multiprices_min[$soc->price_level]) . ' ' . $langs->trans(empty($object->multiprices_base_type[$soc->price_level])?'HT':$object->multiprices_base_type[$soc->price_level]); } print '</td></tr>'; if (! empty($conf->global->PRODUIT_MULTIPRICES_USE_VAT_PER_LEVEL)) // using this option is a bug. kept for backward compatibility { // TVA print '<tr><td>' . $langs->trans("DefaultTaxRate") . '</td><td colspan="2">'; $positiverates=''; if (price2num($object->multiprices_tva_tx[$soc->price_level])) $positiverates.=($positiverates?'/':'').price2num($object->multiprices_tva_tx[$soc->price_level]); if (price2num($object->multiprices_localtax1_type[$soc->price_level])) $positiverates.=($positiverates?'/':'').price2num($object->multiprices_localtax1_tx[$soc->price_level]); if (price2num($object->multiprices_localtax2_type[$soc->price_level])) $positiverates.=($positiverates?'/':'').price2num($object->multiprices_localtax2_tx[$soc->price_level]); if (empty($positiverates)) $positiverates='0'; echo vatrate($positiverates.($object->default_vat_code?' ('.$object->default_vat_code.')':''), '%', $object->tva_npr); //print vatrate($object->multiprices_tva_tx[$soc->price_level], true); print '</td></tr>'; } else { // TVA print '<tr><td>' . $langs->trans("DefaultTaxRate") . '</td><td>'; $positiverates=''; if (price2num($object->tva_tx)) $positiverates.=($positiverates?'/':'').price2num($object->tva_tx); if (price2num($object->localtax1_type)) $positiverates.=($positiverates?'/':'').price2num($object->localtax1_tx); if (price2num($object->localtax2_type)) $positiverates.=($positiverates?'/':'').price2num($object->localtax2_tx); if (empty($positiverates)) $positiverates='0'; echo vatrate($positiverates.($object->default_vat_code?' ('.$object->default_vat_code.')':''), '%', $object->tva_npr); /* if ($object->default_vat_code) { print vatrate($object->tva_tx, true) . ' ('.$object->default_vat_code.')'; } else print vatrate($object->tva_tx . ($object->tva_npr ? '*' : ''), true);*/ print '</td></tr>'; } } else { if (! empty($conf->global->PRODUIT_MULTIPRICES_USE_VAT_PER_LEVEL)) // using this option is a bug. kept for backward compatibility { // We show only vat for level 1 print '<tr><td class="titlefield">' . $langs->trans("DefaultTaxRate") . '</td>'; print '<td colspan="2">' . vatrate($object->multiprices_tva_tx[1], true) . '</td>'; print '</tr>'; } else { // TVA print '<tr><td class="titlefield">' . $langs->trans("DefaultTaxRate") . '</td><td>'; $positiverates=''; if (price2num($object->tva_tx)) $positiverates.=($positiverates?'/':'').price2num($object->tva_tx); if (price2num($object->localtax1_type)) $positiverates.=($positiverates?'/':'').price2num($object->localtax1_tx); if (price2num($object->localtax2_type)) $positiverates.=($positiverates?'/':'').price2num($object->localtax2_tx); if (empty($positiverates)) $positiverates='0'; echo vatrate($positiverates.($object->default_vat_code?' ('.$object->default_vat_code.')':''), '%', $object->tva_npr); /* if ($object->default_vat_code) { print vatrate($object->tva_tx, true) . ' ('.$object->default_vat_code.')'; } else print vatrate($object->tva_tx . ($object->tva_npr ? '*' : ''), true);*/ print '</td></tr>'; } print '</table>'; print '<br>'; print '<table class="noborder tableforfield" width="100%">'; print '<tr class="liste_titre"><td>'; print $langs->trans("PriceLevel"); if ($user->admin) print ' <a href="'.$_SERVER["PHP_SELF"].'?action=editlabelsellingprice&pricelevel='.$i.'&id='.$object->id.'">'.img_edit($langs->trans('EditSellingPriceLabel'), 0).'</a>'; print '</td>'; print '<td style="text-align: right">'.$langs->trans("SellingPrice").'</td>'; print '<td style="text-align: right">'.$langs->trans("MinPrice").'</td>'; print '</tr>'; for($i = 1; $i <= $conf->global->PRODUIT_MULTIPRICES_LIMIT; $i++) { print '<tr class="oddeven">'; // Label of price print '<td>'; $keyforlabel='PRODUIT_MULTIPRICES_LABEL'.$i; if (preg_match('/editlabelsellingprice/', $action)) { print '<form method="post" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'">'; print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">'; print '<input type="hidden" name="action" value="setlabelsellingprice">'; print '<input type="hidden" name="pricelevel" value="'.$i.'">'; print $langs->trans("SellingPrice") . ' ' . $i.' - '; print '<input size="10" class="maxwidthonsmartphone" type="text" name="labelsellingprice" value="'.$conf->global->$keyforlabel.'">'; print ' <input type="submit" class="button" value="'.$langs->trans("Modify").'">'; print '</form>'; } else { print $langs->trans("SellingPrice") . ' ' . $i; if (! empty($conf->global->$keyforlabel)) print ' - '.$langs->trans($conf->global->$keyforlabel); } print '</td>'; if ($object->multiprices_base_type [$i] == 'TTC') { print '<td style="text-align: right">' . price($object->multiprices_ttc[$i]); } else { print '<td style="text-align: right">' . price($object->multiprices[$i]); } if ($object->multiprices_base_type[$i]) { print ' '.$langs->trans($object->multiprices_base_type [$i]).'</td>'; } else { print ' '.$langs->trans($object->price_base_type).'</td>'; } // Prix min print '<td style="text-align: right">'; if (empty($object->multiprices_base_type[$i])) $object->multiprices_base_type[$i]="HT"; if ($object->multiprices_base_type[$i] == 'TTC') { print price($object->multiprices_min_ttc[$i]) . ' ' . $langs->trans($object->multiprices_base_type[$i]); } else { print price($object->multiprices_min[$i]) . ' ' . $langs->trans($object->multiprices_base_type[$i]); } print '</td></tr>'; // Price by quantity if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY) || ! empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) // TODO Fix the form included into a tr instead of a td { print '<tr><td>' . $langs->trans("PriceByQuantity") . ' ' . $i; if (! empty($conf->global->$keyforlabel)) print ' - '.$langs->trans($conf->global->$keyforlabel); print '</td><td colspan="2">'; if ($object->prices_by_qty[$i] == 1) { print '<table width="50%" class="border" summary="List of quantities">'; print '<tr class="liste_titre">'; print '<td>' . $langs->trans("PriceByQuantityRange") . ' ' . $i . '</td>'; print '<td class="right">' . $langs->trans("HT") . '</td>'; print '<td class="right">' . $langs->trans("UnitPrice") . '</td>'; print '<td class="right">' . $langs->trans("Discount") . '</td>'; print '<td> </td>'; print '</tr>'; foreach ($object->prices_by_qty_list[$i] as $ii => $prices) { if ($action == 'edit_price_by_qty' && $rowid == $prices['rowid'] && ($user->rights->produit->creer || $user->rights->service->creer)) { print '<form action="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '" method="POST">'; print '<input type="hidden" name="action" value="update_price_by_qty">'; print '<input type="hidden" name="priceid" value="' . $object->prices_by_qty_id[$i] . '">'; print '<input type="hidden" value="' . $prices['rowid'] . '" name="rowid">'; print '<tr class="' . ($ii % 2 == 0 ? 'pair' : 'impair') . '">'; print '<td><input size="5" type="text" value="' . $prices['quantity'] . '" name="quantity"></td>'; print '<td class="right" colspan="2"><input size="10" type="text" value="' . price2num($prices['price'], 'MU') . '" name="price"> ' . $object->price_base_type . '</td>'; print '<td class="right"><input size="5" type="text" value="' . $prices['remise_percent'] . '" name="remise_percent"> %</td>'; print '<td class="center"><input type="submit" value="' . $langs->trans("Modify") . '" class="button"></td>'; print '</tr>'; print '</form>'; } else { print '<tr class="' . ($ii % 2 == 0 ? 'pair' : 'impair') . '">'; print '<td>' . $prices['quantity'] . '</td>'; print '<td class="right">' . price($prices['price']) . '</td>'; print '<td class="right">' . price($prices['unitprice']) . '</td>'; print '<td class="right">' . price($prices['remise_percent']) . ' %</td>'; print '<td class="center">'; if (($user->rights->produit->creer || $user->rights->service->creer)) { print '<a href="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '&action=edit_price_by_qty&rowid=' . $prices["rowid"] . '">'; print img_edit() . '</a>'; print '<a href="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '&action=delete_price_by_qty&rowid=' . $prices["rowid"] . '">'; print img_delete() . '</a>'; } else { print ' '; } print '</td>'; print '</tr>'; } } if ($action != 'edit_price_by_qty' && ($user->rights->produit->creer || $user->rights->service->creer)) { print '<form action="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '" method="POST">'; print '<input type="hidden" name="action" value="update_price_by_qty">'; print '<input type="hidden" name="priceid" value="' . $object->prices_by_qty_id[$i] . '">'; // id in product_price print '<input type="hidden" value="0" name="rowid">'; // id in product_price print '<tr class="' . ($ii % 2 == 0 ? 'pair' : 'impair') . '">'; print '<td><input size="5" type="text" value="1" name="quantity"></td>'; print '<td class="right" class="nowrap"><input size="10" type="text" value="0" name="price"> ' . $object->price_base_type . '</td>'; print '<td class="right"> </td>'; print '<td class="right" class="nowrap"><input size="5" type="text" value="0" name="remise_percent"> %</td>'; print '<td class="center"><input type="submit" value="' . $langs->trans("Add") . '" class="button"></td>'; print '</tr>'; print '</form>'; } print '</table>'; print '<a href="' . $_SERVER['PHP_SELF'] . '?id=' . $object->id . '&action=disable_price_by_qty&level='.$i.'">(' . $langs->trans("DisablePriceByQty").')</a>'; } else { print $langs->trans("No"); print ' <a href="' . $_SERVER['PHP_SELF'] . '?id=' . $object->id . '&action=activate_price_by_qty&level=' . $i . '">(' . $langs->trans("Activate") . ')</a>'; } print '</td></tr>'; } } } } else { // TVA print '<tr><td class="titlefield">' . $langs->trans("DefaultTaxRate") . '</td><td>'; $positiverates=''; if (price2num($object->tva_tx)) $positiverates.=($positiverates?'/':'').price2num($object->tva_tx); if (price2num($object->localtax1_type)) $positiverates.=($positiverates?'/':'').price2num($object->localtax1_tx); if (price2num($object->localtax2_type)) $positiverates.=($positiverates?'/':'').price2num($object->localtax2_tx); if (empty($positiverates)) $positiverates='0'; echo vatrate($positiverates.($object->default_vat_code?' ('.$object->default_vat_code.')':''), '%', $object->tva_npr); /* if ($object->default_vat_code) { print vatrate($object->tva_tx, true) . ' ('.$object->default_vat_code.')'; } else print vatrate($object->tva_tx, true, $object->tva_npr, true);*/ print '</td></tr>'; // Price print '<tr><td>' . $langs->trans("SellingPrice") . '</td><td>'; if ($object->price_base_type == 'TTC') { print price($object->price_ttc) . ' ' . $langs->trans($object->price_base_type); } else { print price($object->price) . ' ' . $langs->trans($object->price_base_type); } print '</td></tr>'; // Price minimum print '<tr><td>' . $langs->trans("MinPrice") . '</td><td>'; if ($object->price_base_type == 'TTC') { print price($object->price_min_ttc) . ' ' . $langs->trans($object->price_base_type); } else { print price($object->price_min) . ' ' . $langs->trans($object->price_base_type); } print '</td></tr>'; // Price by quantity if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY) || ! empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) // TODO Fix the form inside tr instead of td { print '<tr><td>' . $langs->trans("PriceByQuantity"); if ($object->prices_by_qty[0] == 0) { print ' <a href="' . $_SERVER['PHP_SELF'] . '?id=' . $object->id . '&action=activate_price_by_qty&level=1">(' . $langs->trans("Activate").')'; } else { print ' <a href="' . $_SERVER['PHP_SELF'] . '?id=' . $object->id . '&action=disable_price_by_qty&level=1">(' . $langs->trans("DisablePriceByQty").')'; } print '</td><td>'; if ($object->prices_by_qty[0] == 1) { print '<table width="50%" class="border" summary="List of quantities">'; print '<tr class="liste_titre">'; //print '<td>' . $langs->trans("PriceByQuantityRange") . '</td>'; print '<td>' . $langs->trans("Quantity") . '</td>'; print '<td class="right">' . $langs->trans("Price") . '</td>'; print '<td class="right"></td>'; print '<td class="right">' . $langs->trans("UnitPrice") . '</td>'; print '<td class="right">' . $langs->trans("Discount") . '</td>'; print '<td> </td>'; print '</tr>'; if ($action != 'edit_price_by_qty') { print '<form action="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '" method="POST">'; // FIXME a form into a table is not allowed print '<input type="hidden" name="action" value="update_price_by_qty">'; print '<input type="hidden" name="priceid" value="' . $object->prices_by_qty_id[0] . '">'; // id in product_price print '<input type="hidden" value="0" name="rowid">'; // id in product_price_by_qty print '<tr class="' . ($ii % 2 == 0 ? 'pair' : 'impair') . '">'; print '<td><input size="5" type="text" value="1" name="quantity"></td>'; print '<td class="right"><input class="width50 right" type="text" value="0" name="price"></td>'; print '<td>'; //print $object->price_base_type; print '</td>'; print '<td class="right"> </td>'; print '<td class="right"><input type="text" class="width50 right" value="0" name="remise_percent"> %</td>'; print '<td class="center"><input type="submit" value="' . $langs->trans("Add") . '" class="button"></td>'; print '</tr>'; print '</form>'; } foreach ($object->prices_by_qty_list[0] as $ii => $prices) { if ($action == 'edit_price_by_qty' && $rowid == $prices['rowid'] && ($user->rights->produit->creer || $user->rights->service->creer)) { print '<form action="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '" method="POST">'; print '<input type="hidden" name="action" value="update_price_by_qty">'; print '<input type="hidden" name="priceid" value="' . $object->prices_by_qty_id[0] . '">'; // id in product_price print '<input type="hidden" value="' . $prices['rowid'] . '" name="rowid">'; // id in product_price_by_qty print '<tr class="' . ($ii % 2 == 0 ? 'pair' : 'impair') . '">'; print '<td><input size="5" type="text" value="' . $prices['quantity'] . '" name="quantity"></td>'; print '<td class="right"><input class="width50 right" type="text" value="' . price2num($prices['price'], 'MU') . '" name="price"></td>'; print '<td class="right">'; //print $object->price_base_type; print $prices['price_base_type']; print '</td>'; print '<td class="right"> </td>'; print '<td class="right"><input class="width50 right" type="text" value="' . $prices['remise_percent'] . '" name="remise_percent"> %</td>'; print '<td class="center"><input type="submit" value="' . $langs->trans("Modify") . '" class="button"></td>'; print '</tr>'; print '</form>'; } else { print '<tr class="' . ($ii % 2 == 0 ? 'pair' : 'impair') . '">'; print '<td>' . $prices['quantity'] . '</td>'; print '<td class="right">' . price($prices['price']) . '</td>'; print '<td class="right">'; //print $object->price_base_type; print $prices['price_base_type']; print '</td>'; print '<td class="right">' . price($prices['unitprice']) . '</td>'; print '<td class="right">' . price($prices['remise_percent']) . ' %</td>'; print '<td class="center">'; if (($user->rights->produit->creer || $user->rights->service->creer)) { print '<a href="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '&action=edit_price_by_qty&rowid=' . $prices["rowid"] . '">'; print img_edit() . '</a>'; print '<a href="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '&action=delete_price_by_qty&rowid=' . $prices["rowid"] . '">'; print img_delete() . '</a>'; } else { print ' '; } print '</td>'; print '</tr>'; } } print '</table>'; } else { print $langs->trans("No"); } print '</td></tr>'; } } print "</table>\n"; print '</div>'; print '<div style="clear:both"></div>'; dol_fiche_end(); /* ************************************************************************** */ /* */ /* Barre d'action */ /* */ /* ************************************************************************** */ if (! $action || $action == 'delete' || $action == 'showlog_customer_price' || $action == 'showlog_default_price' || $action == 'add_customer_price' || $action == 'activate_price_by_qty' || $action == 'disable_price_by_qty') { print "\n" . '<div class="tabsAction">' . "\n"; if ($object->isVariant()) { if ($user->rights->produit->creer || $user->rights->service->creer) { print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NoEditVariants")).'">'.$langs->trans("UpdateDefaultPrice").'</a></div>'; } } else { if (empty($conf->global->PRODUIT_MULTIPRICES) && empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) { if ($user->rights->produit->creer || $user->rights->service->creer) { print '<div class="inline-block divButAction"><a class="butAction" href="' . $_SERVER['PHP_SELF'] . '?action=edit_price&id=' . $object->id . '">' . $langs->trans("UpdateDefaultPrice") . '</a></div>'; } } if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES)) { if ($user->rights->produit->creer || $user->rights->service->creer) { print '<div class="inline-block divButAction"><a class="butAction" href="' . $_SERVER["PHP_SELF"] . '?action=add_customer_price&id=' . $object->id . '">' . $langs->trans("AddCustomerPrice") . '</a></div>'; } } if (!empty($conf->global->PRODUIT_MULTIPRICES) || !empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) { if ($user->rights->produit->creer || $user->rights->service->creer) { print '<div class="inline-block divButAction"><a class="butAction" href="' . $_SERVER['PHP_SELF'] . '?action=edit_vat&id=' . $object->id . '">' . $langs->trans("UpdateVAT") . '</a></div>'; } if ($user->rights->produit->creer || $user->rights->service->creer) { print '<div class="inline-block divButAction"><a class="butAction" href="' . $_SERVER['PHP_SELF'] . '?action=edit_price&id=' . $object->id . '">' . $langs->trans("UpdateLevelPrices") . '</a></div>'; } } } print "\n</div>\n"; } /* * Edit price area */ if ($action == 'edit_vat' && ($user->rights->produit->creer || $user->rights->service->creer)) { print load_fiche_titre($langs->trans("UpdateVAT"), ''); print '<form action="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '" method="POST">'; print '<input type="hidden" name="token" value="' . $_SESSION ['newtoken'] . '">'; print '<input type="hidden" name="action" value="update_vat">'; print '<input type="hidden" name="id" value="' . $object->id . '">'; dol_fiche_head(''); print '<table class="border" width="100%">'; // VAT print '<tr><td>' . $langs->trans("DefaultTaxRate") . '</td><td>'; print $form->load_tva("tva_tx", $object->default_vat_code ? $object->tva_tx.' ('.$object->default_vat_code.')' : $object->tva_tx, $mysoc, '', $object->id, $object->tva_npr, $object->type, false, 1); print '</td></tr>'; print '</table>'; dol_fiche_end(); print '<div class="center">'; print '<input type="submit" class="button" value="' . $langs->trans("Save") . '">'; print ' '; print '<input type="submit" class="button" name="cancel" value="' . $langs->trans("Cancel") . '">'; print '</div>'; print '<br></form><br>'; } if ($action == 'edit_price' && $object->getRights()->creer) { print load_fiche_titre($langs->trans("NewPrice"), ''); if (empty($conf->global->PRODUIT_MULTIPRICES) && empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) { print '<!-- Edit price -->'."\n"; print '<form action="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '" method="POST">'; print '<input type="hidden" name="token" value="' . $_SESSION ['newtoken'] . '">'; print '<input type="hidden" name="action" value="update_price">'; print '<input type="hidden" name="id" value="' . $object->id . '">'; dol_fiche_head(''); print '<table class="border" width="100%">'; // VAT print '<tr><td class="titlefield">' . $langs->trans("DefaultTaxRate") . '</td><td>'; print $form->load_tva("tva_tx", $object->default_vat_code ? $object->tva_tx.' ('.$object->default_vat_code.')' : $object->tva_tx, $mysoc, '', $object->id, $object->tva_npr, $object->type, false, 1); print '</td></tr>'; // Price base print '<tr><td>'; print $langs->trans('PriceBase'); print '</td>'; print '<td>'; print $form->selectPriceBaseType($object->price_base_type, "price_base_type"); print '</td>'; print '</tr>'; // Only show price mode and expression selector if module is enabled if (! empty($conf->dynamicprices->enabled)) { // Price mode selector print '<tr><td>'.$langs->trans("PriceMode").'</td><td>'; $price_expression = new PriceExpression($db); $price_expression_list = array(0 => $langs->trans("PriceNumeric")); //Put the numeric mode as first option foreach ($price_expression->list_price_expression() as $entry) { $price_expression_list[$entry->id] = $entry->title; } $price_expression_preselection = GETPOST('eid') ? GETPOST('eid') : ($object->fk_price_expression ? $object->fk_price_expression : '0'); print $form->selectarray('eid', $price_expression_list, $price_expression_preselection); print ' <div id="expression_editor" class="button">'.$langs->trans("PriceExpressionEditor").'</div>'; print '</td></tr>'; // This code hides the numeric price input if is not selected, loads the editor page if editor button is pressed ?> <script type="text/javascript"> jQuery(document).ready(function() { jQuery("#expression_editor").click(function() { window.location = "<?php echo DOL_URL_ROOT ?>/product/dynamic_price/editor.php?id=<?php echo $id ?>&tab=price&eid=" + $("#eid").val(); }); jQuery("#eid").change(on_change); on_change(); }); function on_change() { if ($("#eid").val() == 0) { jQuery("#price_numeric").show(); } else { jQuery("#price_numeric").hide(); } } </script> <?php } // Price $product = new Product($db); $product->fetch($id, $ref, '', 1); //Ignore the math expression when getting the price print '<tr id="price_numeric"><td>'; $text = $langs->trans('SellingPrice'); print $form->textwithpicto($text, $langs->trans("PrecisionUnitIsLimitedToXDecimals", $conf->global->MAIN_MAX_DECIMALS_UNIT), 1, 1); print '</td><td>'; if ($object->price_base_type == 'TTC') { print '<input name="price" size="10" value="' . price($product->price_ttc) . '">'; } else { print '<input name="price" size="10" value="' . price($product->price) . '">'; } print '</td></tr>'; // Price minimum print '<tr><td>'; $text = $langs->trans('MinPrice'); print $form->textwithpicto($text, $langs->trans("PrecisionUnitIsLimitedToXDecimals", $conf->global->MAIN_MAX_DECIMALS_UNIT), 1, 1); print '</td><td>'; if ($object->price_base_type == 'TTC') { print '<input name="price_min" size="10" value="' . price($object->price_min_ttc) . '">'; } else { print '<input name="price_min" size="10" value="' . price($object->price_min) . '">'; } if (! empty($conf->global->PRODUCT_MINIMUM_RECOMMENDED_PRICE)) { print ' '.$langs->trans("MinimumRecommendedPrice", price($maxpricesupplier, 0, '', 1, -1, -1, 'auto')).' '.img_warning().'</td>'; } print '</td>'; print '</tr>'; $parameters=array('colspan' => 2); $reshook=$hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook print '</table>'; dol_fiche_end(); print '<div class="center">'; print '<input type="submit" class="button" value="' . $langs->trans("Save") . '">'; print ' '; print '<input type="submit" class="button" name="cancel" value="' . $langs->trans("Cancel") . '">'; print '</div>'; print '<br></form>'; } else { print '<!-- Edit price per level -->'."\n"; ?> <script> var showHidePriceRules = function () { var otherPrices = $('div.fiche form table tbody tr:not(:first)'); var minPrice1 = $('div.fiche form input[name="price_min[1]"]'); if (jQuery('input#usePriceRules').prop('checked')) { otherPrices.hide(); minPrice1.hide(); } else { otherPrices.show(); minPrice1.show(); } }; jQuery(document).ready(function () { showHidePriceRules(); jQuery('input#usePriceRules').click(showHidePriceRules); }); </script> <?php print '<form action="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '" method="POST">'; print '<input type="hidden" name="token" value="' . $_SESSION['newtoken'] . '">'; print '<input type="hidden" name="action" value="update_price">'; print '<input type="hidden" name="id" value="' . $object->id . '">'; //dol_fiche_head('', '', '', -1); if ((! empty($conf->global->PRODUIT_MULTIPRICES) || ! empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) && ! empty($conf->global->PRODUIT_MULTIPRICES_ALLOW_AUTOCALC_PRICELEVEL)) { print $langs->trans('UseMultipriceRules'). ' <input type="checkbox" id="usePriceRules" name="usePriceRules" '.($object->price_autogen ? 'checked' : '').'><br><br>'; } print '<table class="noborder">'; print '<thead><tr class="liste_titre">'; print '<td>'.$langs->trans("PriceLevel").'</td>'; if (!empty($conf->global->PRODUIT_MULTIPRICES_USE_VAT_PER_LEVEL)) print '<td style="text-align: center">'.$langs->trans("DefaultTaxRate").'</td>'; else print '<td></td>'; print '<td class="center">'.$langs->trans("SellingPrice").'</td>'; print '<td class="center">'.$langs->trans("MinPrice").'</td>'; if (!empty($conf->global->PRODUCT_MINIMUM_RECOMMENDED_PRICE)) { print '<td></td>'; } print '</tr></thead>'; print '<tbody>'; for ($i = 1; $i <= $conf->global->PRODUIT_MULTIPRICES_LIMIT; $i ++) { print '<tr class="oddeven">'; print '<td>'; print $form->textwithpicto($langs->trans('SellingPrice') . ' ' . $i, $langs->trans("PrecisionUnitIsLimitedToXDecimals", $conf->global->MAIN_MAX_DECIMALS_UNIT), 1, 1); print '</td>'; // VAT if (empty($conf->global->PRODUIT_MULTIPRICES_USE_VAT_PER_LEVEL)) { print '<td>'; print '<input type="hidden" name="tva_tx[' . $i . ']" value="' . ($object->default_vat_code ? $object->tva_tx.' ('.$object->default_vat_code.')' : $object->tva_tx) . '">'; print '<input type="hidden" name="tva_npr[' . $i . ']" value="' . $object->tva_npr . '">'; print '<input type="hidden" name="localtax1_tx[' . $i . ']" value="' . $object->localtax1_tx . '">'; print '<input type="hidden" name="localtax1_type[' . $i . ']" value="' . $object->localtax1_type . '">'; print '<input type="hidden" name="localtax2_tx[' . $i . ']" value="' . $object->localtax2_tx . '">'; print '<input type="hidden" name="localtax2_type[' . $i . ']" value="' . $object->localtax2_type . '">'; print '</td>'; } else { // This option is kept for backward compatibility but has no sense print '<td style="text-align: center">'; print $form->load_tva("tva_tx[" . $i.']', $object->multiprices_tva_tx[$i], $mysoc, '', $object->id, false, $object->type, false, 1); print '</td>'; } // Selling price print '<td style="text-align: center">'; if ($object->multiprices_base_type [$i] == 'TTC') { print '<input name="price[' . $i . ']" size="10" value="' . price($object->multiprices_ttc [$i]) . '">'; } else { print '<input name="price[' . $i . ']" size="10" value="' . price($object->multiprices [$i]) . '">'; } print ' '.$form->selectPriceBaseType($object->multiprices_base_type [$i], "multiprices_base_type[" . $i."]"); print '</td>'; // Min price print '<td style="text-align: center">'; if ($object->multiprices_base_type [$i] == 'TTC') { print '<input name="price_min[' . $i . ']" size="10" value="' . price($object->multiprices_min_ttc [$i]) . '">'; } else { print '<input name="price_min[' . $i . ']" size="10" value="' . price($object->multiprices_min [$i]) . '">'; } if ( !empty($conf->global->PRODUCT_MINIMUM_RECOMMENDED_PRICE)) { print '<td class="left">'.$langs->trans("MinimumRecommendedPrice", price($maxpricesupplier, 0, '', 1, -1, -1, 'auto')).' '.img_warning().'</td>'; } print '</td>'; print '</tr>'; } print '</tbody>'; print '</table>'; //dol_fiche_end(); print '<div style="text-align: center">'; print '<input type="submit" class="button" value="' . $langs->trans("Save") . '">'; print ' '; print '<input type="submit" class="button" name="cancel" value="' . $langs->trans("Cancel") . '"></div>'; print '</form>'; } } // List of price changes - log historic (ordered by descending date) if ((empty($conf->global->PRODUIT_CUSTOMER_PRICES) || $action=='showlog_default_price') && ! in_array($action, array('edit_price','edit_vat'))) { $sql = "SELECT p.rowid, p.price, p.price_ttc, p.price_base_type, p.tva_tx, p.default_vat_code, p.recuperableonly, p.localtax1_tx, p.localtax1_type, p.localtax2_tx, p.localtax2_type,"; $sql .= " p.price_level, p.price_min, p.price_min_ttc,p.price_by_qty,"; $sql .= " p.date_price as dp, p.fk_price_expression, u.rowid as user_id, u.login"; $sql .= " FROM " . MAIN_DB_PREFIX . "product_price as p,"; $sql .= " " . MAIN_DB_PREFIX . "user as u"; $sql .= " WHERE fk_product = " . $object->id; $sql .= " AND p.entity IN (" . getEntity('productprice') . ")"; $sql .= " AND p.fk_user_author = u.rowid"; if (! empty($socid) && ! empty($conf->global->PRODUIT_MULTIPRICES)) $sql .= " AND p.price_level = " . $soc->price_level; $sql .= " ORDER BY p.date_price DESC, p.rowid DESC, p.price_level ASC"; // $sql .= $db->plimit(); $result = $db->query($sql); if ($result) { print '<div class="divlogofpreviouscustomerprice">'; $num = $db->num_rows($result); if (! $num) { $db->free($result); // Il doit au moins y avoir la ligne de prix initial. // On l'ajoute donc pour remettre a niveau (pb vieilles versions) //$object->updatePrice($object->price, $object->price_base_type, $user, $object->tva_tx, $object->price_min); if (! empty($conf->global->PRODUIT_MULTIPRICES)) { $object->updatePrice($object->multiprices[1], $object->multiprices_base_type[1], $user, (empty($object->multiprices_tva_tx[1])?0:$object->multiprices_tva_tx[1]), $object->multiprices_min[1], 1); } else { $object->updatePrice($object->price, $object->price_base_type, $user, $object->tva_tx, $object->price_min); } $result = $db->query($sql); $num = $db->num_rows($result); } if ($num > 0) { // Default prices or // Log of previous customer prices $backbutton='<a class="butAction" href="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '">' . $langs->trans("Back") . '</a>'; if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) print_barre_liste($langs->trans("DefaultPrice"), 0, $_SERVER["PHP_SELF"], '', '', '', $backbutton, 0, $num, 'title_accountancy.png'); else print_barre_liste($langs->trans("PriceByCustomerLog"), 0, $_SERVER["PHP_SELF"], '', '', '', '', 0, $num, 'title_accountancy.png'); //if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) print_barre_liste($langs->trans("DefaultPrice"),'','','','','',$backbutton, 0, 0, 'title_accountancy.png'); //else print_barre_liste($langs->trans("PriceByCustomerLog"),'','','','','','', 0, 0, 'title_accountancy.png'); print '<div class="div-table-responsive">'; print '<table class="noborder" width="100%">'; print '<tr class="liste_titre">'; print '<td>' . $langs->trans("AppliedPricesFrom") . '</td>'; if (! empty($conf->global->PRODUIT_MULTIPRICES) || ! empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) { print '<td class="center">' . $langs->trans("PriceLevel") . '</td>'; } if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY) || ! empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) { print '<td class="center">' . $langs->trans("Type") . '</td>'; } print '<td class="center">' . $langs->trans("PriceBase") . '</td>'; print $conf->global->PRODUIT_MULTIPRICES_USE_VAT_PER_LEVEL; if (empty($conf->global->PRODUIT_MULTIPRICES) && empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) print '<td class="right">' . $langs->trans("DefaultTaxRate") . '</td>'; print '<td class="right">' . $langs->trans("HT") . '</td>'; print '<td class="right">' . $langs->trans("TTC") . '</td>'; if (! empty($conf->dynamicprices->enabled)) { print '<td class="right">' . $langs->trans("PriceExpressionSelected") . '</td>'; } print '<td class="right">' . $langs->trans("MinPrice") . ' ' . $langs->trans("HT") . '</td>'; print '<td class="right">' . $langs->trans("MinPrice") . ' ' . $langs->trans("TTC") . '</td>'; print '<td class="right">' . $langs->trans("ChangedBy") . '</td>'; if ($user->rights->produit->supprimer) print '<td class="right"> </td>'; print '</tr>'; $notfirstlineforlevel=array(); $i = 0; while ($i < $num) { $objp = $db->fetch_object($result); print '<tr class="oddeven">'; // Date print "<td>" . dol_print_date($db->jdate($objp->dp), "dayhour") . "</td>"; // Price level if (! empty($conf->global->PRODUIT_MULTIPRICES) || ! empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) { print '<td class="center">' . $objp->price_level . "</td>"; } // Price by quantity if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY) || ! empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) { $type = ($objp->price_by_qty == 1) ? 'PriceByQuantity' : 'Standard'; print '<td class="center">' . $langs->trans($type) . "</td>"; } print '<td class="center">'; if (empty($objp->price_by_qty)) { print $langs->trans($objp->price_base_type); } print "</td>"; if (empty($conf->global->PRODUIT_MULTIPRICES) && empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) { print '<td class="right">'; if (empty($objp->price_by_qty)) { $positiverates=''; if (price2num($objp->tva_tx)) $positiverates.=($positiverates?'/':'').price2num($objp->tva_tx); if (price2num($objp->localtax1_type)) $positiverates.=($positiverates?'/':'').price2num($objp->localtax1_tx); if (price2num($objp->localtax2_type)) $positiverates.=($positiverates?'/':'').price2num($objp->localtax2_tx); if (empty($positiverates)) $positiverates='0'; echo vatrate($positiverates.($objp->default_vat_code?' ('.$objp->default_vat_code.')':''), '%', $objp->tva_npr); /* if ($objp->default_vat_code) { print vatrate($objp->tva_tx, true) . ' ('.$objp->default_vat_code.')'; } else print vatrate($objp->tva_tx, true, $objp->recuperableonly);*/ } print "</td>"; } // Price if (! empty($objp->fk_price_expression) && ! empty($conf->dynamicprices->enabled)) { $price_expression = new PriceExpression($db); $res = $price_expression->fetch($objp->fk_price_expression); $title = $price_expression->title; print '<td class="right"></td>'; print '<td class="right"></td>'; print '<td class="right">' . $title . "</td>"; } else { print '<td class="right">'; if (empty($objp->price_by_qty)) { print ($objp->price_base_type != 'TTC' ? price($objp->price) : ''); } print "</td>"; print '<td class="right">'; if (empty($objp->price_by_qty)) { print ($objp->price_base_type == 'TTC' ? price($objp->price_ttc) : ''); } print "</td>"; if (! empty($conf->dynamicprices->enabled)) { //Only if module is enabled print '<td class="right"></td>'; } } print '<td class="right">'; if (empty($objp->price_by_qty)) { print ($objp->price_base_type != 'TTC' ? price($objp->price_min) : ''); } print '</td>'; print '<td class="right">'; if (empty($objp->price_by_qty)) { print ($objp->price_base_type == 'TTC' ? price($objp->price_min_ttc) : ''); } print '</td>'; // User print '<td class="right"><a href="' . DOL_URL_ROOT . '/user/card.php?id=' . $objp->user_id . '">' . img_object($langs->trans("ShowUser"), 'user') . ' ' . $objp->login . '</a></td>'; // Action if ($user->rights->produit->supprimer) { $candelete=0; if (! empty($conf->global->PRODUIT_MULTIPRICES) || ! empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES)) { if (empty($notfirstlineforlevel[$objp->price_level])) $notfirstlineforlevel[$objp->price_level]=1; else $candelete=1; } elseif ($i > 0) $candelete=1; print '<td class="right">'; if ($candelete) { print '<a href="' . $_SERVER["PHP_SELF"] . '?action=delete&id=' . $object->id . '&lineid=' . $objp->rowid . '">'; print img_delete(); print '</a>'; } else print ' '; // Can not delete last price (it's current price) print '</td>'; } print "</tr>\n"; $i++; } $db->free($result); print "</table>"; print '</div>'; print "<br>"; } print '</div>'; } else { dol_print_error($db); } } // Add area to show/add/edit a price for a dedicated customer if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) { $prodcustprice = new Productcustomerprice($db); $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 = $conf->liste_limit * $page; $pageprev = $page - 1; $pagenext = $page + 1; if (! $sortorder) $sortorder = "ASC"; if (! $sortfield) $sortfield = "soc.nom"; // Build filter to diplay only concerned lines $filter = array('t.fk_product' => $object->id); if (! empty($search_soc)) { $filter['soc.nom'] = $search_soc; } if ($action == 'add_customer_price') { // Form to add a new customer price $maxpricesupplier = $object->min_recommended_price(); print load_fiche_titre($langs->trans('PriceByCustomer')); print '<form action="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '" method="POST">'; print '<input type="hidden" name="token" value="' . $_SESSION ['newtoken'] . '">'; print '<input type="hidden" name="action" value="add_customer_price_confirm">'; print '<input type="hidden" name="id" value="' . $object->id . '">'; dol_fiche_head(); print '<table class="border" width="100%">'; print '<tr>'; print '<td class="fieldrequired">' . $langs->trans('ThirdParty') . '</td>'; print '<td>'; print $form->select_company('', 'socid', 's.client IN (1,2,3)', 'SelectThirdParty', 0, 0, array(), 0, 'minwidth300'); print '</td>'; print '</tr>'; // VAT print '<tr><td class="fieldrequired">' . $langs->trans("DefaultTaxRate") . '</td><td>'; print $form->load_tva("tva_tx", $object->default_vat_code ? $object->tva_tx.' ('.$object->default_vat_code.')' : $object->tva_tx, $mysoc, '', $object->id, $object->tva_npr, $object->type, false, 1); print '</td></tr>'; // Price base print '<tr><td class="fieldrequired">'; print $langs->trans('PriceBase'); print '</td>'; print '<td>'; print $form->selectPriceBaseType($object->price_base_type, "price_base_type"); print '</td>'; print '</tr>'; // Price print '<tr><td class="fieldrequired">'; $text = $langs->trans('SellingPrice'); print $form->textwithpicto($text, $langs->trans("PrecisionUnitIsLimitedToXDecimals", $conf->global->MAIN_MAX_DECIMALS_UNIT), 1, 1); print '</td><td>'; if ($object->price_base_type == 'TTC') { print '<input name="price" size="10" value="' . price($object->price_ttc) . '">'; } else { print '<input name="price" size="10" value="' . price($object->price) . '">'; } print '</td></tr>'; // Price minimum print '<tr><td>'; $text = $langs->trans('MinPrice'); print $form->textwithpicto($text, $langs->trans("PrecisionUnitIsLimitedToXDecimals", $conf->global->MAIN_MAX_DECIMALS_UNIT), 1, 1); if ($object->price_base_type == 'TTC') { print '<td><input name="price_min" size="10" value="' . price($object->price_min_ttc) . '">'; } else { print '<td><input name="price_min" size="10" value="' . price($object->price_min) . '">'; } if ( !empty($conf->global->PRODUCT_MINIMUM_RECOMMENDED_PRICE)) { print '<td class="left">'.$langs->trans("MinimumRecommendedPrice", price($maxpricesupplier, 0, '', 1, -1, -1, 'auto')).' '.img_warning().'</td>'; } print '</td></tr>'; print '</table>'; dol_fiche_end(); print '<div class="center">'; // Update all child soc print '<div class="marginbottomonly">'; print '<input type="checkbox" name="updatechildprice" value="1"> '; print $langs->trans('ForceUpdateChildPriceSoc'); print '</div>'; print '<input type="submit" class="button" value="' . $langs->trans("Save") . '">'; print ' '; print '<input type="submit" class="button" name="cancel" value="' . $langs->trans("Cancel") . '">'; print '</div>'; print '</form>'; } elseif ($action == 'edit_customer_price') { // Edit mode $maxpricesupplier = $object->min_recommended_price(); print load_fiche_titre($langs->trans('PriceByCustomer')); $result = $prodcustprice->fetch(GETPOST('lineid', 'int')); if ($result < 0) { setEventMessages($prodcustprice->error, $prodcustprice->errors, 'errors'); } print '<form action="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '" method="POST">'; print '<input type="hidden" name="token" value="' . $_SESSION ['newtoken'] . '">'; print '<input type="hidden" name="action" value="update_customer_price_confirm">'; print '<input type="hidden" name="lineid" value="' . $prodcustprice->id . '">'; dol_fiche_head(); print '<table class="border" width="100%">'; print '<tr>'; print '<td class="titlefield">' . $langs->trans('ThirdParty') . '</td>'; $staticsoc = new Societe($db); $staticsoc->fetch($prodcustprice->fk_soc); print "<td colspan='2'>" . $staticsoc->getNomUrl(1) . "</td>"; print '</tr>'; // VAT print '<tr><td>' . $langs->trans("DefaultTaxRate") . '</td><td colspan="2">'; print $form->load_tva("tva_tx", $prodcustprice->default_vat_code ? $prodcustprice->tva_tx.' ('.$prodcustprice->default_vat_code.')' : $prodcustprice->tva_tx, $mysoc, '', $object->id, $prodcustprice->recuperableonly, $object->type, false, 1); print '</td></tr>'; // Price base print '<tr><td>'; print $langs->trans('PriceBase'); print '</td>'; print '<td>'; print $form->selectPriceBaseType($prodcustprice->price_base_type, "price_base_type"); print '</td>'; print '</tr>'; // Price print '<tr><td>'; $text = $langs->trans('SellingPrice'); print $form->textwithpicto($text, $langs->trans("PrecisionUnitIsLimitedToXDecimals", $conf->global->MAIN_MAX_DECIMALS_UNIT), 1, 1); print '</td><td>'; if ($prodcustprice->price_base_type == 'TTC') { print '<input name="price" size="10" value="' . price($prodcustprice->price_ttc) . '">'; } else { print '<input name="price" size="10" value="' . price($prodcustprice->price) . '">'; } print '</td></tr>'; // Price minimum print '<tr><td>'; $text = $langs->trans('MinPrice'); print $form->textwithpicto($text, $langs->trans("PrecisionUnitIsLimitedToXDecimals", $conf->global->MAIN_MAX_DECIMALS_UNIT), 1, 1); print '</td><td>'; if ($prodcustprice->price_base_type == 'TTC') { print '<input name="price_min" size="10" value="' . price($prodcustprice->price_min_ttc) . '">'; } else { print '<input name="price_min" size="10" value="' . price($prodcustprice->price_min) . '">'; } print '</td>'; if ( !empty($conf->global->PRODUCT_MINIMUM_RECOMMENDED_PRICE)) { print '<td class="left">'.$langs->trans("MinimumRecommendedPrice", price($maxpricesupplier, 0, '', 1, -1, -1, 'auto')).' '.img_warning().'</td>'; } print '</tr>'; // Update all child soc print '<tr><td>'; print '</td>'; print '<td>'; print '</td>'; print '</tr>'; print '</table>'; dol_fiche_end(); print '<div class="center">'; print '<div class="marginbottomonly">'; print '<input type="checkbox" name="updatechildprice" value="1"> '; print $langs->trans('ForceUpdateChildPriceSoc'); print "</div>"; print '<input type="submit" class="button" value="' . $langs->trans("Save") . '">'; print ' '; print '<input type="submit" class="button" name="cancel" value="' . $langs->trans("Cancel") . '">'; print '</div>'; print '<br></form>'; } elseif ($action == 'showlog_customer_price') { // List of all log of prices by customers print '<!-- list of all log of prices per customer -->'."\n"; $filter = array('t.fk_product' => $object->id,'t.fk_soc' => GETPOST('socid', 'int')); // Count total nb of records $nbtotalofrecords = ''; if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { $nbtotalofrecords = $prodcustprice->fetch_all_log($sortorder, $sortfield, $conf->liste_limit, $offset, $filter); } $result = $prodcustprice->fetch_all_log($sortorder, $sortfield, $conf->liste_limit, $offset, $filter); if ($result < 0) { setEventMessages($prodcustprice->error, $prodcustprice->errors, 'errors'); } $option = '&socid=' . GETPOST('socid', 'int') . '&id=' . $object->id; $staticsoc = new Societe($db); $staticsoc->fetch(GETPOST('socid', 'int')); $title=$langs->trans('PriceByCustomerLog'); $title.=' - '.$staticsoc->getNomUrl(1); $backbutton='<a class="justalink" href="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '">' . $langs->trans("Back") . '</a>'; print_barre_liste($title, $page, $_SERVER['PHP_SELF'], $option, $sortfield, $sortorder, $backbutton, count($prodcustprice->lines), $nbtotalofrecords, 'title_accountancy.png'); if (count($prodcustprice->lines) > 0) { print '<form action="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '" method="POST">'; print '<input type="hidden" name="id" value="' . $object->id . '">'; print '<table class="noborder" width="100%">'; print '<tr class="liste_titre">'; print '<td>' . $langs->trans("ThirdParty") . '</td>'; print '<td>' . $langs->trans("AppliedPricesFrom") . '</td>'; print '<td class="center">' . $langs->trans("PriceBase") . '</td>'; print '<td class="right">' . $langs->trans("DefaultTaxRate") . '</td>'; print '<td class="right">' . $langs->trans("HT") . '</td>'; if ($mysoc->localtax1_assuj == "1" || $mysoc->localtax2_assuj == "1") { //print '<td class="right">' . $langs->trans("INCVATONLY") . '</td>'; print '<td class="right">' . $langs->trans("INCT") . '</td>'; } else { print '<td class="right">' . $langs->trans("TTC") . '</td>'; } print '<td class="right">' . $langs->trans("MinPrice") . ' ' . $langs->trans("HT") . '</td>'; print '<td class="right">' . $langs->trans("MinPrice") . ' ' . $langs->trans("TTC") . '</td>'; print '<td class="right">' . $langs->trans("ChangedBy") . '</td>'; print '<td> </td>'; print '</tr>'; foreach ($prodcustprice->lines as $line) { // Date $staticsoc = new Societe($db); $staticsoc->fetch($line->fk_soc); $tva_tx = $line->default_vat_code ? $line->tva_tx.' ('.$line->default_vat_code.')' : $line->tva_tx; // Line for default price if ($line->price_base_type=='HT') { $pu=$line->price; } else { $pu=$line->price_ttc; } // Local tax is not saved into table of product. We use value linked to VAT code. $localtaxarray=getLocalTaxesFromRate($line->tva_tx.($line->default_vat_code?' ('.$line->default_vat_code.')':''), 0, $staticsoc, $mysoc); // Define part of HT, VAT, TTC $resultarray=calcul_price_total(1, $pu, 0, $line->tva_tx, 1, 1, 0, $line->price_base_type, $line->recuperableonly, $object->type, $mysoc, $localtaxarray); // Calcul du total ht sans remise $total_ht = $resultarray[0]; $total_vat = $resultarray[1]; $total_localtax1 = $resultarray[9]; $total_localtax2 = $resultarray[10]; $total_ttc = $resultarray[2]; print '<tr class="oddeven">'; print "<td>" . $staticsoc->getNomUrl(1) . "</td>"; print "<td>" . dol_print_date($line->datec, "dayhour") . "</td>"; print '<td class="center">' . $langs->trans($line->price_base_type) . "</td>"; print '<td class="right">'; $positiverates=''; if (price2num($line->tva_tx)) $positiverates.=($positiverates?'/':'').price2num($line->tva_tx); if (price2num($line->localtax1_type)) $positiverates.=($positiverates?'/':'').price2num($line->localtax1_tx); if (price2num($line->localtax2_type)) $positiverates.=($positiverates?'/':'').price2num($line->localtax2_tx); if (empty($positiverates)) $positiverates='0'; echo vatrate($positiverates.($line->default_vat_code?' ('.$line->default_vat_code.')':''), '%', ($line->tva_npr?$line->tva_npr:$line->recuperableonly)); //. vatrate($tva_tx, true, $line->recuperableonly) . print "</td>"; print '<td class="right">' . price($line->price) . "</td>"; if ($mysoc->localtax1_assuj == "1" || $mysoc->localtax2_assuj == "1") { //print '<td class="right">' . price($line->price_ttc) . "</td>"; print '<td class="right">' . price($resultarray[2]) . '</td>'; } else { print '<td class="right">' . price($line->price_ttc) . "</td>"; } print '<td class="right">' . price($line->price_min) . '</td>'; print '<td class="right">' . price($line->price_min_ttc) . '</td>'; // User $userstatic = new User($db); $userstatic->fetch($line->fk_user); print '<td class="right">'; print $userstatic->getLoginUrl(1); print '</td>'; print '</tr>'; } print "</table>"; } else { print $langs->trans('None'); } } elseif ($action != 'showlog_default_price' && $action != 'edit_price') { // List of all prices by customers print '<!-- list of all prices per customer -->'."\n"; // Count total nb of records $nbtotalofrecords = ''; if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { $nbtotalofrecords = $prodcustprice->fetch_all($sortorder, $sortfield, 0, 0, $filter); } $result = $prodcustprice->fetch_all($sortorder, $sortfield, $conf->liste_limit, $offset, $filter); if ($result < 0) { setEventMessages($prodcustprice->error, $prodcustprice->errors, 'errors'); } $option = '&search_soc=' . $search_soc . '&id=' . $object->id; print_barre_liste($langs->trans('PriceByCustomer'), $page, $_SERVER ['PHP_SELF'], $option, $sortfield, $sortorder, '', count($prodcustprice->lines), $nbtotalofrecords, 'title_accountancy.png'); print '<form action="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '" method="POST">'; print '<input type="hidden" name="id" value="' . $object->id . '">'; print '<table class="noborder" width="100%">'; if (count($prodcustprice->lines) > 0 || $search_soc) { $colspan=8; //if ($mysoc->localtax1_assuj == "1" || $mysoc->localtax2_assuj == "1") $colspan++; print '<tr class="liste_titre">'; print '<td class="liste_titre"><input type="text" class="flat" name="search_soc" value="' . $search_soc . '" size="20"></td>'; print '<td class="liste_titre" colspan="'.$colspan.'"> </td>'; // Print the search button print '<td class="liste_titre maxwidthsearch">'; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print '</td>'; print '</tr>'; } print '<tr class="liste_titre">'; print '<td>' . $langs->trans("ThirdParty") . '</td>'; print '<td>' . $langs->trans("AppliedPricesFrom") . '</td>'; print '<td class="center">' . $langs->trans("PriceBase") . '</td>'; print '<td class="right">' . $langs->trans("DefaultTaxRate") . '</td>'; print '<td class="right">' . $langs->trans("HT") . '</td>'; if ($mysoc->localtax1_assuj == "1" || $mysoc->localtax2_assuj == "1") { //print '<td class="right">' . $langs->trans("INCVATONLY") . '</td>'; print '<td class="right">' . $langs->trans("INCT") . '</td>'; } else { print '<td class="right">' . $langs->trans("TTC") . '</td>'; } print '<td class="right">' . $langs->trans("MinPrice") . ' ' . $langs->trans("HT") . '</td>'; print '<td class="right">' . $langs->trans("MinPrice") . ' ' . $langs->trans("TTC") . '</td>'; print '<td class="right">' . $langs->trans("ChangedBy") . '</td>'; print '<td> </td>'; print '</tr>'; // Line for default price if ($object->price_base_type=='HT') { $pu=$object->price; } else { $pu=$object->price_ttc; } // Local tax is not saved into table of product. We use value linked to VAT code. $localtaxarray=getLocalTaxesFromRate($object->tva_tx.($object->default_vat_code?' ('.$object->default_vat_code.')':''), 0, $mysoc, $mysoc); // Define part of HT, VAT, TTC $resultarray=calcul_price_total(1, $pu, 0, $object->tva_tx, 1, 1, 0, $object->price_base_type, $object->recuperableonly, $object->type, $mysoc, $localtaxarray); // Calcul du total ht sans remise $total_ht = $resultarray[0]; $total_vat = $resultarray[1]; $total_localtax1 = $resultarray[9]; $total_localtax2 = $resultarray[10]; $total_ttc = $resultarray[2]; print '<tr class="oddeven">'; print "<td>" . $langs->trans("Default") . "</td>"; print "<td>" . "</td>"; print '<td class="center">' . $langs->trans($object->price_base_type) . "</td>"; print '<td class="right">'; $positiverates=''; if (price2num($object->tva_tx)) $positiverates.=($positiverates?'/':'').price2num($object->tva_tx); if (price2num($object->localtax1_type)) $positiverates.=($positiverates?'/':'').price2num($object->localtax1_tx); if (price2num($object->localtax2_type)) $positiverates.=($positiverates?'/':'').price2num($object->localtax2_tx); if (empty($positiverates)) $positiverates='0'; echo vatrate($positiverates.($object->default_vat_code?' ('.$object->default_vat_code.')':''), '%', $object->tva_npr); //print vatrate($object->tva_tx, true, $object->tva_npr); //print $object->default_vat_code?' ('.$object->default_vat_code.')':''; print "</td>"; print '<td class="right">' . price($object->price) . "</td>"; if ($mysoc->localtax1_assuj == "1" || $mysoc->localtax2_assuj == "1") { //print '<td class="right">' . price($object->price_ttc) . "</td>"; print '<td class="right">' . price($resultarray[2]) . '</td>'; } else { print '<td class="right">' . price($object->price_ttc) . "</td>"; } print '<td class="right">' . price($object->price_min) . '</td>'; print '<td class="right">' . price($object->price_min_ttc) . '</td>'; print '<td class="right">'; print '</td>'; if ($user->rights->produit->supprimer || $user->rights->service->supprimer) { print '<td class="right">'; print '<a href="' . $_SERVER["PHP_SELF"] . '?action=showlog_default_price&id=' . $object->id . '">'; print img_info($langs->trans('PriceByCustomerLog')); print '</a>'; print ' '; print '<a href="' . $_SERVER["PHP_SELF"] . '?action=edit_price&id=' . $object->id . '">'; print img_edit('default', 0, 'style="vertical-align: middle;"'); print '</a>'; print ' '; print '</td>'; } print "</tr>\n"; if (count($prodcustprice->lines) > 0) { foreach ($prodcustprice->lines as $line) { // Date $staticsoc = new Societe($db); $staticsoc->fetch($line->fk_soc); $tva_tx = $line->default_vat_code ? $line->tva_tx.' ('.$line->default_vat_code.')' : $line->tva_tx; // Line for default price if ($line->price_base_type=='HT') { $pu=$line->price; } else { $pu=$line->price_ttc; } // Local tax is not saved into table of product. We use value linked to VAT code. $localtaxarray=getLocalTaxesFromRate($line->tva_tx.($line->default_vat_code?' ('.$line->default_vat_code.')':''), 0, $staticsoc, $mysoc); // Define part of HT, VAT, TTC $resultarray=calcul_price_total(1, $pu, 0, $line->tva_tx, 1, 1, 0, $line->price_base_type, $line->recuperableonly, $object->type, $mysoc, $localtaxarray); // Calcul du total ht sans remise $total_ht = $resultarray[0]; $total_vat = $resultarray[1]; $total_localtax1 = $resultarray[9]; $total_localtax2 = $resultarray[10]; $total_ttc = $resultarray[2]; print '<tr class="oddeven">'; print "<td>" . $staticsoc->getNomUrl(1) . "</td>"; print "<td>" . dol_print_date($line->datec, "dayhour") . "</td>"; print '<td class="center">' . $langs->trans($line->price_base_type) . "</td>"; print '<td class="right">'; $positiverates=''; if (price2num($line->tva_tx)) $positiverates.=($positiverates?'/':'').price2num($line->tva_tx); if (price2num($line->localtax1_type)) $positiverates.=($positiverates?'/':'').price2num($line->localtax1_tx); if (price2num($line->localtax2_type)) $positiverates.=($positiverates?'/':'').price2num($line->localtax2_tx); if (empty($positiverates)) $positiverates='0'; echo vatrate($positiverates.($line->default_vat_code?' ('.$line->default_vat_code.')':''), '%', ($line->tva_npr?$line->tva_npr:$line->recuperableonly)); print "</td>"; print '<td class="right">' . price($line->price) . "</td>"; if ($mysoc->localtax1_assuj == "1" || $mysoc->localtax2_assuj == "1") { //print '<td class="right">' . price($line->price_ttc) . "</td>"; print '<td class="right">' . price($resultarray[2]) . '</td>'; } else { print '<td class="right">' . price($line->price_ttc) . "</td>"; } print '<td class="right">' . price($line->price_min) . '</td>'; print '<td class="right">' . price($line->price_min_ttc) . '</td>'; // User $userstatic = new User($db); $userstatic->fetch($line->fk_user); print '<td class="right">'; print $userstatic->getLoginUrl(1); print '</td>'; // Todo Edit or delete button // Action if ($user->rights->produit->supprimer || $user->rights->service->supprimer) { print '<td class="right nowraponall">'; print '<a href="' . $_SERVER["PHP_SELF"] . '?action=showlog_customer_price&id=' . $object->id . '&socid=' . $line->fk_soc . '">'; print img_info($langs->trans('PriceByCustomerLog')); print '</a>'; print ' '; print '<a href="' . $_SERVER["PHP_SELF"] . '?action=edit_customer_price&id=' . $object->id . '&lineid=' . $line->id . '">'; print img_edit('default', 0, 'style="vertical-align: middle;"'); print '</a>'; print ' '; print '<a href="' . $_SERVER["PHP_SELF"] . '?action=delete_customer_price&id=' . $object->id . '&lineid=' . $line->id . '">'; print img_delete('default', 'style="vertical-align: middle;"'); print '</a>'; print '</td>'; } print "</tr>\n"; } } /*else { $colspan=9; if ($user->rights->produit->supprimer || $user->rights->service->supprimer) $colspan+=1; print "<tr ".$bc[false].">"; print '<td colspan="'.$colspan.'">'.$langs->trans('None').'</td>'; print "</tr>"; }*/ print "</table>"; print "</form>"; } } // End of page llxFooter(); $db->close();