dolibarr  20.0.0-beta
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  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program. If not, see <https://www.gnu.org/licenses/>.
20  */
21 
28 // Load Dolibarr environment
29 require '../../main.inc.php';
30 require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php';
31 require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
32 require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
33 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
34 
35 // Load translation files required by the page
36 $langs->loadLangs(array('companies', 'bills', 'products', 'companies', 'supplier_proposal'));
37 
38 $id = GETPOSTINT('id');
39 $ref = GETPOST('ref', 'alpha');
40 
41 // Security check
42 $fieldvalue = (!empty($id) ? $id : (!empty($ref) ? $ref : ''));
43 $fieldtype = (!empty($ref) ? 'ref' : 'rowid');
44 $socid = '';
45 if (!empty($user->socid)) {
46  $socid = $user->socid;
47 }
48 
49 // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
50 $hookmanager->initHooks(array('productstatssupplierinvoice'));
51 
52 $option = '';
53 
54 // Load variable for pagination
55 $limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
56 $sortfield = GETPOST('sortfield', 'aZ09comma');
57 $sortorder = GETPOST('sortorder', 'aZ09comma');
58 $page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
59 if (empty($page) || $page == -1) {
60  $page = 0;
61 } // If $page is not defined, or '' or -1
62 $offset = $limit * $page;
63 $pageprev = $page - 1;
64 $pagenext = $page + 1;
65 if (!$sortorder) {
66  $sortorder = "DESC";
67 }
68 if (!$sortfield) {
69  $sortfield = "f.datef";
70 }
71 $search_month = GETPOSTINT('search_month');
72 $search_year = GETPOSTINT('search_year');
73 
74 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
75  $search_month = '';
76  $search_year = '';
77 }
78 
79 $result = restrictedArea($user, 'produit|service', $fieldvalue, 'product&product', '', '', $fieldtype);
80 
81 
82 /*
83  * View
84  */
85 
86 $supplierinvoicestatic = new FactureFournisseur($db);
87 $societestatic = new Societe($db);
88 
89 $form = new Form($db);
90 $formother = new FormOther($db);
91 
92 if ($id > 0 || !empty($ref)) {
93  $product = new Product($db);
94  $result = $product->fetch($id, $ref);
95 
96  $object = $product;
97 
98  $parameters = array('id' => $id);
99  $reshook = $hookmanager->executeHooks('doActions', $parameters, $product, $action); // Note that $action and $object may have been modified by some hooks
100  if ($reshook < 0) {
101  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
102  }
103 
104  llxHeader("", "", $langs->trans("CardProduct".$product->type));
105 
106  if ($result > 0) {
107  $head = product_prepare_head($product);
108  $titre = $langs->trans("CardProduct".$product->type);
109  $picto = ($product->type == Product::TYPE_SERVICE ? 'service' : 'product');
110  print dol_get_fiche_head($head, 'referers', $titre, -1, $picto);
111 
112  $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $product, $action); // Note that $action and $object may have been modified by hook
113  print $hookmanager->resPrint;
114  if ($reshook < 0) {
115  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
116  }
117 
118  $linkback = '<a href="'.DOL_URL_ROOT.'/product/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
119 
120  $shownav = 1;
121  if ($user->socid && !in_array('product', explode(',', getDolGlobalString('MAIN_MODULES_FOR_EXTERNAL')))) {
122  $shownav = 0;
123  }
124 
125  dol_banner_tab($object, 'ref', $linkback, $shownav, 'ref');
126 
127  print '<div class="fichecenter">';
128 
129  print '<div class="underbanner clearboth"></div>';
130  print '<table class="border tableforfield" width="100%">';
131 
132  $nboflines = show_stats_for_company($product, $socid);
133 
134  print "</table>";
135 
136  print '</div>';
137  print '<div class="clearboth"></div>';
138 
139  print dol_get_fiche_end();
140 
141 
142  if ($user->hasRight('fournisseur', 'facture', 'lire')) {
143  $sql = "SELECT DISTINCT s.nom as name, s.rowid as socid, s.code_client, d.rowid, d.total_ht as line_total_ht,";
144  $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";
145  if (!$user->hasRight('societe', 'client', 'voir')) {
146  $sql .= ", sc.fk_soc, sc.fk_user ";
147  }
148  $sql .= " FROM ".MAIN_DB_PREFIX."societe as s";
149  $sql .= ", ".MAIN_DB_PREFIX."facture_fourn as f";
150  $sql .= ", ".MAIN_DB_PREFIX."facture_fourn_det as d";
151  if (!$user->hasRight('societe', 'client', 'voir')) {
152  $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
153  }
154  $sql .= " WHERE f.fk_soc = s.rowid";
155  $sql .= " AND f.entity IN (".getEntity('facture_fourn').")";
156  $sql .= " AND d.fk_facture_fourn = f.rowid";
157  $sql .= " AND d.fk_product = ".((int) $product->id);
158  if (!empty($search_month)) {
159  $sql .= ' AND MONTH(f.datef) IN ('.$db->sanitize($search_month).')';
160  }
161  if (!empty($search_year)) {
162  $sql .= ' AND YEAR(f.datef) IN ('.$db->sanitize($search_year).')';
163  }
164  if (!$user->hasRight('societe', 'client', 'voir')) {
165  $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
166  }
167  if ($socid) {
168  $sql .= " AND f.fk_soc = ".((int) $socid);
169  }
170  $sql .= " ORDER BY $sortfield $sortorder ";
171 
172  // Calcul total qty and amount for global if full scan list
173  $total_ht = 0;
174  $total_qty = 0;
175 
176  // Count total nb of records
177  $totalofrecords = '';
178  if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
179  $result = $db->query($sql);
180  $totalofrecords = $db->num_rows($result);
181  }
182 
183  $sql .= $db->plimit($limit + 1, $offset);
184 
185  $result = $db->query($sql);
186  if ($result) {
187  $num = $db->num_rows($result);
188 
189  $option .= '&id='.$product->id;
190 
191  if ($limit > 0 && $limit != $conf->liste_limit) {
192  $option .= '&limit='.((int) $limit);
193  }
194  if (!empty($search_month)) {
195  $option .= '&search_month='.urlencode((string) ($search_month));
196  }
197  if (!empty($search_year)) {
198  $option .= '&search_year='.urlencode((string) ($search_year));
199  }
200 
201  print '<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$product->id.'" name="search_form">'."\n";
202  print '<input type="hidden" name="token" value="'.newToken().'">';
203  if (!empty($sortfield)) {
204  print '<input type="hidden" name="sortfield" value="'.$sortfield.'"/>';
205  }
206  if (!empty($sortorder)) {
207  print '<input type="hidden" name="sortorder" value="'.$sortorder.'"/>';
208  }
209 
210  // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
211  print_barre_liste($langs->trans("SuppliersInvoices"), $page, $_SERVER["PHP_SELF"], $option, $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit, 0, 0, 1);
212 
213  if (!empty($page)) {
214  $option .= '&page='.urlencode((string) ($page));
215  }
216 
217  print '<div class="liste_titre liste_titre_bydiv centpercent">';
218  print '<div class="divsearchfield">';
219  print $langs->trans('Period').' ('.$langs->trans("DateInvoice").') - ';
220  print $langs->trans('Month').':<input class="flat" type="text" size="4" name="search_month" value="'.($search_month > 0 ? $search_month : '').'"> ';
221  print $langs->trans('Year').':'.$formother->selectyear($search_year ? $search_year : - 1, 'search_year', 1, 20, 5);
222  print '<div style="vertical-align: middle; display: inline-block">';
223  print '<input type="image" class="liste_titre" name="button_search" src="'.img_picto($langs->trans("Search"), 'search.png', '', '', 1).'" value="'.dol_escape_htmltag($langs->trans("Search")).'" title="'.dol_escape_htmltag($langs->trans("Search")).'">';
224  print '<input type="image" class="liste_titre" name="button_removefilter" src="'.img_picto($langs->trans("Search"), 'searchclear.png', '', '', 1).'" value="'.dol_escape_htmltag($langs->trans("RemoveFilter")).'" title="'.dol_escape_htmltag($langs->trans("RemoveFilter")).'">';
225  print '</div>';
226  print '</div>';
227  print '</div>';
228 
229  $i = 0;
230  print '<div class="div-table-responsive">';
231  print '<table class="tagtable liste listwithfilterbefore" width="100%">';
232  print '<tr class="liste_titre">';
233  print_liste_field_titre("Ref", $_SERVER["PHP_SELF"], "s.rowid", "", $option, '', $sortfield, $sortorder);
234  print_liste_field_titre("Company", $_SERVER["PHP_SELF"], "s.nom", "", $option, '', $sortfield, $sortorder);
235  print_liste_field_titre("SupplierCode", $_SERVER["PHP_SELF"], "s.code_client", "", $option, '', $sortfield, $sortorder);
236  print_liste_field_titre("DateInvoice", $_SERVER["PHP_SELF"], "f.datef", "", $option, 'align="center"', $sortfield, $sortorder);
237  print_liste_field_titre("Qty", $_SERVER["PHP_SELF"], "d.qty", "", $option, 'align="center"', $sortfield, $sortorder);
238  print_liste_field_titre("AmountHT", $_SERVER["PHP_SELF"], "d.total_ht", "", $option, 'align="right"', $sortfield, $sortorder);
239  print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "f.paye,f.fk_statut", "", $option, 'align="right"', $sortfield, $sortorder);
240  print "</tr>\n";
241 
242  if ($num > 0) {
243  while ($i < min($num, $limit)) {
244  $objp = $db->fetch_object($result);
245 
246  $total_ht += $objp->line_total_ht;
247  $total_qty += $objp->qty;
248 
249  $supplierinvoicestatic->id = $objp->facid;
250  $supplierinvoicestatic->ref = $objp->ref;
251  $supplierinvoicestatic->ref_supplier = $objp->ref_supplier;
252  $supplierinvoicestatic->libelle = $objp->label; // deprecated
253  $supplierinvoicestatic->label = $objp->label;
254  $supplierinvoicestatic->total_ht = $objp->total_ht;
255  $supplierinvoicestatic->total_ttc = $objp->total_ttc;
256  $supplierinvoicestatic->total_tva = $objp->total_tva;
257 
258  $societestatic->fetch($objp->socid);
259 
260  print '<tr class="oddeven">';
261  print '<td>';
262  print $supplierinvoicestatic->getNomUrl(1);
263  print "</td>\n";
264  print '<td>'.$societestatic->getNomUrl(1).'</td>';
265  print "<td>".$objp->code_client."</td>\n";
266  print '<td class="center">';
267  print dol_print_date($db->jdate($objp->datef), 'dayhour')."</td>";
268  print '<td class="center">'.$objp->qty."</td>\n";
269  print '<td align="right">'.price($objp->line_total_ht)."</td>\n";
270  print '<td align="right">'.$supplierinvoicestatic->LibStatut($objp->paye, $objp->statut, 5, $supplierinvoicestatic->getSommePaiement()).'</td>';
271  print "</tr>\n";
272  $i++;
273  }
274  }
275  print '<tr class="liste_total">';
276  if ($num < $limit && empty($offset)) {
277  print '<td>'.$langs->trans("Total").'</td>';
278  } else {
279  print '<td>'.$form->textwithpicto($langs->trans("Total"), $langs->trans("Totalforthispage")).'</td>';
280  }
281  print '<td colspan="3"></td>';
282  print '<td class="center">'.$total_qty.'</td>';
283  print '<td align="right">'.price($total_ht).'</td>';
284  print '<td></td>';
285  print "</table>";
286  print '</div>';
287  print '</form>';
288  } else {
289  dol_print_error($db);
290  }
291  $db->free($result);
292  }
293  }
294 } else {
295  dol_print_error();
296 }
297 
298 // End of page
299 llxFooter();
300 $db->close();
if($user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition: card.php:58
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:55
llxFooter()
Empty footer.
Definition: wrapper.php:69
Class to manage suppliers invoices.
Class to manage generation of HTML components Only common components must be here.
Class permettant la generation de composants html autre 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('invoice') && $user->hasRight('facture', 'lire')) if((isModEnabled('fournisseur') &&!getDolGlobalString('MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') && $user->hasRight('don', 'lire')) if(isModEnabled('tax') && $user->hasRight('tax', 'charges', 'lire')) if(isModEnabled('invoice') &&isModEnabled('order') && $user->hasRight("commande", "lire") &&!getDolGlobalString('WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER')) $sql
Social contributions to pay.
Definition: index.php:745
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.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
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).
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
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 dolibarr global constant string value.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
product_prepare_head($object)
Prepare array with list of tabs.
Definition: product.lib.php:37
show_stats_for_company($product, $socid)
Show stats for company.
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.