diff --git a/htdocs/admin/contract.php b/htdocs/admin/contract.php
index 9d87b30c0b9..ca03efec484 100644
--- a/htdocs/admin/contract.php
+++ b/htdocs/admin/contract.php
@@ -69,18 +69,150 @@ if ($action == 'setmod')
dolibarr_set_const($db, "CONTRACT_ADDON",$value,'chaine',0,'',$conf->entity);
}
-/*
- // constants of magre model
- if ($action == 'updateMatrice') dolibarr_set_const($db, "CONTRACT_NUM_MATRICE",$_POST["matrice"],'chaine',0,'',$conf->entity);
- if ($action == 'updatePrefix') dolibarr_set_const($db, "CONTRACT_NUM_PREFIX",$_POST["prefix"],'chaine',0,'',$conf->entity);
- if ($action == 'setOffset') dolibarr_set_const($db, "CONTRACT_NUM_DELTA",$_POST["offset"],'chaine',0,'',$conf->entity);
- if ($action == 'setNumRestart') dolibarr_set_const($db, "CONTRACT_NUM_RESTART_BEGIN_YEAR",$_POST["numrestart"],'chaine',0,'',$conf->entity);
- */
+else if ($action == 'specimen') // For contract
+{
+ $modele= GETPOST('module','alpha');
+
+ $contract = new Contrat($db);
+ $contract->initAsSpecimen();
+
+ // Search template files
+ $file=''; $classname=''; $filefound=0;
+ $dirmodels=array_merge(array('/'),(array) $conf->modules_parts['models']);
+ foreach($dirmodels as $reldir)
+ {
+ $file=dol_buildpath($reldir."core/modules/contract/doc/pdf_".$modele.".modules.php",0);
+ if (file_exists($file))
+ {
+ $filefound=1;
+ $classname = "pdf_".$modele;
+ break;
+ }
+ }
+
+ if ($filefound)
+ {
+ require_once $file;
+
+ $module = new $classname($db);
+
+ if ($module->write_file($contract,$langs) > 0)
+ {
+ header("Location: ".DOL_URL_ROOT."/document.php?modulepart=contract&file=SPECIMEN.pdf");
+ return;
+ }
+ else
+ {
+ setEventMessage($obj->error,'errors');
+ dol_syslog($obj->error, LOG_ERR);
+ }
+ }
+ else
+ {
+ setEventMessage($langs->trans("ErrorModuleNotFound"),'errors');
+ dol_syslog($langs->trans("ErrorModuleNotFound"), LOG_ERR);
+ }
+}
+
+// Activate a model
+else if ($action == 'set')
+{
+ $ret = addDocumentModel($value, $type, $label, $scandir);
+}
+
+else if ($action == 'del')
+{
+ $ret = delDocumentModel($value, $type);
+ if ($ret > 0)
+ {
+ if ($conf->global->CONTRACT_ADDON_PDF == "$value") dolibarr_del_const($db, 'CONTRACT_ADDON_PDF',$conf->entity);
+ }
+}
+
+// Set default model
+else if ($action == 'setdoc')
+{
+ if (dolibarr_set_const($db, "CONTRACT_ADDON_PDF",$value,'chaine',0,'',$conf->entity))
+ {
+ // La constante qui a ete lue en avant du nouveau set
+ // on passe donc par une variable pour avoir un affichage coherent
+ $conf->global->CONTRACT_ADDON_PDF = $value;
+ }
+
+ // On active le modele
+ $ret = delDocumentModel($value, $type);
+ if ($ret > 0)
+ {
+ $ret = addDocumentModel($value, $type, $label, $scandir);
+ }
+}
+
+else if ($action == 'setmod')
+{
+ // TODO Verifier si module numerotation choisi peut etre active
+ // par appel methode canBeActivated
+
+ dolibarr_set_const($db, "CONTRACT_ADDON",$value,'chaine',0,'',$conf->entity);
+}
+
+else if ($action == 'set_CONTRAT_FREE_TEXT')
+{
+ $freetext= GETPOST('CONTRAT_FREE_TEXT','alpha');
+ $res = dolibarr_set_const($db, "CONTRAT_FREE_TEXT",$freetext,'chaine',0,'',$conf->entity);
+
+ if (! $res > 0) $error++;
+
+ if (! $error)
+ {
+ setEventMessage($langs->trans("SetupSaved"));
+ }
+ else
+ {
+ setEventMessage($langs->trans("Error"),'errors');
+ }
+}
+
+else if ($action == 'set_CONTRAT_DRAFT_WATERMARK')
+{
+ $draft= GETPOST('CONTRAT_DRAFT_WATERMARK','alpha');
+
+ $res = dolibarr_set_const($db, "CONTRAT_DRAFT_WATERMARK",trim($draft),'chaine',0,'',$conf->entity);
+
+ if (! $res > 0) $error++;
+
+ if (! $error)
+ {
+ setEventMessage($langs->trans("SetupSaved"));
+ }
+ else
+ {
+ setEventMessage($langs->trans("Error"),'errors');
+ }
+}
+
+elseif ($action == 'set_CONTRAT_PRINT_PRODUCTS')
+{
+ $val = GETPOST('CONTRAT_PRINT_PRODUCTS','alpha');
+ $res = dolibarr_set_const($db, "CONTRAT_PRINT_PRODUCTS",($val == 'on'),'bool',0,'',$conf->entity);
+
+ if (! $res > 0) $error++;
+
+ if (! $error)
+ {
+ setEventMessage($langs->trans("SetupSaved"));
+ }
+ else
+ {
+ setEventMessage($langs->trans("Error"),'errors');
+ }
+}
/*
* View
*/
+$dirmodels=array_merge(array('/'),(array) $conf->modules_parts['models']);
+
llxHeader();
$dir=DOL_DOCUMENT_ROOT."/core/modules/contract/";
@@ -194,6 +326,195 @@ if (is_resource($handle))
print '
';
+/*
+ * Documents models for Contracts
+ */
+
+print_titre($langs->trans("TemplatePDFInterventions"));
+
+// Defini tableau def des modeles
+$type='contrat';
+$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 '
';
+print '';
+print '| '.$langs->trans("Name").' | ';
+print ''.$langs->trans("Description").' | ';
+print ''.$langs->trans("Status")." | \n";
+print ''.$langs->trans("Default")." | \n";
+print ''.$langs->trans("ShortInfo").' | ';
+print ''.$langs->trans("Preview").' | ';
+print "
\n";
+
+clearstatcache();
+
+$var=true;
+foreach ($dirmodels as $reldir)
+{
+ $dir = dol_buildpath($reldir."core/modules/contract/doc/");
+
+ if (is_dir($dir))
+ {
+ $handle=opendir($dir);
+ if (is_resource($handle))
+ {
+ while (($file = readdir($handle))!==false)
+ {
+ if (substr($file, dol_strlen($file) -12) == '.modules.php' && substr($file,0,4) == 'pdf_')
+ {
+ $name = substr($file, 4, dol_strlen($file) -16);
+ $classname = substr($file, 0, dol_strlen($file) -12);
+
+ $var=!$var;
+
+ print '| ';
+ echo "$name";
+ print " | \n";
+ require_once $dir.$file;
+ $module = new $classname($db);
+ print $module->description;
+ print ' | ';
+
+ // Active
+ if (in_array($name, $def))
+ {
+ print "\n";
+ print 'scandir.'&label='.urlencode($module->name).'">';
+ print img_picto($langs->trans("Enabled"),'switch_on');
+ print '';
+ print " | ";
+ }
+ else
+ {
+ print "\n";
+ print 'scandir.'&label='.urlencode($module->name).'">'.img_picto($langs->trans("Disabled"),'switch_off').'';
+ print " | ";
+ }
+
+ // Default
+ print "";
+ if ($conf->global->CONTRACT_ADDON_PDF == "$name")
+ {
+ print img_picto($langs->trans("Default"),'on');
+ }
+ else
+ {
+ print 'scandir.'&label='.urlencode($module->name).'" alt="'.$langs->trans("Default").'">'.img_picto($langs->trans("Disabled"),'off').'';
+ }
+ 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);
+ $htmltooltip.='
'.$langs->trans("PaymentMode").': '.yn($module->option_modereg,1,1);
+ $htmltooltip.='
'.$langs->trans("PaymentConditions").': '.yn($module->option_condreg,1,1);
+ $htmltooltip.='
'.$langs->trans("MultiLanguage").': '.yn($module->option_multilang,1,1);
+ $htmltooltip.='
'.$langs->trans("WatermarkOnDraftOrders").': '.yn($module->option_draft_watermark,1,1);
+ print '';
+ print $form->textwithpicto('',$htmltooltip,-1,0);
+ print ' | ';
+
+ // Preview
+ $link=''.img_object($langs->trans("Preview"),'contrat').'';
+ print '';
+ print $link;
+ print ' | ';
+
+ print '
';
+ }
+ }
+ closedir($handle);
+ }
+ }
+}
+
+print '
';
+print "
";
+
+/*
+ * Other options
+ *
+ */
+
+print_titre($langs->trans("OtherOptions"));
+print '';
+
+print '
';
+
$db->close();
llxFooter();
diff --git a/htdocs/core/modules/contract/doc/pdf_strato.modules.php b/htdocs/core/modules/contract/doc/pdf_strato.modules.php
new file mode 100644
index 00000000000..9591fd173e9
--- /dev/null
+++ b/htdocs/core/modules/contract/doc/pdf_strato.modules.php
@@ -0,0 +1,609 @@
+
+ * Copyright (C) 2004-2010 Laurent Destailleur
+ * Copyright (C) 2005-2012 Regis Houssin
+ * Copyright (C) 2008 Raphael Bertrand (Resultic)
+ * Copyright (C) 2011 Fabrice CHERRIER
+ * Copyright (C) 2013 Philippe Grand
+ *
+ * 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 3 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, see .
+ * or see http://www.gnu.org/
+ */
+
+/**
+ * \file htdocs/core/modules/contract/doc/pdf_strato.modules.php
+ * \ingroup ficheinter
+ * \brief Fichier de la classe permettant de generer les fiches d'intervention au modele Strato
+ */
+require_once DOL_DOCUMENT_ROOT.'/core/modules/contract/modules_contract.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
+
+
+/**
+ * Class to build contracts documents with model Strato
+ */
+class pdf_strato extends ModelePDFContract
+{
+ var $db;
+ var $name;
+ var $description;
+ var $type;
+
+ var $phpmin = array(4,3,0); // Minimum version of PHP required by module
+ var $version = 'dolibarr';
+
+ var $page_largeur;
+ var $page_hauteur;
+ var $format;
+ var $marge_gauche;
+ var $marge_droite;
+ var $marge_haute;
+ var $marge_basse;
+
+ /**
+ * Constructor
+ *
+ * @param DoliDB $db Database handler
+ */
+ function __construct($db)
+ {
+ global $conf,$langs,$mysoc;
+
+ $this->db = $db;
+ $this->name = 'strato';
+ $this->description = $langs->trans("DocumentModelStandard");
+
+ // Dimension page pour format A4
+ $this->type = 'pdf';
+ $formatarray=pdf_getFormat();
+ $this->page_largeur = $formatarray['width'];
+ $this->page_hauteur = $formatarray['height'];
+ $this->format = array($this->page_largeur,$this->page_hauteur);
+ $this->marge_gauche=isset($conf->global->MAIN_PDF_MARGIN_LEFT)?$conf->global->MAIN_PDF_MARGIN_LEFT:10;
+ $this->marge_droite=isset($conf->global->MAIN_PDF_MARGIN_RIGHT)?$conf->global->MAIN_PDF_MARGIN_RIGHT:10;
+ $this->marge_haute =isset($conf->global->MAIN_PDF_MARGIN_TOP)?$conf->global->MAIN_PDF_MARGIN_TOP:10;
+ $this->marge_basse =isset($conf->global->MAIN_PDF_MARGIN_BOTTOM)?$conf->global->MAIN_PDF_MARGIN_BOTTOM:10;
+
+ $this->option_logo = 1; // Affiche logo
+ $this->option_tva = 0; // Gere option tva FACTURE_TVAOPTION
+ $this->option_modereg = 0; // Affiche mode reglement
+ $this->option_condreg = 0; // Affiche conditions reglement
+ $this->option_codeproduitservice = 0; // Affiche code produit-service
+ $this->option_multilang = 0; // Dispo en plusieurs langues
+ $this->option_draft_watermark = 1; //Support add of a watermark on drafts
+
+ // Get source company
+ $this->emetteur=$mysoc;
+ if (empty($this->emetteur->country_code)) $this->emetteur->country_code=substr($langs->defaultlang,-2); // By default, if not defined
+
+ // Define position of columns
+ $this->posxdesc=$this->marge_gauche+1;
+ }
+
+ /**
+ * Function to build pdf onto disk
+ *
+ * @param int $object Id of object to generate
+ * @param object $outputlangs Lang output object
+ * @param string $srctemplatepath Full path of source filename for generator using a template file
+ * @param int $hidedetails Do not show line details
+ * @param int $hidedesc Do not show desc
+ * @param int $hideref Do not show ref
+ * @return int 1=OK, 0=KO
+ */
+ function write_file($object,$outputlangs,$srctemplatepath='',$hidedetails=0,$hidedesc=0,$hideref=0)
+ {
+ global $user,$langs,$conf,$mysoc;
+
+ if (! is_object($outputlangs)) $outputlangs=$langs;
+ // For backward compatibility with FPDF, force output charset to ISO, because FPDF expect text to be encoded in ISO
+ if (! empty($conf->global->MAIN_USE_FPDF)) $outputlangs->charset_output='ISO-8859-1';
+
+ $outputlangs->load("main");
+ $outputlangs->load("dict");
+ $outputlangs->load("companies");
+ $outputlangs->load("contracts");
+
+ if ($conf->contrat->dir_output)
+ {
+ $object->fetch_thirdparty();
+
+ $objectref = dol_sanitizeFileName($object->ref);
+ $dir = $conf->contrat->dir_output;
+ if (! preg_match('/specimen/i',$objectref)) $dir.= "/" . $objectref;
+ $file = $dir . "/" . $objectref . ".pdf";
+
+ if (! file_exists($dir))
+ {
+ if (dol_mkdir($dir) < 0)
+ {
+ $this->error=$outputlangs->trans("ErrorCanNotCreateDir",$dir);
+ return 0;
+ }
+ }
+
+ if (file_exists($dir))
+ {
+ $pdf=pdf_getInstance($this->format);
+ $default_font_size = pdf_getPDFFontSize($outputlangs); // Must be after pdf_getInstance
+ $heightforinfotot = 50; // Height reserved to output the info and total part
+ $heightforfreetext= (isset($conf->global->MAIN_PDF_FREETEXT_HEIGHT)?$conf->global->MAIN_PDF_FREETEXT_HEIGHT:5); // Height reserved to output the free text on last page
+ $heightforfooter = $this->marge_basse + 8; // Height reserved to output the footer (value include bottom margin)
+ $pdf->SetAutoPageBreak(1,0);
+
+ if (class_exists('TCPDF'))
+ {
+ $pdf->setPrintHeader(false);
+ $pdf->setPrintFooter(false);
+ }
+ $pdf->SetFont(pdf_getPDFFont($outputlangs));
+ // Set path to the background PDF File
+ if (empty($conf->global->MAIN_DISABLE_FPDI) && ! empty($conf->global->MAIN_ADD_PDF_BACKGROUND))
+ {
+ $pagecount = $pdf->setSourceFile($conf->mycompany->dir_output.'/'.$conf->global->MAIN_ADD_PDF_BACKGROUND);
+ $tplidx = $pdf->importPage(1);
+ }
+
+ $pdf->Open();
+ $pagenb=0;
+ $pdf->SetDrawColor(128,128,128);
+
+ $pdf->SetTitle($outputlangs->convToOutputCharset($object->ref));
+ $pdf->SetSubject($outputlangs->transnoentities("InterventionCard"));
+ $pdf->SetCreator("Dolibarr ".DOL_VERSION);
+ $pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
+ $pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("InterventionCard"));
+ if (! empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) $pdf->SetCompression(false);
+
+ $pdf->SetMargins($this->marge_gauche, $this->marge_haute, $this->marge_droite); // Left, Top, Right
+
+ // New page
+ $pdf->AddPage();
+ if (! empty($tplidx)) $pdf->useTemplate($tplidx);
+ $pagenb++;
+ $this->_pagehead($pdf, $object, 1, $outputlangs);
+ $pdf->SetFont('','', $default_font_size - 1);
+ $pdf->MultiCell(0, 3, ''); // Set interline to 3
+ $pdf->SetTextColor(0,0,0);
+
+ $tab_top = 90;
+ $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)?42:10);
+ $tab_height = 130;
+ $tab_height_newpage = 150;
+
+ // Affiche notes
+ if (! empty($object->note_public))
+ {
+ $tab_top = 88;
+
+ $pdf->SetFont('','', $default_font_size - 1);
+ $pdf->writeHTMLCell(190, 3, $this->posxdesc-1, $tab_top, dol_htmlentitiesbr($object->note_public), 0, 1);
+ $nexY = $pdf->GetY();
+ $height_note=$nexY-$tab_top;
+
+ // Rect prend une longueur en 3eme param
+ $pdf->SetDrawColor(192,192,192);
+ $pdf->Rect($this->marge_gauche, $tab_top-1, $this->page_largeur-$this->marge_gauche-$this->marge_droite, $height_note+1);
+
+ $tab_height = $tab_height - $height_note;
+ $tab_top = $nexY+6;
+ }
+ else
+ {
+ $height_note=0;
+ }
+
+ $iniY = $tab_top + 7;
+ $curY = $tab_top + 7;
+ $nexY = $tab_top + 7;
+
+ $pdf->SetXY($this->marge_gauche, $tab_top);
+ $pdf->MultiCell(190,8,$outputlangs->transnoentities("Description"),0,'L',0);
+ $pdf->line($this->marge_gauche, $tab_top + 8, $this->page_largeur-$this->marge_droite, $tab_top + 8);
+
+ $pdf->SetFont('', '', $default_font_size - 1);
+
+ $pdf->MultiCell(0, 3, ''); // Set interline to 3
+ $pdf->SetXY($this->marge_gauche, $tab_top + 8);
+ $text=$object->description;
+ if ($object->duree > 0)
+ {
+ $totaltime=convertSecondToTime($object->duree,'all',$conf->global->MAIN_DURATION_OF_WORKDAY);
+ $text.=($text?' - ':'').$langs->trans("Total").": ".$totaltime;
+ }
+ $desc=dol_htmlentitiesbr($text,1);
+ //print $outputlangs->convToOutputCharset($desc); exit;
+
+ $pdf->writeHTMLCell(180, 3, 10, $tab_top + 8, $outputlangs->convToOutputCharset($desc), 0, 1);
+ $nexY = $pdf->GetY();
+
+ $pdf->line($this->marge_gauche, $nexY, $this->page_largeur-$this->marge_droite, $nexY);
+
+ $pdf->MultiCell(0, 2, ''); // Set interline to 3. Then writeMultiCell must use 3 also.
+
+ $nblines = count($object->lines);
+
+ // Loop on each lines
+ for ($i = 0; $i < $nblines; $i++)
+ {
+ $objectligne = $object->lines[$i];
+
+ $valide = $objectligne->id ? $objectligne->fetch($objectligne->id) : 0;
+ if ($valide > 0 || $object->specimen)
+ {
+ $curY = $nexY;
+ $pdf->SetFont('','', $default_font_size - 1); // Into loop to work with multipage
+ $pdf->SetTextColor(0,0,0);
+
+ $pdf->setTopMargin($tab_top_newpage);
+ $pdf->setPageOrientation('', 1, $heightforfooter+$heightforfreetext+$heightforinfotot); // The only function to edit the bottom margin of current page to set it.
+ $pageposbefore=$pdf->getPage();
+
+ // Description of product line
+ $txt=''.dol_htmlentitiesbr($outputlangs->transnoentities("Date")." : ".dol_print_date($objectligne->datei,'dayhour',false,$outputlangs,true)." - ".$outputlangs->transnoentities("Duration")." : ".convertSecondToTime($objectligne->duration),1,$outputlangs->charset_output).'';
+ $desc=dol_htmlentitiesbr($objectligne->desc,1);
+
+ $pdf->writeHTMLCell(0, 0, $curX, $curY, dol_concatdesc($txt,$desc), 0, 1, 0);
+
+ $nexY = $pdf->GetY();
+ $pageposafter=$pdf->getPage();
+ $pdf->setPage($pageposbefore);
+ $pdf->setTopMargin($this->marge_haute);
+ $pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
+
+ // We suppose that a too long description is moved completely on next page
+ if ($pageposafter > $pageposbefore) {
+ $pdf->setPage($pageposafter); $curY = $tab_top_newpage;
+ }
+
+ $pdf->SetFont('','', $default_font_size - 1); // On repositionne la police par defaut
+
+ // Detect if some page were added automatically and output _tableau for past pages
+ while ($pagenb < $pageposafter)
+ {
+ $pdf->setPage($pagenb);
+ if ($pagenb == 1)
+ {
+ $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforfooter, 0, $outputlangs, 0, 1);
+ }
+ else
+ {
+ $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforfooter, 0, $outputlangs, 1, 1);
+ }
+ $this->_pagefoot($pdf,$object,$outputlangs,1);
+ $pagenb++;
+ $pdf->setPage($pagenb);
+ $pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
+ }
+ if (isset($object->lines[$i+1]->pagebreak) && $object->lines[$i+1]->pagebreak)
+ {
+ if ($pagenb == 1)
+ {
+ $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforfooter, 0, $outputlangs, 0, 1);
+ }
+ else
+ {
+ $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforfooter, 0, $outputlangs, 1, 1);
+ }
+ $this->_pagefoot($pdf,$object,$outputlangs,1);
+ // New page
+ $pdf->AddPage();
+ if (! empty($tplidx)) $pdf->useTemplate($tplidx);
+ $pagenb++;
+ }
+ }
+ }
+
+ // Show square
+ if ($pagenb == 1)
+ {
+ $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforinfotot - $heightforfreetext - $heightforfooter, 0, $outputlangs, 0, 0);
+ $bottomlasttab=$this->page_hauteur - $heightforfooter - $heightforfooter + 1;
+ }
+ else
+ {
+ $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforinfotot - $heightforfreetext - $heightforfooter, 0, $outputlangs, 1, 0);
+ $bottomlasttab=$this->page_hauteur - $heightforfooter - $heightforfooter + 1;
+ }
+
+ $this->_pagefoot($pdf,$object,$outputlangs);
+ if (method_exists($pdf,'AliasNbPages')) $pdf->AliasNbPages();
+
+ $pdf->Close();
+
+ $pdf->Output($file,'F');
+ if (! empty($conf->global->MAIN_UMASK))
+ @chmod($file, octdec($conf->global->MAIN_UMASK));
+
+ return 1;
+ }
+ else
+ {
+ $this->error=$langs->trans("ErrorCanNotCreateDir",$dir);
+ return 0;
+ }
+ }
+ else
+ {
+ $this->error=$langs->trans("ErrorConstantNotDefined","CONTRACT_OUTPUTDIR");
+ return 0;
+ }
+ $this->error=$langs->trans("ErrorUnknown");
+ return 0; // Erreur par defaut
+ }
+
+ /**
+ * Show table for lines
+ *
+ * @param PDF &$pdf Object PDF
+ * @param string $tab_top Top position of table
+ * @param string $tab_height Height of table (rectangle)
+ * @param int $nexY Y
+ * @param Translate $outputlangs Langs object
+ * @param int $hidetop Hide top bar of array
+ * @param int $hidebottom Hide bottom bar of array
+ * @return void
+ */
+ function _tableau(&$pdf, $tab_top, $tab_height, $nexY, $outputlangs, $hidetop=0, $hidebottom=0)
+ {
+ global $conf;
+
+ // Force to disable hidetop and hidebottom
+ $hidebottom=0;
+ if ($hidetop) $hidetop=-1;
+
+ $default_font_size = pdf_getPDFFontSize($outputlangs);
+/*
+ $pdf->SetXY($this->marge_gauche, $tab_top);
+ $pdf->MultiCell(190,8,$outputlangs->transnoentities("Description"),0,'L',0);
+ $pdf->line($this->marge_gauche, $tab_top + 8, $this->page_largeur-$this->marge_droite, $tab_top + 8);
+
+ $pdf->SetFont('','', $default_font_size - 1);
+
+ $pdf->MultiCell(0, 3, ''); // Set interline to 3
+ $pdf->SetXY($this->marge_gauche, $tab_top + 8);
+ $text=$object->description;
+ if ($object->duree > 0)
+ {
+ $totaltime=convertSecondToTime($object->duree,'all',$conf->global->MAIN_DURATION_OF_WORKDAY);
+ $text.=($text?' - ':'').$langs->trans("Total").": ".$totaltime;
+ }
+ $desc=dol_htmlentitiesbr($text,1);
+ //print $outputlangs->convToOutputCharset($desc); exit;
+
+ $pdf->writeHTMLCell(180, 3, 10, $tab_top + 8, $outputlangs->convToOutputCharset($desc), 0, 1);
+ $nexY = $pdf->GetY();
+
+ $pdf->line($this->marge_gauche, $nexY, $this->page_largeur-$this->marge_droite, $nexY);
+
+ $pdf->MultiCell(0, 3, ''); // Set interline to 3. Then writeMultiCell must use 3 also.
+*/
+
+ // Output Rect
+ $this->printRect($pdf, $this->marge_gauche, $tab_top, $this->page_largeur-$this->marge_gauche-$this->marge_droite, $tab_height+3, $hidetop, $hidebottom); // Rect prend une longueur en 3eme param et 4eme param
+
+ if (empty($hidebottom))
+ {
+ $pdf->SetXY(20,230);
+ $pdf->MultiCell(66,5, $outputlangs->transnoentities("NameAndSignatureOfInternalContact"),0,'L',0);
+
+ $pdf->SetXY(20,235);
+ $pdf->MultiCell(80,25, '', 1);
+
+ $pdf->SetXY(110,230);
+ $pdf->MultiCell(80,5, $outputlangs->transnoentities("NameAndSignatureOfExternalContact"),0,'L',0);
+
+ $pdf->SetXY(110,235);
+ $pdf->MultiCell(80,25, '', 1);
+ }
+ }
+
+ /**
+ * Show top header of page.
+ *
+ * @param PDF &$pdf Object PDF
+ * @param Object $object Object to show
+ * @param int $showaddress 0=no, 1=yes
+ * @param Translate $outputlangs Object lang for output
+ * @return void
+ */
+ function _pagehead(&$pdf, $object, $showaddress, $outputlangs)
+ {
+ global $conf,$langs;
+ $default_font_size = pdf_getPDFFontSize($outputlangs);
+
+ $outputlangs->load("main");
+ $outputlangs->load("dict");
+ $outputlangs->load("companies");
+ $outputlangs->load("contract");
+
+ pdf_pagehead($pdf,$outputlangs,$this->page_hauteur);
+
+ //Affiche le filigrane brouillon - Print Draft Watermark
+ if($object->statut==0 && (! empty($conf->global->CONTRAT_DRAFT_WATERMARK)) )
+ {
+ pdf_watermark($pdf,$outputlangs,$this->page_hauteur,$this->page_largeur,'mm',$conf->global->CONTRAT_DRAFT_WATERMARK);
+ }
+
+ //Prepare la suite
+ $pdf->SetTextColor(0,0,60);
+ $pdf->SetFont('','B', $default_font_size + 3);
+
+ $posx=$this->page_largeur-$this->marge_droite-100;
+ $posy=$this->marge_haute;
+
+ $pdf->SetXY($this->marge_gauche,$posy);
+
+ // Logo
+ $logo=$conf->mycompany->dir_output.'/logos/'.$this->emetteur->logo;
+ if ($this->emetteur->logo)
+ {
+ if (is_readable($logo))
+ {
+ $height=pdf_getHeightForLogo($logo);
+ $pdf->Image($logo, $this->marge_gauche, $posy, 0, $height); // width=0 (auto)
+ }
+ else
+ {
+ $pdf->SetTextColor(200,0,0);
+ $pdf->SetFont('','B',$default_font_size - 2);
+ $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorLogoFileNotFound",$logo), 0, 'L');
+ $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorGoToGlobalSetup"), 0, 'L');
+ }
+ }
+ else
+ {
+ $text=$this->emetteur->name;
+ $pdf->MultiCell(100, 4, $outputlangs->convToOutputCharset($text), 0, 'L');
+ }
+
+ $pdf->SetFont('','B',$default_font_size + 3);
+ $pdf->SetXY($posx,$posy);
+ $pdf->SetTextColor(0,0,60);
+ $title=$outputlangs->transnoentities("ContractCard");
+ $pdf->MultiCell(100, 4, $title, '', 'R');
+
+ $pdf->SetFont('','B',$default_font_size + 2);
+
+ $posy+=5;
+ $pdf->SetXY($posx,$posy);
+ $pdf->SetTextColor(0,0,60);
+ $pdf->MultiCell(100, 4, $outputlangs->transnoentities("Ref")." : " . $outputlangs->convToOutputCharset($object->ref), '', 'R');
+
+ $posy+=1;
+ $pdf->SetFont('','', $default_font_size);
+
+ $posy+=4;
+ $pdf->SetXY($posx,$posy);
+ $pdf->SetTextColor(0,0,60);
+ $pdf->MultiCell(100, 3, $outputlangs->transnoentities("Date")." : " . dol_print_date($object->datec,"day",false,$outputlangs,true), '', 'R');
+
+ if ($object->client->code_client)
+ {
+ $posy+=4;
+ $pdf->SetXY($posx,$posy);
+ $pdf->SetTextColor(0,0,60);
+ $pdf->MultiCell(100, 3, $outputlangs->transnoentities("CustomerCode")." : " . $outputlangs->transnoentities($object->client->code_client), '', 'R');
+ }
+
+ if ($showaddress)
+ {
+ // Sender properties
+ $carac_emetteur='';
+ // Add internal contact of proposal if defined
+ $arrayidcontact=$object->getIdContact('internal','INTERREPFOLL');
+ if (count($arrayidcontact) > 0)
+ {
+ $object->fetch_user($arrayidcontact[0]);
+ $carac_emetteur .= ($carac_emetteur ? "\n" : '' ).$outputlangs->transnoentities("Name").": ".$outputlangs->convToOutputCharset($object->user->getFullName($outputlangs))."\n";
+ }
+
+ $carac_emetteur .= pdf_build_address($outputlangs,$this->emetteur);
+
+ // Show sender
+ $posy=42;
+ $posx=$this->marge_gauche;
+ if (! empty($conf->global->MAIN_INVERT_SENDER_RECIPIENT)) $posx=$this->page_largeur-$this->marge_droite-80;
+ $hautcadre=40;
+
+ // Show sender frame
+ $pdf->SetTextColor(0,0,0);
+ $pdf->SetFont('','', $default_font_size - 2);
+ $pdf->SetXY($posx,$posy-5);
+ $pdf->SetXY($posx,$posy);
+ $pdf->SetFillColor(230,230,230);
+ $pdf->MultiCell(82, $hautcadre, "", 0, 'R', 1);
+
+ // Show sender name
+ $pdf->SetXY($posx+2,$posy+3);
+ $pdf->SetTextColor(0,0,60);
+ $pdf->SetFont('','B',$default_font_size);
+ $pdf->MultiCell(80, 3, $outputlangs->convToOutputCharset($this->emetteur->name), 0, 'L');
+ $posy=$pdf->getY();
+
+ // Show sender information
+ $pdf->SetFont('','', $default_font_size - 1);
+ $pdf->SetXY($posx+2,$posy);
+ $pdf->MultiCell(80, 4, $carac_emetteur, 0, 'L');
+
+
+ // If CUSTOMER contact defined, we use it
+ $usecontact=false;
+ $arrayidcontact=$object->getIdContact('external','CUSTOMER');
+ if (count($arrayidcontact) > 0)
+ {
+ $usecontact=true;
+ $result=$object->fetch_contact($arrayidcontact[0]);
+ }
+
+ // Recipient name
+ if (! empty($usecontact))
+ {
+ // On peut utiliser le nom de la societe du contact
+ if (! empty($conf->global->MAIN_USE_COMPANY_NAME_OF_CONTACT)) $socname = $object->contact->socname;
+ else $socname = $object->client->nom;
+ $carac_client_name=$outputlangs->convToOutputCharset($socname);
+ }
+ else
+ {
+ $carac_client_name=$outputlangs->convToOutputCharset($object->client->nom);
+ }
+
+ $carac_client=pdf_build_address($outputlangs, $this->emetteur, $object->client, (isset($object->contact)?$object->contact:''), $usecontact, 'target');
+
+ // Show recipient
+ $widthrecbox=100;
+ if ($this->page_largeur < 210) $widthrecbox=84; // To work with US executive format
+ $posy=42;
+ $posx=$this->page_largeur-$this->marge_droite-$widthrecbox;
+ if (! empty($conf->global->MAIN_INVERT_SENDER_RECIPIENT)) $posx=$this->marge_gauche;
+
+ // Show recipient frame
+ $pdf->SetTextColor(0,0,0);
+ $pdf->SetFont('','', $default_font_size - 2);
+ $pdf->SetXY($posx+2,$posy-5);
+ $pdf->Rect($posx, $posy, $widthrecbox, $hautcadre);
+ $pdf->SetTextColor(0,0,0);
+
+ // Show recipient name
+ $pdf->SetXY($posx+2,$posy+3);
+ $pdf->SetFont('','B', $default_font_size);
+ $pdf->MultiCell($widthrecbox, 4, $carac_client_name, 0, 'L');
+
+ // Show recipient information
+ $pdf->SetFont('','', $default_font_size - 1);
+ $pdf->SetXY($posx+2,$posy+4+(dol_nboflines_bis($carac_client_name,50)*4));
+ $pdf->MultiCell($widthrecbox, 4, $carac_client, 0, 'L');
+ }
+ }
+
+ /**
+ * Show footer of page. Need this->emetteur object
+ *
+ * @param PDF &$pdf PDF
+ * @param Object $object Object to show
+ * @param Translate $outputlangs Object lang for output
+ * @param int $hidefreetext 1=Hide free text
+ * @return void
+ */
+ function _pagefoot(&$pdf,$object,$outputlangs,$hidefreetext=0)
+ {
+ return pdf_pagefoot($pdf,$outputlangs,'CONTRAT_FREE_TEXT',$this->emetteur,$this->marge_basse,$this->marge_gauche,$this->page_hauteur,$object,0,$hidefreetext);
+ }
+
+}
+
+?>
diff --git a/htdocs/core/modules/contract/modules_contract.php b/htdocs/core/modules/contract/modules_contract.php
index 1af59b09922..1df45d7e009 100644
--- a/htdocs/core/modules/contract/modules_contract.php
+++ b/htdocs/core/modules/contract/modules_contract.php
@@ -5,6 +5,7 @@
* Copyright (C) 2005-2009 Regis Houssin
* Copyright (C) 2006 Andre Cianfarani
* Copyright (C) 2011 Juanjo Menent
+ * Copyright (C) 2013 Philippe Grand
*
* 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
@@ -24,9 +25,42 @@
/**
* \file htdocs/core/modules/contract/modules_contract.php
* \ingroup contract
- * \brief File of class to manage contract numbering
+ * \brief Fichier contenant la classe mere de generation des fiches interventions en PDF and File of class to manage contract numbering
*/
+ require_once DOL_DOCUMENT_ROOT.'/core/class/commondocgenerator.class.php';
+
+
+/**
+ * Parent class to manage intervention document templates
+ */
+abstract class ModelePDFContract extends CommonDocGenerator
+{
+ var $error='';
+
+
+ /**
+ * Return list of active generation modules
+ *
+ * @param DoliDB $db Database handler
+ * @param string $maxfilenamelength Max length of value to show
+ * @return array List of templates
+ */
+ static function liste_modeles($db,$maxfilenamelength=0)
+ {
+ global $conf;
+
+ $type='contract';
+ $liste=array();
+
+ include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
+ $liste=getListOfModels($db,$type,$maxfilenamelength);
+
+ return $liste;
+ }
+}
+
+
/**
* Parent class for all contract numbering modules
*/
@@ -107,4 +141,109 @@ class ModelNumRefContracts
return $langs->trans("NotAvailable");
}
}
+
+/**
+ * Create a contract document on disk using template defined into CONTRACT_ADDON_PDF
+ *
+ * @param DoliDB $db objet base de donnee
+ * @param Object $object Object contract
+ * @param string $modele force le modele a utiliser ('' par defaut)
+ * @param Translate $outputlangs objet lang a utiliser pour traduction
+ * @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
+ */
+function contract_create($db, $object, $modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0)
+{
+ global $conf,$langs,$user;
+ $langs->load("contract");
+
+ $error=0;
+
+ $srctemplatepath='';
+
+ // Positionne modele sur le nom du modele de contrat a utiliser
+ if (! dol_strlen($modele))
+ {
+ if (! empty($conf->global->CONTRACT_ADDON_PDF))
+ {
+ $modele = $conf->global->CONTRACT_ADDON_PDF;
+ }
+ else
+ {
+ $modele = 'strato';
+ }
+ }
+
+ // If selected modele is a filename template (then $modele="modelname:filename")
+ $tmp=explode(':',$modele,2);
+ if (! empty($tmp[1]))
+ {
+ $modele=$tmp[0];
+ $srctemplatepath=$tmp[1];
+ }
+
+ // Search template files
+ $file=''; $classname=''; $filefound=0;
+ $dirmodels=array('/');
+ if (is_array($conf->modules_parts['models'])) $dirmodels=array_merge($dirmodels,$conf->modules_parts['models']);
+ foreach($dirmodels as $reldir)
+ {
+ foreach(array('doc','pdf') as $prefix)
+ {
+ $file = $prefix."_".$modele.".modules.php";
+
+ // On verifie l'emplacement du modele
+ $file=dol_buildpath($reldir."core/modules/contract/doc/".$file,0);
+ if (file_exists($file))
+ {
+ $filefound=1;
+ $classname=$prefix.'_'.$modele;
+ break;
+ }
+ }
+ if ($filefound) break;
+ }
+
+ // Charge le modele
+ if ($filefound)
+ {
+ require_once $file;
+
+ $obj = new $classname($db);
+
+ // We save charset_output to restore it because write_file can change it if needed for
+ // output format that does not support UTF8.
+ $sav_charset_output=$outputlangs->charset_output;
+ if ($obj->write_file($object, $outputlangs, $srctemplatepath, $hidedetails, $hidedesc, $hideref) > 0)
+ {
+ $outputlangs->charset_output=$sav_charset_output;
+
+ // We delete old preview
+ require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+ dol_delete_preview($object);
+
+ // Appel des triggers
+ include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
+ $interface=new Interfaces($db);
+ $result=$interface->run_triggers('CONTRACT_BUILDDOC',$object,$user,$langs,$conf);
+ if ($result < 0) { $error++; $this->errors=$interface->errors; }
+ // Fin appel triggers
+
+ return 1;
+ }
+ else
+ {
+ $outputlangs->charset_output=$sav_charset_output;
+ dol_print_error($db,"contract_pdf_create Error: ".$obj->error);
+ return 0;
+ }
+ }
+ else
+ {
+ print $langs->trans("Error")." ".$langs->trans("ErrorFileDoesNotExists",$file);
+ return 0;
+ }
+}
?>