dolibarr 21.0.0-beta
price_suppliers.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2021 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2004 Eric Seigne <eric.seigne@ryxeo.com>
5 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
6 * Copyright (C) 2010-2012 Juanjo Menent <jmenent@2byte.es>
7 * Copyright (C) 2012 Christophe Battarel <christophe.battarel@altairis.fr>
8 * Copyright (C) 2014 Ion Agorria <ion@agorria.com>
9 * Copyright (C) 2015 Alexandre Spangaro <aspangaro@open-dsi.fr>
10 * Copyright (C) 2016 Ferran Marcet <fmarcet@2byte.es>
11 * Copyright (C) 2019-2024 Frédéric France <frederic.france@free.fr>
12 * Copyright (C) 2019 Tim Otte <otte@meuser.it>
13 * Copyright (C) 2020 Pierre Ardoin <mapiolca@me.com>
14 * Copyright (C) 2023 Joachim Kueter <git-jk@bloxera.com>
15 *
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License as published by
18 * the Free Software Foundation; either version 3 of the License, or
19 * (at your option) any later version.
20 *
21 * This program is distributed in the hope that it will be useful,
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 * GNU General Public License for more details.
25 *
26 * You should have received a copy of the GNU General Public License
27 * along with this program. If not, see <https://www.gnu.org/licenses/>.
28 */
29
36// Load Dolibarr environment
37require '../main.inc.php';
38require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php';
39require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
40require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
41require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
42require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php';
43require_once DOL_DOCUMENT_ROOT.'/product/dynamic_price/class/price_expression.class.php';
44require_once DOL_DOCUMENT_ROOT.'/product/dynamic_price/class/price_parser.class.php';
45if (isModEnabled('barcode')) {
46 dol_include_once('/core/class/html.formbarcode.class.php');
47}
48
58// Load translation files required by the page
59$langs->loadLangs(array('products', 'suppliers', 'bills', 'margins', 'stocks'));
60
61$id = GETPOSTINT('id');
62$ref = GETPOST('ref', 'alpha');
63$rowid = GETPOSTINT('rowid');
64$action = GETPOST('action', 'aZ09');
65$cancel = GETPOST('cancel', 'alpha');
66$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'pricesuppliercard';
67
68$socid = GETPOSTINT('socid');
69$cost_price = GETPOSTFLOAT('cost_price');
70$pmp = GETPOSTFLOAT('pmp');
71
72$backtopage = GETPOST('backtopage', 'alpha');
73$error = 0;
74
75$extrafields = new ExtraFields($db);
76
77// If socid provided by ajax company selector
78if (GETPOSTINT('search_fourn_id')) {
79 $_GET['id_fourn'] = GETPOSTINT('search_fourn_id'); // Keep set to $_GET an $_POST. Used later.
80 $_POST['id_fourn'] = GETPOSTINT('search_fourn_id'); // Keep set to $_GET an $_POST. Used later.
81}
82
83// Security check
84$fieldvalue = (!empty($id) ? $id : (!empty($ref) ? $ref : ''));
85$fieldtype = (!empty($ref) ? 'ref' : 'rowid');
86if ($user->socid) {
87 $socid = $user->socid;
88}
89
90if (!$user->hasRight('fournisseur', 'lire') && (!isModEnabled('margin') && !$user->hasRight("margin", "liretous"))) {
92}
93
94$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
95$sortfield = GETPOST('sortfield', 'aZ09comma');
96$sortorder = GETPOST('sortorder', 'aZ09comma');
97$page = GETPOSTINT("page") ? GETPOSTINT("page") : 0;
98if (empty($page) || $page == -1) {
99 $page = 0;
100} // If $page is not defined, or '' or -1
101$offset = $limit * $page;
102$pageprev = $page - 1;
103$pagenext = $page + 1;
104if (!$sortfield) {
105 $sortfield = "s.nom";
106}
107if (!$sortorder) {
108 $sortorder = "ASC";
109}
110
111// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
112$hookmanager->initHooks(array('pricesuppliercard', 'globalcard'));
113
114$object = new ProductFournisseur($db);
115$prod = new Product($db);
116if ($id > 0 || $ref) {
117 $object->fetch($id, $ref);
118 $prod->fetch($id, $ref);
119}
120
121$usercanread = (($object->type == Product::TYPE_PRODUCT && $user->hasRight('produit', 'lire')) || ($object->type == Product::TYPE_SERVICE && $user->hasRight('service', 'lire')));
122$usercancreate = (($object->type == Product::TYPE_PRODUCT && $user->hasRight('produit', 'creer')) || ($object->type == Product::TYPE_SERVICE && $user->hasRight('service', 'creer')));
123
124if ($object->id > 0) {
125 if ($object->type == $object::TYPE_PRODUCT) {
126 restrictedArea($user, 'produit', $object->id, 'product&product', '', '');
127 }
128 if ($object->type == $object::TYPE_SERVICE) {
129 restrictedArea($user, 'service', $object->id, 'product&product', '', '');
130 }
131} else {
132 restrictedArea($user, 'produit|service', $fieldvalue, 'product&product', '', '', $fieldtype);
133}
134
135
136/*
137 * Actions
138 */
139
140if ($cancel) {
141 $action = '';
142}
143
144$parameters = array('socid'=>$socid, 'id_prod'=>$id);
145$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
146if ($reshook < 0) {
147 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
148}
149
150if (empty($reshook)) {
151 if ($action == 'setcost_price' && $usercancreate) {
152 if ($id) {
153 $result = $object->fetch($id);
154 //Need dol_clone methode 1 (same object class) because update product use hasbatch method on oldcopy
155 $object->oldcopy = dol_clone($object, 1);
156 $object->cost_price = $cost_price;
157 $result = $object->update($object->id, $user);
158 if ($result > 0) {
159 setEventMessages($langs->trans("RecordSaved"), null, 'mesgs');
160 $action = '';
161 } else {
162 $error++;
163 setEventMessages($object->error, $object->errors, 'errors');
164 }
165 }
166 }
167 if ($action == 'setpmp' && $usercancreate) {
168 if ($id) {
169 $result = $object->fetch($id);
170 $object->pmp = $pmp;
171 $sql = "UPDATE ".MAIN_DB_PREFIX."product SET pmp = ".((float) $object->pmp)." WHERE rowid = ".((int) $id);
172 $resql = $db->query($sql);
173 //$result = $object->update($object->id, $user);
174 if ($resql) {
175 setEventMessages($langs->trans("RecordSaved"), null, 'mesgs');
176 $action = '';
177 } else {
178 $error++;
179 setEventMessages($object->error, $object->errors, 'errors');
180 }
181 }
182 }
183
184 if ($action == 'confirm_remove_pf' && $usercancreate) {
185 if ($rowid) { // id of product supplier price to remove
186 $action = '';
187 $result = $object->remove_product_fournisseur_price($rowid);
188 if ($result > 0) {
189 $db->query("DELETE FROM ".MAIN_DB_PREFIX."product_fournisseur_price_extrafields WHERE fk_object = ".((int) $rowid));
190 setEventMessages($langs->trans("PriceRemoved"), null, 'mesgs');
191 } else {
192 $error++;
193 setEventMessages($object->error, $object->errors, 'errors');
194 }
195 }
196 }
197
198 if ($action == 'save_price' && $usercancreate) {
199 $ref_fourn_price_id = GETPOSTINT('ref_fourn_price_id');
200 $id_fourn = GETPOST("id_fourn");
201 if (empty($id_fourn)) {
202 $id_fourn = GETPOST("search_id_fourn");
203 }
204 $ref_fourn = GETPOST("ref_fourn");
205 if (empty($ref_fourn)) {
206 $ref_fourn = GETPOST("search_ref_fourn");
207 }
208 $ref_fourn_old = GETPOST("ref_fourn_old");
209 if (empty($ref_fourn_old)) {
210 $ref_fourn_old = $ref_fourn;
211 }
212 $quantity = price2num(GETPOST("qty", 'alphanohtml'), 'MS');
213 $remise_percent = price2num(GETPOST('remise_percent', 'alpha'));
214
215 $npr = preg_match('/\*/', GETPOST('tva_tx', 'alpha')) ? 1 : 0;
216 $tva_tx = str_replace('*', '', GETPOST('tva_tx', 'alpha'));
217 if (!preg_match('/\‍((.*)\‍)/', $tva_tx)) {
218 $tva_tx = price2num($tva_tx);
219 }
220
221 $price_expression = GETPOSTINT('eid') ? GETPOSTINT('eid') : ''; // Discard expression if not in expression mode
222 $delivery_time_days = GETPOSTINT('delivery_time_days') ? GETPOSTINT('delivery_time_days') : '';
223 $supplier_reputation = GETPOST('supplier_reputation');
224 $supplier_description = GETPOST('supplier_description', 'restricthtml');
225 $barcode = GETPOST('barcode', 'alpha');
226 $fk_barcode_type = GETPOSTINT('fk_barcode_type');
227 $packaging = price2num(GETPOST("packaging", 'alphanohtml'), 'MS');
228
229 if ($tva_tx == '') {
230 $error++;
231 $langs->load("errors");
232 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("VATRateForSupplierProduct")), null, 'errors');
233 }
234 if (!is_numeric($tva_tx)) {
235 $error++;
236 $langs->load("errors");
237 setEventMessages($langs->trans("ErrorFieldMustBeANumeric", $langs->transnoentities("VATRateForSupplierProduct")), null, 'errors');
238 }
239 if (empty($quantity)) {
240 $error++;
241 $langs->load("errors");
242 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Qty")), null, 'errors');
243 }
244 if (empty($ref_fourn)) {
245 $error++;
246 $langs->load("errors");
247 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("RefSupplier")), null, 'errors');
248 }
249 if ($id_fourn <= 0) {
250 $error++;
251 $langs->load("errors");
252 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Supplier")), null, 'errors');
253 }
254 if (price2num(GETPOST("price")) < 0 || GETPOST("price") == '') {
255 if ($price_expression === '') { // Return error of missing price only if price_expression not set
256 $error++;
257 $langs->load("errors");
258 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Price")), null, 'errors');
259 } else {
260 $_POST["price"] = 0;
261 }
262 }
263 if (isModEnabled("multicurrency")) {
264 if (!GETPOST("multicurrency_code")) {
265 $error++;
266 $langs->load("errors");
267 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Currency")), null, 'errors');
268 }
269 if (price2num(GETPOST("multicurrency_tx")) <= 0 || GETPOST("multicurrency_tx") == '') {
270 $error++;
271 $langs->load("errors");
272 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("CurrencyRate")), null, 'errors');
273 }
274 if (price2num(GETPOST("multicurrency_price")) < 0 || GETPOST("multicurrency_price") == '') {
275 $error++;
276 $langs->load("errors");
277 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("PriceCurrency")), null, 'errors');
278 }
279 }
280
281 if (!$error) {
282 $db->begin();
283
284 if (empty($ref_fourn_price_id)) {
285 $ret = $object->add_fournisseur($user, $id_fourn, $ref_fourn_old, $quantity); // This insert record with no value for price. Values are update later with update_buyprice
286 if ($ret == -3) {
287 $error++;
288
289 $tmpobject = new Product($db);
290 $tmpobject->fetch($object->product_id_already_linked);
291 $productLink = $tmpobject->getNomUrl(1, 'supplier');
292
293 $texttoshow = $langs->trans("ReferenceSupplierIsAlreadyAssociatedWithAProduct", '{s1}');
294 $texttoshow = str_replace('{s1}', $productLink, $texttoshow);
295 setEventMessages($texttoshow, null, 'errors');
296 } elseif ($ret < 0) {
297 $error++;
298 setEventMessages($object->error, $object->errors, 'errors');
299 }
300 }
301
302 if (!$error) {
303 $supplier = new Fournisseur($db);
304 $result = $supplier->fetch($id_fourn);
305 if (GETPOSTISSET('ref_fourn_price_id')) {
306 $object->fetch_product_fournisseur_price($ref_fourn_price_id);
307 }
308 $extralabels = $extrafields->fetch_name_optionals_label("product_fournisseur_price");
309 $extrafield_values = $extrafields->getOptionalsFromPost("product_fournisseur_price");
310
311 $newprice = GETPOSTFLOAT("price");
312
313 if (empty($packaging)) {
314 $packaging = 1;
315 }
316 /* We can have a purchase ref that need to buy 100 min for a given price and with a packaging of 50.
317 if ($packaging < $quantity) {
318 $packaging = $quantity;
319 }*/
320 $object->packaging = $packaging;
321
322 if (isModEnabled("multicurrency")) {
323 $multicurrency_tx = GETPOSTFLOAT("multicurrency_tx");
324 $multicurrency_price = GETPOSTFLOAT("multicurrency_price");
325 $multicurrency_code = GETPOST("multicurrency_code", 'alpha');
326
327 $ret = $object->update_buyprice($quantity, $newprice, $user, GETPOST("price_base_type"), $supplier, GETPOST("oselDispo"), $ref_fourn, $tva_tx, GETPOST("charges"), $remise_percent, 0, $npr, $delivery_time_days, $supplier_reputation, array(), '', $multicurrency_price, GETPOST("multicurrency_price_base_type"), $multicurrency_tx, $multicurrency_code, $supplier_description, $barcode, $fk_barcode_type, $extrafield_values);
328 } else {
329 $ret = $object->update_buyprice($quantity, $newprice, $user, GETPOST("price_base_type"), $supplier, GETPOST("oselDispo"), $ref_fourn, $tva_tx, GETPOST("charges"), $remise_percent, 0, $npr, $delivery_time_days, $supplier_reputation, array(), '', 0, 'HT', 1, '', $supplier_description, $barcode, $fk_barcode_type, $extrafield_values);
330 }
331 if ($ret < 0) {
332 $error++;
333 setEventMessages($object->error, $object->errors, 'errors');
334 } else {
335 if (isModEnabled('dynamicprices') && $price_expression !== '') {
336 //Check the expression validity by parsing it
337 require_once DOL_DOCUMENT_ROOT.'/product/dynamic_price/class/price_parser.class.php';
338 $priceparser = new PriceParser($db);
339 $object->fk_supplier_price_expression = $price_expression;
340 $price_result = $priceparser->parseProductSupplier($object);
341 if ($price_result < 0) { //Expression is not valid
342 $error++;
343 setEventMessages($priceparser->translatedError(), null, 'errors');
344 }
345 }
346 if (!$error && isModEnabled('dynamicprices')) {
347 //Set the price expression for this supplier price
348 $ret = $object->setSupplierPriceExpression($price_expression);
349 if ($ret < 0) {
350 $error++;
351 setEventMessages($object->error, $object->errors, 'errors');
352 }
353 }
354 }
355 }
356
357 if (!$error) {
358 $db->commit();
359 $action = '';
360 } else {
361 $db->rollback();
362 }
363 } else {
364 $action = 'create_price';
365 }
366 }
367}
368
369
370/*
371 * view
372 */
373
374$form = new Form($db);
375
376$title = $langs->trans('ProductServiceCard');
377$helpurl = '';
378$shortlabel = dol_trunc($object->label, 16);
379if (GETPOST("type") == '0' || ($object->type == Product::TYPE_PRODUCT)) {
380 $title = $langs->trans('Product')." ".$shortlabel." - ".$langs->trans('BuyingPrices');
381 $helpurl = 'EN:Module_Products|FR:Module_Produits|ES:M&oacute;dulo_Productos|DE:Modul_Produkte';
382}
383if (GETPOST("type") == '1' || ($object->type == Product::TYPE_SERVICE)) {
384 $title = $langs->trans('Service')." ".$shortlabel." - ".$langs->trans('BuyingPrices');
385 $helpurl = 'EN:Module_Services_En|FR:Module_Services|ES:M&oacute;dulo_Servicios|DE:Modul_Lesitungen';
386}
387
388llxHeader('', $title, $helpurl, '', 0, 0, '', '', '', 'classforhorizontalscrolloftabs mod-product page-price_suppliers');
389
390if ($id > 0 || $ref) {
391 if ($result) {
392 if ($action == 'ask_remove_pf') {
393 $form = new Form($db);
394 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$id.'&rowid='.$rowid, $langs->trans('DeleteProductBuyPrice'), $langs->trans('ConfirmDeleteProductBuyPrice'), 'confirm_remove_pf', '', 0, 1);
395 echo $formconfirm;
396 }
397
398 if ($action != 'edit' && $action != 're-edit') {
399 $head = product_prepare_head($object);
400 $titre = $langs->trans("CardProduct".$object->type);
401 $picto = ($object->type == Product::TYPE_SERVICE ? 'service' : 'product');
402
403 print dol_get_fiche_head($head, 'suppliers', $titre, -1, $picto);
404
405 $linkback = '<a href="'.DOL_URL_ROOT.'/product/list.php?restore_lastsearch_values=1&type='.$object->type.'">'.$langs->trans("BackToList").'</a>';
406 $object->next_prev_filter = "fk_product_type:=:".((int) $object->type); // usf filter
407
408 $shownav = 1;
409 if ($user->socid && !in_array('product', explode(',', getDolGlobalString('MAIN_MODULES_FOR_EXTERNAL')))) {
410 $shownav = 0;
411 }
412
413 dol_banner_tab($prod, 'ref', $linkback, $shownav, 'ref');
414
415 print '<div class="fichecenter">';
416
417 print '<div class="underbanner clearboth"></div>';
418 print '<table class="border tableforfield centpercent">';
419
420 // Type
421 if (isModEnabled("product") && isModEnabled("service")) {
422 $typeformat = 'select;0:'.$langs->trans("Product").',1:'.$langs->trans("Service");
423 print '<tr><td class="">';
424 print (!getDolGlobalString('PRODUCT_DENY_CHANGE_PRODUCT_TYPE')) ? $form->editfieldkey("Type", 'fk_product_type', $object->type, $object, 0, $typeformat) : $langs->trans('Type');
425 print '</td><td>';
426 print $form->editfieldval("Type", 'fk_product_type', $object->type, $object, 0, $typeformat);
427 print '</td></tr>';
428 }
429
430 // Cost price. Can be used for margin module for option "calculate margin on explicit cost price
431 print '<tr><td>';
432 $textdesc = $langs->trans("CostPriceDescription");
433 $textdesc .= "<br>".$langs->trans("CostPriceUsage");
434 $text = $form->textwithpicto($langs->trans("CostPrice"), $textdesc, 1, 'help', '');
435 print $form->editfieldkey($text, 'cost_price', $object->cost_price, $object, $usercancreate, 'amount:6');
436 print '</td><td>';
437 print $form->editfieldval($text, 'cost_price', $object->cost_price, $object, $usercancreate, 'amount:6');
438 print '</td></tr>';
439
440 // PMP
441 $usercaneditpmp = 0;
442 if (getDolGlobalString('PRODUCT_CAN_EDIT_WAP')) {
443 $usercaneditpmp = $usercancreate;
444 }
445 print '<tr><td class="titlefieldcreate">';
446 $textdesc = $langs->trans("AverageUnitPricePMPDesc");
447 $text = $form->textwithpicto($langs->trans("AverageUnitPricePMPShort"), $textdesc, 1, 'help', '');
448 print $form->editfieldkey($text, 'pmp', $object->pmp, $object, $usercaneditpmp, 'amount:6');
449 print '</td><td>';
450 print $form->editfieldval($text, 'pmp', ($object->pmp > 0 ? $object->pmp : ''), $object, $usercaneditpmp, 'amount:6');
451 if ($object->pmp > 0) {
452 print ' '.$langs->trans("HT");
453 }
454 /*
455 .$form->textwithpicto($langs->trans("AverageUnitPricePMPShort"), $langs->trans("AverageUnitPricePMPDesc")).'</td>';
456 print '<td>';
457 if ($object->pmp > 0) {
458 print price($object->pmp).' '.$langs->trans("HT");
459 }*/
460 print '</td>';
461 print '</tr>';
462
463 // Best buying Price
464 print '<tr><td class="titlefieldcreate">'.$langs->trans("BuyingPriceMin").'</td>';
465 print '<td>';
466 $product_fourn = new ProductFournisseur($db);
467 if ($product_fourn->find_min_price_product_fournisseur($object->id) > 0) {
468 if ($product_fourn->product_fourn_price_id > 0) {
469 print $product_fourn->display_price_product_fournisseur();
470 } else {
471 print $langs->trans("NotDefined");
472 }
473 }
474 print '</td></tr>';
475
476 print '</table>';
477
478 print '</div>';
479 print '<div class="clearboth"></div>';
480
481 print dol_get_fiche_end();
482
483
484 // Form to add or update a price
485 if (($action == 'create_price' || $action == 'edit_price') && $usercancreate) {
486 $langs->load("suppliers");
487
488 print "<!-- form to add a supplier price -->\n";
489 print '<br>';
490
491 if ($rowid) {
492 $object->fetch_product_fournisseur_price($rowid, 1); //Ignore the math expression when getting the price
493 print load_fiche_titre($langs->trans("ChangeSupplierPrice"));
494 } else {
495 print load_fiche_titre($langs->trans("AddSupplierPrice"));
496 }
497
498 print '<form action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'" method="POST">';
499 print '<input type="hidden" name="token" value="'.newToken().'">';
500 print '<input type="hidden" name="action" value="save_price">';
501
502 print dol_get_fiche_head();
503
504 print '<table class="border centpercent">';
505
506 // Supplier
507 print '<tr><td class="titlefield fieldrequired">'.$langs->trans("Supplier").'</td><td>';
508 if ($rowid) {
509 $supplier = new Fournisseur($db);
510 $supplier->fetch($socid);
511 print $supplier->getNomUrl(1);
512 print '<input type="hidden" name="id_fourn" value="'.$socid.'">';
513 print '<input type="hidden" name="ref_fourn_price_id" value="'.$rowid.'">';
514 print '<input type="hidden" name="rowid" value="'.$rowid.'">';
515 print '<input type="hidden" name="socid" value="'.$socid.'">';
516 } else {
517 $events = array();
518 $events[] = array('method' => 'getVatRates', 'url' => dol_buildpath('/core/ajax/vatrates.php', 1), 'htmlname' => 'tva_tx', 'params' => array());
519 $filter = '(fournisseur:=:1) AND (status:=:1)';
520 print img_picto('', 'company', 'class="pictofixedwidth"').$form->select_company(GETPOST("id_fourn", 'alpha'), 'id_fourn', $filter, $langs->transnoentitiesnoconv('SelectThirdParty'), 0, 0, $events);
521
522 $parameters = array('filter'=>$filter, 'html_name'=>'id_fourn', 'selected'=>GETPOST("id_fourn"), 'showempty'=>1, 'prod_id'=>$object->id);
523 $reshook = $hookmanager->executeHooks('formCreateThirdpartyOptions', $parameters, $object, $action);
524 if (empty($reshook)) {
525 if (empty($form->result)) {
526 print '<a href="'.DOL_URL_ROOT.'/societe/card.php?action=create&type=f&backtopage='.urlencode($_SERVER["PHP_SELF"].'?id='.((int) $object->id).'&action='.urlencode($action).($action == 'create_price' ? '&token='.newToken() : '')).'">';
527 print img_picto($langs->trans("CreateDolibarrThirdPartySupplier"), 'add', 'class="marginleftonly"');
528 print '</a>';
529 }
530 }
531 print '<script type="text/javascript">
532 $(document).ready(function () {
533 console.log("Requesting default VAT rate for the supplier...")
534 $("#search_id_fourn").change(load_vat)
535 });
536 function load_vat() {
537 // get soc id
538 let socid = $("#id_fourn")[0].value
539
540 // load available VAT rates
541 let vat_url = "'.dol_buildpath('/core/ajax/vatrates.php', 1).'"
542 // make GET request with params
543 let options = "";
544 options += "id=" + socid
545 options += "&htmlname=tva_tx"
546 options += "&token='.currentToken().'"
547 options += "&action=getBuyerVATRates" // not defined in vatrates.php, default behavior.
548
549 var get = $.getJSON(
550 vat_url,
551 options,
552 (data) => {
553 rate_options = $.parseHTML(data.value)
554 rate_options.forEach(opt => {
555 if (opt.selected) {
556 replaceVATWithSupplierValue(opt.value);
557 return;
558 }
559 })
560 }
561 );
562
563 }
564 function replaceVATWithSupplierValue(vat_rate) {
565 console.log("Default VAT rate for the supplier: " + vat_rate + "%")
566 $("[name=\'tva_tx\']")[0].value = vat_rate;
567 }
568 </script>';
569 }
570 print '</td></tr>';
571
572 // Ref supplier
573 print '<tr><td class="fieldrequired">'.$langs->trans("SupplierRef").'</td><td>';
574 if ($rowid) {
575 print '<input type="hidden" name="ref_fourn_old" value="'.$object->ref_supplier.'">';
576 print '<input class="flat width150" maxlength="128" name="ref_fourn" value="'.$object->ref_supplier.'">';
577 } else {
578 print '<input class="flat width150" maxlength="128" name="ref_fourn" value="'.(GETPOST("ref_fourn") ? GETPOST("ref_fourn") : '').'">';
579 }
580 print '</td>';
581 print '</tr>';
582
583 // Availability
584 if (getDolGlobalInt('FOURN_PRODUCT_AVAILABILITY')) {
585 $langs->load("propal");
586 print '<tr><td>'.$langs->trans("Availability").'</td><td>';
587 $form->selectAvailabilityDelay($object->fk_availability, "oselDispo", 1);
588 print '</td></tr>'."\n";
589 }
590
591 // Qty min
592 print '<tr>';
593 print '<td class="fieldrequired">'.$langs->trans("QtyMin").'</td>';
594 print '<td>';
595 $quantity = GETPOSTISSET('qty') ? price2num(GETPOST('qty', 'alphanohtml'), 'MS') : "1";
596 if ($rowid) {
597 print '<input type="hidden" name="qty" value="'.$object->fourn_qty.'">';
598 print $object->fourn_qty;
599 } else {
600 print '<input class="flat" name="qty" size="5" value="'.$quantity.'">';
601 }
602 // Units
603 if (getDolGlobalString('PRODUCT_USE_UNITS')) {
604 $unit = $object->getLabelOfUnit();
605 if ($unit !== '') {
606 print '&nbsp;&nbsp;'.$langs->trans($unit);
607 }
608 }
609 print '</td></tr>';
610
611 if (getDolGlobalString('PRODUCT_USE_SUPPLIER_PACKAGING')) {
612 // Packaging/Conditionnement
613 print '<tr>';
614
615 print '<td class="fieldrequired">'.$form->textwithpicto($langs->trans("PackagingForThisProduct"), $langs->trans("PackagingForThisProductDesc")).'</td>';
616 print '<td>';
617 $packaging = GETPOSTISSET('packaging') ? price2num(GETPOST('packaging', 'alphanohtml'), 'MS') : ((empty($rowid)) ? "1" : price2num($object->packaging, 'MS'));
618 print '<input class="flat" name="packaging" size="5" value="'.$packaging.'">';
619
620 // Units
621 if (getDolGlobalString('PRODUCT_USE_UNITS')) {
622 $unit = $object->getLabelOfUnit();
623 if ($unit !== '') {
624 print '&nbsp;&nbsp;'.$langs->trans($unit);
625 }
626 }
627 }
628 // Vat rate
629 $default_vat = '';
630
631 // We don't have supplier, so we try to guess.
632 // For this we build a fictive supplier with same properties than user but using vat)
633 $mysoc2 = clone $mysoc;
634 $mysoc2->name = 'Fictive seller with same country';
635 $mysoc2->tva_assuj = 1;
636 $default_vat = get_default_tva($mysoc2, $mysoc, $object->id, 0);
637 $default_npr = get_default_npr($mysoc2, $mysoc, $object->id, 0);
638 if (empty($default_vat)) {
639 $default_npr = $default_vat;
640 }
641
642 print '<tr><td class="fieldrequired">'.$langs->trans("VATRateForSupplierProduct").'</td>';
643 print '<td>';
644 //print $form->load_tva('tva_tx',$object->tva_tx,$supplier,$mysoc); // Do not use list here as it may be any vat rates for any country
645 if (!empty($rowid)) { // If we have a supplier, it is an update, we must show the vat of current supplier price
646 $tmpproductsupplier = new ProductFournisseur($db);
647 $tmpproductsupplier->fetch_product_fournisseur_price($rowid, 1);
648 $default_vat = $tmpproductsupplier->fourn_tva_tx;
649 $default_npr = $tmpproductsupplier->fourn_tva_npr;
650 } else {
651 if (empty($default_vat)) {
652 $default_vat = $object->tva_tx;
653 }
654 }
655 $vattosuggest = (GETPOSTISSET("tva_tx") ? vatrate(GETPOST("tva_tx")) : ($default_vat != '' ? vatrate($default_vat) : ''));
656 $vattosuggest = preg_replace('/\s*\‍(.*\‍)$/', '', $vattosuggest);
657 print '<input type="text" class="flat" size="5" name="tva_tx" value="'.$vattosuggest.'">';
658 print '</td></tr>';
659
660 if (isModEnabled('dynamicprices')) { //Only show price mode and expression selector if module is enabled
661 // Price mode selector
662 print '<tr><td class="fieldrequired">'.$langs->trans("PriceMode").'</td><td>';
663 $price_expression = new PriceExpression($db);
664 $price_expression_list = array(0 => $langs->trans("PriceNumeric")); //Put the numeric mode as first option
665 foreach ($price_expression->list_price_expression() as $entry) {
666 $price_expression_list[$entry->id] = $entry->title;
667 }
668 $price_expression_preselection = GETPOST('eid') ? GETPOST('eid') : ($object->fk_supplier_price_expression ? $object->fk_supplier_price_expression : '0');
669 print $form->selectarray('eid', $price_expression_list, $price_expression_preselection);
670 print '&nbsp; <div id="expression_editor" class="button smallpaddingimp">'.$langs->trans("PriceExpressionEditor").'</div>';
671 print '</td></tr>';
672 // This code hides the numeric price input if is not selected, loads the editor page if editor button is pressed
673 print '<script type="text/javascript">
674 jQuery(document).ready(run);
675 function run() {
676 jQuery("#expression_editor").click(on_click);
677 jQuery("#eid").change(on_change);
678 on_change();
679 }
680 function on_click() {
681 window.location = "'.DOL_URL_ROOT.'/product/dynamic_price/editor.php?id='.$id.'&tab=fournisseurs&eid=" + $("#eid").val();
682 }
683 function on_change() {
684 if ($("#eid").val() == 0) {
685 jQuery("#price_numeric").show();
686 } else {
687 jQuery("#price_numeric").hide();
688 }
689 }
690 </script>';
691 }
692
693 if (isModEnabled("multicurrency")) {
694 // Currency
695 print '<tr><td class="fieldrequired">'.$langs->trans("Currency").'</td>';
696 print '<td>';
697 $currencycodetouse = GETPOST('multicurrency_code') ? GETPOST('multicurrency_code') : (isset($object->fourn_multicurrency_code) ? $object->fourn_multicurrency_code : '');
698 if (empty($currencycodetouse) && $object->fourn_multicurrency_tx == 1) {
699 $currencycodetouse = $conf->currency;
700 }
701 print $form->selectMultiCurrency($currencycodetouse, "multicurrency_code", 1);
702 print ' &nbsp; &nbsp; '.$langs->trans("CurrencyRate").' ';
703 print '<input class="flat width50" name="multicurrency_tx" value="';
704 print GETPOST('multicurrency_tx');
705 $vatratetoshow = GETPOST('multicurrency_tx') ? GETPOST('multicurrency_tx') : (isset($object->fourn_multicurrency_tx) ? $object->fourn_multicurrency_tx : '');
706 if ($vatratetoshow !== '') {
707 print vatrate($vatratetoshow);
708 }
709 print '">';
710 print '</td>';
711 print '</tr>';
712
713 // Currency price qty min
714 print '<tr><td class="fieldrequired">'.$form->textwithpicto($langs->trans("PriceQtyMinCurrency"), $langs->transnoentitiesnoconv("WithoutDiscount")).'</td>';
715 $pricesupplierincurrencytouse = (GETPOST('multicurrency_price') ? GETPOST('multicurrency_price') : (isset($object->fourn_multicurrency_price) ? $object->fourn_multicurrency_price : ''));
716 print '<td><input class="flat" name="multicurrency_price" size="8" value="'.price($pricesupplierincurrencytouse).'">';
717 print '&nbsp;';
718 print $form->selectPriceBaseType((GETPOST('multicurrency_price_base_type') ? GETPOST('multicurrency_price_base_type') : 'HT'), "multicurrency_price_base_type", 1); // We keep 'HT' here, multicurrency_price_base_type is not yet supported for supplier prices
719 print '</td></tr>';
720
721 // Price qty min
722 print '<tr><td class="fieldrequired">'.$form->textwithpicto($langs->trans("PriceQtyMin"), $langs->transnoentitiesnoconv("WithoutDiscount")).'</td>';
723 print '<td><input class="flat" name="disabled_price" size="8" value="">';
724 print '<input type="hidden" name="price" value="">';
725 print '<input type="hidden" name="price_base_type" value="">';
726 print '&nbsp;';
727 print $form->selectPriceBaseType('', "disabled_price_base_type", 1);
728 print '</td></tr>';
729
730 $currencies = array();
731 $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."multicurrency WHERE entity = ".((int) $conf->entity);
732 $resql = $db->query($sql);
733 if ($resql) {
734 $currency = new MultiCurrency($db);
735 while ($obj = $db->fetch_object($resql)) {
736 $currency->fetch($obj->rowid);
737 $currencies[$currency->code] = ((float) $currency->rate->rate);
738 }
739 }
740 $currencies = json_encode($currencies);
741 print "<!-- javascript to autocalculate the minimum price -->
742 <script type='text/javascript'>
743 function edit_price_from_multicurrency() {
744 console.log('edit_price_from_multicurrency');
745 var multicurrency_price = price2numjs($('input[name=\"multicurrency_price\"]').val());
746 var multicurrency_tx = price2numjs($('input[name=\"multicurrency_tx\"]').val());
747 if (multicurrency_tx != 0) {
748 $('input[name=\"price\"]').val(multicurrency_price / multicurrency_tx);
749 $('input[name=\"disabled_price\"]').val(multicurrency_price / multicurrency_tx);
750 } else {
751 $('input[name=\"price\"]').val('');
752 $('input[name=\"disabled_price\"]').val('');
753 }
754 }
755
756 jQuery(document).ready(function () {
757 $('input[name=\"disabled_price\"]').prop('disabled', true);
758 $('select[name=\"disabled_price_base_type\"]').prop('disabled', true);
759 edit_price_from_multicurrency();
760
761 $('input[name=\"multicurrency_price\"], input[name=\"multicurrency_tx\"]').keyup(function () {
762 edit_price_from_multicurrency();
763 });
764 $('input[name=\"multicurrency_price\"], input[name=\"multicurrency_tx\"]').change(function () {
765 edit_price_from_multicurrency();
766 });
767 $('input[name=\"multicurrency_price\"], input[name=\"multicurrency_tx\"]').on('paste', function () {
768 edit_price_from_multicurrency();
769 });
770
771 $('select[name=\"multicurrency_price_base_type\"]').change(function () {
772 $('input[name=\"price_base_type\"]').val($(this).val());
773 $('select[name=\"disabled_price_base_type\"]').val($(this).val());
774 });
775
776 var currencies_array = $currencies;
777 $('select[name=\"multicurrency_code\"]').change(function () {
778 console.log(\"We change the currency\");
779 $('input[name=\"multicurrency_tx\"]').val(currencies_array[$(this).val()]);
780 edit_price_from_multicurrency();
781 });
782 });
783 </script>";
784 } else {
785 // Price qty min
786 print '<tr><td class="fieldrequired">'.$langs->trans("PriceQtyMin").'</td>';
787 print '<td><input class="flat" name="price" size="8" value="'.(GETPOST('price') ? price(GETPOST('price')) : (isset($object->fourn_price) ? price($object->fourn_price) : '')).'">';
788 print '&nbsp;';
789 print $form->selectPriceBaseType((GETPOSTISSET('price_base_type') ? GETPOST('price_base_type') : 'HT'), "price_base_type", 1); // We keep 'HT' here, price_base_type is not yet supported for supplier prices
790 print '</td></tr>';
791 }
792
793 // Option to define a transport cost on supplier price
794 if (getDolGlobalString('PRODUCT_CHARGES')) {
795 print '<tr>';
796 print '<td>'.$langs->trans("Charges").'</td>';
797 print '<td><input class="flat" name="charges" size="8" value="'.(GETPOST('charges') ? price(GETPOST('charges')) : (isset($object->fourn_charges) ? price($object->fourn_charges) : '')).'">';
798 print '</td>';
799 print '</tr>';
800 }
801
802 // Discount qty min
803 print '<tr><td>'.$langs->trans("DiscountQtyMin").'</td>';
804 print '<td><input class="flat" name="remise_percent" size="4" value="'.(GETPOSTISSET('remise_percent') ? vatrate(price2num(GETPOST('remise_percent'), '', 2)) : (isset($object->fourn_remise_percent) ? vatrate(price2num($object->fourn_remise_percent)) : '')).'"> %';
805 print '</td>';
806 print '</tr>';
807
808 // Delivery delay in days
809 print '<tr>';
810 print '<td>'.$langs->trans('NbDaysToDelivery').'</td>';
811 print '<td><input class="flat" name="delivery_time_days" size="4" value="'.(GETPOSTISSET('delivery_time_days') ? GETPOST('delivery_time_days') : ($rowid ? $object->delivery_time_days : '')).'">&nbsp;'.$langs->trans('days').'</td>';
812 print '</tr>';
813
814 // Reputation
815 print '<tr><td>'.$langs->trans("ReferenceReputation").'</td><td>';
816 echo $form->selectarray('supplier_reputation', $object->reputations, !empty($supplier_reputation) ? $supplier_reputation : $object->supplier_reputation);
817 print '</td></tr>';
818
819 // Barcode
820 if (isModEnabled('barcode')) {
821 $formbarcode = new FormBarCode($db);
822
823 // Barcode type
824 print '<tr>';
825 print '<td>'.$langs->trans('GencodBuyPrice').'</td>';
826 print '<td>';
827 print img_picto('', 'barcode', 'class="pictofixedwidth"');
828 print $formbarcode->selectBarcodeType((GETPOSTISSET('fk_barcode_type') ? GETPOSTINT('fk_barcode_type') : ($rowid ? $object->supplier_fk_barcode_type : getDolGlobalInt("PRODUIT_DEFAULT_BARCODE_TYPE"))), 'fk_barcode_type', 1);
829 print ' <input class="flat" name="barcode" value="'.(GETPOSTISSET('barcode') ? GETPOST('barcode') : ($rowid ? $object->supplier_barcode : '')).'"></td>';
830 print '</tr>';
831 }
832
833 // Product description of the supplier
834 if (getDolGlobalString('PRODUIT_FOURN_TEXTS')) {
835 //WYSIWYG Editor
836 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
837
838 print '<tr>';
839 print '<td>'.$langs->trans('ProductSupplierDescription').'</td>';
840 print '<td>';
841
842 $doleditor = new DolEditor('supplier_description', $object->desc_supplier, '', 160, 'dolibarr_details', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_DETAILS'), ROWS_4, '90%');
843 $doleditor->Create();
844
845 print '</td>';
846 print '</tr>';
847 }
848
849 // Extrafields
850 $extrafields->fetch_name_optionals_label("product_fournisseur_price");
851 $extralabels = !empty($extrafields->attributes["product_fournisseur_price"]['label']) ? $extrafields->attributes["product_fournisseur_price"]['label'] : '';
852 $extrafield_values = $extrafields->getOptionalsFromPost("product_fournisseur_price");
853 if (!empty($extralabels)) {
854 if (empty($rowid)) {
855 foreach ($extralabels as $key => $value) {
856 if (!empty($extrafields->attributes["product_fournisseur_price"]['list'][$key]) && ($extrafields->attributes["product_fournisseur_price"]['list'][$key] == 1 || $extrafields->attributes["product_fournisseur_price"]['list'][$key] == 3 || ($action == "edit_price" && $extrafields->attributes["product_fournisseur_price"]['list'][$key] == 4))) {
857 if (!empty($extrafields->attributes["product_fournisseur_price"]['langfile'][$key])) {
858 $langs->load($extrafields->attributes["product_fournisseur_price"]['langfile'][$key]);
859 }
860
861 print '<tr><td'.($extrafields->attributes["product_fournisseur_price"]['required'][$key] ? ' class="fieldrequired"' : '').'>';
862 if (!empty($extrafields->attributes["product_fournisseur_price"]['help'][$key])) {
863 print $form->textwithpicto($langs->trans($value), $langs->trans($extrafields->attributes["product_fournisseur_price"]['help'][$key]));
864 } else {
865 print $langs->trans($value);
866 }
867 print '</td><td>'.$extrafields->showInputField($key, GETPOSTISSET('options_'.$key) ? $extrafield_values['options_'.$key] : '', '', '', '', '', 0, 'product_fournisseur_price').'</td></tr>';
868 }
869 }
870 } else {
871 $sql = "SELECT";
872 $sql .= " fk_object";
873 foreach ($extralabels as $key => $value) {
874 $sql .= ", ".$key;
875 }
876 $sql .= " FROM ".MAIN_DB_PREFIX."product_fournisseur_price_extrafields";
877 $sql .= " WHERE fk_object = ".((int) $rowid);
878 $resql = $db->query($sql);
879 if ($resql) {
880 $obj = $db->fetch_object($resql);
881 foreach ($extralabels as $key => $value) {
882 if (!empty($extrafields->attributes["product_fournisseur_price"]['list'][$key]) && ($extrafields->attributes["product_fournisseur_price"]['list'][$key] == 1 || $extrafields->attributes["product_fournisseur_price"]['list'][$key] == 3 || ($action == "edit_price" && $extrafields->attributes["product_fournisseur_price"]['list'][$key] == 4))) {
883 if (!empty($extrafields->attributes["product_fournisseur_price"]['langfile'][$key])) {
884 $langs->load($extrafields->attributes["product_fournisseur_price"]['langfile'][$key]);
885 }
886
887 print '<tr><td'.($extrafields->attributes["product_fournisseur_price"]['required'][$key] ? ' class="fieldrequired"' : '').'>';
888 if (!empty($extrafields->attributes["product_fournisseur_price"]['help'][$key])) {
889 print $form->textwithpicto($langs->trans($value), $langs->trans($extrafields->attributes["product_fournisseur_price"]['help'][$key]));
890 } else {
891 print $langs->trans($value);
892 }
893 print '</td><td>'.$extrafields->showInputField($key, GETPOSTISSET('options_'.$key) ? $extrafield_values['options_'.$key] : $obj->{$key}, '', '', '', '', 0, 'product_fournisseur_price');
894
895 print '</td></tr>';
896 }
897 }
898 $db->free($resql);
899 }
900 }
901 }
902
903 if (is_object($hookmanager)) {
904 $parameters = array('id_fourn'=>!empty($id_fourn) ? $id_fourn : 0, 'prod_id'=>$object->id);
905 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action);
906 print $hookmanager->resPrint;
907 }
908
909 print '</table>';
910
911 print dol_get_fiche_end();
912
913 print '<div class="center">';
914 print '<input class="button button-save" type="submit" value="'.$langs->trans("Save").'">';
915 print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
916 print '<input class="button button-cancel" type="submit" name="cancel" value="'.$langs->trans("Cancel").'">';
917 print '</div>';
918
919 print '</form>'."\n";
920 }
921
922
923 // Actions buttons
924
925 print '<div class="tabsAction">'."\n";
926
927 if ($action != 'create_price' && $action != 'edit_price') {
928 $parameters = array();
929 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
930 if (empty($reshook)) {
931 if ($usercancreate) {
932 print '<a class="butAction" href="'.DOL_URL_ROOT.'/product/price_suppliers.php?id='.((int) $object->id).'&action=create_price&token='.newToken().'">';
933 print $langs->trans("AddSupplierPrice").'</a>';
934 }
935 }
936 }
937
938 print "</div>\n";
939
940 if ($user->hasRight("fournisseur", "read")) { // Duplicate ? this check is already in the head of this file
941 $param = '';
942 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
943 $param .= '&contextpage='.urlencode($contextpage);
944 }
945 if ($limit > 0 && $limit != $conf->liste_limit) {
946 $param .= '&limit='.((int) $limit);
947 }
948 $param .= '&ref='.urlencode($object->ref);
949
950 $product_fourn = new ProductFournisseur($db);
951 $product_fourn_list = $product_fourn->list_product_fournisseur_price($object->id, $sortfield, $sortorder, $limit, $offset);
952 $product_fourn_list_all = $product_fourn->list_product_fournisseur_price($object->id, $sortfield, $sortorder, 0, 0);
953 $nbtotalofrecords = count($product_fourn_list_all);
954 $num = count($product_fourn_list);
955 if (($num + ($offset * $limit)) < $nbtotalofrecords) {
956 $num++;
957 }
958
959 print_barre_liste($langs->trans('SupplierPrices'), $page, $_SERVER['PHP_SELF'], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_accountancy.png', 0, '', '', $limit, 1);
960
961 // Definition of fields for lists
962 // Some fields are missing because they are not included in the database query
963 $arrayfields = array(
964 'pfp.datec'=>array('label'=>$langs->trans("AppliedPricesFrom"), 'checked'=>1, 'position'=>1),
965 's.nom'=>array('label'=>$langs->trans("Suppliers"), 'checked'=>1, 'position'=>2),
966 'pfp.fk_availability'=>array('label'=>$langs->trans("Availability"), 'enabled' => getDolGlobalInt('FOURN_PRODUCT_AVAILABILITY'), 'checked'=>0, 'position'=>4),
967 'pfp.quantity'=>array('label'=>$langs->trans("QtyMin"), 'checked'=>1, 'position'=>5),
968 'pfp.unitprice'=>array('label'=>$langs->trans("UnitPriceHT"), 'checked'=>1, 'position'=>9),
969 'pfp.multicurrency_unitprice'=>array('label'=>$langs->trans("UnitPriceHTCurrency"), 'enabled' => isModEnabled('multicurrency'), 'checked'=>0, 'position'=>10),
970 'pfp.charges'=>array('label'=>$langs->trans("Charges"), 'enabled' => getDolGlobalString('PRODUCT_CHARGES'), 'checked'=>0, 'position'=>11),
971 'pfp.delivery_time_days'=>array('label'=>$langs->trans("NbDaysToDelivery"), 'checked'=>-1, 'position'=>13),
972 'pfp.supplier_reputation'=>array('label'=>$langs->trans("ReputationForThisProduct"), 'checked'=>-1, 'position'=>14),
973 'pfp.fk_barcode_type'=>array('label'=>$langs->trans("BarcodeType"), 'enabled' => isModEnabled('barcode'), 'checked'=>0, 'position'=>15),
974 'pfp.barcode'=>array('label'=>$langs->trans("BarcodeValue"), 'enabled' => isModEnabled('barcode'), 'checked'=>0, 'position'=>16),
975 'pfp.packaging'=>array('label'=>$langs->trans("PackagingForThisProduct"), 'enabled' => getDolGlobalInt('PRODUCT_USE_SUPPLIER_PACKAGING'), 'checked'=>0, 'position'=>17),
976 'pfp.status'=>array('label'=>$langs->trans("Status"), 'enabled' => 1, 'checked'=>0, 'position'=>40),
977 'pfp.tms'=>array('label'=>$langs->trans("DateModification"), 'enabled' => isModEnabled('barcode'), 'checked'=>1, 'position'=>50),
978 'pfp.price'=>array('label'=>$langs->trans("PriceQtyMinHT"), 'checked'=>1, 'position'=>60),
979 'pfp.multicurrency_price'=>array('label'=>$langs->trans("PriceQtyMinHTCurrency"), 'enabled' => isModEnabled('multicurrency'), 'checked'=>1, 'position'=>70),
980
981 );
982
983 // fetch optionals attributes and labels
984 $extrafields->fetch_name_optionals_label("product_fournisseur_price");
985 if ($extrafields->attributes["product_fournisseur_price"] && array_key_exists('label', $extrafields->attributes["product_fournisseur_price"])) {
986 $extralabels = $extrafields->attributes["product_fournisseur_price"]['label'];
987
988 if (!empty($extralabels)) {
989 foreach ($extralabels as $key => $value) {
990 // Show field if not hidden
991 if (!empty($extrafields->attributes["product_fournisseur_price"]['list'][$key]) && $extrafields->attributes["product_fournisseur_price"]['list'][$key] != 3) {
992 $extratitle = $langs->trans($value);
993 $arrayfields['ef.' . $key] = array('label' => $extratitle, 'checked' => 0,
994 'position' => (end($arrayfields)['position'] + 1),
995 'langfile' => $extrafields->attributes["product_fournisseur_price"]['langfile'][$key],
996 'help' => $extrafields->attributes["product_fournisseur_price"]['help'][$key]);
997 }
998 }
999 }
1000 }
1001
1002 // Selection of new fields
1003 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
1004
1005 $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
1006 $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
1007
1008 print '<form action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="post" name="formulaire">';
1009 print '<input type="hidden" name="token" value="'.newToken().'">';
1010 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1011 print '<input type="hidden" name="action" value="list">';
1012 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
1013 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
1014
1015 // Suppliers list title
1016 print '<!-- List of supplier prices -->'."\n";
1017 print '<div class="div-table-responsive">';
1018 print '<table class="liste centpercent noborder">';
1019
1020 $param = "&id=".$object->id;
1021
1022 $nbfields = 0;
1023
1024 print '<tr class="liste_titre">';
1025
1026 // Action column
1027 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1028 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch actioncolumn ');
1029 $nbfields++;
1030 }
1031 if (!empty($arrayfields['pfp.datec']['checked'])) {
1032 print_liste_field_titre("AppliedPricesFrom", $_SERVER["PHP_SELF"], "pfp.datec", "", $param, "", $sortfield, $sortorder, '', '', 1);
1033 $nbfields++;
1034 }
1035 if (!empty($arrayfields['s.nom']['checked'])) {
1036 print_liste_field_titre("Suppliers", $_SERVER["PHP_SELF"], "s.nom", "", $param, "", $sortfield, $sortorder, '', '', 1);
1037 $nbfields++;
1038 }
1039 print_liste_field_titre("SupplierRef", $_SERVER["PHP_SELF"], "", "", $param, "", $sortfield, $sortorder, '', '', 1);
1040 $nbfields++;
1041 if (!empty($arrayfields['pfp.fk_availability']['checked'])) {
1042 print_liste_field_titre("Availability", $_SERVER["PHP_SELF"], "pfp.fk_availability", "", $param, "", $sortfield, $sortorder);
1043 $nbfields++;
1044 }
1045 if (!empty($arrayfields['pfp.quantity']['checked'])) {
1046 print_liste_field_titre("QtyMin", $_SERVER["PHP_SELF"], "pfp.quantity", "", $param, '', $sortfield, $sortorder, 'right ');
1047 $nbfields++;
1048 }
1049 print_liste_field_titre("VATRate", $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
1050 $nbfields++;
1051 if (!empty($arrayfields['pfp.price']['checked'])) {
1052 print_liste_field_titre("PriceQtyMinHT", $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
1053 $nbfields++;
1054 }
1055 if (isModEnabled("multicurrency") && !empty($arrayfields['pfp.multicurrency_price']['checked'])) {
1056 print_liste_field_titre("PriceQtyMinHTCurrency", $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
1057 $nbfields++;
1058 }
1059 if (!empty($arrayfields['pfp.unitprice']['checked'])) {
1060 print_liste_field_titre("UnitPriceHT", $_SERVER["PHP_SELF"], "pfp.unitprice", "", $param, '', $sortfield, $sortorder, 'right ');
1061 $nbfields++;
1062 }
1063 if (!empty($arrayfields['pfp.multicurrency_unitprice']['checked'])) {
1064 print_liste_field_titre("UnitPriceHTCurrency", $_SERVER["PHP_SELF"], "pfp.multicurrency_unitprice", "", $param, '', $sortfield, $sortorder, 'right ');
1065 $nbfields++;
1066 }
1067 if (isModEnabled("multicurrency")) {
1068 print_liste_field_titre("Currency", $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'right ');
1069 $nbfields++;
1070 }
1071 if (!empty($arrayfields['pfp.charges']['checked'])) { // possible only when $conf->global->PRODUCT_CHARGES is set
1072 print_liste_field_titre("Charges", $_SERVER["PHP_SELF"], "pfp.charges", "", $param, '', $sortfield, $sortorder, 'right ');
1073 $nbfields++;
1074 }
1075 print_liste_field_titre("DiscountQtyMin", $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
1076 $nbfields++;
1077 if (!empty($arrayfields['pfp.delivery_time_days']['checked'])) {
1078 print_liste_field_titre("NbDaysToDelivery", $_SERVER["PHP_SELF"], "pfp.delivery_time_days", "", $param, '', $sortfield, $sortorder, 'right ');
1079 $nbfields++;
1080 }
1081 if (!empty($arrayfields['pfp.supplier_reputation']['checked'])) {
1082 print_liste_field_titre("ReputationForThisProduct", $_SERVER["PHP_SELF"], "pfp.supplier_reputation", "", $param, '', $sortfield, $sortorder, 'center ');
1083 $nbfields++;
1084 }
1085 if (!empty($arrayfields['pfp.fk_barcode_type']['checked'])) {
1086 print_liste_field_titre("BarcodeType", $_SERVER["PHP_SELF"], "pfp.fk_barcode_type", "", $param, '', $sortfield, $sortorder, 'center ');
1087 $nbfields++;
1088 }
1089 if (!empty($arrayfields['pfp.barcode']['checked'])) {
1090 print_liste_field_titre("BarcodeValue", $_SERVER["PHP_SELF"], "pfp.barcode", "", $param, '', $sortfield, $sortorder, 'center ');
1091 $nbfields++;
1092 }
1093 if (!empty($arrayfields['pfp.packaging']['checked'])) {
1094 print_liste_field_titre("PackagingForThisProduct", $_SERVER["PHP_SELF"], "pfp.packaging", "", $param, '', $sortfield, $sortorder, 'center ');
1095 $nbfields++;
1096 }
1097 if (!empty($arrayfields['pfp.status']['checked'])) {
1098 print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "pfp.status", "", $param, '', $sortfield, $sortorder, 'center ', '', 1);
1099 $nbfields++;
1100 }
1101 if (!empty($arrayfields['pfp.tms']['checked'])) {
1102 print_liste_field_titre("DateModification", $_SERVER["PHP_SELF"], "pfp.tms", "", $param, '', $sortfield, $sortorder, 'right ', '', 1);
1103 $nbfields++;
1104 }
1105
1106 // fetch optionals attributes and labels
1107 $extrafields->fetch_name_optionals_label("product_fournisseur_price");
1108 if ($extrafields->attributes["product_fournisseur_price"] && array_key_exists('label', $extrafields->attributes["product_fournisseur_price"])) {
1109 $extralabels = $extrafields->attributes["product_fournisseur_price"]['label'];
1110
1111 if (!empty($extralabels)) {
1112 foreach ($extralabels as $key => $value) {
1113 // Show field if not hidden
1114 if (!empty($extrafields->attributes["product_fournisseur_price"]['list'][$key]) && $extrafields->attributes["product_fournisseur_price"]['list'][$key] != 3) {
1115 if (!empty($extrafields->attributes["product_fournisseur_price"]['langfile'][$key])) {
1116 $langs->load($extrafields->attributes["product_fournisseur_price"]['langfile'][$key]);
1117 }
1118 if (!empty($extrafields->attributes["product_fournisseur_price"]['help'][$key])) {
1119 $extratitle = $form->textwithpicto($langs->trans($value), $langs->trans($extrafields->attributes["product_fournisseur_price"]['help'][$key]));
1120 } else {
1121 $extratitle = $langs->trans($value);
1122 }
1123 if (!empty($arrayfields['ef.' . $key]['checked'])) {
1124 print_liste_field_titre($extratitle, $_SERVER["PHP_SELF"], 'ef.' . $key, '', $param, '', $sortfield, $sortorder, 'right ');
1125 $nbfields++;
1126 }
1127 }
1128 }
1129 }
1130 }
1131
1132 if (is_object($hookmanager)) {
1133 $parameters = array('id_fourn'=>(!empty($id_fourn) ? $id_fourn : ''), 'prod_id'=>$object->id, 'nbfields'=>$nbfields);
1134 $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action);
1135 }
1136 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1137 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'maxwidthsearch center ');
1138 $nbfields++;
1139 }
1140 print "</tr>\n";
1141
1142 if (is_array($product_fourn_list)) {
1143 foreach ($product_fourn_list as $productfourn) {
1144 print '<tr class="oddeven">';
1145
1146 // Action column
1147 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1148 print '<td class="center nowraponall">';
1149 if ($usercancreate) {
1150 print '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?id='.((int) $object->id).'&socid='.((int) $productfourn->fourn_id).'&action=edit_price&token='.newToken().'&rowid='.((int) $productfourn->product_fourn_price_id).'">'.img_edit()."</a>";
1151 print ' &nbsp; ';
1152 print '<a href="'.$_SERVER['PHP_SELF'].'?id='.((int) $object->id).'&socid='.((int) $productfourn->fourn_id).'&action=ask_remove_pf&token='.newToken().'&rowid='.((int) $productfourn->product_fourn_price_id).'">'.img_picto($langs->trans("Remove"), 'delete').'</a>';
1153 }
1154
1155 print '</td>';
1156 }
1157
1158 // Date from
1159 if (!empty($arrayfields['pfp.datec']['checked'])) {
1160 print '<td>'.dol_print_date(($productfourn->fourn_date_creation ? $productfourn->fourn_date_creation : $productfourn->date_creation), 'dayhour', 'tzuserrel').'</td>';
1161 }
1162
1163 // Supplier
1164 if (!empty($arrayfields['s.nom']['checked'])) {
1165 print '<td class="tdoverflowmax150">'.$productfourn->getSocNomUrl(1, 'supplier').'</td>';
1166 }
1167
1168 // Supplier ref
1169 if ($usercancreate) { // change required right here
1170 print '<td class="tdoverflowmax150">'.$productfourn->getNomUrl().'</td>';
1171 } else {
1172 print '<td class="tdoverflowmax150">'.dol_escape_htmltag($productfourn->fourn_ref).'</td>';
1173 }
1174
1175 // Availability
1176 if (!empty($arrayfields['pfp.fk_availability']['checked'])) {
1177 $form->load_cache_availability();
1178 $availability = $form->cache_availability[$productfourn->fk_availability]['label'];
1179 print '<td class="left">'.$availability.'</td>';
1180 }
1181
1182 // Quantity
1183 if (!empty($arrayfields['pfp.quantity']['checked'])) {
1184 print '<td class="right">';
1185 print $productfourn->fourn_qty;
1186 // Units
1187 if (getDolGlobalString('PRODUCT_USE_UNITS')) {
1188 $unit = $object->getLabelOfUnit();
1189 if ($unit !== '') {
1190 print '&nbsp;&nbsp;'.$langs->trans($unit);
1191 }
1192 }
1193 print '</td>';
1194 }
1195
1196 // VAT rate
1197 print '<td class="right">';
1198 print vatrate($productfourn->fourn_tva_tx, true);
1199 print '</td>';
1200
1201 // Price for the quantity
1202 if (!empty($arrayfields['pfp.price']['checked'])) {
1203 print '<td class="right">';
1204 print $productfourn->fourn_price ? '<span class="amount">'.price($productfourn->fourn_price).'</span>' : "";
1205 print '</td>';
1206 }
1207
1208 if (isModEnabled("multicurrency") && !empty($arrayfields['pfp.multicurrency_price']['checked'])) {
1209 // Price for the quantity in currency
1210 print '<td class="right">';
1211 print $productfourn->fourn_multicurrency_price ? '<span class="amount">'.price($productfourn->fourn_multicurrency_price).'</span>' : "";
1212 print '</td>';
1213 }
1214
1215 // Unit price
1216 if (!empty($arrayfields['pfp.unitprice']['checked'])) {
1217 print '<td class="right">';
1218 print price($productfourn->fourn_unitprice);
1219 //print $objp->unitprice? price($objp->unitprice) : ($objp->quantity?price($objp->price/$objp->quantity):"&nbsp;");
1220 print '</td>';
1221 }
1222
1223 // Unit price in currency
1224 if (!empty($arrayfields['pfp.multicurrency_unitprice']['checked'])) {
1225 print '<td class="right">';
1226 print price($productfourn->fourn_multicurrency_unitprice);
1227 print '</td>';
1228 }
1229
1230 // Currency
1231 if (isModEnabled("multicurrency")) {
1232 print '<td class="right nowraponall">';
1233 print $productfourn->fourn_multicurrency_code ? currency_name($productfourn->fourn_multicurrency_code) : '';
1234 print '</td>';
1235 }
1236
1237 // Charges
1238 if (!empty($arrayfields['pfp.charges']['checked'])) { // Possible only when getDolGlobalString('PRODUCT_CHARGES') is set
1239 print '<td class="right">';
1240 print price($productfourn->fourn_charges);
1241 print '</td>';
1242 }
1243
1244 // Discount
1245 print '<td class="right">';
1246 print price2num($productfourn->fourn_remise_percent).'%';
1247 print '</td>';
1248
1249 // Delivery delay
1250 if (!empty($arrayfields['pfp.delivery_time_days']['checked'])) {
1251 print '<td class="right">';
1252 print $productfourn->delivery_time_days;
1253 print '</td>';
1254 }
1255
1256 // Reputation
1257 if (!empty($arrayfields['pfp.supplier_reputation']['checked'])) {
1258 print '<td class="center">';
1259 if (!empty($productfourn->supplier_reputation) && !empty($object->reputations[$productfourn->supplier_reputation])) {
1260 print $object->reputations[$productfourn->supplier_reputation];
1261 }
1262 print'</td>';
1263 }
1264
1265 // Barcode type
1266 if (!empty($arrayfields['pfp.fk_barcode_type']['checked'])) {
1267 print '<td class="center">';
1268 $productfourn->barcode_type = !empty($productfourn->supplier_fk_barcode_type) ? $productfourn->supplier_fk_barcode_type : 0;
1269 $productfourn->fetchBarCode();
1270 print $productfourn->barcode_type_label ? $productfourn->barcode_type_label : ($productfourn->supplier_barcode ? '<div class="warning">'.$langs->trans("SetDefaultBarcodeType").'<div>' : '');
1271 print '</td>';
1272 }
1273
1274 // Barcode
1275 if (!empty($arrayfields['pfp.barcode']['checked'])) {
1276 print '<td class="right">';
1277 print $productfourn->supplier_barcode;
1278 print '</td>';
1279 }
1280
1281 // Packaging
1282 if (!empty($arrayfields['pfp.packaging']['checked'])) {
1283 print '<td class="center">';
1284 print price2num($productfourn->packaging);
1285 print '</td>';
1286 }
1287
1288 // Status
1289 if (!empty($arrayfields['pfp.status']['checked'])) {
1290 print '<td class="center">';
1291 print $productfourn->getLibStatut(3);
1292 print '</td>';
1293 }
1294
1295 // Date modification
1296 if (!empty($arrayfields['pfp.tms']['checked'])) {
1297 print '<td class="right nowraponall">';
1298 print dol_print_date(($productfourn->fourn_date_modification ? $productfourn->fourn_date_modification : $productfourn->date_modification), "dayhour", "tzuserrel");
1299 print '</td>';
1300 }
1301
1302 // Extrafields
1303 if (!empty($extralabels)) {
1304 $sql = "SELECT";
1305 $sql .= " fk_object";
1306 foreach ($extralabels as $key => $value) {
1307 $sql .= ", ".$key;
1308 }
1309 $sql .= " FROM ".MAIN_DB_PREFIX."product_fournisseur_price_extrafields";
1310 $sql .= " WHERE fk_object = ".((int) $productfourn->product_fourn_price_id);
1311 $resql = $db->query($sql);
1312 if ($resql) {
1313 if ($db->num_rows($resql) != 1) {
1314 foreach ($extralabels as $key => $value) {
1315 if (!empty($arrayfields['ef.'.$key]['checked']) && !empty($extrafields->attributes["product_fournisseur_price"]['list'][$key]) && $extrafields->attributes["product_fournisseur_price"]['list'][$key] != 3) {
1316 print "<td></td>";
1317 }
1318 }
1319 } else {
1320 $obj = $db->fetch_object($resql);
1321 foreach ($extralabels as $key => $value) {
1322 if (!empty($arrayfields['ef.'.$key]['checked']) && !empty($extrafields->attributes["product_fournisseur_price"]['list'][$key]) && $extrafields->attributes["product_fournisseur_price"]['list'][$key] != 3) {
1323 print '<td align="right">'.$extrafields->showOutputField($key, $obj->{$key}, '', 'product_fournisseur_price')."</td>";
1324 }
1325 }
1326 }
1327 $db->free($resql);
1328 }
1329 }
1330
1331 if (is_object($hookmanager)) {
1332 $parameters = array('id_pfp'=>$productfourn->product_fourn_price_id, 'id_fourn'=>(!empty($id_fourn) ? $id_fourn : ''), 'prod_id'=>$object->id);
1333 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action);
1334 }
1335
1336 // Modify-Remove
1337 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1338 print '<td class="center nowraponall">';
1339 if ($usercancreate) {
1340 print '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?id='.((int) $object->id).'&socid='.((int) $productfourn->fourn_id).'&action=edit_price&token='.newToken().'&rowid='.((int) $productfourn->product_fourn_price_id).'">'.img_edit()."</a>";
1341 print ' &nbsp; ';
1342 print '<a href="'.$_SERVER['PHP_SELF'].'?id='.((int) $object->id).'&socid='.((int) $productfourn->fourn_id).'&action=ask_remove_pf&token='.newToken().'&rowid='.((int) $productfourn->product_fourn_price_id).'">'.img_picto($langs->trans("Remove"), 'delete').'</a>';
1343 }
1344
1345 print '</td>';
1346 }
1347
1348 print '</tr>';
1349 }
1350
1351 if (empty($product_fourn_list)) {
1352 print '<tr><td colspan="'.$nbfields.'"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
1353 }
1354 } else {
1355 dol_print_error($db);
1356 }
1357
1358 print '</table>';
1359 print '</div>';
1360 print '</form>';
1361 }
1362 }
1363 }
1364} else {
1365 print $langs->trans("ErrorUnknown");
1366}
1367
1368// End of page
1369llxFooter();
1370$db->close();
$id
Definition account.php:48
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:66
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:71
Class to manage a WYSIWYG editor.
Class to manage standard extra fields.
Class to manage barcode HTML.
Class to manage generation of HTML components Only common components must be here.
Class to manage suppliers.
Class Currency.
Class for accessing price expression table.
Class to parse product price expressions.
Class to manage predefined suppliers products.
Class to manage products or services.
const TYPE_PRODUCT
Regular product.
const TYPE_SERVICE
Service.
currency_name($code_iso, $withcode=0, $outputlangs=null)
Return label of currency or code+label.
llxFooter()
Footer empty.
Definition document.php:107
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
vatrate($rate, $addpercent=false, $info_bits=0, $usestarfornpr=0, $html=0)
Return a string with VAT rate label formatted for view output Used into pdf and HTML pages.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
currentToken()
Return the value of token currently saved into session with name 'token'.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
get_default_npr(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that returns whether VAT must be recoverable collected VAT (e.g.: VAT NPR in France)
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='')
Return the value of a $_GET or $_POST supervariable, converted into float.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_clone($object, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
Definition member.php:79
product_prepare_head($object)
Prepare array with list of tabs.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.