';
+ }
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 f7e7106ce45..7ab54181b77 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 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