From 8d7766776475627e002a961d24dbf0eaf8d2a480 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 Jul 2015 10:42:42 +0200 Subject: [PATCH] Bad stat report --- htdocs/core/lib/project.lib.php | 7 +++-- htdocs/langs/en_US/errors.lang | 1 + htdocs/langs/en_US/projects.lang | 2 ++ htdocs/projet/card.php | 9 ++++-- htdocs/projet/class/projectstats.class.php | 34 +++++++++++++++------- htdocs/projet/list.php | 27 ++++++++++++----- htdocs/projet/stats/index.php | 4 +-- 7 files changed, 60 insertions(+), 24 deletions(-) diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index c337cccc940..5167fcd69f3 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -1004,8 +1004,11 @@ function print_projecttasks_array($db, $form, $socid, $projectsListId, $mytasks= } print ''.$langs->trans("Total").""; - print ''.price($total_opp_amount, 0, '', 1, -1, -1, $conf->currency).''; - print ''.$form->textwithpicto(price($ponderated_opp_amount, 0, '', 1, -1, -1, $conf->currency), $langs->trans("OpportunityPonderatedAmount"), 1).''; + if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) + { + print ''.price($total_opp_amount, 0, '', 1, -1, -1, $conf->currency).''; + print ''.$form->textwithpicto(price($ponderated_opp_amount, 0, '', 1, -1, -1, $conf->currency), $langs->trans("OpportunityPonderatedAmount"), 1).''; + } if (empty($conf->global->PROJECT_HIDE_TASKS)) print ''.$total_task.''; $db->free($resql); diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index 0e554c278ce..4daf1bc590f 100755 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -171,6 +171,7 @@ ErrorGlobalVariableUpdater5=No global variable selected ErrorFieldMustBeANumeric=Field %s must be a numeric value ErrorFieldMustBeAnInteger=Field %s must be an integer ErrorMandatoryParametersNotProvided=Mandatory parameter(s) not provided +ErrorOppStatusRequiredIfAmount=Vous avez renseigné un montant estimé de l'opportunité. Dans ce cas, il faut aussi renseigner le statut d'opportunité # Warnings WarningMandatorySetupNotComplete=Mandatory setup parameters are not yet defined diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index 0aaac7816bd..dc6cece9c3b 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -127,7 +127,9 @@ TaskCreatedInDolibarr=Task %s created TaskModifiedInDolibarr=Task %s modified TaskDeletedInDolibarr=Task %s deleted OpportunityStatus=Opportunity status +OpportunityStatusShort=Opp. status OpportunityAmount=Opportunity amount +OpportunityAmountShort=Opp. amount ##### Types de contacts ##### TypeContact_project_internal_PROJECTLEADER=Project leader TypeContact_project_external_PROJECTLEADER=Project leader diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index 1281e24358e..bbf2326e24d 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -238,6 +238,12 @@ if (empty($reshook)) if ($ret < 0) $error++; } + if ($object->opp_amount && ($object->opp_status <= 0)) + { + $error++; + setEventMessage($langs->trans("ErrorOppStatusRequiredIfAmount"),'errors'); + } + if (! $error) { $result=$object->update($user); @@ -658,7 +664,7 @@ else // Opportunity amount print ''.$langs->trans("OpportunityAmount").''; - print ''; + print ''; print ''; } @@ -899,7 +905,6 @@ else // Hook to add more things on page $parameters=array(); $reshook=$hookmanager->executeHooks('mainCardTabAddMore',$parameters,$object,$action); // Note that $action and $object may have been modified by hook - } llxFooter(); diff --git a/htdocs/projet/class/projectstats.class.php b/htdocs/projet/class/projectstats.class.php index ae99bb14188..b33305f4558 100644 --- a/htdocs/projet/class/projectstats.class.php +++ b/htdocs/projet/class/projectstats.class.php @@ -19,6 +19,9 @@ include_once DOL_DOCUMENT_ROOT . '/core/class/stats.class.php'; include_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php'; +/** + * Class to manage statistics on projects + */ class ProjectStats extends Stats { protected $db; @@ -26,13 +29,14 @@ class ProjectStats extends Stats public $userid; public $socid; public $year; - function __construct($db) { + + function __construct($db) + { global $conf, $user; $this->db = $db; require_once 'project.class.php'; - $this->project = new Project($this->db); } @@ -113,11 +117,15 @@ class ProjectStats extends Stats return $this->_getAllByYear($sql); } + + /** - * + * Build the where part + * * @return string */ - public function buildWhere() { + public function buildWhere() + { $sqlwhere_str = ''; $sqlwhere = array(); @@ -148,7 +156,8 @@ class ProjectStats extends Stats * @param int $year scan * @return array of values */ - function getNbByMonth($year) { + function getNbByMonth($year) + { global $user; $this->yearmonth = $year; @@ -174,7 +183,8 @@ class ProjectStats extends Stats * @param int $year scan * @return array with amount by month */ - function getAmountByMonth($year) { + function getAmountByMonth($year) + { global $user; $this->yearmonth = $year; @@ -289,18 +299,19 @@ class ProjectStats extends Stats /** - * Return the Project amount by month for a year + * Return the Project weighted opp amount by month for a year * * @param int $year scan * @return array with amount by month */ - function getWeightedAmountByMonth($year) { + function getWeightedAmountByMonth($year) + { global $user; $this->yearmonth = $year; - $sql = "SELECT date_format(t.datec,'%m') as dm, SUM(t.opp_amount)"; - $sql .= " FROM " . MAIN_DB_PREFIX . "projet as t"; + $sql = "SELECT date_format(t.datec,'%m') as dm, SUM(t.opp_amount * ".$this->db->ifsql('cls.percent IS NULL', '0', 'cls.percent')." / 100)"; + $sql .= " FROM " . MAIN_DB_PREFIX . "projet as t LEFT JOIN ".MAIN_DB_PREFIX.'c_lead_status as cls ON t.fk_opp_status = cls.rowid'; if (! $user->rights->societe->client->voir && ! $user->societe_id) $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "societe_commerciaux as sc ON sc.fk_soc=t.fk_soc AND sc.fk_user=" . $user->id; $sql .= $this->buildWhere(); @@ -401,7 +412,8 @@ class ProjectStats extends Stats * @param int $year scan * @return array with amount by month */ - function getTransformRateByMonth($year) { + function getTransformRateByMonth($year) + { global $user; $this->yearmonth = $year; diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index cb70773dcd8..3ae7bfcb71c 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -274,13 +274,17 @@ if ($resql) print_liste_field_titre($langs->trans("Label"),$_SERVER["PHP_SELF"],"p.title","",$param,"",$sortfield,$sortorder); print_liste_field_titre($langs->trans("ThirdParty"),$_SERVER["PHP_SELF"],"s.nom","",$param,"",$sortfield,$sortorder); print_liste_field_titre($langs->trans("SalesRepresentative"),$_SERVER["PHP_SELF"],"","",$param,"",$sortfield,$sortorder); - if (! empty($conf->global->PROJECT_LIST_SHOW_STARTDATE)) print_liste_field_titre($langs->trans("DateStart"),$_SERVER["PHP_SELF"],"p.dateo","",$param,'align="center"',$sortfield,$sortorder); + if (empty($conf->global->PROJECT_LIST_HIDE_STARTDATE)) print_liste_field_titre($langs->trans("DateStart"),$_SERVER["PHP_SELF"],"p.dateo","",$param,'align="center"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("DateEnd"),$_SERVER["PHP_SELF"],"p.datee","",$param,'align="center"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Visibility"),$_SERVER["PHP_SELF"],"p.public","",$param,"",$sortfield,$sortorder); + if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) + { + print_liste_field_titre($langs->trans("OpportunityAmountShort"),$_SERVER["PHP_SELF"],'p.opp_amount',"",$param,'',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("OpportunityStatusShort"),$_SERVER["PHP_SELF"],'p.fk_opp_status',"",$param,'',$sortfield,$sortorder); + } $parameters=array(); $reshook=$hookmanager->executeHooks('printFieldListTitle',$parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; - if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) print_liste_field_titre($langs->trans("OpportunityStatus"),$_SERVER["PHP_SELF"],'p.fk_opp_status',"",$param,'',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Status"),$_SERVER["PHP_SELF"],'p.fk_statut',"",$param,'align="right"',$sortfield,$sortorder); print_liste_field_titre('',$_SERVER["PHP_SELF"],"",'','','',$sortfield,$sortorder,'maxwidthsearch '); print "\n"; @@ -298,7 +302,7 @@ if ($resql) // Sale representative print ' '; // Start date - if (! empty($conf->global->PROJECT_LIST_SHOW_STARTDATE)) + if (empty($conf->global->PROJECT_LIST_HIDE_STARTDATE)) { print ''; if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; @@ -325,6 +329,8 @@ if ($resql) if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) { print ''; + print ''; + print ''; print $formproject->selectOpportunityStatus('search_opp_status',$search_opp_status,1,1); print ''; } @@ -417,10 +423,13 @@ if ($resql) print ''; // Date start - print ''; - print dol_print_date($db->jdate($objp->date_start),'day'); - print ''; - + if (empty($conf->global->PROJECT_LIST_HIDE_STARTDATE)) + { + print ''; + print dol_print_date($db->jdate($objp->date_start),'day'); + print ''; + } + // Date end print ''; print dol_print_date($db->jdate($objp->date_end),'day'); @@ -438,6 +447,10 @@ if ($resql) if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) { + print ''; + if ($objp->opp_status_code) print $langs->trans("OppAmount".$objp->opp_amount); + print ''; + print ''; if ($objp->opp_status_code) print $langs->trans("OppStatusShort".$objp->opp_status_code); print ''; diff --git a/htdocs/projet/stats/index.php b/htdocs/projet/stats/index.php index 04dd819054e..a93d23da7bb 100644 --- a/htdocs/projet/stats/index.php +++ b/htdocs/projet/stats/index.php @@ -1,6 +1,6 @@ +/* Copyright (C) 2014-2015 Florian HENRY + * Copyright (C) 2015 Laurent Destailleur * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by