dolibarr 25.0.0-alpha
commande_fournisseur.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2003-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2009 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2014 Florian Henry <florian.henry@open-concept.pro>
6 * Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
7 * Copyright (C) 2024 Charlene Benke <charlene@patas-monkey.com>
8 * Copyright (C) 2025 MDW <mdeweerd@users.noreply.github.com>
9 * Copyright (C) 2026 Vincent MAURY TimGroup <vmaury@timgroup.fr>
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program. If not, see <https://www.gnu.org/licenses/>.
23 */
24
30require '../../main.inc.php';
38require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php';
39require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
40require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
41require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
42require_once DOL_DOCUMENT_ROOT.'/core/class/html.formorder.class.php';
43
44// Load translation files required by the page
45$langs->loadLangs(array('orders', 'products', 'companies', 'sendings'));
46
47$id = GETPOSTINT('id');
48$ref = GETPOST('ref', 'alpha');
49
50// Security check
51$fieldvalue = (!empty($id) ? $id : (!empty($ref) ? $ref : ''));
52$fieldtype = (!empty($ref) ? 'ref' : 'rowid');
53$socid = '';
54if (!empty($user->socid)) {
55 $socid = $user->socid;
56}
57
58// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
59$hookmanager->initHooks(array('productstatssupplierorder'));
60
61$mesg = '';
62
63// Load variable for pagination
64$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
65$sortfield = GETPOST('sortfield', 'aZ09comma');
66$sortorder = GETPOST('sortorder', 'aZ09comma');
67$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
68if (empty($page) || $page == -1) {
69 $page = 0;
70} // If $page is not defined, or '' or -1
71$offset = $limit * $page;
72$pageprev = $page - 1;
73$pagenext = $page + 1;
74if (!$sortorder) {
75 $sortorder = "DESC";
76}
77if (!$sortfield) {
78 $sortfield = "c.date_commande";
79}
80$search_month = GETPOSTINT('search_month');
81$search_year = GETPOSTINT('search_year');
82if (GETPOSTISARRAY('search_status')) {
83 $search_status = implode(',', GETPOST('search_status', 'array:intcomma'));
84} else {
85 $search_status = (GETPOST('search_status', 'intcomma') != '' ? GETPOST('search_status', 'intcomma') : GETPOST('statut', 'intcomma'));
86}
87$search_company = GETPOSTINT('search_company');
88
89if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
90 $search_month = '';
91 $search_year = '';
92 $search_status = '';
93 $search_company = '';
94}
95
96$result = restrictedArea($user, 'produit|service', $fieldvalue, 'product&product', '', '', $fieldtype);
97
98
99/*
100 * View
101 */
102
103$supplierorderstatic = new CommandeFournisseur($db);
104$societestatic = new Societe($db);
105
106$form = new Form($db);
107$formother = new FormOther($db);
108$formorder = new FormOrder($db);
109
110if ($id > 0 || !empty($ref)) {
111 $product = new Product($db);
112 $result = $product->fetch($id, $ref);
113
114 $object = $product;
115
116 $parameters = array('id' => $id);
117 $reshook = $hookmanager->executeHooks('doActions', $parameters, $product, $action); // Note that $action and $object may have been modified by some hooks
118 if ($reshook < 0) {
119 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
120 }
121
122 llxHeader("", "", $langs->trans("CardProduct".$product->type), '', 0, 0, '', '', 'mod-product page-stats_commande_fournisseur');
123
124 if ($result > 0) {
125 $head = product_prepare_head($product);
126 $titre = $langs->trans("CardProduct".$product->type);
127 $picto = ($product->type == Product::TYPE_SERVICE ? 'service' : 'product');
128 print dol_get_fiche_head($head, 'referers', $titre, -1, $picto);
129
130 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $product, $action); // Note that $action and $object may have been modified by hook
131 print $hookmanager->resPrint;
132 if ($reshook < 0) {
133 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
134 }
135
136 $linkback = '<a href="'.DOL_URL_ROOT.'/product/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
137
138 $shownav = 1;
139 if ($user->socid && !in_array('product', explode(',', getDolGlobalString('MAIN_MODULES_FOR_EXTERNAL')))) {
140 $shownav = 0;
141 }
142
143 dol_banner_tab($object, 'ref', $linkback, $shownav, 'ref');
144
145 print '<div class="fichecenter">';
146
147 print '<div class="clearboth"></div>';
148 print '<table class="noborder tableforfield centpercent">';
149
150 $nboflines = show_stats_for_company($product, $socid);
151
152 print "</table>";
153
154 print '</div>';
155 print '<div class="clearboth"></div>';
156
157 print dol_get_fiche_end();
158
159
160 if ($user->hasRight('fournisseur', 'commande', 'lire')) {
161 $sql = "SELECT DISTINCT s.nom as name, s.rowid as socid, s.code_client,";
162 $sql .= " c.rowid, d.total_ht as total_ht, c.ref,";
163 $sql .= " c.date_livraison as delivery_date,";
164 $sql .= " c.date_commande, c.fk_statut as status, c.billed, c.rowid as commandeid, d.rowid, d.qty, d.subprice as unitprice";
165 if (!$user->hasRight('societe', 'client', 'voir')) {
166 $sql .= ", sc.fk_soc, sc.fk_user ";
167 }
168 $sql .= " FROM ".MAIN_DB_PREFIX."societe as s";
169 $sql .= ", ".MAIN_DB_PREFIX."commande_fournisseur as c";
170 $sql .= ", ".MAIN_DB_PREFIX."commande_fournisseurdet as d";
171 if (!$user->hasRight('societe', 'client', 'voir')) {
172 $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
173 }
174 $sql .= " WHERE c.fk_soc = s.rowid";
175 $sql .= " AND c.entity IN (".getEntity('supplier_order').")";
176 $sql .= " AND d.fk_commande = c.rowid";
177 $sql .= " AND d.fk_product = ".((int) $product->id);
178 if (!empty($search_month)) {
179 $sql .= " AND MONTH(c.date_commande) = ".((int) $search_month);
180 }
181 if (!empty($search_year)) {
182 $sql .= " AND YEAR(c.date_commande) = ".((int) $search_year);
183 }
184 if (!$user->hasRight('societe', 'client', 'voir')) {
185 $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
186 }
187 if ($socid) {
188 $sql .= " AND c.fk_soc = ".((int) $socid);
189 } elseif ($search_company > 0) {
190 $sql .= " AND c.fk_soc = ".((int) $search_company);
191 }
192
193 if ($search_status != '') {
194 $sql .= " AND c.fk_statut IN (".$db->sanitize($search_status).")";
195 }
196
197 $sql .= $db->order($sortfield, $sortorder);
198
199 // Calcul total qty and amount for global if full scan list
200 $total_ht = 0;
201 $total_qty = 0;
202
203 // Count total nb of records
204 $totalofrecords = '';
205 if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
206 $result = $db->query($sql);
207 $totalofrecords = $db->num_rows($result);
208 }
209
210 $sql .= $db->plimit($limit + 1, $offset);
211
212 $result = $db->query($sql);
213 if ($result) {
214 $num = $db->num_rows($result);
215
216 $option = '&id='.$product->id;
217
218 if ($limit > 0 && $limit != $conf->liste_limit) {
219 $option .= '&limit='.((int) $limit);
220 }
221 if (!empty($search_month)) {
222 $option .= '&search_month='.urlencode((string) ($search_month));
223 }
224 if (!empty($search_year)) {
225 $option .= '&search_year='.urlencode((string) ($search_year));
226 }
227
228 if ($search_status != '') {
229 $option .= '&search_status='.urlencode($search_status);
230 }
231
232 print '<span id="anchorundermenu" class="anchorundermenu"></span>';
233 print '<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$product->id.'" name="search_form">'."\n";
234 print '<input type="hidden" name="token" value="'.newToken().'">';
235 print '<input type="hidden" name="page_y" value="">';
236 if (!empty($sortfield)) {
237 print '<input type="hidden" name="sortfield" value="'.$sortfield.'"/>';
238 }
239 if (!empty($sortorder)) {
240 print '<input type="hidden" name="sortorder" value="'.$sortorder.'"/>';
241 }
242
243 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
244 print_barre_liste($langs->trans("SuppliersOrders"), $page, $_SERVER["PHP_SELF"], $option, $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit, 0, 0, 1);
245
246 if (!empty($page)) {
247 $option .= '&page='.urlencode((string) ($page));
248 }
249
250 print '<div class="liste_titre liste_titre_bydiv centpercent">';
251 print '<div class="divsearchfield">';
252 print $langs->trans('Period').' ('.$langs->trans("OrderDate").') - ';
253 print $langs->trans('Month').':<input class="flat" type="text" size="4" name="search_month" value="'.($search_month > 0 ? $search_month : '').'"> ';
254 print $langs->trans('Year').':'.$formother->selectyear(($search_year ? (string) $search_year : '-1'), 'search_year', 1, 20, 5);
255 print $langs->trans('Status');
256 $formorder->selectSupplierOrderStatus($search_status, 1, 'search_status');
257 if (empty($socid)) print $langs->trans('Company').' : '.$form->select_company($search_company, 'search_company', '(s.fournisseur:=:1)', 1);
258 print '<div style="vertical-align: middle; display: inline-block">';
259 print '<input type="image" class="liste_titre reposition" name="button_search" src="'.img_picto($langs->trans("Search"), 'search.png', '', 0, 1).'" value="'.dol_escape_htmltag($langs->trans("Search")).'" title="'.dol_escape_htmltag($langs->trans("Search")).'">';
260 print '<input type="image" class="liste_titre reposition" name="button_removefilter" src="'.img_picto($langs->trans("Search"), 'searchclear.png', '', 0, 1).'" value="'.dol_escape_htmltag($langs->trans("RemoveFilter")).'" title="'.dol_escape_htmltag($langs->trans("RemoveFilter")).'">';
261 print '</div>';
262 print '</div>';
263 print '</div>';
264
265 $i = 0;
266 print '<div class="div-table-responsive">';
267 print '<table class="tagtable liste listwithfilterbefore centpercent">';
268 print '<tr class="liste_titre">';
269 print_liste_field_titre("Ref", $_SERVER["PHP_SELF"], "c.rowid", "", $option, '', $sortfield, $sortorder);
270 print_liste_field_titre("Company", $_SERVER["PHP_SELF"], "s.nom", "", $option, '', $sortfield, $sortorder);
271 print_liste_field_titre("SupplierCode", $_SERVER["PHP_SELF"], "s.code_client", "", $option, '', $sortfield, $sortorder);
272 print_liste_field_titre("OrderDate", $_SERVER["PHP_SELF"], "c.date_commande", "", $option, 'align="center"', $sortfield, $sortorder);
273 print_liste_field_titre('DateDeliveryPlanned', $_SERVER['PHP_SELF'], 'c.date_livraison', '', $option, 'align="center"', $sortfield, $sortorder);
274 print_liste_field_titre("Qty", $_SERVER["PHP_SELF"], "d.qty", "", $option, 'align="center"', $sortfield, $sortorder);
275 print_liste_field_titre("UnitPrice", $_SERVER["PHP_SELF"], "d.unitprice", "", $option, 'align="right"', $sortfield, $sortorder);
276 print_liste_field_titre("AmountHT", $_SERVER["PHP_SELF"], "d.total_ht", "", $option, 'align="right"', $sortfield, $sortorder);
277 print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "c.fk_statut", "", $option, 'align="right"', $sortfield, $sortorder);
278 print "</tr>\n";
279
280 if ($num > 0) {
281 while ($i < min($num, $limit)) {
282 $objp = $db->fetch_object($result);
283
284 $total_ht += $objp->total_ht;
285 $total_qty += $objp->qty;
286
287 $supplierorderstatic->id = $objp->commandeid;
288 $supplierorderstatic->ref = $objp->ref;
289
290 $supplierorderstatic->statut = $objp->status; // deprecated
291 $supplierorderstatic->status = $objp->status;
292 $supplierorderstatic->billed = $objp->billed;
293
294 $societestatic->fetch($objp->socid);
295
296 print '<tr class="oddeven">';
297 print '<td>';
298 print $supplierorderstatic->getNomUrl(1);
299 print "</td>\n";
300 print '<td>'.$societestatic->getNomUrl(1).'</td>';
301 print "<td>".$objp->code_client."</td>\n";
302 print '<td class="center">';
303 print dol_print_date($db->jdate($objp->date_commande), 'dayhour')."</td>";
304 // delivery planned date
305 print '<td class="center">';
306 print dol_print_date($db->jdate($objp->delivery_date), 'dayhour');
307 print '</td>';
308 print '<td class="center">'.$objp->qty."</td>\n";
309 print '<td align="right">'.price($objp->unitprice)."</td>\n";
310 print '<td align="right">'.price($objp->total_ht)."</td>\n";
311 print '<td align="right">'.$supplierorderstatic->getLibStatut(4).'</td>';
312 print "</tr>\n";
313 $i++;
314 }
315 }
316 print '<tr class="liste_total">';
317 if ($num < $limit && empty($offset)) {
318 print '<td>'.$langs->trans("Total").'</td>';
319 } else {
320 print '<td>'.$form->textwithpicto($langs->trans("Total"), $langs->trans("Totalforthispage")).'</td>';
321 }
322 print '<td colspan="3"></td>';
323 // delivery planned date
324 print '<td></td>';
325 print '<td class="center">'.$total_qty.'</td>';
326 print '<td></td>';
327 print '<td align="right">'.price($total_ht).'</td>';
328 print '<td></td>';
329 print "</table>";
330 print '</div>';
331 print '</form>';
332 } else {
333 dol_print_error($db);
334 }
335 $db->free($result);
336 }
337 }
338} else {
339 dol_print_error();
340}
341
342// End of page
343llxFooter();
344$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
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:73
Class to manage predefined suppliers products.
Class to manage generation of HTML components Only common components must be here.
Class to manage HTML output components for orders Before adding component here, check they are not in...
Class to help generate other html components Only common components are here.
Class to manage products or services.
const TYPE_SERVICE
Service.
Class to manage third parties objects (customers, suppliers, prospects...)
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
GETPOSTISARRAY($paramname, $method=0)
Return true if the parameter $paramname is submit from a POST OR GET as an array.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
Definition html.lib.php:540
dol_get_fiche_end($notab=0)
Return tab footer of a card.
Definition html.lib.php:738
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Definition html.lib.php:181
product_prepare_head($object)
Prepare array with list of tabs.
show_stats_for_company($product, $socid)
Show stats for a product.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $nodie=0, $mode='')
Check permissions of a user to show a page and an object.