dolibarr 25.0.0-alpha
facture_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-2018 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2013 Juanjo Menent <jmenent@2byte.es>
6 * Copyright (C) 2014 Florian Henry <florian.henry@open-concept.pro>
7 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
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
31// Load Dolibarr environment
32require '../../main.inc.php';
33require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php';
34require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
35require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
36require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
37
46// Load translation files required by the page
47$langs->loadLangs(array('companies', 'bills', 'products', 'companies', 'supplier_proposal'));
48
49$id = GETPOSTINT('id');
50$ref = GETPOST('ref', 'alpha');
51
52// Security check
53$fieldvalue = (!empty($id) ? $id : (!empty($ref) ? $ref : ''));
54$fieldtype = (!empty($ref) ? 'ref' : 'rowid');
55$socid = '';
56if (!empty($user->socid)) {
57 $socid = $user->socid;
58}
59
60// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
61$hookmanager->initHooks(array('productstatssupplierinvoice'));
62
63$option = '';
64
65// Load variable for pagination
66$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
67$sortfield = GETPOST('sortfield', 'aZ09comma');
68$sortorder = GETPOST('sortorder', 'aZ09comma');
69$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
70if (empty($page) || $page == -1) {
71 $page = 0;
72} // If $page is not defined, or '' or -1
73$offset = $limit * $page;
74$pageprev = $page - 1;
75$pagenext = $page + 1;
76if (!$sortorder) {
77 $sortorder = "DESC";
78}
79if (!$sortfield) {
80 $sortfield = "f.datef";
81}
82$search_month = GETPOSTINT('search_month');
83$search_year = GETPOSTINT('search_year');
84$search_type = GETPOSTINT('search_type');
85$search_company = GETPOSTINT('search_company');
86if (empty($search_type)) $search_type = -1;
87
88if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
89 $search_month = '';
90 $search_year = '';
91 $search_type = '-1';
92 $search_company = '';
93}
94
95$result = restrictedArea($user, 'produit|service', $fieldvalue, 'product&product', '', '', $fieldtype);
96
97
98/*
99 * View
100 */
101
102$supplierinvoicestatic = new FactureFournisseur($db);
103$societestatic = new Societe($db);
104
105$form = new Form($db);
106$formother = new FormOther($db);
107
108if ($id > 0 || !empty($ref)) {
109 $product = new Product($db);
110 $result = $product->fetch($id, $ref);
111
112 $object = $product;
113
114 $parameters = array('id' => $id);
115 $reshook = $hookmanager->executeHooks('doActions', $parameters, $product, $action); // Note that $action and $object may have been modified by some hooks
116 if ($reshook < 0) {
117 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
118 }
119
120 llxHeader("", "", $langs->trans("CardProduct".$product->type), '', 0, 0, '', '', 'mod-product page-stats_facture_fournisseur');
121
122 if ($result > 0) {
123 $head = product_prepare_head($product);
124 $titre = $langs->trans("CardProduct".$product->type);
125 $picto = ($product->type == Product::TYPE_SERVICE ? 'service' : 'product');
126 print dol_get_fiche_head($head, 'referers', $titre, -1, $picto);
127
128 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $product, $action); // Note that $action and $object may have been modified by hook
129 print $hookmanager->resPrint;
130 if ($reshook < 0) {
131 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
132 }
133
134 $linkback = '<a href="'.DOL_URL_ROOT.'/product/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
135
136 $shownav = 1;
137 if ($user->socid && !in_array('product', explode(',', getDolGlobalString('MAIN_MODULES_FOR_EXTERNAL')))) {
138 $shownav = 0;
139 }
140
141 dol_banner_tab($object, 'ref', $linkback, $shownav, 'ref');
142
143 print '<div class="fichecenter">';
144
145 print '<div class="clearboth"></div>';
146 print '<table class="noborder tableforfield centpercent">';
147
148 $nboflines = show_stats_for_company($product, $socid);
149
150 print "</table>";
151
152 print '</div>';
153 print '<div class="clearboth"></div>';
154
155 print dol_get_fiche_end();
156
157
158 if ($user->hasRight('fournisseur', 'facture', 'lire')) {
159 $sql = "SELECT DISTINCT s.nom as name, s.rowid as socid, s.code_client, d.rowid, d.total_ht as line_total_ht,";
160 $sql .= " f.rowid as facid, f.ref, f.ref_supplier, f.datef, f.libelle as label, f.total_ht, f.total_ttc, f.total_tva, f.paye, f.fk_statut as statut, d.qty";
161 if (!$user->hasRight('societe', 'client', 'voir')) {
162 $sql .= ", sc.fk_soc, sc.fk_user ";
163 }
164 $sql .= " FROM ".MAIN_DB_PREFIX."societe as s";
165 $sql .= ", ".MAIN_DB_PREFIX."facture_fourn as f";
166 $sql .= ", ".MAIN_DB_PREFIX."facture_fourn_det as d";
167 if (!$user->hasRight('societe', 'client', 'voir')) {
168 $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
169 }
170 $sql .= " WHERE f.fk_soc = s.rowid";
171 $sql .= " AND f.entity IN (".getEntity('facture_fourn').")";
172 $sql .= " AND d.fk_facture_fourn = f.rowid";
173 $sql .= " AND d.fk_product = ".((int) $product->id);
174 if (!empty($search_month)) {
175 $sql .= ' AND MONTH(f.datef) = '.((int) $search_month);
176 }
177 if (!empty($search_year)) {
178 $sql .= ' AND YEAR(f.datef) = '.((int) $search_year);
179 }
180 if ($search_type != '' && $search_type != '-1') {
181 $sql .= " AND f.type = ".((int) $search_type);
182 }
183 if (!$user->hasRight('societe', 'client', 'voir')) {
184 $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
185 }
186 if ($socid) {
187 $sql .= " AND f.fk_soc = ".((int) $socid);
188 } elseif ($search_company > 0) {
189 $sql .= " AND f.fk_soc = ".((int) $search_company);
190 }
191 $sql .= " ORDER BY $sortfield $sortorder ";
192
193 // Calcul total qty and amount for global if full scan list
194 $total_ht = 0;
195 $total_qty = 0;
196
197 // Count total nb of records
198 $totalofrecords = '';
199 if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
200 $result = $db->query($sql);
201 $totalofrecords = $db->num_rows($result);
202 }
203
204 $sql .= $db->plimit($limit + 1, $offset);
205
206 $result = $db->query($sql);
207 if ($result) {
208 $num = $db->num_rows($result);
209
210 $option .= '&id='.$product->id;
211
212 if ($limit > 0 && $limit != $conf->liste_limit) {
213 $option .= '&limit='.((int) $limit);
214 }
215 if (!empty($search_month)) {
216 $option .= '&search_month='.urlencode((string) ($search_month));
217 }
218 if (!empty($search_year)) {
219 $option .= '&search_year='.urlencode((string) ($search_year));
220 }
221
222 print '<span id="anchorundermenu" class="anchorundermenu"></span>';
223 print '<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$product->id.'" name="search_form">'."\n";
224 print '<input type="hidden" name="token" value="'.newToken().'">';
225 print '<input type="hidden" name="page_y" value="">';
226 if (!empty($sortfield)) {
227 print '<input type="hidden" name="sortfield" value="'.$sortfield.'"/>';
228 }
229 if (!empty($sortorder)) {
230 print '<input type="hidden" name="sortorder" value="'.$sortorder.'"/>';
231 }
232
233 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
234 print_barre_liste($langs->trans("SuppliersInvoices"), $page, $_SERVER["PHP_SELF"], $option, $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit, 0, 0, 1);
235
236 if (!empty($page)) {
237 $option .= '&page='.urlencode((string) ($page));
238 }
239
240 print '<div class="liste_titre liste_titre_bydiv centpercent">';
241 print '<div class="divsearchfield">';
242 print $langs->trans('Period').' ('.$langs->trans("DateInvoice").') - ';
243 print $langs->trans('Month').':<input class="flat" type="text" size="4" name="search_month" value="'.($search_month > 0 ? $search_month : '').'"> ';
244 print $langs->trans('Year').':'.$formother->selectyear(($search_year ? (string) $search_year : '-1'), 'search_year', 1, 20, 5);
245 if (empty($socid)) print $langs->trans('Company').' : '.$form->select_company($search_company, 'search_company', '(s.fournisseur:=:1)', 1);
246 print $langs->trans('Type').' : ';
247 $listtype = array(
248 FactureFournisseur::TYPE_STANDARD => $langs->trans("InvoiceStandard"),
249 FactureFournisseur::TYPE_DEPOSIT => $langs->trans("InvoiceDeposit"),
250 FactureFournisseur::TYPE_CREDIT_NOTE => $langs->trans("InvoiceAvoir"),
251 FactureFournisseur::TYPE_REPLACEMENT => $langs->trans("InvoiceReplacement"),
252 );
253 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
254 print $form->selectarray('search_type', $listtype, $search_type, 1, 0, 0, '', 0, 0, 0, '', 'maxwidth75');
255
256 print '<div style="vertical-align: middle; display: inline-block">';
257 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")).'">';
258 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")).'">';
259 print '</div>';
260 print '</div>';
261 print '</div>';
262
263 $i = 0;
264 print '<div class="div-table-responsive">';
265 print '<table class="tagtable liste listwithfilterbefore" width="100%">';
266 print '<tr class="liste_titre">';
267 print_liste_field_titre("Ref", $_SERVER["PHP_SELF"], "s.rowid", "", $option, '', $sortfield, $sortorder);
268 print_liste_field_titre("Company", $_SERVER["PHP_SELF"], "s.nom", "", $option, '', $sortfield, $sortorder);
269 print_liste_field_titre("SupplierCode", $_SERVER["PHP_SELF"], "s.code_client", "", $option, '', $sortfield, $sortorder);
270 print_liste_field_titre("DateInvoice", $_SERVER["PHP_SELF"], "f.datef", "", $option, 'align="center"', $sortfield, $sortorder);
271 print_liste_field_titre("Qty", $_SERVER["PHP_SELF"], "d.qty", "", $option, 'align="center"', $sortfield, $sortorder);
272 print_liste_field_titre("AmountHT", $_SERVER["PHP_SELF"], "d.total_ht", "", $option, 'align="right"', $sortfield, $sortorder);
273 print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "f.paye,f.fk_statut", "", $option, 'align="right"', $sortfield, $sortorder);
274 print "</tr>\n";
275
276 if ($num > 0) {
277 while ($i < min($num, $limit)) {
278 $objp = $db->fetch_object($result);
279
280 $total_ht += $objp->line_total_ht;
281 $total_qty += $objp->qty;
282
283 $supplierinvoicestatic->id = $objp->facid;
284 $supplierinvoicestatic->ref = $objp->ref;
285 $supplierinvoicestatic->ref_supplier = $objp->ref_supplier;
286 $supplierinvoicestatic->libelle = $objp->label; // deprecated
287 $supplierinvoicestatic->label = $objp->label;
288 $supplierinvoicestatic->total_ht = $objp->total_ht;
289 $supplierinvoicestatic->total_ttc = $objp->total_ttc;
290 $supplierinvoicestatic->total_tva = $objp->total_tva;
291
292 $societestatic->fetch($objp->socid);
293
294 print '<tr class="oddeven">';
295 print '<td>';
296 print $supplierinvoicestatic->getNomUrl(1);
297 print "</td>\n";
298 print '<td>'.$societestatic->getNomUrl(1).'</td>';
299 print "<td>".$objp->code_client."</td>\n";
300 print '<td class="center">';
301 print dol_print_date($db->jdate($objp->datef), 'dayhour')."</td>";
302 print '<td class="center">'.$objp->qty."</td>\n";
303 print '<td align="right">'.price($objp->line_total_ht)."</td>\n";
304 print '<td align="right">'.$supplierinvoicestatic->LibStatut($objp->paye, $objp->statut, 5, $supplierinvoicestatic->getSommePaiement()).'</td>';
305 print "</tr>\n";
306 $i++;
307 }
308 }
309 print '<tr class="liste_total">';
310 if ($num < $limit && empty($offset)) {
311 print '<td>'.$langs->trans("Total").'</td>';
312 } else {
313 print '<td>'.$form->textwithpicto($langs->trans("Total"), $langs->trans("Totalforthispage")).'</td>';
314 }
315 print '<td colspan="3"></td>';
316 print '<td class="center">'.$total_qty.'</td>';
317 print '<td align="right">'.price($total_ht).'</td>';
318 print '<td></td>';
319 print "</table>";
320 print '</div>';
321 print '</form>';
322 } else {
323 dol_print_error($db);
324 }
325 $db->free($result);
326 }
327 }
328} else {
329 dol_print_error();
330}
331
332// End of page
333llxFooter();
334$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 suppliers invoices.
const TYPE_DEPOSIT
Deposit invoice.
const TYPE_CREDIT_NOTE
Credit note invoice.
const TYPE_REPLACEMENT
Replacement invoice.
const TYPE_STANDARD
Standard invoice.
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.
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:
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.