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-2016 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2014 Juanjo Menent <jmenent@2byte.es>
6 * Copyright (C) 2014 Florian Henry <florian.henry@open-concept.pro>
7 * Copyright (C) 2023 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
8 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
9 * Copyright (C) 2025 MDW <mdeweerd@users.noreply.github.com>
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
31// Load Dolibarr environment
32require '../../../main.inc.php';
40require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php';
41require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
42require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
43require_once DOL_DOCUMENT_ROOT.'/product/stock/class/productlot.class.php';
44require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
45
46// Load translation files required by the page
47$langs->loadLangs(array('companies', 'bills', 'products', 'orders'));
48
49$id = GETPOSTINT('id');
50$ref = GETPOST('ref', 'alpha');
51$batch = GETPOST('batch', 'alpha');
52$objectid = GETPOSTINT('productid');
53
54// Security check
55$fieldvalue = (!empty($id) ? $id : (!empty($ref) ? $ref : ''));
56$fieldtype = (!empty($ref) ? 'ref' : 'rowid');
57$socid = 0;
58if (!empty($user->socid)) {
59 $socid = $user->socid;
60}
61
62// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
63$hookmanager->initHooks(array('batchproductstatssupplierorder'));
64
65$showmessage = GETPOST('showmessage');
66
67// Load variable for pagination
68$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
69$sortfield = GETPOST('sortfield', 'aZ09comma');
70$sortorder = GETPOST('sortorder', 'aZ09comma');
71$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
72if (empty($page) || $page == -1) {
73 $page = 0;
74} // If $page is not defined, or '' or -1
75$offset = $limit * $page;
76$pageprev = $page - 1;
77$pagenext = $page + 1;
78if (empty($sortorder)) {
79 $sortorder = "DESC";
80}
81if (empty($sortfield)) {
82 $sortfield = "cf.date_commande";
83}
84
85$search_month = GETPOST('search_month'); // Can be ''
86$search_year = GETPOST('search_year'); // Can be '''
87
88if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
89 $search_month = '';
90 $search_year = '';
91}
92
93if (!$user->hasRight('produit', 'lire')) {
95}
96
97
98/*
99 * View
100 */
101
102$commandefournisseurstatic = new CommandeFournisseur($db);
103$societestatic = new Societe($db);
104
105$form = new Form($db);
106$formother = new FormOther($db);
107
108if ($id > 0 || !empty($ref)) {
109 $object = new Productlot($db);
110 if ($ref) {
111 $tmp = explode('_', $ref);
112 $objectid = $tmp[0];
113 $batch = $tmp[1];
114 }
115 $result = $object->fetch($id, $objectid, $batch);
116
117 $parameters = array('id' => $id);
118 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
119 if ($reshook < 0) {
120 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
121 }
122
123 $helpurl = '';
124 $shortlabel = dol_trunc($object->batch, 16);
125 $title = $langs->trans('Batch')." ".$shortlabel." - ".$langs->trans('Referers');
126 $helpurl = 'EN:Module_Products|FR:Module_Produits|ES:M&oacute;dulo_Productos';
127
128 llxHeader('', $title, $helpurl, '', 0, 0, '', '', '', 'mod-product page-stock-stats_commande_fournisseur');
129
130 if ($result > 0) {
132 $picto = 'lot';
133 $morehtmlref = '';
134 print dol_get_fiche_head($head, 'referers', $langs->trans("Batch"), -1, $object->picto);
135
136 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
137 print $hookmanager->resPrint;
138 if ($reshook < 0) {
139 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
140 }
141
142 $linkback = '<a href="'.DOL_URL_ROOT.'/product/stock/productlot_list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
143
144 $shownav = 1;
145 if ($user->socid && !in_array('product', explode(',', getDolGlobalString('MAIN_MODULES_FOR_EXTERNAL')))) {
146 $shownav = 0;
147 }
148
149 dol_banner_tab($object, 'id', $linkback, $shownav, 'rowid', 'batch', $morehtmlref);
150
151 print '<div class="fichecenter">';
152
153 print '<div class="underbanner clearboth"></div>';
154 print '<table class="border centpercent tableforfield">';
155
156 // Product
157 print '<tr><td class="titlefield">'.$langs->trans("Product").'</td><td>';
158 $producttmp = new Product($db);
159 $producttmp->fetch($object->fk_product);
160 print $producttmp->getNomUrl(1, 'stock')." - ".$producttmp->label;
161 print '</td></tr>';
162 print "</table>";
163
164 echo '<br>';
165
166 // // Sell by
167 // if (empty($conf->global->PRODUCT_DISABLE_SELLBY)) {
168 // print '<tr><td>';
169 // print $form->editfieldkey($langs->trans('SellByDate'), 'sellby', $object->sellby, $object, $user->rights->stock->creer, 'datepicker');
170 // print '</td><td>';
171 // print $form->editfieldval($langs->trans('SellByDate'), 'sellby', $object->sellby, $object, $user->rights->stock->creer, 'datepicker');
172 // print '</td>';
173 // print '</tr>';
174 // }
175 //
176 // // Eat by
177 // if (empty($conf->global->PRODUCT_DISABLE_EATBY)) {
178 // print '<tr><td>';
179 // print $form->editfieldkey($langs->trans('EatByDate'), 'eatby', $object->eatby, $object, $user->rights->stock->creer, 'datepicker');
180 // print '</td><td>';
181 // print $form->editfieldval($langs->trans('EatByDate'), 'eatby', $object->eatby, $object, $user->rights->stock->creer, 'datepicker');
182 // print '</td>';
183 // print '</tr>';
184 // }
185 //
186 // if (getDolGlobalString('PRODUCT_LOT_ENABLE_TRACEABILITY')) {
187 // print '<tr><td>'.$form->editfieldkey($langs->trans('ManufacturingDate'), 'manufacturing_date', $object->manufacturing_date, $object, $user->rights->stock->creer).'</td>';
188 // print '<td>'.$form->editfieldval($langs->trans('ManufacturingDate'), 'manufacturing_date', $object->manufacturing_date, $object, $user->rights->stock->creer, 'datepicker').'</td>';
189 // print '</tr>';
190 // // print '<tr><td>'.$form->editfieldkey($langs->trans('FirstUseDate'), 'commissionning_date', $object->commissionning_date, $object, $user->rights->stock->creer).'</td>';
191 // // print '<td>'.$form->editfieldval($langs->trans('FirstUseDate'), 'commissionning_date', $object->commissionning_date, $object, $user->rights->stock->creer, 'datepicker').'</td>';
192 // // print '</tr>';
193 // print '<tr><td>'.$form->editfieldkey($langs->trans('DestructionDate'), 'scrapping_date', $object->scrapping_date, $object, $user->rights->stock->creer).'</td>';
194 // print '<td>'.$form->editfieldval($langs->trans('DestructionDate'), 'scrapping_date', $object->scrapping_date, $object, $user->rights->stock->creer, 'datepicker').'</td>';
195 // print '</tr>';
196 // }
197 //
198 // // Quality control
199 // if (getDolGlobalString('PRODUCT_LOT_ENABLE_QUALITY_CONTROL')) {
200 // print '<tr><td>'.$form->editfieldkey($langs->trans('EndOfLife'), 'eol_date', $object->eol_date, $object, $user->rights->stock->creer).'</td>';
201 // print '<td>'.$form->editfieldval($langs->trans('EndOfLife'), 'eol_date', $object->eol_date, $object, $user->rights->stock->creer, 'datepicker').'</td>';
202 // print '</tr>';
203 // print '<tr><td>'.$form->editfieldkey($langs->trans('QCFrequency'), 'qc_frequency', $object->qc_frequency, $object, $user->rights->stock->creer).'</td>';
204 // print '<td>'.$form->editfieldval($langs->trans('QCFrequency'), 'qc_frequency', $object->qc_frequency, $object, $user->rights->stock->creer, 'numeric').'</td>';
205 // print '</tr>';
206 // }
207 //
208 // // Other attributes
209 // include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
210
211 print '<table class="noborder centpercent tableforfield">';
212
213 $nboflines = show_stats_for_batch($object, $socid);
214
215 print "</table>";
216
217 print '</div>';
218
219
220 print '<div class="clearboth"></div>';
221
222 print dol_get_fiche_end();
223
224 if ($showmessage && $nboflines > 1) {
225 print '<span class="opacitymedium">'.$langs->trans("ClinkOnALinkOfColumn", $langs->transnoentitiesnoconv("Referers")).'</span>';
226 } elseif ($user->hasRight('fournisseur', 'commande', 'lire')) {
227 $sql = "SELECT DISTINCT s.nom as name, s.rowid as socid, s.code_fournisseur,";
228 $sql .= " cf.ref, cf.date_commande, cf.date_livraison as delivery_date, cf.fk_statut as statut, cf.rowid as facid,";
229 $sql .= " cfd.rowid, SUM(cfdi.qty) as qty";
230 // $sql.= ", cfd.total_ht * SUM(cfdi.qty) / cfd.qty as total_ht_pondere";
231 if (!$user->hasRight('societe', 'client', 'voir')) {
232 $sql .= ", sc.fk_soc, sc.fk_user ";
233 }
234 $sql .= " FROM ".MAIN_DB_PREFIX."societe as s";
235 $sql .= " INNER JOIN ".MAIN_DB_PREFIX."commande_fournisseur as cf ON (cf.fk_soc = s.rowid)";
236 $sql .= " INNER JOIN ".MAIN_DB_PREFIX."commande_fournisseurdet as cfd ON (cfd.fk_commande = cf.rowid)";
237 $sql .= " INNER JOIN ".MAIN_DB_PREFIX."receptiondet_batch as cfdi ON (cfdi.fk_elementdet = cfd.rowid)";
238 if (!$user->hasRight('societe', 'client', 'voir')) {
239 $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
240 }
241 $sql .= " WHERE cf.entity IN (".getEntity('product').")";
242 $sql .= " AND cfdi.batch = '".($db->escape($object->batch))."'";
243 $sql .= " AND cfdi.fk_product = " . (int) $object->fk_product;
244 if (!empty($search_month)) {
245 $sql .= ' AND MONTH(cf.date_commande) IN ('.$db->sanitize((string) $search_month).')';
246 }
247 if (!empty($search_year)) {
248 $sql .= ' AND YEAR(cf.date_commande) IN ('.$db->sanitize((string) $search_year).')';
249 }
250 if (!$user->hasRight('societe', 'client', 'voir')) {
251 $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
252 }
253 if ($socid) {
254 $sql .= " AND cf.fk_soc = ".((int) $socid);
255 }
256 $sql .= " GROUP BY cf.rowid";
257 $sql .= $db->order($sortfield, $sortorder);
258
259 // Calcul total qty and amount for global if full scan list
260 $total_ht_pondere = 0;
261 $total_qty = 0;
262
263 // Count total nb of records
264 $totalofrecords = '';
265 if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
266 $result = $db->query($sql);
267 $totalofrecords = $db->num_rows($result);
268 }
269
270 $sql .= $db->plimit($limit + 1, $offset);
271
272 $result = $db->query($sql);
273 if ($result) {
274 $num = $db->num_rows($result);
275
276 $option = '&id='.$object->id;
277
278 if ($limit > 0 && $limit != $conf->liste_limit) {
279 $option .= '&limit='.((int) $limit);
280 }
281 if (!empty($search_month)) {
282 $option .= '&search_month='.urlencode((string) ($search_month));
283 }
284 if (!empty($search_year)) {
285 $option .= '&search_year='.urlencode((string) ($search_year));
286 }
287
288 print '<form method="post" action="'.$_SERVER ['PHP_SELF'].'?id='.$object->id.'" name="search_form">'."\n";
289 print '<input type="hidden" name="token" value="'.newToken().'">';
290 print '<input type="hidden" name="sortfield" value="'.$sortfield.'"/>';
291 print '<input type="hidden" name="sortorder" value="'.$sortorder.'"/>';
292
293 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
294 print_barre_liste($langs->trans("SuppliersOrders"), $page, $_SERVER["PHP_SELF"], $option, $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit, 0, 0, 1);
295
296 if (!empty($page)) {
297 $option .= '&page='.urlencode((string) ($page));
298 }
299
300 print '<div class="liste_titre liste_titre_bydiv centpercent">';
301 print '<div class="divsearchfield">';
302 print $langs->trans('Period').' ('.$langs->trans("OrderDate").') - ';
303 print $langs->trans('Month').':<input class="flat" type="text" size="4" name="search_month" value="'.$search_month.'"> ';
304 print $langs->trans('Year').':'.$formother->selectyear($search_year ? (string) $search_year : '-1', 'search_year', 1, 20, 5);
305 print '<div style="vertical-align: middle; display: inline-block">';
306 print '<input type="image" class="liste_titre" 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")).'">';
307 print '<input type="image" class="liste_titre" 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")).'">';
308 print '</div>';
309 print '</div>';
310 print '</div>';
311
312 $i = 0;
313 print '<div class="div-table-responsive">';
314 print '<table class="tagtable liste listwithfilterbefore" width="100%">';
315 print '<tr class="liste_titre">';
316 print_liste_field_titre("Ref", $_SERVER["PHP_SELF"], "s.rowid", "", $option, '', $sortfield, $sortorder);
317 print_liste_field_titre("Company", $_SERVER["PHP_SELF"], "s.nom", "", $option, '', $sortfield, $sortorder);
318 print_liste_field_titre("SupplierCode", $_SERVER["PHP_SELF"], "s.code_fournisseur", "", $option, '', $sortfield, $sortorder);
319 print_liste_field_titre("OrderDate", $_SERVER["PHP_SELF"], "cf.date_commande", "", $option, 'align="center"', $sortfield, $sortorder);
320 print_liste_field_titre("DateDeliveryPlanned", $_SERVER["PHP_SELF"], "cf.date_livraison", "", $option, 'align="center"', $sortfield, $sortorder);
321 print_liste_field_titre("Qty", $_SERVER["PHP_SELF"], "cfdi.qty", "", $option, 'align="center"', $sortfield, $sortorder);
322 // print_liste_field_titre("AmountHT", $_SERVER["PHP_SELF"], "total_ht_pondere", "", $option, 'align="right"', $sortfield, $sortorder);
323 print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "cf.fk_statut", "", $option, 'align="right"', $sortfield, $sortorder);
324 print "</tr>\n";
325
326 if ($num > 0) {
327 while ($i < min($num, $limit)) {
328 $objp = $db->fetch_object($result);
329
330 // $total_ht_pondere += $objp->total_ht_pondere;
331 $total_qty += $objp->qty;
332
333 $commandefournisseurstatic->id = $objp->facid;
334 $commandefournisseurstatic->ref = $objp->ref;
335 $societestatic->fetch($objp->socid);
336 // $paiement = $commandefournisseurstatic->getSommePaiement();
337
338 print '<tr class="oddeven">';
339 print '<td>';
340 print $commandefournisseurstatic->getNomUrl(1);
341 print "</td>\n";
342 print '<td>'.$societestatic->getNomUrl(1).'</td>';
343 print "<td>".$objp->code_fournisseur."</td>\n";
344 print '<td class="center">';
345 print dol_print_date($db->jdate($objp->date_commande), 'dayhour')."</td>";
346 print '<td class="center">';
347 print dol_print_date($db->jdate($objp->delivery_date), 'dayhour')."</td>";
348 print '<td class="center">'.$objp->qty."</td>\n";
349 // print '<td align="right">'.price($objp->total_ht_pondere)."</td>\n";
350 print '<td align="right">'.$commandefournisseurstatic->LibStatut($objp->statut, 5).'</td>';
351 print "</tr>\n";
352 $i++;
353 }
354 }
355 print '<tr class="liste_total">';
356 if ($num < $limit) {
357 print '<td class="left">'.$langs->trans("Total").'</td>';
358 } else {
359 print '<td class="left">'.$langs->trans("Totalforthispage").'</td>';
360 }
361 print '<td colspan="2"></td>';
362 print '<td></td>';
363 print '<td></td>';
364 print '<td class="center">'.$total_qty.'</td>';
365 // print '<td class="right">'.$total_ht_pondere.'</td>';
366 print '<td></td>';
367 print "</table>";
368 print '</div>';
369 print '</form>';
370 } else {
371 dol_print_error($db);
372 }
373 $db->free($result);
374 }
375 }
376} else {
377 dol_print_error();
378}
379
380// End of page
381llxFooter();
382$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 help generate other html components Only common components are here.
Class to manage products or services.
Class with list of lots and properties.
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:
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).
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.
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
show_stats_for_batch($batch, $socid)
Show stats for product batch.
productlot_prepare_head($object)
Prepare array with list of tabs.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.