dolibarr 23.0.3
consumption.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2012-2013 Philippe Berthet <berthet@systune.be>
3 * Copyright (C) 2004-2016 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2013-2015 Juanjo Menent <jmenent@2byte.es>
5 * Copyright (C) 2015 Marcos García <marcosgdf@gmail.com>
6 * Copyright (C) 2015-2017 Ferran Marcet <fmarcet@2byte.es>
7 * Copyright (C) 2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
8 * Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
9 * Copyright (C) 2024-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
32// Load Dolibarr environment
33require "../main.inc.php";
34require_once DOL_DOCUMENT_ROOT.'/core/lib/contact.lib.php';
35require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
36require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
37require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php';
38require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
39
48$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
49$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : str_replace('_', '', basename(dirname(__FILE__)).basename(__FILE__, '.php')); // To manage different context of search
50
51$id = GETPOSTINT('id');
52
53$object = new Contact($db);
54if ($id > 0) {
55 $object->fetch($id);
56}
57if (empty($object->thirdparty)) {
58 $object->fetch_thirdparty();
59}
60$socid = !empty($object->thirdparty->id) ? $object->thirdparty->id : null;
61
62// Sort & Order fields
63$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
64$sortfield = GETPOST('sortfield', 'aZ09comma');
65$sortorder = GETPOST('sortorder', 'aZ09comma');
66$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT('page');
67if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
68 // If $page is not defined, or '' or -1 or if we click on clear filters
69 $page = 0;
70}
71$offset = $limit * $page;
72$pageprev = $page - 1;
73$pagenext = $page + 1;
74if (!$sortorder) {
75 $sortorder = 'DESC';
76}
77if (!$sortfield) {
78 $sortfield = 'dateprint';
79}
80
81// Search fields
82$sref = GETPOST("sref");
83$sprod_fulldescr = GETPOST("sprod_fulldescr");
84$month = GETPOSTINT('month');
85$year = GETPOSTINT('year');
86
87// Clean up on purge search criteria ?
88if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // Both test are required to be compatible with all browsers
89 $sref = '';
90 $sprod_fulldescr = '';
91 $year = '';
92 $month = '';
93}
94// Customer or supplier selected in drop box
95$thirdTypeSelect = GETPOST("third_select_id");
96$type_element = GETPOSTISSET('type_element') ? GETPOST('type_element') : '';
97
98// Load translation files required by the page
99$langs->loadLangs(array("companies", "bills", "orders", "suppliers", "propal", "interventions", "contracts", "products"));
100
101// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
102$hookmanager->initHooks(array('consumptioncontact'));
103
104$result = restrictedArea($user, 'contact', $object->id, 'socpeople&societe');
105
106
107/*
108 * Actions
109 */
110
111$parameters = array('id' => $id);
112$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
113if ($reshook < 0) {
114 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
115}
116
117
118/*
119 * View
120 */
121$form = new Form($db);
122$formother = new FormOther($db);
123$productstatic = new Product($db);
124$objsoc = new Societe($db);
125
126$title = $langs->trans("ContactRelatedItems");
127$help_url = 'EN:Module_Third_Parties|FR:Module_Tiers|ES:Empresas';
128
129llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'mod-societe page-contact-card_consumption');
130
131if (empty($id)) {
132 dol_print_error($db);
133 exit;
134}
135
136$head = contact_prepare_head($object);
137print dol_get_fiche_head($head, 'consumption', $langs->trans("ContactsAddresses"), -1, 'contact');
138
139$linkback = '<a href="'.DOL_URL_ROOT.'/contact/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
140
141$morehtmlref = '<a href="'.DOL_URL_ROOT.'/contact/vcard.php?id='.$object->id.'" class="refid">';
142$morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard', 'class="valignmiddle marginleftonly paddingrightonly"');
143$morehtmlref .= '</a>';
144
145$morehtmlref .= '<div class="refidno">';
146if (!getDolGlobalString('SOCIETE_DISABLE_CONTACTS')) {
147 $objsoc->fetch($socid);
148 // Thirdparty
149 if ($objsoc->id > 0) {
150 $morehtmlref .= $objsoc->getNomUrl(1, 'contact');
151 } else {
152 $morehtmlref .= '<span class="opacitymedium">'.$langs->trans("ContactNotLinkedToCompany").'</span>';
153 }
154}
155$morehtmlref .= '</div>';
156
157dol_banner_tab($object, 'id', $linkback, ($user->socid ? 0 : 1), 'rowid', 'nom', $morehtmlref);
158
159print '<div class="fichecenter">';
160
161print '<div class="underbanner clearboth"></div>';
162print '<table class="border centpercent tableforfield">';
163
164// Civility
165print '<tr><td class="titlefield">'.$langs->trans("UserTitle").'</td><td>';
166print $object->getCivilityLabel();
167print '</td></tr>';
168
169$thirdTypeArray = array();
170$elementTypeArray = array();
171
172if (!empty($object->thirdparty->client)) {
173 $thirdTypeArray['customer'] = $langs->trans("customer");
174 if (isModEnabled("propal") && $user->hasRight('propal', 'lire')) {
175 $elementTypeArray['propal'] = $langs->transnoentitiesnoconv('Proposals');
176 }
177 if (isModEnabled('order') && $user->hasRight('commande', 'lire')) {
178 $elementTypeArray['order'] = $langs->transnoentitiesnoconv('Orders');
179 }
180 if (isModEnabled('invoice') && $user->hasRight('facture', 'lire')) {
181 $elementTypeArray['invoice'] = $langs->transnoentitiesnoconv('Invoices');
182 }
183 if (isModEnabled('contract') && $user->hasRight('contrat', 'lire')) {
184 $elementTypeArray['contract'] = $langs->transnoentitiesnoconv('Contracts');
185 }
186}
187
188if (isModEnabled('intervention') && $user->hasRight('ficheinter', 'lire')) {
189 $elementTypeArray['fichinter'] = $langs->transnoentitiesnoconv('Interventions');
190}
191
192if (!empty($object->thirdparty->fournisseur)) {
193 $thirdTypeArray['supplier'] = $langs->trans("supplier");
194 if ((isModEnabled("fournisseur") && !getDolGlobalString('MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight('fournisseur', 'facture', 'lire')) || (isModEnabled("supplier_invoice") && $user->hasRight('supplier_invoice', 'lire'))) {
195 $elementTypeArray['supplier_invoice'] = $langs->transnoentitiesnoconv('SuppliersInvoices');
196 }
197 if ((isModEnabled("fournisseur") && !getDolGlobalString('MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight('fournisseur', 'commande', 'lire')) || (isModEnabled("supplier_order") && $user->hasRight('supplier_order', 'lire'))) {
198 $elementTypeArray['supplier_order'] = $langs->transnoentitiesnoconv('SuppliersOrders');
199 }
200
201 // There are no contact type for supplier proposals
202 // if ((isModEnabled("fournisseur") && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) || isModEnabled("supplier_order") || isModEnabled("supplier_invoice")) && $user->rights->supplier_proposal->lire) $elementTypeArray['supplier_proposal']=$langs->transnoentitiesnoconv('SupplierProposals');
203}
204
205print '</table>';
206
207print '</div>';
208
209print dol_get_fiche_end();
210print '<br>';
211
212
213print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'?id='.$id.'">';
214print '<input type="hidden" name="token" value="'.newToken().'">';
215
216$documentstatic = null;
217$documentstaticline = null;
218$sql_select = '';
219$doc_number = '';
220$dateprint = '';
221$tables_from = '';
222$where = '';
223if ($type_element == 'fichinter') { // Customer : show products from invoices
224 require_once DOL_DOCUMENT_ROOT.'/fichinter/class/fichinter.class.php';
225 $documentstatic = new Fichinter($db);
226 $sql_select = 'SELECT f.rowid as doc_id, f.ref as doc_number, \'1\' as doc_type, f.datec as dateprint, f.fk_statut as status, tc.libelle as type_contact_label, ';
227 $tables_from = MAIN_DB_PREFIX.'fichinterdet d';
228 $tables_from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'fichinter as f ON d.fk_fichinter=f.rowid';
229 $tables_from .= ' INNER JOIN '.MAIN_DB_PREFIX.'element_contact ec ON ec.element_id=f.rowid AND ec.fk_socpeople = '.((int) $object->id);
230 $tables_from .= ' INNER JOIN '.MAIN_DB_PREFIX."c_type_contact tc ON (ec.fk_c_type_contact=tc.rowid and tc.element='fichinter' and tc.source='external' and tc.active=1)";
231 $where = ' WHERE f.entity IN ('.getEntity('intervention').')';
232 $dateprint = 'f.datec';
233 $doc_number = 'f.ref';
234} elseif ($type_element == 'invoice') { // Customer : show products from invoices
235 require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
236 $documentstatic = new Facture($db);
237 $sql_select = 'SELECT f.rowid as doc_id, f.ref as doc_number, f.type as doc_type, f.datef as dateprint, f.fk_statut as status, f.paye as paid, tc.libelle as type_contact_label, ';
238 $tables_from = MAIN_DB_PREFIX.'facturedet d';
239 $tables_from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'facture as f ON d.fk_facture=f.rowid';
240 $tables_from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product p ON d.fk_product=p.rowid';
241 $tables_from .= ' INNER JOIN '.MAIN_DB_PREFIX.'element_contact ec ON ec.element_id=f.rowid AND ec.fk_socpeople = '.((int) $object->id);
242 $tables_from .= ' INNER JOIN '.MAIN_DB_PREFIX."c_type_contact tc ON (ec.fk_c_type_contact=tc.rowid and tc.element='facture' and tc.source='external' and tc.active=1)";
243 $where = " WHERE f.entity IN (".getEntity('invoice').")";
244 $dateprint = 'f.datef';
245 $doc_number = 'f.ref';
246 $thirdTypeSelect = 'customer';
247} elseif ($type_element == 'propal') {
248 require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
249 $documentstatic = new Propal($db);
250 $sql_select = 'SELECT c.rowid as doc_id, c.ref as doc_number, \'1\' as doc_type, c.datep as dateprint, c.fk_statut as status, tc.libelle as type_contact_label, ';
251 $tables_from = MAIN_DB_PREFIX.'propaldet d';
252 $tables_from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'propal as c ON d.fk_propal=c.rowid';
253 $tables_from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product p ON d.fk_product=p.rowid';
254 $tables_from .= ' INNER JOIN '.MAIN_DB_PREFIX.'element_contact ec ON ec.element_id=c.rowid AND ec.fk_socpeople = '.((int) $object->id);
255 $tables_from .= ' INNER JOIN '.MAIN_DB_PREFIX."c_type_contact tc ON (ec.fk_c_type_contact=tc.rowid and tc.element='propal' and tc.source='external' and tc.active=1)";
256 $where = ' WHERE c.entity IN ('.getEntity('propal').')';
257 $dateprint = 'c.datep';
258 $doc_number = 'c.ref';
259 $thirdTypeSelect = 'customer';
260} elseif ($type_element == 'order') {
261 require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
262 $documentstatic = new Commande($db);
263 $sql_select = 'SELECT c.rowid as doc_id, c.ref as doc_number, \'1\' as doc_type, c.date_commande as dateprint, c.fk_statut as status, tc.libelle as type_contact_label, ';
264 $tables_from = MAIN_DB_PREFIX.'commandedet d';
265 $tables_from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'commande as c ON d.fk_commande=c.rowid';
266 $tables_from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product p ON d.fk_product=p.rowid';
267 $tables_from .= ' INNER JOIN '.MAIN_DB_PREFIX.'element_contact ec ON ec.element_id=c.rowid AND ec.fk_socpeople = '.((int) $object->id);
268 $tables_from .= ' INNER JOIN '.MAIN_DB_PREFIX."c_type_contact tc ON (ec.fk_c_type_contact=tc.rowid and tc.element='commande' and tc.source='external' and tc.active=1)";
269 $where = ' WHERE c.entity IN ('.getEntity('order').')';
270 $dateprint = 'c.date_commande';
271 $doc_number = 'c.ref';
272 $thirdTypeSelect = 'customer';
273} elseif ($type_element == 'supplier_invoice') { // Supplier : Show products from invoices.
274 require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
275 $documentstatic = new FactureFournisseur($db);
276 $sql_select = 'SELECT f.rowid as doc_id, f.ref as doc_number, \'1\' as doc_type, f.datef as dateprint, f.fk_statut as status, f.paye as paid, tc.libelle as type_contact_label, ';
277 $tables_from = MAIN_DB_PREFIX.'facture_fourn_det d';
278 $tables_from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'facture_fourn as f ON d.fk_facture_fourn=f.rowid';
279 $tables_from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product p ON d.fk_product=p.rowid';
280 $tables_from .= ' INNER JOIN '.MAIN_DB_PREFIX.'element_contact ec ON ec.element_id=f.rowid AND ec.fk_socpeople = '.((int) $object->id);
281 $tables_from .= ' INNER JOIN '.MAIN_DB_PREFIX."c_type_contact tc ON (ec.fk_c_type_contact=tc.rowid and tc.element='invoice_supplier' and tc.source='external' and tc.active=1)";
282 $where = ' WHERE f.entity IN ('.getEntity($documentstatic->element).')';
283 $dateprint = 'f.datef';
284 $doc_number = 'f.ref';
285 $thirdTypeSelect = 'supplier';
286 //} elseif ($type_element == 'supplier_proposal') {
287 // require_once DOL_DOCUMENT_ROOT.'/supplier_proposal/class/supplier_proposal.class.php';
288 // $documentstatic=new SupplierProposal($db);
289 // $sql_select = 'SELECT c.rowid as doc_id, c.ref as doc_number, \'1\' as doc_type, c.date_valid as dateprint, c.fk_statut as status, ';
290 // $tables_from = MAIN_DB_PREFIX."supplier_proposal as c,".MAIN_DB_PREFIX."supplier_proposaldet as d";
291 // $where = " WHERE c.fk_soc = s.rowid AND s.rowid = ".((int) $socid);
292 // $where.= " AND d.fk_supplier_proposal = c.rowid";
293 // $where.= " AND c.entity = ".$conf->entity;
294 // $dateprint = 'c.date_valid';
295 // $doc_number='c.ref';
296 // $thirdTypeSelect='supplier';
297 //}
298} elseif ($type_element == 'supplier_order') { // Supplier : Show products from orders.
299 require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
300 $documentstatic = new CommandeFournisseur($db);
301 $sql_select = 'SELECT c.rowid as doc_id, c.ref as doc_number, \'1\' as doc_type, c.date_valid as dateprint, c.fk_statut as status, tc.libelle as type_contact_label, ';
302 $tables_from = MAIN_DB_PREFIX.'commande_fournisseurdet d';
303 $tables_from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'commande_fournisseur as c ON d.fk_commande=c.rowid';
304 $tables_from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product p ON d.fk_product=p.rowid';
305 $tables_from .= ' INNER JOIN '.MAIN_DB_PREFIX.'element_contact ec ON ec.element_id=c.rowid AND ec.fk_socpeople = '.((int) $object->id);
306 $tables_from .= ' INNER JOIN '.MAIN_DB_PREFIX."c_type_contact tc ON (ec.fk_c_type_contact=tc.rowid and tc.element='order_supplier' and tc.source='external' and tc.active=1)";
307 $where = ' WHERE c.entity IN ('.getEntity($documentstatic->element).')';
308 $dateprint = 'c.date_valid';
309 $doc_number = 'c.ref';
310 $thirdTypeSelect = 'supplier';
311} elseif ($type_element == 'contract') { // Order
312 require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';
313 $documentstatic = new Contrat($db);
314 $documentstaticline = new ContratLigne($db);
315 $sql_select = 'SELECT c.rowid as doc_id, c.ref as doc_number, \'1\' as doc_type, c.date_contrat as dateprint, d.statut as status, tc.libelle as type_contact_label, ';
316 $tables_from = MAIN_DB_PREFIX.'contratdet d';
317 $tables_from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'contrat as c ON d.fk_contrat=c.rowid';
318 $tables_from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product p ON d.fk_product=p.rowid';
319 $tables_from .= ' INNER JOIN '.MAIN_DB_PREFIX.'element_contact ec ON ec.element_id=c.rowid AND ec.fk_socpeople = '.((int) $object->id);
320 $tables_from .= ' INNER JOIN '.MAIN_DB_PREFIX."c_type_contact tc ON (ec.fk_c_type_contact=tc.rowid and tc.element='contrat' and tc.source='external' and tc.active=1)";
321 $where = ' WHERE c.entity IN ('.getEntity('contrat').')';
322 $dateprint = 'c.date_valid';
323 $doc_number = 'c.ref';
324 $thirdTypeSelect = 'customer';
325}
326
327$parameters = array();
328$totalnboflines = 0;
329$sql = '';
330$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook
331
332if (!empty($sql_select)) {
333 $sql = $sql_select;
334 $sql .= ' d.description as description';
335 if ($type_element != 'fichinter' && $type_element != 'contract' && $type_element != 'supplier_proposal') {
336 $sql .= ', d.label, d.fk_product as product_id, d.fk_product as fk_product, d.info_bits, d.date_start, d.date_end, d.qty, d.qty as prod_qty, d.total_ht as total_ht, ';
337 }
338 if ($type_element == 'supplier_proposal') {
339 $sql .= ', d.label, d.fk_product as product_id, d.fk_product as fk_product, d.info_bits, d.qty, d.qty as prod_qty, d.total_ht as total_ht, ';
340 }
341 if ($type_element == 'contract') {
342 $sql .= ', d.label, d.fk_product as product_id, d.fk_product as fk_product, d.info_bits, d.date_ouverture as date_start, d.date_cloture as date_end, d.qty, d.qty as prod_qty, d.total_ht as total_ht, ';
343 }
344 if ($type_element != 'fichinter') {
345 $sql .= ' p.ref as ref, p.rowid as prod_id, p.rowid as fk_product, p.fk_product_type as prod_type, p.fk_product_type as fk_product_type, p.entity as pentity';
346 }
347 $sql .= " ";
348 if ($type_element != 'fichinter') {
349 $sql .= ", p.ref as prod_ref, p.label as product_label";
350 }
351 $sql .= " FROM "/*.MAIN_DB_PREFIX."societe as s, "*/.$tables_from;
352 // if ($type_element != 'fichinter') $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'product as p ON d.fk_product = p.rowid ';
353 $sql .= $where;
354 $sql .= dolSqlDateFilter($dateprint, 0, $month, $year);
355 if ($sref && !empty($doc_number)) {
356 $sql .= " AND ".$doc_number." LIKE '%".$db->escape($sref)."%'";
357 }
358 if ($sprod_fulldescr) {
359 $sql .= " AND (d.description LIKE '%".$db->escape($sprod_fulldescr)."%'";
360 if (GETPOST('type_element') != 'fichinter') {
361 $sql .= " OR p.ref LIKE '%".$db->escape($sprod_fulldescr)."%'";
362 }
363 if (GETPOST('type_element') != 'fichinter') {
364 $sql .= " OR p.label LIKE '%".$db->escape($sprod_fulldescr)."%'";
365 }
366 $sql .= ")";
367 }
368 $parameters = array('type_element' => $type_element);
369 $reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
370 $sql .= $hookmanager->resPrint;
371 $sql .= $db->order($sortfield, $sortorder);
372 $resql = $db->query($sql);
373 $totalnboflines = $db->num_rows($resql);
374
375 $sql .= $db->plimit($limit + 1, $offset);
376}
377
378$disabled = 0;
379$showempty = 2;
380if (empty($elementTypeArray) && !$object->thirdparty->client && !$object->thirdparty->fournisseur) {
381 $showempty = $langs->trans("ThirdpartyNotCustomerNotSupplierSoNoRef");
382 $disabled = 1;
383}
384
385// Define type of elements
386$typeElementString = $form->selectarray("type_element", $elementTypeArray, GETPOST('type_element'), $showempty, 0, 0, '', 0, 0, $disabled, '', 'maxwidth150onsmartphone');
387$button = '<input type="submit" class="button small" name="button_third" value="'.dol_escape_htmltag($langs->trans("Search")).'" title="'.dol_escape_htmltag($langs->trans("Search")).'">';
388
389$param = '';
390$param .= "&sref=".urlencode($sref);
391$param .= "&month=".urlencode($month);
392$param .= "&year=".urlencode($year);
393$param .= "&sprod_fulldescr=".urlencode($sprod_fulldescr);
394if (!empty($socid)) {
395 $param .= "&socid=".urlencode((string) ($socid));
396}
397$param .= "&type_element=".urlencode($type_element);
398
399$total_qty = 0;
400$num = 0;
401if ($sql_select && $documentstatic !== null) {
402 $resql = $db->query($sql);
403 if (!$resql) {
404 dol_print_error($db);
405 }
406
407 $num = $db->num_rows($resql);
408
409 $param = (!empty($socid) ? "&socid=".urlencode((string) ($socid)) : "")."&type_element=".urlencode((string) ($type_element))."&id=".urlencode((string) ($id));
410 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
411 $param .= '&contextpage='.urlencode($contextpage);
412 }
413 if ($limit > 0 && $limit != $conf->liste_limit) {
414 $param .= '&limit='.((int) $limit);
415 }
416 if ($sprod_fulldescr) {
417 $param .= "&sprod_fulldescr=".urlencode($sprod_fulldescr);
418 }
419 if ($sref) {
420 $param .= "&sref=".urlencode($sref);
421 }
422 if ($month) {
423 $param .= "&month=".urlencode((string) ($month));
424 }
425 if ($year) {
426 $param .= "&year=".urlencode((string) ($year));
427 }
428 if ($optioncss != '') {
429 $param .= '&optioncss='.urlencode($optioncss);
430 }
431
432 print_barre_liste($langs->trans('ProductsIntoElements').' '.$typeElementString.' '.$button, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $totalnboflines, '', 0, '', 'nogreyscale', $limit);
433
434 print '<div class="div-table-responsive-no-min">';
435 print '<table class="liste centpercent">'."\n";
436
437 // Filters
438 print '<tr class="liste_titre">';
439 print '<td class="liste_titre left">';
440 print '<input class="flat" type="text" name="sref" size="8" value="'.$sref.'">';
441 print '</td>';
442 print '<td class="liste_titre nowrap center">'; // date
443 print $formother->select_month($month ? (string) $month : '-1', 'month', 1, 0, 'valignmiddle');
444 print $formother->selectyear($year ? (string) $year : '-1', 'year', 1, 20, 1);
445 print '</td>';
446 print '<td class="liste_titre center">';
447 print '</td>';
448 print '<td class="liste_titre left">';
449 print '<input class="flat" type="text" name="sprod_fulldescr" size="15" value="'.dol_escape_htmltag($sprod_fulldescr).'">';
450 print '</td>';
451 print '<td class="liste_titre center">'; // TODO: Add filters !
452 print '</td>';
453 print '<td class="liste_titre center">';
454 print '</td>';
455 print '<td class="liste_titre center">';
456 print '</td>';
457 print '<td class="liste_titre maxwidthsearch">';
458 $searchpicto = $form->showFilterAndCheckAddButtons(0);
459 print $searchpicto;
460 print '</td>';
461 print '</tr>';
462
463 // Titles with sort buttons
464 print '<tr class="liste_titre">';
465 print_liste_field_titre('Ref', $_SERVER['PHP_SELF'], 'doc_number', '', $param, '', $sortfield, $sortorder, 'left ');
466 print_liste_field_titre('Date', $_SERVER['PHP_SELF'], 'dateprint', '', $param, 'width="150"', $sortfield, $sortorder, 'center ');
467 print_liste_field_titre('Status', $_SERVER['PHP_SELF'], 'fk_statut', '', $param, '', $sortfield, $sortorder, 'center ');
468 print_liste_field_titre('Product', $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'left ');
469 print_liste_field_titre('ContactType', $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'left ');
470 print_liste_field_titre('Quantity', $_SERVER['PHP_SELF'], 'prod_qty', '', $param, '', $sortfield, $sortorder, 'right ');
471 print_liste_field_titre('TotalHT', $_SERVER['PHP_SELF'], 'total_ht', '', $param, '', $sortfield, $sortorder, 'right ');
472 print_liste_field_titre('UnitPrice', $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'right ');
473 print "</tr>\n";
474
475
476 $i = 0;
477 $total_qty = 0;
478 $total_ht = 0;
479 while (($objp = $db->fetch_object($resql)) && $i < min($num, $limit)) {
480 $documentstatic->id = $objp->doc_id;
481 $documentstatic->ref = $objp->doc_number;
482 $documentstatic->type = $objp->doc_type;
483
484 $documentstatic->fk_statut = $objp->status;
485 $documentstatic->statut = $objp->status;
486 $documentstatic->status = $objp->status;
487 if ($type_element == 'invoice' || $type_element == 'supplier_invoice') {
488 $documentstatic->paye = $objp->paid;
489 $documentstatic->paid = $objp->paid;
490 }
491
492 if (is_object($documentstaticline)) {
493 $documentstaticline->statut = $objp->status;
494 }
495
496 print '<tr class="oddeven">';
497 print '<td class="nobordernopadding nowrap" width="100">';
498 print $documentstatic->getNomUrl(1);
499 print '</td>';
500 print '<td class="center" width="80">'.dol_print_date($db->jdate($objp->dateprint), 'day').'</td>';
501
502 // Status
503 print '<td class="center">';
504 if ($type_element == 'contract') {
505 print $documentstaticline->getLibStatut(2);
506 } else {
507 print $documentstatic->getLibStatut(2);
508 }
509 print '</td>';
510
511 print '<td>';
512
513 // Define text, description and type
514 $text = '';
515 $description = '';
516 $type = 0;
517
518 // Code to show product duplicated from commonobject->printObjectLine
519 if ($objp->fk_product > 0) {
520 $product_static = new Product($db);
521
522 $product_static->type = $objp->fk_product_type;
523 $product_static->id = $objp->fk_product;
524 $product_static->ref = $objp->ref;
525 $product_static->entity = $objp->pentity;
526 $text = $product_static->getNomUrl(1);
527 }
528
529 // Product
530 if ($objp->fk_product > 0) {
531 // Define output language
532 if (getDolGlobalInt('MAIN_MULTILANGS') && getDolGlobalString('PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE')) {
533 $prod = new Product($db);
534 $prod->fetch($objp->fk_product);
535
536 $outputlangs = $langs;
537 $newlang = '';
538 if (empty($newlang) && GETPOST('lang_id', 'aZ09')) {
539 $newlang = GETPOST('lang_id', 'aZ09');
540 }
541 if (empty($newlang)) {
542 $newlang = $object->default_lang;
543 }
544 if (!empty($newlang)) {
545 $outputlangs = new Translate("", $conf);
546 $outputlangs->setDefaultLang($newlang);
547 }
548
549 $label = (!empty($prod->multilangs[$outputlangs->defaultlang]["label"])) ? $prod->multilangs[$outputlangs->defaultlang]["label"] : $objp->product_label;
550 } else {
551 $label = $objp->product_label;
552 }
553
554 $text .= ' - '.(!empty($objp->label) ? $objp->label : $label);
555 $description = (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE') ? '' : dol_htmlentitiesbr($objp->description));
556 }
557
558 if (($objp->info_bits & 2) == 2) {
559 print '<a href="'.DOL_URL_ROOT.'/comm/remx.php?id='.$object->id.'">';
560 $txt = '';
561 print img_object($langs->trans("ShowReduc"), 'reduc').' ';
562 if ($objp->description == '(DEPOSIT)') {
563 $txt = $langs->trans("Deposit");
564 } elseif ($objp->description == '(EXCESS RECEIVED)') {
565 $txt = $langs->trans("ExcessReceived");
566 } elseif ($objp->description == '(EXCESS PAID)') {
567 $txt = $langs->trans("ExcessPaid");
568 }
569 //else $txt=$langs->trans("Discount");
570 print $txt;
571 print '</a>';
572 if ($objp->description) {
573 if ($objp->description == '(CREDIT_NOTE)' && $objp->fk_remise_except > 0) {
574 $discount = new DiscountAbsolute($db);
575 $discount->fetch($objp->fk_remise_except);
576 echo($txt ? ' - ' : '').$langs->transnoentities("DiscountFromCreditNote", $discount->getNomUrl(0));
577 }
578 if ($objp->description == '(EXCESS RECEIVED)' && $objp->fk_remise_except > 0) {
579 $discount = new DiscountAbsolute($db);
580 $discount->fetch($objp->fk_remise_except);
581 echo($txt ? ' - ' : '').$langs->transnoentities("DiscountFromExcessReceived", $discount->getNomUrl(0));
582 } elseif ($objp->description == '(EXCESS PAID)' && $objp->fk_remise_except > 0) {
583 $discount = new DiscountAbsolute($db);
584 $discount->fetch($objp->fk_remise_except);
585 echo($txt ? ' - ' : '').$langs->transnoentities("DiscountFromExcessPaid", $discount->getNomUrl(0));
586 } elseif ($objp->description == '(DEPOSIT)' && $objp->fk_remise_except > 0) {
587 $discount = new DiscountAbsolute($db);
588 $discount->fetch($objp->fk_remise_except);
589 echo($txt ? ' - ' : '').$langs->transnoentities("DiscountFromDeposit", $discount->getNomUrl(0));
590 // Add date of deposit
591 if (getDolGlobalString('INVOICE_ADD_DEPOSIT_DATE')) {
592 echo ' ('.dol_print_date($discount->datec).')';
593 }
594 } else {
595 echo($txt ? ' - ' : '').dol_htmlentitiesbr($objp->description);
596 }
597 }
598 } else {
599 if ($objp->fk_product > 0) {
600 echo $form->textwithtooltip($text, $description, 3, 0, '', (string) $i, 0, '');
601
602 // Show range
603 echo get_date_range($objp->date_start, $objp->date_end);
604
605 // Add description in form
606 if (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE')) {
607 print (!empty($objp->description) && $objp->description != $objp->product_label) ? '<br>'.dol_htmlentitiesbr($objp->description) : '';
608 }
609 } else {
610 if (!empty($objp->label) || !empty($objp->description)) {
611 if ($type == 1) {
612 $text = img_object($langs->trans('Service'), 'service');
613 } else {
614 $text = img_object($langs->trans('Product'), 'product');
615 }
616
617 if (!empty($objp->label)) {
618 $text .= ' <strong>'.$objp->label.'</strong>';
619 echo $form->textwithtooltip($text, dol_htmlentitiesbr($objp->description), 3, 0, '', (string) $i, 0, '');
620 } else {
621 echo $text.' '.dol_htmlentitiesbr($objp->description);
622 }
623 }
624
625 // Show range
626 echo get_date_range($objp->date_start, $objp->date_end);
627 }
628 }
629
630 /*
631 $prodreftxt='';
632 if ($objp->prod_id > 0)
633 {
634 $productstatic->id = $objp->prod_id;
635 $productstatic->ref = $objp->prod_ref;
636 $productstatic->status = $objp->prod_type;
637 $prodreftxt = $productstatic->getNomUrl(0);
638 if(!empty($objp->product_label)) $prodreftxt .= ' - '.$objp->product_label;
639 }
640 // Show range
641 $prodreftxt .= get_date_range($objp->date_start, $objp->date_end);
642 // Add description in form
643 if (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE'))
644 {
645 $prodreftxt .= (!empty($objp->description) && $objp->description!=$objp->product_label)?'<br>'.dol_htmlentitiesbr($objp->description):'';
646 }
647 */
648 print '</td>';
649
650 print '<td>'.$objp->type_contact_label.'</td>'; // Type of contact label
651
652 print '<td class="right">'.$objp->prod_qty.'</td>';
653 $total_qty += $objp->prod_qty;
654
655 print '<td class="right">'.price($objp->total_ht).'</td>';
656 $total_ht += $objp->total_ht;
657
658 print '<td class="right">'.price($objp->total_ht / (empty($objp->prod_qty) ? 1 : $objp->prod_qty)).'</td>';
659
660 print "</tr>\n";
661 $i++;
662 }
663
664 print '<tr class="liste_total">';
665 print '<td>'.$langs->trans('Total').'</td>';
666 print '<td colspan="3"></td>';
667 print '<td></td>';
668 print '<td class="right">'.$total_qty.'</td>';
669 print '<td class="right">'.price($total_ht).'</td>';
670 print '<td class="right">'.price($total_ht / (empty($total_qty) ? 1 : $total_qty)).'</td>';
671 print "</table>";
672 print '</div>';
673
674 if ($num > $limit) {
675 print_barre_liste('', $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num);
676 }
677 $db->free($resql);
678} elseif (empty($type_element) || $type_element == -1) {
679 print_barre_liste($langs->trans('ProductsIntoElements').' '.$typeElementString.' '.$button, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, '', '', 0, '', 'nogreyscale', $limit);
680
681 print '<table class="liste centpercent">'."\n";
682 // Titles with sort buttons
683 print '<tr class="liste_titre">';
684 print_liste_field_titre('Ref', $_SERVER['PHP_SELF'], 'doc_number', '', $param, '', $sortfield, $sortorder, 'left ');
685 print_liste_field_titre('Date', $_SERVER['PHP_SELF'], 'dateprint', '', $param, 'width="150"', $sortfield, $sortorder, 'center ');
686 print_liste_field_titre('Status', $_SERVER['PHP_SELF'], 'fk_status', '', $param, '', $sortfield, $sortorder, 'center ');
687 print_liste_field_titre('Product', $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'left ');
688 print_liste_field_titre('Quantity', $_SERVER['PHP_SELF'], 'prod_qty', '', $param, '', $sortfield, $sortorder, 'right ');
689 print "</tr>\n";
690
691 print '<tr class="oddeven"><td colspan="5"><span class="opacitymedium">'.$langs->trans("SelectElementAndClick", $langs->transnoentitiesnoconv("Search")).'</span></td></tr>';
692
693 print "</table>";
694} else {
695 print_barre_liste($langs->trans('ProductsIntoElements').' '.$typeElementString.' '.$button, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, '', '', 0, '', 'nogreyscale', $limit);
696
697 print '<table class="liste centpercent">'."\n";
698
699 print '<tr class="oddeven"><td colspan="5"><span class="opacitymedium">'.$langs->trans("FeatureNotYetAvailable").'</span></td></tr>';
700
701 print "</table>";
702}
703
704print "</form>";
705
706// End of page
707llxFooter();
708$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 customers orders.
Class to manage contact/addresses.
Class to manage lines of contracts.
Class to manage absolute discounts.
Class to manage suppliers invoices.
Class to manage 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.
Class to manage proposals.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
contact_prepare_head(Contact $object)
Prepare array with list of tabs.
dolSqlDateFilter($datefield, $day_date, $month_date, $year_date, $excludefirstand=0, $gm=false)
Generate a SQL string to make a filter into a range (for second of date until last second of date).
Definition date.lib.php:385
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $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, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
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, $morecssdiv='')
Show tabs of a record.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
get_date_range($date_start, $date_end, $format='', $outputlangs=null, $withparenthesis=1)
Format output for start and end date.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
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...
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.