dolibarr 20.0.2
card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (c) 2004-2019 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2005 Eric Seigne <eric.seigne@ryxeo.com>
6 * Copyright (C) 2013 Juanjo Menent <jmenent@2byte.es>
7 * Copyright (C) 2019 Thibault FOUCART <support@ptibogxiv.net>
8 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 */
23
30// Load Dolibarr environment
31require '../../main.inc.php';
32require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php';
33require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
34require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
35require_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php';
36require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
37require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
38
39$WIDTH = DolGraph::getDefaultGraphSizeForStats('width', 380);
40$HEIGHT = DolGraph::getDefaultGraphSizeForStats('height', 160);
41
42// Load translation files required by the page
43$langs->loadLangs(array('companies', 'products', 'stocks', 'bills', 'other'));
44
45$id = GETPOSTINT('id'); // For this page, id can also be 'all'
46$ref = GETPOST('ref', 'alpha');
47$mode = (GETPOST('mode', 'alpha') ? GETPOST('mode', 'alpha') : 'byunit');
48$search_year = GETPOSTINT('search_year');
49$search_categ = GETPOSTINT('search_categ');
50$notab = GETPOSTINT('notab');
51$type = GETPOST('type', 'alpha');
52
53$error = 0;
54$mesg = '';
55$graphfiles = array();
56
57$socid = GETPOSTINT('socid');
58if (!empty($user->socid)) {
59 $socid = $user->socid;
60}
61if ($socid < 0) {
62 $socid = 0;
63}
64
65// Security check
66$fieldvalue = ($id > 0 ? $id : $ref);
67$fieldtype = (!empty($ref) ? 'ref' : 'rowid');
68
69// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
70$hookmanager->initHooks(array('productstatscard', 'globalcard'));
71
72$tmp = dol_getdate(dol_now());
73$currentyear = $tmp['year'];
74if (empty($search_year)) {
75 $search_year = $currentyear;
76}
77$moreforfilter = "";
78
79$object = new Product($db);
80if ($id > 0 || !empty($ref)) {
81 $result = $object->fetch($id, $ref);
82}
83
84$result = restrictedArea($user, 'produit|service', $fieldvalue, 'product&product', '', '', $fieldtype);
85
86
87/*
88 * Actions
89 */
90
91// None
92
93
94/*
95 * View
96 */
97
98$form = new Form($db);
99$htmlother = new FormOther($db);
100
101if (!($id > 0) && empty($ref) || $notab) {
102 $notab = 1;
103
104 llxHeader("", $langs->trans("ProductStatistics"), '', '', 0, 0, '', '', '', 'mod-product page-stats_card_general');
105
106 $type = GETPOSTINT('type');
107
108 $helpurl = '';
109 if ($type == '0') {
110 $helpurl = 'EN:Module_Products|FR:Module_Produits|ES:M&oacute;dulo_Productos';
111 //$title=$langs->trans("StatisticsOfProducts");
112 $title = $langs->trans("Statistics");
113 } else {
114 $helpurl = 'EN:Module_Services_En|FR:Module_Services|ES:M&oacute;dulo_Servicios';
115 //$title=$langs->trans("StatisticsOfProductsOrServices");
116 $title = $langs->trans("Statistics");
117 }
118
119 $picto = 'product';
120 if ($type == 1) {
121 $picto = 'service';
122 }
123
124 print load_fiche_titre($title, $mesg, $picto);
125} else {
126 $result = $object->fetch($id, $ref);
127
128 $title = $langs->trans('ProductServiceCard');
129 $helpurl = '';
130 $shortlabel = dol_trunc($object->label, 16);
131 if (GETPOST("type") == '0' || ($object->type == Product::TYPE_PRODUCT)) {
132 $title = $langs->trans('Product')." ".$shortlabel." - ".$langs->trans('Statistics');
133 $helpurl = 'EN:Module_Products|FR:Module_Produits|ES:M&oacute;dulo_Productos';
134 }
135 if (GETPOST("type") == '1' || ($object->type == Product::TYPE_SERVICE)) {
136 $title = $langs->trans('Service')." ".$shortlabel." - ".$langs->trans('Statistics');
137 $helpurl = 'EN:Module_Services_En|FR:Module_Services|ES:M&oacute;dulo_Servicios';
138 }
139
140 //HERE
141 llxHeader('', $title, $helpurl, '', 0, 0, '', '', '', 'mod-product page-stats_card_by_product');
142}
143
144
145if ($result && ($id > 0 || !empty($ref)) && empty($notab)) {
147 $titre = $langs->trans("CardProduct".$object->type);
148 $picto = ($object->type == Product::TYPE_SERVICE ? 'service' : 'product');
149
150 print dol_get_fiche_head($head, 'stats', $titre, -1, $picto);
151
152 $linkback = '<a href="'.DOL_URL_ROOT.'/product/list.php?restore_lastsearch_values=1&type='.$object->type.'">'.$langs->trans("BackToList").'</a>';
153
154 dol_banner_tab($object, 'ref', $linkback, ($user->socid ? 0 : 1), 'ref', '', '', '', 0, '', '', 1);
155
156 print dol_get_fiche_end();
157}
158if ((!($id > 0) && empty($ref)) || $notab) {
159 $h = 0;
160 $head = array();
161
162 $head[$h][0] = DOL_URL_ROOT.'/product/stats/card.php'.($type != '' ? '?type='.((int) $type) : '');
163 $head[$h][1] = $langs->trans("Chart");
164 $head[$h][2] = 'chart';
165 $h++;
166
167 $title = $langs->trans("ListProductServiceByPopularity");
168 if ((string) $type == '0') {
169 $title = $langs->trans("ListProductByPopularity");
170 }
171 if ((string) $type == '1') {
172 $title = $langs->trans("ListServiceByPopularity");
173 }
174
175
176 $head[$h][0] = DOL_URL_ROOT.'/product/popuprop.php'.($type != '' ? '?type='.((int) $type) : '');
177 $head[$h][1] = $langs->trans("ProductsServicesPerPopularity");
178 if ((string) $type == '0') {
179 $head[$h][1] = $langs->trans("ProductsPerPopularity");
180 }
181 if ((string) $type == '1') {
182 $head[$h][1] = $langs->trans("ServicesPerPopularity");
183 }
184 $head[$h][2] = 'popularity';
185 $h++;
186
187 print dol_get_fiche_head($head, 'chart', '', -1);
188}
189
190
191if ($result || !($id > 0)) {
192 print '<form name="stats" method="POST" action="'.$_SERVER["PHP_SELF"].'">';
193 print '<input type="hidden" name="token" value="'.newToken().'">';
194 if (empty($id) || $notab) {
195 print '<input type="hidden" name="notab" value="1">';
196 }
197
198 print '<table class="noborder centpercent">';
199 print '<tr class="liste_titre"><td class="liste_titre">'.$langs->trans("Filter").'</td><td></td></tr>';
200
201 if (!($id > 0) || $notab) {
202 // Type
203 print '<tr class="nooddeven"><td class="titlefield">'.$langs->trans("Type").'</td><td>';
204 $array = array('-1' => '&nbsp;', '0' => $langs->trans('Product'), '1' => $langs->trans('Service'));
205 print $form->selectarray('type', $array, $type, 0, 0, 0, '', 0, 0, 0, '', 'minwidth100');
206 print '</td></tr>';
207
208 // Product
209 print '<tr class="nooddeven"><td class="titlefield">'.$langs->trans("ProductOrService").'</td><td>';
210 print img_picto('', 'product', 'class="pictofixedwidth"');
211 print $form->select_produits($id, 'id', '', 0, 0, 1, 2, '', ($conf->dol_optimize_smallscreen ? 1 : 0), array(), 0, '1', 0, 'widthcentpercentminusx maxwidth400');
212 print '</td></tr>';
213
214 // Tag
215 if (isModEnabled('category')) {
216 print '<tr class="nooddeven"><td class="titlefield">'.$langs->trans("Categories").'</td><td>';
217 $moreforfilter .= img_picto($langs->trans("Categories"), 'category', 'class="pictofixedwidth"');
218 $moreforfilter .= $htmlother->select_categories(Categorie::TYPE_PRODUCT, $search_categ, 'search_categ', 1, 1, 'widthcentpercentminusx maxwidth400');
219 print $moreforfilter;
220 print '</td></tr>';
221 }
222 } else {
223 print '<input type="hidden" name="id" value="'.$id.'">';
224 }
225
226 // Year
227 print '<tr class="nooddeven"><td class="titlefield">'.$langs->trans("Year").'</td><td>';
228 $arrayyears = array();
229 for ($year = $currentyear - 25; $year < $currentyear; $year++) {
230 $arrayyears[$year] = $year;
231 }
232 if (!in_array($year, $arrayyears)) {
233 $arrayyears[$year] = $year;
234 }
235 if (!in_array($currentyear, $arrayyears)) {
236 $arrayyears[$currentyear] = $currentyear;
237 }
238 arsort($arrayyears);
239 print $form->selectarray('search_year', $arrayyears, $search_year, 1, 0, 0, '', 0, 0, 0, '', 'width75');
240 print '</td></tr>';
241
242 // thirdparty
243 print '<tr class="nooddeven"><td class="titlefield">'.$langs->trans("ThirdParty").'</td><td>';
244 print img_picto('', 'company', 'class="pictofixedwidth"');
245 print $form->select_company($socid, 'socid', '', 1, 0, 0, array(), 0, 'widthcentpercentminusx maxwidth400');
246 print '</td></tr>';
247
248 print '</table>';
249 print '<div class="center"><input type="submit" name="submit" class="button small" value="'.$langs->trans("Refresh").'"></div>';
250 print '</form><br>';
251
252 print '<br>';
253
254
255 $param = '';
256 $param .= (GETPOSTISSET('id') ? '&id='.GETPOSTINT('id') : '&id='.$object->id).(($type != '' && $type != '-1') ? '&type='.((int) $type) : '').'&search_year='.((int) $search_year).($notab ? '&notab='.$notab : '');
257 if ($socid > 0) {
258 $param .= '&socid='.((int) $socid);
259 }
260
261 // Choice of stats mode (byunit or bynumber)
262
263 if (!empty($conf->dol_use_jmobile)) {
264 print "\n".'<div class="fichecenter"><div class="nowrap">'."\n";
265 }
266
267 if ($mode != 'byunit') {
268 print '<a class="a-mesure-disabled marginleftonly marginrightonly reposition" href="'.$_SERVER["PHP_SELF"].'?mode=byunit'.$param.'">';
269 } else {
270 print '<span class="a-mesure marginleftonly marginrightonly">';
271 }
272 if ($type == '0') {
273 print $langs->trans("StatsByNumberOfUnitsProducts");
274 } elseif ($type == '1') {
275 print $langs->trans("StatsByNumberOfUnitsServices");
276 } else {
277 print $langs->trans("StatsByNumberOfUnits");
278 }
279 if ($mode != 'byunit') {
280 print '</a>';
281 } else {
282 print '</span>';
283 }
284
285 if (!empty($conf->dol_use_jmobile)) {
286 print '</div>'."\n".'<div class="nowrap">'."\n";
287 }
288
289 if ($mode != 'bynumber') {
290 print '<a class="a-mesure-disabled marginleftonly marginrightonly reposition" href="'.$_SERVER["PHP_SELF"].'?mode=bynumber'.$param.'">';
291 } else {
292 print '<span class="a-mesure marginleftonly marginrightonly">';
293 }
294 print $langs->trans("StatsByNumberOfEntities");
295 if ($mode != 'bynumber') {
296 print '</a>';
297 } else {
298 print '</span>';
299 }
300
301 if (!empty($conf->dol_use_jmobile)) {
302 print '</div>'."\n".'<div class="nowrap">'."\n";
303 }
304
305 if ($mode != 'byamount') {
306 print '<a class="a-mesure-disabled marginleftonly marginrightonly reposition" href="'.$_SERVER["PHP_SELF"].'?mode=byamount'.$param.'">';
307 } else {
308 print '<span class="a-mesure marginleftonly marginrightonly">';
309 }
310 if ($type == '0') {
311 print $langs->trans("StatsByAmountProducts");
312 } elseif ($type == '1') {
313 print $langs->trans("StatsByAmountServices");
314 } else {
315 print $langs->trans("StatsByAmount");
316 }
317 if ($mode != 'byamount') {
318 print '</a>';
319 } else {
320 print '</span>';
321 }
322
323 // End of choices
324 if (!empty($conf->dol_use_jmobile)) {
325 print '</div></div>';
326 } else {
327 print '<br>';
328 }
329 print '<br>';
330
331 // Generation of graphs
332 $dir = (!empty($conf->product->multidir_temp[$conf->entity]) ? $conf->product->multidir_temp[$conf->entity] : $conf->service->multidir_temp[$conf->entity]);
333 if ($object->id > 0) { // We are on statistics for a dedicated product
334 if (!file_exists($dir.'/'.$object->id)) {
335 if (dol_mkdir($dir.'/'.$object->id) < 0) {
336 $mesg = $langs->trans("ErrorCanNotCreateDir", $dir);
337 $error++;
338 }
339 }
340 }
341
342 $arrayforlabel = array('byunit' => 'NumberOfUnits', 'bynumber' => 'NumberOf', 'byamount' => 'AmountIn');
343
344 if (isModEnabled('propal')) {
345 $graphfiles['propal'] = array('modulepart' => 'productstats_proposals',
346 'file' => $object->id.'/propal12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
347 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("Proposals")));
348 }
349
350 if (isModEnabled('supplier_proposal')) {
351 $langs->load("supplier_proposal");
352 $graphfiles['proposalssuppliers'] = array('modulepart' => 'productstats_proposalssuppliers',
353 'file' => $object->id.'/proposalssuppliers12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
354 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("SupplierProposals")));
355 }
356
357 if (isModEnabled('order')) {
358 $langs->load("orders");
359 $graphfiles['orders'] = array('modulepart' => 'productstats_orders',
360 'file' => $object->id.'/orders12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
361 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("Orders")));
362 }
363
364 if (isModEnabled('supplier_order')) {
365 $langs->load("orders");
366 $graphfiles['orderssuppliers'] = array('modulepart' => 'productstats_orderssuppliers',
367 'file' => $object->id.'/orderssuppliers12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
368 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("SuppliersOrders")));
369 }
370
371 if (isModEnabled('invoice')) {
372 $graphfiles['invoices'] = array('modulepart' => 'productstats_invoices',
373 'file' => $object->id.'/invoices12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
374 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("Invoices")));
375 }
376
377 if (isModEnabled('supplier_invoice')) {
378 $graphfiles['invoicessuppliers'] = array('modulepart' => 'productstats_invoicessuppliers',
379 'file' => $object->id.'/invoicessuppliers12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
380 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("SupplierInvoices")));
381 }
382
383 if (isModEnabled('contract')) {
384 $graphfiles['contracts'] = array('modulepart' => 'productstats_contracts',
385 'file' => $object->id.'/contracts12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
386 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("Contracts")));
387 }
388
389 if (isModEnabled('mrp') && $mode != 'byamount') {
390 $graphfiles['mrp'] = array('modulepart' => 'productstats_mrp',
391 'file' => $object->id.'/mos12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
392 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode]."Mos"));
393 }
394
395 $px = new DolGraph();
396
397 if (!$error && count($graphfiles) > 0) {
398 $mesg = $px->isGraphKo();
399 if (!$mesg) {
400 foreach ($graphfiles as $key => $val) {
401 if (!$graphfiles[$key]['file']) {
402 continue;
403 }
404
405 $graph_data = array();
406
407 if (dol_is_file($dir.'/'.$graphfiles[$key]['file'])) {
408 // TODO Load cachefile $graphfiles[$key]['file']
409 } else {
410 $morefilters = '';
411 if ($search_categ > 0) {
412 $categ = new Categorie($db);
413 $categ->fetch($search_categ);
414 $listofprodids = $categ->getObjectsInCateg('product', 1);
415 $morefilters = ' AND d.fk_product IN ('.$db->sanitize((is_array($listofprodids) && count($listofprodids)) ? implode(',', $listofprodids) : '0').')';
416 }
417 if ($search_categ == -2) {
418 $morefilters = ' AND NOT EXISTS (SELECT cp.fk_product FROM '.MAIN_DB_PREFIX.'categorie_product as cp WHERE d.fk_product = cp.fk_product)';
419 }
420
421 if ($key == 'propal') {
422 $graph_data = $object->get_nb_propal($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
423 }
424 if ($key == 'orders') {
425 $graph_data = $object->get_nb_order($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
426 }
427 if ($key == 'invoices') {
428 $graph_data = $object->get_nb_vente($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
429 }
430 if ($key == 'proposalssuppliers') {
431 $graph_data = $object->get_nb_propalsupplier($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
432 }
433 if ($key == 'invoicessuppliers') {
434 $graph_data = $object->get_nb_achat($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
435 }
436 if ($key == 'orderssuppliers') {
437 $graph_data = $object->get_nb_ordersupplier($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
438 }
439 if ($key == 'contracts') {
440 $graph_data = $object->get_nb_contract($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
441 }
442 if ($key == 'mrp') {
443 $graph_data = $object->get_nb_mos($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
444 }
445
446 // TODO Save cachefile $graphfiles[$key]['file']
447 }
448
449 if (is_array($graph_data)) {
450 $px->SetData($graph_data);
451 $px->SetYLabel($graphfiles[$key]['label']);
452 $px->SetMaxValue($px->GetCeilMaxValue() < 0 ? 0 : $px->GetCeilMaxValue());
453 $px->SetMinValue($px->GetFloorMinValue() > 0 ? 0 : $px->GetFloorMinValue());
454 $px->setShowLegend(0);
455 $px->SetWidth($WIDTH);
456 $px->SetHeight($HEIGHT);
457 $px->SetHorizTickIncrement(1);
458 $px->SetShading(3);
459 //print 'x '.$key.' '.$graphfiles[$key]['file'];
460
461 $url = DOL_URL_ROOT.'/viewimage.php?modulepart='.$graphfiles[$key]['modulepart'].'&entity='.((int) $object->entity).'&file='.urlencode($graphfiles[$key]['file']).($notab ? '&notab='.$notab : '');
462 $px->draw($dir."/".$graphfiles[$key]['file'], $url);
463
464 $graphfiles[$key]['total'] = $px->total();
465 $graphfiles[$key]['output'] = $px->show();
466 } else {
467 dol_print_error($db, 'Error for calculating graph on key='.$key.' - '.$object->error);
468 }
469 }
470
471 //setEventMessages($langs->trans("ChartGenerated"), null, 'mesgs');
472 }
473 }
474
475 // Show graphs
476 $i = 0;
477 if (count($graphfiles) > 0) {
478 foreach ($graphfiles as $key => $val) {
479 if (!$graphfiles[$key]['file']) {
480 continue;
481 }
482
483 if ($graphfiles == 'propal' && !$user->hasRight('propal', 'lire')) {
484 continue;
485 }
486 if ($graphfiles == 'order' && !$user->hasRight('commande', 'lire')) {
487 continue;
488 }
489 if ($graphfiles == 'invoices' && !$user->hasRight('facture', 'lire')) {
490 continue;
491 }
492 if ($graphfiles == 'proposals_suppliers' && !$user->hasRight('supplier_proposal', 'lire')) {
493 continue;
494 }
495 if ($graphfiles == 'invoices_suppliers' && !$user->hasRight('fournisseur', 'facture', 'lire')) {
496 continue;
497 }
498 if ($graphfiles == 'orders_suppliers' && !$user->hasRight('fournisseur', 'commande', 'lire')) {
499 continue;
500 }
501 if ($graphfiles == 'mrp' && !$user->hasRight('mrp', 'read')) {
502 continue;
503 }
504
505
506 if ($i % 2 == 0) {
507 print "\n".'<div class="fichecenter"><div class="fichehalfleft">'."\n";
508 } else {
509 print "\n".'<div class="fichehalfright">'."\n";
510 }
511
512 // Date generation
513 if ($graphfiles[$key]['output'] && !$px->isGraphKo()) {
514 if (file_exists($dir."/".$graphfiles[$key]['file']) && filemtime($dir."/".$graphfiles[$key]['file'])) {
515 $dategenerated = $langs->trans("GeneratedOn", dol_print_date(filemtime($dir."/".$graphfiles[$key]['file']), "dayhour"));
516 } else {
517 $dategenerated = $langs->trans("GeneratedOn", dol_print_date(dol_now(), "dayhour"));
518 }
519 } else {
520 $dategenerated = ($mesg ? '<span class="error">'.$mesg.'</span>' : $langs->trans("ChartNotGenerated"));
521 }
522 $linktoregenerate = '<a class="reposition" href="'.$_SERVER["PHP_SELF"].'?'.(GETPOSTISSET('id') ? 'id='.GETPOSTINT('id') : 'id='.$object->id).(((string) $type != '' && $type != '-1') ? '&type='.((int) $type) : '').'&action=recalcul&mode='.urlencode($mode).'&search_year='.((int) $search_year).($search_categ > 0 ? '&search_categ='.((int) $search_categ) : '').'">';
523 $linktoregenerate .= img_picto($langs->trans("ReCalculate").' ('.$dategenerated.')', 'refresh');
524 $linktoregenerate .= '</a>';
525
526
527 // Show graph
528 print '<div class="div-table-responsive-no-min">';
529 print '<table class="noborder centpercent">';
530 // Label
531 print '<tr class="liste_titre"><td>';
532 print $graphfiles[$key]['label'];
533 print ' <span class="opacitymedium">('.$graphfiles[$key]['total'].')</span></td>';
534 print '<td align="right">'.$linktoregenerate.'</td>';
535 print '</tr>';
536 // Image
537 print '<tr><td colspan="2" class="nohover" align="center">';
538 print $graphfiles[$key]['output'];
539 print '</td></tr>';
540 print '</table>';
541 print '</div>';
542
543 if ($i % 2 == 0) {
544 print "\n".'</div>'."\n";
545 } else {
546 print "\n".'</div></div>';
547 print '<div class="clear"><div class="fichecenter"><br></div></div>'."\n";
548 }
549
550 $i++;
551 }
552 }
553 // div not closed
554 if ($i % 2 == 1) {
555 print "\n".'<div class="fichehalfright">'."\n";
556 print "\n".'</div></div>';
557 print '<div class="clear"><div class="fichecenter"><br></div></div>'."\n";
558 }
559}
560
561if (!($id > 0)) {
562 print dol_get_fiche_end();
563}
564
565// End of page
566llxFooter();
567$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 categories.
Class to build graphs.
static getDefaultGraphSizeForStats($direction, $defaultsize='')
getDefaultGraphSizeForStats
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_PRODUCT
Regular product.
const TYPE_SERVICE
Service.
dol_is_file($pathoffile)
Return if path is a file.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
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)
Show tabs of a record.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_now($mode='auto')
Return date for now.
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).
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_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.
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
product_prepare_head($object)
Prepare array with list of tabs.
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.