dolibarr 20.0.5
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 $object->next_prev_filter = "(te.fk_product_type:=:".((int) $object->type).")";
154
155 dol_banner_tab($object, 'ref', $linkback, ($user->socid ? 0 : 1), 'ref', '', '', '', 0, '', '', 1);
156
157 print dol_get_fiche_end();
158}
159if ((!($id > 0) && empty($ref)) || $notab) {
160 $h = 0;
161 $head = array();
162
163 $head[$h][0] = DOL_URL_ROOT.'/product/stats/card.php'.($type != '' ? '?type='.((int) $type) : '');
164 $head[$h][1] = $langs->trans("Chart");
165 $head[$h][2] = 'chart';
166 $h++;
167
168 $title = $langs->trans("ListProductServiceByPopularity");
169 if ((string) $type == '0') {
170 $title = $langs->trans("ListProductByPopularity");
171 }
172 if ((string) $type == '1') {
173 $title = $langs->trans("ListServiceByPopularity");
174 }
175
176
177 $head[$h][0] = DOL_URL_ROOT.'/product/popuprop.php'.($type != '' ? '?type='.((int) $type) : '');
178 $head[$h][1] = $langs->trans("ProductsServicesPerPopularity");
179 if ((string) $type == '0') {
180 $head[$h][1] = $langs->trans("ProductsPerPopularity");
181 }
182 if ((string) $type == '1') {
183 $head[$h][1] = $langs->trans("ServicesPerPopularity");
184 }
185 $head[$h][2] = 'popularity';
186 $h++;
187
188 print dol_get_fiche_head($head, 'chart', '', -1);
189}
190
191
192if ($result || !($id > 0)) {
193 print '<form name="stats" method="POST" action="'.$_SERVER["PHP_SELF"].'">';
194 print '<input type="hidden" name="token" value="'.newToken().'">';
195 if (empty($id) || $notab) {
196 print '<input type="hidden" name="notab" value="1">';
197 }
198
199 print '<table class="noborder centpercent">';
200 print '<tr class="liste_titre"><td class="liste_titre">'.$langs->trans("Filter").'</td><td></td></tr>';
201
202 if (!($id > 0) || $notab) {
203 // Type
204 print '<tr class="nooddeven"><td class="titlefield">'.$langs->trans("Type").'</td><td>';
205 $array = array('-1' => '&nbsp;', '0' => $langs->trans('Product'), '1' => $langs->trans('Service'));
206 print $form->selectarray('type', $array, $type, 0, 0, 0, '', 0, 0, 0, '', 'minwidth100');
207 print '</td></tr>';
208
209 // Product
210 print '<tr class="nooddeven"><td class="titlefield">'.$langs->trans("ProductOrService").'</td><td>';
211 print img_picto('', 'product', 'class="pictofixedwidth"');
212 print $form->select_produits($id, 'id', '', 0, 0, 1, 2, '', ($conf->dol_optimize_smallscreen ? 1 : 0), array(), 0, '1', 0, 'widthcentpercentminusx maxwidth400');
213 print '</td></tr>';
214
215 // Tag
216 if (isModEnabled('category')) {
217 print '<tr class="nooddeven"><td class="titlefield">'.$langs->trans("Categories").'</td><td>';
218 $moreforfilter .= img_picto($langs->trans("Categories"), 'category', 'class="pictofixedwidth"');
219 $moreforfilter .= $htmlother->select_categories(Categorie::TYPE_PRODUCT, $search_categ, 'search_categ', 1, 1, 'widthcentpercentminusx maxwidth400');
220 print $moreforfilter;
221 print '</td></tr>';
222 }
223 } else {
224 print '<input type="hidden" name="id" value="'.$id.'">';
225 }
226 print '<input type="hidden" name="mode" value="'.$mode.'">';
227
228 // Year
229 print '<tr class="nooddeven"><td class="titlefield">'.$langs->trans("Year").'</td><td>';
230 $arrayyears = array();
231 for ($year = $currentyear - 25; $year < $currentyear; $year++) {
232 $arrayyears[$year] = $year;
233 }
234 if (!in_array($year, $arrayyears)) {
235 $arrayyears[$year] = $year;
236 }
237 if (!in_array($currentyear, $arrayyears)) {
238 $arrayyears[$currentyear] = $currentyear;
239 }
240 arsort($arrayyears);
241 print $form->selectarray('search_year', $arrayyears, $search_year, 1, 0, 0, '', 0, 0, 0, '', 'width75');
242 print '</td></tr>';
243
244 // thirdparty
245 print '<tr class="nooddeven"><td class="titlefield">'.$langs->trans("ThirdParty").'</td><td>';
246 print img_picto('', 'company', 'class="pictofixedwidth"');
247 print $form->select_company($socid, 'socid', '', 1, 0, 0, array(), 0, 'widthcentpercentminusx maxwidth400');
248 print '</td></tr>';
249
250 print '</table>';
251 print '<div class="center"><input type="submit" name="submit" class="button small" value="'.$langs->trans("Refresh").'"></div>';
252 print '</form><br>';
253
254 print '<br>';
255
256
257 $param = '';
258 $param .= (GETPOSTISSET('id') ? '&id='.GETPOSTINT('id') : '&id='.$object->id).(($type != '' && $type != '-1') ? '&type='.((int) $type) : '').'&search_year='.((int) $search_year).($notab ? '&notab='.$notab : '');
259 if ($socid > 0) {
260 $param .= '&socid='.((int) $socid);
261 }
262 if (!empty($search_categ)) {
263 $param .= '&search_categ='.((int) $search_categ);
264 }
265
266 // Choice of stats mode (byunit or bynumber)
267
268 if (!empty($conf->dol_use_jmobile)) {
269 print "\n".'<div class="fichecenter"><div class="nowrap">'."\n";
270 }
271
272 if ($mode != 'byunit') {
273 print '<a class="a-mesure-disabled marginleftonly marginrightonly reposition" href="'.$_SERVER["PHP_SELF"].'?mode=byunit'.$param.'">';
274 } else {
275 print '<span class="a-mesure marginleftonly marginrightonly">';
276 }
277 if ($type == '0') {
278 print $langs->trans("StatsByNumberOfUnitsProducts");
279 } elseif ($type == '1') {
280 print $langs->trans("StatsByNumberOfUnitsServices");
281 } else {
282 print $langs->trans("StatsByNumberOfUnits");
283 }
284 if ($mode != 'byunit') {
285 print '</a>';
286 } else {
287 print '</span>';
288 }
289
290 if (!empty($conf->dol_use_jmobile)) {
291 print '</div>'."\n".'<div class="nowrap">'."\n";
292 }
293
294 if ($mode != 'bynumber') {
295 print '<a class="a-mesure-disabled marginleftonly marginrightonly reposition" href="'.$_SERVER["PHP_SELF"].'?mode=bynumber'.$param.'">';
296 } else {
297 print '<span class="a-mesure marginleftonly marginrightonly">';
298 }
299 print $langs->trans("StatsByNumberOfEntities");
300 if ($mode != 'bynumber') {
301 print '</a>';
302 } else {
303 print '</span>';
304 }
305
306 if (!empty($conf->dol_use_jmobile)) {
307 print '</div>'."\n".'<div class="nowrap">'."\n";
308 }
309
310 if ($mode != 'byamount') {
311 print '<a class="a-mesure-disabled marginleftonly marginrightonly reposition" href="'.$_SERVER["PHP_SELF"].'?mode=byamount'.$param.'">';
312 } else {
313 print '<span class="a-mesure marginleftonly marginrightonly">';
314 }
315 if ($type == '0') {
316 print $langs->trans("StatsByAmountProducts");
317 } elseif ($type == '1') {
318 print $langs->trans("StatsByAmountServices");
319 } else {
320 print $langs->trans("StatsByAmount");
321 }
322 if ($mode != 'byamount') {
323 print '</a>';
324 } else {
325 print '</span>';
326 }
327
328 // End of choices
329 if (!empty($conf->dol_use_jmobile)) {
330 print '</div></div>';
331 } else {
332 print '<br>';
333 }
334 print '<br>';
335
336 // Generation of graphs
337 $dir = (!empty($conf->product->multidir_temp[$conf->entity]) ? $conf->product->multidir_temp[$conf->entity] : $conf->service->multidir_temp[$conf->entity]);
338 if ($object->id > 0) { // We are on statistics for a dedicated product
339 if (!file_exists($dir.'/'.$object->id)) {
340 if (dol_mkdir($dir.'/'.$object->id) < 0) {
341 $mesg = $langs->trans("ErrorCanNotCreateDir", $dir);
342 $error++;
343 }
344 }
345 }
346
347 $arrayforlabel = array('byunit' => 'NumberOfUnits', 'bynumber' => 'NumberOf', 'byamount' => 'AmountIn');
348
349 if (isModEnabled('propal')) {
350 $graphfiles['propal'] = array('modulepart' => 'productstats_proposals',
351 'file' => $object->id.'/propal12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
352 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("Proposals")));
353 }
354
355 if (isModEnabled('supplier_proposal')) {
356 $langs->load("supplier_proposal");
357 $graphfiles['proposalssuppliers'] = array('modulepart' => 'productstats_proposalssuppliers',
358 'file' => $object->id.'/proposalssuppliers12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
359 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("SupplierProposals")));
360 }
361
362 if (isModEnabled('order')) {
363 $langs->load("orders");
364 $graphfiles['orders'] = array('modulepart' => 'productstats_orders',
365 'file' => $object->id.'/orders12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
366 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("Orders")));
367 }
368
369 if (isModEnabled('supplier_order')) {
370 $langs->load("orders");
371 $graphfiles['orderssuppliers'] = array('modulepart' => 'productstats_orderssuppliers',
372 'file' => $object->id.'/orderssuppliers12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
373 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("SuppliersOrders")));
374 }
375
376 if (isModEnabled('invoice')) {
377 $graphfiles['invoices'] = array('modulepart' => 'productstats_invoices',
378 'file' => $object->id.'/invoices12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
379 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("Invoices")));
380 }
381
382 if (isModEnabled('supplier_invoice')) {
383 $graphfiles['invoicessuppliers'] = array('modulepart' => 'productstats_invoicessuppliers',
384 'file' => $object->id.'/invoicessuppliers12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
385 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("SupplierInvoices")));
386 }
387
388 if (isModEnabled('contract')) {
389 $graphfiles['contracts'] = array('modulepart' => 'productstats_contracts',
390 'file' => $object->id.'/contracts12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
391 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("Contracts")));
392 }
393
394 if (isModEnabled('mrp') && $mode != 'byamount') {
395 $graphfiles['mrp'] = array('modulepart' => 'productstats_mrp',
396 'file' => $object->id.'/mos12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
397 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode]."Mos"));
398 }
399
400 $px = new DolGraph();
401
402 if (!$error && count($graphfiles) > 0) {
403 $mesg = $px->isGraphKo();
404 if (!$mesg) {
405 foreach ($graphfiles as $key => $val) {
406 if (!$graphfiles[$key]['file']) {
407 continue;
408 }
409
410 $graph_data = array();
411
412 if (dol_is_file($dir.'/'.$graphfiles[$key]['file'])) {
413 // TODO Load cachefile $graphfiles[$key]['file']
414 } else {
415 $morefilters = '';
416 if ($search_categ > 0) {
417 $categ = new Categorie($db);
418 $categ->fetch($search_categ);
419 $listofprodids = $categ->getObjectsInCateg('product', 1);
420 $morefilters = ' AND d.fk_product IN ('.$db->sanitize((is_array($listofprodids) && count($listofprodids)) ? implode(',', $listofprodids) : '0').')';
421 }
422 if ($search_categ == -2) {
423 $morefilters = ' AND NOT EXISTS (SELECT cp.fk_product FROM '.MAIN_DB_PREFIX.'categorie_product as cp WHERE d.fk_product = cp.fk_product)';
424 }
425
426 if ($key == 'propal') {
427 $graph_data = $object->get_nb_propal($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
428 }
429 if ($key == 'orders') {
430 $graph_data = $object->get_nb_order($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
431 }
432 if ($key == 'invoices') {
433 $graph_data = $object->get_nb_vente($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
434 }
435 if ($key == 'proposalssuppliers') {
436 $graph_data = $object->get_nb_propalsupplier($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
437 }
438 if ($key == 'invoicessuppliers') {
439 $graph_data = $object->get_nb_achat($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
440 }
441 if ($key == 'orderssuppliers') {
442 $graph_data = $object->get_nb_ordersupplier($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
443 }
444 if ($key == 'contracts') {
445 $graph_data = $object->get_nb_contract($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
446 }
447 if ($key == 'mrp') {
448 $graph_data = $object->get_nb_mos($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
449 }
450
451 // TODO Save cachefile $graphfiles[$key]['file']
452 }
453
454 if (is_array($graph_data)) {
455 $px->SetData($graph_data);
456 $px->SetYLabel($graphfiles[$key]['label']);
457 $px->SetMaxValue($px->GetCeilMaxValue() < 0 ? 0 : $px->GetCeilMaxValue());
458 $px->SetMinValue($px->GetFloorMinValue() > 0 ? 0 : $px->GetFloorMinValue());
459 $px->setShowLegend(0);
460 $px->SetWidth($WIDTH);
461 $px->SetHeight($HEIGHT);
462 $px->SetHorizTickIncrement(1);
463 $px->SetShading(3);
464 //print 'x '.$key.' '.$graphfiles[$key]['file'];
465
466 $url = DOL_URL_ROOT.'/viewimage.php?modulepart='.$graphfiles[$key]['modulepart'].'&entity='.((int) $object->entity).'&file='.urlencode($graphfiles[$key]['file']).($notab ? '&notab='.$notab : '');
467 $px->draw($dir."/".$graphfiles[$key]['file'], $url);
468
469 $graphfiles[$key]['total'] = $px->total();
470 $graphfiles[$key]['output'] = $px->show();
471 } else {
472 dol_print_error($db, 'Error for calculating graph on key='.$key.' - '.$object->error);
473 }
474 }
475
476 //setEventMessages($langs->trans("ChartGenerated"), null, 'mesgs');
477 }
478 }
479
480 // Show graphs
481 $i = 0;
482 if (count($graphfiles) > 0) {
483 foreach ($graphfiles as $key => $val) {
484 if (!$graphfiles[$key]['file']) {
485 continue;
486 }
487
488 if ($graphfiles == 'propal' && !$user->hasRight('propal', 'lire')) {
489 continue;
490 }
491 if ($graphfiles == 'order' && !$user->hasRight('commande', 'lire')) {
492 continue;
493 }
494 if ($graphfiles == 'invoices' && !$user->hasRight('facture', 'lire')) {
495 continue;
496 }
497 if ($graphfiles == 'proposals_suppliers' && !$user->hasRight('supplier_proposal', 'lire')) {
498 continue;
499 }
500 if ($graphfiles == 'invoices_suppliers' && !$user->hasRight('fournisseur', 'facture', 'lire')) {
501 continue;
502 }
503 if ($graphfiles == 'orders_suppliers' && !$user->hasRight('fournisseur', 'commande', 'lire')) {
504 continue;
505 }
506 if ($graphfiles == 'mrp' && !$user->hasRight('mrp', 'read')) {
507 continue;
508 }
509
510
511 if ($i % 2 == 0) {
512 print "\n".'<div class="fichecenter"><div class="fichehalfleft">'."\n";
513 } else {
514 print "\n".'<div class="fichehalfright">'."\n";
515 }
516
517 // Date generation
518 if ($graphfiles[$key]['output'] && !$px->isGraphKo()) {
519 if (file_exists($dir."/".$graphfiles[$key]['file']) && filemtime($dir."/".$graphfiles[$key]['file'])) {
520 $dategenerated = $langs->trans("GeneratedOn", dol_print_date(filemtime($dir."/".$graphfiles[$key]['file']), "dayhour"));
521 } else {
522 $dategenerated = $langs->trans("GeneratedOn", dol_print_date(dol_now(), "dayhour"));
523 }
524 } else {
525 $dategenerated = ($mesg ? '<span class="error">'.$mesg.'</span>' : $langs->trans("ChartNotGenerated"));
526 }
527 $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) : '').'">';
528 $linktoregenerate .= img_picto($langs->trans("ReCalculate").' ('.$dategenerated.')', 'refresh');
529 $linktoregenerate .= '</a>';
530
531
532 // Show graph
533 print '<div class="div-table-responsive-no-min">';
534 print '<table class="noborder centpercent">';
535 // Label
536 print '<tr class="liste_titre"><td>';
537 print $graphfiles[$key]['label'];
538 print ' <span class="opacitymedium">('.$graphfiles[$key]['total'].')</span></td>';
539 print '<td align="right">'.$linktoregenerate.'</td>';
540 print '</tr>';
541 // Image
542 print '<tr><td colspan="2" class="nohover" align="center">';
543 print $graphfiles[$key]['output'];
544 print '</td></tr>';
545 print '</table>';
546 print '</div>';
547
548 if ($i % 2 == 0) {
549 print "\n".'</div>'."\n";
550 } else {
551 print "\n".'</div></div>';
552 print '<div class="clear"><div class="fichecenter"><br></div></div>'."\n";
553 }
554
555 $i++;
556 }
557 }
558 // div not closed
559 if ($i % 2 == 1) {
560 print "\n".'<div class="fichehalfright">'."\n";
561 print "\n".'</div></div>';
562 print '<div class="clear"><div class="fichecenter"><br></div></div>'."\n";
563 }
564}
565
566if (!($id > 0)) {
567 print dol_get_fiche_end();
568}
569
570// End of page
571llxFooter();
572$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.