task #8618: improved supplier directory structure

This commit is contained in:
Juanjo Menent 2010-09-28 16:24:25 +00:00
parent 427fabc934
commit fc48d1888f
9 changed files with 1239 additions and 8 deletions

View File

@ -4,6 +4,7 @@
* Copyright (C) 2005-2009 Regis Houssin <regis@dolibarr.fr>
* Copyright (C) 2004 Sebastien Di Cintio <sdicintio@ressource-toi.org>
* Copyright (C) 2004 Benoit Mortier <benoit.mortier@opensides.be>
* Copyright (C) 2010 Juanjo Menent <jmenent@2byte.es>
*
* 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
@ -60,7 +61,7 @@ if ($_GET["action"] == 'specimen')
$commande->initAsSpecimen();
// Charge le modele
$dir = DOL_DOCUMENT_ROOT . "/includes/modules/supplier_order/pdf/";
$dir = DOL_DOCUMENT_ROOT . "/includes/modules/supplier/order/";
$file = "pdf_".$modele.".modules.php";
if (file_exists($dir.$file))
{
@ -168,7 +169,7 @@ print "<br>";
// Supplier order numbering module
$dir = DOL_DOCUMENT_ROOT."/includes/modules/supplier_order/";
$dir = DOL_DOCUMENT_ROOT."/includes/modules/supplier/order/";
print_titre($langs->trans("OrdersNumberingModules"));
@ -194,7 +195,7 @@ if ($handle)
{
$file = substr($file, 0, dol_strlen($file)-4);
require_once(DOL_DOCUMENT_ROOT ."/includes/modules/supplier_order/".$file.".php");
require_once(DOL_DOCUMENT_ROOT ."/includes/modules/supplier/order/".$file.".php");
$module = new $file;
@ -262,7 +263,7 @@ print '</table><br>';
* Modeles documents for supplier orders
*/
$dir = DOL_DOCUMENT_ROOT.'/includes/modules/supplier_order/pdf/';
$dir = DOL_DOCUMENT_ROOT.'/includes/modules/supplier/order/';
print_titre($langs->trans("OrdersModelModule"));

View File

@ -1,5 +1,6 @@
<?php
/* Copyright (c) 2008 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (c) 2010 Juanjo Menent <jmenent@2byte.es>
*
* 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
@ -266,7 +267,7 @@ class FormFile
if (is_array($genallowed)) $modellist=$genallowed;
else
{
include_once(DOL_DOCUMENT_ROOT.'/includes/modules/supplier_order/modules_commandefournisseur.php');
include_once(DOL_DOCUMENT_ROOT.'/includes/modules/supplier/order/modules_commandefournisseur.php');
$model=new ModelePDFSuppliersOrders();
$modellist=$model->liste_modeles($this->db);
}

View File

@ -442,7 +442,7 @@ class CommandeFournisseur extends Commande
global $db, $langs, $conf;
$langs->load("orders");
$dir = DOL_DOCUMENT_ROOT .'/includes/modules/supplier_order/';
$dir = DOL_DOCUMENT_ROOT .'/includes/modules/supplier/order/';
$modelisok=0;
$liste=array();

View File

@ -3,6 +3,7 @@
* Copyright (C) 2004-2010 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005 Eric Seigne <eric.seigne@ryxeo.com>
* Copyright (C) 2005-2009 Regis Houssin <regis@dolibarr.fr>
* Copyright (C) 2010 Juanjo Menent <jmenent@2byte.es>
*
* 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
@ -27,7 +28,7 @@
*/
require("../../main.inc.php");
require_once(DOL_DOCUMENT_ROOT.'/includes/modules/supplier_order/modules_commandefournisseur.php');
require_once(DOL_DOCUMENT_ROOT.'/includes/modules/supplier/order/modules_commandefournisseur.php');
require_once(DOL_DOCUMENT_ROOT."/product/stock/class/entrepot.class.php");
require_once(DOL_DOCUMENT_ROOT."/lib/fourn.lib.php");
require_once(DOL_DOCUMENT_ROOT."/fourn/class/fournisseur.commande.class.php");

View File

@ -30,7 +30,7 @@
require("../../main.inc.php");
require_once(DOL_DOCUMENT_ROOT."/core/class/html.formfile.class.php");
require_once(DOL_DOCUMENT_ROOT."/core/class/html.formorder.class.php");
require_once(DOL_DOCUMENT_ROOT.'/includes/modules/supplier_order/modules_commandefournisseur.php');
require_once(DOL_DOCUMENT_ROOT.'/includes/modules/supplier/order/modules_commandefournisseur.php');
require_once DOL_DOCUMENT_ROOT."/fourn/class/fournisseur.commande.class.php";
require_once DOL_DOCUMENT_ROOT."/fourn/class/fournisseur.product.class.php";
require_once DOL_DOCUMENT_ROOT."/product/class/product.class.php";

View File

@ -0,0 +1,138 @@
<?php
/* Copyright (C) 2005-2008 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2009 Regis Houssin <regis@dolibarr.fr>
* Copyright (C) 2010 Juanjo Menent <jmenent@2byte.es>
* 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.
* or see http://www.gnu.org/
*/
/**
* \file htdocs/includes/modules/supplier/order/mod_commande_fournisseur_muguet.php
* \ingroup commande
* \brief Fichier contenant la classe du modele de numerotation de reference de commande fournisseur Muguet
* \version $Id$
*/
require_once(DOL_DOCUMENT_ROOT ."/includes/modules/supplier/order/modules_commandefournisseur.php");
/** \class mod_commande_fournisseur_muguet
* \brief Classe du modele de numerotation de reference de commande fournisseur Muguet
*/
class mod_commande_fournisseur_muguet extends ModeleNumRefSuppliersOrders
{
var $version='dolibarr'; // 'development', 'experimental', 'dolibarr'
var $error = '';
var $nom = 'Muguet';
var $prefix='CF';
/** \brief Return description of numbering module
* \return string Text with description
*/
function info()
{
global $langs;
return $langs->trans("SimpleNumRefModelDesc",$this->prefix);
}
/** \brief Renvoi un exemple de numerotation
* \return string Example
*/
function getExample()
{
return $this->prefix."0501-0001";
}
/** \brief Test si les numeros deja en vigueur dans la base ne provoquent pas de
* de conflits qui empechera cette numerotation de fonctionner.
* \return boolean false si conflit, true si ok
*/
function canBeActivated()
{
global $conf,$langs;
$coyymm=''; $max='';
$posindice=8;
$sql = "SELECT MAX(SUBSTRING(ref FROM ".$posindice.")) as max";
$sql.= " FROM ".MAIN_DB_PREFIX."commande_fournisseur";
$sql.= " WHERE ref LIKE '".$this->prefix."____-%'";
$sql.= " AND entity = ".$conf->entity;
$resql=$db->query($sql);
if ($resql)
{
$row = $db->fetch_row($resql);
if ($row) { $coyymm = substr($row[0],0,6); $max=$row[0]; }
}
if (! $coyymm || preg_match('/'.$this->prefix.'[0-9][0-9][0-9][0-9]/i',$coyymm))
{
return true;
}
else
{
$langs->load("errors");
$this->error=$langs->trans('ErrorNumRefModel',$max);
return false;
}
}
/** \brief Return next value
* \param objsoc Object third party
* \param object Object
* \return string Valeur
*/
function getNextValue($objsoc=0,$object='')
{
global $db,$conf;
// D'abord on recupere la valeur max
$posindice=8;
$sql = "SELECT MAX(SUBSTRING(ref FROM ".$posindice.")) as max";
$sql.= " FROM ".MAIN_DB_PREFIX."commande_fournisseur";
$sql.= " WHERE ref like '".$this->prefix."____-%'";
$sql.= " AND entity = ".$conf->entity;
$resql=$db->query($sql);
if ($resql)
{
$obj = $db->fetch_object($resql);
if ($obj) $max = intval($obj->max);
else $max=0;
}
//$date=time();
$date=$object->date_commande;
$yymm = strftime("%y%m",$date);
$num = sprintf("%04s",$max+1);
return $this->prefix.$yymm."-".$num;
}
/** \brief Renvoie la reference de commande suivante non utilisee
* \param objsoc Object third party
* \param object Object
* \return string Texte descripif
*/
function commande_get_num($objsoc=0,$object='')
{
return $this->getNextValue($objsoc,$object);
}
}
?>

View File

@ -0,0 +1,139 @@
<?php
/* Copyright (C) 2003-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2008 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2009 Regis Houssin <regis@dolibarr.fr>
* Copyright (C) 2010 Juanjo Menent <jmenent@2byte.es>
*
* 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.
* or see http://www.gnu.org/
*/
/**
* \file htdocs/includes/modules/supplier/order/mod_commande_fournisseur_orchidee.php
* \ingroup commande
* \brief Fichier contenant la classe du modele de numerotation de reference de commande fournisseur Orchidee
* \version $Id$
*/
require_once(DOL_DOCUMENT_ROOT ."/includes/modules/supplier/order/modules_commandefournisseur.php");
/**
\class mod_commande_fournisseur_orchidee
\brief Classe du modele de numerotation de reference de commande fournisseur Orchidee
*/
class mod_commande_fournisseur_orchidee extends ModeleNumRefSuppliersOrders
{
var $version='dolibarr'; // 'development', 'experimental', 'dolibarr'
var $error = '';
var $nom = 'Orchidee';
/** \brief Renvoi la description du modele de numerotation
* \return string Texte descripif
*/
function info()
{
global $conf,$langs;
$langs->load("bills");
$langs->load("admin");
$form = new Form($db);
$texte = $langs->trans('GenericNumRefModelDesc')."<br>\n";
$texte.= '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">';
$texte.= '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
$texte.= '<input type="hidden" name="action" value="updateMask">';
$texte.= '<input type="hidden" name="maskconstorder" value="COMMANDE_FOURNISSEUR_ORCHIDEE_MASK">';
$texte.= '<table class="nobordernopadding" width="100%">';
$tooltip=$langs->trans("GenericMaskCodes",$langs->transnoentities("Order"));
$tooltip.=$langs->trans("GenericMaskCodes2");
$tooltip.=$langs->trans("GenericMaskCodes3");
$tooltip.=$langs->trans("GenericMaskCodes4a",$langs->transnoentities("Order"),$langs->transnoentities("Order"));
$tooltip.=$langs->trans("GenericMaskCodes5");
// Parametrage du prefix
$texte.= '<tr><td>'.$langs->trans("Mask").':</td>';
$texte.= '<td align="right">'.$form->textwithpicto('<input type="text" class="flat" size="24" name="maskorder" value="'.$conf->global->COMMANDE_FOURNISSEUR_ORCHIDEE_MASK.'">',$tooltip,1,1).'</td>';
$texte.= '<td align="left" rowspan="2">&nbsp; <input type="submit" class="button" value="'.$langs->trans("Modify").'" name="Button"></td>';
$texte.= '</tr>';
$texte.= '</table>';
$texte.= '</form>';
return $texte;
}
/** \brief Renvoi un exemple de numerotation
* \return string Example
*/
function getExample()
{
global $conf,$langs,$mysoc;
$old_code_client=$mysoc->code_client;
$mysoc->code_client='CCCCCCCCCC';
$numExample = $this->getNextValue($mysoc,'');
$mysoc->code_client=$old_code_client;
if (! $numExample)
{
$numExample = $langs->trans('NotConfigured');
}
return $numExample;
}
/** \brief Return next value
* \param objsoc Object third party
* \param commande Object supplier order
* \return string Value if OK, 0 if KO
*/
function getNextValue($objsoc=0,$commande='')
{
global $db,$conf;
require_once(DOL_DOCUMENT_ROOT ."/lib/functions2.lib.php");
// On defini critere recherche compteur
$mask=$conf->global->COMMANDE_FOURNISSEUR_ORCHIDEE_MASK;
if (! $mask)
{
$this->error='NotConfigured';
return 0;
}
$numFinal=get_next_value($db,$mask,'commande_fournisseur','ref','',$objsoc->code_fournisseur,$commande->date_commande);
return $numFinal;
}
/** \brief Renvoie la reference de commande suivante non utilisee
* \param objsoc Objet societe
* \param commande Objet commande
* \return string Texte descripif
*/
function commande_get_num($objsoc=0,$commande='')
{
return $this->getNextValue($objsoc,$commande);
}
}
?>

View File

@ -0,0 +1,233 @@
<?php
/* Copyright (C) 2003-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2005 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2004 Eric Seigne <eric.seigne@ryxeo.com>
* Copyright (C) 2005-2010 Regis Houssin <regis@dolibarr.fr>
* Copyright (C) 2006 Andre Cianfarani <acianfa@free.fr>
* Copyright (C) 2010 Juanjo Menent <jmenent@2byte.es>
*
* 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.
* or see http://www.gnu.org/
*/
/**
* \file htdocs/includes/modules/supplier/order/modules_commandefournisseur.php
* \ingroup commande
* \brief File that contain parent class for supplier orders models
* and parent class for supplier orders numbering models
* \version $Id$
*/
require_once(DOL_DOCUMENT_ROOT.'/lib/pdf.lib.php');
require_once(DOL_DOCUMENT_ROOT.'/includes/fpdf/fpdfi/fpdi_protection.php');
/**
* \class ModelePDFSuppliersOrders
* \brief Parent class for supplier orders models
*/
class ModelePDFSuppliersOrders
{
var $error='';
/**
* \brief Return list of active generation modules
* \param $db Database handler
*/
function liste_modeles($db)
{
global $conf;
$type='supplier_order';
$liste=array();
include_once(DOL_DOCUMENT_ROOT.'/lib/functions2.lib.php');
$liste=getListOfModels($db,$type,'');
return $liste;
}
}
/**
* \class ModeleNumRefSuppliersOrders
* \brief Classe mere des modeles de numerotation des references de commandes fournisseurs
*/
class ModeleNumRefSuppliersOrders
{
var $error='';
/** \brief Return if a module can be used or not
* \return boolean true if module can be used
*/
function isEnabled()
{
return true;
}
/** \brief Renvoi la description par defaut du modele de numerotation
* \return string Texte descripif
*/
function info()
{
global $langs;
$langs->load("orders");
return $langs->trans("NoDescription");
}
/** \brief Renvoi un exemple de num<EFBFBD>rotation
* \return string Example
*/
function getExample()
{
global $langs;
$langs->load("orders");
return $langs->trans("NoExample");
}
/** \brief Test si les numeros deja en vigueur dans la base ne provoquent pas de
* de conflits qui empechera cette numerotation de fonctionner.
* \return boolean false si conflit, true si ok
*/
function canBeActivated()
{
return true;
}
/** \brief Renvoi prochaine valeur attribuee
* \return string Valeur
*/
function getNextValue()
{
global $langs;
return $langs->trans("NotAvailable");
}
/** \brief Renvoi version du module numerotation
* \return string Valeur
*/
function getVersion()
{
global $langs;
$langs->load("admin");
if ($this->version == 'development') return $langs->trans("VersionDevelopment");
if ($this->version == 'experimental') return $langs->trans("VersionExperimental");
if ($this->version == 'dolibarr') return DOL_VERSION;
return $langs->trans("NotAvailable");
}
}
/**
* Create object on disk
* @param db objet base de donnee
* @param object object supplier order
* @param model force le modele a utiliser ('' to not force)
* @param outputlangs objet lang a utiliser pour traduction
* @return int 0 si KO, 1 si OK
*/
function supplier_order_pdf_create($db, $object, $model, $outputlangs)
{
global $langs;
$langs->load("suppliers");
$dir = DOL_DOCUMENT_ROOT."/includes/modules/supplier/order/";
// Positionne modele sur le nom du modele de commande fournisseur a utiliser
if (! dol_strlen($model))
{
if (! empty($conf->global->COMMANDE_SUPPLIER_ADDON_PDF))
{
$model = $conf->global->COMMANDE_SUPPLIER_ADDON_PDF;
}
else
{
print $langs->trans("Error")." ".$langs->trans("Error_COMMANDE_SUPPLIER_ADDON_PDF_NotDefined");
return 0;
}
}
// Charge le modele
$file = "pdf_".$model.".modules.php";
if (file_exists($dir.$file))
{
$classname = "pdf_".$model;
require_once($dir.$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) > 0)
{
// on supprime l'image correspondant au preview
supplier_order_delete_preview($db, $object->id);
$outputlangs->charset_output=$sav_charset_output;
return 1;
}
else
{
$outputlangs->charset_output=$sav_charset_output;
dol_syslog("Erreur dans supplier_order_pdf_create");
dol_print_error($db,$obj->error);
return 0;
}
}
else
{
print $langs->trans("Error")." ".$langs->trans("ErrorFileDoesNotExists",$dir.$file);
return 0;
}
}
/**
* Enter description here...
*
* @param $db
* @param $propalid
* @return int
*/
function supplier_order_delete_preview($db, $objectid)
{
global $langs,$conf;
$comfourn = new CommandeFournisseur($db,"",$objectid);
$comfourn->fetch($objectid);
$client = new Societe($db);
$client->fetch($comfourn->socid);
if ($conf->fournisseur->dir_output.'/commande')
{
$comfournref = dol_sanitizeFileName($comfourn->ref);
$dir = $conf->commande->dir_output . "/" . $comfournref ;
$file = $dir . "/" . $comfournref . ".pdf.png";
if ( file_exists( $file ) && is_writable( $file ) )
{
if ( ! dol_delete_file($file) )
{
$this->error=$langs->trans("ErrorFailedToOpenFile",$file);
return 0;
}
}
}
return 1;
}
?>

View File

@ -0,0 +1,718 @@
<?php
/* Copyright (C) 2004-2009 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2009 Regis Houssin <regis@dolibarr.fr>
* Copyright (C) 2007 Franky Van Liedekerke <franky.van.liedekerke@telenet.be>
* Copyright (C) 2010 Juanjo Menent <jmenent@2byte.es>
*
* 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.
* or see http://www.gnu.org/
*/
/**
* \file htdocs/includes/modules/supplier/order/pdf_muscadet.modules.php
* \ingroup fournisseur
* \brief Fichier de la classe permettant de generer les commandes fournisseurs au modele Muscadet
* \version $Id$
*/
require_once(DOL_DOCUMENT_ROOT."/includes/modules/supplier/order/modules_commandefournisseur.php");
require_once(DOL_DOCUMENT_ROOT."/fourn/class/fournisseur.commande.class.php");
require_once(DOL_DOCUMENT_ROOT."/product/class/product.class.php");
require_once(DOL_DOCUMENT_ROOT."/lib/company.lib.php");
/**
* \class pdf_muscadet
* \brief Classe permettant de generer les commandes fournisseurs au modele Muscadet
*/
class pdf_muscadet extends ModelePDFSuppliersOrders
{
/**
* \brief Constructeur
* \param db Handler acces base de donnee
*/
function pdf_muscadet($db)
{
global $conf,$langs,$mysoc;
$langs->load("main");
$langs->load("bills");
$this->db = $db;
$this->name = "muscadet";
$this->description = $langs->trans('SuppliersCommandModel');
// Dimension page pour format A4
$this->type = 'pdf';
$this->page_largeur = 210;
$this->page_hauteur = 297;
$this->format = array($this->page_largeur,$this->page_hauteur);
$this->marge_gauche=10;
$this->marge_droite=10;
$this->marge_haute=10;
$this->marge_basse=10;
$this->option_logo = 1; // Affiche logo
$this->option_tva = 1; // Gere option tva FACTURE_TVAOPTION
$this->option_modereg = 1; // Affiche mode reglement
$this->option_condreg = 1; // Affiche conditions reglement
$this->option_codeproduitservice = 1; // Affiche code produit-service
$this->option_multilang = 1; // Dispo en plusieurs langues
$this->franchise=!$mysoc->tva_assuj;
// Recupere emmetteur
$this->emetteur=$mysoc;
if (! $this->emetteur->pays_code) $this->emetteur->pays_code=substr($langs->defaultlang,-2); // Par defaut, si n'etait pas defini
// Defini position des colonnes
$this->posxdesc=$this->marge_gauche+1;
$this->posxtva=121;
$this->posxup=132;
$this->posxqty=151;
$this->posxdiscount=162;
$this->postotalht=177;
$this->tva=array();
$this->atleastoneratenotnull=0;
$this->atleastonediscount=0;
}
/**
* \brief Fonction generant la commande sur le disque
* \param id Id de la commande a generer
* \param outputlangs Lang output object
* \return int 1=ok, 0=ko
*/
function write_file($object,$outputlangs='')
{
global $user,$langs,$conf;
if (! is_object($outputlangs)) $outputlangs=$langs;
// Force output charset to ISO, because, FPDF expect text encoded in ISO
$outputlangs->charset_output='ISO-8859-1';
$outputlangs->load("main");
$outputlangs->load("dict");
$outputlangs->load("companies");
$outputlangs->load("bills");
$outputlangs->load("products");
$outputlangs->load("orders");
if ($conf->fournisseur->dir_output.'/commande')
{
$deja_regle = "";
// Definition de $dir et $file
if ($object->specimen)
{
$dir = $conf->fournisseur->dir_output.'/commande';
$file = $dir . "/SPECIMEN.pdf";
}
else
{
$objectref = dol_sanitizeFileName($object->ref);
$dir = $conf->fournisseur->dir_output . "/commande/" . $objectref;
$file = $dir . "/" . $objectref . ".pdf";
}
if (! file_exists($dir))
{
if (create_exdir($dir) < 0)
{
$this->error=$langs->trans("ErrorCanNotCreateDir",$dir);
return 0;
}
}
if (file_exists($dir))
{
$nblignes = sizeof($object->lines);
// Protection et encryption du pdf
if ($conf->global->PDF_SECURITY_ENCRYPTION)
{
$pdf=new FPDI_Protection('P','mm',$this->format);
$pdfrights = array('print'); // Ne permet que l'impression du document
$pdfuserpass = ''; // Mot de passe pour l'utilisateur final
$pdfownerpass = NULL; // Mot de passe du proprietaire, cree aleatoirement si pas defini
$pdf->SetProtection($pdfrights,$pdfuserpass,$pdfownerpass);
}
else
{
$pdf=new FPDI('P','mm',$this->format);
}
if (class_exists('TCPDF'))
{
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
}
$pdf->SetFont('Helvetica');
$pdf->Open();
$pagenb=0;
$pdf->SetDrawColor(128,128,128);
$pdf->SetTitle($outputlangs->convToOutputCharset($object->ref));
$pdf->SetSubject($outputlangs->transnoentities("Order"));
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("Order"));
if ($conf->global->MAIN_DISABLE_PDF_COMPRESSION) $pdf->SetCompression(false);
$pdf->SetMargins($this->marge_gauche, $this->marge_haute, $this->marge_droite); // Left, Top, Right
$pdf->SetAutoPageBreak(1,0);
// Positionne $this->atleastonediscount si on a au moins une remise
for ($i = 0 ; $i < $nblignes ; $i++)
{
if ($object->lines[$i]->remise_percent)
{
$this->atleastonediscount++;
}
}
// New page
$pdf->AddPage();
$pagenb++;
$this->_pagehead($pdf, $object, 1, $outputlangs);
$pdf->SetFont('','', 9);
$pdf->MultiCell(0, 3, '', 0, 'J'); // Set interline to 3
$pdf->SetTextColor(0,0,0);
$tab_top = 90;
$tab_top_newpage = 50;
$tab_height = 110;
$tab_height_newpage = 150;
// Affiche notes
if (! empty($object->note_public))
{
$tab_top = 88;
$pdf->SetFont('','', 9); // Dans boucle pour gerer multi-page
$pdf->SetXY ($this->posxdesc-1, $tab_top);
$pdf->MultiCell(190, 3, $outputlangs->convToOutputCharset($object->note_public), 0, 'J');
$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;
// Boucle sur les lignes
for ($i = 0 ; $i < $nblignes ; $i++)
{
$curY = $nexY;
// Description de la ligne produit
//$libelleproduitservice=pdf_getlinedesc($object,$i,$outputlangs,0,0,1);
$pdf->SetFont('','', 9); // Dans boucle pour gerer multi-page
pdf_getlinedesc($pdf,$object,$i,$outputlangs,108,3,$this->posxdesc-1,$curY,0,0,1);
//$pdf->writeHTMLCell(108, 3, $this->posxdesc-1, $curY, $outputlangs->convToOutputCharset($libelleproduitservice), 0, 1);
$pdf->SetFont('','', 9); // On repositionne la police par defaut
$nexY = $pdf->GetY();
// TVA
$pdf->SetXY ($this->posxtva, $curY);
$pdf->MultiCell(10, 3, ($object->lines[$i]->tva_tx < 0 ? '*':'').abs($object->lines[$i]->tva_tx), 0, 'R');
// Unit price before discount
$pdf->SetXY ($this->posxup, $curY);
$pdf->MultiCell(18, 3, price($object->lines[$i]->subprice), 0, 'R', 0);
// Quantity
$pdf->SetXY ($this->posxqty, $curY);
$pdf->MultiCell(10, 3, $object->lines[$i]->qty, 0, 'R');
// Discount on line
$pdf->SetXY ($this->posxdiscount, $curY);
if ($object->lines[$i]->remise_percent)
{
$pdf->MultiCell(14, 3, $object->lines[$i]->remise_percent."%", 0, 'R');
}
// Total HT line
$pdf->SetXY ($this->postotalht, $curY);
$total = price($object->lines[$i]->total_ht);
$pdf->MultiCell(23, 3, $total, 0, 'R', 0);
// Collecte des totaux par valeur de tva dans $this->tva["taux"]=total_tva
$tvaligne=$object->lines[$i]->total_tva;
if ($object->remise_percent) $tvaligne-=($tvaligne*$object->remise_percent)/100;
$vatrate=(string) $object->lines[$i]->tva_tx;
if (($object->lines[$i]->info_bits & 0x01) == 0x01) $vatrate.='*';
$this->tva[$vatrate] += $tvaligne;
$nexY+=2; // Passe espace entre les lignes
// Test if a new page is required
if ($pagenb == 1)
{
$tab_top_in_current_page=$tab_top;
$tab_height_in_current_page=$tab_height;
}
else
{
$tab_top_in_current_page=$tab_top_newpage;
$tab_height_in_current_page=$tab_height_newpage;
}
if (($nexY+$nblineFollowDesc) > ($tab_top_in_current_page+$tab_height_in_current_page) && $i < ($nblignes - 1))
{
if ($pagenb == 1)
{
$this->_tableau($pdf, $tab_top, $tab_height + 20, $nexY, $outputlangs);
}
else
{
$this->_tableau($pdf, $tab_top_newpage, $tab_height_newpage, $nexY, $outputlangs);
}
$this->_pagefoot($pdf, $object, $outputlangs);
// New page
$pdf->AddPage();
$pagenb++;
$this->_pagehead($pdf, $object, 0, $outputlangs);
$pdf->SetFont('','', 9);
$pdf->MultiCell(0, 3, '', 0, 'J'); // Set interline to 3
$pdf->SetTextColor(0,0,0);
$nexY = $tab_top_newpage + 7;
}
}
// Show square
if ($pagenb == 1)
{
$this->_tableau($pdf, $tab_top, $tab_height, $nexY, $outputlangs);
$bottomlasttab=$tab_top + $tab_height + 1;
}
else
{
$this->_tableau($pdf, $tab_top_newpage, $tab_height_newpage, $nexY, $outputlangs);
$bottomlasttab=$tab_top_newpage + $tab_height_newpage + 1;
}
$posy=$this->_tableau_tot($pdf, $object, $deja_regle, $bottomlasttab, $outputlangs);
if ($deja_regle)
{
$this->_tableau_versements($pdf, $fac, $posy);
}
/*
* Mode de reglement
*/
if ((! defined("FACTURE_CHQ_NUMBER") || ! FACTURE_CHQ_NUMBER) && (! defined("FACTURE_RIB_NUMBER") || ! FACTURE_RIB_NUMBER))
{
$pdf->SetXY ($this->marge_gauche, 228);
$pdf->SetTextColor(200,0,0);
$pdf->SetFont('','B',8);
$pdf->MultiCell(90, 3, $outputlangs->transnoentities("ErrorNoPaiementModeConfigured"),0,'L',0);
$pdf->MultiCell(90, 3, $outputlangs->transnoentities("ErrorCreateBankAccount"),0,'L',0);
$pdf->SetTextColor(0,0,0);
}
/*
* Pied de page
*/
$this->_pagefoot($pdf, $object, $outputlangs);
$pdf->AliasNbPages();
$pdf->Close();
$pdf->Output($file,'F');
if (! empty($conf->global->MAIN_UMASK))
@chmod($file, octdec($conf->global->MAIN_UMASK));
return 1; // Pas d'erreur
}
else
{
$this->error=$langs->trans("ErrorCanNotCreateDir",$dir);
return 0;
}
}
else
{
$this->error=$langs->trans("ErrorConstantNotDefined","SUPPLIER_OUTPUTDIR");
return 0;
}
$this->error=$langs->trans("ErrorUnknown");
return 0; // Erreur par defaut
}
/**
* \brief Affiche le total a payer
* \param pdf Objet PDF
* \param object Objet order
* \param deja_regle Montant deja regle
* \return y Position pour suite
*/
function _tableau_tot(&$pdf, $object, $deja_regle, $posy, $outputlangs)
{
$tab2_top = $posy;
$tab2_hl = 5;
$tab2_height = $tab2_hl * 4;
$pdf->SetFont('','', 9);
$pdf->SetXY ($this->marge_gauche, $tab2_top + 0);
// If France, show VAT mention if not applicable
if ($this->emetteur->pays_code == 'FR' && $this->franchise == 1)
{
$pdf->MultiCell(100, $tab2_hl, "* TVA non applicable art-293B du CGI", 0, 'L', 0);
}
// Tableau total
$lltot = 200; $col1x = 120; $col2x = 182; $largcol2 = $lltot - $col2x;
// Total HT
$pdf->SetFillColor(255,255,255);
$pdf->SetXY ($col1x, $tab2_top + 0);
$pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalHT"), 0, 'L', 1);
$pdf->SetXY ($col2x, $tab2_top + 0);
$pdf->MultiCell($largcol2, $tab2_hl, price($object->total_ht + $object->remise), 0, 'R', 1);
// Remise globale
if ($object->remise > 0)
{
$pdf->SetXY ($col1x, $tab2_top + $tab2_hl);
$pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("GlobalDiscount"), 0, 'L', 1);
$pdf->SetXY ($col2x, $tab2_top + $tab2_hl);
$pdf->MultiCell($largcol2, $tab2_hl, "-".$object->remise_percent."%", 0, 'R', 1);
$pdf->SetXY ($col1x, $tab2_top + $tab2_hl * 2);
$pdf->MultiCell($col2x-$col1x, $tab2_hl, "Total HT apres remise", 0, 'L', 1);
$pdf->SetXY ($col2x, $tab2_top + $tab2_hl * 2);
$pdf->MultiCell($largcol2, $tab2_hl, price($object->total_ht), 0, 'R', 0);
$index = 2;
}
else
{
$index = 0;
}
// Affichage des totaux de TVA par taux (conformement a reglementation)
$pdf->SetFillColor(248,248,248);
foreach( $this->tva as $tvakey => $tvaval )
{
if ($tvakey) // On affiche pas taux 0
{
$this->atleastoneratenotnull++;
$index++;
$pdf->SetXY ($col1x, $tab2_top + $tab2_hl * $index);
$tvacompl='';
if (preg_match('/\*/',$tvakey))
{
$tvakey=str_replace('*','',$tvakey);
$tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")";
}
$totalvat =$outputlangs->transnoentities("TotalVAT").' ';
$totalvat.=vatrate($tvakey,1).$tvacompl;
$pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1);
$pdf->SetXY ($col2x, $tab2_top + $tab2_hl * $index);
$pdf->MultiCell($largcol2, $tab2_hl, price($tvaval), 0, 'R', 1);
}
}
if (! $this->atleastoneratenotnull) // If not vat at all
{
$index++;
$pdf->SetXY ($col1x, $tab2_top + $tab2_hl * $index);
$pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalVAT"), 0, 'L', 1);
$pdf->SetXY ($col2x, $tab2_top + $tab2_hl * $index);
$pdf->MultiCell($largcol2, $tab2_hl, price($object->total_tva), 0, 'R', 1);
}
$useborder=0;
$index++;
$pdf->SetXY ($col1x, $tab2_top + $tab2_hl * $index);
$pdf->SetTextColor(0,0,60);
$pdf->SetFillColor(224,224,224);
$pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalTTC"), $useborder, 'L', 1);
$pdf->SetXY ($col2x, $tab2_top + $tab2_hl * $index);
$pdf->MultiCell($largcol2, $tab2_hl, price($object->total_ttc), $useborder, 'R', 1);
$pdf->SetFont('','', 9);
$pdf->SetTextColor(0,0,0);
if ($deja_regle > 0)
{
$index++;
$pdf->SetXY ($col1x, $tab2_top + $tab2_hl * $index);
$pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("AlreadyPaid"), 0, 'L', 0);
$pdf->SetXY ($col2x, $tab2_top + $tab2_hl * $index);
$pdf->MultiCell($largcol2, $tab2_hl, price($deja_regle), 0, 'R', 0);
$index++;
$pdf->SetTextColor(0,0,60);
//$pdf->SetFont('','B', 9);
$pdf->SetXY ($col1x, $tab2_top + $tab2_hl * $index);
$pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("RemainderToPay"), $useborder, 'L', 1);
$pdf->SetXY ($col2x, $tab2_top + $tab2_hl * $index);
$pdf->MultiCell($largcol2, $tab2_hl, price($object->total_ttc - $deja_regle), $useborder, 'R', 1);
$pdf->SetFont('','', 9);
$pdf->SetTextColor(0,0,0);
}
$index++;
return ($tab2_top + ($tab2_hl * $index));
}
/**
* \brief Affiche la grille des lignes de propales
* \param pdf objet PDF
*/
function _tableau(&$pdf, $tab_top, $tab_height, $nexY, $outputlangs)
{
global $conf;
// Montants exprimes en (en tab_top - 1
$pdf->SetTextColor(0,0,0);
$pdf->SetFont('','',8);
$titre = $outputlangs->transnoentities("AmountInCurrency",$outputlangs->transnoentitiesnoconv("Currency".$conf->monnaie));
$pdf->Text($this->page_largeur - $this->marge_droite - $pdf->GetStringWidth($titre), $tab_top-1, $titre);
$pdf->SetDrawColor(128,128,128);
// Rect prend une longueur en 3eme param
$pdf->Rect($this->marge_gauche, $tab_top, $this->page_largeur-$this->marge_gauche-$this->marge_droite, $tab_height);
// line prend une position y en 3eme param
$pdf->line($this->marge_gauche, $tab_top+6, $this->page_largeur-$this->marge_droite, $tab_top+6);
$pdf->SetFont('','',10);
$pdf->SetXY ($this->posxdesc-1, $tab_top+2);
$pdf->MultiCell(108,2, $outputlangs->transnoentities("Designation"),'','L');
$pdf->line($this->posxtva-1, $tab_top, $this->posxtva-1, $tab_top + $tab_height);
$pdf->SetXY ($this->posxtva-1, $tab_top+2);
$pdf->MultiCell(12,2, $outputlangs->transnoentities("VAT"),'','C');
$pdf->line($this->posxup-1, $tab_top, $this->posxup-1, $tab_top + $tab_height);
$pdf->SetXY ($this->posxup-1, $tab_top+2);
$pdf->MultiCell(18,2, $outputlangs->transnoentities("PriceUHT"),'','C');
$pdf->line($this->posxqty-1, $tab_top, $this->posxqty-1, $tab_top + $tab_height);
$pdf->SetXY ($this->posxqty-1, $tab_top+2);
$pdf->MultiCell(11,2, $outputlangs->transnoentities("Qty"),'','C');
$pdf->line($this->posxdiscount-1, $tab_top, $this->posxdiscount-1, $tab_top + $tab_height);
if ($this->atleastonediscount)
{
$pdf->SetXY ($this->posxdiscount-1, $tab_top+2);
$pdf->MultiCell(16,2, $outputlangs->transnoentities("ReductionShort"),'','C');
}
if ($this->atleastonediscount)
{
$pdf->line($this->postotalht, $tab_top, $this->postotalht, $tab_top + $tab_height);
}
$pdf->SetXY ($this->postotalht-1, $tab_top+2);
$pdf->MultiCell(23,2, $outputlangs->transnoentities("TotalHTShort"),'','C');
}
/**
* \brief Show header of page
* \param pdf Object PDF
* \param object Object invoice
* \param showadress 0=no, 1=yes
* \param outputlangs Object lang for output
*/
function _pagehead(&$pdf, $object, $showadress=1, $outputlangs)
{
global $langs,$conf,$mysoc;
$outputlangs->load("main");
$outputlangs->load("bills");
$outputlangs->load("orders");
$outputlangs->load("companies");
// Do not add the BACKGROUND as this is for suppliers
//pdf_pagehead($pdf,$outputlangs,$this->page_hauteur);
$pdf->SetTextColor(0,0,60);
$pdf->SetFont('','B',13);
$posy=$this->marge_haute;
$pdf->SetXY($this->marge_gauche,$posy);
// Logo
$logo=$conf->mycompany->dir_output.'/logos/'.$mysoc->logo;
if ($mysoc->logo)
{
if (is_readable($logo))
{
$pdf->Image($logo, $this->marge_gauche, $posy, 0, 24);
}
else
{
$pdf->SetTextColor(200,0,0);
$pdf->SetFont('','B',8);
$pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorLogoFileNotFound",$logo), 0, 'L');
$pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorGoToModuleSetup"), 0, 'L');
}
}
else
{
$text=$this->emetteur->nom;
$pdf->MultiCell(100, 4, $outputlangs->convToOutputCharset($text), 0, 'L');
}
$pdf->SetFont('','B',13);
$pdf->SetXY(100,$posy);
$pdf->SetTextColor(0,0,60);
$pdf->MultiCell(100, 4, $outputlangs->transnoentities("SupplierOrder")." ".$outputlangs->convToOutputCharset($object->ref), '' , 'R');
$pdf->SetFont('','',12);
$posy+=6;
$pdf->SetXY(100,$posy);
if ($object->date_commande)
{
$pdf->SetTextColor(0,0,60);
$pdf->MultiCell(100, 4, $outputlangs->transnoentities("Date")." : " . dol_print_date($object->date_commande,"day",false,$outputlangs,true), '', 'R');
}
else
{
$pdf->SetTextColor(255,0,0);
$pdf->MultiCell(100, 4, strtolower($outputlangs->transnoentities("OrderToProcess")), '', 'R');
}
if ($showadress)
{
// Receive email
$posy=42;
$hautcadre=40;
$pdf->SetTextColor(0,0,0);
$pdf->SetFont('','',8);
$pdf->SetXY($this->marge_gauche,$posy-5);
$pdf->MultiCell(66,5, $outputlangs->transnoentities("BillTo").":");
$pdf->SetXY($this->marge_gauche,$posy);
$pdf->SetFillColor(230,230,230);
$pdf->MultiCell(82, $hautcadre, "", 0, 'R', 1);
// Nom emetteur
$carac_emetteur_name=$outputlangs->convToOutputCharset($mysoc->nom);
$pdf->SetTextColor(0,0,60);
$pdf->SetFont('','B',10);
$pdf->SetXY($this->marge_gauche+2,$posy+3);
$pdf->MultiCell(80, 4, $carac_emetteur_name, 0, 'L');
// Sender properties
$carac_emetteur = pdf_build_address($outputlangs,$mysoc);
$pdf->SetFont('','',9);
$pdf->SetXY($this->marge_gauche+2,$posy+8);
$pdf->MultiCell(80, 4, $carac_emetteur);
// Client destinataire
$posy=42;
$pdf->SetTextColor(0,0,0);
$pdf->SetFont('','',8);
$pdf->SetXY(100,$posy-5);
$pdf->MultiCell(96, 4, $outputlangs->transnoentities("Supplier").":");
//
$client = new Societe($this->db);
$client->fetch($object->socid);
$object->client = $client;
//
// Cadre client destinataire
$pdf->rect(100, $posy, 100, $hautcadre);
// Recipient name
if (! empty($usecontact))
{
// On peut utiliser le nom de la societe du contact
if ($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,$object->contact,$usecontact,'target');
// Show customer/recipient
$pdf->SetXY(102,$posy+3);
$pdf->SetFont('','B',10);
$pdf->MultiCell(96,4, $carac_client_name, 0, 'L');
$pdf->SetFont('','',9);
$pdf->SetXY(102,$posy+8);
$pdf->MultiCell(96,4, $carac_client);
}
}
/**
* \brief Show footer of page
* \param pdf PDF factory
* \param object Object invoice
* \param outputlang Object lang for output
* \remarks Need this->emetteur object
*/
function _pagefoot(&$pdf, $object, $outputlangs)
{
return pdf_pagefoot($pdf,$outputlangs,'FACTURESUPPLIER_FREE_TEXT',$this->emetteur,$this->marge_basse,$this->marge_gauche,$this->page_hauteur,$object);
}
}
?>