2009-01-28 16:09:37 +01:00
< ? php
/* Copyright ( C ) 2006 - 2008 Laurent Destailleur < eldy @ users . sourceforge . net >
* Copyright ( C ) 2006 Rodolphe Quiedeville < rodolphe @ quiedeville . org >
* Copyright ( C ) 2007 Patrick Raguin < patrick . raguin @ gmail . 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
* 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 /
*/
/**
2009-06-15 20:57:34 +02:00
* \file htdocs / lib / pdf . lib . php
* \brief Set of functions used for PDF generation
* \ingroup core
2009-01-28 16:09:37 +01:00
* \version $Id $
*/
2009-06-15 20:57:34 +02:00
/**
* \brief Show header of page for PDF generation
* \param pdf Object PDF
* \param outputlang Object lang for output
* \param page_height
*/
function pdf_pagehead ( & $pdf , $outputlangs , $page_height )
{
global $conf ;
// Add a background image on document
if ( ! empty ( $conf -> global -> MAIN_USE_BACKGROUND_ON_PDF ))
{
2009-07-02 02:16:50 +02:00
$pdf -> Image ( $conf -> mycompany -> dir_output . '/logos/' . $conf -> global -> MAIN_USE_BACKGROUND_ON_PDF , 0 , 0 , 0 , $page_height );
2009-06-15 20:57:34 +02:00
}
}
2009-01-28 16:09:37 +01:00
/**
* \brief Show bank informations for PDF generation
*/
function pdf_bank ( & $pdf , $outputlangs , $curx , $cury , $account )
{
$pdf -> SetXY ( $curx , $cury );
$pdf -> SetFont ( 'Arial' , 'B' , 8 );
$pdf -> MultiCell ( 100 , 3 , $outputlangs -> transnoentities ( 'PaymentByTransferOnThisBankAccount' ) . ':' , 0 , 'L' , 0 );
$cury += 4 ;
$usedetailedbban = $account -> useDetailedBBAN ();
if ( $usedetailedbban )
{
$pdf -> SetFont ( 'Arial' , 'B' , 6 );
$pdf -> line ( $curx + 1 , $cury , $curx + 1 , $cury + 10 );
$pdf -> SetXY ( $curx , $cury );
$pdf -> MultiCell ( 18 , 3 , $outputlangs -> transnoentities ( " BankCode " ), 0 , 'C' , 0 );
$pdf -> line ( $curx + 18 , $cury , $curx + 18 , $cury + 10 );
$pdf -> SetXY ( $curx + 18 , $cury );
$pdf -> MultiCell ( 18 , 3 , $outputlangs -> transnoentities ( " DeskCode " ), 0 , 'C' , 0 );
$pdf -> line ( $curx + 36 , $cury , $curx + 36 , $cury + 10 );
$pdf -> SetXY ( $curx + 36 , $cury );
$pdf -> MultiCell ( 24 , 3 , $outputlangs -> transnoentities ( " BankAccountNumber " ), 0 , 'C' , 0 );
$pdf -> line ( $curx + 60 , $cury , $curx + 60 , $cury + 10 );
$pdf -> SetXY ( $curx + 60 , $cury );
$pdf -> MultiCell ( 13 , 3 , $outputlangs -> transnoentities ( " BankAccountNumberKey " ), 0 , 'C' , 0 );
$pdf -> line ( $curx + 73 , $cury , $curx + 73 , $cury + 10 );
$pdf -> SetFont ( 'Arial' , '' , 8 );
$pdf -> SetXY ( $curx , $cury + 6 );
$pdf -> MultiCell ( 18 , 3 , $outputlangs -> convToOutputCharset ( $account -> code_banque ), 0 , 'C' , 0 );
$pdf -> SetXY ( $curx + 18 , $cury + 6 );
$pdf -> MultiCell ( 18 , 3 , $outputlangs -> convToOutputCharset ( $account -> code_guichet ), 0 , 'C' , 0 );
$pdf -> SetXY ( $curx + 36 , $cury + 6 );
$pdf -> MultiCell ( 24 , 3 , $outputlangs -> convToOutputCharset ( $account -> number ), 0 , 'C' , 0 );
$pdf -> SetXY ( $curx + 60 , $cury + 6 );
$pdf -> MultiCell ( 13 , 3 , $outputlangs -> convToOutputCharset ( $account -> cle_rib ), 0 , 'C' , 0 );
}
else
{
$pdf -> SetFont ( 'Arial' , 'B' , 6 );
$pdf -> SetXY ( $curx , $cury );
$pdf -> MultiCell ( 90 , 3 , $outputlangs -> transnoentities ( " BankAccountNumber " ) . ': ' . $outputlangs -> convToOutputCharset ( $account -> number ), 0 , 'L' , 0 );
$cury -= 9 ;
}
$pdf -> SetXY ( $curx , $cury + 12 );
$pdf -> MultiCell ( 90 , 3 , $outputlangs -> transnoentities ( " Residence " ) . ': ' . $outputlangs -> convToOutputCharset ( $account -> domiciliation ), 0 , 'L' , 0 );
$pdf -> SetXY ( $curx , $cury + 22 );
$pdf -> MultiCell ( 90 , 3 , $outputlangs -> transnoentities ( " IBANNumber " ) . ': ' . $outputlangs -> convToOutputCharset ( $account -> iban ), 0 , 'L' , 0 );
$pdf -> SetXY ( $curx , $cury + 25 );
$pdf -> MultiCell ( 90 , 3 , $outputlangs -> transnoentities ( " BICNumber " ) . ': ' . $outputlangs -> convToOutputCharset ( $account -> bic ), 0 , 'L' , 0 );
return $pdf -> getY ();
}
/**
* \brief Show footer of page for PDF generation
2009-08-25 15:37:29 +02:00
* \param pdf The PDF factory
2009-01-28 16:09:37 +01:00
* \param outputlang Object lang for output
* \param paramfreetext Constant name of free text
* \param fromcompany Object company
2009-08-25 15:37:29 +02:00
* \param marge_basse Margin bottom
* \param marge_gauche Margin left
* \param page_hauteur Page height
* \param object Object shown in PDF
2009-01-28 16:09:37 +01:00
*/
2009-08-25 15:37:29 +02:00
function pdf_pagefoot ( & $pdf , $outputlangs , $paramfreetext , $fromcompany , $marge_basse , $marge_gauche , $page_hauteur , $object )
2009-01-28 16:09:37 +01:00
{
2009-08-25 22:57:54 +02:00
global $conf , $user ;
2009-01-28 16:09:37 +01:00
$outputlangs -> load ( " dict " );
2009-08-25 15:37:29 +02:00
$ligne = '' ;
2009-01-28 16:09:37 +01:00
// Line of free text
2009-08-25 15:37:29 +02:00
if ( ! empty ( $conf -> global -> $paramfreetext ))
{
// Make substitution
$substitutionarray = array (
'__FROM_NAME__' => $fromcompany -> nom ,
'__FROM_EMAIL__' => $fromcompany -> email ,
'__TOTAL_TTC__' => $object -> total_ttc ,
'__TOTAL_HT__' => $object -> total_ht ,
'__TOTAL_VAT__' => $object -> total_vat
);
2009-08-25 22:57:54 +02:00
$newfreetext = make_substitutions ( $conf -> global -> $paramfreetext , $substitutionarray , $outputlangs , $object );
2009-08-25 15:37:29 +02:00
$ligne .= $outputlangs -> convToOutputCharset ( $newfreetext );
}
2009-01-28 16:09:37 +01:00
// First line of company infos
// Juridical status
$ligne1 = " " ;
if ( $fromcompany -> forme_juridique_code )
{
$ligne1 .= ( $ligne1 ? " - " : " " ) . $outputlangs -> convToOutputCharset ( getFormeJuridiqueLabel ( $fromcompany -> forme_juridique_code ));
}
// Capital
if ( $fromcompany -> capital )
{
$ligne1 .= ( $ligne1 ? " - " : " " ) . $outputlangs -> transnoentities ( " CapitalOf " , $fromcompany -> capital ) . " " . $outputlangs -> transnoentities ( " Currency " . $conf -> monnaie );
}
// Prof Id 1
if ( $fromcompany -> profid1 && ( $fromcompany -> pays_code != 'FR' || ! $fromcompany -> profid2 ))
{
$field = $outputlangs -> transcountrynoentities ( " ProfId1 " , $fromcompany -> pays_code );
2009-10-23 21:03:01 +02:00
if ( preg_match ( '/\((.*)\)/i' , $field , $reg )) $field = $reg [ 1 ];
2009-01-28 16:09:37 +01:00
$ligne1 .= ( $ligne1 ? " - " : " " ) . $field . " : " . $outputlangs -> convToOutputCharset ( $fromcompany -> profid1 );
}
// Prof Id 2
if ( $fromcompany -> profid2 )
{
$field = $outputlangs -> transcountrynoentities ( " ProfId2 " , $fromcompany -> pays_code );
2009-10-23 21:03:01 +02:00
if ( preg_match ( '/\((.*)\)/i' , $field , $reg )) $field = $reg [ 1 ];
2009-01-28 16:09:37 +01:00
$ligne1 .= ( $ligne1 ? " - " : " " ) . $field . " : " . $outputlangs -> convToOutputCharset ( $fromcompany -> profid2 );
}
// Second line of company infos
$ligne2 = " " ;
// Prof Id 3
if ( $fromcompany -> profid3 )
{
$field = $outputlangs -> transcountrynoentities ( " ProfId3 " , $fromcompany -> pays_code );
2009-10-23 21:03:01 +02:00
if ( preg_match ( '/\((.*)\)/i' , $field , $reg )) $field = $reg [ 1 ];
2009-01-28 16:09:37 +01:00
$ligne2 .= ( $ligne2 ? " - " : " " ) . $field . " : " . $outputlangs -> convToOutputCharset ( $fromcompany -> profid3 );
}
// Prof Id 4
if ( $fromcompany -> profid4 )
{
$field = $outputlangs -> transcountrynoentities ( " ProfId4 " , $fromcompany -> pays_code );
2009-10-23 21:03:01 +02:00
if ( preg_match ( '/\((.*)\)/i' , $field , $reg )) $field = $reg [ 1 ];
2009-01-28 16:09:37 +01:00
$ligne2 .= ( $ligne2 ? " - " : " " ) . $field . " : " . $outputlangs -> convToOutputCharset ( $fromcompany -> profid4 );
}
// IntraCommunautary VAT
if ( $fromcompany -> tva_intra != '' )
{
$ligne2 .= ( $ligne2 ? " - " : " " ) . $outputlangs -> transnoentities ( " VATIntraShort " ) . " : " . $outputlangs -> convToOutputCharset ( $fromcompany -> tva_intra );
}
$pdf -> SetFont ( 'Arial' , '' , 7 );
$pdf -> SetDrawColor ( 224 , 224 , 224 );
// On positionne le debut du bas de page selon nbre de lignes de ce bas de page
2009-08-25 15:37:29 +02:00
$nbofligne = dol_nboflines_bis ( $ligne , 0 , $outputlangs -> charset_output );
2009-08-02 19:40:13 +02:00
//print 'nbofligne='.$nbofligne; exit;
2009-01-28 16:09:37 +01:00
//print 'e'.$ligne.'t'.dol_nboflines($ligne);exit;
2009-08-02 19:40:13 +02:00
$posy = $marge_basse + ( $nbofligne * 3 ) + ( $ligne1 ? 3 : 0 ) + ( $ligne2 ? 3 : 0 );
2009-01-28 16:09:37 +01:00
2009-02-07 01:38:29 +01:00
if ( $ligne ) // Free text
2009-01-28 16:09:37 +01:00
{
2009-08-02 19:40:13 +02:00
$pdf -> SetXY ( $marge_gauche , - $posy );
$width = 20000 ; $align = 'L' ; // By default, ask a manual break: We use a large value 20000, to not have automatic wrap. This make user understand, he need to add CR on its text.
if ( $conf -> global -> MAIN_USE_AUTOWRAP_ON_FREETEXT ) { $width = 200 ; $align = 'C' ; }
2009-08-25 15:37:29 +02:00
$pdf -> MultiCell ( $width , 3 , $ligne , 0 , $align , 0 );
2009-08-02 19:40:13 +02:00
$posy -= ( $nbofligne * 3 ); // 6 of ligne + 3 of MultiCell
2009-01-28 16:09:37 +01:00
}
$pdf -> SetY ( - $posy );
$pdf -> line ( $marge_gauche , $page_hauteur - $posy , 200 , $page_hauteur - $posy );
$posy -- ;
if ( $ligne1 )
{
2009-08-02 19:40:13 +02:00
$pdf -> SetXY ( $marge_gauche , - $posy );
2009-01-28 16:09:37 +01:00
$pdf -> MultiCell ( 200 , 2 , $ligne1 , 0 , 'C' , 0 );
}
if ( $ligne2 )
{
$posy -= 3 ;
2009-08-02 19:40:13 +02:00
$pdf -> SetXY ( $marge_gauche , - $posy );
2009-01-28 16:09:37 +01:00
$pdf -> MultiCell ( 200 , 2 , $ligne2 , 0 , 'C' , 0 );
}
$pdf -> SetXY ( - 20 , - $posy );
$pdf -> MultiCell ( 11 , 2 , $pdf -> PageNo () . '/{nb}' , 0 , 'R' , 0 );
}
/**
2009-07-04 13:55:45 +02:00
* \brief Return line description translated in outputlangs and encoded in UTF8
* \param line Line to format
* \param outputlang Object lang for output
2009-07-23 09:51:23 +02:00
* \param hideref Hide reference
2009-07-23 09:51:23 +02:00
* \param hidedesc Hide description
2009-07-04 13:55:45 +02:00
* \param issupplierline Is it a line for a supplier object ?
2009-01-28 16:09:37 +01:00
*/
2009-07-23 09:51:23 +02:00
function pdf_getlinedesc ( $line , $outputlangs , $hideref = 0 , $hidedesc = 0 , $issupplierline = 0 )
2009-01-28 16:09:37 +01:00
{
2009-01-28 16:37:10 +01:00
global $db , $conf , $langs ;
2009-01-28 16:09:37 +01:00
2009-07-04 13:55:45 +02:00
$idprod = $line -> fk_product ; if ( empty ( $idprod )) $idprod = $line -> produit_id ;
$label = $line -> label ; if ( empty ( $label )) $label = $line -> libelle ;
$desc = $line -> desc ; if ( empty ( $desc )) $desc = $line -> description ;
$ref_supplier = $line -> ref_supplier ; if ( empty ( $ref_supplier )) $ref_supplier = $line -> ref_fourn ; // TODO Not yeld saved for supplier invoices, only supplier orders
2009-01-28 16:37:10 +01:00
$note = $line -> note ;
2009-01-28 16:09:37 +01:00
2009-07-04 13:55:45 +02:00
if ( $issupplierline ) $prodser = new ProductFournisseur ( $db );
else $prodser = new Product ( $db );
2009-01-28 16:37:10 +01:00
if ( $idprod )
{
$prodser -> fetch ( $idprod );
// If a predefined product and multilang and on other lang, we renamed label with label translated
if ( $conf -> global -> MAIN_MULTILANGS && ( $outputlangs -> defaultlang != $langs -> defaultlang ))
{
if ( ! empty ( $prodser -> multilangs [ $outputlangs -> defaultlang ][ " libelle " ])) $label = $prodser -> multilangs [ $outputlangs -> defaultlang ][ " libelle " ];
if ( ! empty ( $prodser -> multilangs [ $outputlangs -> defaultlang ][ " description " ])) $desc = $prodser -> multilangs [ $outputlangs -> defaultlang ][ " description " ];
if ( ! empty ( $prodser -> multilangs [ $outputlangs -> defaultlang ][ " note " ])) $note = $prodser -> multilangs [ $outputlangs -> defaultlang ][ " note " ];
}
}
// Description short of product line
$libelleproduitservice = $label ;
// Description long of product line
2009-01-29 02:57:56 +01:00
if ( $desc && ( $desc != $label ))
2009-01-28 16:09:37 +01:00
{
2009-07-23 09:51:23 +02:00
if ( $libelleproduitservice && ! $hidedesc ) $libelleproduitservice .= " \n " ;
2009-01-28 16:09:37 +01:00
2009-01-28 16:37:10 +01:00
if ( $desc == '(CREDIT_NOTE)' && $line -> fk_remise_except )
2009-01-28 16:09:37 +01:00
{
2009-05-06 22:41:48 +02:00
$discount = new DiscountAbsolute ( $db );
2009-01-28 16:09:37 +01:00
$discount -> fetch ( $line -> fk_remise_except );
$libelleproduitservice = $outputlangs -> transnoentitiesnoconv ( " DiscountFromCreditNote " , $discount -> ref_facture_source );
}
else
{
2009-01-28 16:37:10 +01:00
if ( $idprod )
2009-01-28 16:09:37 +01:00
{
2009-07-23 09:51:23 +02:00
if ( ! $hidedesc ) $libelleproduitservice .= $desc ;
2009-01-28 16:09:37 +01:00
}
else
{
2009-01-28 16:37:10 +01:00
$libelleproduitservice .= $desc ;
2009-01-28 16:09:37 +01:00
}
}
}
2009-07-04 13:55:45 +02:00
// If line linked to a product
2009-01-28 16:37:10 +01:00
if ( $idprod )
2009-01-28 16:09:37 +01:00
{
// On ajoute la ref
if ( $prodser -> ref )
{
$prefix_prodserv = " " ;
2009-05-13 12:21:26 +02:00
$ref_prodserv = " " ;
2009-02-07 01:38:29 +01:00
if ( $conf -> global -> PRODUCT_ADD_TYPE_IN_DOCUMENTS ) // In standard mode, we do not show this
2009-01-28 16:09:37 +01:00
{
2009-02-07 01:38:29 +01:00
if ( $prodser -> isservice ())
{
$prefix_prodserv = $outputlangs -> transnoentitiesnoconv ( " Service " ) . " " ;
}
else
{
$prefix_prodserv = $outputlangs -> transnoentitiesnoconv ( " Product " ) . " " ;
}
2009-01-28 16:09:37 +01:00
}
2009-06-15 20:57:34 +02:00
2009-07-23 09:51:23 +02:00
if ( ! $hideref )
2009-07-04 13:55:45 +02:00
{
if ( $issupplierline ) $ref_prodserv = $prodser -> ref . ' (' . $outputlangs -> trans ( " SupplierRef " ) . ' ' . $ref_supplier . ')' ; // Show local ref and supplier ref
else $ref_prodserv = $prodser -> ref ; // Show local ref only
$ref_prodserv .= " - " ;
}
2009-06-15 20:57:34 +02:00
2009-05-13 12:21:26 +02:00
$libelleproduitservice = $prefix_prodserv . $ref_prodserv . $libelleproduitservice ;
2009-01-28 16:09:37 +01:00
}
}
2009-01-29 02:57:56 +01:00
$libelleproduitservice = dol_htmlentitiesbr ( $libelleproduitservice , 1 );
2009-01-28 16:09:37 +01:00
if ( $line -> date_start || $line -> date_end )
{
2009-02-07 01:38:29 +01:00
// Show duration if exists
if ( $line -> date_start && $line -> date_end )
{
2009-02-20 23:53:15 +01:00
$period = '(' . $outputlangs -> transnoentitiesnoconv ( 'DateFromTo' , dol_print_date ( $line -> date_start , $format , false , $outputlangs ), dol_print_date ( $line -> date_end , $format , false , $outputlangs )) . ')' ;
2009-02-07 01:38:29 +01:00
}
if ( $line -> date_start && ! $line -> date_end )
{
2009-02-20 23:53:15 +01:00
$period = '(' . $outputlangs -> transnoentitiesnoconv ( 'DateFrom' , dol_print_date ( $line -> date_start , $format , false , $outputlangs )) . ')' ;
2009-02-07 01:38:29 +01:00
}
if ( ! $line -> date_start && $line -> date_end )
{
2009-02-20 23:53:15 +01:00
$period = '(' . $outputlangs -> transnoentitiesnoconv ( 'DateUntil' , dol_print_date ( $line -> date_end , $format , false , $outputlangs )) . ')' ;
2009-02-07 01:38:29 +01:00
}
//print '>'.$outputlangs->charset_output.','.$period;
2009-01-28 16:09:37 +01:00
$libelleproduitservice .= " <br> " . dol_htmlentitiesbr ( $period , 1 );
2009-02-07 01:38:29 +01:00
//print $libelleproduitservice;
2009-01-28 16:09:37 +01:00
}
return $libelleproduitservice ;
}
?>