dolibarr 21.0.4
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 ($action == 'ask_remove_pf') {
392 $form = new Form($db);
393 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$id.'&rowid='.$rowid, $langs->trans('DeleteProductBuyPrice'), $langs->trans('ConfirmDeleteProductBuyPrice'), 'confirm_remove_pf', '', 0, 1);
394 echo $formconfirm;
395 }
396
397 if ($action != 'edit' && $action != 're-edit') {
398 $head = product_prepare_head($object);
399 $titre = $langs->trans("CardProduct".$object->type);
400 $picto = ($object->type == Product::TYPE_SERVICE ? 'service' : 'product');
401
402 print dol_get_fiche_head($head, 'suppliers', $titre, -1, $picto);
403
404 $linkback = '<a href="'.DOL_URL_ROOT.'/product/list.php?restore_lastsearch_values=1&type='.$object->type.'">'.$langs->trans("BackToList").'</a>';
405 $prod->next_prev_filter = "(te.fk_product_type:=:".((int) $object->type).")"; // use $prod instead $object
406
407 $shownav = 1;
408 if ($user->socid && !in_array('product', explode(',', getDolGlobalString('MAIN_MODULES_FOR_EXTERNAL')))) {
409 $shownav = 0;
410 }
411
412 dol_banner_tab($prod, 'ref', $linkback, $shownav, 'ref');
413
414 print '<div class="fichecenter">';
415
416 print '<div class="underbanner clearboth"></div>';
417 print '<table class="border tableforfield centpercent">';
418
419 // Type
420 if (isModEnabled("product") && isModEnabled("service")) {
421 $typeformat = 'select;0:'.$langs->trans("Product").',1:'.$langs->trans("Service");
422 print '<tr><td class="">';
423 print (!getDolGlobalString('PRODUCT_DENY_CHANGE_PRODUCT_TYPE')) ? $form->editfieldkey("Type", 'fk_product_type', $object->type, $object, 0, $typeformat) : $langs->trans('Type');
424 print '</td><td>';
425 print $form->editfieldval("Type", 'fk_product_type', $object->type, $object, 0, $typeformat);
426 print '</td></tr>';
427 }
428
429 // Cost price. Can be used for margin module for option "calculate margin on explicit cost price
430 print '<tr><td>';
431 $textdesc = $langs->trans("CostPriceDescription");
432 $textdesc .= "<br>".$langs->trans("CostPriceUsage");
433 $text = $form->textwithpicto($langs->trans("CostPrice"), $textdesc, 1, 'help', '');
434 print $form->editfieldkey($text, 'cost_price', $object->cost_price, $object, $usercancreate, 'amount:6');
435 print '</td><td>';
436 print $form->editfieldval($text, 'cost_price', $object->cost_price, $object, $usercancreate, 'amount:6');
437 print '</td></tr>';
438
439 // PMP
440 $usercaneditpmp = 0;
441 if (getDolGlobalString('PRODUCT_CAN_EDIT_WAP')) {
442 $usercaneditpmp = $usercancreate;
443 }
444 print '<tr><td class="titlefieldcreate">';
445 $textdesc = $langs->trans("AverageUnitPricePMPDesc");
446 $text = $form->textwithpicto($langs->trans("AverageUnitPricePMPShort"), $textdesc, 1, 'help', '');
447 print $form->editfieldkey($text, 'pmp', $object->pmp, $object, $usercaneditpmp, 'amount:6');
448 print '</td><td>';
449 print $form->editfieldval($text, 'pmp', ($object->pmp > 0 ? $object->pmp : ''), $object, $usercaneditpmp, 'amount:6');
450 if ($object->pmp > 0) {
451 print ' '.$langs->trans("HT");
452 }
453 /*
454 .$form->textwithpicto($langs->trans("AverageUnitPricePMPShort"), $langs->trans("AverageUnitPricePMPDesc")).'</td>';
455 print '<td>';
456 if ($object->pmp > 0) {
457 print price($object->pmp).' '.$langs->trans("HT");
458 }*/
459 print '</td>';
460 print '</tr>';
461
462 // Best buying Price
463 print '<tr><td class="titlefieldcreate">'.$langs->trans("BuyingPriceMin").'</td>';
464 print '<td>';
465 $product_fourn = new ProductFournisseur($db);
466 if ($product_fourn->find_min_price_product_fournisseur($object->id) > 0) {
467 if ($product_fourn->product_fourn_price_id > 0) {
468 print $product_fourn->display_price_product_fournisseur();
469 } else {
470 print $langs->trans("NotDefined");
471 }
472 }
473 print '</td></tr>';
474
475 print '</table>';
476
477 print '</div>';
478 print '<div class="clearboth"></div>';
479
480 print dol_get_fiche_end();
481
482
483 // Form to add or update a price
484 if (($action == 'create_price' || $action == 'edit_price') && $usercancreate) {
485 $langs->load("suppliers");
486
487 print "<!-- form to add a supplier price -->\n";
488 print '<br>';
489
490 if ($rowid) {
491 $object->fetch_product_fournisseur_price($rowid, 1); //Ignore the math expression when getting the price
492 print load_fiche_titre($langs->trans("ChangeSupplierPrice"));
493 } else {
494 print load_fiche_titre($langs->trans("AddSupplierPrice"));
495 }
496
497 print '<form action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'" method="POST">';
498 print '<input type="hidden" name="token" value="'.newToken().'">';
499 print '<input type="hidden" name="action" value="save_price">';
500
501 print dol_get_fiche_head();
502
503 print '<table class="border centpercent">';
504
505 // Supplier
506 print '<tr><td class="titlefield fieldrequired">'.$langs->trans("Supplier").'</td><td>';
507 if ($rowid) {
508 $supplier = new Fournisseur($db);
509 $supplier->fetch($socid);
510 print $supplier->getNomUrl(1);
511 print '<input type="hidden" name="id_fourn" value="'.$socid.'">';
512 print '<input type="hidden" name="ref_fourn_price_id" value="'.$rowid.'">';
513 print '<input type="hidden" name="rowid" value="'.$rowid.'">';
514 print '<input type="hidden" name="socid" value="'.$socid.'">';
515 } else {
516 $events = array();
517 $events[] = array('method' => 'getVatRates', 'url' => dol_buildpath('/core/ajax/vatrates.php', 1), 'htmlname' => 'tva_tx', 'params' => array());
518 $filter = '(fournisseur:=:1) AND (status:=:1)';
519 print img_picto('', 'company', 'class="pictofixedwidth"').$form->select_company(GETPOST("id_fourn", 'alpha'), 'id_fourn', $filter, $langs->transnoentitiesnoconv('SelectThirdParty'), 0, 0, $events);
520
521 $parameters = array('filter'=>$filter, 'html_name'=>'id_fourn', 'selected'=>GETPOST("id_fourn"), 'showempty'=>1, 'prod_id'=>$object->id);
522 $reshook = $hookmanager->executeHooks('formCreateThirdpartyOptions', $parameters, $object, $action);
523 if (empty($reshook)) {
524 if (empty($form->result)) {
525 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() : '')).'">';
526 print img_picto($langs->trans("CreateDolibarrThirdPartySupplier"), 'add', 'class="marginleftonly"');
527 print '</a>';
528 }
529 }
530 print '<script type="text/javascript">
531 $(document).ready(function () {
532 console.log("Requesting default VAT rate for the supplier...")
533 $("#search_id_fourn").change(load_vat)
534 });
535 function load_vat() {
536 // get soc id
537 let socid = $("#id_fourn")[0].value
538
539 // load available VAT rates
540 let vat_url = "'.dol_buildpath('/core/ajax/vatrates.php', 1).'"
541 // make GET request with params
542 let options = "";
543 options += "id=" + socid
544 options += "&htmlname=tva_tx"
545 options += "&token='.currentToken().'"
546 options += "&action=getBuyerVATRates" // not defined in vatrates.php, default behavior.
547
548 var get = $.getJSON(
549 vat_url,
550 options,
551 (data) => {
552 rate_options = $.parseHTML(data.value)
553 rate_options.forEach(opt => {
554 if (opt.selected) {
555 replaceVATWithSupplierValue(opt.value);
556 return;
557 }
558 })
559 }
560 );
561
562 }
563 function replaceVATWithSupplierValue(vat_rate) {
564 console.log("Default VAT rate for the supplier: " + vat_rate + "%")
565 $("[name=\'tva_tx\']")[0].value = vat_rate;
566 }
567 </script>';
568 }
569 print '</td></tr>';
570
571 // Ref supplier
572 print '<tr><td class="fieldrequired">'.$langs->trans("SupplierRef").'</td><td>';
573 if ($rowid) {
574 print '<input type="hidden" name="ref_fourn_old" value="'.$object->ref_supplier.'">';
575 print '<input class="flat width150" maxlength="128" name="ref_fourn" value="'.$object->ref_supplier.'">';
576 } else {
577 print '<input class="flat width150" maxlength="128" name="ref_fourn" value="'.(GETPOST("ref_fourn") ? GETPOST("ref_fourn") : '').'">';
578 }
579 print '</td>';
580 print '</tr>';
581
582 // Availability
583 if (getDolGlobalInt('FOURN_PRODUCT_AVAILABILITY')) {
584 $langs->load("propal");
585 print '<tr><td>'.$langs->trans("Availability").'</td><td>';
586 $form->selectAvailabilityDelay($object->fk_availability, "oselDispo", 1);
587 print '</td></tr>'."\n";
588 }
589
590 // Qty min
591 print '<tr>';
592 print '<td class="fieldrequired">'.$langs->trans("QtyMin").'</td>';
593 print '<td>';
594 $quantity = GETPOSTISSET('qty') ? price2num(GETPOST('qty', 'alphanohtml'), 'MS') : "1";
595 if ($rowid) {
596 print '<input type="hidden" name="qty" value="'.$object->fourn_qty.'">';
597 print $object->fourn_qty;
598 } else {
599 print '<input class="flat" name="qty" size="5" value="'.$quantity.'">';
600 }
601 // Units
602 if (getDolGlobalString('PRODUCT_USE_UNITS')) {
603 $unit = $object->getLabelOfUnit('long', $langs);
604 if ($unit !== '') {
605 print '&nbsp;&nbsp;'.$unit;
606 }
607 }
608 print '</td></tr>';
609
610 if (getDolGlobalString('PRODUCT_USE_SUPPLIER_PACKAGING')) {
611 // Packaging/Conditionnement
612 print '<tr>';
613
614 print '<td class="fieldrequired">'.$form->textwithpicto($langs->trans("PackagingForThisProduct"), $langs->trans("PackagingForThisProductDesc")).'</td>';
615 print '<td>';
616 $packaging = GETPOSTISSET('packaging') ? price2num(GETPOST('packaging', 'alphanohtml'), 'MS') : ((empty($rowid)) ? "1" : price2num($object->packaging, 'MS'));
617 print '<input class="flat" name="packaging" size="5" value="'.$packaging.'">';
618
619 // Units
620 if (getDolGlobalString('PRODUCT_USE_UNITS')) {
621 $unit = $object->getLabelOfUnit('long', $langs);
622 if ($unit !== '') {
623 print '&nbsp;&nbsp;'.$unit;
624 }
625 }
626 }
627 // Vat rate
628 $default_vat = '';
629
630 // We don't have supplier, so we try to guess.
631 // For this we build a fictive supplier with same properties than user but using vat)
632 $mysoc2 = clone $mysoc;
633 $mysoc2->name = 'Fictive seller with same country';
634 $mysoc2->tva_assuj = 1;
635 $default_vat = get_default_tva($mysoc2, $mysoc, $object->id, 0);
636 $default_npr = get_default_npr($mysoc2, $mysoc, $object->id, 0);
637 if (empty($default_vat)) {
638 $default_npr = $default_vat;
639 }
640
641 print '<tr><td class="fieldrequired">'.$langs->trans("VATRateForSupplierProduct").'</td>';
642 print '<td>';
643 //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
644 if (!empty($rowid)) { // If we have a supplier, it is an update, we must show the vat of current supplier price
645 $tmpproductsupplier = new ProductFournisseur($db);
646 $tmpproductsupplier->fetch_product_fournisseur_price($rowid, 1);
647 $default_vat = $tmpproductsupplier->fourn_tva_tx;
648 $default_npr = $tmpproductsupplier->fourn_tva_npr;
649 } else {
650 if (empty($default_vat)) {
651 $default_vat = $object->tva_tx;
652 }
653 }
654 $vattosuggest = (GETPOSTISSET("tva_tx") ? vatrate(GETPOST("tva_tx")) : ($default_vat != '' ? vatrate($default_vat) : ''));
655 $vattosuggest = preg_replace('/\s*\‍(.*\‍)$/', '', $vattosuggest);
656 print '<input type="text" class="flat" size="5" name="tva_tx" value="'.$vattosuggest.'">';
657 print '</td></tr>';
658
659 if (isModEnabled('dynamicprices')) { //Only show price mode and expression selector if module is enabled
660 // Price mode selector
661 print '<tr><td class="fieldrequired">'.$langs->trans("PriceMode").'</td><td>';
662 $price_expression = new PriceExpression($db);
663 $price_expression_list = array(0 => $langs->trans("PriceNumeric")); //Put the numeric mode as first option
664 foreach ($price_expression->list_price_expression() as $entry) {
665 $price_expression_list[$entry->id] = $entry->title;
666 }
667 $price_expression_preselection = GETPOST('eid') ? GETPOST('eid') : ($object->fk_supplier_price_expression ? $object->fk_supplier_price_expression : '0');
668 print $form->selectarray('eid', $price_expression_list, $price_expression_preselection);
669 print '&nbsp; <div id="expression_editor" class="button smallpaddingimp">'.$langs->trans("PriceExpressionEditor").'</div>';
670 print '</td></tr>';
671 // This code hides the numeric price input if is not selected, loads the editor page if editor button is pressed
672 print '<script type="text/javascript">
673 jQuery(document).ready(run);
674 function run() {
675 jQuery("#expression_editor").click(on_click);
676 jQuery("#eid").change(on_change);
677 on_change();
678 }
679 function on_click() {
680 window.location = "'.DOL_URL_ROOT.'/product/dynamic_price/editor.php?id='.$id.'&tab=fournisseurs&eid=" + $("#eid").val();
681 }
682 function on_change() {
683 if ($("#eid").val() == 0) {
684 jQuery("#price_numeric").show();
685 } else {
686 jQuery("#price_numeric").hide();
687 }
688 }
689 </script>';
690 }
691
692 if (isModEnabled("multicurrency")) {
693 // Currency
694 print '<tr><td class="fieldrequired">'.$langs->trans("Currency").'</td>';
695 print '<td>';
696 $currencycodetouse = GETPOST('multicurrency_code') ? GETPOST('multicurrency_code') : (isset($object->fourn_multicurrency_code) ? $object->fourn_multicurrency_code : '');
697 if (empty($currencycodetouse) && $object->fourn_multicurrency_tx == 1) {
698 $currencycodetouse = $conf->currency;
699 }
700 print $form->selectMultiCurrency($currencycodetouse, "multicurrency_code", 1);
701 print ' &nbsp; &nbsp; '.$langs->trans("CurrencyRate").' ';
702 print '<input class="flat width50" name="multicurrency_tx" value="';
703 print GETPOST('multicurrency_tx');
704 $vatratetoshow = GETPOST('multicurrency_tx') ? GETPOST('multicurrency_tx') : (isset($object->fourn_multicurrency_tx) ? $object->fourn_multicurrency_tx : '');
705 if ($vatratetoshow !== '') {
706 print vatrate($vatratetoshow);
707 }
708 print '">';
709 print '</td>';
710 print '</tr>';
711
712 // Currency price qty min
713 print '<tr><td class="fieldrequired">'.$form->textwithpicto($langs->trans("PriceQtyMinCurrency"), $langs->transnoentitiesnoconv("WithoutDiscount")).'</td>';
714 $pricesupplierincurrencytouse = (GETPOST('multicurrency_price') ? GETPOST('multicurrency_price') : (isset($object->fourn_multicurrency_price) ? $object->fourn_multicurrency_price : ''));
715 print '<td><input class="flat" name="multicurrency_price" size="8" value="'.price($pricesupplierincurrencytouse).'">';
716 print '&nbsp;';
717 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
718 print '</td></tr>';
719
720 // Price qty min
721 print '<tr><td class="fieldrequired">'.$form->textwithpicto($langs->trans("PriceQtyMin"), $langs->transnoentitiesnoconv("WithoutDiscount")).'</td>';
722 print '<td><input class="flat" name="disabled_price" size="8" value="">';
723 print '<input type="hidden" name="price" value="">';
724 print '<input type="hidden" name="price_base_type" value="">';
725 print '&nbsp;';
726 print $form->selectPriceBaseType('', "disabled_price_base_type", 1);
727 print '</td></tr>';
728
729 $currencies = array();
730 $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."multicurrency WHERE entity = ".((int) $conf->entity);
731 $resql = $db->query($sql);
732 if ($resql) {
733 $currency = new MultiCurrency($db);
734 while ($obj = $db->fetch_object($resql)) {
735 $currency->fetch($obj->rowid);
736 $currencies[$currency->code] = ((float) $currency->rate->rate);
737 }
738 }
739 $currencies = json_encode($currencies);
740 print "<!-- javascript to autocalculate the minimum price -->
741 <script type='text/javascript'>
742 function edit_price_from_multicurrency() {
743 console.log('edit_price_from_multicurrency');
744 var multicurrency_price = price2numjs($('input[name=\"multicurrency_price\"]').val());
745 var multicurrency_tx = price2numjs($('input[name=\"multicurrency_tx\"]').val());
746 if (multicurrency_tx != 0) {
747 $('input[name=\"price\"]').val(multicurrency_price / multicurrency_tx);
748 $('input[name=\"disabled_price\"]').val(multicurrency_price / multicurrency_tx);
749 } else {
750 $('input[name=\"price\"]').val('');
751 $('input[name=\"disabled_price\"]').val('');
752 }
753 }
754
755 jQuery(document).ready(function () {
756 $('input[name=\"disabled_price\"]').prop('disabled', true);
757 $('select[name=\"disabled_price_base_type\"]').prop('disabled', true);
758 edit_price_from_multicurrency();
759
760 $('input[name=\"multicurrency_price\"], input[name=\"multicurrency_tx\"]').keyup(function () {
761 edit_price_from_multicurrency();
762 });
763 $('input[name=\"multicurrency_price\"], input[name=\"multicurrency_tx\"]').change(function () {
764 edit_price_from_multicurrency();
765 });
766 $('input[name=\"multicurrency_price\"], input[name=\"multicurrency_tx\"]').on('paste', function () {
767 edit_price_from_multicurrency();
768 });
769
770 $('select[name=\"multicurrency_price_base_type\"]').change(function () {
771 $('input[name=\"price_base_type\"]').val($(this).val());
772 $('select[name=\"disabled_price_base_type\"]').val($(this).val());
773 });
774
775 var currencies_array = $currencies;
776 $('select[name=\"multicurrency_code\"]').change(function () {
777 console.log(\"We change the currency\");
778 $('input[name=\"multicurrency_tx\"]').val(currencies_array[$(this).val()]);
779 edit_price_from_multicurrency();
780 });
781 });
782 </script>";
783 } else {
784 // Price qty min
785 print '<tr><td class="fieldrequired">'.$langs->trans("PriceQtyMin").'</td>';
786 print '<td><input class="flat" name="price" size="8" value="'.(GETPOST('price') ? price(GETPOST('price')) : (isset($object->fourn_price) ? price($object->fourn_price) : '')).'">';
787 print '&nbsp;';
788 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
789 print '</td></tr>';
790 }
791
792 // Option to define a transport cost on supplier price
793 if (getDolGlobalString('PRODUCT_CHARGES')) {
794 print '<tr>';
795 print '<td>'.$langs->trans("Charges").'</td>';
796 print '<td><input class="flat" name="charges" size="8" value="'.(GETPOST('charges') ? price(GETPOST('charges')) : (isset($object->fourn_charges) ? price($object->fourn_charges) : '')).'">';
797 print '</td>';
798 print '</tr>';
799 }
800
801 // Discount qty min
802 print '<tr><td>'.$langs->trans("DiscountQtyMin").'</td>';
803 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)) : '')).'"> %';
804 print '</td>';
805 print '</tr>';
806
807 // Delivery delay in days
808 print '<tr>';
809 print '<td>'.$langs->trans('NbDaysToDelivery').'</td>';
810 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>';
811 print '</tr>';
812
813 // Reputation
814 print '<tr><td>'.$langs->trans("ReferenceReputation").'</td><td>';
815 echo $form->selectarray('supplier_reputation', $object->reputations, !empty($supplier_reputation) ? $supplier_reputation : $object->supplier_reputation);
816 print '</td></tr>';
817
818 // Barcode
819 if (isModEnabled('barcode')) {
820 $formbarcode = new FormBarCode($db);
821
822 // Barcode type
823 print '<tr>';
824 print '<td>'.$langs->trans('GencodBuyPrice').'</td>';
825 print '<td>';
826 print img_picto('', 'barcode', 'class="pictofixedwidth"');
827 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);
828 print ' <input class="flat" name="barcode" value="'.(GETPOSTISSET('barcode') ? GETPOST('barcode') : ($rowid ? $object->supplier_barcode : '')).'"></td>';
829 print '</tr>';
830 }
831
832 // Product description of the supplier
833 if (getDolGlobalString('PRODUIT_FOURN_TEXTS')) {
834 //WYSIWYG Editor
835 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
836
837 print '<tr>';
838 print '<td>'.$langs->trans('ProductSupplierDescription').'</td>';
839 print '<td>';
840
841 $doleditor = new DolEditor('supplier_description', $object->desc_supplier, '', 160, 'dolibarr_details', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_DETAILS'), ROWS_4, '90%');
842 $doleditor->Create();
843
844 print '</td>';
845 print '</tr>';
846 }
847
848 // Extrafields
849 $extrafields->fetch_name_optionals_label("product_fournisseur_price");
850 $extralabels = !empty($extrafields->attributes["product_fournisseur_price"]['label']) ? $extrafields->attributes["product_fournisseur_price"]['label'] : '';
851 $extrafield_values = $extrafields->getOptionalsFromPost("product_fournisseur_price");
852 if (!empty($extralabels)) {
853 if (empty($rowid)) {
854 foreach ($extralabels as $key => $value) {
855 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))) {
856 if (!empty($extrafields->attributes["product_fournisseur_price"]['langfile'][$key])) {
857 $langs->load($extrafields->attributes["product_fournisseur_price"]['langfile'][$key]);
858 }
859
860 print '<tr><td'.($extrafields->attributes["product_fournisseur_price"]['required'][$key] ? ' class="fieldrequired"' : '').'>';
861 if (!empty($extrafields->attributes["product_fournisseur_price"]['help'][$key])) {
862 print $form->textwithpicto($langs->trans($value), $langs->trans($extrafields->attributes["product_fournisseur_price"]['help'][$key]));
863 } else {
864 print $langs->trans($value);
865 }
866 print '</td><td>'.$extrafields->showInputField($key, GETPOSTISSET('options_'.$key) ? $extrafield_values['options_'.$key] : '', '', '', '', '', 0, 'product_fournisseur_price').'</td></tr>';
867 }
868 }
869 } else {
870 $sql = "SELECT";
871 $sql .= " fk_object";
872 foreach ($extralabels as $key => $value) {
873 $sql .= ", ".$key;
874 }
875 $sql .= " FROM ".MAIN_DB_PREFIX."product_fournisseur_price_extrafields";
876 $sql .= " WHERE fk_object = ".((int) $rowid);
877 $resql = $db->query($sql);
878 if ($resql) {
879 $obj = $db->fetch_object($resql);
880 foreach ($extralabels as $key => $value) {
881 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))) {
882 if (!empty($extrafields->attributes["product_fournisseur_price"]['langfile'][$key])) {
883 $langs->load($extrafields->attributes["product_fournisseur_price"]['langfile'][$key]);
884 }
885
886 print '<tr><td'.($extrafields->attributes["product_fournisseur_price"]['required'][$key] ? ' class="fieldrequired"' : '').'>';
887 if (!empty($extrafields->attributes["product_fournisseur_price"]['help'][$key])) {
888 print $form->textwithpicto($langs->trans($value), $langs->trans($extrafields->attributes["product_fournisseur_price"]['help'][$key]));
889 } else {
890 print $langs->trans($value);
891 }
892 print '</td><td>'.$extrafields->showInputField($key, GETPOSTISSET('options_'.$key) ? $extrafield_values['options_'.$key] : $obj->{$key}, '', '', '', '', 0, 'product_fournisseur_price');
893
894 print '</td></tr>';
895 }
896 }
897 $db->free($resql);
898 }
899 }
900 }
901
902 if (is_object($hookmanager)) {
903 $parameters = array('id_fourn'=>!empty($id_fourn) ? $id_fourn : 0, 'prod_id'=>$object->id);
904 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action);
905 print $hookmanager->resPrint;
906 }
907
908 print '</table>';
909
910 print dol_get_fiche_end();
911
912 print '<div class="center">';
913 print '<input class="button button-save" type="submit" value="'.$langs->trans("Save").'">';
914 print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
915 print '<input class="button button-cancel" type="submit" name="cancel" value="'.$langs->trans("Cancel").'">';
916 print '</div>';
917
918 print '</form>'."\n";
919 }
920
921
922 // Actions buttons
923
924 print '<div class="tabsAction">'."\n";
925
926 if ($action != 'create_price' && $action != 'edit_price') {
927 $parameters = array();
928 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
929 if (empty($reshook)) {
930 if ($usercancreate) {
931 print '<a class="butAction" href="'.DOL_URL_ROOT.'/product/price_suppliers.php?id='.((int) $object->id).'&action=create_price&token='.newToken().'">';
932 print $langs->trans("AddSupplierPrice").'</a>';
933 }
934 }
935 }
936
937 print "</div>\n";
938
939 if ($user->hasRight("fournisseur", "read")) { // Duplicate ? this check is already in the head of this file
940 $param = '';
941 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
942 $param .= '&contextpage='.urlencode($contextpage);
943 }
944 if ($limit > 0 && $limit != $conf->liste_limit) {
945 $param .= '&limit='.((int) $limit);
946 }
947 $param .= '&ref='.urlencode($object->ref);
948
949 $product_fourn = new ProductFournisseur($db);
950 $product_fourn_list = $product_fourn->list_product_fournisseur_price($object->id, $sortfield, $sortorder, $limit, $offset);
951 $product_fourn_list_all = $product_fourn->list_product_fournisseur_price($object->id, $sortfield, $sortorder, 0, 0);
952 $nbtotalofrecords = count($product_fourn_list_all);
953 $num = count($product_fourn_list);
954 if (($num + ($offset * $limit)) < $nbtotalofrecords) {
955 $num++;
956 }
957
958 print_barre_liste($langs->trans('SupplierPrices'), $page, $_SERVER['PHP_SELF'], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_accountancy.png', 0, '', '', $limit, 1);
959
960 // Definition of fields for lists
961 // Some fields are missing because they are not included in the database query
962 $arrayfields = array(
963 'pfp.datec'=>array('label'=>$langs->trans("AppliedPricesFrom"), 'checked'=>1, 'position'=>1),
964 's.nom'=>array('label'=>$langs->trans("Suppliers"), 'checked'=>1, 'position'=>2),
965 'pfp.fk_availability'=>array('label'=>$langs->trans("Availability"), 'enabled' => getDolGlobalInt('FOURN_PRODUCT_AVAILABILITY'), 'checked'=>0, 'position'=>4),
966 'pfp.quantity'=>array('label'=>$langs->trans("QtyMin"), 'checked'=>1, 'position'=>5),
967 'pfp.unitprice'=>array('label'=>$langs->trans("UnitPriceHT"), 'checked'=>1, 'position'=>9),
968 'pfp.multicurrency_unitprice'=>array('label'=>$langs->trans("UnitPriceHTCurrency"), 'enabled' => isModEnabled('multicurrency'), 'checked'=>0, 'position'=>10),
969 'pfp.charges'=>array('label'=>$langs->trans("Charges"), 'enabled' => getDolGlobalString('PRODUCT_CHARGES'), 'checked'=>0, 'position'=>11),
970 'pfp.delivery_time_days'=>array('label'=>$langs->trans("NbDaysToDelivery"), 'checked'=>-1, 'position'=>13),
971 'pfp.supplier_reputation'=>array('label'=>$langs->trans("ReputationForThisProduct"), 'checked'=>-1, 'position'=>14),
972 'pfp.fk_barcode_type'=>array('label'=>$langs->trans("BarcodeType"), 'enabled' => isModEnabled('barcode'), 'checked'=>0, 'position'=>15),
973 'pfp.barcode'=>array('label'=>$langs->trans("BarcodeValue"), 'enabled' => isModEnabled('barcode'), 'checked'=>0, 'position'=>16),
974 'pfp.packaging'=>array('label'=>$langs->trans("PackagingForThisProduct"), 'enabled' => getDolGlobalInt('PRODUCT_USE_SUPPLIER_PACKAGING'), 'checked'=>0, 'position'=>17),
975 'pfp.status'=>array('label'=>$langs->trans("Status"), 'enabled' => 1, 'checked'=>0, 'position'=>40),
976 'pfp.tms'=>array('label'=>$langs->trans("DateModification"), 'enabled' => 1, 'checked'=>1, 'position'=>50),
977 'pfp.price'=>array('label'=>$langs->trans("PriceQtyMinHT"), 'checked'=>1, 'position'=>60),
978 'pfp.multicurrency_price'=>array('label'=>$langs->trans("PriceQtyMinHTCurrency"), 'enabled' => isModEnabled('multicurrency'), 'checked'=>1, 'position'=>70),
979
980 );
981
982 // fetch optionals attributes and labels
983 $extrafields->fetch_name_optionals_label("product_fournisseur_price");
984 if ($extrafields->attributes["product_fournisseur_price"] && array_key_exists('label', $extrafields->attributes["product_fournisseur_price"])) {
985 $extralabels = $extrafields->attributes["product_fournisseur_price"]['label'];
986
987 if (!empty($extralabels)) {
988 foreach ($extralabels as $key => $value) {
989 // Show field if not hidden
990 if (!empty($extrafields->attributes["product_fournisseur_price"]['list'][$key]) && $extrafields->attributes["product_fournisseur_price"]['list'][$key] != 3) {
991 $extratitle = $langs->trans($value);
992 $arrayfields['ef.' . $key] = array('label' => $extratitle, 'checked' => 0,
993 'position' => (end($arrayfields)['position'] + 1),
994 'langfile' => $extrafields->attributes["product_fournisseur_price"]['langfile'][$key],
995 'help' => $extrafields->attributes["product_fournisseur_price"]['help'][$key]);
996 }
997 }
998 }
999 }
1000
1001 // Selection of new fields
1002 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
1003
1004 $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
1005 $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
1006
1007 print '<form action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="post" name="formulaire">';
1008 print '<input type="hidden" name="token" value="'.newToken().'">';
1009 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1010 print '<input type="hidden" name="action" value="list">';
1011 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
1012 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
1013
1014 // Suppliers list title
1015 print '<!-- List of supplier prices -->'."\n";
1016 print '<div class="div-table-responsive">';
1017 print '<table class="liste centpercent noborder">';
1018
1019 $param = "&id=".$object->id;
1020
1021 $nbfields = 0;
1022
1023 print '<tr class="liste_titre">';
1024
1025 // Action column
1026 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1027 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch actioncolumn ');
1028 $nbfields++;
1029 }
1030 if (!empty($arrayfields['pfp.datec']['checked'])) {
1031 print_liste_field_titre("AppliedPricesFrom", $_SERVER["PHP_SELF"], "pfp.datec", "", $param, "", $sortfield, $sortorder, '', '', 1);
1032 $nbfields++;
1033 }
1034 if (!empty($arrayfields['s.nom']['checked'])) {
1035 print_liste_field_titre("Suppliers", $_SERVER["PHP_SELF"], "s.nom", "", $param, "", $sortfield, $sortorder, '', '', 1);
1036 $nbfields++;
1037 }
1038 print_liste_field_titre("SupplierRef", $_SERVER["PHP_SELF"], "", "", $param, "", $sortfield, $sortorder, '', '', 1);
1039 $nbfields++;
1040 if (!empty($arrayfields['pfp.fk_availability']['checked'])) {
1041 print_liste_field_titre("Availability", $_SERVER["PHP_SELF"], "pfp.fk_availability", "", $param, "", $sortfield, $sortorder);
1042 $nbfields++;
1043 }
1044 if (!empty($arrayfields['pfp.quantity']['checked'])) {
1045 print_liste_field_titre("QtyMin", $_SERVER["PHP_SELF"], "pfp.quantity", "", $param, '', $sortfield, $sortorder, 'right ');
1046 $nbfields++;
1047 }
1048 print_liste_field_titre("VATRate", $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
1049 $nbfields++;
1050 if (!empty($arrayfields['pfp.price']['checked'])) {
1051 print_liste_field_titre("PriceQtyMinHT", $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
1052 $nbfields++;
1053 }
1054 if (isModEnabled("multicurrency") && !empty($arrayfields['pfp.multicurrency_price']['checked'])) {
1055 print_liste_field_titre("PriceQtyMinHTCurrency", $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
1056 $nbfields++;
1057 }
1058 if (!empty($arrayfields['pfp.unitprice']['checked'])) {
1059 print_liste_field_titre("UnitPriceHT", $_SERVER["PHP_SELF"], "pfp.unitprice", "", $param, '', $sortfield, $sortorder, 'right ');
1060 $nbfields++;
1061 }
1062 if (!empty($arrayfields['pfp.multicurrency_unitprice']['checked'])) {
1063 print_liste_field_titre("UnitPriceHTCurrency", $_SERVER["PHP_SELF"], "pfp.multicurrency_unitprice", "", $param, '', $sortfield, $sortorder, 'right ');
1064 $nbfields++;
1065 }
1066 if (isModEnabled("multicurrency")) {
1067 print_liste_field_titre("Currency", $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'right ');
1068 $nbfields++;
1069 }
1070 if (!empty($arrayfields['pfp.charges']['checked'])) { // possible only when $conf->global->PRODUCT_CHARGES is set
1071 print_liste_field_titre("Charges", $_SERVER["PHP_SELF"], "pfp.charges", "", $param, '', $sortfield, $sortorder, 'right ');
1072 $nbfields++;
1073 }
1074 print_liste_field_titre("DiscountQtyMin", $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
1075 $nbfields++;
1076 if (!empty($arrayfields['pfp.delivery_time_days']['checked'])) {
1077 print_liste_field_titre("NbDaysToDelivery", $_SERVER["PHP_SELF"], "pfp.delivery_time_days", "", $param, '', $sortfield, $sortorder, 'right ');
1078 $nbfields++;
1079 }
1080 if (!empty($arrayfields['pfp.supplier_reputation']['checked'])) {
1081 print_liste_field_titre("ReputationForThisProduct", $_SERVER["PHP_SELF"], "pfp.supplier_reputation", "", $param, '', $sortfield, $sortorder, 'center ');
1082 $nbfields++;
1083 }
1084 if (!empty($arrayfields['pfp.fk_barcode_type']['checked'])) {
1085 print_liste_field_titre("BarcodeType", $_SERVER["PHP_SELF"], "pfp.fk_barcode_type", "", $param, '', $sortfield, $sortorder, 'center ');
1086 $nbfields++;
1087 }
1088 if (!empty($arrayfields['pfp.barcode']['checked'])) {
1089 print_liste_field_titre("BarcodeValue", $_SERVER["PHP_SELF"], "pfp.barcode", "", $param, '', $sortfield, $sortorder, 'center ');
1090 $nbfields++;
1091 }
1092 if (!empty($arrayfields['pfp.packaging']['checked'])) {
1093 print_liste_field_titre("PackagingForThisProduct", $_SERVER["PHP_SELF"], "pfp.packaging", "", $param, '', $sortfield, $sortorder, 'center ');
1094 $nbfields++;
1095 }
1096 if (!empty($arrayfields['pfp.status']['checked'])) {
1097 print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "pfp.status", "", $param, '', $sortfield, $sortorder, 'center ', '', 1);
1098 $nbfields++;
1099 }
1100 if (!empty($arrayfields['pfp.tms']['checked'])) {
1101 print_liste_field_titre("DateModification", $_SERVER["PHP_SELF"], "pfp.tms", "", $param, '', $sortfield, $sortorder, 'right ', '', 1);
1102 $nbfields++;
1103 }
1104
1105 // fetch optionals attributes and labels
1106 $extrafields->fetch_name_optionals_label("product_fournisseur_price");
1107 if ($extrafields->attributes["product_fournisseur_price"] && array_key_exists('label', $extrafields->attributes["product_fournisseur_price"])) {
1108 $extralabels = $extrafields->attributes["product_fournisseur_price"]['label'];
1109
1110 if (!empty($extralabels)) {
1111 foreach ($extralabels as $key => $value) {
1112 // Show field if not hidden
1113 if (!empty($extrafields->attributes["product_fournisseur_price"]['list'][$key]) && $extrafields->attributes["product_fournisseur_price"]['list'][$key] != 3) {
1114 if (!empty($extrafields->attributes["product_fournisseur_price"]['langfile'][$key])) {
1115 $langs->load($extrafields->attributes["product_fournisseur_price"]['langfile'][$key]);
1116 }
1117 if (!empty($extrafields->attributes["product_fournisseur_price"]['help'][$key])) {
1118 $extratitle = $form->textwithpicto($langs->trans($value), $langs->trans($extrafields->attributes["product_fournisseur_price"]['help'][$key]));
1119 } else {
1120 $extratitle = $langs->trans($value);
1121 }
1122 if (!empty($arrayfields['ef.' . $key]['checked'])) {
1123 print_liste_field_titre($extratitle, $_SERVER["PHP_SELF"], 'ef.' . $key, '', $param, '', $sortfield, $sortorder, 'right ');
1124 $nbfields++;
1125 }
1126 }
1127 }
1128 }
1129 }
1130
1131 if (is_object($hookmanager)) {
1132 $parameters = array('id_fourn'=>(!empty($id_fourn) ? $id_fourn : ''), 'prod_id'=>$object->id, 'nbfields'=>$nbfields);
1133 $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action);
1134 }
1135 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1136 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'maxwidthsearch center ');
1137 $nbfields++;
1138 }
1139 print "</tr>\n";
1140
1141 if (is_array($product_fourn_list)) {
1142 foreach ($product_fourn_list as $productfourn) {
1143 print '<tr class="oddeven">';
1144
1145 // Action column
1146 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1147 print '<td class="center nowraponall">';
1148 if ($usercancreate) {
1149 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>";
1150 print ' &nbsp; ';
1151 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>';
1152 }
1153
1154 print '</td>';
1155 }
1156
1157 // Date from
1158 if (!empty($arrayfields['pfp.datec']['checked'])) {
1159 print '<td>'.dol_print_date(($productfourn->fourn_date_creation ? $productfourn->fourn_date_creation : $productfourn->date_creation), 'dayhour', 'tzuserrel').'</td>';
1160 }
1161
1162 // Supplier
1163 if (!empty($arrayfields['s.nom']['checked'])) {
1164 print '<td class="tdoverflowmax150">'.$productfourn->getSocNomUrl(1, 'supplier').'</td>';
1165 }
1166
1167 // Supplier ref
1168 if ($usercancreate) { // change required right here
1169 print '<td class="tdoverflowmax150">'.$productfourn->getNomUrl().'</td>';
1170 } else {
1171 print '<td class="tdoverflowmax150">'.dol_escape_htmltag($productfourn->fourn_ref).'</td>';
1172 }
1173
1174 // Availability
1175 if (!empty($arrayfields['pfp.fk_availability']['checked'])) {
1176 $form->load_cache_availability();
1177 $availability = $form->cache_availability[$productfourn->fk_availability]['label'];
1178 print '<td class="left">'.$availability.'</td>';
1179 }
1180
1181 // Quantity
1182 if (!empty($arrayfields['pfp.quantity']['checked'])) {
1183 print '<td class="right">';
1184 print dolPrintHTML($productfourn->fourn_qty);
1185 // Units
1186 if (getDolGlobalString('PRODUCT_USE_UNITS')) {
1187 $unit = $object->getLabelOfUnit('long', $langs);
1188 if ($unit !== '') {
1189 print '&nbsp;&nbsp;'.$unit;
1190 }
1191 }
1192 print '</td>';
1193 }
1194
1195 // VAT rate
1196 print '<td class="right">';
1197 print vatrate($productfourn->fourn_tva_tx, true);
1198 print '</td>';
1199
1200 // Price for the quantity
1201 if (!empty($arrayfields['pfp.price']['checked'])) {
1202 print '<td class="right">';
1203 print $productfourn->fourn_price ? '<span class="amount">'.price($productfourn->fourn_price).'</span>' : "";
1204 print '</td>';
1205 }
1206
1207 if (isModEnabled("multicurrency") && !empty($arrayfields['pfp.multicurrency_price']['checked'])) {
1208 // Price for the quantity in currency
1209 print '<td class="right">';
1210 print $productfourn->fourn_multicurrency_price ? '<span class="amount">'.price($productfourn->fourn_multicurrency_price).'</span>' : "";
1211 print '</td>';
1212 }
1213
1214 // Unit price
1215 if (!empty($arrayfields['pfp.unitprice']['checked'])) {
1216 print '<td class="right">';
1217 print price($productfourn->fourn_unitprice);
1218 //print $objp->unitprice? price($objp->unitprice) : ($objp->quantity?price($objp->price/$objp->quantity):"&nbsp;");
1219 print '</td>';
1220 }
1221
1222 // Unit price in currency
1223 if (!empty($arrayfields['pfp.multicurrency_unitprice']['checked'])) {
1224 print '<td class="right">';
1225 print price($productfourn->fourn_multicurrency_unitprice);
1226 print '</td>';
1227 }
1228
1229 // Currency
1230 if (isModEnabled("multicurrency")) {
1231 print '<td class="right nowraponall">';
1232 print $productfourn->fourn_multicurrency_code ? currency_name($productfourn->fourn_multicurrency_code) : '';
1233 print '</td>';
1234 }
1235
1236 // Charges
1237 if (!empty($arrayfields['pfp.charges']['checked'])) { // Possible only when getDolGlobalString('PRODUCT_CHARGES') is set
1238 print '<td class="right">';
1239 print price($productfourn->fourn_charges);
1240 print '</td>';
1241 }
1242
1243 // Discount
1244 print '<td class="right">';
1245 print price2num($productfourn->fourn_remise_percent).'%';
1246 print '</td>';
1247
1248 // Delivery delay
1249 if (!empty($arrayfields['pfp.delivery_time_days']['checked'])) {
1250 print '<td class="right">';
1251 print $productfourn->delivery_time_days;
1252 print '</td>';
1253 }
1254
1255 // Reputation
1256 if (!empty($arrayfields['pfp.supplier_reputation']['checked'])) {
1257 print '<td class="center">';
1258 if (!empty($productfourn->supplier_reputation) && !empty($object->reputations[$productfourn->supplier_reputation])) {
1259 print $object->reputations[$productfourn->supplier_reputation];
1260 }
1261 print'</td>';
1262 }
1263
1264 // Barcode type
1265 if (!empty($arrayfields['pfp.fk_barcode_type']['checked'])) {
1266 print '<td class="center">';
1267 $productfourn->barcode_type = !empty($productfourn->supplier_fk_barcode_type) ? $productfourn->supplier_fk_barcode_type : 0;
1268 $productfourn->fetchBarCode();
1269 print $productfourn->barcode_type_label ? $productfourn->barcode_type_label : ($productfourn->supplier_barcode ? '<div class="warning">'.$langs->trans("SetDefaultBarcodeType").'<div>' : '');
1270 print '</td>';
1271 }
1272
1273 // Barcode
1274 if (!empty($arrayfields['pfp.barcode']['checked'])) {
1275 print '<td class="right">';
1276 print $productfourn->supplier_barcode;
1277 print '</td>';
1278 }
1279
1280 // Packaging
1281 if (!empty($arrayfields['pfp.packaging']['checked'])) {
1282 print '<td class="center">';
1283 print price2num($productfourn->packaging);
1284 print '</td>';
1285 }
1286
1287 // Status
1288 if (!empty($arrayfields['pfp.status']['checked'])) {
1289 print '<td class="center">';
1290 print $productfourn->getLibStatut(3);
1291 print '</td>';
1292 }
1293
1294 // Date modification
1295 if (!empty($arrayfields['pfp.tms']['checked'])) {
1296 print '<td class="right nowraponall">';
1297 print dol_print_date(($productfourn->fourn_date_modification ? $productfourn->fourn_date_modification : $productfourn->date_modification), "dayhour", "tzuserrel");
1298 print '</td>';
1299 }
1300
1301 // Extrafields
1302 if (!empty($extralabels)) {
1303 $sql = "SELECT";
1304 $sql .= " fk_object";
1305 foreach ($extralabels as $key => $value) {
1306 $sql .= ", ".$key;
1307 }
1308 $sql .= " FROM ".MAIN_DB_PREFIX."product_fournisseur_price_extrafields";
1309 $sql .= " WHERE fk_object = ".((int) $productfourn->product_fourn_price_id);
1310 $resql = $db->query($sql);
1311 if ($resql) {
1312 if ($db->num_rows($resql) != 1) {
1313 foreach ($extralabels as $key => $value) {
1314 if (!empty($arrayfields['ef.'.$key]['checked']) && !empty($extrafields->attributes["product_fournisseur_price"]['list'][$key]) && $extrafields->attributes["product_fournisseur_price"]['list'][$key] != 3) {
1315 print "<td></td>";
1316 }
1317 }
1318 } else {
1319 $obj = $db->fetch_object($resql);
1320 foreach ($extralabels as $key => $value) {
1321 if (!empty($arrayfields['ef.'.$key]['checked']) && !empty($extrafields->attributes["product_fournisseur_price"]['list'][$key]) && $extrafields->attributes["product_fournisseur_price"]['list'][$key] != 3) {
1322 print '<td align="right">'.$extrafields->showOutputField($key, $obj->{$key}, '', 'product_fournisseur_price')."</td>";
1323 }
1324 }
1325 }
1326 $db->free($resql);
1327 }
1328 }
1329
1330 if (is_object($hookmanager)) {
1331 $parameters = array('id_pfp'=>$productfourn->product_fourn_price_id, 'id_fourn'=>(!empty($id_fourn) ? $id_fourn : ''), 'prod_id'=>$object->id);
1332 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action);
1333 }
1334
1335 // Modify-Remove
1336 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1337 print '<td class="center nowraponall">';
1338 if ($usercancreate) {
1339 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>";
1340 print ' &nbsp; ';
1341 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>';
1342 }
1343
1344 print '</td>';
1345 }
1346
1347 print '</tr>';
1348 }
1349
1350 if (empty($product_fourn_list)) {
1351 print '<tr><td colspan="'.$nbfields.'"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
1352 }
1353 } else {
1354 dol_print_error($db);
1355 }
1356
1357 print '</table>';
1358 print '</div>';
1359 print '</form>';
1360 }
1361 }
1362} else {
1363 print $langs->trans("ErrorUnknown");
1364}
1365
1366// End of page
1367llxFooter();
1368$db->close();
$id
Definition account.php:48
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:66
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:87
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.
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, $allowothertags=array())
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.
dolPrintHTML($s, $allowiframe=0)
Return a string (that can be on several lines) ready to be output on a HTML page.
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.