dolibarr 23.0.3
getSupplierPrices.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2012 Christophe Battarel <christophe.battarel@altairis.fr>
3 * Copyright (C) 2015 Francis Appels <francis.appels@z-application.com>
4 * Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net>
5 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
26if (!defined('NOTOKENRENEWAL')) {
27 define('NOTOKENRENEWAL', '1'); // Disables token renewal
28}
29if (!defined('NOREQUIREMENU')) {
30 define('NOREQUIREMENU', '1');
31}
32if (!defined('NOREQUIREAJAX')) {
33 define('NOREQUIREAJAX', '1');
34}
35if (!defined('NOREQUIRESOC')) {
36 define('NOREQUIRESOC', '1');
37}
38
39// Load Dolibarr environment
40require '../../main.inc.php';
41require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php';
50$idprod = GETPOSTINT('idprod');
51
52$prices = array();
53
54// Load translation files required by the page
55$langs->loadLangs(array("stocks", "margins", "products"));
56
57if (!isModEnabled('product') && !isModEnabled('service')) {
58 accessforbidden("Not allowed");
59}
60if (!$user->hasRight('fournisseur', 'lire')) {
61 accessforbidden("Not allowed");
62}
63
65
66if ($idprod > 0) {
67 $object->fetch($idprod);
68
69 if ($object->type == $object::TYPE_PRODUCT) {
70 restrictedArea($user, 'produit', $object->id, 'product&product', '', '');
71 }
72 if ($object->type == $object::TYPE_SERVICE) {
73 restrictedArea($user, 'service', $object->id, 'product&product', '', '');
74 }
75} else {
76 restrictedArea($user, 'produit|service', 0, 'product&product', '', '', 'rowid');
77}
78
79
80
81/*
82 * View
83 */
84
86
87//print '<!-- Ajax page called with url '.dol_escape_htmltag($_SERVER["PHP_SELF"]).'?'.dol_escape_htmltag($_SERVER["QUERY_STRING"]).' -->'."\n";
88
89if ($idprod > 0) {
90 $sorttouse = 's.nom, pfp.quantity, pfp.price';
91 if (GETPOST('bestpricefirst')) {
92 $sorttouse = 'pfp.unitprice, s.nom, pfp.quantity, pfp.price';
93 }
94
95 $productSupplierArray = $object->list_product_fournisseur_price($idprod, $sorttouse); // We list all price per supplier, and then firstly with the lower quantity. So we can choose first one with enough quantity into list.
96 if (is_array($productSupplierArray)) {
97 foreach ($productSupplierArray as $productSupplier) {
98 if (getDolGlobalInt("DISABLE_BAD_REPUTATION_PRODUCT_PRICE") && $productSupplier->supplier_reputation == "DONOTORDER") {
99 continue;
100 }
101
102 $price = $productSupplier->fourn_price * (1 - $productSupplier->fourn_remise_percent / 100);
103 $unitprice = $productSupplier->fourn_unitprice * (1 - $productSupplier->fourn_remise_percent / 100);
104
105 $title = $productSupplier->fourn_name.' - '.$productSupplier->fourn_ref.' - ';
106
107 if ($productSupplier->fourn_qty == 1) {
108 $title .= price($price, 0, $langs, 0, 0, -1, $conf->currency)."/";
109 }
110 $title .= $productSupplier->fourn_qty.' '.($productSupplier->fourn_qty == 1 ? $langs->trans("Unit") : $langs->trans("Units"));
111
112 if ($productSupplier->fourn_qty > 1) {
113 $title .= " - ";
114 $title .= price($unitprice, 0, $langs, 0, 0, -1, $conf->currency)."/".$langs->trans("Unit");
115 $price = $unitprice;
116 }
117
118 $label = price($price, 0, $langs, 0, 0, -1, $conf->currency)."/".$langs->trans("Unit");
119 if ($productSupplier->fourn_ref) {
120 $label .= ' ('.$productSupplier->fourn_ref.')';
121 }
122
123 $prices[] = array(
124 "id" => $productSupplier->product_fourn_price_id,
125 "price" => price2num($price, '', 0),
126 "label" => $label,
127 "title" => $title,
128 // Carry the product's default unit so the line form can preselect
129 // #units like the customer side already does for idprod (see
130 // issues #34610 for the customer side and #38636 for the
131 // supplier side).
132 "fk_unit" => $productSupplier->fk_unit,
133 ); // For price field, we must use price2num(), for label or title, price()
134 }
135 }
136
137 // After best supplier prices and before costprice
138 if (isModEnabled('stock')) {
139 // Add price for pmp
140 $price = $object->pmp;
141 if (empty($price) && getDolGlobalString('PRODUCT_USE_SUB_COST_PRICES_IF_COST_PRICE_EMPTY')) {
142 // get pmp for subproducts if any
143 $object->get_sousproduits_arbo();
144 $prods_arbo = $object->get_arbo_each_prod();
145 if (!empty($prods_arbo)) {
146 $price = 0;
147 foreach ($prods_arbo as $child) {
148 $sousprod = new Product($db);
149 $sousprod->fetch($child['id']);
150 $price += $sousprod->pmp;
151 }
152 }
153 }
154
155 $prices[] = array("id" => 'pmpprice', "price" => price2num($price, 'MU'), "label" => $langs->trans("PMPValueShort").': '.price($price, 0, $langs, 0, 0, -1, $conf->currency), "title" => $langs->trans("PMPValueShort").': '.price($price, 0, $langs, 0, 0, -1, $conf->currency)); // For price field, we must use price2num(), for label or title, price()
156 }
157
158 // Add price for costprice (at end)
159 $price = $object->cost_price;
160 if (empty($price) && getDolGlobalString('PRODUCT_USE_SUB_COST_PRICES_IF_COST_PRICE_EMPTY')) {
161 // get costprice for subproducts if any
162 $object->get_sousproduits_arbo();
163 $prods_arbo = $object->get_arbo_each_prod();
164 if (!empty($prods_arbo)) {
165 $price = 0;
166 foreach ($prods_arbo as $child) {
167 $sousprod = new Product($db);
168 $sousprod->fetch($child['id']);
169 $price += $sousprod->cost_price;
170 }
171 }
172 }
173
174 $prices[] = array("id" => 'costprice', "price" => price2num($price), "label" => $langs->trans("CostPrice").': '.price($price, 0, $langs, 0, 0, -1, $conf->currency), "title" => $langs->trans("PMPValueShort").': '.price($price, 0, $langs, 0, 0, -1, $conf->currency)); // For price field, we must use price2num(), for label or title, price()
175}
176
177echo json_encode($prices);
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
Class to manage predefined suppliers products.
Class to manage products or services.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
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.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
if(!defined( 'NOREQUIREMENU')) if(!empty(GETPOST('seteventmessages', 'alpha'))) if(!function_exists("llxHeader")) top_httphead($contenttype='text/html', $forcenocache=0)
Show HTTP header.
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.