Merge branch 'develop' of https://github.com/Dolibarr/dolibarr.git into develop
This commit is contained in:
commit
07ba988cf8
@ -60,7 +60,7 @@ For users:
|
||||
- New: [ task #210 ] Can choose cash account during POS login.
|
||||
- New: [ task #104 ] Can create an invoice from several orders.
|
||||
- New: Update libs/tools/logo for DoliWamp (now use PHP 5.3).
|
||||
- New: Added ODT Template tag {object_total_discount}
|
||||
- New: Added ODT Template tag {object_total_discount_ht}
|
||||
- New: Add new import options: Third parties bank details, warehouses and stocks, categories and suppliers prices
|
||||
- New: English bank account need a bank code (called sort code) to identify an account.
|
||||
- New: Can choose menu entry to show with external site module.
|
||||
|
||||
@ -22,8 +22,7 @@ AppVerName=DoliWamp-3.3.0-beta
|
||||
OutputBaseFilename=DoliWamp-3.3.0-beta
|
||||
; Define full path from wich all relative path are defined
|
||||
; You must modify this to put here your dolibarr root directory
|
||||
;SourceDir=C:\Documents and Settings\ldestailleur\git\dolibarr_old
|
||||
;SourceDir=Z:\home\ldestailleur\git\dolibarr_veryold
|
||||
;SourceDir=Z:\home\ldestailleur\git\dolibarrxxx
|
||||
SourceDir=..\..\..
|
||||
; ----- End of change
|
||||
;OutputManifestFile=build\doliwampbuild.log
|
||||
@ -33,7 +32,7 @@ AppPublisherURL=http://www.nltechno.com
|
||||
AppSupportURL=http://www.dolibarr.org
|
||||
AppUpdatesURL=http://www.dolibarr.org
|
||||
AppComments=DoliWamp includes Dolibarr, Apache, PHP and Mysql softwares.
|
||||
AppCopyright=Copyright (C) 2008-2012 Laurent Destailleur, NLTechno
|
||||
AppCopyright=Copyright (C) 2008-2013 Laurent Destailleur, NLTechno
|
||||
DefaultDirName=c:\dolibarr
|
||||
DefaultGroupName=Dolibarr
|
||||
;LicenseFile=COPYING
|
||||
@ -88,12 +87,12 @@ Name: "{app}\bin\apache\apache2.2.11\logs"
|
||||
; Stop/start
|
||||
Source: "build\exe\doliwamp\stopdoliwamp.bat"; DestDir: "{app}\"; Flags: ignoreversion; AfterInstall: close()
|
||||
Source: "build\exe\doliwamp\startdoliwamp.bat"; DestDir: "{app}\"; Flags: ignoreversion;
|
||||
Source: "build\exe\doliwamp\install_services.bat.install"; DestDir: "{app}\"; Flags: ignoreversion;
|
||||
Source: "build\exe\doliwamp\uninstall_services.bat.install"; DestDir: "{app}\"; Flags: ignoreversion;
|
||||
Source: "build\exe\doliwamp\removefiles.bat"; DestDir: "{app}\"; Flags: ignoreversion;
|
||||
Source: "build\exe\doliwamp\rundoliwamp.bat.install"; DestDir: "{app}\"; Flags: ignoreversion;
|
||||
Source: "build\exe\doliwamp\rundolihelp.bat.install"; DestDir: "{app}\"; Flags: ignoreversion;
|
||||
Source: "build\exe\doliwamp\rundoliadmin.bat.install"; DestDir: "{app}\"; Flags: ignoreversion;
|
||||
Source: "build\exe\doliwamp\install_services.bat.install"; DestDir: "{app}\"; Flags: ignoreversion;
|
||||
Source: "build\exe\doliwamp\uninstall_services.bat.install"; DestDir: "{app}\"; Flags: ignoreversion;
|
||||
Source: "build\exe\doliwamp\mysqlinitpassword.bat.install"; DestDir: "{app}\"; Flags: ignoreversion;
|
||||
Source: "build\exe\doliwamp\mysqltestinstall.bat.install"; DestDir: "{app}\"; Flags: ignoreversion;
|
||||
Source: "build\exe\doliwamp\startdoliwamp_manual_donotuse.bat.install"; DestDir: "{app}\"; Flags: ignoreversion;
|
||||
|
||||
15
dev/finddosfiles.sh
Executable file
15
dev/finddosfiles.sh
Executable file
@ -0,0 +1,15 @@
|
||||
#!/bin/sh
|
||||
#------------------------------------------------------
|
||||
# Script to find files that are not Unix encoded
|
||||
#
|
||||
# Laurent Destailleur - eldy@users.sourceforge.net
|
||||
#------------------------------------------------------
|
||||
# Usage: finddosfiles.sh
|
||||
#------------------------------------------------------
|
||||
|
||||
# To detec
|
||||
find . -type f -iname "*.php" -exec file "{}" + | grep CRLF
|
||||
|
||||
# To convert
|
||||
#find . -type f -iname "*.php" -exec dos2unix "{}" +;
|
||||
|
||||
@ -188,6 +188,7 @@ export list="
|
||||
--ignore-table=$base.llx_cabinetmed_examenprescrit
|
||||
--ignore-table=$base.llx_cabinetmed_motifcons
|
||||
--ignore-table=$base.llx_cabinetmed_patient
|
||||
--ignore-table=$base.llx_cabinetmed_societe
|
||||
--ignore-table=$base.llx_publi_c_contact_list
|
||||
--ignore-table=$base.llx_publi_c_dnd_list
|
||||
--ignore-table=$base.llx_publi_c_method_list
|
||||
|
||||
@ -28,7 +28,7 @@ $path=dirname(__FILE__).'/';
|
||||
|
||||
// Test if batch mode
|
||||
if (substr($sapi_type, 0, 3) == 'cgi') {
|
||||
echo "Error: You ar usingr PH for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
@ -423,7 +423,7 @@ class Adherent extends CommonObject
|
||||
$this->db->begin();
|
||||
|
||||
$sql = "UPDATE ".MAIN_DB_PREFIX."adherent SET";
|
||||
$sql.= " civilite = ".($this->civilite_id?"'".$this->civilite_id."'":"null");
|
||||
$sql.= " civilite = ".(!is_null($this->civilite_id)?"'".$this->civilite_id."'":"null");
|
||||
$sql.= ", prenom = ".($this->firstname?"'".$this->db->escape($this->firstname)."'":"null");
|
||||
$sql.= ", nom=" .($this->lastname?"'".$this->db->escape($this->lastname)."'":"null");
|
||||
$sql.= ", login=" .($this->login?"'".$this->db->escape($this->login)."'":"null");
|
||||
@ -950,7 +950,7 @@ class Adherent extends CommonObject
|
||||
|
||||
$this->db->begin();
|
||||
|
||||
// Update link to third party
|
||||
// Remove link to third party onto any other members
|
||||
if ($thirdpartyid > 0)
|
||||
{
|
||||
$sql = "UPDATE ".MAIN_DB_PREFIX."adherent SET fk_soc = null";
|
||||
@ -960,7 +960,7 @@ class Adherent extends CommonObject
|
||||
$resql = $this->db->query($sql);
|
||||
}
|
||||
|
||||
// Update link to third party
|
||||
// Add link to third party for current member
|
||||
$sql = "UPDATE ".MAIN_DB_PREFIX."adherent SET fk_soc = ".($thirdpartyid>0 ? $thirdpartyid : 'null');
|
||||
$sql.= " WHERE rowid = ".$this->id;
|
||||
|
||||
|
||||
@ -85,84 +85,96 @@ if ($id || $ref)
|
||||
if ($user->societe_id) $socid=$user->societe_id;
|
||||
$result = restrictedArea($user,$objecttype,$objectid,$dbtablename,'','',$fieldid);
|
||||
|
||||
// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
|
||||
include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
|
||||
$hookmanager=new HookManager($db);
|
||||
$hookmanager->initHooks(array('categorycard'));
|
||||
|
||||
|
||||
/*
|
||||
* Actions
|
||||
*/
|
||||
|
||||
//Suppression d'un objet d'une categorie
|
||||
if ($removecat > 0)
|
||||
$parameters=array('id'=>$socid);
|
||||
$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks
|
||||
$error=$hookmanager->error; $errors=array_merge($errors, (array) $hookmanager->errors);
|
||||
|
||||
if (empty($reshook))
|
||||
{
|
||||
if ($type==0 && ($user->rights->produit->creer || $user->rights->service->creer))
|
||||
//Suppression d'un objet d'une categorie
|
||||
if ($removecat > 0)
|
||||
{
|
||||
require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
|
||||
$object = new Product($db);
|
||||
$result = $object->fetch($id, $ref);
|
||||
$elementtype = 'product';
|
||||
}
|
||||
if ($type==1 && $user->rights->societe->creer)
|
||||
{
|
||||
$object = new Societe($db);
|
||||
$result = $object->fetch($objectid);
|
||||
}
|
||||
if ($type==2 && $user->rights->societe->creer)
|
||||
{
|
||||
$object = new Societe($db);
|
||||
$result = $object->fetch($objectid);
|
||||
}
|
||||
if ($type == 3 && $user->rights->adherent->creer)
|
||||
{
|
||||
require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
|
||||
$object = new Adherent($db);
|
||||
$result = $object->fetch($objectid);
|
||||
}
|
||||
$cat = new Categorie($db);
|
||||
$result=$cat->fetch($removecat);
|
||||
if ($type==0 && ($user->rights->produit->creer || $user->rights->service->creer))
|
||||
{
|
||||
require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
|
||||
$object = new Product($db);
|
||||
$result = $object->fetch($id, $ref);
|
||||
$elementtype = 'product';
|
||||
}
|
||||
if ($type==1 && $user->rights->societe->creer)
|
||||
{
|
||||
$object = new Societe($db);
|
||||
$result = $object->fetch($objectid);
|
||||
}
|
||||
if ($type==2 && $user->rights->societe->creer)
|
||||
{
|
||||
$object = new Societe($db);
|
||||
$result = $object->fetch($objectid);
|
||||
}
|
||||
if ($type == 3 && $user->rights->adherent->creer)
|
||||
{
|
||||
require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
|
||||
$object = new Adherent($db);
|
||||
$result = $object->fetch($objectid);
|
||||
}
|
||||
$cat = new Categorie($db);
|
||||
$result=$cat->fetch($removecat);
|
||||
|
||||
$result=$cat->del_type($object,$elementtype);
|
||||
}
|
||||
$result=$cat->del_type($object,$elementtype);
|
||||
}
|
||||
|
||||
// Add object into a category
|
||||
if ($parent > 0)
|
||||
{
|
||||
if ($type==0 && ($user->rights->produit->creer || $user->rights->service->creer))
|
||||
// Add object into a category
|
||||
if ($parent > 0)
|
||||
{
|
||||
require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
|
||||
$object = new Product($db);
|
||||
$result = $object->fetch($id, $ref);
|
||||
$elementtype = 'product';
|
||||
}
|
||||
if ($type==1 && $user->rights->societe->creer)
|
||||
{
|
||||
$object = new Societe($db);
|
||||
$result = $object->fetch($objectid);
|
||||
$elementtype = 'fournisseur';
|
||||
}
|
||||
if ($type==2 && $user->rights->societe->creer)
|
||||
{
|
||||
$object = new Societe($db);
|
||||
$result = $object->fetch($objectid);
|
||||
$elementtype = 'societe';
|
||||
}
|
||||
if ($type==3 && $user->rights->adherent->creer)
|
||||
{
|
||||
require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
|
||||
$object = new Adherent($db);
|
||||
$result = $object->fetch($objectid);
|
||||
$elementtype = 'member';
|
||||
}
|
||||
$cat = new Categorie($db);
|
||||
$result=$cat->fetch($parent);
|
||||
if ($type==0 && ($user->rights->produit->creer || $user->rights->service->creer))
|
||||
{
|
||||
require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
|
||||
$object = new Product($db);
|
||||
$result = $object->fetch($id, $ref);
|
||||
$elementtype = 'product';
|
||||
}
|
||||
if ($type==1 && $user->rights->societe->creer)
|
||||
{
|
||||
$object = new Societe($db);
|
||||
$result = $object->fetch($objectid);
|
||||
$elementtype = 'fournisseur';
|
||||
}
|
||||
if ($type==2 && $user->rights->societe->creer)
|
||||
{
|
||||
$object = new Societe($db);
|
||||
$result = $object->fetch($objectid);
|
||||
$elementtype = 'societe';
|
||||
}
|
||||
if ($type==3 && $user->rights->adherent->creer)
|
||||
{
|
||||
require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
|
||||
$object = new Adherent($db);
|
||||
$result = $object->fetch($objectid);
|
||||
$elementtype = 'member';
|
||||
}
|
||||
$cat = new Categorie($db);
|
||||
$result=$cat->fetch($parent);
|
||||
|
||||
$result=$cat->add_type($object,$elementtype);
|
||||
if ($result >= 0)
|
||||
{
|
||||
$mesg='<div class="ok">'.$langs->trans("WasAddedSuccessfully",$cat->label).'</div>';
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($cat->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') $mesg='<div class="error">'.$langs->trans("ObjectAlreadyLinkedToCategory").'</div>';
|
||||
else $mesg=$langs->trans("Error").' '.$cat->error;
|
||||
$result=$cat->add_type($object,$elementtype);
|
||||
if ($result >= 0)
|
||||
{
|
||||
$mesg='<div class="ok">'.$langs->trans("WasAddedSuccessfully",$cat->label).'</div>';
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($cat->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') $mesg='<div class="error">'.$langs->trans("ObjectAlreadyLinkedToCategory").'</div>';
|
||||
else $mesg=$langs->trans("Error").' '.$cat->error;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -555,7 +555,13 @@ if ($action == 'create')
|
||||
}
|
||||
else
|
||||
{
|
||||
print $form->select_company('','socid','',1,1);
|
||||
//For external user force the company to user company
|
||||
if (!empty($user->societe_id)) {
|
||||
print $form->select_company($user->societe_id,'socid','',1,1);
|
||||
} else {
|
||||
print $form->select_company('','socid','',1,1);
|
||||
}
|
||||
|
||||
}
|
||||
print '</td></tr>';
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Copyright (C) 2005 Marc Barilley / Ocebo <marc@ocebo.com>
|
||||
* Copyright (C) 2005-2012 Regis Houssin <regis.houssin@capnetworks.com>
|
||||
* Copyright (C) 2006 Andre Cianfarani <acianfa@free.fr>
|
||||
* Copyright (C) 2010-2012 Juanjo Menent <jmenent@2byte.es>
|
||||
* Copyright (C) 2010-2013 Juanjo Menent <jmenent@2byte.es>
|
||||
* Copyright (C) 2012 Christophe Battarel <christophe.battarel@altairis.fr>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@ -593,7 +593,8 @@ else if ($action == 'confirm_converttoreduc' && $confirm == 'yes' && $user->righ
|
||||
*/
|
||||
else if ($action == 'add' && $user->rights->facture->creer)
|
||||
{
|
||||
$object->socid=GETPOST('socid','int');
|
||||
if ($socid>0)
|
||||
$object->socid=GETPOST('socid','int');
|
||||
|
||||
$db->begin();
|
||||
|
||||
@ -732,6 +733,12 @@ else if ($action == 'add' && $user->rights->facture->creer)
|
||||
// Standard or deposit or proforma invoice
|
||||
if (($_POST['type'] == 0 || $_POST['type'] == 3 || $_POST['type'] == 4) && $_POST['fac_rec'] <= 0)
|
||||
{
|
||||
if (GETPOST('socid','int')<1)
|
||||
{
|
||||
$error++;
|
||||
setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Customer")),'errors');
|
||||
}
|
||||
|
||||
$datefacture = dol_mktime(12, 0, 0, $_POST['remonth'], $_POST['reday'], $_POST['reyear']);
|
||||
if (empty($datefacture))
|
||||
{
|
||||
@ -1727,7 +1734,7 @@ if ($action == 'create')
|
||||
print_fiche_titre($langs->trans('NewBill'));
|
||||
|
||||
$soc = new Societe($db);
|
||||
if ($socid) $res=$soc->fetch($socid);
|
||||
if ($socid>0) $res=$soc->fetch($socid);
|
||||
|
||||
if (! empty($origin) && ! empty($originid))
|
||||
{
|
||||
@ -1804,7 +1811,7 @@ if ($action == 'create')
|
||||
print '<tr><td class="fieldrequired">'.$langs->trans('Ref').'</td><td colspan="2">'.$langs->trans('Draft').'</td></tr>';
|
||||
|
||||
// Factures predefinies
|
||||
if (empty($origin) && empty($originid))
|
||||
if (empty($origin) && empty($originid) && $socid>0)
|
||||
{
|
||||
$sql = 'SELECT r.rowid, r.titre, r.total_ttc';
|
||||
$sql.= ' FROM '.MAIN_DB_PREFIX.'facture_rec as r';
|
||||
@ -1834,16 +1841,27 @@ if ($action == 'create')
|
||||
$db->free($resql);
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
dol_print_error($db);
|
||||
}
|
||||
}
|
||||
|
||||
// Tiers
|
||||
print '<tr><td class="fieldrequired">'.$langs->trans('Customer').'</td><td colspan="2">';
|
||||
print $soc->getNomUrl(1);
|
||||
print '<input type="hidden" name="socid" value="'.$soc->id.'">';
|
||||
print '</td>';
|
||||
print '<tr>';
|
||||
print '<td class="fieldrequired">'.$langs->trans('Customer').'</td>';
|
||||
if($socid>0)
|
||||
{
|
||||
print '<td colspan="2">';
|
||||
print $soc->getNomUrl(1);
|
||||
print '<input type="hidden" name="socid" value="'.$soc->id.'">';
|
||||
print '</td>';
|
||||
}
|
||||
else
|
||||
{
|
||||
print '<td colspan="2">';
|
||||
print $form->select_company('','socid','s.client = 1',1);
|
||||
print '</td>';
|
||||
}
|
||||
print '</tr>'."\n";
|
||||
|
||||
// Type de facture
|
||||
@ -1916,72 +1934,77 @@ if ($action == 'create')
|
||||
print $desc;
|
||||
print '</td></tr>'."\n";
|
||||
}
|
||||
|
||||
// Replacement
|
||||
print '<tr height="18"><td valign="middle">';
|
||||
print '<input type="radio" name="type" value="1"'.(GETPOST('type')==1?' checked="checked"':'');
|
||||
if (! $options) print ' disabled="disabled"';
|
||||
print '>';
|
||||
print '</td><td valign="middle">';
|
||||
$text=$langs->trans("InvoiceReplacementAsk").' ';
|
||||
$text.='<select class="flat" name="fac_replacement" id="fac_replacement"';
|
||||
if (! $options) $text.=' disabled="disabled"';
|
||||
$text.='>';
|
||||
if ($options)
|
||||
{
|
||||
$text.='<option value="-1"></option>';
|
||||
$text.=$options;
|
||||
}
|
||||
else
|
||||
{
|
||||
$text.='<option value="-1">'.$langs->trans("NoReplacableInvoice").'</option>';
|
||||
}
|
||||
$text.='</select>';
|
||||
$desc=$form->textwithpicto($text,$langs->transnoentities("InvoiceReplacementDesc"),1);
|
||||
print $desc;
|
||||
print '</td></tr>'."\n";
|
||||
|
||||
// Credit note
|
||||
print '<tr height="18"><td valign="middle">';
|
||||
print '<input type="radio" name="type" value="2"'.(GETPOST('type')==2?' checked=true':'');
|
||||
if (! $optionsav) print ' disabled="disabled"';
|
||||
print '>';
|
||||
print '</td><td valign="middle">';
|
||||
$text=$langs->transnoentities("InvoiceAvoirAsk").' ';
|
||||
// $text.='<input type="text" value="">';
|
||||
$text.='<select class="flat" name="fac_avoir" id="fac_avoir"';
|
||||
if (! $optionsav) $text.=' disabled="disabled"';
|
||||
$text.='>';
|
||||
if ($optionsav)
|
||||
{
|
||||
$text.='<option value="-1"></option>';
|
||||
$text.=$optionsav;
|
||||
}
|
||||
else
|
||||
{
|
||||
$text.='<option value="-1">'.$langs->trans("NoInvoiceToCorrect").'</option>';
|
||||
}
|
||||
$text.='</select>';
|
||||
$desc=$form->textwithpicto($text,$langs->transnoentities("InvoiceAvoirDesc"),1);
|
||||
print $desc;
|
||||
print '</td></tr>'."\n";
|
||||
|
||||
print '</table>';
|
||||
print '</td></tr>';
|
||||
|
||||
// Discounts for third party
|
||||
print '<tr><td>'.$langs->trans('Discounts').'</td><td colspan="2">';
|
||||
if ($soc->remise_client) print $langs->trans("CompanyHasRelativeDiscount",'<a href="'.DOL_URL_ROOT.'/comm/remise.php?id='.$soc->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?socid='.$soc->id.'&action='.$action.'&origin='.GETPOST('origin').'&originid='.GETPOST('originid')).'">'.$soc->remise_client.'</a>');
|
||||
else print $langs->trans("CompanyHasNoRelativeDiscount");
|
||||
print ' <a href="'.DOL_URL_ROOT.'/comm/remise.php?id='.$soc->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?socid='.$soc->id.'&action='.$action.'&origin='.GETPOST('origin').'&originid='.GETPOST('originid')).'">('.$langs->trans("EditRelativeDiscount").')</a>';
|
||||
print '. ';
|
||||
print '<br>';
|
||||
if ($absolute_discount) print $langs->trans("CompanyHasAbsoluteDiscount",'<a href="'.DOL_URL_ROOT.'/comm/remx.php?id='.$soc->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?socid='.$soc->id.'&action='.$action.'&origin='.GETPOST('origin').'&originid='.GETPOST('originid')).'">'.price($absolute_discount).'</a>',$langs->trans("Currency".$conf->currency));
|
||||
else print $langs->trans("CompanyHasNoAbsoluteDiscount");
|
||||
print ' <a href="'.DOL_URL_ROOT.'/comm/remx.php?id='.$soc->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?socid='.$soc->id.'&action='.$action.'&origin='.GETPOST('origin').'&originid='.GETPOST('originid')).'">('.$langs->trans("EditGlobalDiscounts").')</a>';
|
||||
print '.';
|
||||
print '</td></tr>';
|
||||
|
||||
|
||||
if ($socid>0)
|
||||
{
|
||||
// Replacement
|
||||
print '<tr height="18"><td valign="middle">';
|
||||
print '<input type="radio" name="type" value="1"'.(GETPOST('type')==1?' checked="checked"':'');
|
||||
if (! $options) print ' disabled="disabled"';
|
||||
print '>';
|
||||
print '</td><td valign="middle">';
|
||||
$text=$langs->trans("InvoiceReplacementAsk").' ';
|
||||
$text.='<select class="flat" name="fac_replacement" id="fac_replacement"';
|
||||
if (! $options) $text.=' disabled="disabled"';
|
||||
$text.='>';
|
||||
if ($options)
|
||||
{
|
||||
$text.='<option value="-1"></option>';
|
||||
$text.=$options;
|
||||
}
|
||||
else
|
||||
{
|
||||
$text.='<option value="-1">'.$langs->trans("NoReplacableInvoice").'</option>';
|
||||
}
|
||||
$text.='</select>';
|
||||
$desc=$form->textwithpicto($text,$langs->transnoentities("InvoiceReplacementDesc"),1);
|
||||
print $desc;
|
||||
print '</td></tr>'."\n";
|
||||
|
||||
// Credit note
|
||||
print '<tr height="18"><td valign="middle">';
|
||||
print '<input type="radio" name="type" value="2"'.(GETPOST('type')==2?' checked=true':'');
|
||||
if (! $optionsav) print ' disabled="disabled"';
|
||||
print '>';
|
||||
print '</td><td valign="middle">';
|
||||
$text=$langs->transnoentities("InvoiceAvoirAsk").' ';
|
||||
// $text.='<input type="text" value="">';
|
||||
$text.='<select class="flat" name="fac_avoir" id="fac_avoir"';
|
||||
if (! $optionsav) $text.=' disabled="disabled"';
|
||||
$text.='>';
|
||||
if ($optionsav)
|
||||
{
|
||||
$text.='<option value="-1"></option>';
|
||||
$text.=$optionsav;
|
||||
}
|
||||
else
|
||||
{
|
||||
$text.='<option value="-1">'.$langs->trans("NoInvoiceToCorrect").'</option>';
|
||||
}
|
||||
$text.='</select>';
|
||||
$desc=$form->textwithpicto($text,$langs->transnoentities("InvoiceAvoirDesc"),1);
|
||||
print $desc;
|
||||
print '</td></tr>'."\n";
|
||||
}
|
||||
print '</table>';
|
||||
print '</td></tr>';
|
||||
|
||||
if($socid>0)
|
||||
{
|
||||
// Discounts for third party
|
||||
print '<tr><td>'.$langs->trans('Discounts').'</td><td colspan="2">';
|
||||
if ($soc->remise_client) print $langs->trans("CompanyHasRelativeDiscount",'<a href="'.DOL_URL_ROOT.'/comm/remise.php?id='.$soc->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?socid='.$soc->id.'&action='.$action.'&origin='.GETPOST('origin').'&originid='.GETPOST('originid')).'">'.$soc->remise_client.'</a>');
|
||||
else print $langs->trans("CompanyHasNoRelativeDiscount");
|
||||
print ' <a href="'.DOL_URL_ROOT.'/comm/remise.php?id='.$soc->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?socid='.$soc->id.'&action='.$action.'&origin='.GETPOST('origin').'&originid='.GETPOST('originid')).'">('.$langs->trans("EditRelativeDiscount").')</a>';
|
||||
print '. ';
|
||||
print '<br>';
|
||||
if ($absolute_discount) print $langs->trans("CompanyHasAbsoluteDiscount",'<a href="'.DOL_URL_ROOT.'/comm/remx.php?id='.$soc->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?socid='.$soc->id.'&action='.$action.'&origin='.GETPOST('origin').'&originid='.GETPOST('originid')).'">'.price($absolute_discount).'</a>',$langs->trans("Currency".$conf->currency));
|
||||
else print $langs->trans("CompanyHasNoAbsoluteDiscount");
|
||||
print ' <a href="'.DOL_URL_ROOT.'/comm/remx.php?id='.$soc->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?socid='.$soc->id.'&action='.$action.'&origin='.GETPOST('origin').'&originid='.GETPOST('originid')).'">('.$langs->trans("EditGlobalDiscounts").')</a>';
|
||||
print '.';
|
||||
print '</td></tr>';
|
||||
}
|
||||
|
||||
// Date invoice
|
||||
print '<tr><td class="fieldrequired">'.$langs->trans('Date').'</td><td colspan="2">';
|
||||
$form->select_date($dateinvoice,'','','','',"add",1,1);
|
||||
@ -1998,7 +2021,7 @@ if ($action == 'create')
|
||||
print '</td></tr>';
|
||||
|
||||
// Project
|
||||
if (! empty($conf->projet->enabled))
|
||||
if (! empty($conf->projet->enabled) && $socid>0)
|
||||
{
|
||||
$langs->load('projects');
|
||||
print '<tr><td>'.$langs->trans('Project').'</td><td colspan="2">';
|
||||
|
||||
@ -32,6 +32,7 @@ require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php';
|
||||
|
||||
$langs->load("companies");
|
||||
$langs->load("categories");
|
||||
$langs->load('withdrawals');
|
||||
|
||||
// Securite acces client
|
||||
if ($user->societe_id > 0) accessforbidden();
|
||||
|
||||
@ -31,6 +31,7 @@ require_once DOL_DOCUMENT_ROOT.'/compta/prelevement/class/rejetprelevement.class
|
||||
require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php';
|
||||
|
||||
$langs->load("categories");
|
||||
$langs->load('withdrawals');
|
||||
|
||||
// Securite acces client
|
||||
if ($user->societe_id > 0) accessforbidden();
|
||||
|
||||
@ -130,7 +130,7 @@ if ($action == 'infocredit' && $user->rights->prelevement->bons->credit)
|
||||
$bon = new BonPrelevement($db,"");
|
||||
$form = new Form($db);
|
||||
|
||||
llxHeader('',$langs->trans("WithdrawalReceipts"));
|
||||
llxHeader('',$langs->trans("WithdrawalReceipt"));
|
||||
|
||||
|
||||
if ($id > 0)
|
||||
@ -138,7 +138,7 @@ if ($id > 0)
|
||||
$bon->fetch($id);
|
||||
|
||||
$head = prelevement_prepare_head($bon);
|
||||
dol_fiche_head($head, 'prelevement', $langs->trans("WithdrawalReceipts"), '', 'payment');
|
||||
dol_fiche_head($head, 'prelevement', $langs->trans("WithdrawalReceipt"), '', 'payment');
|
||||
|
||||
if (GETPOST('error','alpha')!='')
|
||||
{
|
||||
|
||||
@ -35,6 +35,7 @@ require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php';
|
||||
if ($user->societe_id > 0) accessforbidden();
|
||||
|
||||
$langs->load("categories");
|
||||
$langs->load('withdrawals');
|
||||
|
||||
// Get supervariables
|
||||
$prev_id = GETPOST('id','int');
|
||||
|
||||
@ -2253,24 +2253,43 @@ abstract class CommonObject
|
||||
}
|
||||
|
||||
/**
|
||||
* Function that returns the total amount of discounts applied.
|
||||
* Function that returns the total amount HT of discounts applied for all lines.
|
||||
*
|
||||
* @return false|float False is returned if the discount couldn't be retrieved
|
||||
* @return float
|
||||
*/
|
||||
function getTotalDiscount()
|
||||
{
|
||||
$sql = 'SELECT (SUM(`subprice`) - SUM(`total_ht`)) as `discount` FROM '.MAIN_DB_PREFIX.$this->table_element.'det WHERE `'.$this->fk_element.'` = '.$this->id;
|
||||
$total_discount=0.00;
|
||||
|
||||
$query = $this->db->query($sql);
|
||||
$sql = "SELECT subprice as pu_ht, qty, remise_percent, total_ht";
|
||||
$sql.= " FROM ".MAIN_DB_PREFIX.$this->table_element."det";
|
||||
$sql.= " WHERE ".$this->fk_element." = ".$this->id;
|
||||
|
||||
if ($query)
|
||||
dol_syslog(get_class($this).'::getTotalDiscount sql='.$sql);
|
||||
$resql = $this->db->query($sql);
|
||||
if ($resql)
|
||||
{
|
||||
$result = $this->db->fetch_object($query);
|
||||
$num=$this->db->num_rows($resql);
|
||||
$i=0;
|
||||
while ($i < $num)
|
||||
{
|
||||
$obj = $this->db->fetch_object($query);
|
||||
|
||||
return price2num($result->discount);
|
||||
$pu_ht = $obj->pu_ht;
|
||||
$qty= $obj->qty;
|
||||
$discount_percent_line = $obj->remise_percent;
|
||||
$total_ht = $obj->total_ht;
|
||||
|
||||
$total_discount_line = price2num(($pu_ht * $qty) - $total_ht, 'MT');
|
||||
$total_discount += $total_discount_line;
|
||||
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
else dol_syslog(get_class($this).'::getTotalDiscount '.$this->db->lasterror(), LOG_ERR);
|
||||
|
||||
//print $total_discount; exit;
|
||||
return price2num($total_discount);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2313,7 +2332,7 @@ abstract class CommonObject
|
||||
function isInEEC()
|
||||
{
|
||||
// List of all country codes that are in europe for european vat rules
|
||||
// List found on http://ec.europa.eu/taxation_customs/vies/lang.do?fromWhichPage=vieshome
|
||||
// List found on http://ec.europa.eu/taxation_customs/common/faq/faq_1179_en.htm#9
|
||||
$country_code_in_EEC=array(
|
||||
'AT', // Austria
|
||||
'BE', // Belgium
|
||||
@ -2326,16 +2345,17 @@ abstract class CommonObject
|
||||
'ES', // Spain
|
||||
'FI', // Finland
|
||||
'FR', // France
|
||||
'GB', // Royaume-uni
|
||||
'GB', // United Kingdom
|
||||
'GR', // Greece
|
||||
'NL', // Holland
|
||||
'HU', // Hungary
|
||||
'IE', // Ireland
|
||||
'IM', // Isle of Man - Included in UK
|
||||
'IT', // Italy
|
||||
'LT', // Lithuania
|
||||
'LU', // Luxembourg
|
||||
'LV', // Latvia
|
||||
'MC', // Monaco Seems to use same IntraVAT than France (http://www.gouv.mc/devwww/wwwnew.nsf/c3241c4782f528bdc1256d52004f970b/9e370807042516a5c1256f81003f5bb3!OpenDocument)
|
||||
'MC', // Monaco - Included in France
|
||||
'MT', // Malta
|
||||
//'NO', // Norway
|
||||
'PL', // Poland
|
||||
|
||||
@ -52,7 +52,8 @@ class ExtraFields
|
||||
'int'=>'Int',
|
||||
'double'=>'Float',
|
||||
'date'=>'Date',
|
||||
'datetime'=>'DateAndTime'
|
||||
'datetime'=>'DateAndTime',
|
||||
'boolean'=>'Boolean'
|
||||
);
|
||||
|
||||
/**
|
||||
@ -135,7 +136,14 @@ class ExtraFields
|
||||
|
||||
if (isset($attrname) && $attrname != '' && preg_match("/^\w[a-zA-Z0-9-_]*$/",$attrname))
|
||||
{
|
||||
$field_desc = array('type'=>$type, 'value'=>$length, 'null'=>($required?'NOT NULL':'NULL'));
|
||||
if ($type=='boolean') {
|
||||
$typedb='int';
|
||||
$lengthdb='1';
|
||||
} else {
|
||||
$typedb=$type;
|
||||
$lengthdb=$length;
|
||||
}
|
||||
$field_desc = array('type'=>$typedb, 'value'=>$lengthdb, 'null'=>($required?'NOT NULL':'NULL'));
|
||||
$result=$this->db->DDLAddField(MAIN_DB_PREFIX.$table, $attrname, $field_desc);
|
||||
if ($result > 0)
|
||||
{
|
||||
@ -304,7 +312,14 @@ class ExtraFields
|
||||
|
||||
if (isset($attrname) && $attrname != '' && preg_match("/^\w[a-zA-Z0-9-_]*$/",$attrname))
|
||||
{
|
||||
$field_desc = array('type'=>$type, 'value'=>$length, 'null'=>($required?'NOT NULL':'NULL'));
|
||||
if ($type=='boolean') {
|
||||
$typedb='int';
|
||||
$lengthdb='1';
|
||||
} else {
|
||||
$typedb=$type;
|
||||
$lengthdb=$length;
|
||||
}
|
||||
$field_desc = array('type'=>$typedb, 'value'=>$lengthdb, 'null'=>($required?'NOT NULL':'NULL'));
|
||||
$result=$this->db->DDLUpdateField(MAIN_DB_PREFIX.$table, $attrname, $field_desc);
|
||||
if ($result > 0)
|
||||
{
|
||||
@ -487,7 +502,7 @@ class ExtraFields
|
||||
function showInputField($key,$value,$moreparam='')
|
||||
{
|
||||
global $conf;
|
||||
|
||||
|
||||
$label=$this->attribute_label[$key];
|
||||
$type =$this->attribute_type[$key];
|
||||
$size =$this->attribute_size[$key];
|
||||
@ -534,6 +549,16 @@ class ExtraFields
|
||||
$doleditor=new DolEditor('options_'.$key,$value,'',200,'dolibarr_notes','In',false,false,! empty($conf->fckeditor->enabled) && $conf->global->FCKEDITOR_ENABLE_SOCIETE,5,100);
|
||||
$out=$doleditor->Create(1);
|
||||
}
|
||||
else if ($type == 'boolean')
|
||||
{
|
||||
$checked='';
|
||||
if (!empty($value)) {
|
||||
$checked=' checked="checked" value="1" ';
|
||||
} else {
|
||||
$checked=' value="1" ';
|
||||
}
|
||||
$out='<input type="checkbox" name="options_'.$key.'" '.$checked.' '.($moreparam?$moreparam:'').'>';
|
||||
}
|
||||
// Add comments
|
||||
if ($type == 'date') $out.=' (YYYY-MM-DD)';
|
||||
elseif ($type == 'datetime') $out.=' (YYYY-MM-DD HH:MM:SS)';
|
||||
@ -550,6 +575,7 @@ class ExtraFields
|
||||
*/
|
||||
function showOutputField($key,$value,$moreparam='')
|
||||
{
|
||||
|
||||
$label=$this->attribute_label[$key];
|
||||
$type=$this->attribute_type[$key];
|
||||
$size=$this->attribute_size[$key];
|
||||
@ -568,6 +594,14 @@ class ExtraFields
|
||||
{
|
||||
$showsize=10;
|
||||
}
|
||||
elseif ($type == 'boolean')
|
||||
{
|
||||
$checked='';
|
||||
if (!empty($value)) {
|
||||
$checked=' checked="checked" ';
|
||||
}
|
||||
$value='<input type="checkbox" '.$checked.' '.($moreparam?$moreparam:'').' readonly="readonly">';
|
||||
}
|
||||
else
|
||||
{
|
||||
$showsize=round($size);
|
||||
|
||||
@ -115,7 +115,7 @@ class HookManager
|
||||
* @param Object &$object Object to use hooks on
|
||||
* @param string &$action Action code on calling page ('create', 'edit', 'view', 'add', 'update', 'delete'...)
|
||||
* @return mixed For doActions,formObjectOptions: Return 0 if we want to keep standard actions, >0 if if want to stop standard actions, <0 means KO.
|
||||
* For printSearchForm,printLeftBlock,printTopRightMenu,formAddObjectLine,...: Return HTML string. TODO Must always return an int and things to print into ->resprints.
|
||||
* For printSearchForm,printLeftBlock,printTopRightMenu,formAddObjectLine,...: Return HTML string. TODO Must always return an int and things to print into ->resprints.
|
||||
* Can also return some values into an array ->results.
|
||||
* $this->error or this->errors are also defined by class called by this function if error.
|
||||
*/
|
||||
@ -136,6 +136,8 @@ class HookManager
|
||||
{
|
||||
foreach($modules as $module => $actionclassinstance)
|
||||
{
|
||||
//print 'class='.get_class($actionclassinstance).' method='.$method.' action='.$action;
|
||||
|
||||
// jump to next class if method does not exists
|
||||
if (! method_exists($actionclassinstance,$method)) continue;
|
||||
// test to avoid to run twice a hook, when a module implements several active contexts
|
||||
@ -178,7 +180,7 @@ class HookManager
|
||||
}
|
||||
}
|
||||
|
||||
if ($method != 'doActions' && $method != 'formObjectOptions') return $this->resPrint; // TODO remove this. When there is something to print, ->resPrint is filled.
|
||||
if ($method != 'doActions' && $method != 'formObjectOptions') return $this->resPrint; // TODO remove this. When there is something to print, ->resPrint is filled.
|
||||
return ($error?-1:$resaction);
|
||||
}
|
||||
|
||||
|
||||
@ -3181,19 +3181,19 @@ class Form
|
||||
//print "name=$name, selectedrate=$selectedrate, seller=".$societe_vendeuse->country_code." buyer=".$societe_acheteuse->country_code." buyer is company=".$societe_acheteuse->isACompany()." idprod=$idprod, info_bits=$info_bits type=$type";
|
||||
//exit;
|
||||
|
||||
// Get list of all VAT rates to show
|
||||
// Define list of countries to use to search VAT rates to show
|
||||
// First we defined code_pays to use to find list
|
||||
if (is_object($societe_vendeuse))
|
||||
{
|
||||
$code_pays="'".$societe_vendeuse->country_code."'";
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
$code_pays="'".$mysoc->country_code."'"; // Pour compatibilite ascendente
|
||||
}
|
||||
if (! empty($conf->global->SERVICE_ARE_ECOMMERCE_200238EC)) // If option to have vat for end customer for services is on
|
||||
{
|
||||
if (! $societe_vendeuse->isInEEC() && $societe_acheteuse->isInEEC() && ! $societe_acheteuse->isACompany())
|
||||
if (! $societe_vendeuse->isInEEC() && (! is_object($societe_acheteuse) || ($societe_acheteuse->isInEEC() && ! $societe_acheteuse->isACompany())))
|
||||
{
|
||||
// We also add the buyer
|
||||
if (is_numeric($type))
|
||||
|
||||
@ -120,6 +120,7 @@ class FormFile
|
||||
{
|
||||
if ($perm)
|
||||
{
|
||||
$langs->load('other');
|
||||
print ' ('.$langs->trans("MaxSize").': '.$max.' '.$langs->trans("Kb");
|
||||
print ' '.info_admin($langs->trans("ThisLimitIsDefinedInSetup",$max,$maxphp),1);
|
||||
print ')';
|
||||
|
||||
@ -2921,6 +2921,18 @@ function get_default_tva($thirdparty_seller, $thirdparty_buyer, $idprod=0, $idpr
|
||||
|
||||
dol_syslog("get_default_tva: seller use vat=".$thirdparty_seller->tva_assuj.", seller country=".$thirdparty_seller->country_code.", seller in cee=".$thirdparty_seller->isInEEC().", buyer country=".$thirdparty_buyer->country_code.", buyer in cee=".$thirdparty_buyer->isInEEC().", idprod=".$idprod.", idprodfournprice=".$idprodfournprice.", SERVICE_ARE_ECOMMERCE_200238EC=".(! empty($conf->global->SERVICES_ARE_ECOMMERCE_200238EC)?$conf->global->SERVICES_ARE_ECOMMERCE_200238EC:''));
|
||||
|
||||
// If services are eServices according to EU Council Directive 2002/38/EC (http://ec.europa.eu/taxation_customs/taxation/vat/traders/e-commerce/article_1610_en.htm)
|
||||
// we use the buyer VAT.
|
||||
if (! empty($conf->global->SERVICE_ARE_ECOMMERCE_200238EC))
|
||||
{
|
||||
//print "eee".$thirdparty_buyer->isACompany();exit;
|
||||
if (! $thirdparty_seller->isInEEC() && $thirdparty_buyer->isInEEC() && ! $thirdparty_buyer->isACompany())
|
||||
{
|
||||
//print 'VATRULE 6';
|
||||
return get_product_vat_for_country($idprod,$thirdparty_buyer,$idprodfournprice);
|
||||
}
|
||||
}
|
||||
|
||||
// Si vendeur non assujeti a TVA (tva_assuj vaut 0/1 ou franchise/reel)
|
||||
if (is_numeric($thirdparty_seller->tva_assuj) && ! $thirdparty_seller->tva_assuj)
|
||||
{
|
||||
@ -2964,18 +2976,6 @@ function get_default_tva($thirdparty_seller, $thirdparty_buyer, $idprod=0, $idpr
|
||||
}
|
||||
}
|
||||
|
||||
// If services are eServices according to EU Council Directive 2002/38/EC (ec.europa.eu/taxation_customs/taxation/v.../article_1610_en.htm)
|
||||
// we use the buyer VAT.
|
||||
if (! empty($conf->global->SERVICE_ARE_ECOMMERCE_200238EC))
|
||||
{
|
||||
//print "eee".$thirdparty_buyer->isACompany();exit;
|
||||
if (! $thirdparty_seller->isInEEC() && $thirdparty_buyer->isInEEC() && ! $thirdparty_buyer->isACompany())
|
||||
{
|
||||
//print 'VATRULE 6';
|
||||
return get_product_vat_for_country($idprod,$thirdparty_buyer,$idprodfournprice);
|
||||
}
|
||||
}
|
||||
|
||||
// Sinon la TVA proposee par defaut=0. Fin de regle.
|
||||
// Rem: Cela signifie qu'au moins un des 2 est hors Communaute europeenne et que le pays differe
|
||||
//print 'VATRULE 7';
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
<?php
|
||||
/* Copyright (C) 2010-2012 Laurent Destailleur <eldy@users.sourceforge.net>
|
||||
* Copyright (C) 2010 Regis Houssin <regis.houssin@capnetworks.com>
|
||||
* Copyright (C) 2012 Juanjo Menent <jmenent@2byte.es>
|
||||
* Copyright (C) 2012-2013 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
|
||||
@ -913,7 +913,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after)
|
||||
$newmenu->add("/compta/facture/list.php?leftmenu=customers_bills",$langs->trans("BillsCustomers"),0,$user->rights->facture->lire, '', $mainmenu, 'customers_bills');
|
||||
if (empty($user->societe_id))
|
||||
{
|
||||
$newmenu->add("/compta/clients.php?action=facturer&leftmenu=customers_bills",$langs->trans("NewBill"),1,$user->rights->facture->creer);
|
||||
$newmenu->add("/compta/facture.php?action=create&leftmenu=customers_bills",$langs->trans("NewBill"),1,$user->rights->facture->creer);
|
||||
}
|
||||
$newmenu->add("/compta/facture/fiche-rec.php?leftmenu=customers_bills",$langs->trans("Repeatables"),1,$user->rights->facture->lire);
|
||||
|
||||
|
||||
@ -115,7 +115,7 @@ class doc_generic_order_odt extends ModelePDFCommandes
|
||||
'object_total_ht'=>price($object->total_ht,0,$outputlangs),
|
||||
'object_total_vat'=>price($object->total_tva,0,$outputlangs),
|
||||
'object_total_ttc'=>price($object->total_ttc,0,$outputlangs),
|
||||
'object_total_discount' => price($object->getTotalDiscount(), 0, $outputlangs),
|
||||
'object_total_discount_ht' => price($object->getTotalDiscount(), 0, $outputlangs),
|
||||
'object_vatrate'=>vatrate($object->tva),
|
||||
'object_note_private'=>$object->note,
|
||||
'object_note'=>$object->note_public,
|
||||
|
||||
@ -124,7 +124,7 @@ class doc_generic_invoice_odt extends ModelePDFFactures
|
||||
'object_total_ht'=>price($object->total_ht,0,$outputlangs),
|
||||
'object_total_vat'=>price($object->total_tva,0,$outputlangs),
|
||||
'object_total_ttc'=>price($object->total_ttc,0,$outputlangs),
|
||||
'object_total_discount' => price($object->getTotalDiscount(), 0, $outputlangs),
|
||||
'object_total_discount_ht' => price($object->getTotalDiscount(), 0, $outputlangs),
|
||||
'object_vatrate'=>(isset($object->tva)?vatrate($object->tva):''),
|
||||
'object_note_private'=>$object->note,
|
||||
'object_note'=>$object->note_public,
|
||||
|
||||
@ -114,7 +114,7 @@ class doc_generic_proposal_odt extends ModelePDFPropales
|
||||
'object_total_ht'=>price($object->total_ht,0,$outputlangs),
|
||||
'object_total_vat'=>price($object->total_tva,0,$outputlangs),
|
||||
'object_total_ttc'=>price($object->total_ttc,0,$outputlangs),
|
||||
'object_total_discount' => price($object->getTotalDiscount(), 0, $outputlangs),
|
||||
'object_total_discount_ht' => price($object->getTotalDiscount(), 0, $outputlangs),
|
||||
'object_vatrate'=>vatrate($object->tva),
|
||||
'object_note_private'=>$object->note,
|
||||
'object_note'=>$object->note_public,
|
||||
|
||||
@ -29,6 +29,7 @@
|
||||
else if (type == 'int') { size.val('10').removeAttr('disabled'); }
|
||||
else if (type == 'text') { size.val('2000').removeAttr('disabled'); }
|
||||
else if (type == 'varchar') { size.val('255').removeAttr('disabled'); }
|
||||
else if (type == 'boolean') { size.val('').attr('disabled','disabled'); unique.attr('disabled','disabled');}
|
||||
else size.val('').attr('disabled','disabled');
|
||||
}
|
||||
init_typeoffields();
|
||||
|
||||
@ -31,6 +31,7 @@
|
||||
else if (type == 'int') { size.val('10').removeAttr('disabled'); unique.removeAttr('disabled','disabled'); }
|
||||
else if (type == 'text') { size.val('2000').removeAttr('disabled'); unique.attr('disabled','disabled').removeAttr('checked'); }
|
||||
else if (type == 'varchar') { size.val('255').removeAttr('disabled'); unique.removeAttr('disabled','disabled'); }
|
||||
else if (type == 'boolean') { size.val('').attr('disabled','disabled'); unique.attr('disabled','disabled');}
|
||||
else size.val('').attr('disabled','disabled');
|
||||
}
|
||||
init_typeoffields('');
|
||||
|
||||
@ -31,6 +31,7 @@
|
||||
else if (type == 'int') { size.removeAttr('disabled'); }
|
||||
else if (type == 'text') { size.removeAttr('disabled'); unique.attr('disabled','disabled').removeAttr('checked'); }
|
||||
else if (type == 'varchar') { size.removeAttr('disabled'); }
|
||||
else if (type == 'boolean') { size.val('').attr('disabled','disabled'); unique.attr('disabled','disabled');}
|
||||
else size.val('').attr('disabled','disabled');
|
||||
}
|
||||
init_typeoffields(jQuery("#type").val());
|
||||
|
||||
@ -152,4 +152,4 @@ if (! empty($conf->margin->enabled) && ! empty($object->element) && in_array($ob
|
||||
<?php } ?>
|
||||
|
||||
</form>
|
||||
<!-- END PHP TEMPLATE freeproductline_create.tpl.php -->
|
||||
<!-- END PHP TEMPLATE freeproductline_create.tpl.php -->
|
||||
@ -204,4 +204,4 @@ if (! empty($usemargins))
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
<!-- END PHP TEMPLATE predefinedproductline_create.tpl.php -->
|
||||
<!-- END PHP TEMPLATE predefinedproductline_create.tpl.php -->
|
||||
@ -29,7 +29,7 @@
|
||||
* \brief File that include conf.php file and commons lib like functions.lib.php
|
||||
*/
|
||||
|
||||
if (! defined('DOL_VERSION')) define('DOL_VERSION','3.3.0-beta');
|
||||
if (! defined('DOL_VERSION')) define('DOL_VERSION','3.4.0-alpha');
|
||||
if (! defined('EURO')) define('EURO',chr(128));
|
||||
|
||||
// Define syslog constants
|
||||
|
||||
@ -1,29 +1,29 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
|
||||
* For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
/*! \mainpage CKEditor - PHP server side intergation
|
||||
* \section intro_sec CKEditor
|
||||
* Visit <a href="http://ckeditor.com">CKEditor web site</a> to find more information about the editor.
|
||||
* \section install_sec Installation
|
||||
* \subsection step1 Include ckeditor.php in your PHP web site.
|
||||
* @code
|
||||
* <?php
|
||||
* include("ckeditor/ckeditor.php");
|
||||
* ?>
|
||||
* @endcode
|
||||
* \subsection step2 Create CKEditor class instance and use one of available methods to insert CKEditor.
|
||||
* @code
|
||||
* <?php
|
||||
* $CKEditor = new CKEditor();
|
||||
* $CKEditor->editor("editor1", "<p>Initial value.</p>");
|
||||
* ?>
|
||||
* @endcode
|
||||
*/
|
||||
|
||||
if ( !function_exists('version_compare') || version_compare( phpversion(), '5', '<' ) )
|
||||
include_once( 'ckeditor_php4.php' ) ;
|
||||
else
|
||||
include_once( 'ckeditor_php5.php' ) ;
|
||||
<?php
|
||||
/*
|
||||
* Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
|
||||
* For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
/*! \mainpage CKEditor - PHP server side intergation
|
||||
* \section intro_sec CKEditor
|
||||
* Visit <a href="http://ckeditor.com">CKEditor web site</a> to find more information about the editor.
|
||||
* \section install_sec Installation
|
||||
* \subsection step1 Include ckeditor.php in your PHP web site.
|
||||
* @code
|
||||
* <?php
|
||||
* include("ckeditor/ckeditor.php");
|
||||
* ?>
|
||||
* @endcode
|
||||
* \subsection step2 Create CKEditor class instance and use one of available methods to insert CKEditor.
|
||||
* @code
|
||||
* <?php
|
||||
* $CKEditor = new CKEditor();
|
||||
* $CKEditor->editor("editor1", "<p>Initial value.</p>");
|
||||
* ?>
|
||||
* @endcode
|
||||
*/
|
||||
|
||||
if ( !function_exists('version_compare') || version_compare( phpversion(), '5', '<' ) )
|
||||
include_once( 'ckeditor_php4.php' ) ;
|
||||
else
|
||||
include_once( 'ckeditor_php5.php' ) ;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,33 +1,33 @@
|
||||
<?php
|
||||
//
|
||||
// FPDI - Version 1.4.2
|
||||
//
|
||||
// Copyright 2004-2011 Setasign - Jan Slabon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
require_once('FilterASCII85.php');
|
||||
|
||||
class FilterASCII85_FPDI extends FilterASCII85 {
|
||||
|
||||
var $fpdi;
|
||||
|
||||
function FilterASCII85_FPDI(&$fpdi) {
|
||||
$this->fpdi =& $fpdi;
|
||||
}
|
||||
|
||||
function error($msg) {
|
||||
$this->fpdi->error($msg);
|
||||
}
|
||||
<?php
|
||||
//
|
||||
// FPDI - Version 1.4.2
|
||||
//
|
||||
// Copyright 2004-2011 Setasign - Jan Slabon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
require_once('FilterASCII85.php');
|
||||
|
||||
class FilterASCII85_FPDI extends FilterASCII85 {
|
||||
|
||||
var $fpdi;
|
||||
|
||||
function FilterASCII85_FPDI(&$fpdi) {
|
||||
$this->fpdi =& $fpdi;
|
||||
}
|
||||
|
||||
function error($msg) {
|
||||
$this->fpdi->error($msg);
|
||||
}
|
||||
}
|
||||
@ -1,33 +1,33 @@
|
||||
<?php
|
||||
//
|
||||
// FPDI - Version 1.4.2
|
||||
//
|
||||
// Copyright 2004-2011 Setasign - Jan Slabon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
require_once('FilterLZW.php');
|
||||
|
||||
class FilterLZW_FPDI extends FilterLZW {
|
||||
|
||||
var $fpdi;
|
||||
|
||||
function FilterLZW_FPDI(&$fpdi) {
|
||||
$this->fpdi =& $fpdi;
|
||||
}
|
||||
|
||||
function error($msg) {
|
||||
$this->fpdi->error($msg);
|
||||
}
|
||||
<?php
|
||||
//
|
||||
// FPDI - Version 1.4.2
|
||||
//
|
||||
// Copyright 2004-2011 Setasign - Jan Slabon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
require_once('FilterLZW.php');
|
||||
|
||||
class FilterLZW_FPDI extends FilterLZW {
|
||||
|
||||
var $fpdi;
|
||||
|
||||
function FilterLZW_FPDI(&$fpdi) {
|
||||
$this->fpdi =& $fpdi;
|
||||
}
|
||||
|
||||
function error($msg) {
|
||||
$this->fpdi->error($msg);
|
||||
}
|
||||
}
|
||||
@ -1,449 +1,449 @@
|
||||
<?php
|
||||
//
|
||||
// FPDF_TPL - Version 1.2
|
||||
//
|
||||
// Copyright 2004-2010 Setasign - Jan Slabon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
class FPDF_TPL extends FPDF {
|
||||
/**
|
||||
* Array of Tpl-Data
|
||||
* @var array
|
||||
*/
|
||||
var $tpls = array();
|
||||
|
||||
/**
|
||||
* Current Template-ID
|
||||
* @var int
|
||||
*/
|
||||
var $tpl = 0;
|
||||
|
||||
/**
|
||||
* "In Template"-Flag
|
||||
* @var boolean
|
||||
*/
|
||||
var $_intpl = false;
|
||||
|
||||
/**
|
||||
* Nameprefix of Templates used in Resources-Dictonary
|
||||
* @var string A String defining the Prefix used as Template-Object-Names. Have to beginn with an /
|
||||
*/
|
||||
var $tplprefix = "/TPL";
|
||||
|
||||
/**
|
||||
* Resources used By Templates and Pages
|
||||
* @var array
|
||||
*/
|
||||
var $_res = array();
|
||||
|
||||
/**
|
||||
* Last used Template data
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
var $lastUsedTemplateData = array();
|
||||
|
||||
/**
|
||||
* Start a Template
|
||||
*
|
||||
* This method starts a template. You can give own coordinates to build an own sized
|
||||
* Template. Pay attention, that the margins are adapted to the new templatesize.
|
||||
* If you want to write outside the template, for example to build a clipped Template,
|
||||
* you have to set the Margins and "Cursor"-Position manual after beginTemplate-Call.
|
||||
*
|
||||
* If no parameter is given, the template uses the current page-size.
|
||||
* The Method returns an ID of the current Template. This ID is used later for using this template.
|
||||
* Warning: A created Template is used in PDF at all events. Still if you don't use it after creation!
|
||||
*
|
||||
* @param int $x The x-coordinate given in user-unit
|
||||
* @param int $y The y-coordinate given in user-unit
|
||||
* @param int $w The width given in user-unit
|
||||
* @param int $h The height given in user-unit
|
||||
* @return int The ID of new created Template
|
||||
*/
|
||||
function beginTemplate($x = null, $y = null, $w = null, $h = null) {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$this->Error('This method is only usable with FPDF. Use TCPDF methods startTemplate() instead.');
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->page <= 0)
|
||||
$this->error("You have to add a page to fpdf first!");
|
||||
|
||||
if ($x == null)
|
||||
$x = 0;
|
||||
if ($y == null)
|
||||
$y = 0;
|
||||
if ($w == null)
|
||||
$w = $this->w;
|
||||
if ($h == null)
|
||||
$h = $this->h;
|
||||
|
||||
// Save settings
|
||||
$this->tpl++;
|
||||
$tpl =& $this->tpls[$this->tpl];
|
||||
$tpl = array(
|
||||
'o_x' => $this->x,
|
||||
'o_y' => $this->y,
|
||||
'o_AutoPageBreak' => $this->AutoPageBreak,
|
||||
'o_bMargin' => $this->bMargin,
|
||||
'o_tMargin' => $this->tMargin,
|
||||
'o_lMargin' => $this->lMargin,
|
||||
'o_rMargin' => $this->rMargin,
|
||||
'o_h' => $this->h,
|
||||
'o_w' => $this->w,
|
||||
'buffer' => '',
|
||||
'x' => $x,
|
||||
'y' => $y,
|
||||
'w' => $w,
|
||||
'h' => $h
|
||||
);
|
||||
|
||||
$this->SetAutoPageBreak(false);
|
||||
|
||||
// Define own high and width to calculate possitions correct
|
||||
$this->h = $h;
|
||||
$this->w = $w;
|
||||
|
||||
$this->_intpl = true;
|
||||
$this->SetXY($x + $this->lMargin, $y + $this->tMargin);
|
||||
$this->SetRightMargin($this->w - $w + $this->rMargin);
|
||||
|
||||
return $this->tpl;
|
||||
}
|
||||
|
||||
/**
|
||||
* End Template
|
||||
*
|
||||
* This method ends a template and reset initiated variables on beginTemplate.
|
||||
*
|
||||
* @return mixed If a template is opened, the ID is returned. If not a false is returned.
|
||||
*/
|
||||
function endTemplate() {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::endTemplate'), $args);
|
||||
}
|
||||
|
||||
if ($this->_intpl) {
|
||||
$this->_intpl = false;
|
||||
$tpl =& $this->tpls[$this->tpl];
|
||||
$this->SetXY($tpl['o_x'], $tpl['o_y']);
|
||||
$this->tMargin = $tpl['o_tMargin'];
|
||||
$this->lMargin = $tpl['o_lMargin'];
|
||||
$this->rMargin = $tpl['o_rMargin'];
|
||||
$this->h = $tpl['o_h'];
|
||||
$this->w = $tpl['o_w'];
|
||||
$this->SetAutoPageBreak($tpl['o_AutoPageBreak'], $tpl['o_bMargin']);
|
||||
|
||||
return $this->tpl;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Use a Template in current Page or other Template
|
||||
*
|
||||
* You can use a template in a page or in another template.
|
||||
* You can give the used template a new size like you use the Image()-method.
|
||||
* All parameters are optional. The width or height is calculated automaticaly
|
||||
* if one is given. If no parameter is given the origin size as defined in
|
||||
* beginTemplate() is used.
|
||||
* The calculated or used width and height are returned as an array.
|
||||
*
|
||||
* @param int $tplidx A valid template-Id
|
||||
* @param int $_x The x-position
|
||||
* @param int $_y The y-position
|
||||
* @param int $_w The new width of the template
|
||||
* @param int $_h The new height of the template
|
||||
* @retrun array The height and width of the template
|
||||
*/
|
||||
function useTemplate($tplidx, $_x = null, $_y = null, $_w = 0, $_h = 0) {
|
||||
if ($this->page <= 0)
|
||||
$this->error('You have to add a page first!');
|
||||
|
||||
if (!isset($this->tpls[$tplidx]))
|
||||
$this->error('Template does not exist!');
|
||||
|
||||
if ($this->_intpl) {
|
||||
$this->_res['tpl'][$this->tpl]['tpls'][$tplidx] =& $this->tpls[$tplidx];
|
||||
}
|
||||
|
||||
$tpl =& $this->tpls[$tplidx];
|
||||
$w = $tpl['w'];
|
||||
$h = $tpl['h'];
|
||||
|
||||
if ($_x == null)
|
||||
$_x = 0;
|
||||
if ($_y == null)
|
||||
$_y = 0;
|
||||
|
||||
$_x += $tpl['x'];
|
||||
$_y += $tpl['y'];
|
||||
|
||||
$wh = $this->getTemplateSize($tplidx, $_w, $_h);
|
||||
$_w = $wh['w'];
|
||||
$_h = $wh['h'];
|
||||
|
||||
$tData = array(
|
||||
'x' => $this->x,
|
||||
'y' => $this->y,
|
||||
'w' => $_w,
|
||||
'h' => $_h,
|
||||
'scaleX' => ($_w / $w),
|
||||
'scaleY' => ($_h / $h),
|
||||
'tx' => $_x,
|
||||
'ty' => ($this->h - $_y - $_h),
|
||||
'lty' => ($this->h - $_y - $_h) - ($this->h - $h) * ($_h / $h)
|
||||
);
|
||||
|
||||
$this->_out(sprintf('q %.4F 0 0 %.4F %.4F %.4F cm', $tData['scaleX'], $tData['scaleY'], $tData['tx'] * $this->k, $tData['ty'] * $this->k)); // Translate
|
||||
$this->_out(sprintf('%s%d Do Q', $this->tplprefix, $tplidx));
|
||||
|
||||
// reset font in the outer graphic state
|
||||
if ($this->FontFamily) {
|
||||
$family = $this->FontFamily;
|
||||
$this->FontFamily = '';
|
||||
$this->SetFont($family);
|
||||
}
|
||||
|
||||
$this->lastUsedTemplateData = $tData;
|
||||
|
||||
return array('w' => $_w, 'h' => $_h);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get The calculated Size of a Template
|
||||
*
|
||||
* If one size is given, this method calculates the other one.
|
||||
*
|
||||
* @param int $tplidx A valid template-Id
|
||||
* @param int $_w The width of the template
|
||||
* @param int $_h The height of the template
|
||||
* @return array The height and width of the template
|
||||
*/
|
||||
function getTemplateSize($tplidx, $_w = 0, $_h = 0) {
|
||||
if (!$this->tpls[$tplidx])
|
||||
return false;
|
||||
|
||||
$tpl =& $this->tpls[$tplidx];
|
||||
$w = $tpl['w'];
|
||||
$h = $tpl['h'];
|
||||
|
||||
if ($_w == 0 and $_h == 0) {
|
||||
$_w = $w;
|
||||
$_h = $h;
|
||||
}
|
||||
|
||||
if($_w == 0)
|
||||
$_w = $_h * $w / $h;
|
||||
if($_h == 0)
|
||||
$_h = $_w * $h / $w;
|
||||
|
||||
return array("w" => $_w, "h" => $_h);
|
||||
}
|
||||
|
||||
/**
|
||||
* See FPDF/TCPDF-Documentation ;-)
|
||||
*/
|
||||
public function SetFont($family, $style = '', $size = 0) {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::SetFont'), $args);
|
||||
}
|
||||
|
||||
/**
|
||||
* force the resetting of font changes in a template
|
||||
*/
|
||||
if ($this->_intpl)
|
||||
$this->FontFamily = '';
|
||||
|
||||
parent::SetFont($family, $style, $size);
|
||||
|
||||
$fontkey = $this->FontFamily . $this->FontStyle;
|
||||
|
||||
if ($this->_intpl) {
|
||||
$this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey];
|
||||
} else {
|
||||
$this->_res['page'][$this->page]['fonts'][$fontkey] =& $this->fonts[$fontkey];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* See FPDF/TCPDF-Documentation ;-)
|
||||
*/
|
||||
function Image($file, $x = null, $y = null, $w = 0, $h = 0, $type = '', $link = '') {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::Image'), $args);
|
||||
}
|
||||
|
||||
$ret = parent::Image($file, $x, $y, $w, $h, $type, $link);
|
||||
if ($this->_intpl) {
|
||||
$this->_res['tpl'][$this->tpl]['images'][$file] =& $this->images[$file];
|
||||
} else {
|
||||
$this->_res['page'][$this->page]['images'][$file] =& $this->images[$file];
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* See FPDF-Documentation ;-)
|
||||
*
|
||||
* AddPage is not available when you're "in" a template.
|
||||
*/
|
||||
function AddPage($orientation = '', $format = '') {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::AddPage'), $args);
|
||||
}
|
||||
|
||||
if ($this->_intpl)
|
||||
$this->Error('Adding pages in templates isn\'t possible!');
|
||||
|
||||
parent::AddPage($orientation, $format);
|
||||
}
|
||||
|
||||
/**
|
||||
* Preserve adding Links in Templates ...won't work
|
||||
*/
|
||||
function Link($x, $y, $w, $h, $link) {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::Link'), $args);
|
||||
}
|
||||
|
||||
if ($this->_intpl)
|
||||
$this->Error('Using links in templates aren\'t possible!');
|
||||
|
||||
parent::Link($x, $y, $w, $h, $link);
|
||||
}
|
||||
|
||||
function AddLink() {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::AddLink'), $args);
|
||||
}
|
||||
|
||||
if ($this->_intpl)
|
||||
$this->Error('Adding links in templates aren\'t possible!');
|
||||
return parent::AddLink();
|
||||
}
|
||||
|
||||
function SetLink($link, $y = 0, $page = -1) {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::SetLink'), $args);
|
||||
}
|
||||
|
||||
if ($this->_intpl)
|
||||
$this->Error('Setting links in templates aren\'t possible!');
|
||||
parent::SetLink($link, $y, $page);
|
||||
}
|
||||
|
||||
/**
|
||||
* Private Method that writes the form xobjects
|
||||
*/
|
||||
function _putformxobjects() {
|
||||
$filter=($this->compress) ? '/Filter /FlateDecode ' : '';
|
||||
reset($this->tpls);
|
||||
foreach($this->tpls AS $tplidx => $tpl) {
|
||||
|
||||
$p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer'];
|
||||
$this->_newobj();
|
||||
$this->tpls[$tplidx]['n'] = $this->n;
|
||||
$this->_out('<<'.$filter.'/Type /XObject');
|
||||
$this->_out('/Subtype /Form');
|
||||
$this->_out('/FormType 1');
|
||||
$this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]',
|
||||
// llx
|
||||
$tpl['x'] * $this->k,
|
||||
// lly
|
||||
-$tpl['y'] * $this->k,
|
||||
// urx
|
||||
($tpl['w'] + $tpl['x']) * $this->k,
|
||||
// ury
|
||||
($tpl['h'] - $tpl['y']) * $this->k
|
||||
));
|
||||
|
||||
if ($tpl['x'] != 0 || $tpl['y'] != 0) {
|
||||
$this->_out(sprintf('/Matrix [1 0 0 1 %.5F %.5F]',
|
||||
-$tpl['x'] * $this->k * 2, $tpl['y'] * $this->k * 2
|
||||
));
|
||||
}
|
||||
|
||||
$this->_out('/Resources ');
|
||||
|
||||
$this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
|
||||
if (isset($this->_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) {
|
||||
$this->_out('/Font <<');
|
||||
foreach($this->_res['tpl'][$tplidx]['fonts'] as $font)
|
||||
$this->_out('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R');
|
||||
$this->_out('>>');
|
||||
}
|
||||
if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) ||
|
||||
isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls']))
|
||||
{
|
||||
$this->_out('/XObject <<');
|
||||
if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) {
|
||||
foreach($this->_res['tpl'][$tplidx]['images'] as $image)
|
||||
$this->_out('/I' . $image['i'] . ' ' . $image['n'] . ' 0 R');
|
||||
}
|
||||
if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) {
|
||||
foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl)
|
||||
$this->_out($this->tplprefix . $i . ' ' . $tpl['n'] . ' 0 R');
|
||||
}
|
||||
$this->_out('>>');
|
||||
}
|
||||
$this->_out('>>');
|
||||
|
||||
$this->_out('/Length ' . strlen($p) . ' >>');
|
||||
$this->_putstream($p);
|
||||
$this->_out('endobj');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Overwritten to add _putformxobjects() after _putimages()
|
||||
*
|
||||
*/
|
||||
function _putimages() {
|
||||
parent::_putimages();
|
||||
$this->_putformxobjects();
|
||||
}
|
||||
|
||||
function _putxobjectdict() {
|
||||
parent::_putxobjectdict();
|
||||
|
||||
if (count($this->tpls)) {
|
||||
foreach($this->tpls as $tplidx => $tpl) {
|
||||
$this->_out(sprintf('%s%d %d 0 R', $this->tplprefix, $tplidx, $tpl['n']));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Private Method
|
||||
*/
|
||||
function _out($s) {
|
||||
if ($this->state == 2 && $this->_intpl) {
|
||||
$this->tpls[$this->tpl]['buffer'] .= $s . "\n";
|
||||
} else {
|
||||
parent::_out($s);
|
||||
}
|
||||
}
|
||||
}
|
||||
<?php
|
||||
//
|
||||
// FPDF_TPL - Version 1.2
|
||||
//
|
||||
// Copyright 2004-2010 Setasign - Jan Slabon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
class FPDF_TPL extends FPDF {
|
||||
/**
|
||||
* Array of Tpl-Data
|
||||
* @var array
|
||||
*/
|
||||
var $tpls = array();
|
||||
|
||||
/**
|
||||
* Current Template-ID
|
||||
* @var int
|
||||
*/
|
||||
var $tpl = 0;
|
||||
|
||||
/**
|
||||
* "In Template"-Flag
|
||||
* @var boolean
|
||||
*/
|
||||
var $_intpl = false;
|
||||
|
||||
/**
|
||||
* Nameprefix of Templates used in Resources-Dictonary
|
||||
* @var string A String defining the Prefix used as Template-Object-Names. Have to beginn with an /
|
||||
*/
|
||||
var $tplprefix = "/TPL";
|
||||
|
||||
/**
|
||||
* Resources used By Templates and Pages
|
||||
* @var array
|
||||
*/
|
||||
var $_res = array();
|
||||
|
||||
/**
|
||||
* Last used Template data
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
var $lastUsedTemplateData = array();
|
||||
|
||||
/**
|
||||
* Start a Template
|
||||
*
|
||||
* This method starts a template. You can give own coordinates to build an own sized
|
||||
* Template. Pay attention, that the margins are adapted to the new templatesize.
|
||||
* If you want to write outside the template, for example to build a clipped Template,
|
||||
* you have to set the Margins and "Cursor"-Position manual after beginTemplate-Call.
|
||||
*
|
||||
* If no parameter is given, the template uses the current page-size.
|
||||
* The Method returns an ID of the current Template. This ID is used later for using this template.
|
||||
* Warning: A created Template is used in PDF at all events. Still if you don't use it after creation!
|
||||
*
|
||||
* @param int $x The x-coordinate given in user-unit
|
||||
* @param int $y The y-coordinate given in user-unit
|
||||
* @param int $w The width given in user-unit
|
||||
* @param int $h The height given in user-unit
|
||||
* @return int The ID of new created Template
|
||||
*/
|
||||
function beginTemplate($x = null, $y = null, $w = null, $h = null) {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$this->Error('This method is only usable with FPDF. Use TCPDF methods startTemplate() instead.');
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->page <= 0)
|
||||
$this->error("You have to add a page to fpdf first!");
|
||||
|
||||
if ($x == null)
|
||||
$x = 0;
|
||||
if ($y == null)
|
||||
$y = 0;
|
||||
if ($w == null)
|
||||
$w = $this->w;
|
||||
if ($h == null)
|
||||
$h = $this->h;
|
||||
|
||||
// Save settings
|
||||
$this->tpl++;
|
||||
$tpl =& $this->tpls[$this->tpl];
|
||||
$tpl = array(
|
||||
'o_x' => $this->x,
|
||||
'o_y' => $this->y,
|
||||
'o_AutoPageBreak' => $this->AutoPageBreak,
|
||||
'o_bMargin' => $this->bMargin,
|
||||
'o_tMargin' => $this->tMargin,
|
||||
'o_lMargin' => $this->lMargin,
|
||||
'o_rMargin' => $this->rMargin,
|
||||
'o_h' => $this->h,
|
||||
'o_w' => $this->w,
|
||||
'buffer' => '',
|
||||
'x' => $x,
|
||||
'y' => $y,
|
||||
'w' => $w,
|
||||
'h' => $h
|
||||
);
|
||||
|
||||
$this->SetAutoPageBreak(false);
|
||||
|
||||
// Define own high and width to calculate possitions correct
|
||||
$this->h = $h;
|
||||
$this->w = $w;
|
||||
|
||||
$this->_intpl = true;
|
||||
$this->SetXY($x + $this->lMargin, $y + $this->tMargin);
|
||||
$this->SetRightMargin($this->w - $w + $this->rMargin);
|
||||
|
||||
return $this->tpl;
|
||||
}
|
||||
|
||||
/**
|
||||
* End Template
|
||||
*
|
||||
* This method ends a template and reset initiated variables on beginTemplate.
|
||||
*
|
||||
* @return mixed If a template is opened, the ID is returned. If not a false is returned.
|
||||
*/
|
||||
function endTemplate() {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::endTemplate'), $args);
|
||||
}
|
||||
|
||||
if ($this->_intpl) {
|
||||
$this->_intpl = false;
|
||||
$tpl =& $this->tpls[$this->tpl];
|
||||
$this->SetXY($tpl['o_x'], $tpl['o_y']);
|
||||
$this->tMargin = $tpl['o_tMargin'];
|
||||
$this->lMargin = $tpl['o_lMargin'];
|
||||
$this->rMargin = $tpl['o_rMargin'];
|
||||
$this->h = $tpl['o_h'];
|
||||
$this->w = $tpl['o_w'];
|
||||
$this->SetAutoPageBreak($tpl['o_AutoPageBreak'], $tpl['o_bMargin']);
|
||||
|
||||
return $this->tpl;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Use a Template in current Page or other Template
|
||||
*
|
||||
* You can use a template in a page or in another template.
|
||||
* You can give the used template a new size like you use the Image()-method.
|
||||
* All parameters are optional. The width or height is calculated automaticaly
|
||||
* if one is given. If no parameter is given the origin size as defined in
|
||||
* beginTemplate() is used.
|
||||
* The calculated or used width and height are returned as an array.
|
||||
*
|
||||
* @param int $tplidx A valid template-Id
|
||||
* @param int $_x The x-position
|
||||
* @param int $_y The y-position
|
||||
* @param int $_w The new width of the template
|
||||
* @param int $_h The new height of the template
|
||||
* @retrun array The height and width of the template
|
||||
*/
|
||||
function useTemplate($tplidx, $_x = null, $_y = null, $_w = 0, $_h = 0) {
|
||||
if ($this->page <= 0)
|
||||
$this->error('You have to add a page first!');
|
||||
|
||||
if (!isset($this->tpls[$tplidx]))
|
||||
$this->error('Template does not exist!');
|
||||
|
||||
if ($this->_intpl) {
|
||||
$this->_res['tpl'][$this->tpl]['tpls'][$tplidx] =& $this->tpls[$tplidx];
|
||||
}
|
||||
|
||||
$tpl =& $this->tpls[$tplidx];
|
||||
$w = $tpl['w'];
|
||||
$h = $tpl['h'];
|
||||
|
||||
if ($_x == null)
|
||||
$_x = 0;
|
||||
if ($_y == null)
|
||||
$_y = 0;
|
||||
|
||||
$_x += $tpl['x'];
|
||||
$_y += $tpl['y'];
|
||||
|
||||
$wh = $this->getTemplateSize($tplidx, $_w, $_h);
|
||||
$_w = $wh['w'];
|
||||
$_h = $wh['h'];
|
||||
|
||||
$tData = array(
|
||||
'x' => $this->x,
|
||||
'y' => $this->y,
|
||||
'w' => $_w,
|
||||
'h' => $_h,
|
||||
'scaleX' => ($_w / $w),
|
||||
'scaleY' => ($_h / $h),
|
||||
'tx' => $_x,
|
||||
'ty' => ($this->h - $_y - $_h),
|
||||
'lty' => ($this->h - $_y - $_h) - ($this->h - $h) * ($_h / $h)
|
||||
);
|
||||
|
||||
$this->_out(sprintf('q %.4F 0 0 %.4F %.4F %.4F cm', $tData['scaleX'], $tData['scaleY'], $tData['tx'] * $this->k, $tData['ty'] * $this->k)); // Translate
|
||||
$this->_out(sprintf('%s%d Do Q', $this->tplprefix, $tplidx));
|
||||
|
||||
// reset font in the outer graphic state
|
||||
if ($this->FontFamily) {
|
||||
$family = $this->FontFamily;
|
||||
$this->FontFamily = '';
|
||||
$this->SetFont($family);
|
||||
}
|
||||
|
||||
$this->lastUsedTemplateData = $tData;
|
||||
|
||||
return array('w' => $_w, 'h' => $_h);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get The calculated Size of a Template
|
||||
*
|
||||
* If one size is given, this method calculates the other one.
|
||||
*
|
||||
* @param int $tplidx A valid template-Id
|
||||
* @param int $_w The width of the template
|
||||
* @param int $_h The height of the template
|
||||
* @return array The height and width of the template
|
||||
*/
|
||||
function getTemplateSize($tplidx, $_w = 0, $_h = 0) {
|
||||
if (!$this->tpls[$tplidx])
|
||||
return false;
|
||||
|
||||
$tpl =& $this->tpls[$tplidx];
|
||||
$w = $tpl['w'];
|
||||
$h = $tpl['h'];
|
||||
|
||||
if ($_w == 0 and $_h == 0) {
|
||||
$_w = $w;
|
||||
$_h = $h;
|
||||
}
|
||||
|
||||
if($_w == 0)
|
||||
$_w = $_h * $w / $h;
|
||||
if($_h == 0)
|
||||
$_h = $_w * $h / $w;
|
||||
|
||||
return array("w" => $_w, "h" => $_h);
|
||||
}
|
||||
|
||||
/**
|
||||
* See FPDF/TCPDF-Documentation ;-)
|
||||
*/
|
||||
public function SetFont($family, $style = '', $size = 0) {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::SetFont'), $args);
|
||||
}
|
||||
|
||||
/**
|
||||
* force the resetting of font changes in a template
|
||||
*/
|
||||
if ($this->_intpl)
|
||||
$this->FontFamily = '';
|
||||
|
||||
parent::SetFont($family, $style, $size);
|
||||
|
||||
$fontkey = $this->FontFamily . $this->FontStyle;
|
||||
|
||||
if ($this->_intpl) {
|
||||
$this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey];
|
||||
} else {
|
||||
$this->_res['page'][$this->page]['fonts'][$fontkey] =& $this->fonts[$fontkey];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* See FPDF/TCPDF-Documentation ;-)
|
||||
*/
|
||||
function Image($file, $x = null, $y = null, $w = 0, $h = 0, $type = '', $link = '') {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::Image'), $args);
|
||||
}
|
||||
|
||||
$ret = parent::Image($file, $x, $y, $w, $h, $type, $link);
|
||||
if ($this->_intpl) {
|
||||
$this->_res['tpl'][$this->tpl]['images'][$file] =& $this->images[$file];
|
||||
} else {
|
||||
$this->_res['page'][$this->page]['images'][$file] =& $this->images[$file];
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* See FPDF-Documentation ;-)
|
||||
*
|
||||
* AddPage is not available when you're "in" a template.
|
||||
*/
|
||||
function AddPage($orientation = '', $format = '') {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::AddPage'), $args);
|
||||
}
|
||||
|
||||
if ($this->_intpl)
|
||||
$this->Error('Adding pages in templates isn\'t possible!');
|
||||
|
||||
parent::AddPage($orientation, $format);
|
||||
}
|
||||
|
||||
/**
|
||||
* Preserve adding Links in Templates ...won't work
|
||||
*/
|
||||
function Link($x, $y, $w, $h, $link) {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::Link'), $args);
|
||||
}
|
||||
|
||||
if ($this->_intpl)
|
||||
$this->Error('Using links in templates aren\'t possible!');
|
||||
|
||||
parent::Link($x, $y, $w, $h, $link);
|
||||
}
|
||||
|
||||
function AddLink() {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::AddLink'), $args);
|
||||
}
|
||||
|
||||
if ($this->_intpl)
|
||||
$this->Error('Adding links in templates aren\'t possible!');
|
||||
return parent::AddLink();
|
||||
}
|
||||
|
||||
function SetLink($link, $y = 0, $page = -1) {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::SetLink'), $args);
|
||||
}
|
||||
|
||||
if ($this->_intpl)
|
||||
$this->Error('Setting links in templates aren\'t possible!');
|
||||
parent::SetLink($link, $y, $page);
|
||||
}
|
||||
|
||||
/**
|
||||
* Private Method that writes the form xobjects
|
||||
*/
|
||||
function _putformxobjects() {
|
||||
$filter=($this->compress) ? '/Filter /FlateDecode ' : '';
|
||||
reset($this->tpls);
|
||||
foreach($this->tpls AS $tplidx => $tpl) {
|
||||
|
||||
$p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer'];
|
||||
$this->_newobj();
|
||||
$this->tpls[$tplidx]['n'] = $this->n;
|
||||
$this->_out('<<'.$filter.'/Type /XObject');
|
||||
$this->_out('/Subtype /Form');
|
||||
$this->_out('/FormType 1');
|
||||
$this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]',
|
||||
// llx
|
||||
$tpl['x'] * $this->k,
|
||||
// lly
|
||||
-$tpl['y'] * $this->k,
|
||||
// urx
|
||||
($tpl['w'] + $tpl['x']) * $this->k,
|
||||
// ury
|
||||
($tpl['h'] - $tpl['y']) * $this->k
|
||||
));
|
||||
|
||||
if ($tpl['x'] != 0 || $tpl['y'] != 0) {
|
||||
$this->_out(sprintf('/Matrix [1 0 0 1 %.5F %.5F]',
|
||||
-$tpl['x'] * $this->k * 2, $tpl['y'] * $this->k * 2
|
||||
));
|
||||
}
|
||||
|
||||
$this->_out('/Resources ');
|
||||
|
||||
$this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
|
||||
if (isset($this->_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) {
|
||||
$this->_out('/Font <<');
|
||||
foreach($this->_res['tpl'][$tplidx]['fonts'] as $font)
|
||||
$this->_out('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R');
|
||||
$this->_out('>>');
|
||||
}
|
||||
if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) ||
|
||||
isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls']))
|
||||
{
|
||||
$this->_out('/XObject <<');
|
||||
if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) {
|
||||
foreach($this->_res['tpl'][$tplidx]['images'] as $image)
|
||||
$this->_out('/I' . $image['i'] . ' ' . $image['n'] . ' 0 R');
|
||||
}
|
||||
if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) {
|
||||
foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl)
|
||||
$this->_out($this->tplprefix . $i . ' ' . $tpl['n'] . ' 0 R');
|
||||
}
|
||||
$this->_out('>>');
|
||||
}
|
||||
$this->_out('>>');
|
||||
|
||||
$this->_out('/Length ' . strlen($p) . ' >>');
|
||||
$this->_putstream($p);
|
||||
$this->_out('endobj');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Overwritten to add _putformxobjects() after _putimages()
|
||||
*
|
||||
*/
|
||||
function _putimages() {
|
||||
parent::_putimages();
|
||||
$this->_putformxobjects();
|
||||
}
|
||||
|
||||
function _putxobjectdict() {
|
||||
parent::_putxobjectdict();
|
||||
|
||||
if (count($this->tpls)) {
|
||||
foreach($this->tpls as $tplidx => $tpl) {
|
||||
$this->_out(sprintf('%s%d %d 0 R', $this->tplprefix, $tplidx, $tpl['n']));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Private Method
|
||||
*/
|
||||
function _out($s) {
|
||||
if ($this->state == 2 && $this->_intpl) {
|
||||
$this->tpls[$this->tpl]['buffer'] .= $s . "\n";
|
||||
} else {
|
||||
parent::_out($s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,408 +1,408 @@
|
||||
<?php
|
||||
//
|
||||
// FPDI - Version 1.4.2
|
||||
//
|
||||
// Copyright 2004-2011 Setasign - Jan Slabon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
require_once('pdf_parser.php');
|
||||
|
||||
class fpdi_pdf_parser extends pdf_parser {
|
||||
|
||||
/**
|
||||
* Pages
|
||||
* Index beginns at 0
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
var $pages;
|
||||
|
||||
/**
|
||||
* Page count
|
||||
* @var integer
|
||||
*/
|
||||
var $page_count;
|
||||
|
||||
/**
|
||||
* actual page number
|
||||
* @var integer
|
||||
*/
|
||||
var $pageno;
|
||||
|
||||
/**
|
||||
* PDF Version of imported Document
|
||||
* @var string
|
||||
*/
|
||||
var $pdfVersion;
|
||||
|
||||
/**
|
||||
* FPDI Reference
|
||||
* @var object
|
||||
*/
|
||||
var $fpdi;
|
||||
|
||||
/**
|
||||
* Available BoxTypes
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
var $availableBoxes = array('/MediaBox', '/CropBox', '/BleedBox', '/TrimBox', '/ArtBox');
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $filename Source-Filename
|
||||
* @param object $fpdi Object of type fpdi
|
||||
*/
|
||||
function fpdi_pdf_parser($filename, &$fpdi) {
|
||||
$this->fpdi =& $fpdi;
|
||||
|
||||
parent::pdf_parser($filename);
|
||||
|
||||
// resolve Pages-Dictonary
|
||||
$pages = $this->pdf_resolve_object($this->c, $this->root[1][1]['/Pages']);
|
||||
|
||||
// Read pages
|
||||
$this->read_pages($this->c, $pages, $this->pages);
|
||||
|
||||
// count pages;
|
||||
$this->page_count = count($this->pages);
|
||||
}
|
||||
|
||||
/**
|
||||
* Overwrite parent::error()
|
||||
*
|
||||
* @param string $msg Error-Message
|
||||
*/
|
||||
function error($msg) {
|
||||
$this->fpdi->error($msg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get pagecount from sourcefile
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
function getPageCount() {
|
||||
return $this->page_count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set pageno
|
||||
*
|
||||
* @param int $pageno Pagenumber to use
|
||||
*/
|
||||
function setPageno($pageno) {
|
||||
$pageno = ((int) $pageno) - 1;
|
||||
|
||||
if ($pageno < 0 || $pageno >= $this->getPageCount()) {
|
||||
$this->fpdi->error('Pagenumber is wrong!');
|
||||
}
|
||||
|
||||
$this->pageno = $pageno;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get page-resources from current page
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getPageResources() {
|
||||
return $this->_getPageResources($this->pages[$this->pageno]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get page-resources from /Page
|
||||
*
|
||||
* @param array $obj Array of pdf-data
|
||||
*/
|
||||
function _getPageResources ($obj) { // $obj = /Page
|
||||
$obj = $this->pdf_resolve_object($this->c, $obj);
|
||||
|
||||
// If the current object has a resources
|
||||
// dictionary associated with it, we use
|
||||
// it. Otherwise, we move back to its
|
||||
// parent object.
|
||||
if (isset ($obj[1][1]['/Resources'])) {
|
||||
$res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Resources']);
|
||||
if ($res[0] == PDF_TYPE_OBJECT)
|
||||
return $res[1];
|
||||
return $res;
|
||||
} else {
|
||||
if (!isset ($obj[1][1]['/Parent'])) {
|
||||
return false;
|
||||
} else {
|
||||
$res = $this->_getPageResources($obj[1][1]['/Parent']);
|
||||
if ($res[0] == PDF_TYPE_OBJECT)
|
||||
return $res[1];
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get content of current page
|
||||
*
|
||||
* If more /Contents is an array, the streams are concated
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getContent() {
|
||||
$buffer = '';
|
||||
|
||||
if (isset($this->pages[$this->pageno][1][1]['/Contents'])) {
|
||||
$contents = $this->_getPageContent($this->pages[$this->pageno][1][1]['/Contents']);
|
||||
foreach($contents AS $tmp_content) {
|
||||
$buffer .= $this->_rebuildContentStream($tmp_content) . ' ';
|
||||
}
|
||||
}
|
||||
|
||||
return $buffer;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resolve all content-objects
|
||||
*
|
||||
* @param array $content_ref
|
||||
* @return array
|
||||
*/
|
||||
function _getPageContent($content_ref) {
|
||||
$contents = array();
|
||||
|
||||
if ($content_ref[0] == PDF_TYPE_OBJREF) {
|
||||
$content = $this->pdf_resolve_object($this->c, $content_ref);
|
||||
if ($content[1][0] == PDF_TYPE_ARRAY) {
|
||||
$contents = $this->_getPageContent($content[1]);
|
||||
} else {
|
||||
$contents[] = $content;
|
||||
}
|
||||
} else if ($content_ref[0] == PDF_TYPE_ARRAY) {
|
||||
foreach ($content_ref[1] AS $tmp_content_ref) {
|
||||
$contents = array_merge($contents,$this->_getPageContent($tmp_content_ref));
|
||||
}
|
||||
}
|
||||
|
||||
return $contents;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Rebuild content-streams
|
||||
*
|
||||
* @param array $obj
|
||||
* @return string
|
||||
*/
|
||||
function _rebuildContentStream($obj) {
|
||||
$filters = array();
|
||||
|
||||
if (isset($obj[1][1]['/Filter'])) {
|
||||
$_filter = $obj[1][1]['/Filter'];
|
||||
|
||||
if ($_filter[0] == PDF_TYPE_OBJREF) {
|
||||
$tmpFilter = $this->pdf_resolve_object($this->c, $_filter);
|
||||
$_filter = $tmpFilter[1];
|
||||
}
|
||||
|
||||
if ($_filter[0] == PDF_TYPE_TOKEN) {
|
||||
$filters[] = $_filter;
|
||||
} else if ($_filter[0] == PDF_TYPE_ARRAY) {
|
||||
$filters = $_filter[1];
|
||||
}
|
||||
}
|
||||
|
||||
$stream = $obj[2][1];
|
||||
|
||||
foreach ($filters AS $_filter) {
|
||||
switch ($_filter[1]) {
|
||||
case '/FlateDecode':
|
||||
case '/Fl':
|
||||
// $stream .= "\x0F\x0D"; // in an errorious stream this suffix could work
|
||||
// $stream .= "\x0A";
|
||||
// $stream .= "\x0D";
|
||||
if (function_exists('gzuncompress')) {
|
||||
$stream = (strlen($stream) > 0) ? @gzuncompress($stream) : '';
|
||||
} else {
|
||||
$this->error(sprintf('To handle %s filter, please compile php with zlib support.',$_filter[1]));
|
||||
}
|
||||
|
||||
if ($stream === false) {
|
||||
$this->error('Error while decompressing stream.');
|
||||
}
|
||||
break;
|
||||
case '/LZWDecode':
|
||||
include_once('filters/FilterLZW_FPDI.php');
|
||||
$decoder = new FilterLZW_FPDI($this->fpdi);
|
||||
$stream = $decoder->decode($stream);
|
||||
break;
|
||||
case '/ASCII85Decode':
|
||||
include_once('filters/FilterASCII85_FPDI.php');
|
||||
$decoder = new FilterASCII85_FPDI($this->fpdi);
|
||||
$stream = $decoder->decode($stream);
|
||||
break;
|
||||
case null:
|
||||
$stream = $stream;
|
||||
break;
|
||||
default:
|
||||
$this->error(sprintf('Unsupported Filter: %s',$_filter[1]));
|
||||
}
|
||||
}
|
||||
|
||||
return $stream;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a Box from a page
|
||||
* Arrayformat is same as used by fpdf_tpl
|
||||
*
|
||||
* @param array $page a /Page
|
||||
* @param string $box_index Type of Box @see $availableBoxes
|
||||
* @param float Scale factor from user space units to points
|
||||
* @return array
|
||||
*/
|
||||
function getPageBox($page, $box_index, $k) {
|
||||
$page = $this->pdf_resolve_object($this->c, $page);
|
||||
$box = null;
|
||||
if (isset($page[1][1][$box_index]))
|
||||
$box =& $page[1][1][$box_index];
|
||||
|
||||
if (!is_null($box) && $box[0] == PDF_TYPE_OBJREF) {
|
||||
$tmp_box = $this->pdf_resolve_object($this->c, $box);
|
||||
$box = $tmp_box[1];
|
||||
}
|
||||
|
||||
if (!is_null($box) && $box[0] == PDF_TYPE_ARRAY) {
|
||||
$b =& $box[1];
|
||||
return array('x' => $b[0][1] / $k,
|
||||
'y' => $b[1][1] / $k,
|
||||
'w' => abs($b[0][1] - $b[2][1]) / $k,
|
||||
'h' => abs($b[1][1] - $b[3][1]) / $k,
|
||||
'llx' => min($b[0][1], $b[2][1]) / $k,
|
||||
'lly' => min($b[1][1], $b[3][1]) / $k,
|
||||
'urx' => max($b[0][1], $b[2][1]) / $k,
|
||||
'ury' => max($b[1][1], $b[3][1]) / $k,
|
||||
);
|
||||
} else if (!isset ($page[1][1]['/Parent'])) {
|
||||
return false;
|
||||
} else {
|
||||
return $this->getPageBox($this->pdf_resolve_object($this->c, $page[1][1]['/Parent']), $box_index, $k);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all page boxes by page no
|
||||
*
|
||||
* @param int The page number
|
||||
* @param float Scale factor from user space units to points
|
||||
* @return array
|
||||
*/
|
||||
function getPageBoxes($pageno, $k) {
|
||||
return $this->_getPageBoxes($this->pages[$pageno - 1], $k);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all boxes from /Page
|
||||
*
|
||||
* @param array a /Page
|
||||
* @return array
|
||||
*/
|
||||
function _getPageBoxes($page, $k) {
|
||||
$boxes = array();
|
||||
|
||||
foreach($this->availableBoxes AS $box) {
|
||||
if ($_box = $this->getPageBox($page, $box, $k)) {
|
||||
$boxes[$box] = $_box;
|
||||
}
|
||||
}
|
||||
|
||||
return $boxes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the page rotation by pageno
|
||||
*
|
||||
* @param integer $pageno
|
||||
* @return array
|
||||
*/
|
||||
function getPageRotation($pageno) {
|
||||
return $this->_getPageRotation($this->pages[$pageno - 1]);
|
||||
}
|
||||
|
||||
function _getPageRotation($obj) { // $obj = /Page
|
||||
$obj = $this->pdf_resolve_object($this->c, $obj);
|
||||
if (isset ($obj[1][1]['/Rotate'])) {
|
||||
$res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Rotate']);
|
||||
if ($res[0] == PDF_TYPE_OBJECT)
|
||||
return $res[1];
|
||||
return $res;
|
||||
} else {
|
||||
if (!isset ($obj[1][1]['/Parent'])) {
|
||||
return false;
|
||||
} else {
|
||||
$res = $this->_getPageRotation($obj[1][1]['/Parent']);
|
||||
if ($res[0] == PDF_TYPE_OBJECT)
|
||||
return $res[1];
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Read all /Page(es)
|
||||
*
|
||||
* @param object pdf_context
|
||||
* @param array /Pages
|
||||
* @param array the result-array
|
||||
*/
|
||||
function read_pages(&$c, &$pages, &$result) {
|
||||
// Get the kids dictionary
|
||||
$_kids = $this->pdf_resolve_object ($c, $pages[1][1]['/Kids']);
|
||||
|
||||
if (!is_array($_kids))
|
||||
$this->error('Cannot find /Kids in current /Page-Dictionary');
|
||||
|
||||
if ($_kids[1][0] == PDF_TYPE_ARRAY) {
|
||||
$kids = $_kids[1][1];
|
||||
} else {
|
||||
$kids = $_kids[1];
|
||||
}
|
||||
|
||||
foreach ($kids as $v) {
|
||||
$pg = $this->pdf_resolve_object ($c, $v);
|
||||
if ($pg[1][1]['/Type'][1] === '/Pages') {
|
||||
// If one of the kids is an embedded
|
||||
// /Pages array, resolve it as well.
|
||||
$this->read_pages($c, $pg, $result);
|
||||
} else {
|
||||
$result[] = $pg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get PDF-Version
|
||||
*
|
||||
* And reset the PDF Version used in FPDI if needed
|
||||
*/
|
||||
function getPDFVersion() {
|
||||
parent::getPDFVersion();
|
||||
$this->fpdi->setPDFVersion(max($this->fpdi->getPDFVersion(), $this->pdfVersion));
|
||||
}
|
||||
<?php
|
||||
//
|
||||
// FPDI - Version 1.4.2
|
||||
//
|
||||
// Copyright 2004-2011 Setasign - Jan Slabon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
require_once('pdf_parser.php');
|
||||
|
||||
class fpdi_pdf_parser extends pdf_parser {
|
||||
|
||||
/**
|
||||
* Pages
|
||||
* Index beginns at 0
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
var $pages;
|
||||
|
||||
/**
|
||||
* Page count
|
||||
* @var integer
|
||||
*/
|
||||
var $page_count;
|
||||
|
||||
/**
|
||||
* actual page number
|
||||
* @var integer
|
||||
*/
|
||||
var $pageno;
|
||||
|
||||
/**
|
||||
* PDF Version of imported Document
|
||||
* @var string
|
||||
*/
|
||||
var $pdfVersion;
|
||||
|
||||
/**
|
||||
* FPDI Reference
|
||||
* @var object
|
||||
*/
|
||||
var $fpdi;
|
||||
|
||||
/**
|
||||
* Available BoxTypes
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
var $availableBoxes = array('/MediaBox', '/CropBox', '/BleedBox', '/TrimBox', '/ArtBox');
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $filename Source-Filename
|
||||
* @param object $fpdi Object of type fpdi
|
||||
*/
|
||||
function fpdi_pdf_parser($filename, &$fpdi) {
|
||||
$this->fpdi =& $fpdi;
|
||||
|
||||
parent::pdf_parser($filename);
|
||||
|
||||
// resolve Pages-Dictonary
|
||||
$pages = $this->pdf_resolve_object($this->c, $this->root[1][1]['/Pages']);
|
||||
|
||||
// Read pages
|
||||
$this->read_pages($this->c, $pages, $this->pages);
|
||||
|
||||
// count pages;
|
||||
$this->page_count = count($this->pages);
|
||||
}
|
||||
|
||||
/**
|
||||
* Overwrite parent::error()
|
||||
*
|
||||
* @param string $msg Error-Message
|
||||
*/
|
||||
function error($msg) {
|
||||
$this->fpdi->error($msg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get pagecount from sourcefile
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
function getPageCount() {
|
||||
return $this->page_count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set pageno
|
||||
*
|
||||
* @param int $pageno Pagenumber to use
|
||||
*/
|
||||
function setPageno($pageno) {
|
||||
$pageno = ((int) $pageno) - 1;
|
||||
|
||||
if ($pageno < 0 || $pageno >= $this->getPageCount()) {
|
||||
$this->fpdi->error('Pagenumber is wrong!');
|
||||
}
|
||||
|
||||
$this->pageno = $pageno;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get page-resources from current page
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getPageResources() {
|
||||
return $this->_getPageResources($this->pages[$this->pageno]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get page-resources from /Page
|
||||
*
|
||||
* @param array $obj Array of pdf-data
|
||||
*/
|
||||
function _getPageResources ($obj) { // $obj = /Page
|
||||
$obj = $this->pdf_resolve_object($this->c, $obj);
|
||||
|
||||
// If the current object has a resources
|
||||
// dictionary associated with it, we use
|
||||
// it. Otherwise, we move back to its
|
||||
// parent object.
|
||||
if (isset ($obj[1][1]['/Resources'])) {
|
||||
$res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Resources']);
|
||||
if ($res[0] == PDF_TYPE_OBJECT)
|
||||
return $res[1];
|
||||
return $res;
|
||||
} else {
|
||||
if (!isset ($obj[1][1]['/Parent'])) {
|
||||
return false;
|
||||
} else {
|
||||
$res = $this->_getPageResources($obj[1][1]['/Parent']);
|
||||
if ($res[0] == PDF_TYPE_OBJECT)
|
||||
return $res[1];
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get content of current page
|
||||
*
|
||||
* If more /Contents is an array, the streams are concated
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getContent() {
|
||||
$buffer = '';
|
||||
|
||||
if (isset($this->pages[$this->pageno][1][1]['/Contents'])) {
|
||||
$contents = $this->_getPageContent($this->pages[$this->pageno][1][1]['/Contents']);
|
||||
foreach($contents AS $tmp_content) {
|
||||
$buffer .= $this->_rebuildContentStream($tmp_content) . ' ';
|
||||
}
|
||||
}
|
||||
|
||||
return $buffer;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resolve all content-objects
|
||||
*
|
||||
* @param array $content_ref
|
||||
* @return array
|
||||
*/
|
||||
function _getPageContent($content_ref) {
|
||||
$contents = array();
|
||||
|
||||
if ($content_ref[0] == PDF_TYPE_OBJREF) {
|
||||
$content = $this->pdf_resolve_object($this->c, $content_ref);
|
||||
if ($content[1][0] == PDF_TYPE_ARRAY) {
|
||||
$contents = $this->_getPageContent($content[1]);
|
||||
} else {
|
||||
$contents[] = $content;
|
||||
}
|
||||
} else if ($content_ref[0] == PDF_TYPE_ARRAY) {
|
||||
foreach ($content_ref[1] AS $tmp_content_ref) {
|
||||
$contents = array_merge($contents,$this->_getPageContent($tmp_content_ref));
|
||||
}
|
||||
}
|
||||
|
||||
return $contents;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Rebuild content-streams
|
||||
*
|
||||
* @param array $obj
|
||||
* @return string
|
||||
*/
|
||||
function _rebuildContentStream($obj) {
|
||||
$filters = array();
|
||||
|
||||
if (isset($obj[1][1]['/Filter'])) {
|
||||
$_filter = $obj[1][1]['/Filter'];
|
||||
|
||||
if ($_filter[0] == PDF_TYPE_OBJREF) {
|
||||
$tmpFilter = $this->pdf_resolve_object($this->c, $_filter);
|
||||
$_filter = $tmpFilter[1];
|
||||
}
|
||||
|
||||
if ($_filter[0] == PDF_TYPE_TOKEN) {
|
||||
$filters[] = $_filter;
|
||||
} else if ($_filter[0] == PDF_TYPE_ARRAY) {
|
||||
$filters = $_filter[1];
|
||||
}
|
||||
}
|
||||
|
||||
$stream = $obj[2][1];
|
||||
|
||||
foreach ($filters AS $_filter) {
|
||||
switch ($_filter[1]) {
|
||||
case '/FlateDecode':
|
||||
case '/Fl':
|
||||
// $stream .= "\x0F\x0D"; // in an errorious stream this suffix could work
|
||||
// $stream .= "\x0A";
|
||||
// $stream .= "\x0D";
|
||||
if (function_exists('gzuncompress')) {
|
||||
$stream = (strlen($stream) > 0) ? @gzuncompress($stream) : '';
|
||||
} else {
|
||||
$this->error(sprintf('To handle %s filter, please compile php with zlib support.',$_filter[1]));
|
||||
}
|
||||
|
||||
if ($stream === false) {
|
||||
$this->error('Error while decompressing stream.');
|
||||
}
|
||||
break;
|
||||
case '/LZWDecode':
|
||||
include_once('filters/FilterLZW_FPDI.php');
|
||||
$decoder = new FilterLZW_FPDI($this->fpdi);
|
||||
$stream = $decoder->decode($stream);
|
||||
break;
|
||||
case '/ASCII85Decode':
|
||||
include_once('filters/FilterASCII85_FPDI.php');
|
||||
$decoder = new FilterASCII85_FPDI($this->fpdi);
|
||||
$stream = $decoder->decode($stream);
|
||||
break;
|
||||
case null:
|
||||
$stream = $stream;
|
||||
break;
|
||||
default:
|
||||
$this->error(sprintf('Unsupported Filter: %s',$_filter[1]));
|
||||
}
|
||||
}
|
||||
|
||||
return $stream;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a Box from a page
|
||||
* Arrayformat is same as used by fpdf_tpl
|
||||
*
|
||||
* @param array $page a /Page
|
||||
* @param string $box_index Type of Box @see $availableBoxes
|
||||
* @param float Scale factor from user space units to points
|
||||
* @return array
|
||||
*/
|
||||
function getPageBox($page, $box_index, $k) {
|
||||
$page = $this->pdf_resolve_object($this->c, $page);
|
||||
$box = null;
|
||||
if (isset($page[1][1][$box_index]))
|
||||
$box =& $page[1][1][$box_index];
|
||||
|
||||
if (!is_null($box) && $box[0] == PDF_TYPE_OBJREF) {
|
||||
$tmp_box = $this->pdf_resolve_object($this->c, $box);
|
||||
$box = $tmp_box[1];
|
||||
}
|
||||
|
||||
if (!is_null($box) && $box[0] == PDF_TYPE_ARRAY) {
|
||||
$b =& $box[1];
|
||||
return array('x' => $b[0][1] / $k,
|
||||
'y' => $b[1][1] / $k,
|
||||
'w' => abs($b[0][1] - $b[2][1]) / $k,
|
||||
'h' => abs($b[1][1] - $b[3][1]) / $k,
|
||||
'llx' => min($b[0][1], $b[2][1]) / $k,
|
||||
'lly' => min($b[1][1], $b[3][1]) / $k,
|
||||
'urx' => max($b[0][1], $b[2][1]) / $k,
|
||||
'ury' => max($b[1][1], $b[3][1]) / $k,
|
||||
);
|
||||
} else if (!isset ($page[1][1]['/Parent'])) {
|
||||
return false;
|
||||
} else {
|
||||
return $this->getPageBox($this->pdf_resolve_object($this->c, $page[1][1]['/Parent']), $box_index, $k);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all page boxes by page no
|
||||
*
|
||||
* @param int The page number
|
||||
* @param float Scale factor from user space units to points
|
||||
* @return array
|
||||
*/
|
||||
function getPageBoxes($pageno, $k) {
|
||||
return $this->_getPageBoxes($this->pages[$pageno - 1], $k);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all boxes from /Page
|
||||
*
|
||||
* @param array a /Page
|
||||
* @return array
|
||||
*/
|
||||
function _getPageBoxes($page, $k) {
|
||||
$boxes = array();
|
||||
|
||||
foreach($this->availableBoxes AS $box) {
|
||||
if ($_box = $this->getPageBox($page, $box, $k)) {
|
||||
$boxes[$box] = $_box;
|
||||
}
|
||||
}
|
||||
|
||||
return $boxes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the page rotation by pageno
|
||||
*
|
||||
* @param integer $pageno
|
||||
* @return array
|
||||
*/
|
||||
function getPageRotation($pageno) {
|
||||
return $this->_getPageRotation($this->pages[$pageno - 1]);
|
||||
}
|
||||
|
||||
function _getPageRotation($obj) { // $obj = /Page
|
||||
$obj = $this->pdf_resolve_object($this->c, $obj);
|
||||
if (isset ($obj[1][1]['/Rotate'])) {
|
||||
$res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Rotate']);
|
||||
if ($res[0] == PDF_TYPE_OBJECT)
|
||||
return $res[1];
|
||||
return $res;
|
||||
} else {
|
||||
if (!isset ($obj[1][1]['/Parent'])) {
|
||||
return false;
|
||||
} else {
|
||||
$res = $this->_getPageRotation($obj[1][1]['/Parent']);
|
||||
if ($res[0] == PDF_TYPE_OBJECT)
|
||||
return $res[1];
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Read all /Page(es)
|
||||
*
|
||||
* @param object pdf_context
|
||||
* @param array /Pages
|
||||
* @param array the result-array
|
||||
*/
|
||||
function read_pages(&$c, &$pages, &$result) {
|
||||
// Get the kids dictionary
|
||||
$_kids = $this->pdf_resolve_object ($c, $pages[1][1]['/Kids']);
|
||||
|
||||
if (!is_array($_kids))
|
||||
$this->error('Cannot find /Kids in current /Page-Dictionary');
|
||||
|
||||
if ($_kids[1][0] == PDF_TYPE_ARRAY) {
|
||||
$kids = $_kids[1][1];
|
||||
} else {
|
||||
$kids = $_kids[1];
|
||||
}
|
||||
|
||||
foreach ($kids as $v) {
|
||||
$pg = $this->pdf_resolve_object ($c, $v);
|
||||
if ($pg[1][1]['/Type'][1] === '/Pages') {
|
||||
// If one of the kids is an embedded
|
||||
// /Pages array, resolve it as well.
|
||||
$this->read_pages($c, $pg, $result);
|
||||
} else {
|
||||
$result[] = $pg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get PDF-Version
|
||||
*
|
||||
* And reset the PDF Version used in FPDI if needed
|
||||
*/
|
||||
function getPDFVersion() {
|
||||
parent::getPDFVersion();
|
||||
$this->fpdi->setPDFVersion(max($this->fpdi->getPDFVersion(), $this->pdfVersion));
|
||||
}
|
||||
}
|
||||
@ -1,104 +1,104 @@
|
||||
<?php
|
||||
//
|
||||
// FPDI - Version 1.4.2
|
||||
//
|
||||
// Copyright 2004-2011 Setasign - Jan Slabon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
if (!class_exists('pdf_context', false)) {
|
||||
|
||||
class pdf_context {
|
||||
|
||||
/**
|
||||
* Modi
|
||||
*
|
||||
* @var integer 0 = file | 1 = string
|
||||
*/
|
||||
var $_mode = 0;
|
||||
|
||||
var $file;
|
||||
var $buffer;
|
||||
var $offset;
|
||||
var $length;
|
||||
|
||||
var $stack;
|
||||
|
||||
// Constructor
|
||||
|
||||
function pdf_context(&$f) {
|
||||
$this->file =& $f;
|
||||
if (is_string($this->file))
|
||||
$this->_mode = 1;
|
||||
$this->reset();
|
||||
}
|
||||
|
||||
// Optionally move the file
|
||||
// pointer to a new location
|
||||
// and reset the buffered data
|
||||
|
||||
function reset($pos = null, $l = 100) {
|
||||
if ($this->_mode == 0) {
|
||||
if (!is_null ($pos)) {
|
||||
fseek ($this->file, $pos);
|
||||
}
|
||||
|
||||
$this->buffer = $l > 0 ? fread($this->file, $l) : '';
|
||||
$this->length = strlen($this->buffer);
|
||||
if ($this->length < $l)
|
||||
$this->increase_length($l - $this->length);
|
||||
} else {
|
||||
$this->buffer = $this->file;
|
||||
$this->length = strlen($this->buffer);
|
||||
}
|
||||
$this->offset = 0;
|
||||
$this->stack = array();
|
||||
}
|
||||
|
||||
// Make sure that there is at least one
|
||||
// character beyond the current offset in
|
||||
// the buffer to prevent the tokenizer
|
||||
// from attempting to access data that does
|
||||
// not exist
|
||||
|
||||
function ensure_content() {
|
||||
if ($this->offset >= $this->length - 1) {
|
||||
return $this->increase_length();
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Forcefully read more data into the buffer
|
||||
|
||||
function increase_length($l = 100) {
|
||||
if ($this->_mode == 0 && feof($this->file)) {
|
||||
return false;
|
||||
} else if ($this->_mode == 0) {
|
||||
$totalLength = $this->length + $l;
|
||||
do {
|
||||
$toRead = $totalLength - $this->length;
|
||||
if ($toRead < 1)
|
||||
break;
|
||||
|
||||
$this->buffer .= fread($this->file, $toRead);
|
||||
} while ((($this->length = strlen($this->buffer)) != $totalLength) && !feof($this->file));
|
||||
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
<?php
|
||||
//
|
||||
// FPDI - Version 1.4.2
|
||||
//
|
||||
// Copyright 2004-2011 Setasign - Jan Slabon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
if (!class_exists('pdf_context', false)) {
|
||||
|
||||
class pdf_context {
|
||||
|
||||
/**
|
||||
* Modi
|
||||
*
|
||||
* @var integer 0 = file | 1 = string
|
||||
*/
|
||||
var $_mode = 0;
|
||||
|
||||
var $file;
|
||||
var $buffer;
|
||||
var $offset;
|
||||
var $length;
|
||||
|
||||
var $stack;
|
||||
|
||||
// Constructor
|
||||
|
||||
function pdf_context(&$f) {
|
||||
$this->file =& $f;
|
||||
if (is_string($this->file))
|
||||
$this->_mode = 1;
|
||||
$this->reset();
|
||||
}
|
||||
|
||||
// Optionally move the file
|
||||
// pointer to a new location
|
||||
// and reset the buffered data
|
||||
|
||||
function reset($pos = null, $l = 100) {
|
||||
if ($this->_mode == 0) {
|
||||
if (!is_null ($pos)) {
|
||||
fseek ($this->file, $pos);
|
||||
}
|
||||
|
||||
$this->buffer = $l > 0 ? fread($this->file, $l) : '';
|
||||
$this->length = strlen($this->buffer);
|
||||
if ($this->length < $l)
|
||||
$this->increase_length($l - $this->length);
|
||||
} else {
|
||||
$this->buffer = $this->file;
|
||||
$this->length = strlen($this->buffer);
|
||||
}
|
||||
$this->offset = 0;
|
||||
$this->stack = array();
|
||||
}
|
||||
|
||||
// Make sure that there is at least one
|
||||
// character beyond the current offset in
|
||||
// the buffer to prevent the tokenizer
|
||||
// from attempting to access data that does
|
||||
// not exist
|
||||
|
||||
function ensure_content() {
|
||||
if ($this->offset >= $this->length - 1) {
|
||||
return $this->increase_length();
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Forcefully read more data into the buffer
|
||||
|
||||
function increase_length($l = 100) {
|
||||
if ($this->_mode == 0 && feof($this->file)) {
|
||||
return false;
|
||||
} else if ($this->_mode == 0) {
|
||||
$totalLength = $this->length + $l;
|
||||
do {
|
||||
$toRead = $totalLength - $this->length;
|
||||
if ($toRead < 1)
|
||||
break;
|
||||
|
||||
$this->buffer .= fread($this->file, $toRead);
|
||||
} while ((($this->length = strlen($this->buffer)) != $totalLength) && !feof($this->file));
|
||||
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,47 +1,47 @@
|
||||
<?php
|
||||
//============================================================+
|
||||
// File name : bul.php
|
||||
// Begin : 2004-03-03
|
||||
// Last Update : 2010-03-22
|
||||
//
|
||||
// Description : Language module for TCPDF
|
||||
// (contains translated texts)
|
||||
// Arabic
|
||||
//
|
||||
// Author: Nicola Asuni
|
||||
//
|
||||
// (c) Copyright:
|
||||
// Nicola Asuni
|
||||
// Tecnick.com LTD
|
||||
// Manor Coach House, Church Hill
|
||||
// Aldershot, Hants, GU12 4RQ
|
||||
// UK
|
||||
// www.tecnick.com
|
||||
// info@tecnick.com
|
||||
//============================================================+
|
||||
|
||||
/**
|
||||
* TCPDF language file (contains translated texts).
|
||||
* @package com.tecnick.tcpdf
|
||||
* @brief TCPDF language file: Bulgarian
|
||||
* @author Nicola Asuni
|
||||
* @since 2012-03-22
|
||||
*/
|
||||
|
||||
// Bulgarian
|
||||
|
||||
global $l;
|
||||
$l = Array();
|
||||
|
||||
// PAGE META DESCRIPTORS --------------------------------------
|
||||
|
||||
$l['a_meta_charset'] = 'UTF-8';
|
||||
$l['a_meta_dir'] = 'ltr';
|
||||
$l['a_meta_language'] = 'bg';
|
||||
|
||||
// TRANSLATIONS --------------------------------------
|
||||
$l['w_page'] = 'страница';
|
||||
|
||||
//============================================================+
|
||||
// END OF FILE
|
||||
//============================================================+
|
||||
<?php
|
||||
//============================================================+
|
||||
// File name : bul.php
|
||||
// Begin : 2004-03-03
|
||||
// Last Update : 2010-03-22
|
||||
//
|
||||
// Description : Language module for TCPDF
|
||||
// (contains translated texts)
|
||||
// Arabic
|
||||
//
|
||||
// Author: Nicola Asuni
|
||||
//
|
||||
// (c) Copyright:
|
||||
// Nicola Asuni
|
||||
// Tecnick.com LTD
|
||||
// Manor Coach House, Church Hill
|
||||
// Aldershot, Hants, GU12 4RQ
|
||||
// UK
|
||||
// www.tecnick.com
|
||||
// info@tecnick.com
|
||||
//============================================================+
|
||||
|
||||
/**
|
||||
* TCPDF language file (contains translated texts).
|
||||
* @package com.tecnick.tcpdf
|
||||
* @brief TCPDF language file: Bulgarian
|
||||
* @author Nicola Asuni
|
||||
* @since 2012-03-22
|
||||
*/
|
||||
|
||||
// Bulgarian
|
||||
|
||||
global $l;
|
||||
$l = Array();
|
||||
|
||||
// PAGE META DESCRIPTORS --------------------------------------
|
||||
|
||||
$l['a_meta_charset'] = 'UTF-8';
|
||||
$l['a_meta_dir'] = 'ltr';
|
||||
$l['a_meta_language'] = 'bg';
|
||||
|
||||
// TRANSLATIONS --------------------------------------
|
||||
$l['w_page'] = 'страница';
|
||||
|
||||
//============================================================+
|
||||
// END OF FILE
|
||||
//============================================================+
|
||||
|
||||
@ -394,8 +394,9 @@ else
|
||||
array('from'=>'2.9.0', 'to'=>'3.0.0'),
|
||||
array('from'=>'3.0.0', 'to'=>'3.1.0'),
|
||||
array('from'=>'3.1.0', 'to'=>'3.2.0'),
|
||||
array('from'=>'3.2.0', 'to'=>'3.3.0')
|
||||
);
|
||||
array('from'=>'3.2.0', 'to'=>'3.3.0'),
|
||||
array('from'=>'3.3.0', 'to'=>'3.4.0')
|
||||
);
|
||||
|
||||
$count=0;
|
||||
foreach ($migrationscript as $migarray)
|
||||
|
||||
Binary file not shown.
Binary file not shown.
17
htdocs/install/mysql/migration/3.3.0-3.4.0.sql
Executable file
17
htdocs/install/mysql/migration/3.3.0-3.4.0.sql
Executable file
@ -0,0 +1,17 @@
|
||||
--
|
||||
-- Be carefull to requests order.
|
||||
-- This file must be loaded by calling /install/index.php page
|
||||
-- when current version is 3.4.0 or higher.
|
||||
--
|
||||
-- To rename a table: ALTER TABLE llx_table RENAME TO llx_table_new;
|
||||
-- To add a column: ALTER TABLE llx_table ADD COLUMN newcol varchar(60) NOT NULL DEFAULT '0' AFTER existingcol;
|
||||
-- To rename a column: ALTER TABLE llx_table CHANGE COLUMN oldname newname varchar(60);
|
||||
-- To drop a column: ALTER TABLE llx_table DROP COLUMN oldname;
|
||||
-- To change type of field: ALTER TABLE llx_table MODIFY COLUMN name varchar(60);
|
||||
-- To restrict request to Mysql version x.y use -- VMYSQLx.y
|
||||
-- To restrict request to Pgsql version x.y use -- VPGSQLx.y
|
||||
|
||||
|
||||
-- -- VPGSQL8.2 DELETE FROM llx_usergroup_user WHERE fk_user NOT IN (SELECT rowid from llx_user);
|
||||
-- -- VMYSQL4.1 DELETE FROM llx_usergroup_user WHERE fk_usergroup NOT IN (SELECT rowid from llx_usergroup);
|
||||
|
||||
@ -1,26 +1,26 @@
|
||||
-- ========================================================================
|
||||
-- Copyright (C) 2011 Philippe GRAND <philippe.grand@atoo-net.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, see <http://www.gnu.org/licenses/>.
|
||||
--
|
||||
-- ========================================================================
|
||||
|
||||
create table llx_c_availability
|
||||
(
|
||||
rowid integer AUTO_INCREMENT PRIMARY KEY,
|
||||
code varchar(30) NOT NULL,
|
||||
label varchar(60) NOT NULL,
|
||||
active tinyint DEFAULT 1 NOT NULL
|
||||
|
||||
)ENGINE=innodb;
|
||||
-- ========================================================================
|
||||
-- Copyright (C) 2011 Philippe GRAND <philippe.grand@atoo-net.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, see <http://www.gnu.org/licenses/>.
|
||||
--
|
||||
-- ========================================================================
|
||||
|
||||
create table llx_c_availability
|
||||
(
|
||||
rowid integer AUTO_INCREMENT PRIMARY KEY,
|
||||
code varchar(30) NOT NULL,
|
||||
label varchar(60) NOT NULL,
|
||||
active tinyint DEFAULT 1 NOT NULL
|
||||
|
||||
)ENGINE=innodb;
|
||||
|
||||
@ -351,6 +351,7 @@ Int=Integer
|
||||
Float=Float
|
||||
DateAndTime=Date and hour
|
||||
Unique=Unique
|
||||
Boolean=Boolean (Checkbox)
|
||||
LibraryToBuildPDF=Library used to build PDF
|
||||
WarningUsingFPDF=Warning: Your <b>conf.php</b> contains directive <b>dolibarr_pdf_force_fpdf=1</b>. This means you use the FPDF library to generate PDF files. This library is old and does not support a lot of features (Unicode, image transparency, cyrillic, arab and asiatic languages, ...), so you may experience errors during PDF generation.<br>To solve this and have a full support of PDF generation, please download <a href="http://www.tcpdf.org/" target="_blank">TCPDF library</a>, then comment or remove the line <b>$dolibarr_pdf_force_fpdf=1</b>, and add instead <b>$dolibarr_lib_TCPDF_PATH='path_to_TCPDF_dir'</b>
|
||||
LocalTaxDesc=Some countries apply 2 or 3 taxes on each invoice line. If this is the case, choose type for second and third tax and its rate. Possible type are:<br>1 : local tax apply on products and services without vat (vat is not applied on local tax)<br>2 : local tax apply on products and services before vat (vat is calculated on amount + localtax)<br>3 : local tax apply on products without vat (vat is not applied on local tax)<br>4 : local tax apply on products before vat (vat is calculated on amount + localtax)<br>5 : local tax apply on services without vat (vat is not applied on local tax)<br>6 : local tax apply on services before vat (vat is calculated on amount + localtax)
|
||||
|
||||
@ -65,7 +65,7 @@ DatabaseSuperUserAccess=Database server - Superuser access
|
||||
CheckToCreateDatabase=Check box if database does not exist and must be created.<br>In this case, you must fill the login/password for superuser account at the bottom of this page.
|
||||
CheckToCreateUser=Check box if database owner does not exist and must be created.<br>In this case, you must choose its login and password and also fill the login/password for the superuser account at the bottom of this page. If this box is unchecked, owner database and its passwords must exists.
|
||||
Experimental=(experimental)
|
||||
DatabaseRootLoginDescription=Login of the user allowed to create new databases or new users, useless if your database and your database login already exists (like when you're hosted by a web hosting provider).
|
||||
DatabaseRootLoginDescription=Login of the user allowed to create new databases or new users, mandatory if your database or its owner does not already exists.
|
||||
KeepEmptyIfNoPassword=Leave empty if user has no password (avoid this)
|
||||
SaveConfigurationFile=Save values
|
||||
ConfigurationSaving=Saving configuration file
|
||||
|
||||
@ -12,7 +12,7 @@ ShowSupplier=Mostrar proveedor
|
||||
OrderDate=Fecha de pedido
|
||||
BuyingPrice=Precio de compra
|
||||
BuyingPriceMin=Precio mínimo de compra
|
||||
BuyingPriceMinShort=Precio mín compra
|
||||
BuyingPriceMinShort=Precio mín. compra
|
||||
AddSupplierPrice=Añadir precio de proveedor
|
||||
ChangeSupplierPrice=Modificar precio de proveedor
|
||||
ErrorSupplierCountryIsNotDefined=El país de este proveedor no está definido, corrígalo en su ficha
|
||||
|
||||
@ -77,7 +77,7 @@ WithBankUsingRIB=Para las cuentas bancarias que utilizan CCC
|
||||
WithBankUsingBANBIC=Para las cuentas bancarias que utilizan el código BAN/BIC/SWIFT
|
||||
BankToReceiveWithdraw=Cuenta bancaria receptora de las domiciliaciones
|
||||
CreditDate=Abonada el
|
||||
WithdrawalFileNotCapable=No es posible generar fichero bancario de domiciliacion para su pais
|
||||
WithdrawalFileNotCapable=No es posible generar el fichero bancario de domiciliación para su país.
|
||||
ShowWithdraw=Ver domiciliación
|
||||
IfInvoiceNeedOnWithdrawPaymentWontBeClosed=Sin embargo, si la factura tiene pendiente algún pago por domiciliación, no será cerrada para permitir la gestión de la domiciliación.
|
||||
DoStandingOrdersBeforePayments=Esta pestaña le permite realizar una petición de domiciliación. Una vez terminada, puede ingresar el pago en la factura para proceder a su cierre.
|
||||
|
||||
@ -346,6 +346,7 @@ TextLong=Texte long
|
||||
Int=Numérique entier
|
||||
Float=Décimal
|
||||
DateAndTime=Date et heure
|
||||
Boolean=Booleen (Checkbox)
|
||||
LibraryToBuildPDF=Bibliothèque utilisée pour la génération des PDF
|
||||
WarningUsingFPDF=Attention: Votre fichier <b>conf.php</b> contient la directive <b>dolibarr_pdf_force_fpdf=1</b>. Cela signifie que vous utilisez la librairie FPDF pour générer vos fichiers PDF. Cette librairie est ancienne et ne couvre pas de nombreuses fonctionnalitée (Unicode, transparence des images, langues cyrillic, arabes ou asiatiques...), aussi vous pouvez rencontrez des problèmes durant la génération des PDF.<br>Pour résoudre cela et avoir un support complet de PDF, vous pouvez télécharger la <a href="http://www.tcpdf.org/" target="_blank">librairie TCPDF</a> puis commenter ou supprimer la ligne <b>$dolibarr_pdf_force_fpdf=1</b>, et ajouter à la place <b>$dolibarr_lib_TCPDF_PATH='chemin_vers_TCPDF'</b>
|
||||
LocalTaxDesc=Certains pays appliquent 2 voir 3 taux sur chaque ligne de facture. Si c'est le cas, choisissez le type du deuxième et troisième taux et sa valeur. Les types possibles sont:<br>1 : taxe locale sur les produits et services hors tva (la tva n'est pas appliquée sur la taxe locale)<br>2 : taxe locale sur les produits et services avant tva (la tva est appliquée sur le montant + la taxe locale)<br>3 : taxe locale uniquement sur les produits hors tva (la tva n'est pas appliquée sur la taxe locale)<br>4 : taxe locale uniquement sur les produits avant tva (la tva est appliquée sur le montant + la taxe locale)<br>5 : taxe locale uniquement sur les services hors tva (la tva n'est pas appliquée sur la taxe locale)<br>6 : taxe locale uniquement sur les service avant tva (la tva est appliquée sur le montant + la taxe locale)
|
||||
|
||||
@ -65,7 +65,7 @@ DatabaseSuperUserAccess=Serveur de base de données - Accès super utilisateur
|
||||
CheckToCreateDatabase=Cochez cette option si la base de données n'existe pas et doit être créée.<br>Dans ce cas, il faut renseigner le login/mot de passe du super-utilisateur au bas de cette page.
|
||||
CheckToCreateUser=Cochez cette option si l'utilisateur propriétaire n'existe pas et doit être créé.<br>Dans ce cas, il faut renseigner le nom et mot de passe du propriétaire à créer ainsi que le login/mot de passe du superutilisateur au bas de cette page. Si la case n'est pas cochée, le nom et mot de passe du propriétaire doivent exister.
|
||||
Experimental=(expérimental)
|
||||
DatabaseRootLoginDescription=Login de l'utilisateur de la base ayant les droits de création de bases de données ou de comptes pour la base, inutile si la base et son compte d'accès existent déjà (comme lorsque vous êtes chez un hébergeur).
|
||||
DatabaseRootLoginDescription=Login de l'utilisateur de la base ayant les droits de création de bases de données ou de comptes pour la base, requis si la base ou son propriétaire n'existe pas déjà et doivent être créés.
|
||||
KeepEmptyIfNoPassword=Laissez vide si l'administrateur n'a pas de mot de passe
|
||||
SaveConfigurationFile=Enregistrement du fichier de configuration
|
||||
ConfigurationSaving=Enregistrement du fichier de configuration
|
||||
|
||||
@ -912,13 +912,15 @@ function top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs
|
||||
print '<!-- Includes for Dolibarr, modules or specific pages-->'."\n";
|
||||
// Output style sheets (optioncss='print' or ''). Note: $conf->css looks like '/theme/eldy/style.css.php'
|
||||
$themepath=dol_buildpath((empty($conf->global->MAIN_FORCETHEMEDIR)?'':$conf->global->MAIN_FORCETHEMEDIR).$conf->css,1);
|
||||
$themesubdir='';
|
||||
if (! empty($conf->modules_parts['theme'])) // This slow down
|
||||
{
|
||||
foreach($conf->modules_parts['theme'] as $reldir)
|
||||
{
|
||||
if (file_exists(dol_buildpath($reldir.$conf->css, 0)))
|
||||
if (file_exists(dol_buildpath($reldir.$conf->css, 0)))
|
||||
{
|
||||
$themepath=dol_buildpath($reldir.$conf->css, 1);
|
||||
$themesubdir=$reldir;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1063,7 +1065,7 @@ function top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs
|
||||
if (constant('JS_CKEDITOR')) $pathckeditor=JS_CKEDITOR; // To use external ckeditor js lib
|
||||
print '<script type="text/javascript">';
|
||||
print 'var CKEDITOR_BASEPATH = \''.$pathckeditor.'\';'."\n";
|
||||
print 'var ckeditorConfig = \''.dol_buildpath('/theme/'.$conf->theme.'/ckeditor/config.js',1).'\';'."\n";
|
||||
print 'var ckeditorConfig = \''.dol_buildpath($themesubdir.'/theme/'.$conf->theme.'/ckeditor/config.js',1).'\';'."\n"; // $themesubdir='' in standard usage
|
||||
print 'var ckeditorFilebrowserBrowseUrl = \''.DOL_URL_ROOT.'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.'/core/filemanagerdol/connectors/php/connector.php\';'."\n";
|
||||
print 'var ckeditorFilebrowserImageBrowseUrl = \''.DOL_URL_ROOT.'/core/filemanagerdol/browser/default/browser.php?Type=Image&Connector='.DOL_URL_ROOT.'/core/filemanagerdol/connectors/php/connector.php\';'."\n";
|
||||
print '</script>'."\n";
|
||||
|
||||
@ -32,7 +32,9 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
|
||||
|
||||
$id=GETPOST('id','int');
|
||||
$ref=GETPOST('ref','alpha');
|
||||
$mine = $_REQUEST['mode']=='mine' ? 1 : 0;
|
||||
|
||||
$mode = GETPOST('mode', 'alpha');
|
||||
$mine = ($mode == 'mine' ? 1 : 0);
|
||||
//if (! $user->rights->projet->all->lire) $mine=1; // Special for projects
|
||||
|
||||
$object = new Project($db);
|
||||
@ -99,7 +101,7 @@ if ($id > 0 || ! empty($ref))
|
||||
$head=project_prepare_head($object);
|
||||
dol_fiche_head($head, $tab, $langs->trans("Project"),0,($object->public?'projectpub':'project'));
|
||||
|
||||
$param=($_REQUEST["mode"]=='mine'?'&mode=mine':'');
|
||||
$param=($mode=='mine'?'&mode=mine':'');
|
||||
|
||||
print '<table class="border" width="100%">';
|
||||
|
||||
@ -110,8 +112,11 @@ if ($id > 0 || ! empty($ref))
|
||||
print $langs->trans("Ref");
|
||||
print '</td><td>';
|
||||
// Define a complementary filter for search of next/prev ref.
|
||||
$objectsListId = $object->getProjectsAuthorizedForUser($user,$mine,1);
|
||||
$object->next_prev_filter=" rowid in (".$objectsListId.")";
|
||||
if (! $user->rights->projet->all->lire)
|
||||
{
|
||||
$projectsListId = $object->getProjectsAuthorizedForUser($user,$mine,0);
|
||||
$object->next_prev_filter=" rowid in (".(count($projectsListId)?join(',',array_keys($projectsListId)):'0').")";
|
||||
}
|
||||
print $form->showrefnav($object, 'ref', $linkback, 1, 'ref', 'ref', '', $param);
|
||||
print '</td></tr>';
|
||||
|
||||
|
||||
@ -37,11 +37,19 @@ $socid = GETPOST('socid','int');
|
||||
if ($user->societe_id) $socid=$user->societe_id;
|
||||
$result = restrictedArea($user, 'societe', $socid, '&societe');
|
||||
|
||||
// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
|
||||
include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
|
||||
$hookmanager=new HookManager($db);
|
||||
$hookmanager->initHooks(array('agendathirdparty'));
|
||||
|
||||
|
||||
/*
|
||||
* Actions
|
||||
*/
|
||||
|
||||
$parameters=array('id'=>$socid);
|
||||
$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks
|
||||
$error=$hookmanager->error; $errors=array_merge($errors, (array) $hookmanager->errors);
|
||||
|
||||
|
||||
|
||||
|
||||
@ -37,12 +37,29 @@ $socid = GETPOST('socid','int');
|
||||
if ($user->societe_id) $socid=$user->societe_id;
|
||||
$result = restrictedArea($user, 'societe', $socid, '&societe');
|
||||
|
||||
// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
|
||||
include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
|
||||
$hookmanager=new HookManager($db);
|
||||
$hookmanager->initHooks(array('infothirdparty'));
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* View
|
||||
*/
|
||||
* Actions
|
||||
*/
|
||||
|
||||
llxHeader();
|
||||
$parameters=array('id'=>$socid);
|
||||
$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks
|
||||
$error=$hookmanager->error; $errors=array_merge($errors, (array) $hookmanager->errors);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* View
|
||||
*/
|
||||
|
||||
$help_url='EN:Module_Third_Parties|FR:Module_Tiers|ES:Empresas';
|
||||
llxHeader('',$langs->trans("ThirdParty"),$help_url);
|
||||
|
||||
$soc = new Societe($db);
|
||||
$soc->fetch($socid);
|
||||
|
||||
@ -77,9 +77,15 @@ $img_button=dol_buildpath($path.'/theme/amarok/img/button_bg.png',1);
|
||||
*, html {
|
||||
margin:0;
|
||||
padding:0;
|
||||
font-size:100%;
|
||||
font-size:100%;
|
||||
}
|
||||
|
||||
/*.fiche ul {
|
||||
margin:0.5em;
|
||||
padding:0.5em;
|
||||
padding-left: 2em;
|
||||
}*/
|
||||
|
||||
body {
|
||||
background-color:#f5f5f5;
|
||||
<?php if ($_SESSION['dol_login'] != '') {?>
|
||||
@ -517,38 +523,195 @@ div.vmenu {
|
||||
/* Panes for ECM or Filemanager */
|
||||
/* ============================================================================== */
|
||||
|
||||
|
||||
#containerlayout .layout-with-no-border {
|
||||
border:0 !important;
|
||||
border-width:0 !important;
|
||||
border: 0 !important;
|
||||
border-width: 0 !important;
|
||||
}
|
||||
|
||||
#containerlayout .layout-padding {
|
||||
padding:2px !important;
|
||||
padding: 2px !important;
|
||||
}
|
||||
|
||||
#containerlayout .ui-layout-pane {/* all 'panes' */
|
||||
background:#ffffff;
|
||||
border:1px solid #bbbbbb;
|
||||
padding:0px;
|
||||
overflow:auto;
|
||||
/*
|
||||
* PANES and CONTENT-DIVs
|
||||
*/
|
||||
#containerlayout .ui-layout-pane { /* all 'panes' */
|
||||
background: #FFF;
|
||||
border: 1px solid #BBB;
|
||||
/* DO NOT add scrolling (or padding) to 'panes' that have a content-div,
|
||||
otherwise you may get double-scrollbars - on the pane AND on the content-div
|
||||
*/
|
||||
padding: 0px;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
/* (scrolling) content-div inside pane allows for fixed header(s) and/or footer(s) */
|
||||
#containerlayout .ui-layout-content {
|
||||
padding:10px;
|
||||
position:relative; /* contain floated or positioned elements */
|
||||
overflow:auto; /* add scrolling to content-div */
|
||||
padding: 10px;
|
||||
position: relative; /* contain floated or positioned elements */
|
||||
overflow: auto; /* add scrolling to content-div */
|
||||
}
|
||||
|
||||
#containerlayout .pane-in.ecm-in-layout-center.ui-layout-pane.ui-layout-pane-center {
|
||||
border:0px solid #bbbbbb;
|
||||
border-bottom:1px solid #bbbbbb;
|
||||
/*
|
||||
* RESIZER-BARS
|
||||
*/
|
||||
.ui-layout-resizer { /* all 'resizer-bars' */
|
||||
width: <?php echo (empty($conf->browser->phone)?'8':'24'); ?>px !important;
|
||||
}
|
||||
.ui-layout-resizer-hover { /* affects both open and closed states */
|
||||
}
|
||||
/* NOTE: It looks best when 'hover' and 'dragging' are set to the same color,
|
||||
otherwise color shifts while dragging when bar can't keep up with mouse */
|
||||
/*.ui-layout-resizer-open-hover ,*/ /* hover-color to 'resize' */
|
||||
.ui-layout-resizer-dragging { /* resizer beging 'dragging' */
|
||||
background: #DDD;
|
||||
width: <?php echo (empty($conf->browser->phone)?'8':'24'); ?>px;
|
||||
}
|
||||
.ui-layout-resizer-dragging { /* CLONED resizer being dragged */
|
||||
border-left: 1px solid #BBB;
|
||||
border-right: 1px solid #BBB;
|
||||
}
|
||||
/* NOTE: Add a 'dragging-limit' color to provide visual feedback when resizer hits min/max size limits */
|
||||
.ui-layout-resizer-dragging-limit { /* CLONED resizer at min or max size-limit */
|
||||
background: #E1A4A4; /* red */
|
||||
}
|
||||
.ui-layout-resizer-closed {
|
||||
background-color: #DDDDDD;
|
||||
}
|
||||
.ui-layout-resizer-closed:hover {
|
||||
background-color: #EEDDDD;
|
||||
}
|
||||
.ui-layout-resizer-sliding { /* resizer when pane is 'slid open' */
|
||||
opacity: .10; /* show only a slight shadow */
|
||||
filter: alpha(opacity=10);
|
||||
}
|
||||
.ui-layout-resizer-sliding-hover { /* sliding resizer - hover */
|
||||
opacity: 1.00; /* on-hover, show the resizer-bar normally */
|
||||
filter: alpha(opacity=100);
|
||||
}
|
||||
/* sliding resizer - add 'outside-border' to resizer on-hover */
|
||||
/* this sample illustrates how to target specific panes and states */
|
||||
/*.ui-layout-resizer-north-sliding-hover { border-bottom-width: 1px; }
|
||||
.ui-layout-resizer-south-sliding-hover { border-top-width: 1px; }
|
||||
.ui-layout-resizer-west-sliding-hover { border-right-width: 1px; }
|
||||
.ui-layout-resizer-east-sliding-hover { border-left-width: 1px; }
|
||||
*/
|
||||
|
||||
/*
|
||||
* TOGGLER-BUTTONS
|
||||
*/
|
||||
.ui-layout-toggler {
|
||||
<?php if (empty($conf->browser->phone)) { ?>
|
||||
border-top: 1px solid #AAA; /* match pane-border */
|
||||
border-right: 1px solid #AAA; /* match pane-border */
|
||||
border-bottom: 1px solid #AAA; /* match pane-border */
|
||||
background-color: #DDD;
|
||||
top: 5px !important;
|
||||
<?php } else { ?>
|
||||
diplay: none;
|
||||
<?php } ?>
|
||||
}
|
||||
.ui-layout-toggler-open {
|
||||
height: 54px !important;
|
||||
width: <?php echo (empty($conf->browser->phone)?'7':'22'); ?>px !important;
|
||||
-moz-border-radius:0px 10px 10px 0px;
|
||||
-webkit-border-radius:0px 10px 10px 0px;
|
||||
border-radius:0px 10px 10px 0px;
|
||||
}
|
||||
.ui-layout-toggler-closed {
|
||||
height: <?php echo (empty($conf->browser->phone)?'54':'2'); ?>px !important;
|
||||
width: <?php echo (empty($conf->browser->phone)?'7':'22'); ?>px !important;
|
||||
-moz-border-radius:0px 10px 10px 0px;
|
||||
-webkit-border-radius:0px 10px 10px 0px;
|
||||
border-radius:0px 10px 10px 0px;
|
||||
}
|
||||
.ui-layout-toggler .content { /* style the text we put INSIDE the togglers */
|
||||
color: #666;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
width: 100%;
|
||||
padding-bottom: 0.35ex; /* to 'vertically center' text inside text-span */
|
||||
}
|
||||
|
||||
#containerlayout .pane-in.ecm-in-layout-south.layout-padding.ui-layout-pane.ui-layout-pane-south {
|
||||
border:0px solid #bbbbbb;
|
||||
border-top:1px solid #bbbbbb;
|
||||
/* hide the toggler-button when the pane is 'slid open' */
|
||||
.ui-layout-resizer-sliding ui-layout-toggler {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.ui-layout-north {
|
||||
height: <?php print (empty($conf->browser->phone)?'54':'21'); ?>px !important;
|
||||
}
|
||||
|
||||
|
||||
/* ECM */
|
||||
|
||||
#containerlayout .ecm-layout-pane { /* all 'panes' */
|
||||
background: #FFF;
|
||||
border: 1px solid #BBB;
|
||||
/* DO NOT add scrolling (or padding) to 'panes' that have a content-div,
|
||||
otherwise you may get double-scrollbars - on the pane AND on the content-div
|
||||
*/
|
||||
padding: 0px;
|
||||
overflow: auto;
|
||||
}
|
||||
/* (scrolling) content-div inside pane allows for fixed header(s) and/or footer(s) */
|
||||
#containerlayout .ecm-layout-content {
|
||||
padding: 10px;
|
||||
position: relative; /* contain floated or positioned elements */
|
||||
overflow: auto; /* add scrolling to content-div */
|
||||
}
|
||||
|
||||
.ecm-layout-toggler {
|
||||
border-top: 1px solid #AAA; /* match pane-border */
|
||||
border-right: 1px solid #AAA; /* match pane-border */
|
||||
border-bottom: 1px solid #AAA; /* match pane-border */
|
||||
background-color: #CCC;
|
||||
}
|
||||
.ecm-layout-toggler-open {
|
||||
height: 48px !important;
|
||||
width: 6px !important;
|
||||
-moz-border-radius:0px 10px 10px 0px;
|
||||
-webkit-border-radius:0px 10px 10px 0px;
|
||||
border-radius:0px 10px 10px 0px;
|
||||
}
|
||||
.ecm-layout-toggler-closed {
|
||||
height: 48px !important;
|
||||
width: 6px !important;
|
||||
}
|
||||
|
||||
.ecm-layout-toggler .content { /* style the text we put INSIDE the togglers */
|
||||
color: #666;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
width: 100%;
|
||||
padding-bottom: 0.35ex; /* to 'vertically center' text inside text-span */
|
||||
}
|
||||
#ecm-layout-west-resizer {
|
||||
width: 6px !important;
|
||||
}
|
||||
|
||||
.ecm-layout-resizer { /* all 'resizer-bars' */
|
||||
border: 1px solid #BBB;
|
||||
border-width: 0;
|
||||
}
|
||||
.ecm-layout-resizer-closed {
|
||||
}
|
||||
|
||||
.ecm-in-layout-center {
|
||||
border-left: 1px !important;
|
||||
border-right: 0px !important;
|
||||
border-top: 0px !important;
|
||||
}
|
||||
|
||||
.ecm-in-layout-south {
|
||||
border-left: 0px !important;
|
||||
border-right: 0px !important;
|
||||
border-bottom: 0px !important;
|
||||
padding: 4px 0 4px 4px !important;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ============================================================================== */
|
||||
/* Onglets */
|
||||
/* ============================================================================== */
|
||||
@ -1003,6 +1166,9 @@ div.error {
|
||||
* Other
|
||||
*/
|
||||
|
||||
.product_line_stock_ok { color: #002200; }
|
||||
.product_line_stock_too_low { color: #664400; }
|
||||
|
||||
.fieldrequired {
|
||||
font-weight:bold;
|
||||
color:#333333;
|
||||
@ -1024,6 +1190,40 @@ div.titre {
|
||||
padding-bottom:2px;
|
||||
}
|
||||
|
||||
#dolpaymenttable { width: 600px; font-size: 13px; }
|
||||
#tablepublicpayment { border: 1px solid #CCCCCC !important; width: 100%; }
|
||||
#tablepublicpayment .CTableRow1 { background-color: #F0F0F0 !important; }
|
||||
#tablepublicpayment tr.liste_total { border-bottom: 1px solid #CCCCCC !important; }
|
||||
#tablepublicpayment tr.liste_total td { border-top: none; }
|
||||
|
||||
#divsubscribe { width: 700px; }
|
||||
#tablesubscribe { width: 100%; }
|
||||
|
||||
div.table-border {
|
||||
display:table;
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
border: 1px solid #DDD;
|
||||
}
|
||||
div.table-border-row {
|
||||
display:table-row;
|
||||
}
|
||||
div.table-key-border-col {
|
||||
display:table-cell;
|
||||
width: 25%;
|
||||
vertical-align:top;
|
||||
padding: 1px 2px 1px 1px;
|
||||
border: 1px solid #DDD;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
div.table-val-border-col {
|
||||
display:table-cell;
|
||||
width:auto;
|
||||
padding: 1px 2px 1px 1px;
|
||||
border: 1px solid #DDD;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
|
||||
/* ============================================================================== */
|
||||
/* Formulaire confirmation (When Ajax JQuery is used) */
|
||||
@ -1636,3 +1836,133 @@ span.cke_skin_kama {padding:0px !important;}
|
||||
/* ============================================================================== */
|
||||
|
||||
.template-upload {height:72px !important;}
|
||||
|
||||
|
||||
/* ============================================================================== */
|
||||
/* JSGantt */
|
||||
/* ============================================================================== */
|
||||
|
||||
div.scroll2 {
|
||||
width: <?php print isset($_SESSION['dol_screenwidth'])?max($_SESSION['dol_screenwidth']-830,450):'450'; ?>px !important;
|
||||
}
|
||||
|
||||
|
||||
/* ============================================================================== */
|
||||
/* jFileTree */
|
||||
/* ============================================================================== */
|
||||
|
||||
.ecmfiletree {
|
||||
width: 99%;
|
||||
height: 99%;
|
||||
background: #FFF;
|
||||
padding-left: 2px;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.fileview {
|
||||
width: 99%;
|
||||
height: 99%;
|
||||
background: #FFF;
|
||||
padding-left: 2px;
|
||||
padding-top: 4px;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
div.filedirelem {
|
||||
position: relative;
|
||||
display: block;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
ul.filedirelem {
|
||||
padding: 2px;
|
||||
margin: 0 5px 5px 5px;
|
||||
}
|
||||
ul.filedirelem li {
|
||||
list-style: none;
|
||||
padding: 2px;
|
||||
margin: 0 10px 20px 10px;
|
||||
width: 160px;
|
||||
height: 120px;
|
||||
text-align: center;
|
||||
display: block;
|
||||
float: <?php print $left; ?>;
|
||||
border: solid 1px #DDDDDD;
|
||||
}
|
||||
|
||||
ui-layout-north {
|
||||
|
||||
}
|
||||
|
||||
ul.ecmjqft {
|
||||
font-size: 11px;
|
||||
line-height: 16px;
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
ul.ecmjqft li {
|
||||
list-style: none;
|
||||
padding: 0px;
|
||||
padding-left: 20px;
|
||||
margin: 0px;
|
||||
white-space: nowrap;
|
||||
display: block;
|
||||
}
|
||||
|
||||
ul.ecmjqft a {
|
||||
line-height: 16px;
|
||||
vertical-align: middle;
|
||||
color: #333;
|
||||
padding: 0px 0px;
|
||||
font-weight:normal;
|
||||
display: inline-block !important;
|
||||
/* float: left;*/
|
||||
}
|
||||
ul.ecmjqft a:active {
|
||||
font-weight: bold !important;
|
||||
}
|
||||
ul.ecmjqft a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
div.ecmjqft {
|
||||
vertical-align: middle;
|
||||
display: inline-block !important;
|
||||
text-align: right;
|
||||
position:absolute;
|
||||
right:4px;
|
||||
}
|
||||
|
||||
/* Core Styles */
|
||||
.ecmjqft LI.directory { font-weight:normal; background: url(<?php echo dol_buildpath($path.'/theme/common/treemenu/folder2.png',1); ?>) left top no-repeat; }
|
||||
.ecmjqft LI.expanded { font-weight:normal; background: url(<?php echo dol_buildpath($path.'/theme/common/treemenu/folder2-expanded.png',1); ?>) left top no-repeat; }
|
||||
.ecmjqft LI.wait { font-weight:normal; background: url(<?php echo dol_buildpath('/theme/eldy/img/working.gif',1); ?>) left top no-repeat; }
|
||||
|
||||
|
||||
|
||||
/* ============================================================================== */
|
||||
/* jNotify */
|
||||
/* ============================================================================== */
|
||||
|
||||
.jnotify-container {
|
||||
position: fixed !important;
|
||||
<?php if (! empty($conf->global->MAIN_JQUERY_JNOTIFY_BOTTOM)) { ?>
|
||||
top: auto !important;
|
||||
bottom: 4px !important;
|
||||
<?php } ?>
|
||||
text-align: center;
|
||||
min-width: 500px;
|
||||
width: auto;
|
||||
padding-left: 10px !important;
|
||||
padding-right: 10px !important;
|
||||
}
|
||||
|
||||
/* use or not ? */
|
||||
div.jnotify-background {
|
||||
opacity : 0.95 !important;
|
||||
-moz-box-shadow: 4px 4px 4px #AAA !important;
|
||||
-webkit-box-shadow: 4px 4px 4px #AAA !important;
|
||||
box-shadow: 4px 4px 4px #AAA !important;
|
||||
}
|
||||
|
||||
|
||||
@ -980,6 +980,7 @@ class User extends CommonObject
|
||||
$this->lastname = $member->lastname;
|
||||
$this->firstname = $member->firstname;
|
||||
$this->email = $member->email;
|
||||
$this->fk_member = $member->id;
|
||||
$this->pass = $member->pass;
|
||||
|
||||
if (empty($login)) $login=strtolower(substr($member->firstname, 0, 4)) . strtolower(substr($member->lastname, 0, 4));
|
||||
@ -992,26 +993,26 @@ class User extends CommonObject
|
||||
if ($result > 0)
|
||||
{
|
||||
$result=$this->setPassword($user,$this->pass);
|
||||
|
||||
$sql = "UPDATE ".MAIN_DB_PREFIX."user";
|
||||
$sql.= " SET fk_member=".$member->id;
|
||||
if ($member->fk_soc) $sql.= ", fk_societe=".$member->fk_soc;
|
||||
$sql.= " WHERE rowid=".$this->id;
|
||||
|
||||
dol_syslog(get_class($this)."::create_from_member sql=".$sql, LOG_DEBUG);
|
||||
$resql=$this->db->query($sql);
|
||||
if ($resql)
|
||||
{
|
||||
$this->db->commit();
|
||||
return $this->id;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->error=$this->db->error();
|
||||
dol_syslog(get_class($this)."::create_from_member - 1 - ".$this->error, LOG_ERR);
|
||||
|
||||
$this->db->rollback();
|
||||
return -1;
|
||||
if ($member->fk_soc) {
|
||||
$sql = "UPDATE ".MAIN_DB_PREFIX."user";
|
||||
$sql.= " SET fk_societe=".$member->fk_soc;
|
||||
$sql.= " WHERE rowid=".$this->id;
|
||||
|
||||
dol_syslog(get_class($this)."::create_from_member sql=".$sql, LOG_DEBUG);
|
||||
$resql=$this->db->query($sql);
|
||||
if ($resql)
|
||||
{
|
||||
$this->db->commit();
|
||||
return $this->id;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->error=$this->db->error();
|
||||
dol_syslog(get_class($this)."::create_from_member - 1 - ".$this->error, LOG_ERR);
|
||||
|
||||
$this->db->rollback();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
@ -307,9 +307,27 @@ if ($action == 'update' && ! $_POST["cancel"])
|
||||
|
||||
if (! $error)
|
||||
{
|
||||
$db->begin();
|
||||
$object->fetch($id);
|
||||
|
||||
// Test if new login
|
||||
if (GETPOST("login") && GETPOST("login") != $object->login)
|
||||
{
|
||||
dol_syslog("New login ".$object->login." is requested. We test it does not exists.");
|
||||
$tmpuser=new User($db);
|
||||
$result=$tmpuser->fetch(0, GETPOST("login"));
|
||||
if ($result > 0)
|
||||
{
|
||||
$message='<div class="error">'.$langs->trans("ErrorLoginAlreadyExists").'</div>';
|
||||
$action="edit"; // Go back to create page
|
||||
$error++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (! $error)
|
||||
{
|
||||
$db->begin();
|
||||
|
||||
$object->oldcopy=dol_clone($object);
|
||||
|
||||
$object->lastname = GETPOST("nom");
|
||||
@ -454,6 +472,12 @@ if ($action == 'update' && ! $_POST["cancel"])
|
||||
{
|
||||
$message.='<div class="ok">'.$langs->trans("UserModified").'</div>';
|
||||
$db->commit();
|
||||
|
||||
$login=$_SESSION["dol_login"];
|
||||
if ($login && $login == $object->oldcopy->login && $object->oldcopy->login != $object->login) // Current user has changed its login
|
||||
{
|
||||
$_SESSION["dol_login"]=$object->login; // Set new login to avoid disconnect at next page
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -769,7 +793,7 @@ if (($action == 'create') || ($action == 'adduserldap'))
|
||||
else
|
||||
{
|
||||
// We do not use a field password but a field text to show new password to use.
|
||||
print '<input size="30" maxsize="32" type="text" name="password" value="'.$password.'">';
|
||||
print '<input size="30" maxsize="32" type="text" name="password" value="'.$password.'" autocomplete="off">';
|
||||
}
|
||||
}
|
||||
print '</td></tr>';
|
||||
@ -1648,7 +1672,7 @@ else
|
||||
}
|
||||
else if ($caneditpassword)
|
||||
{
|
||||
$text='<input size="12" maxlength="32" type="password" class="flat" name="password" value="'.$object->pass.'">';
|
||||
$text='<input size="12" maxlength="32" type="password" class="flat" name="password" value="'.$object->pass.'" autocomplete="off">';
|
||||
if ($dolibarr_main_authentication && $dolibarr_main_authentication == 'http')
|
||||
{
|
||||
$text=$form->textwithpicto($text,$langs->trans("DolibarrInHttpAuthenticationSoPasswordUseless",$dolibarr_main_authentication),1,'warning');
|
||||
|
||||
@ -30,7 +30,7 @@ $path=dirname(__FILE__).'/';
|
||||
|
||||
// Test if batch mode
|
||||
if (substr($sapi_type, 0, 3) == 'cgi') {
|
||||
echo "Error: You ar usingr PH for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
@ -30,7 +30,7 @@ $path=dirname(__FILE__).'/';
|
||||
|
||||
// Test if batch mode
|
||||
if (substr($sapi_type, 0, 3) == 'cgi') {
|
||||
echo "Error: You ar usingr PH for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
@ -29,7 +29,7 @@ $path=dirname(__FILE__).'/';
|
||||
|
||||
// Test if batch mode
|
||||
if (substr($sapi_type, 0, 3) == 'cgi') {
|
||||
echo "Error: You ar usingr PH for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
@ -30,7 +30,7 @@ $path=dirname(__FILE__).'/';
|
||||
|
||||
// Test if batch mode
|
||||
if (substr($sapi_type, 0, 3) == 'cgi') {
|
||||
echo "Error: You ar usingr PH for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
@ -30,7 +30,7 @@ $path=dirname(__FILE__).'/';
|
||||
|
||||
// Test if batch mode
|
||||
if (substr($sapi_type, 0, 3) == 'cgi') {
|
||||
echo "Error: You ar usingr PH for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
@ -30,7 +30,7 @@ $path=dirname(__FILE__).'/';
|
||||
|
||||
// Test if batch mode
|
||||
if (substr($sapi_type, 0, 3) == 'cgi') {
|
||||
echo "Error: You ar usingr PH for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
@ -30,7 +30,7 @@ $path=dirname(__FILE__).'/';
|
||||
|
||||
// Test if batch mode
|
||||
if (substr($sapi_type, 0, 3) == 'cgi') {
|
||||
echo "Error: You ar usingr PH for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
@ -30,7 +30,7 @@ $path=dirname(__FILE__).'/';
|
||||
|
||||
// Test if batch mode
|
||||
if (substr($sapi_type, 0, 3) == 'cgi') {
|
||||
echo "Error: You ar usingr PH for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
@ -139,7 +139,7 @@ class AdherentTest extends PHPUnit_Framework_TestCase
|
||||
/**
|
||||
* testAdherentFetch
|
||||
*
|
||||
* @param int $id Id of object to fecth
|
||||
* @param int $id Id of object to fetch
|
||||
* @return object Fetched object
|
||||
*
|
||||
* @depends testAdherentCreate
|
||||
@ -161,13 +161,38 @@ class AdherentTest extends PHPUnit_Framework_TestCase
|
||||
return $localobject;
|
||||
}
|
||||
|
||||
/**
|
||||
* testAdherentFetchLogin
|
||||
*
|
||||
* @param Adherent $localobject Member instance
|
||||
* @return Adherent
|
||||
*
|
||||
* @depends testAdherentFetch
|
||||
* The depends says test is run only if previous is ok
|
||||
*/
|
||||
public function testAdherentFetchLogin(Adherent $localobject)
|
||||
{
|
||||
global $conf,$user,$langs,$db;
|
||||
$conf=$this->savconf;
|
||||
$user=$this->savuser;
|
||||
$langs=$this->savlangs;
|
||||
$db=$this->savdb;
|
||||
|
||||
$newobject = new Adherent($this->savdb);
|
||||
$result = $newobject->fetch_login($localobject->login);
|
||||
|
||||
$this->assertEquals($newobject, $localobject);
|
||||
|
||||
return $localobject;
|
||||
}
|
||||
|
||||
/**
|
||||
* testAdherentUpdate
|
||||
*
|
||||
* @param Adherent $localobject Member instance
|
||||
* @return Adherent
|
||||
*
|
||||
* @depends testAdherentFetch
|
||||
* @depends testAdherentFetchLogin
|
||||
* The depends says test is run only if previous is ok
|
||||
*/
|
||||
public function testAdherentUpdate(Adherent $localobject)
|
||||
@ -225,6 +250,7 @@ class AdherentTest extends PHPUnit_Framework_TestCase
|
||||
$this->assertEquals($localobject->town, $newobject->town);
|
||||
$this->assertEquals($localobject->country_id, $newobject->country_id);
|
||||
$this->assertEquals('BE', $newobject->country_code);
|
||||
$this->assertEquals('Belgium', $newobject->country);
|
||||
$this->assertEquals($localobject->statut, $newobject->statut);
|
||||
$this->assertEquals($localobject->phone, $newobject->phone);
|
||||
$this->assertEquals($localobject->phone_perso, $newobject->phone_perso);
|
||||
@ -233,7 +259,8 @@ class AdherentTest extends PHPUnit_Framework_TestCase
|
||||
$this->assertEquals($localobject->naiss, $timestamp);
|
||||
$this->assertEquals($localobject->morphy, $newobject->morphy);
|
||||
|
||||
return $localobject;
|
||||
//We return newobject because of new values
|
||||
return $newobject;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -258,8 +285,8 @@ class AdherentTest extends PHPUnit_Framework_TestCase
|
||||
'%NOM%,%SOCIETE%,%ADRESSE%,%CP%,%VILLE%,%PAYS%';
|
||||
|
||||
$expected = DOL_MAIN_URL_ROOT.','.$localobject->id.',0,New firstname,New name,New firstname New name,'.
|
||||
'New company,New address,New zip,New town,,newemail@newemail.com,'.dol_print_date($localobject->naiss,'day').',,'.
|
||||
'newlogin,dolibspec,New firstname,New name,New company,New address,New zip,New town,';
|
||||
'New company,New address,New zip,New town,Belgium,newemail@newemail.com,'.dol_print_date($localobject->naiss,'day').',,'.
|
||||
'newlogin,dolibspec,New firstname,New name,New company,New address,New zip,New town,Belgium';
|
||||
|
||||
$result = $localobject->makeSubstitution($template);
|
||||
print __METHOD__." result=".$result."\n";
|
||||
@ -268,16 +295,107 @@ class AdherentTest extends PHPUnit_Framework_TestCase
|
||||
return $localobject;
|
||||
}
|
||||
|
||||
/**
|
||||
* testAdherentSetUserId
|
||||
*
|
||||
* @param Adherent $localobject Member instance
|
||||
* @return Adherent
|
||||
*
|
||||
* @depends testAdherentMakeSubstitution
|
||||
* The depends says test is run only if previous is ok
|
||||
*/
|
||||
public function testAdherentSetUserId(Adherent $localobject)
|
||||
{
|
||||
global $conf,$user,$langs,$db;
|
||||
$conf=$this->savconf;
|
||||
$user=$this->savuser;
|
||||
$langs=$this->savlangs;
|
||||
$db=$this->savdb;
|
||||
|
||||
//We associate member with user
|
||||
$result = $localobject->setUserId($user->id);
|
||||
print __METHOD__." id=".$localobject->id." result=".$result."\n";
|
||||
$this->assertEquals($result, 1);
|
||||
|
||||
//We update user object
|
||||
$user->fetch($user->id);
|
||||
print __METHOD__." user id=".$user->id." fk_member=".$user->fk_member."\n";
|
||||
|
||||
$this->assertEquals($user->fk_member, $localobject->id);
|
||||
|
||||
//We remove association with user
|
||||
$result = $localobject->setUserId(0);
|
||||
print __METHOD__." id=".$localobject->id." result=".$result."\n";
|
||||
$this->assertEquals($result, 1);
|
||||
|
||||
//We update user object
|
||||
$user->fetch($user->id);
|
||||
print __METHOD__." user id=".$user->id." fk_member=".$user->fk_member."\n";
|
||||
|
||||
$this->assertNull($user->fk_member);
|
||||
|
||||
return $localobject;
|
||||
}
|
||||
|
||||
/**
|
||||
* testAdherentSetThirdPartyId
|
||||
*
|
||||
* @param Adherent $localobject Member instance
|
||||
* @return Adherent
|
||||
*
|
||||
* @depends testAdherentSetUserId
|
||||
* The depends says test is run only if previous is ok
|
||||
*/
|
||||
public function testAdherentSetThirdPartyId(Adherent $localobject)
|
||||
{
|
||||
global $conf,$user,$langs,$db;
|
||||
$conf=$this->savconf;
|
||||
$user=$this->savuser;
|
||||
$langs=$this->savlangs;
|
||||
$db=$this->savdb;
|
||||
|
||||
//Create a Third Party
|
||||
$thirdparty = new Societe($db);
|
||||
$thirdparty->initAsSpecimen();
|
||||
$result = $thirdparty->create($user);
|
||||
print __METHOD__." id=".$localobject->id." third party id=".$thirdparty->id." result=".$result."\n";
|
||||
$this->assertTrue($result > 0);
|
||||
|
||||
//Set Third Party ID
|
||||
$result = $localobject->setThirdPartyId($thirdparty->id);
|
||||
$this->assertEquals($result, 1);
|
||||
print __METHOD__." id=".$localobject->id." result=".$result."\n";
|
||||
|
||||
//Adherent is updated with new data
|
||||
$localobject->fetch($localobject->id);
|
||||
$this->assertEquals($localobject->fk_soc, $thirdparty->id);
|
||||
print __METHOD__." id=".$localobject->id." result=".$result."\n";
|
||||
|
||||
//We remove the third party association
|
||||
$result = $localobject->setThirdPartyId(0);
|
||||
$this->assertEquals($result, 1);
|
||||
|
||||
//And check if it has been updated
|
||||
$localobject->fetch($localobject->id);
|
||||
$this->assertNull($localobject->fk_soc);
|
||||
|
||||
//Now we remove the third party
|
||||
$result = $thirdparty->delete($thirdparty->id);
|
||||
$this->assertEquals($result, 1);
|
||||
|
||||
return $localobject;
|
||||
}
|
||||
|
||||
/**
|
||||
* testAdherentValid
|
||||
*
|
||||
* @param Adherent $localobject Member instance
|
||||
* @return Adherent
|
||||
*
|
||||
* @depends testAdherentMakeSubstitution
|
||||
* @depends testAdherentSetThirdPartyId
|
||||
* The depends says test is run only if previous is ok
|
||||
*/
|
||||
public function testAdherentValid(Adherent $localobject)
|
||||
public function testAdherentValidate(Adherent $localobject)
|
||||
{
|
||||
global $conf,$user,$langs,$db;
|
||||
$conf=$this->savconf;
|
||||
@ -298,7 +416,7 @@ class AdherentTest extends PHPUnit_Framework_TestCase
|
||||
* @param Adherent $localobject Member instance
|
||||
* @return int Id of object
|
||||
*
|
||||
* @depends testAdherentValid
|
||||
* @depends testAdherentValidate
|
||||
* The depends says test is run only if previous is ok
|
||||
*/
|
||||
public function testAdherentOther(Adherent $localobject)
|
||||
@ -318,19 +436,56 @@ class AdherentTest extends PHPUnit_Framework_TestCase
|
||||
print __METHOD__." localobject->date_creation=".$localobject->date_creation."\n";
|
||||
$this->assertNotEquals($localobject->date_creation, '');
|
||||
|
||||
return $localobject->id;
|
||||
return $localobject;
|
||||
}
|
||||
|
||||
/**
|
||||
* testAdherentResiliate
|
||||
*
|
||||
* @param Adherent $localobject Member instance
|
||||
* @return Adherent
|
||||
*
|
||||
* @depends testAdherentOther
|
||||
* The depends says test is run only if previous is ok
|
||||
*/
|
||||
public function testAdherentResiliate(Adherent $localobject)
|
||||
{
|
||||
global $conf,$user,$langs,$db;
|
||||
$conf=$this->savconf;
|
||||
$user=$this->savuser;
|
||||
$langs=$this->savlangs;
|
||||
$db=$this->savdb;
|
||||
|
||||
//Let's resilie un adherent
|
||||
$result = $localobject->resiliate($user);
|
||||
print __METHOD__." id=".$localobject->id." result=".$result."\n";
|
||||
$this->assertEquals($result, 1);
|
||||
|
||||
//Is statut updated?
|
||||
$this->assertEquals($localobject->statut, 0);
|
||||
|
||||
//We update the object and let's check if it was updated on DB
|
||||
$localobject->fetch($localobject->id);
|
||||
$this->assertEquals($localobject->statut, 0);
|
||||
|
||||
//Now that status=0, resiliate should return 0
|
||||
$result = $localobject->resiliate($user);
|
||||
print __METHOD__." id=".$localobject->id." result=".$result."\n";
|
||||
$this->assertEquals($result, 0);
|
||||
|
||||
return $localobject;
|
||||
}
|
||||
|
||||
/**
|
||||
* testAdherentDelete
|
||||
*
|
||||
* @param int $id Id of object to delete
|
||||
* @param Adherent $localobject Member instance
|
||||
* @return void
|
||||
*
|
||||
* @depends testAdherentOther
|
||||
* @depends testAdherentResiliate
|
||||
* The depends says test is run only if previous is ok
|
||||
*/
|
||||
public function testAdherentDelete($id)
|
||||
public function testAdherentDelete($localobject)
|
||||
{
|
||||
global $conf,$user,$langs,$db;
|
||||
$conf=$this->savconf;
|
||||
@ -338,10 +493,8 @@ class AdherentTest extends PHPUnit_Framework_TestCase
|
||||
$langs=$this->savlangs;
|
||||
$db=$this->savdb;
|
||||
|
||||
$localobject=new Adherent($this->savdb);
|
||||
$result=$localobject->fetch($id);
|
||||
$result=$localobject->delete($id);
|
||||
print __METHOD__." id=".$id." result=".$result."\n";
|
||||
$result=$localobject->delete($localobject->id);
|
||||
print __METHOD__." id=".$localobject->id." result=".$result."\n";
|
||||
$this->assertLessThan($result, 0);
|
||||
|
||||
return $result;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user