From f233d4f6109d52be45dd446ee526cb8c4ff75f9a Mon Sep 17 00:00:00 2001
From: Regis Houssin <regis.houssin@capnetworks.com>
Date: Sun, 28 Sep 2014 20:39:02 +0200
Subject: [PATCH] New: add doc models management in contract module

---
 htdocs/admin/contract.php                     |  35 +++-
 htdocs/contrat/card.php                       | 155 ++++++++++--------
 htdocs/contrat/class/contrat.class.php        |  36 +++-
 htdocs/core/class/html.formfile.class.php     |   9 +
 .../install/mysql/migration/3.6.0-3.7.0.sql   |   2 +
 htdocs/install/mysql/tables/llx_contrat.sql   |   3 +-
 6 files changed, 165 insertions(+), 75 deletions(-)

diff --git a/htdocs/admin/contract.php b/htdocs/admin/contract.php
index 4c3ee7207df..2abb2b5acad 100644
--- a/htdocs/admin/contract.php
+++ b/htdocs/admin/contract.php
@@ -35,8 +35,9 @@ if (!$user->admin) accessforbidden();
 
 $action = GETPOST('action','alpha');
 $value = GETPOST('value','alpha');
+$label = GETPOST('label','alpha');
 $scandir = GETPOST('scandir','alpha');
-$type='contrat';
+$type='contract';
 
 if (empty($conf->global->CONTRACT_ADDON))
 {
@@ -111,6 +112,35 @@ else if ($action == 'specimen') // For contract
 	}
 }
 
+// Define constants for submodules that contains parameters (forms with param1, param2, ... and value1, value2, ...)
+if ($action == 'setModuleOptions')
+{
+	$post_size=count($_POST);
+
+	$db->begin();
+
+	for($i=0;$i < $post_size;$i++)
+	{
+		if (array_key_exists('param'.$i,$_POST))
+		{
+			$param=GETPOST("param".$i,'alpha');
+			$value=GETPOST("value".$i,'alpha');
+			if ($param) $res = dolibarr_set_const($db,$param,$value,'chaine',0,'',$conf->entity);
+			if (! $res > 0) $error++;
+		}
+	}
+	if (! $error)
+	{
+		$db->commit();
+		setEventMessage($langs->trans("SetupSaved"));
+	}
+	else
+	{
+		$db->rollback();
+        setEventMessage($langs->trans("Error"),'errors');
+	}
+}
+
 // Activate a model
 else if ($action == 'set')
 {
@@ -192,7 +222,7 @@ else if ($action == 'set_CONTRACT_DRAFT_WATERMARK')
  */
 
 $dirmodels=array_merge(array('/'),(array) $conf->modules_parts['models']);
- 
+
 llxHeader();
 
 $form=new Form($db);
@@ -318,7 +348,6 @@ print '</table><br>';
 print_titre($langs->trans("TemplatePDFContracts"));
 
 // Defini tableau def des modeles
-$type='contrat';
 $def = array();
 $sql = "SELECT nom";
 $sql.= " FROM ".MAIN_DB_PREFIX."document_model";
diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php
index 5cb25a5bed4..c4596c96a76 100644
--- a/htdocs/contrat/card.php
+++ b/htdocs/contrat/card.php
@@ -1,7 +1,7 @@
 <?php
 /* Copyright (C) 2003-2004	Rodolphe Quiedeville	<rodolphe@quiedeville.org>
  * Copyright (C) 2004-2012	Laurent Destailleur		<eldy@users.sourceforge.net>
- * Copyright (C) 2005-2012	Regis Houssin			<regis.houssin@capnetworks.com>
+ * Copyright (C) 2005-2014	Regis Houssin			<regis.houssin@capnetworks.com>
  * Copyright (C) 2006		Andre Cianfarani		<acianfa@free.fr>
  * Copyright (C) 2010-2014	Juanjo Menent			<jmenent@2byte.es>
  * Copyright (C) 2013       Christophe Battarel     <christophe.battarel@altairis.fr>
@@ -29,17 +29,18 @@
  */
 
 require ("../main.inc.php");
-require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
-require_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
-require_once DOL_DOCUMENT_ROOT.'/core/lib/contract.lib.php';
-require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';
-require_once DOL_DOCUMENT_ROOT.'/core/modules/contract/modules_contract.php';
-require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
-if (! empty($conf->produit->enabled) || ! empty($conf->service->enabled))  require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
-if (! empty($conf->propal->enabled))  require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
+require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php';
+require_once DOL_DOCUMENT_ROOT . '/core/lib/price.lib.php';
+require_once DOL_DOCUMENT_ROOT . '/core/lib/contract.lib.php';
+require_once DOL_DOCUMENT_ROOT . '/contrat/class/contrat.class.php';
+require_once DOL_DOCUMENT_ROOT . '/core/modules/contract/modules_contract.php';
+require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php';
+require_once DOL_DOCUMENT_ROOT . '/core/class/html.formfile.class.php';
+if (! empty($conf->produit->enabled) || ! empty($conf->service->enabled))  require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php';
+if (! empty($conf->propal->enabled))  require_once DOL_DOCUMENT_ROOT . '/comm/propal/class/propal.class.php';
 if (! empty($conf->projet->enabled)) {
-	require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
-	require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
+	require_once DOL_DOCUMENT_ROOT . '/projet/class/project.class.php';
+	require_once DOL_DOCUMENT_ROOT . '/core/class/html.formprojet.class.php';
 }
 require_once DOL_DOCUMENT_ROOT . '/core/class/extrafields.class.php';
 
@@ -70,6 +71,15 @@ $hookmanager->initHooks(array('contractcard'));
 $object = new Contrat($db);
 $extrafields = new ExtraFields($db);
 
+// Load object
+if ($id > 0 || ! empty($ref)) {
+	$ret = $object->fetch($id, $ref);
+	if ($ret > 0)
+		$ret = $object->fetch_thirdparty();
+	if ($ret < 0)
+		dol_print_error('', $object->error);
+}
+
 // fetch optionals attributes and labels
 $extralabels = $extrafields->fetch_name_optionals_label($object->table_element);
 
@@ -84,7 +94,6 @@ include DOL_DOCUMENT_ROOT.'/core/actions_setnotes.inc.php';	// Must be include,
 
 if ($action == 'confirm_active' && $confirm == 'yes' && $user->rights->contrat->activer)
 {
-    $object->fetch($id);
     $result = $object->active_line($user, GETPOST('ligne'), GETPOST('date'), GETPOST('dateend'), GETPOST('comment'));
 
     if ($result > 0)
@@ -106,7 +115,6 @@ else if ($action == 'confirm_closeline' && $confirm == 'yes' && $user->rights->c
 	}
 	if (! $error)
 	{
-	    $object->fetch($id);
 	    $result = $object->close_line($user, GETPOST('ligne'), GETPOST('dateend'), urldecode(GETPOST('comment')));
 	    if ($result > 0)
 	    {
@@ -363,7 +371,6 @@ if ($action == 'add' && $user->rights->contrat->creer)
 
 else if ($action == 'classin' && $user->rights->contrat->creer)
 {
-    $object->fetch($id);
     $object->setProject(GETPOST('projectid'));
 }
 
@@ -402,14 +409,6 @@ else if ($action == 'addline' && $user->rights->contrat->creer)
 
     if (! $error)
     {
-        $ret=$object->fetch($id);
-        if ($ret < 0)
-        {
-        	setEventMessage($object->error,'errors');
-            exit;
-        }
-        $ret=$object->fetch_thirdparty();
-
 		// Clean parameters
 		$date_start=dol_mktime(GETPOST('date_start'.$predef.'hour'), GETPOST('date_start'.$predef.'min'), GETPOST('date_start'.$predef.'sec'), GETPOST('date_start'.$predef.'month'), GETPOST('date_start'.$predef.'day'), GETPOST('date_start'.$predef.'year'));
 		$date_end=dol_mktime(GETPOST('date_end'.$predef.'hour'), GETPOST('date_end'.$predef.'min'), GETPOST('date_end'.$predef.'sec'), GETPOST('date_end'.$predef.'month'), GETPOST('date_end'.$predef.'day'), GETPOST('date_end'.$predef.'year'));
@@ -584,14 +583,6 @@ else if ($action == 'addline' && $user->rights->contrat->creer)
 
 else if ($action == 'updateligne' && $user->rights->contrat->creer && ! GETPOST('cancel'))
 {
-	$ret=$object->fetch($id);
-	if ($ret < 0)
-	{
-		dol_print_error($db,$object->error);
-		exit;
-	}
-
-	$object->fetch_thirdparty();
     $objectline = new ContratLigne($db);
     if ($objectline->fetch(GETPOST('elrowid')))
     {
@@ -647,7 +638,6 @@ else if ($action == 'updateligne' && $user->rights->contrat->creer && ! GETPOST(
 
 else if ($action == 'confirm_deleteline' && $confirm == 'yes' && $user->rights->contrat->creer)
 {
-    $object->fetch($id);
     $result = $object->deleteline(GETPOST('lineid'),$user);
 
     if ($result >= 0)
@@ -663,21 +653,17 @@ else if ($action == 'confirm_deleteline' && $confirm == 'yes' && $user->rights->
 
 else if ($action == 'confirm_valid' && $confirm == 'yes' && $user->rights->contrat->creer)
 {
-    $object->fetch($id);
     $result = $object->validate($user);
 }
 
 // Close all lines
 else if ($action == 'confirm_close' && $confirm == 'yes' && $user->rights->contrat->creer)
 {
-    $object->fetch($id);
     $result = $object->cloture($user);
 }
 
 else if ($action == 'confirm_delete' && $confirm == 'yes' && $user->rights->contrat->supprimer)
 {
-	$object->fetch($id);
-	$object->fetch_thirdparty();
 	$result=$object->delete($user);
 	if ($result >= 0)
 	{
@@ -714,7 +700,6 @@ else if ($action == 'confirm_move' && $confirm == 'yes' && $user->rights->contra
 	}
 } else if ($action == 'update_extras') {
 	// Fill array 'array_options' with data from update form
-	$object->fetch($id);
 	$extralabels = $extrafields->fetch_name_optionals_label($object->table_element);
 	$ret = $extrafields->setOptionalsFromPost($extralabels, $object, GETPOST('attribute'));
 	if ($ret < 0)
@@ -734,10 +719,6 @@ else if ($action == 'confirm_move' && $confirm == 'yes' && $user->rights->contra
 		setEventMessage($object->error,'errors');
 	}
 } elseif ($action=='setref_customer') {
-	$result = $object->fetch($id);
-	if ($result < 0) {
-		setEventMessage($object->errors,'errors');
-	}
 	$object->ref_customer=GETPOST('ref_customer','alpha');
 
 	$result = $object->update($user);
@@ -749,10 +730,6 @@ else if ($action == 'confirm_move' && $confirm == 'yes' && $user->rights->contra
 		exit;
 	}
 } elseif ($action=='setref') {
-	$result = $object->fetch($id);
-	if ($result < 0) {
-		setEventMessage($object->errors,'errors');
-	}
 	$object->ref=GETPOST('ref','alpha');
 
 	$result = $object->update($user);
@@ -765,17 +742,53 @@ else if ($action == 'confirm_move' && $confirm == 'yes' && $user->rights->contra
 	}
 }
 
+// Generation doc (depuis lien ou depuis cartouche doc)
+else if ($action == 'builddoc' && $user->rights->contrat->creer) {
+	if (GETPOST('model')) {
+		$object->setDocModel($user, GETPOST('model'));
+	}
+
+	// Define output language
+	$outputlangs = $langs;
+	if (! empty($conf->global->MAIN_MULTILANGS)) {
+		$outputlangs = new Translate("", $conf);
+		$newlang = (GETPOST('lang_id') ? GETPOST('lang_id') : $object->thirdparty->default_lang);
+		$outputlangs->setDefaultLang($newlang);
+	}
+	$ret = $object->fetch($id); // Reload to get new records
+	$result = $object->generateDocument($object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
+
+	if ($result <= 0) {
+		dol_print_error($db, $result);
+		exit();
+	} else {
+		header('Location: ' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . (empty($conf->global->MAIN_JUMP_TAG) ? '' : '#builddoc'));
+		exit();
+	}
+}
+
+// Remove file in doc form
+else if ($action == 'remove_file' && $user->rights->contrat->creer) {
+	if ($object->id > 0) {
+		require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php';
+
+		$langs->load("other");
+		$upload_dir = $conf->contrat->dir_output;
+		$file = $upload_dir . '/' . GETPOST('file');
+		$ret = dol_delete_file($file, 0, 0, 0, $object);
+		if ($ret)
+			setEventMessage($langs->trans("FileWasRemoved", GETPOST('file')));
+		else
+			setEventMessage($langs->trans("ErrorFailToDeleteFile", GETPOST('file')), 'errors');
+	}
+}
+
 if (! empty($conf->global->MAIN_DISABLE_CONTACTS_TAB) && $user->rights->contrat->creer)
 {
 	if ($action == 'addcontact')
 	{
-		$result = $object->fetch($id);
-
-		if ($result > 0 && $id > 0)
-		{
-			$contactid = (GETPOST('userid') ? GETPOST('userid') : GETPOST('contactid'));
-			$result = $object->add_contact($contactid, GETPOST('type'), GETPOST('source'));
-		}
+		$contactid = (GETPOST('userid') ? GETPOST('userid') : GETPOST('contactid'));
+		$result = $object->add_contact($contactid, GETPOST('type'), GETPOST('source'));
 
 		if ($result >= 0)
 		{
@@ -799,20 +812,12 @@ if (! empty($conf->global->MAIN_DISABLE_CONTACTS_TAB) && $user->rights->contrat-
 	// bascule du statut d'un contact
 	else if ($action == 'swapstatut')
 	{
-		if ($object->fetch($id))
-		{
-			$result=$object->swapContactStatus(GETPOST('ligne'));
-		}
-		else
-		{
-			setEventMessage($object->error,'errors');
-		}
+		$result=$object->swapContactStatus(GETPOST('ligne'));
 	}
 
 	// Efface un contact
 	else if ($action == 'deletecontact')
 	{
-		$object->fetch($id);
 		$result = $object->delete_contact(GETPOST('lineid'));
 
 		if ($result >= 0)
@@ -834,6 +839,7 @@ if (! empty($conf->global->MAIN_DISABLE_CONTACTS_TAB) && $user->rights->contrat-
 llxHeader('',$langs->trans("ContractCard"),"Contrat");
 
 $form = new Form($db);
+$formfile = new FormFile($db);
 
 $objectlignestatic=new ContratLigne($db);
 
@@ -1032,14 +1038,10 @@ else
 {
     $now=dol_now();
 
-    if ($id > 0 || ! empty($ref))
+    if ($object->id > 0)
     {
-        $result=$object->fetch($id,$ref);
-        if ($result < 0) dol_print_error($db,$object->error);
         $result=$object->fetch_lines();	// This also init $this->nbofserviceswait, $this->nbofservicesopened, $this->nbofservicesexpired=, $this->nbofservicesclosed
         if ($result < 0) dol_print_error($db,$object->error);
-        $result=$object->fetch_thirdparty();
-        if ($result < 0) dol_print_error($db,$object->error);
 
         $nbofservices=count($object->lines);
 
@@ -1793,16 +1795,29 @@ else
             print "</div>";
         }
 
+        print '<div class="fichecenter"><div class="fichehalfleft">';
 
-        print '<table width="100%"><tr><td width="50%" valign="top">';
+        /*
+         * Documents generes
+        */
+        $filename = dol_sanitizeFileName($object->ref);
+        $filedir = $conf->contrat->dir_output . "/" . dol_sanitizeFileName($object->ref);
+        $urlsource = $_SERVER["PHP_SELF"] . "?id=" . $object->id;
+        $genallowed = $user->rights->contrat->creer;
+        $delallowed = $user->rights->contrat->supprimer;
+
+        $var = true;
+
+        $somethingshown = $formfile->show_documents('contract', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 1, 0, 0, 28, 0, '', 0, '', $soc->default_lang);
 
         /*
          * Linked object block
-         */
-        $somethingshown=$object->showLinkedObjectBlock();
+        */
+        $somethingshown = $object->showLinkedObjectBlock();
+
+        print '</div><div class="fichehalfright"><div class="ficheaddleft">';
 
-        print '</td><td valign="top" width="50%">';
-        print '</td></tr></table>';
+        print '</div></div></div>';
     }
 }
 
diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php
index 0a71f9eee2e..bb7e4b7ec02 100644
--- a/htdocs/contrat/class/contrat.class.php
+++ b/htdocs/contrat/class/contrat.class.php
@@ -744,7 +744,7 @@ class Contrat extends CommonObject
 
 			$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."contrat");
 
-			
+
 			// Load object modContract
 			$module=(! empty($conf->global->CONTRACT_ADDON)?$conf->global->CONTRACT_ADDON:'mod_contract_olive');
 			if (substr($module, 0, 13) == 'mod_contract_' && substr($module, -3) == 'php')
@@ -1866,6 +1866,40 @@ class Contrat extends CommonObject
 		$this->total_tva      = $xnbp*19.6;
 		$this->total_ttc      = $xnbp*119.6;
 	}
+
+	/**
+	 *  Create a document onto disk according to template module.
+	 *
+	 * 	@param	    string		$modele			Force model to use ('' to not force)
+	 * 	@param		Translate	$outputlangs	Object langs to use for output
+	 *  @param      int			$hidedetails    Hide details of lines
+	 *  @param      int			$hidedesc       Hide description
+	 *  @param      int			$hideref        Hide ref
+	 * 	@return     int         				0 if KO, 1 if OK
+	 */
+	public function generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0)
+	{
+		global $conf,$user,$langs;
+
+		$langs->load("contracts");
+
+		// Positionne le modele sur le nom du modele a utiliser
+		if (! dol_strlen($modele))
+		{
+			if (! empty($conf->global->CONTRACT_ADDON_PDF))
+			{
+				$modele = $conf->global->CONTRACT_ADDON_PDF;
+			}
+			else
+			{
+				$modele = 'strato';
+			}
+		}
+
+		$modelpath = "core/modules/contract/doc/";
+
+		return $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref);
+	}
 }
 
 
diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php
index 447f96ff61c..e473fdc3d98 100644
--- a/htdocs/core/class/html.formfile.class.php
+++ b/htdocs/core/class/html.formfile.class.php
@@ -355,6 +355,15 @@ class FormFile
                     $modellist=ModelePDFFactures::liste_modeles($this->db);
                 }
             }
+            elseif ($modulepart == 'contract')
+            {
+            	if (is_array($genallowed)) $modellist=$genallowed;
+            	else
+            	{
+            		include_once DOL_DOCUMENT_ROOT.'/core/modules/contract/modules_contract.php';
+            		$modellist=ModelePDFContract::liste_modeles($this->db);
+            	}
+            }
             elseif ($modulepart == 'project')
             {
                 if (is_array($genallowed)) $modellist=$genallowed;
diff --git a/htdocs/install/mysql/migration/3.6.0-3.7.0.sql b/htdocs/install/mysql/migration/3.6.0-3.7.0.sql
index 9e109cd311f..778b3f2b9ff 100644
--- a/htdocs/install/mysql/migration/3.6.0-3.7.0.sql
+++ b/htdocs/install/mysql/migration/3.6.0-3.7.0.sql
@@ -1083,3 +1083,5 @@ CREATE TABLE llx_usergroup_extrafields (
 ) ENGINE=innodb;
 
 ALTER TABLE llx_usergroup_extrafields ADD INDEX idx_usergroup_extrafields (fk_object);
+
+ALTER TABLE llx_contrat ADD COLUMN model_pdf varchar(255) DEFAULT NULL AFTER note_public;
diff --git a/htdocs/install/mysql/tables/llx_contrat.sql b/htdocs/install/mysql/tables/llx_contrat.sql
index 496ecd4c97d..4631b660d46 100644
--- a/htdocs/install/mysql/tables/llx_contrat.sql
+++ b/htdocs/install/mysql/tables/llx_contrat.sql
@@ -1,7 +1,7 @@
 -- ============================================================================
 -- Copyright (C) 2002-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
 -- Copyright (C) 2004-2005 Laurent Destailleur  <eldy@users.sourceforge.net>
--- Copyright (C) 2005-2012 Regis Houssin        <regis.houssin@capnetworks.com>
+-- Copyright (C) 2005-2014 Regis Houssin        <regis.houssin@capnetworks.com>
 --
 -- 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
@@ -40,6 +40,7 @@ create table llx_contrat
   fk_user_cloture			integer,
   note_private				text,
   note_public				text,
+  model_pdf					varchar(255),
   import_key				varchar(14),
   extraparams				varchar(255)
 
-- 
GitLab