diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index c337cccc940844007eac384b6c56c24fc5057d0e..5167fcd69f321096714b91b2322d9023bc0f3b3e 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 '<tr><td>'.$langs->trans("Total")."</td>"; - print '<td align="right">'.price($total_opp_amount, 0, '', 1, -1, -1, $conf->currency).'</td>'; - print '<td align="right">'.$form->textwithpicto(price($ponderated_opp_amount, 0, '', 1, -1, -1, $conf->currency), $langs->trans("OpportunityPonderatedAmount"), 1).'</td>'; + if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) + { + print '<td align="right">'.price($total_opp_amount, 0, '', 1, -1, -1, $conf->currency).'</td>'; + print '<td align="right">'.$form->textwithpicto(price($ponderated_opp_amount, 0, '', 1, -1, -1, $conf->currency), $langs->trans("OpportunityPonderatedAmount"), 1).'</td>'; + } if (empty($conf->global->PROJECT_HIDE_TASKS)) print '<td align="right">'.$total_task.'</td>'; $db->free($resql); diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index 0e554c278ced614025070f26d9cbad9138c60595..4daf1bc590fa962f024b81b315441bd757733a4e 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 <b>%s</b> must be a numeric value ErrorFieldMustBeAnInteger=Field <b>%s</b> 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 0aaac7816bd91c03d1dc2efd1842229f7d7f8fb3..dc6cece9c3bc12a5be448becdf8dc612b1cfa8de 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 1281e24358eb0173d002b708a84ab5dea3868003..bbf2326e24db77b28124eef2591500f816892d4b 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 '<tr><td>'.$langs->trans("OpportunityAmount").'</td>'; - print '<td><input size="4" type="text" name="opp_amount" value="'.(isset($_POST['opp_amount'])?GETPOST('opp_amount'):(strcmp($object->opp_amount,'')?price($object->opp_amount):'')).'"></td>'; + print '<td><input size="6" type="text" name="opp_amount" value="'.(isset($_POST['opp_amount'])?GETPOST('opp_amount'):(strcmp($object->opp_amount,'')?price($object->opp_amount):'')).'"></td>'; print '</tr>'; } @@ -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 ae99bb141889ab44fd96f8aa8ae7815b78cef72c..b33305f4558ee035311202610922af3349f761f7 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 cb70773dcd8bfd05de0eb08227e9b15a06e88e28..3ae7bfcb71c2c6676189330c584bc757007e7023 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 "</tr>\n"; @@ -298,7 +302,7 @@ if ($resql) // Sale representative print '<td class="liste_titre"> </td>'; // Start date - if (! empty($conf->global->PROJECT_LIST_SHOW_STARTDATE)) + if (empty($conf->global->PROJECT_LIST_HIDE_STARTDATE)) { print '<td class="liste_titre center">'; if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print '<input class="flat" type="text" size="1" maxlength="2" name="sday" value="'.$sday.'">'; @@ -325,6 +329,8 @@ if ($resql) if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) { print '<td class="liste_titre nowrap">'; + print '</td>'; + print '<td class="liste_titre nowrap">'; print $formproject->selectOpportunityStatus('search_opp_status',$search_opp_status,1,1); print '</td>'; } @@ -417,10 +423,13 @@ if ($resql) print '</td>'; // Date start - print '<td class="center">'; - print dol_print_date($db->jdate($objp->date_start),'day'); - print '</td>'; - + if (empty($conf->global->PROJECT_LIST_HIDE_STARTDATE)) + { + print '<td class="center">'; + print dol_print_date($db->jdate($objp->date_start),'day'); + print '</td>'; + } + // Date end print '<td class="center">'; print dol_print_date($db->jdate($objp->date_end),'day'); @@ -438,6 +447,10 @@ if ($resql) if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) { + print '<td>'; + if ($objp->opp_status_code) print $langs->trans("OppAmount".$objp->opp_amount); + print '</td>'; + print '<td>'; if ($objp->opp_status_code) print $langs->trans("OppStatusShort".$objp->opp_status_code); print '</td>'; diff --git a/htdocs/projet/stats/index.php b/htdocs/projet/stats/index.php index 04dd819054e69fe2c679dcde1d9911577e59965d..a93d23da7bb3bc264402319a044081ec8cd5feb3 100644 --- a/htdocs/projet/stats/index.php +++ b/htdocs/projet/stats/index.php @@ -1,6 +1,6 @@ <?php -/* Lead - * Copyright (C) 2014-2015 Florian HENRY <florian.henry@open-concept.pro> +/* Copyright (C) 2014-2015 Florian HENRY <florian.henry@open-concept.pro> + * Copyright (C) 2015 Laurent Destailleur <ldestailleur@users.sourceforge.net> * * 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