diff --git a/htdocs/admin/project.php b/htdocs/admin/project.php
new file mode 100644
index 00000000000..cd5f324c215
--- /dev/null
+++ b/htdocs/admin/project.php
@@ -0,0 +1,366 @@
+
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * \file htdocs/admin/project.php
+ * \ingroup project
+ * \brief Page d'administration-configuration du module Projet
+ * \version $Id$
+ */
+
+require("./pre.inc.php");
+require_once(DOL_DOCUMENT_ROOT."/lib/admin.lib.php");
+require_once(DOL_DOCUMENT_ROOT.'/project.class.php');
+
+$langs->load("admin");
+$langs->load("other");
+
+if (!$user->admin)
+accessforbidden();
+
+
+/*
+ * Actions
+ */
+
+if ($_POST["action"] == 'updateMask')
+{
+ $maskconstproject=$_POST['maskconstproject'];
+ $maskproject=$_POST['maskproject'];
+ if ($maskconstproject) dolibarr_set_const($db,$maskconstproject,$maskproject,'chaine',0,'',$conf->entity);
+}
+
+if ($_GET["action"] == 'specimen')
+{
+ $modele=$_GET["module"];
+
+ $project = new Project($db);
+ $project->initAsSpecimen();
+
+ // Charge le modele
+ $dir = DOL_DOCUMENT_ROOT . "/includes/modules/project/pdf/";
+ $file = "pdf_".$modele.".modules.php";
+ if (file_exists($dir.$file))
+ {
+ $classname = "pdf_".$modele;
+ require_once($dir.$file);
+
+ $obj = new $classname($db);
+
+ if ($obj->write_file($project,$langs) > 0)
+ {
+ header("Location: ".DOL_URL_ROOT."/document.php?modulepart=project&file=SPECIMEN.pdf");
+ return;
+ }
+ else
+ {
+ $mesg='
'.$obj->error.'
';
+ dol_syslog($obj->error, LOG_ERR);
+ }
+ }
+ else
+ {
+ $mesg=''.$langs->trans("ErrorModuleNotFound").'
';
+ dol_syslog($langs->trans("ErrorModuleNotFound"), LOG_ERR);
+ }
+}
+
+if ($_GET["action"] == 'set')
+{
+ $type='project';
+ $sql = "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES ('".$_GET["value"]."','".$type."',".$conf->entity.")";
+ if ($db->query($sql))
+ {
+
+ }
+}
+
+if ($_GET["action"] == 'del')
+{
+ $type='project';
+ $sql = "DELETE FROM ".MAIN_DB_PREFIX."document_model";
+ $sql.= " WHERE nom = '".$_GET["value"];
+ $sql.= " AND type = '".$type."'";
+ $sql.= " AND entity = ".$conf->entity;
+ if ($db->query($sql))
+ {
+
+ }
+}
+
+if ($_GET["action"] == 'setdoc')
+{
+ $db->begin();
+
+ if (dolibarr_set_const($db, "PROJECT_ADDON_PDF",$_GET["value"],'chaine',0,'',$conf->entity))
+ {
+ $conf->global->PROJECT_ADDON_PDF = $_GET["value"];
+ }
+
+ // On active le modele
+ $type='project';
+ $sql_del = "DELETE FROM ".MAIN_DB_PREFIX."document_model";
+ $sql_del.= " WHERE nom = '".$_GET["value"];
+ $sql_del.= " AND type = '".$type."'";
+ $sql_del.= " AND entity = ".$conf->entity;
+ $result1=$db->query($sql_del);
+ $sql = "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom,type,entity) VALUES ('".$_GET["value"]."','".$type."',".$conf->entity.")";
+ $result2=$db->query($sql);
+ if ($result1 && $result2)
+ {
+ $db->commit();
+ }
+ else
+ {
+ $db->rollback();
+ }
+}
+
+if ($_GET["action"] == 'setmod')
+{
+ // \todo Verifier si module numerotation choisi peut etre active
+ // par appel methode canBeActivated
+
+ dolibarr_set_const($db, "PROJECT_ADDON",$_GET["value"],'chaine',0,'',$conf->entity);
+}
+
+/*
+ * View
+ */
+
+$html=new Form($db);
+
+llxHeader();
+
+$linkback=''.$langs->trans("BackToModuleList").'';
+print_fiche_titre($langs->trans("ProjectsSetup"),$linkback,'setup');
+
+print "
";
+
+
+// Project numbering module
+
+$dir = DOL_DOCUMENT_ROOT."/includes/modules/project/";
+
+print_titre($langs->trans("ProjectsNumberingModules"));
+
+print '';
+print '';
+print '| '.$langs->trans("Name").' | ';
+print ''.$langs->trans("Description").' | ';
+print ''.$langs->trans("Example").' | ';
+print ''.$langs->trans("Activated").' | ';
+print ''.$langs->trans("Info").' | ';
+print "
\n";
+
+clearstatcache();
+
+$handle = opendir($dir);
+if ($handle)
+{
+ $var=true;
+
+ while (($file = readdir($handle))!==false)
+ {
+ if (substr($file, 0, 25) == 'mod_project_' && substr($file, strlen($file)-3, 3) == 'php')
+ {
+ $file = substr($file, 0, strlen($file)-4);
+
+ require_once(DOL_DOCUMENT_ROOT ."/includes/modules/project/".$file.".php");
+
+ $module = new $file;
+
+ if ($module->isEnabled())
+ {
+ // Show modules according to features level
+ if ($module->version == 'development' && $conf->global->MAIN_FEATURES_LEVEL < 2) continue;
+ if ($module->version == 'experimental' && $conf->global->MAIN_FEATURES_LEVEL < 1) continue;
+
+ $var=!$var;
+ print '| '.$module->nom." | \n";
+ print $module->info();
+ print ' | ';
+
+ // Examples
+ print ''.$module->getExample()." | \n";
+
+ print '';
+ if ($conf->global->PROJECT_ADDON == "$file")
+ {
+ print img_tick($langs->trans("Activated"));
+ }
+ else
+ {
+ print ''.$langs->trans("Activate").'';
+ }
+ print ' | ';
+
+ $project=new Project($db);
+ $project->initAsSpecimen();
+
+ // Info
+ $htmltooltip='';
+ $htmltooltip.=''.$langs->trans("Version").': '.$module->getVersion().'
';
+ $nextval=$module->getNextValue($mysoc,$project);
+ if ("$nextval" != $langs->trans("NotAvailable")) // Keep " on nextval
+ {
+ $htmltooltip.=''.$langs->trans("NextValue").': ';
+ if ($nextval)
+ {
+ $htmltooltip.=$nextval.'
';
+ }
+ else
+ {
+ $htmltooltip.=$langs->trans($module->error).'
';
+ }
+ }
+
+ print '';
+ print $html->textwithpicto('',$htmltooltip,1,0);
+ print ' | ';
+
+ print '
';
+ }
+ }
+ }
+ closedir($handle);
+}
+
+print '
';
+
+
+/*
+ * Modeles documents for projects
+ */
+
+$dir = DOL_DOCUMENT_ROOT.'/includes/modules/project/pdf/';
+
+print_titre($langs->trans("ProjectsModelModule"));
+
+// Defini tableau def de modele
+$type='project';
+$def = array();
+
+$sql = "SELECT nom";
+$sql.= " FROM ".MAIN_DB_PREFIX."document_model";
+$sql.= " WHERE type = '".$type."'";
+$sql.= " AND entity = ".$conf->entity;
+
+$resql=$db->query($sql);
+if ($resql)
+{
+ $i = 0;
+ $num_rows=$db->num_rows($resql);
+ while ($i < $num_rows)
+ {
+ $array = $db->fetch_array($resql);
+ array_push($def, $array[0]);
+ $i++;
+ }
+}
+else
+{
+ dol_print_error($db);
+}
+
+print "\n";
+print "\n";
+print ' | '.$langs->trans("Name")." | \n";
+print " ".$langs->trans("Description")." | \n";
+print ''.$langs->trans("Activated")." | \n";
+print ''.$langs->trans("Default")." | \n";
+print ''.$langs->trans("Info").' | ';
+print "
\n";
+
+clearstatcache();
+
+$handle=opendir($dir);
+
+$var=true;
+while (($file = readdir($handle))!==false)
+{
+ if (preg_match('/\.modules\.php$/i',$file) && substr($file,0,4) == 'pdf_')
+ {
+ $name = substr($file, 4, strlen($file) -16);
+ $classname = substr($file, 0, strlen($file) -12);
+
+ $var=!$var;
+ print "\n | $name";
+ print " | \n \n";
+ require_once($dir.$file);
+ $module = new $classname($db);
+ print $module->description;
+ print " | \n";
+
+ // Active
+ if (in_array($name, $def))
+ {
+ print "\n";
+ if ($conf->global->PROJECT_ADDON_PDF != "$name")
+ {
+ print '';
+ print img_tick($langs->trans("Disable"));
+ print '';
+ }
+ else
+ {
+ print img_tick($langs->trans("Enabled"));
+ }
+ print " | ";
+ }
+ else
+ {
+ print "\n";
+ print ''.$langs->trans("Activate").'';
+ print " | ";
+ }
+
+ // Defaut
+ print "";
+ if ($conf->global->PROJECT_ADDON_PDF == "$name")
+ {
+ print img_tick($langs->trans("Default"));
+ }
+ else
+ {
+ print ''.$langs->trans("Default").'';
+ }
+ print ' | ';
+
+ // Info
+ $htmltooltip = ''.$langs->trans("Name").': '.$module->name;
+ $htmltooltip.='
'.$langs->trans("Type").': '.($module->type?$module->type:$langs->trans("Unknown"));
+ $htmltooltip.='
'.$langs->trans("Width").'/'.$langs->trans("Height").': '.$module->page_largeur.'/'.$module->page_hauteur;
+ $htmltooltip.='
'.$langs->trans("FeaturesSupported").':';
+ $htmltooltip.='
'.$langs->trans("Logo").': '.yn($module->option_logo,1,1);
+ print '';
+ print $html->textwithpicto('',$htmltooltip,1,0);
+ print ' | ';
+ print '';
+ print ''.img_object($langs->trans("Preview"),'order').'';
+ print ' | ';
+
+ print "
\n";
+ }
+}
+closedir($handle);
+
+print '
';
+
+llxFooter('$Date$ - $Revision$');
+?>
diff --git a/htdocs/includes/modules/modProjet.class.php b/htdocs/includes/modules/modProjet.class.php
index 81fad4c666a..6254023e7dd 100644
--- a/htdocs/includes/modules/modProjet.class.php
+++ b/htdocs/includes/modules/modProjet.class.php
@@ -58,6 +58,7 @@ class modProjet extends DolibarrModules
$this->const_name = 'MAIN_MODULE_'.strtoupper($this->name);
$this->special = 0;
+ $this->config_page_url = array("project.php");
$this->picto='project';
// Data directories to create when module is enabled
diff --git a/htdocs/project.class.php b/htdocs/project.class.php
index dfdfe9cf6bd..dd632dd4797 100644
--- a/htdocs/project.class.php
+++ b/htdocs/project.class.php
@@ -1,7 +1,7 @@
* Copyright (C) 2005-2008 Laurent Destailleur
- * Copyright (C) 2005-2009 Regis Houssin
+ * Copyright (C) 2005-2010 Regis Houssin
*
* 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
@@ -758,5 +758,90 @@ class Project extends CommonObject
if ($withpicto != 2) $result.=$lien.$this->ref.$lienfin;
return $result;
}
+
+ /**
+ * \brief Initialise object with default value to be used as example
+ */
+ function initAsSpecimen()
+ {
+ global $user,$langs,$conf;
+
+ // Charge tableau des id de societe socids
+ $socids = array();
+ $sql = "SELECT rowid";
+ $sql.= " FROM ".MAIN_DB_PREFIX."societe";
+ $sql.= " WHERE client IN (1, 3)";
+ $sql.= " AND entity = ".$conf->entity;
+ $sql.= " LIMIT 10";
+ $resql = $this->db->query($sql);
+ if ($resql)
+ {
+ $num_socs = $this->db->num_rows($resql);
+ $i = 0;
+ while ($i < $num_socs)
+ {
+ $i++;
+
+ $row = $this->db->fetch_row($resql);
+ $socids[$i] = $row[0];
+ }
+ }
+
+ // Charge tableau des produits prodids
+ $prodids = array();
+ $sql = "SELECT rowid";
+ $sql.= " FROM ".MAIN_DB_PREFIX."product";
+ $sql.= " WHERE envente = 1";
+ $sql.= " AND entity = ".$conf->entity;
+ $resql = $this->db->query($sql);
+ if ($resql)
+ {
+ $num_prods = $this->db->num_rows($resql);
+ $i = 0;
+ while ($i < $num_prods)
+ {
+ $i++;
+ $row = $this->db->fetch_row($resql);
+ $prodids[$i] = $row[0];
+ }
+ }
+
+ // Initialise parametres
+ $this->id=0;
+ $this->ref = 'SPECIMEN';
+ $this->ref_client='NEMICEPS';
+ $this->specimen=1;
+ $socid = rand(1, $num_socs);
+ $this->socid = $socids[$socid];
+ $this->date = time();
+ $this->fin_validite = $this->date+3600*24*30;
+ $this->cond_reglement_code = 'RECEP';
+ $this->mode_reglement_code = 'CHQ';
+ $this->note_public='SPECIMEN';
+ $nbp = rand(1, 9);
+ $xnbp = 0;
+ while ($xnbp < $nbp)
+ {
+ $ligne=new PropaleLigne($this->db);
+ $ligne->desc=$langs->trans("Description")." ".$xnbp;
+ $ligne->qty=1;
+ $ligne->subprice=100;
+ $ligne->price=100;
+ $ligne->tva_tx=19.6;
+ $ligne->total_ht=100;
+ $ligne->total_ttc=119.6;
+ $ligne->total_tva=19.6;
+ $prodid = rand(1, $num_prods);
+ $ligne->produit_id=$prodids[$prodid];
+ $this->lignes[$xnbp]=$ligne;
+ $xnbp++;
+ }
+
+ $this->amount_ht = $xnbp*100;
+ $this->total_ht = $xnbp*100;
+ $this->total_tva = $xnbp*19.6;
+ $this->total_ttc = $xnbp*119.6;
+ }
+
}
?>