Merge branch 'develop' into prod-attr
# Conflicts: # htdocs/compta/facture.php
This commit is contained in:
commit
d09a3628c5
@ -12,6 +12,7 @@ php:
|
|||||||
- '5.5'
|
- '5.5'
|
||||||
- '5.6'
|
- '5.6'
|
||||||
- '7.0'
|
- '7.0'
|
||||||
|
- '7.1'
|
||||||
- nightly
|
- nightly
|
||||||
|
|
||||||
addons:
|
addons:
|
||||||
@ -96,7 +97,7 @@ install:
|
|||||||
if [ "$TRAVIS_PHP_VERSION" = '5.3' ] || [ "$TRAVIS_PHP_VERSION" = '5.4' ] || [ "$TRAVIS_PHP_VERSION" = '5.5' ]; then
|
if [ "$TRAVIS_PHP_VERSION" = '5.3' ] || [ "$TRAVIS_PHP_VERSION" = '5.4' ] || [ "$TRAVIS_PHP_VERSION" = '5.5' ]; then
|
||||||
composer -n require phpunit/phpunit ^4
|
composer -n require phpunit/phpunit ^4
|
||||||
fi
|
fi
|
||||||
if [ "$TRAVIS_PHP_VERSION" = '5.6' ] || [ "$TRAVIS_PHP_VERSION" = '7.0' ] || [ "$TRAVIS_PHP_VERSION" = 'nightly' ]; then
|
if [ "$TRAVIS_PHP_VERSION" = '5.6' ] || [ "$TRAVIS_PHP_VERSION" = '7.0' ] || [ "$TRAVIS_PHP_VERSION" = '7.1' ] || [ "$TRAVIS_PHP_VERSION" = 'nightly' ]; then
|
||||||
composer -n require phpunit/phpunit ^5
|
composer -n require phpunit/phpunit ^5
|
||||||
fi
|
fi
|
||||||
echo
|
echo
|
||||||
@ -136,7 +137,7 @@ before_script:
|
|||||||
echo 'extension = apc.so' >> ~/.phpenv/versions/$PHP_VERSION_NAME/etc/php.ini
|
echo 'extension = apc.so' >> ~/.phpenv/versions/$PHP_VERSION_NAME/etc/php.ini
|
||||||
echo
|
echo
|
||||||
echo "Enabling Memcached for PHP <= 5.4"
|
echo "Enabling Memcached for PHP <= 5.4"
|
||||||
# Documentation says it should be available for all PHP versions but it's not for 5.5 and 5.6, 7.0 and nightly!
|
# Documentation says it should be available for all PHP versions but it's not for 5.5 and 5.6, 7.0, 7.1 and nightly!
|
||||||
echo 'extension = memcached.so' >> ~/.phpenv/versions/$PHP_VERSION_NAME/etc/php.ini
|
echo 'extension = memcached.so' >> ~/.phpenv/versions/$PHP_VERSION_NAME/etc/php.ini
|
||||||
fi
|
fi
|
||||||
phpenv rehash
|
phpenv rehash
|
||||||
@ -208,7 +209,7 @@ before_script:
|
|||||||
echo "Setting up Apache + FPM"
|
echo "Setting up Apache + FPM"
|
||||||
# enable php-fpm
|
# enable php-fpm
|
||||||
cp ~/.phpenv/versions/$PHP_VERSION_NAME/etc/php-fpm.conf.default ~/.phpenv/versions/$PHP_VERSION_NAME/etc/php-fpm.conf
|
cp ~/.phpenv/versions/$PHP_VERSION_NAME/etc/php-fpm.conf.default ~/.phpenv/versions/$PHP_VERSION_NAME/etc/php-fpm.conf
|
||||||
if [ "$TRAVIS_PHP_VERSION" = '7.0' ] || [ "$TRAVIS_PHP_VERSION" = 'nightly' ]; then
|
if [ "$TRAVIS_PHP_VERSION" = '7.0' ] || [ "$TRAVIS_PHP_VERSION" = '7.1' ] || [ "$TRAVIS_PHP_VERSION" = 'nightly' ]; then
|
||||||
# Copy the included pool
|
# Copy the included pool
|
||||||
cp ~/.phpenv/versions/$PHP_VERSION_NAME/etc/php-fpm.d/www.conf.default ~/.phpenv/versions/$PHP_VERSION_NAME/etc/php-fpm.d/www.conf
|
cp ~/.phpenv/versions/$PHP_VERSION_NAME/etc/php-fpm.d/www.conf.default ~/.phpenv/versions/$PHP_VERSION_NAME/etc/php-fpm.d/www.conf
|
||||||
fi
|
fi
|
||||||
|
|||||||
109
ChangeLog
109
ChangeLog
@ -403,6 +403,115 @@ So if you included it into your module, change your code like this to be compati
|
|||||||
if (! $res) include_once DOL_DOCUMENT_ROOT . '/core/tpl/document_actions_pre_headers.tpl.php';
|
if (! $res) include_once DOL_DOCUMENT_ROOT . '/core/tpl/document_actions_pre_headers.tpl.php';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
***** ChangeLog for 3.9.4 compared to 3.9.3 *****
|
||||||
|
FIX: #2853
|
||||||
|
FIX: #3128
|
||||||
|
FIX: #4447
|
||||||
|
FIX: #5128 if create method return duplicated code error not use GETPOST in order to get a new code
|
||||||
|
FIX: #5340
|
||||||
|
FIX: #5473
|
||||||
|
FIX: #5474 Country_id of "Don" object is still empty
|
||||||
|
FIX: #5534
|
||||||
|
FIX: #5535 bad dependency.
|
||||||
|
FIX: #5537 AJAX project search does not work properly
|
||||||
|
FIX: #5540 getFormMail is not registered as addReplace hook
|
||||||
|
FIX: #5544 Disabled Contact still appear in lists to send emails
|
||||||
|
FIX: #5549 getNomUrl tooltips show Order info even if user has no rights to read them
|
||||||
|
FIX: #5568
|
||||||
|
FIX: #5594
|
||||||
|
FIX: #5629 PgSQL Interger string stylish error
|
||||||
|
FIX: #5651
|
||||||
|
FIX: #5660
|
||||||
|
FIX: #5853 $conf->global->$calc==0 || $conf->global->$calc==1
|
||||||
|
FIX: #5907
|
||||||
|
FIX: #5966 Bug: getNomUrl tooltips show Proposal info even if user has no rights to read them
|
||||||
|
FIX: #6051
|
||||||
|
FIX: #6088
|
||||||
|
FIX: Can correct stock of lot using eatby or sell by date
|
||||||
|
FIX: Can make a movement on "out of sell" products
|
||||||
|
FIX: cannot update bank account on invoice if module order not activated
|
||||||
|
FIX: Can't create withdrawal document
|
||||||
|
FIX: delete contract extrafields on contract deletion
|
||||||
|
FIX: Direction of movement lost if an error occurs
|
||||||
|
FIX: Error when CATEGORIE_RECURSIV_ADD is enabled and new category is daughter of an already linked to object
|
||||||
|
FIX: export extrafields must not include separe type
|
||||||
|
FIX: External user must not be able to edit its discounts
|
||||||
|
FIX: Failed to export contact categories with contact extra fields
|
||||||
|
FIX: header title in commercial area
|
||||||
|
FIX: HT and TTC price should always be displayed together
|
||||||
|
FIX: incoterms
|
||||||
|
FIX: incoterms do not output into crabe invoice PDF
|
||||||
|
FIX: in PgSQL no quote "word style" is permitted around column name
|
||||||
|
FIX: Introduce hidden option MAIL_PREFIX_FOR_EMAIL_ID to solve pb of tracking email.
|
||||||
|
FIX: margin tab on customer card must filter on current entity invoices
|
||||||
|
FIX: missing column into SQL on thridparty list
|
||||||
|
FIX: only show projects of related third if external user
|
||||||
|
FIX: PgSQL Module Ressource list crash #5637
|
||||||
|
FIX: php Strict
|
||||||
|
FIX: Regression when deleting product
|
||||||
|
FIX: Security to restrict email sending was not efficient
|
||||||
|
FIX: tag for date rfc in odt substitution
|
||||||
|
FIX: Update intervention lline crash with PgSQL
|
||||||
|
FIX: update limit stock on product stock
|
||||||
|
FIX: vat dictionary should allow enter and edit multiple values for localtaxes, separated by: (ex -19:-15)
|
||||||
|
FIX: wrong test on dict.php
|
||||||
|
|
||||||
|
|
||||||
|
***** ChangeLog for 3.9.4 compared to 3.9.3 *****
|
||||||
|
FIX: #2853
|
||||||
|
FIX: #3128
|
||||||
|
FIX: #4447
|
||||||
|
FIX: #5128 if create method return duplicated code error not use GETPOST in order to get a new code
|
||||||
|
FIX: #5340
|
||||||
|
FIX: #5473
|
||||||
|
FIX: #5474 Country_id of "Don" object is still empty
|
||||||
|
FIX: #5534
|
||||||
|
FIX: #5535 bad dependency.
|
||||||
|
FIX: #5537 AJAX project search does not work properly
|
||||||
|
FIX: #5540 getFormMail is not registered as addReplace hook
|
||||||
|
FIX: #5544 Disabled Contact still appear in lists to send emails
|
||||||
|
FIX: #5549 getNomUrl tooltips show Order info even if user has no rights to read them
|
||||||
|
FIX: #5568
|
||||||
|
FIX: #5594
|
||||||
|
FIX: #5629 PgSQL Interger string stylish error
|
||||||
|
FIX: #5651
|
||||||
|
FIX: #5660
|
||||||
|
FIX: #5853 $conf->global->$calc==0 || $conf->global->$calc==1
|
||||||
|
FIX: #5907
|
||||||
|
FIX: #5966 Bug: getNomUrl tooltips show Proposal info even if user has no rights to read them
|
||||||
|
FIX: #6051
|
||||||
|
FIX: #6088
|
||||||
|
FIX: Can correct stock of lot using eatby or sell by date
|
||||||
|
FIX: Can make a movement on "out of sell" products
|
||||||
|
FIX: cannot update bank account on invoice if module order not activated
|
||||||
|
FIX: Can't create withdrawal document
|
||||||
|
FIX: delete contract extrafields on contract deletion
|
||||||
|
FIX: Direction of movement lost if an error occurs
|
||||||
|
FIX: Error when CATEGORIE_RECURSIV_ADD is enabled and new category is daughter of an already linked to object
|
||||||
|
FIX: export extrafields must not include separe type
|
||||||
|
FIX: External user must not be able to edit its discounts
|
||||||
|
FIX: Failed to export contact categories with contact extra fields
|
||||||
|
FIX: header title in commercial area
|
||||||
|
FIX: HT and TTC price should always be displayed together
|
||||||
|
FIX: incoterms
|
||||||
|
FIX: incoterms do not output into crabe invoice PDF
|
||||||
|
FIX: in PgSQL no quote "word style" is permitted around column name
|
||||||
|
FIX: Introduce hidden option MAIL_PREFIX_FOR_EMAIL_ID to solve pb of tracking email.
|
||||||
|
FIX: margin tab on customer card must filter on current entity invoices
|
||||||
|
FIX: missing column into SQL on thridparty list
|
||||||
|
FIX: only show projects of related third if external user
|
||||||
|
FIX: PgSQL Module Ressource list crash #5637
|
||||||
|
FIX: php Strict
|
||||||
|
FIX: Regression when deleting product
|
||||||
|
FIX: Security to restrict email sending was not efficient
|
||||||
|
FIX: tag for date rfc in odt substitution
|
||||||
|
FIX: Update intervention lline crash with PgSQL
|
||||||
|
FIX: update limit stock on product stock
|
||||||
|
FIX: vat dictionary should allow enter and edit multiple values for localtaxes, separated by: (ex -19:-15)
|
||||||
|
FIX: wrong test on dict.php
|
||||||
|
|
||||||
|
|
||||||
***** ChangeLog for 3.9.3 compared to 3.9.2 *****
|
***** ChangeLog for 3.9.3 compared to 3.9.2 *****
|
||||||
FIX: #4383 $userid not defined
|
FIX: #4383 $userid not defined
|
||||||
FIX: #4448 $filebonprev is not used, $this->filename now
|
FIX: #4448 $filebonprev is not used, $this->filename now
|
||||||
|
|||||||
@ -320,8 +320,8 @@ x.y.z+dfsgw
|
|||||||
Note: If there was errors solved manually after get-orig-sources.sh, you may need to make a git commit
|
Note: If there was errors solved manually after get-orig-sources.sh, you may need to make a git commit
|
||||||
|
|
||||||
* Update/fix debian/* files used to build package.
|
* Update/fix debian/* files used to build package.
|
||||||
At least, add an entry into debian/changelog
|
At least, add an entry into debian/changelog with command
|
||||||
> dch -v x.y.z+dfsgw-v "My comment" will add entry.
|
> dch -v x.y.z+dfsgw-1 "My comment"
|
||||||
For example: dch -v x.y.z+dfsgw-1 "New upstream release." for a new version (x.y.z = version, w start from 1 and increased for each new import)
|
For example: dch -v x.y.z+dfsgw-1 "New upstream release." for a new version (x.y.z = version, w start from 1 and increased for each new import)
|
||||||
Then check/modify changelog to replace "version" or "unstable" with "UNRELEASED".
|
Then check/modify changelog to replace "version" or "unstable" with "UNRELEASED".
|
||||||
Then check/modify also the user/date signature:
|
Then check/modify also the user/date signature:
|
||||||
@ -332,7 +332,9 @@ Then check/modify also the user/date signature:
|
|||||||
To update dolibarr debian package when only files into debian has changed:
|
To update dolibarr debian package when only files into debian has changed:
|
||||||
|
|
||||||
* Change files and commit.
|
* Change files and commit.
|
||||||
* Add a tag debian/x.y.z+dfsgw-2 (increase the last 1 into 2, 3...)
|
* Add a line into changelog for version debian/x.y.z+dfsgw-v (increase the last v into 2, 3...)
|
||||||
|
> dch -v x.y.z+dfsgw-v "My comment"
|
||||||
|
* git tag will be added when package is pushed.
|
||||||
|
|
||||||
|
|
||||||
To update dolibarr debian package when only files not into debian has changed:
|
To update dolibarr debian package when only files not into debian has changed:
|
||||||
|
|||||||
@ -26,11 +26,11 @@ Depends: libapache2-mod-php5 | libapache2-mod-php5filter | php5-cgi | php5-fpm |
|
|||||||
# Misc dependencies
|
# Misc dependencies
|
||||||
# fonts-dejavu-core | ttf-dejavu-core,
|
# fonts-dejavu-core | ttf-dejavu-core,
|
||||||
xdg-utils,
|
xdg-utils,
|
||||||
virtual-mysql-client,
|
mariadb-client | virtual-mysql-client,
|
||||||
${misc:Depends},
|
${misc:Depends},
|
||||||
${perl:Depends}
|
${perl:Depends}
|
||||||
Recommends: apache2 | lighttpd | httpd,
|
Recommends: apache2 | lighttpd | httpd,
|
||||||
virtual-mysql-server
|
mariadb-server | virtual-mysql-server
|
||||||
Suggests: www-browser, php5-geoip
|
Suggests: www-browser, php5-geoip
|
||||||
Description: Web based software to manage a company or foundation
|
Description: Web based software to manage a company or foundation
|
||||||
Dolibarr ERP & CRM is an easy to use open source/free software package for
|
Dolibarr ERP & CRM is an easy to use open source/free software package for
|
||||||
|
|||||||
@ -162,7 +162,7 @@ export res=$?
|
|||||||
|
|
||||||
|
|
||||||
# ---------------------------- copy demo files
|
# ---------------------------- copy demo files
|
||||||
export documentdir=`cat $mydir/../../htdocs/conf/conf.php | grep '^\$dolibarr_main_data_root' | sed -e 's/$dolibarr_main_data_root=//' | sed -e 's/;//' | sed -e "s/'//g" `
|
export documentdir=`cat $mydir/../../htdocs/conf/conf.php | grep '^\$dolibarr_main_data_root' | sed -e 's/$dolibarr_main_data_root=//' | sed -e 's/;//' | sed -e "s/'//g" | sed -e 's/"//g' `
|
||||||
if [ "x$documentdir" != "x" ]
|
if [ "x$documentdir" != "x" ]
|
||||||
then
|
then
|
||||||
echo cp -pr $mydir/documents_demo/* "$documentdir/"
|
echo cp -pr $mydir/documents_demo/* "$documentdir/"
|
||||||
@ -174,7 +174,7 @@ then
|
|||||||
echo cp -pr $mydir/../../doc/images/* "$documentdir/ecm/Images"
|
echo cp -pr $mydir/../../doc/images/* "$documentdir/ecm/Images"
|
||||||
cp -pr $mydir/../../doc/images/* "$documentdir/ecm/Images"
|
cp -pr $mydir/../../doc/images/* "$documentdir/ecm/Images"
|
||||||
else
|
else
|
||||||
echo Detection of documents directory failed so demo files were not copied.
|
echo Detection of documents directory $documentdir failed so demo files were not copied.
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -303,7 +303,7 @@ foreach($property as $key => $prop)
|
|||||||
$varprop.="\$this->db->escape(\$this->".$prop['field'].")";
|
$varprop.="\$this->db->escape(\$this->".$prop['field'].")";
|
||||||
$varprop.=".\"'\")";
|
$varprop.=".\"'\")";
|
||||||
}
|
}
|
||||||
elseif ($prop['field']=='fk_user_mod' || $prop['field']=='fk_user_author')
|
elseif ($prop['field']=='fk_user_mod' || $prop['field']=='fk_user_m' || $prop['field']=='fk_user_author')
|
||||||
{
|
{
|
||||||
$varprop.="'.\$user->id";
|
$varprop.="'.\$user->id";
|
||||||
}
|
}
|
||||||
@ -367,7 +367,7 @@ foreach($property as $key => $prop)
|
|||||||
$varprop.=')."\'" : \'null\')';
|
$varprop.=')."\'" : \'null\')';
|
||||||
}
|
}
|
||||||
|
|
||||||
elseif ($prop['field']=='fk_user_mod') {
|
elseif ($prop['field']=='fk_user_mod' || $prop['field']=='fk_user_m') {
|
||||||
$varprop.="'.\$user->id";
|
$varprop.="'.\$user->id";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@ -188,10 +188,12 @@ class Skeleton_Class extends CommonObject
|
|||||||
|
|
||||||
// Retrieve all extrafields for invoice
|
// Retrieve all extrafields for invoice
|
||||||
// fetch optionals attributes and labels
|
// fetch optionals attributes and labels
|
||||||
|
/*
|
||||||
require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
|
require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
|
||||||
$extrafields=new ExtraFields($this->db);
|
$extrafields=new ExtraFields($this->db);
|
||||||
$extralabels=$extrafields->fetch_name_optionals_label($this->table_element,true);
|
$extralabels=$extrafields->fetch_name_optionals_label($this->table_element,true);
|
||||||
$this->fetch_optionals($this->id,$extralabels);
|
$this->fetch_optionals($this->id,$extralabels);
|
||||||
|
*/
|
||||||
|
|
||||||
// $this->fetch_lines();
|
// $this->fetch_lines();
|
||||||
|
|
||||||
@ -251,23 +253,19 @@ class Skeleton_Class extends CommonObject
|
|||||||
$sql .= $this->db->order($sortfield,$sortorder);
|
$sql .= $this->db->order($sortfield,$sortorder);
|
||||||
}
|
}
|
||||||
if (!empty($limit)) {
|
if (!empty($limit)) {
|
||||||
$sql .= ' ' . $this->db->plimit($limit + 1, $offset);
|
$sql .= ' ' . $this->db->plimit($limit, $offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->lines = array();
|
|
||||||
|
|
||||||
$resql = $this->db->query($sql);
|
$resql = $this->db->query($sql);
|
||||||
if ($resql) {
|
if ($resql) {
|
||||||
$num = $this->db->num_rows($resql);
|
$num = $this->db->num_rows($resql);
|
||||||
|
|
||||||
while ($obj = $this->db->fetch_object($resql)) {
|
while ($obj = $this->db->fetch_object($resql)) {
|
||||||
$line = new Skeleton_ClassLine();
|
$line = new self($this->db);
|
||||||
|
|
||||||
$line->id = $obj->rowid;
|
$line->id = $obj->rowid;
|
||||||
$line->prop1 = $obj->field1;
|
$line->prop1 = $obj->field1;
|
||||||
$line->prop2 = $obj->field2;
|
$line->prop2 = $obj->field2;
|
||||||
|
|
||||||
$this->lines[$line->id] = $line;
|
|
||||||
//...
|
//...
|
||||||
}
|
}
|
||||||
$this->db->free($resql);
|
$this->db->free($resql);
|
||||||
|
|||||||
8
dev/tools/github_authors_peryear.sh
Executable file
8
dev/tools/github_authors_peryear.sh
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
FROM=2016-01-01
|
||||||
|
TO=2016-12-31
|
||||||
|
|
||||||
|
echo "git log --since $FROM --before $TO | grep ^Author | sort -u -f -i -b | wc -l"
|
||||||
|
git log --since $FROM --before $TO | grep ^Author | sort -u -f -i -b | wc -l
|
||||||
|
|
||||||
15
dev/tools/github_commits_perversion.sh
Executable file
15
dev/tools/github_commits_perversion.sh
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
#/bin/bash
|
||||||
|
Releases=("3.8" "3.9" "4.0" "5.0", "develop")
|
||||||
|
Dates=("2010-01-01", "2011-01-01", "2012-01-01", "2013-01-01", "2014-01-01", "2015-01-01", "2016-07-01")
|
||||||
|
let "counter = 1"
|
||||||
|
|
||||||
|
for i in "${Releases[@]}"
|
||||||
|
do
|
||||||
|
git shortlog -s -n --after=${Dates[counter-1]} --before=${Dates[counter]}
|
||||||
|
echo -n "Total $i: "
|
||||||
|
git log --pretty=oneline --after=${Dates[counter-1]} --before=${Dates[counter]} | wc -l
|
||||||
|
echo "======================="
|
||||||
|
echo
|
||||||
|
let "counter +=1"
|
||||||
|
done
|
||||||
|
|
||||||
@ -888,18 +888,18 @@ if ($id)
|
|||||||
{
|
{
|
||||||
if ($value == 'country')
|
if ($value == 'country')
|
||||||
{
|
{
|
||||||
print '<td>';
|
print '<td class="liste_titre">';
|
||||||
print $form->select_country($search_country_id, 'search_country_id', '', 28, 'maxwidth200 maxwidthonsmartphone');
|
print $form->select_country($search_country_id, 'search_country_id', '', 28, 'maxwidth200 maxwidthonsmartphone');
|
||||||
print '</td>';
|
print '</td>';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
print '<td></td>';
|
print '<td class="liste_titre"></td>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($id == 4) print '<td></td>';
|
if ($id == 4) print '<td></td>';
|
||||||
print '<td></td>';
|
print '<td class="liste_titre"></td>';
|
||||||
print '<td class="liste_titre" colspan="2" align="right">';
|
print '<td class="liste_titre" colspan="2" align="right">';
|
||||||
$searchpitco=$form->showFilterAndCheckAddButtons(0);
|
$searchpitco=$form->showFilterAndCheckAddButtons(0);
|
||||||
print $searchpitco;
|
print $searchpitco;
|
||||||
|
|||||||
@ -235,9 +235,8 @@ print_liste_field_titre('', $_SERVER["PHP_SELF"], "", $options, "", 'width="60"
|
|||||||
print "</tr>\n";
|
print "</tr>\n";
|
||||||
|
|
||||||
print '<tr class="liste_titre">';
|
print '<tr class="liste_titre">';
|
||||||
print '<form action="' . $_SERVER["PHP_SELF"] . '" method="GET">';
|
print '<td class="liste_titre">' . $object->select_account($search_accountancy_code_start, 'search_accountancy_code_start', 1, array (), 1, 1, '') . '</td>';
|
||||||
print '<td>' . $object->select_account($search_accountancy_code_start, 'search_accountancy_code_start', 1, array (), 1, 1, '') . '</td>';
|
print '<td class="liste_titre"></td>';
|
||||||
print '<td></td>';
|
|
||||||
print '<td class="liste_titre" align="center">';
|
print '<td class="liste_titre" align="center">';
|
||||||
print $langs->trans('From') . ': ';
|
print $langs->trans('From') . ': ';
|
||||||
print $form->select_date($search_date_start, 'date_start', 0, 0, 1);
|
print $form->select_date($search_date_start, 'date_start', 0, 0, 1);
|
||||||
@ -247,10 +246,10 @@ print $form->select_date($search_date_end, 'date_end', 0, 0, 1);
|
|||||||
print '</td>';
|
print '</td>';
|
||||||
print '<td class="liste_titre"><input type="text" size="7" class="flat" name="search_mvt_label" value="' . $search_mvt_label . '"/></td>';
|
print '<td class="liste_titre"><input type="text" size="7" class="flat" name="search_mvt_label" value="' . $search_mvt_label . '"/></td>';
|
||||||
print '<td class="liste_titre"><input type="text" size="7" class="flat" name="search_label_account" value="' . $search_label_account . '"/></td>';
|
print '<td class="liste_titre"><input type="text" size="7" class="flat" name="search_label_account" value="' . $search_label_account . '"/></td>';
|
||||||
print '<td> </td>';
|
print '<td class="liste_titre"> </td>';
|
||||||
print '<td> </td>';
|
print '<td class="liste_titre"> </td>';
|
||||||
print '<td align="right"><input type="text" name="search_ledger_code" size="3" value="' . $search_ledger_code . '"></td>';
|
print '<td class="liste_titre" align="right"><input type="text" name="search_ledger_code" size="3" value="' . $search_ledger_code . '"></td>';
|
||||||
print '<td align="right" colspan="2" class="liste_titre">';
|
print '<td class="liste_titre" align="right" colspan="2">';
|
||||||
$searchpitco=$form->showFilterAndCheckAddButtons(0);
|
$searchpitco=$form->showFilterAndCheckAddButtons(0);
|
||||||
print $searchpitco;
|
print $searchpitco;
|
||||||
print '</td>';
|
print '</td>';
|
||||||
|
|||||||
@ -83,6 +83,8 @@ class FormVentilation extends Form
|
|||||||
|
|
||||||
require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php';
|
require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php';
|
||||||
|
|
||||||
|
$out = '';
|
||||||
|
|
||||||
$options = array();
|
$options = array();
|
||||||
if ($usecache && ! empty($this->options_cache[$usecache]))
|
if ($usecache && ! empty($this->options_cache[$usecache]))
|
||||||
{
|
{
|
||||||
@ -109,7 +111,7 @@ class FormVentilation extends Form
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
$out = ajax_combobox($htmlname, $event);
|
$out .= ajax_combobox($htmlname, $event);
|
||||||
|
|
||||||
$selected = 0;
|
$selected = 0;
|
||||||
while ($obj = $this->db->fetch_object($resql))
|
while ($obj = $this->db->fetch_object($resql))
|
||||||
|
|||||||
@ -29,6 +29,7 @@
|
|||||||
require '../../main.inc.php';
|
require '../../main.inc.php';
|
||||||
require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php';
|
require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php';
|
||||||
require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php';
|
require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php';
|
||||||
|
require_once DOL_DOCUMENT_ROOT . '/compta/facture/class/facture.class.php';
|
||||||
|
|
||||||
// Langs
|
// Langs
|
||||||
$langs->load("compta");
|
$langs->load("compta");
|
||||||
@ -179,7 +180,14 @@ if ($conf->global->MAIN_FEATURES_LEVEL > 1) print '<a class="butActionDelete" hr
|
|||||||
$sql = "SELECT count(*) FROM " . MAIN_DB_PREFIX . "facturedet as fd";
|
$sql = "SELECT count(*) FROM " . MAIN_DB_PREFIX . "facturedet as fd";
|
||||||
$sql .= " , " . MAIN_DB_PREFIX . "facture as f";
|
$sql .= " , " . MAIN_DB_PREFIX . "facture as f";
|
||||||
$sql .= " WHERE fd.fk_code_ventilation = 0";
|
$sql .= " WHERE fd.fk_code_ventilation = 0";
|
||||||
$sql .= " AND f.rowid = fd.fk_facture AND f.fk_statut = 1;";
|
$sql .= " AND f.rowid = fd.fk_facture";
|
||||||
|
$sql .= " AND f.fk_statut > 0";
|
||||||
|
if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
|
||||||
|
$sql .= " AND f.type IN (" . Facture::TYPE_STANDARD . "," . Facture::TYPE_REPLACEMENT . "," . Facture::TYPE_CREDIT_NOTE . "," . Facture::TYPE_SITUATION . ")";
|
||||||
|
} else {
|
||||||
|
$sql .= " AND f.type IN (" . Facture::TYPE_STANDARD . "," . Facture::TYPE_REPLACEMENT . "," . Facture::TYPE_CREDIT_NOTE . "," . Facture::TYPE_DEPOSIT . "," . Facture::TYPE_SITUATION . ")";
|
||||||
|
}
|
||||||
|
$sql .= " AND f.entity IN (" . getEntity("facture", 0) . ")"; // We don't share object for accountancy
|
||||||
|
|
||||||
dol_syslog("htdocs/accountancy/customer/index.php sql=" . $sql, LOG_DEBUG);
|
dol_syslog("htdocs/accountancy/customer/index.php sql=" . $sql, LOG_DEBUG);
|
||||||
$result = $db->query($sql);
|
$result = $db->query($sql);
|
||||||
@ -222,6 +230,11 @@ $sql .= " WHERE f.datef >= '" . $db->idate(dol_get_first_day($y, 1, false)) . "'
|
|||||||
$sql .= " AND f.datef <= '" . $db->idate(dol_get_last_day($y, 12, false)) . "'";
|
$sql .= " AND f.datef <= '" . $db->idate(dol_get_last_day($y, 12, false)) . "'";
|
||||||
$sql .= " AND f.entity IN (" . getEntity("facture", 0) . ")"; // We don't share object for accountancy
|
$sql .= " AND f.entity IN (" . getEntity("facture", 0) . ")"; // We don't share object for accountancy
|
||||||
$sql .= " AND aa.account_number IS NULL";
|
$sql .= " AND aa.account_number IS NULL";
|
||||||
|
if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
|
||||||
|
$sql .= " AND f.type IN (" . Facture::TYPE_STANDARD . "," . Facture::TYPE_REPLACEMENT . "," . Facture::TYPE_CREDIT_NOTE . "," . Facture::TYPE_SITUATION . ")";
|
||||||
|
} else {
|
||||||
|
$sql .= " AND f.type IN (" . Facture::TYPE_STANDARD . "," . Facture::TYPE_REPLACEMENT . "," . Facture::TYPE_CREDIT_NOTE . "," . Facture::TYPE_DEPOSIT . "," . Facture::TYPE_SITUATION . ")";
|
||||||
|
}
|
||||||
$sql .= " GROUP BY fd.fk_code_ventilation,aa.account_number,aa.label";
|
$sql .= " GROUP BY fd.fk_code_ventilation,aa.account_number,aa.label";
|
||||||
|
|
||||||
dol_syslog("htdocs/accountancy/customer/index.php sql=" . $sql, LOG_DEBUG);
|
dol_syslog("htdocs/accountancy/customer/index.php sql=" . $sql, LOG_DEBUG);
|
||||||
@ -273,6 +286,11 @@ $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_account as aa ON aa.rowid
|
|||||||
$sql .= " WHERE f.datef >= '" . $db->idate(dol_get_first_day($y, 1, false)) . "'";
|
$sql .= " WHERE f.datef >= '" . $db->idate(dol_get_first_day($y, 1, false)) . "'";
|
||||||
$sql .= " AND f.datef <= '" . $db->idate(dol_get_last_day($y, 12, false)) . "'";
|
$sql .= " AND f.datef <= '" . $db->idate(dol_get_last_day($y, 12, false)) . "'";
|
||||||
$sql .= " AND f.entity IN (" . getEntity("facture", 0) . ")"; // We don't share object for accountancy
|
$sql .= " AND f.entity IN (" . getEntity("facture", 0) . ")"; // We don't share object for accountancy
|
||||||
|
if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
|
||||||
|
$sql .= " AND f.type IN (" . Facture::TYPE_STANDARD . "," . Facture::TYPE_REPLACEMENT . "," . Facture::TYPE_CREDIT_NOTE . "," . Facture::TYPE_SITUATION . ")";
|
||||||
|
} else {
|
||||||
|
$sql .= " AND f.type IN (" . Facture::TYPE_STANDARD . "," . Facture::TYPE_REPLACEMENT . "," . Facture::TYPE_CREDIT_NOTE . "," . Facture::TYPE_DEPOSIT . "," . Facture::TYPE_SITUATION . ")";
|
||||||
|
}
|
||||||
$sql .= " AND aa.account_number IS NOT NULL";
|
$sql .= " AND aa.account_number IS NOT NULL";
|
||||||
$sql .= " GROUP BY fd.fk_code_ventilation,aa.account_number,aa.label";
|
$sql .= " GROUP BY fd.fk_code_ventilation,aa.account_number,aa.label";
|
||||||
|
|
||||||
@ -301,97 +319,105 @@ print "</table>\n";
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if ($conf->global->MAIN_FEATURES_LEVEL > 0) // This part of code looks strange. Why showing a report that should rely on result of this step ?
|
||||||
|
{
|
||||||
|
print '<br>';
|
||||||
|
print '<br>';
|
||||||
|
|
||||||
|
print_fiche_titre($langs->trans("OtherInfo"), '', '');
|
||||||
|
|
||||||
print '<br>';
|
print "<br>\n";
|
||||||
print '<br>';
|
print '<table class="noborder" width="100%">';
|
||||||
|
print '<tr class="liste_titre"><td width="400" align="left">' . $langs->trans("TotalVente") . '</td>';
|
||||||
|
for($i = 1; $i <= 12; $i ++) {
|
||||||
|
print '<td width="60" align="right">' . $langs->trans('MonthShort' . str_pad($i, 2, '0', STR_PAD_LEFT)) . '</td>';
|
||||||
|
}
|
||||||
|
print '<td width="60" align="right"><b>' . $langs->trans("Total") . '</b></td></tr>';
|
||||||
|
|
||||||
|
$sql = "SELECT '" . $langs->trans("TotalVente") . "' AS total,";
|
||||||
|
for($i = 1; $i <= 12; $i ++) {
|
||||||
|
$sql .= " SUM(" . $db->ifsql('MONTH(f.datef)=' . $i, 'fd.total_ht', '0') . ") AS month" . str_pad($i, 2, '0', STR_PAD_LEFT) . ",";
|
||||||
|
}
|
||||||
|
$sql .= " SUM(fd.total_ht) as total";
|
||||||
|
$sql .= " FROM " . MAIN_DB_PREFIX . "facturedet as fd";
|
||||||
|
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "facture as f ON f.rowid = fd.fk_facture";
|
||||||
|
$sql .= " WHERE f.datef >= '" . $db->idate(dol_get_first_day($y, 1, false)) . "'";
|
||||||
|
$sql .= " AND f.datef <= '" . $db->idate(dol_get_last_day($y, 12, false)) . "'";
|
||||||
|
$sql .= " AND f.entity IN (" . getEntity("facture", 0) . ")"; // We don't share object for accountancy
|
||||||
|
if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
|
||||||
|
$sql .= " AND f.type IN (" . Facture::TYPE_STANDARD . "," . Facture::TYPE_REPLACEMENT . "," . Facture::TYPE_CREDIT_NOTE . "," . Facture::TYPE_SITUATION . ")";
|
||||||
|
} else {
|
||||||
|
$sql .= " AND f.type IN (" . Facture::TYPE_STANDARD . "," . Facture::TYPE_REPLACEMENT . "," . Facture::TYPE_CREDIT_NOTE . "," . Facture::TYPE_DEPOSIT . "," . Facture::TYPE_SITUATION . ")";
|
||||||
|
}
|
||||||
|
|
||||||
print_fiche_titre($langs->trans("OtherInfo"), '', '');
|
dol_syslog('htdocs/accountancy/customer/index.php');
|
||||||
|
$resql = $db->query($sql);
|
||||||
|
if ($resql) {
|
||||||
|
$i = 0;
|
||||||
|
$num = $db->num_rows($resql);
|
||||||
|
|
||||||
|
while ($row = $db->fetch_row($resql)) {
|
||||||
|
print '<tr><td>' . $row[0] . '</td>';
|
||||||
|
for($i = 1; $i <= 12; $i ++) {
|
||||||
|
print '<td align="right">' . price($row[$i]) . '</td>';
|
||||||
|
}
|
||||||
|
print '<td align="right"><b>' . price($row[13]) . '</b></td>';
|
||||||
|
print '</tr>';
|
||||||
|
$i ++;
|
||||||
|
}
|
||||||
|
$db->free($resql);
|
||||||
|
} else {
|
||||||
|
print $db->lasterror(); // Show last sql error
|
||||||
|
}
|
||||||
|
print "</table>\n";
|
||||||
|
|
||||||
print "<br>\n";
|
if (! empty($conf->margin->enabled)) {
|
||||||
print '<table class="noborder" width="100%">';
|
print "<br>\n";
|
||||||
print '<tr class="liste_titre"><td width="400" align="left">' . $langs->trans("TotalVente") . '</td>';
|
print '<table class="noborder" width="100%">';
|
||||||
for($i = 1; $i <= 12; $i ++) {
|
print '<tr class="liste_titre"><td width="400">' . $langs->trans("TotalMarge") . '</td>';
|
||||||
print '<td width="60" align="right">' . $langs->trans('MonthShort' . str_pad($i, 2, '0', STR_PAD_LEFT)) . '</td>';
|
for($i = 1; $i <= 12; $i ++) {
|
||||||
|
print '<td width="60" align="right">' . $langs->trans('MonthShort' . str_pad($i, 2, '0', STR_PAD_LEFT)) . '</td>';
|
||||||
|
}
|
||||||
|
print '<td width="60" align="right"><b>' . $langs->trans("Total") . '</b></td></tr>';
|
||||||
|
|
||||||
|
$sql = "SELECT '" . $langs->trans("Vide") . "' AS marge,";
|
||||||
|
for($i = 1; $i <= 12; $i ++) {
|
||||||
|
$sql .= " SUM(" . $db->ifsql('MONTH(f.datef)=' . $i, '(fd.total_ht-(fd.qty * fd.buy_price_ht))', '0') . ") AS month" . str_pad($i, 2, '0', STR_PAD_LEFT) . ",";
|
||||||
|
}
|
||||||
|
$sql .= " SUM((fd.total_ht-(fd.qty * fd.buy_price_ht))) as total";
|
||||||
|
$sql .= " FROM " . MAIN_DB_PREFIX . "facturedet as fd";
|
||||||
|
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "facture as f ON f.rowid = fd.fk_facture";
|
||||||
|
$sql .= " WHERE f.datef >= '" . $db->idate(dol_get_first_day($y, 1, false)) . "'";
|
||||||
|
$sql .= " AND f.datef <= '" . $db->idate(dol_get_last_day($y, 12, false)) . "'";
|
||||||
|
$sql .= " AND f.entity IN (" . getEntity("facture", 0) . ")"; // We don't share object for accountancy
|
||||||
|
if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
|
||||||
|
$sql .= " AND f.type IN (" . Facture::TYPE_STANDARD . "," . Facture::TYPE_REPLACEMENT . "," . Facture::TYPE_CREDIT_NOTE . "," . Facture::TYPE_SITUATION . ")";
|
||||||
|
} else {
|
||||||
|
$sql .= " AND f.type IN (" . Facture::TYPE_STANDARD . "," . Facture::TYPE_REPLACEMENT . "," . Facture::TYPE_CREDIT_NOTE . "," . Facture::TYPE_DEPOSIT . "," . Facture::TYPE_SITUATION . ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
dol_syslog('htdocs/accountancy/customer/index.php:: $sql=' . $sql);
|
||||||
|
$resql = $db->query($sql);
|
||||||
|
if ($resql) {
|
||||||
|
$num = $db->num_rows($resql);
|
||||||
|
|
||||||
|
while ($row = $db->fetch_row($resql)) {
|
||||||
|
|
||||||
|
print '<tr><td>' . $row[0] . '</td>';
|
||||||
|
for($i = 1; $i <= 12; $i ++) {
|
||||||
|
print '<td align="right">' . price(price2num($row[$i])) . '</td>';
|
||||||
|
}
|
||||||
|
print '<td align="right"><b>' . price(price2num($row[13])) . '</b></td>';
|
||||||
|
print '</tr>';
|
||||||
|
}
|
||||||
|
$db->free($resql);
|
||||||
|
} else {
|
||||||
|
print $db->lasterror(); // Show last sql error
|
||||||
|
}
|
||||||
|
print "</table>\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
print '<td width="60" align="right"><b>' . $langs->trans("Total") . '</b></td></tr>';
|
|
||||||
|
|
||||||
$sql = "SELECT '" . $langs->trans("TotalVente") . "' AS total,";
|
|
||||||
for($i = 1; $i <= 12; $i ++) {
|
|
||||||
$sql .= " SUM(" . $db->ifsql('MONTH(f.datef)=' . $i, 'fd.total_ht', '0') . ") AS month" . str_pad($i, 2, '0', STR_PAD_LEFT) . ",";
|
|
||||||
}
|
|
||||||
$sql .= " SUM(fd.total_ht) as total";
|
|
||||||
$sql .= " FROM " . MAIN_DB_PREFIX . "facturedet as fd";
|
|
||||||
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "facture as f ON f.rowid = fd.fk_facture";
|
|
||||||
$sql .= " WHERE f.datef >= '" . $db->idate(dol_get_first_day($y, 1, false)) . "'";
|
|
||||||
$sql .= " AND f.datef <= '" . $db->idate(dol_get_last_day($y, 12, false)) . "'";
|
|
||||||
$sql .= " AND f.entity IN (" . getEntity("facture", 0) . ")"; // We don't share object for accountancy
|
|
||||||
|
|
||||||
dol_syslog('htdocs/accountancy/customer/index.php');
|
|
||||||
$resql = $db->query($sql);
|
|
||||||
if ($resql) {
|
|
||||||
$i = 0;
|
|
||||||
$num = $db->num_rows($resql);
|
|
||||||
|
|
||||||
while ($row = $db->fetch_row($resql)) {
|
|
||||||
print '<tr><td>' . $row[0] . '</td>';
|
|
||||||
for($i = 1; $i <= 12; $i ++) {
|
|
||||||
print '<td align="right">' . price($row[$i]) . '</td>';
|
|
||||||
}
|
|
||||||
print '<td align="right"><b>' . price($row[13]) . '</b></td>';
|
|
||||||
print '</tr>';
|
|
||||||
$i ++;
|
|
||||||
}
|
|
||||||
$db->free($resql);
|
|
||||||
} else {
|
|
||||||
print $db->lasterror(); // Show last sql error
|
|
||||||
}
|
|
||||||
print "</table>\n";
|
|
||||||
|
|
||||||
if (! empty($conf->margin->enabled)) {
|
|
||||||
print "<br>\n";
|
|
||||||
print '<table class="noborder" width="100%">';
|
|
||||||
print '<tr class="liste_titre"><td width="400">' . $langs->trans("TotalMarge") . '</td>';
|
|
||||||
for($i = 1; $i <= 12; $i ++) {
|
|
||||||
print '<td width="60" align="right">' . $langs->trans('MonthShort' . str_pad($i, 2, '0', STR_PAD_LEFT)) . '</td>';
|
|
||||||
}
|
|
||||||
print '<td width="60" align="right"><b>' . $langs->trans("Total") . '</b></td></tr>';
|
|
||||||
|
|
||||||
$sql = "SELECT '" . $langs->trans("Vide") . "' AS marge,";
|
|
||||||
for($i = 1; $i <= 12; $i ++) {
|
|
||||||
$sql .= " SUM(" . $db->ifsql('MONTH(f.datef)=' . $i, '(fd.total_ht-(fd.qty * fd.buy_price_ht))', '0') . ") AS month" . str_pad($i, 2, '0', STR_PAD_LEFT) . ",";
|
|
||||||
}
|
|
||||||
$sql .= " SUM((fd.total_ht-(fd.qty * fd.buy_price_ht))) as total";
|
|
||||||
$sql .= " FROM " . MAIN_DB_PREFIX . "facturedet as fd";
|
|
||||||
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "facture as f ON f.rowid = fd.fk_facture";
|
|
||||||
$sql .= " WHERE f.datef >= '" . $db->idate(dol_get_first_day($y, 1, false)) . "'";
|
|
||||||
$sql .= " AND f.datef <= '" . $db->idate(dol_get_last_day($y, 12, false)) . "'";
|
|
||||||
$sql .= " AND f.entity IN (" . getEntity("facture", 0) . ")"; // We don't share object for accountancy
|
|
||||||
|
|
||||||
dol_syslog('htdocs/accountancy/customer/index.php:: $sql=' . $sql);
|
|
||||||
$resql = $db->query($sql);
|
|
||||||
if ($resql) {
|
|
||||||
$num = $db->num_rows($resql);
|
|
||||||
|
|
||||||
while ($row = $db->fetch_row($resql)) {
|
|
||||||
|
|
||||||
print '<tr><td>' . $row[0] . '</td>';
|
|
||||||
for($i = 1; $i <= 12; $i ++) {
|
|
||||||
print '<td align="right">' . price(price2num($row[$i])) . '</td>';
|
|
||||||
}
|
|
||||||
print '<td align="right"><b>' . price(price2num($row[13])) . '</b></td>';
|
|
||||||
print '</tr>';
|
|
||||||
}
|
|
||||||
$db->free($resql);
|
|
||||||
} else {
|
|
||||||
print $db->lasterror(); // Show last sql error
|
|
||||||
}
|
|
||||||
print "</table>\n";
|
|
||||||
}
|
|
||||||
print "</table>\n";
|
|
||||||
print '</td></tr></table>';
|
|
||||||
|
|
||||||
llxFooter();
|
llxFooter();
|
||||||
$db->close();
|
$db->close();
|
||||||
|
|||||||
@ -210,6 +210,11 @@ if (strlen(trim($search_account))) {
|
|||||||
if (strlen(trim($search_vat))) {
|
if (strlen(trim($search_vat))) {
|
||||||
$sql .= natural_search("l.tva_tx",$search_vat,1);
|
$sql .= natural_search("l.tva_tx",$search_vat,1);
|
||||||
}
|
}
|
||||||
|
if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
|
||||||
|
$sql .= " AND f.type IN (" . Facture::TYPE_STANDARD . "," . Facture::TYPE_REPLACEMENT . "," . Facture::TYPE_CREDIT_NOTE . "," . Facture::TYPE_SITUATION . ")";
|
||||||
|
} else {
|
||||||
|
$sql .= " AND f.type IN (" . Facture::TYPE_STANDARD . "," . Facture::TYPE_STANDARD . "," . Facture::TYPE_CREDIT_NOTE . "," . Facture::TYPE_DEPOSIT . "," . Facture::TYPE_SITUATION . ")";
|
||||||
|
}
|
||||||
$sql .= " AND f.entity IN (" . getEntity("facture", 0) . ")"; // We don't share object for accountancy
|
$sql .= " AND f.entity IN (" . getEntity("facture", 0) . ")"; // We don't share object for accountancy
|
||||||
|
|
||||||
$sql .= $db->order($sortfield, $sortorder);
|
$sql .= $db->order($sortfield, $sortorder);
|
||||||
|
|||||||
@ -290,55 +290,55 @@ print "</table>\n";
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
print '<br>';
|
if ($conf->global->MAIN_FEATURES_LEVEL > 0) // This part of code looks strange. Why showing a report that should rely on result of this step ?
|
||||||
print '<br>';
|
{
|
||||||
|
print '<br>';
|
||||||
|
print '<br>';
|
||||||
|
|
||||||
|
print_fiche_titre($langs->trans("OtherInfo"), '', '');
|
||||||
|
|
||||||
|
print "<br>\n";
|
||||||
|
print '<table class="noborder" width="100%">';
|
||||||
|
print '<tr class="liste_titre"><td width="400" align="left">' . $langs->trans("Total") . '</td>';
|
||||||
|
for($i = 1; $i <= 12; $i ++) {
|
||||||
|
print '<td width="60" align="right">' . $langs->trans('MonthShort' . str_pad($i, 2, '0', STR_PAD_LEFT)) . '</td>';
|
||||||
|
}
|
||||||
|
print '<td width="60" align="right"><b>' . $langs->trans("Total") . '</b></td></tr>';
|
||||||
|
|
||||||
|
$sql = "SELECT '" . $langs->trans("TotalExpenseReport") . "' AS label,";
|
||||||
|
for($i = 1; $i <= 12; $i ++) {
|
||||||
|
$sql .= " SUM(" . $db->ifsql('MONTH(er.date_create)=' . $i, 'erd.total_ht', '0') . ") AS month" . str_pad($i, 2, '0', STR_PAD_LEFT) . ",";
|
||||||
|
}
|
||||||
|
$sql .= " ROUND(SUM(erd.total_ht),2) as total";
|
||||||
|
$sql .= " FROM " . MAIN_DB_PREFIX . "expensereport_det as erd";
|
||||||
|
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "expensereport as er ON er.rowid = erd.fk_expensereport";
|
||||||
|
$sql .= " WHERE er.date_debut >= '" . $db->idate(dol_get_first_day($y, 1, false)) . "'";
|
||||||
|
$sql .= " AND er.date_debut <= '" . $db->idate(dol_get_last_day($y, 12, false)) . "'";
|
||||||
|
$sql .= " AND er.fk_statut > 0 ";
|
||||||
|
$sql .= " AND er.entity IN (" . getEntity("expensereport", 0) . ")"; // We don't share object for accountancy
|
||||||
|
|
||||||
|
dol_syslog('/accountancy/expensereport/index.php:: sql=' . $sql);
|
||||||
|
$resql = $db->query($sql);
|
||||||
|
if ($resql) {
|
||||||
|
$num = $db->num_rows($resql);
|
||||||
|
|
||||||
|
while ( $row = $db->fetch_row($resql)) {
|
||||||
|
|
||||||
|
|
||||||
print_fiche_titre($langs->trans("OtherInfo"), '', '');
|
print '<tr><td>' . $row[0] . '</td>';
|
||||||
|
for($i = 1; $i <= 12; $i ++) {
|
||||||
|
print '<td align="right">' . price($row[$i]) . '</td>';
|
||||||
|
}
|
||||||
|
print '<td align="right"><b>' . price($row[13]) . '</b></td>';
|
||||||
|
print '</tr>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$db->free($resql);
|
||||||
|
} else {
|
||||||
print "<br>\n";
|
print $db->lasterror(); // Show last sql error
|
||||||
print '<table class="noborder" width="100%">';
|
}
|
||||||
print '<tr class="liste_titre"><td width="400" align="left">' . $langs->trans("Total") . '</td>';
|
print "</table>\n";
|
||||||
for($i = 1; $i <= 12; $i ++) {
|
|
||||||
print '<td width="60" align="right">' . $langs->trans('MonthShort' . str_pad($i, 2, '0', STR_PAD_LEFT)) . '</td>';
|
|
||||||
}
|
}
|
||||||
print '<td width="60" align="right"><b>' . $langs->trans("Total") . '</b></td></tr>';
|
|
||||||
|
|
||||||
$sql = "SELECT '" . $langs->trans("TotalExpenseReport") . "' AS label,";
|
|
||||||
for($i = 1; $i <= 12; $i ++) {
|
|
||||||
$sql .= " SUM(" . $db->ifsql('MONTH(er.date_create)=' . $i, 'erd.total_ht', '0') . ") AS month" . str_pad($i, 2, '0', STR_PAD_LEFT) . ",";
|
|
||||||
}
|
|
||||||
$sql .= " ROUND(SUM(erd.total_ht),2) as total";
|
|
||||||
$sql .= " FROM " . MAIN_DB_PREFIX . "expensereport_det as erd";
|
|
||||||
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "expensereport as er ON er.rowid = erd.fk_expensereport";
|
|
||||||
$sql .= " WHERE er.date_debut >= '" . $db->idate(dol_get_first_day($y, 1, false)) . "'";
|
|
||||||
$sql .= " AND er.date_debut <= '" . $db->idate(dol_get_last_day($y, 12, false)) . "'";
|
|
||||||
$sql .= " AND er.fk_statut > 0 ";
|
|
||||||
$sql .= " AND er.entity IN (" . getEntity("expensereport", 0) . ")"; // We don't share object for accountancy
|
|
||||||
|
|
||||||
dol_syslog('/accountancy/expensereport/index.php:: sql=' . $sql);
|
|
||||||
$resql = $db->query($sql);
|
|
||||||
if ($resql) {
|
|
||||||
$num = $db->num_rows($resql);
|
|
||||||
|
|
||||||
while ( $row = $db->fetch_row($resql)) {
|
|
||||||
|
|
||||||
|
|
||||||
print '<tr><td>' . $row[0] . '</td>';
|
|
||||||
for($i = 1; $i <= 12; $i ++) {
|
|
||||||
print '<td align="right">' . price($row[$i]) . '</td>';
|
|
||||||
}
|
|
||||||
print '<td align="right"><b>' . price($row[13]) . '</b></td>';
|
|
||||||
print '</tr>';
|
|
||||||
}
|
|
||||||
|
|
||||||
$db->free($resql);
|
|
||||||
} else {
|
|
||||||
print $db->lasterror(); // Show last sql error
|
|
||||||
}
|
|
||||||
print "</table>\n";
|
|
||||||
|
|
||||||
llxFooter();
|
llxFooter();
|
||||||
$db->close();
|
$db->close();
|
||||||
|
|||||||
@ -289,58 +289,56 @@ print "</table>\n";
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if ($conf->global->MAIN_FEATURES_LEVEL > 0) // This part of code looks strange. Why showing a report that should rely on result of this step ?
|
||||||
|
{
|
||||||
|
print '<br>';
|
||||||
|
print '<br>';
|
||||||
|
|
||||||
print '<br>';
|
print_fiche_titre($langs->trans("OtherInfo"), '', '');
|
||||||
print '<br>';
|
|
||||||
|
print "<br>\n";
|
||||||
|
print '<table class="noborder" width="100%">';
|
||||||
|
print '<tr class="liste_titre"><td width="400" align="left">' . $langs->trans("Total") . '</td>';
|
||||||
|
for($i = 1; $i <= 12; $i ++) {
|
||||||
|
print '<td width="60" align="right">' . $langs->trans('MonthShort' . str_pad($i, 2, '0', STR_PAD_LEFT)) . '</td>';
|
||||||
|
}
|
||||||
|
print '<td width="60" align="right"><b>' . $langs->trans("Total") . '</b></td></tr>';
|
||||||
|
|
||||||
|
$sql = "SELECT '" . $langs->trans("CAHTF") . "' AS label,";
|
||||||
|
for($i = 1; $i <= 12; $i ++) {
|
||||||
|
$sql .= " SUM(" . $db->ifsql('MONTH(ff.datef)=' . $i, 'ffd.total_ht', '0') . ") AS month" . str_pad($i, 2, '0', STR_PAD_LEFT) . ",";
|
||||||
|
}
|
||||||
|
$sql .= " ROUND(SUM(ffd.total_ht),2) as total";
|
||||||
|
$sql .= " FROM " . MAIN_DB_PREFIX . "facture_fourn_det as ffd";
|
||||||
|
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "facture_fourn as ff ON ff.rowid = ffd.fk_facture_fourn";
|
||||||
|
$sql .= " WHERE ff.datef >= '" . $db->idate(dol_get_first_day($y, 1, false)) . "'";
|
||||||
|
$sql .= " AND ff.datef <= '" . $db->idate(dol_get_last_day($y, 12, false)) . "'";
|
||||||
|
$sql .= " AND ff.fk_statut > 0 ";
|
||||||
|
$sql .= " AND ff.entity IN (" . getEntity("facture_fourn", 0) . ")"; // We don't share object for accountancy
|
||||||
|
|
||||||
|
dol_syslog('/accountancy/supplier/index.php:: sql=' . $sql);
|
||||||
|
$resql = $db->query($sql);
|
||||||
|
if ($resql) {
|
||||||
|
$num = $db->num_rows($resql);
|
||||||
|
|
||||||
|
while ( $row = $db->fetch_row($resql)) {
|
||||||
|
|
||||||
|
|
||||||
print_fiche_titre($langs->trans("OtherInfo"), '', '');
|
print '<tr><td>' . $row[0] . '</td>';
|
||||||
|
for($i = 1; $i <= 12; $i ++) {
|
||||||
|
print '<td align="right">' . price($row[$i]) . '</td>';
|
||||||
|
}
|
||||||
|
print '<td align="right"><b>' . price($row[13]) . '</b></td>';
|
||||||
|
print '</tr>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$db->free($resql);
|
||||||
|
} else {
|
||||||
|
print $db->lasterror(); // Show last sql error
|
||||||
|
}
|
||||||
print "<br>\n";
|
print "</table>\n";
|
||||||
print '<table class="noborder" width="100%">';
|
|
||||||
print '<tr class="liste_titre"><td width="400" align="left">' . $langs->trans("Total") . '</td>';
|
|
||||||
for($i = 1; $i <= 12; $i ++) {
|
|
||||||
print '<td width="60" align="right">' . $langs->trans('MonthShort' . str_pad($i, 2, '0', STR_PAD_LEFT)) . '</td>';
|
|
||||||
}
|
}
|
||||||
print '<td width="60" align="right"><b>' . $langs->trans("Total") . '</b></td></tr>';
|
|
||||||
|
|
||||||
$sql = "SELECT '" . $langs->trans("CAHTF") . "' AS label,";
|
|
||||||
for($i = 1; $i <= 12; $i ++) {
|
|
||||||
$sql .= " SUM(" . $db->ifsql('MONTH(ff.datef)=' . $i, 'ffd.total_ht', '0') . ") AS month" . str_pad($i, 2, '0', STR_PAD_LEFT) . ",";
|
|
||||||
}
|
|
||||||
$sql .= " ROUND(SUM(ffd.total_ht),2) as total";
|
|
||||||
$sql .= " FROM " . MAIN_DB_PREFIX . "facture_fourn_det as ffd";
|
|
||||||
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "facture_fourn as ff ON ff.rowid = ffd.fk_facture_fourn";
|
|
||||||
$sql .= " WHERE ff.datef >= '" . $db->idate(dol_get_first_day($y, 1, false)) . "'";
|
|
||||||
$sql .= " AND ff.datef <= '" . $db->idate(dol_get_last_day($y, 12, false)) . "'";
|
|
||||||
$sql .= " AND ff.fk_statut > 0 ";
|
|
||||||
$sql .= " AND ff.entity IN (" . getEntity("facture_fourn", 0) . ")"; // We don't share object for accountancy
|
|
||||||
|
|
||||||
dol_syslog('/accountancy/supplier/index.php:: sql=' . $sql);
|
|
||||||
$resql = $db->query($sql);
|
|
||||||
if ($resql) {
|
|
||||||
$num = $db->num_rows($resql);
|
|
||||||
|
|
||||||
while ( $row = $db->fetch_row($resql)) {
|
|
||||||
|
|
||||||
|
|
||||||
print '<tr><td>' . $row[0] . '</td>';
|
|
||||||
for($i = 1; $i <= 12; $i ++) {
|
|
||||||
print '<td align="right">' . price($row[$i]) . '</td>';
|
|
||||||
}
|
|
||||||
print '<td align="right"><b>' . price($row[13]) . '</b></td>';
|
|
||||||
print '</tr>';
|
|
||||||
}
|
|
||||||
|
|
||||||
$db->free($resql);
|
|
||||||
} else {
|
|
||||||
print $db->lasterror(); // Show last sql error
|
|
||||||
}
|
|
||||||
print "</table>\n";
|
|
||||||
|
|
||||||
llxFooter();
|
llxFooter();
|
||||||
$db->close();
|
$db->close();
|
||||||
|
|||||||
@ -91,10 +91,10 @@ if ($action == 'add' && $user->rights->adherent->configurer)
|
|||||||
$object = new AdherentType($db);
|
$object = new AdherentType($db);
|
||||||
|
|
||||||
$object->libelle = trim($label);
|
$object->libelle = trim($label);
|
||||||
$object->subscription = trim($subscription);
|
$object->subscription = (int) trim($subscription);
|
||||||
$object->note = trim($comment);
|
$object->note = trim($comment);
|
||||||
$object->mail_valid = trim($mail_valid);
|
$object->mail_valid = (boolean) trim($mail_valid);
|
||||||
$object->vote = trim($vote);
|
$object->vote = (boolean) trim($vote);
|
||||||
|
|
||||||
// Fill array 'array_options' with data from add form
|
// Fill array 'array_options' with data from add form
|
||||||
$ret = $extrafields->setOptionalsFromPost($extralabels,$object);
|
$ret = $extrafields->setOptionalsFromPost($extralabels,$object);
|
||||||
@ -129,10 +129,10 @@ if ($action == 'update' && $user->rights->adherent->configurer)
|
|||||||
$object = new AdherentType($db);
|
$object = new AdherentType($db);
|
||||||
$object->id = $rowid;
|
$object->id = $rowid;
|
||||||
$object->libelle = trim($label);
|
$object->libelle = trim($label);
|
||||||
$object->subscription = trim($subscription);
|
$object->subscription = (int) trim($subscription);
|
||||||
$object->note = trim($comment);
|
$object->note = trim($comment);
|
||||||
$object->mail_valid = trim($mail_valid);
|
$object->mail_valid = (boolean) trim($mail_valid);
|
||||||
$object->vote = trim($vote);
|
$object->vote = (boolean) trim($vote);
|
||||||
|
|
||||||
// Fill array 'array_options' with data from add form
|
// Fill array 'array_options' with data from add form
|
||||||
$ret = $extrafields->setOptionalsFromPost($extralabels,$object);
|
$ret = $extrafields->setOptionalsFromPost($extralabels,$object);
|
||||||
|
|||||||
@ -104,6 +104,11 @@ if ($action == 'setvalue' && $user->admin)
|
|||||||
* View
|
* View
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// Define $urlwithroot
|
||||||
|
$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
|
||||||
|
$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
|
||||||
|
//$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
|
||||||
|
|
||||||
$form = new Form($db);
|
$form = new Form($db);
|
||||||
|
|
||||||
llxHeader('',$langs->trans("PrintingSetup"));
|
llxHeader('',$langs->trans("PrintingSetup"));
|
||||||
@ -127,68 +132,177 @@ if ($mode == 'setup' && $user->admin)
|
|||||||
if (in_array($key[0], array_keys($supportedoauth2array))) $supported=1;
|
if (in_array($key[0], array_keys($supportedoauth2array))) $supported=1;
|
||||||
if (! $supported) continue; // show only supported
|
if (! $supported) continue; // show only supported
|
||||||
|
|
||||||
|
|
||||||
|
$OAUTH_SERVICENAME='Unknown';
|
||||||
|
if ($key[0] == 'OAUTH_GITHUB_NAME')
|
||||||
|
{
|
||||||
|
$OAUTH_SERVICENAME='GitHub';
|
||||||
|
$urltorenew=$urlwithroot.'/core/modules/oauth/github_oauthcallback.php?state=user,public_repo&backtourl='.urlencode(DOL_URL_ROOT.'/admin/oauthlogintokens.php');
|
||||||
|
$urltodelete=$urlwithroot.'/core/modules/oauth/github_oauthcallback.php?action=delete&backtourl='.urlencode(DOL_URL_ROOT.'/admin/oauthlogintokens.php');
|
||||||
|
$urltocheckperms='https://github.com/settings/applications/';
|
||||||
|
}
|
||||||
|
if ($key[0] == 'OAUTH_GOOGLE_NAME')
|
||||||
|
{
|
||||||
|
$OAUTH_SERVICENAME='Google';
|
||||||
|
$urltorenew=$urlwithroot.'/core/modules/oauth/google_oauthcallback.php?state=userinfo_email,userinfo_profile,cloud_print&backtourl='.urlencode(DOL_URL_ROOT.'/admin/oauthlogintokens.php');
|
||||||
|
$urltodelete=$urlwithroot.'/core/modules/oauth/google_oauthcallback.php?action=delete&backtourl='.urlencode(DOL_URL_ROOT.'/admin/oauthlogintokens.php');
|
||||||
|
$urltocheckperms='https://security.google.com/settings/security/permissions';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show value of token
|
||||||
|
$tokenobj=null;
|
||||||
|
// Token
|
||||||
|
require_once DOL_DOCUMENT_ROOT.'/includes/OAuth/bootstrap.php';
|
||||||
|
require_once DOL_DOCUMENT_ROOT.'/includes/OAuth/bootstrap.php';
|
||||||
|
// Dolibarr storage
|
||||||
|
$storage = new DoliStorage($db, $conf);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$tokenobj = $storage->retrieveAccessToken($OAUTH_SERVICENAME);
|
||||||
|
}
|
||||||
|
catch(Exception $e)
|
||||||
|
{
|
||||||
|
// Return an error if token not found
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set other properties
|
||||||
|
$refreshtoken=false;
|
||||||
|
$expiredat='';
|
||||||
|
|
||||||
|
$expire = false;
|
||||||
|
// Is token expired or will token expire in the next 30 seconds
|
||||||
|
if (is_object($tokenobj)) {
|
||||||
|
$expire = ($tokenobj->getEndOfLife() !== $tokenobj::EOL_NEVER_EXPIRES && $tokenobj->getEndOfLife() !== $tokenobj::EOL_UNKNOWN && time() > ($tokenobj->getEndOfLife() - 30));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($key[1] != '' && $key[2] != '') {
|
||||||
|
if (is_object($tokenobj)) {
|
||||||
|
$refreshtoken = $tokenobj->getRefreshToken();
|
||||||
|
|
||||||
|
$endoflife = $tokenobj->getEndOfLife();
|
||||||
|
if ($endoflife == $tokenobj::EOL_NEVER_EXPIRES)
|
||||||
|
{
|
||||||
|
$expiredat = $langs->trans("Never");
|
||||||
|
}
|
||||||
|
elseif ($endoflife == $tokenobj::EOL_UNKNOWN)
|
||||||
|
{
|
||||||
|
$expiredat = $langs->trans("Unknown");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$expiredat=dol_print_date($endoflife, "dayhour");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$submit_enabled=0;
|
||||||
|
|
||||||
print '<form method="post" action="'.$_SERVER["PHP_SELF"].'?mode=setup&driver='.$driver.'" autocomplete="off">';
|
print '<form method="post" action="'.$_SERVER["PHP_SELF"].'?mode=setup&driver='.$driver.'" autocomplete="off">';
|
||||||
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||||
print '<input type="hidden" name="action" value="setconst">';
|
print '<input type="hidden" name="action" value="setconst">';
|
||||||
|
|
||||||
|
|
||||||
print '<table class="noborder" width="100%">'."\n";
|
print '<table class="noborder" width="100%">'."\n";
|
||||||
$var=true;
|
|
||||||
|
$var=false;
|
||||||
print '<tr class="liste_titre">';
|
print '<tr class="liste_titre">';
|
||||||
print '<th>'.$langs->trans("Parameters").'</th>';
|
print '<th class="titlefieldcreate">'.$langs->trans($key[0]).'</th>';
|
||||||
print '<th>'.$langs->trans("Value").'</th>';
|
print '<th></th>';
|
||||||
print '<th> </th>';
|
print '<th></th>';
|
||||||
print "</tr>\n";
|
print "</tr>\n";
|
||||||
$submit_enabled=0;
|
|
||||||
|
|
||||||
print '<tr '.$bc[$var].'>';
|
print '<tr '.$bc[$var].'>';
|
||||||
print '<td'.($key['required']?' class=required':'').'>'.$langs->trans($key['varname']).'</td>';
|
print '<td'.($key['required']?' class="required"':'').'>';
|
||||||
print '<td>'.$langs->trans($key['info']).'</td>';
|
//var_dump($key);
|
||||||
|
print $langs->trans("OAuthIDSecret").'</td>';
|
||||||
print '<td>';
|
print '<td>';
|
||||||
if ($key['varname'] == 'PRINTGCP_TOKEN_ACCESS')
|
print $langs->trans("SeePreviousTab");
|
||||||
|
print '</td>';
|
||||||
|
print '<td>';
|
||||||
|
print '</td>';
|
||||||
|
print '</tr>'."\n";
|
||||||
|
|
||||||
|
$var = ! $var;
|
||||||
|
print '<tr '.$bc[$var].'>';
|
||||||
|
print '<td'.($key['required']?' class="required"':'').'>';
|
||||||
|
//var_dump($key);
|
||||||
|
print $langs->trans("IsTokenGenerated");
|
||||||
|
print '</td>';
|
||||||
|
print '<td>';
|
||||||
|
if (is_object($tokenobj)) print $langs->trans("HasAccessToken");
|
||||||
|
else print $langs->trans("NoAccessToken");
|
||||||
|
print '</td>';
|
||||||
|
print '<td>';
|
||||||
|
// Links to delete/checks token
|
||||||
|
if (is_object($tokenobj))
|
||||||
{
|
{
|
||||||
// Delete remote tokens
|
//test on $storage->hasAccessToken($OAUTH_SERVICENAME) ?
|
||||||
if (! empty($key['delete'])) print '<a class="button" href="'.$key['delete'].'">'.$langs->trans('DeleteAccess').'</a><br><br>';
|
print '<a class="button" href="'.$urltodelete.'">'.$langs->trans('DeleteAccess').'</a><br><br>';
|
||||||
// Request remote token
|
}
|
||||||
print '<a class="button" href="'.$key['renew'].'">'.$langs->trans('RequestAccess').'</a><br><br>';
|
// Request remote token
|
||||||
// Check remote access
|
print '<a class="button" href="'.$urltorenew.'">'.$langs->trans('RequestAccess').'</a><br><br>';
|
||||||
print $langs->trans("ToCheckDeleteTokenOnProvider", $OAUTH_SERVICENAME_GOOGLE).': <a href="https://security.google.com/settings/security/permissions" target="_google">https://security.google.com/settings/security/permissions</a>';
|
// Check remote access
|
||||||
|
if ($urltocheckperms)
|
||||||
|
{
|
||||||
|
print $langs->trans("ToCheckDeleteTokenOnProvider", $OAUTH_SERVICENAME).': <a href="'.$urltocheckperms.'" target="_'.strtolower($OAUTH_SERVICENAME).'">'.$urltocheckperms.'</a>';
|
||||||
|
}
|
||||||
|
print '</td>';
|
||||||
|
print '</tr>';
|
||||||
|
|
||||||
|
$var = ! $var;
|
||||||
|
print '<tr '.$bc[$var].'>';
|
||||||
|
print '<td'.($key['required']?' class="required"':'').'>';
|
||||||
|
//var_dump($key);
|
||||||
|
print $langs->trans("Token").'</td>';
|
||||||
|
print '<td colspan="2">';
|
||||||
|
if (is_object($tokenobj))
|
||||||
|
{
|
||||||
|
//var_dump($tokenobj);
|
||||||
|
print $tokenobj->getAccessToken().'<br>';
|
||||||
|
//print 'Refresh: '.$tokenobj->getRefreshToken().'<br>';
|
||||||
|
//print 'EndOfLife: '.$tokenobj->getEndOfLife().'<br>';
|
||||||
|
//var_dump($tokenobj->getExtraParams());
|
||||||
|
/*print '<br>Extra: <br><textarea class="quatrevingtpercent">';
|
||||||
|
print ''.join(',',$tokenobj->getExtraParams());
|
||||||
|
print '</textarea>';*/
|
||||||
}
|
}
|
||||||
print '</td>';
|
print '</td>';
|
||||||
print '</tr>'."\n";
|
print '</tr>'."\n";
|
||||||
|
|
||||||
// Show value of token
|
if (is_object($tokenobj))
|
||||||
if ($key['varname'] == 'PRINTGCP_TOKEN_ACCESS')
|
|
||||||
{
|
{
|
||||||
// Token
|
// Token refresh
|
||||||
|
$var = ! $var;
|
||||||
print '<tr '.$bc[$var].'>';
|
print '<tr '.$bc[$var].'>';
|
||||||
print '<td>'.$langs->trans("Token").'</td>';
|
print '<td'.($key['required']?' class="required"':'').'>';
|
||||||
print '<td>';
|
//var_dump($key);
|
||||||
// Dolibarr storage
|
print $langs->trans("TOKEN_REFRESH").'</td>';
|
||||||
$storage = new DoliStorage($db, $conf);
|
print '<td colspan="2">';
|
||||||
try
|
print yn($refreshtoken);
|
||||||
{
|
|
||||||
$tokenobj = $storage->retrieveAccessToken($OAUTH_SERVICENAME_GOOGLE);
|
|
||||||
}
|
|
||||||
catch(Exception $e)
|
|
||||||
{
|
|
||||||
// Return an error if token not found
|
|
||||||
}
|
|
||||||
if (is_object($tokenobj))
|
|
||||||
{
|
|
||||||
//var_dump($tokenobj);
|
|
||||||
print $tokenobj->getAccessToken().'<br>';
|
|
||||||
//print 'Refresh: '.$tokenobj->getRefreshToken().'<br>';
|
|
||||||
//print 'EndOfLife: '.$tokenobj->getEndOfLife().'<br>';
|
|
||||||
//var_dump($tokenobj->getExtraParams());
|
|
||||||
/*print '<br>Extra: <br><textarea class="quatrevingtpercent">';
|
|
||||||
print ''.join(',',$tokenobj->getExtraParams());
|
|
||||||
print '</textarea>';*/
|
|
||||||
}
|
|
||||||
print '</td>';
|
print '</td>';
|
||||||
print '<td>';
|
print '</tr>';
|
||||||
|
|
||||||
|
// Token expired
|
||||||
|
$var = ! $var;
|
||||||
|
print '<tr '.$bc[$var].'>';
|
||||||
|
print '<td'.($key['required']?' class="required"':'').'>';
|
||||||
|
//var_dump($key);
|
||||||
|
print $langs->trans("TOKEN_EXPIRED").'</td>';
|
||||||
|
print '<td colspan="2">';
|
||||||
|
print yn($expire);
|
||||||
print '</td>';
|
print '</td>';
|
||||||
print '</tr>'."\n";
|
print '</tr>';
|
||||||
|
|
||||||
|
// Token expired at
|
||||||
|
$var = ! $var;
|
||||||
|
print '<tr '.$bc[$var].'>';
|
||||||
|
print '<td'.($key['required']?' class="required"':'').'>';
|
||||||
|
//var_dump($key);
|
||||||
|
print $langs->trans("TOKEN_EXPIRE_AT").'</td>';
|
||||||
|
print '<td colspan="2">';
|
||||||
|
print $expiredat;
|
||||||
|
print '</td>';
|
||||||
|
print '</tr>';
|
||||||
}
|
}
|
||||||
|
|
||||||
print '</table>';
|
print '</table>';
|
||||||
@ -200,6 +314,7 @@ if ($mode == 'setup' && $user->admin)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
print '</form>';
|
print '</form>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -82,8 +82,8 @@ $xmlremote = GETPOST('xmlremote')?GETPOST('xmlremote'):'https://www.dolibarr.org
|
|||||||
|
|
||||||
// Test if remote test is ok
|
// Test if remote test is ok
|
||||||
$enableremotecheck = True;
|
$enableremotecheck = True;
|
||||||
if (preg_match('/beta|alpha/i', DOL_VERSION)) $enableremotecheck=False;
|
if (preg_match('/beta|alpha|rc/i', DOL_VERSION) || ! empty($conf->global->MAIN_ALLOW_INTEGRITY_CHECK_ON_UNSTABLE)) $enableremotecheck=False;
|
||||||
|
$enableremotecheck = true;
|
||||||
|
|
||||||
print '<form name="check" action="'.$_SERVER["PHP_SELF"].'">';
|
print '<form name="check" action="'.$_SERVER["PHP_SELF"].'">';
|
||||||
print $langs->trans("MakeIntegrityAnalysisFrom").':<br>';
|
print $langs->trans("MakeIntegrityAnalysisFrom").':<br>';
|
||||||
@ -101,7 +101,8 @@ else
|
|||||||
print '<!-- for a remote target=remote&xmlremote=... -->'."\n";
|
print '<!-- for a remote target=remote&xmlremote=... -->'."\n";
|
||||||
if ($enableremotecheck)
|
if ($enableremotecheck)
|
||||||
{
|
{
|
||||||
print '<input type="radio" name="target" value="remote"'.(GETPOST('target') == 'remote' ? 'checked="checked"':'').'> '.$langs->trans("RemoteSignature").' = '.$xmlremote.'<br>';
|
print '<input type="radio" name="target" value="remote"'.(GETPOST('target') == 'remote' ? 'checked="checked"':'').'> '.$langs->trans("RemoteSignature").' = ';
|
||||||
|
print '<input name="xmlremote" class="flat quatrevingtpercent" value="'.$xmlremote.'"><br>';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -156,19 +157,25 @@ if ($xml)
|
|||||||
$file_list = array();
|
$file_list = array();
|
||||||
$ret = getFilesUpdated($file_list, $xml->dolibarr_htdocs_dir[0], '', DOL_DOCUMENT_ROOT, $checksumconcat); // Fill array $file_list
|
$ret = getFilesUpdated($file_list, $xml->dolibarr_htdocs_dir[0], '', DOL_DOCUMENT_ROOT, $checksumconcat); // Fill array $file_list
|
||||||
|
|
||||||
|
print_fiche_titre($langs->trans("FilesMissing"));
|
||||||
|
|
||||||
print '<table class="noborder">';
|
print '<table class="noborder">';
|
||||||
print '<tr class="liste_titre">';
|
print '<tr class="liste_titre">';
|
||||||
print '<td>' . $langs->trans("FilesMissing") . '</td>';
|
print '<td>#</td>';
|
||||||
|
print '<td>' . $langs->trans("Filename") . '</td>';
|
||||||
print '<td align="center">' . $langs->trans("ExpectedChecksum") . '</td>';
|
print '<td align="center">' . $langs->trans("ExpectedChecksum") . '</td>';
|
||||||
print '</tr>'."\n";
|
print '</tr>'."\n";
|
||||||
$var = true;
|
$var = true;
|
||||||
$tmpfilelist = dol_sort_array($file_list['missing'], 'filename');
|
$tmpfilelist = dol_sort_array($file_list['missing'], 'filename');
|
||||||
if (is_array($tmpfilelist) && count($tmpfilelist))
|
if (is_array($tmpfilelist) && count($tmpfilelist))
|
||||||
{
|
{
|
||||||
|
$i = 0;
|
||||||
foreach ($tmpfilelist as $file)
|
foreach ($tmpfilelist as $file)
|
||||||
{
|
{
|
||||||
|
$i++;
|
||||||
$var = !$var;
|
$var = !$var;
|
||||||
print '<tr ' . $bc[$var] . '>';
|
print '<tr ' . $bc[$var] . '>';
|
||||||
|
print '<td>'.$i.'</td>' . "\n";
|
||||||
print '<td>'.$file['filename'].'</td>' . "\n";
|
print '<td>'.$file['filename'].'</td>' . "\n";
|
||||||
print '<td align="center">'.$file['expectedmd5'].'</td>' . "\n";
|
print '<td align="center">'.$file['expectedmd5'].'</td>' . "\n";
|
||||||
print "</tr>\n";
|
print "</tr>\n";
|
||||||
@ -176,15 +183,18 @@ if ($xml)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
print '<tr ' . $bc[false] . '><td colspan="2" class="opacitymedium">'.$langs->trans("None").'</td></tr>';
|
print '<tr ' . $bc[false] . '><td colspan="3" class="opacitymedium">'.$langs->trans("None").'</td></tr>';
|
||||||
}
|
}
|
||||||
print '</table>';
|
print '</table>';
|
||||||
|
|
||||||
print '<br>';
|
print '<br>';
|
||||||
|
|
||||||
|
print_fiche_titre($langs->trans("FilesUpdated"));
|
||||||
|
|
||||||
print '<table class="noborder">';
|
print '<table class="noborder">';
|
||||||
print '<tr class="liste_titre">';
|
print '<tr class="liste_titre">';
|
||||||
print '<td>' . $langs->trans("FilesUpdated") . '</td>';
|
print '<td>#</td>';
|
||||||
|
print '<td>' . $langs->trans("Filename") . '</td>';
|
||||||
print '<td align="center">' . $langs->trans("ExpectedChecksum") . '</td>';
|
print '<td align="center">' . $langs->trans("ExpectedChecksum") . '</td>';
|
||||||
print '<td align="center">' . $langs->trans("CurrentChecksum") . '</td>';
|
print '<td align="center">' . $langs->trans("CurrentChecksum") . '</td>';
|
||||||
print '<td align="right">' . $langs->trans("Size") . '</td>';
|
print '<td align="right">' . $langs->trans("Size") . '</td>';
|
||||||
@ -194,10 +204,13 @@ if ($xml)
|
|||||||
$tmpfilelist2 = dol_sort_array($file_list['updated'], 'filename');
|
$tmpfilelist2 = dol_sort_array($file_list['updated'], 'filename');
|
||||||
if (is_array($tmpfilelist2) && count($tmpfilelist2))
|
if (is_array($tmpfilelist2) && count($tmpfilelist2))
|
||||||
{
|
{
|
||||||
|
$i = 0;
|
||||||
foreach ($tmpfilelist2 as $file)
|
foreach ($tmpfilelist2 as $file)
|
||||||
{
|
{
|
||||||
|
$i++;
|
||||||
$var = !$var;
|
$var = !$var;
|
||||||
print '<tr ' . $bc[$var] . '>';
|
print '<tr ' . $bc[$var] . '>';
|
||||||
|
print '<td>'.$i.'</td>' . "\n";
|
||||||
print '<td>'.$file['filename'].'</td>' . "\n";
|
print '<td>'.$file['filename'].'</td>' . "\n";
|
||||||
print '<td align="center">'.$file['expectedmd5'].'</td>' . "\n";
|
print '<td align="center">'.$file['expectedmd5'].'</td>' . "\n";
|
||||||
print '<td align="center">'.$file['md5'].'</td>' . "\n";
|
print '<td align="center">'.$file['md5'].'</td>' . "\n";
|
||||||
@ -241,14 +254,12 @@ if ($xml)
|
|||||||
//var_dump($checksumconcat);
|
//var_dump($checksumconcat);
|
||||||
$checksumget = md5(join(',',$checksumconcat));
|
$checksumget = md5(join(',',$checksumconcat));
|
||||||
$checksumtoget = $xml->dolibarr_htdocs_dir_checksum;
|
$checksumtoget = $xml->dolibarr_htdocs_dir_checksum;
|
||||||
if ($checksumtoget)
|
|
||||||
{
|
|
||||||
print '<br>';
|
|
||||||
print '<strong>'.$langs->trans("GlobalChecksum").'</strong><br>';
|
|
||||||
print $langs->trans("ExpectedChecksum").' = '.$checksumtoget.'<br>';
|
|
||||||
print $langs->trans("CurrentChecksum").' = '.$checksumget;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
print '<br>';
|
||||||
|
|
||||||
|
print_fiche_titre($langs->trans("GlobalChecksum")).'<br>';
|
||||||
|
print $langs->trans("ExpectedChecksum").' = '. ($checksumtoget ? $checksumtoget : $langs->trans("Unknown")) .'<br>';
|
||||||
|
print $langs->trans("CurrentChecksum").' = '.$checksumget;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -39,7 +39,7 @@ if (GETPOST('msg','alpha')) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$urldolibarr='http://www.dolibarr.org/downloads/';
|
$urldolibarr='https://www.dolibarr.org/downloads/';
|
||||||
$urldolibarrmodules='https://www.dolistore.com/';
|
$urldolibarrmodules='https://www.dolistore.com/';
|
||||||
$urldolibarrthemes='https://www.dolistore.com/';
|
$urldolibarrthemes='https://www.dolistore.com/';
|
||||||
$dolibarrroot=preg_replace('/([\\/]+)$/i','',DOL_DOCUMENT_ROOT);
|
$dolibarrroot=preg_replace('/([\\/]+)$/i','',DOL_DOCUMENT_ROOT);
|
||||||
|
|||||||
@ -105,7 +105,7 @@ if ($action == 'add' || (GETPOST('add') && $action != 'update'))
|
|||||||
}
|
}
|
||||||
if (! $error)
|
if (! $error)
|
||||||
{
|
{
|
||||||
$sql = "INSERT INTO ".MAIN_DB_PREFIX."overwrite_trans(lang, transkey, transvalue) VALUE ('".$db->escape($langcode)."','".$db->escape($transkey)."','".$db->escape($transvalue)."')";
|
$sql = "INSERT INTO ".MAIN_DB_PREFIX."overwrite_trans(lang, transkey, transvalue) VALUES ('".$db->escape($langcode)."','".$db->escape($transkey)."','".$db->escape($transvalue)."')";
|
||||||
$result = $db->query($sql);
|
$result = $db->query($sql);
|
||||||
if ($result > 0)
|
if ($result > 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -37,7 +37,7 @@ class Facturation
|
|||||||
* int $prix => Prix HT du produit en cours
|
* int $prix => Prix HT du produit en cours
|
||||||
* int $tva => 'rowid' du taux de tva dans llx_c_tva
|
* int $tva => 'rowid' du taux de tva dans llx_c_tva
|
||||||
*/
|
*/
|
||||||
var $id;
|
public $id;
|
||||||
protected $ref;
|
protected $ref;
|
||||||
protected $qte;
|
protected $qte;
|
||||||
protected $stock;
|
protected $stock;
|
||||||
|
|||||||
@ -115,7 +115,7 @@ li.menu_choix0 {
|
|||||||
float: right;
|
float: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------- R<EFBFBD>capitulatif des articles ------------------- */
|
/* ------------------- Remind of products ------------------- */
|
||||||
.liste_articles {
|
.liste_articles {
|
||||||
min-width: 215px;
|
min-width: 215px;
|
||||||
float: right;
|
float: right;
|
||||||
@ -212,6 +212,9 @@ p.titre {
|
|||||||
max-width: 900px;
|
max-width: 900px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.blocksellfinished {
|
||||||
|
min-width: 215px;
|
||||||
|
}
|
||||||
.titre1 {
|
.titre1 {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #ff9900;
|
color: #ff9900;
|
||||||
|
|||||||
61
htdocs/cashdesk/css/ticket.css
Normal file
61
htdocs/cashdesk/css/ticket.css
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* TPV ticket.css
|
||||||
|
*/
|
||||||
|
body {
|
||||||
|
font-size: 1.5em;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entete { /* position: relative; */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.address { /* float: left; */
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.date_heure {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.infos {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.liste_articles {
|
||||||
|
width: 100%;
|
||||||
|
border-bottom: 1px solid #000;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.liste_articles tr.titres th {
|
||||||
|
border-bottom: 1px solid #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.liste_articles td.total {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.totaux {
|
||||||
|
margin-top: 20px;
|
||||||
|
width: 30%;
|
||||||
|
float: right;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lien {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
.lien {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ -106,23 +106,23 @@ $langs->load("cashdesk");
|
|||||||
<th><?php echo $langs->trans("VATRate"); ?></th>
|
<th><?php echo $langs->trans("VATRate"); ?></th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><input class="texte1" type="text" id="txtQte" name="txtQte" value="1" onkeyup="javascript: modif();" onfocus="javascript: this.select();" />
|
<td><input class="texte1 maxwidth50onsmartphone" type="text" id="txtQte" name="txtQte" value="1" onkeyup="javascript: modif();" onfocus="javascript: this.select();" />
|
||||||
<?php print genkeypad("txtQte", "frmQte");?>
|
<?php print genkeypad("txtQte", "frmQte");?>
|
||||||
</td>
|
</td>
|
||||||
<!-- Affichage du stock pour l'article courant -->
|
<!-- Affichage du stock pour l'article courant -->
|
||||||
<td>
|
<td>
|
||||||
<input class="texte1_off" type="text" name="txtStock" value="<?php echo $obj_facturation->stock() ?>" disabled />
|
<input class="texte1_off maxwidth50onsmartphone" type="text" name="txtStock" value="<?php echo $obj_facturation->stock() ?>" disabled />
|
||||||
</td>
|
</td>
|
||||||
<!-- Show unit price -->
|
<!-- Show unit price -->
|
||||||
<?php // TODO Remove the disabled and use this value when adding product into cart ?>
|
<?php // TODO Remove the disabled and use this value when adding product into cart ?>
|
||||||
<td><input class="texte1_off" type="text" name="txtPrixUnit" value="<?php echo price2num($obj_facturation->prix(), 'MU'); ?>" onchange="javascript: modif();" disabled /></td>
|
<td><input class="texte1_off maxwidth50onsmartphone" type="text" name="txtPrixUnit" value="<?php echo price2num($obj_facturation->prix(), 'MU'); ?>" onchange="javascript: modif();" disabled /></td>
|
||||||
<td></td>
|
<td></td>
|
||||||
<!-- Choix de la remise -->
|
<!-- Choix de la remise -->
|
||||||
<td><input class="texte1" type="text" id="txtRemise" name="txtRemise" value="0" onkeyup="javascript: modif();" onfocus="javascript: this.select();"/>
|
<td><input class="texte1 maxwidth50onsmartphone" type="text" id="txtRemise" name="txtRemise" value="0" onkeyup="javascript: modif();" onfocus="javascript: this.select();"/>
|
||||||
<?php print genkeypad("txtRemise", "frmQte");?>
|
<?php print genkeypad("txtRemise", "frmQte");?>
|
||||||
</td>
|
</td>
|
||||||
<!-- Affichage du total HT -->
|
<!-- Affichage du total HT -->
|
||||||
<td><input class="texte1_off" type="text" name="txtTotal" value="" disabled /></td><td></td>
|
<td><input class="texte1_off maxwidth50onsmartphone" type="text" name="txtTotal" value="" disabled /></td><td></td>
|
||||||
<!-- Choix du taux de TVA -->
|
<!-- Choix du taux de TVA -->
|
||||||
<td class="select_tva">
|
<td class="select_tva">
|
||||||
<?php //var_dump($tab_tva); ?>
|
<?php //var_dump($tab_tva); ?>
|
||||||
@ -155,17 +155,17 @@ $langs->load("cashdesk");
|
|||||||
<input type="hidden" name="hdnChoix" value="" />
|
<input type="hidden" name="hdnChoix" value="" />
|
||||||
<input type="hidden" name="token" value="<?php echo $_SESSION['newtoken']; ?>" />
|
<input type="hidden" name="token" value="<?php echo $_SESSION['newtoken']; ?>" />
|
||||||
<fieldset class="cadre_facturation"><legend class="titre1"><?php echo $langs->trans("Amount"); ?></legend>
|
<fieldset class="cadre_facturation"><legend class="titre1"><?php echo $langs->trans("Amount"); ?></legend>
|
||||||
<table>
|
<table class="centpercent">
|
||||||
<tr><th class="label1"><?php echo $langs->trans("TotalTicket"); ?></th><th class="label1"><?php echo $langs->trans("Received"); ?></th><th class="label1"><?php echo $langs->trans("Change"); ?></th></tr>
|
<tr><th class="label1"><?php echo $langs->trans("TotalTicket"); ?></th><th class="label1"><?php echo $langs->trans("Received"); ?></th><th class="label1"><?php echo $langs->trans("Change"); ?></th></tr>
|
||||||
<tr>
|
<tr>
|
||||||
<!-- Affichage du montant du -->
|
<!-- Affichage du montant du -->
|
||||||
<td><input class="texte2_off" type="text" name="txtDu" value="<?php echo price2num($obj_facturation->prixTotalTtc(), 'MT'); ?>" disabled /></td>
|
<td><input class="texte2_off maxwidthonsmartphone" type="text" name="txtDu" value="<?php echo price2num($obj_facturation->prixTotalTtc(), 'MT'); ?>" disabled /></td>
|
||||||
<!-- Choix du montant encaisse -->
|
<!-- Choix du montant encaisse -->
|
||||||
<td><input class="texte2" type="text" id="txtEncaisse" name="txtEncaisse" value="" onkeyup="javascript: verifDifference();" onfocus="javascript: this.select();" />
|
<td><input class="texte2 maxwidthonsmartphone" type="text" id="txtEncaisse" name="txtEncaisse" value="" onkeyup="javascript: verifDifference();" onfocus="javascript: this.select();" />
|
||||||
<?php print genkeypad("txtEncaisse", "frmDifference");?>
|
<?php print genkeypad("txtEncaisse", "frmDifference");?>
|
||||||
</td>
|
</td>
|
||||||
<!-- Affichage du montant rendu -->
|
<!-- Affichage du montant rendu -->
|
||||||
<td><input class="texte2_off" type="text" name="txtRendu" value="0" disabled /></td>
|
<td><input class="texte2_off maxwidthonsmartphone" type="text" name="txtRendu" value="0" disabled /></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@ -28,130 +28,84 @@ $object->fetch($facid);
|
|||||||
|
|
||||||
?>
|
?>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title><?php echo $langs->trans('PrintTicket') ?></title>
|
<title><?php echo $langs->trans('PrintTicket') ?></title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="<?php echo DOL_URL_ROOT;?>/cashdesk/css/ticket.css">
|
||||||
<style type="text/css">
|
|
||||||
body {
|
|
||||||
font-size: 1.5em;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entete { /* position: relative; */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.address { /* float: left; */
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.date_heure {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.infos {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.liste_articles {
|
|
||||||
width: 100%;
|
|
||||||
border-bottom: 1px solid #000;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.liste_articles tr.titres th {
|
|
||||||
border-bottom: 1px solid #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
.liste_articles td.total {
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.totaux {
|
|
||||||
margin-top: 20px;
|
|
||||||
width: 30%;
|
|
||||||
float: right;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lien {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media print {
|
|
||||||
.lien {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<div class="entete">
|
<div class="entete">
|
||||||
<div class="logo"><?php print '<img src="'.DOL_URL_ROOT.'/viewimage.php?modulepart=companylogo&file='.urlencode('/thumbs/'.$mysoc->logo_small).'">'; ?>
|
<div class="logo">
|
||||||
</div>
|
<?php print '<img src="'.DOL_URL_ROOT.'/viewimage.php?modulepart=companylogo&file='.urlencode('/thumbs/'.$mysoc->logo_small).'">'; ?>
|
||||||
<div class="infos">
|
</div>
|
||||||
<p class="address"><?php echo $mysoc->name; ?><br>
|
<div class="infos">
|
||||||
<?php print dol_nl2br(dol_format_address($mysoc)); ?><br>
|
<p class="address"><?php echo $mysoc->name; ?><br>
|
||||||
</p>
|
<?php print dol_nl2br(dol_format_address($mysoc)); ?><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
<p class="date_heure"><?php
|
<p class="date_heure"><?php
|
||||||
// Recuperation et affichage de la date et de l'heure
|
// Recuperation et affichage de la date et de l'heure
|
||||||
$now = dol_now();
|
$now = dol_now();
|
||||||
print dol_print_date($now,'dayhourtext').'<br>';
|
print dol_print_date($now,'dayhourtext').'<br>';
|
||||||
print $object->ref;
|
print $object->ref;
|
||||||
?></p>
|
?></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<table class="liste_articles">
|
<table class="liste_articles">
|
||||||
|
<thead>
|
||||||
<tr class="titres">
|
<tr class="titres">
|
||||||
<th><?php print $langs->trans("Code"); ?></th>
|
<th><?php print $langs->trans("Code"); ?></th>
|
||||||
<th><?php print $langs->trans("Label"); ?></th>
|
<th><?php print $langs->trans("Label"); ?></th>
|
||||||
<th><?php print $langs->trans("Qty"); ?></th>
|
<th><?php print $langs->trans("Qty"); ?></th>
|
||||||
<th><?php print $langs->trans("Discount").' (%)'; ?></th>
|
<th><?php print $langs->trans("Discount").' (%)'; ?></th>
|
||||||
<th><?php print $langs->trans("TotalHT"); ?></th>
|
<th><?php print $langs->trans("TotalHT"); ?></th>
|
||||||
</tr>
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<?php
|
||||||
|
|
||||||
<?php
|
$tab=array();
|
||||||
|
|
||||||
$tab=array();
|
|
||||||
$tab = $_SESSION['poscart'];
|
$tab = $_SESSION['poscart'];
|
||||||
|
|
||||||
$tab_size=count($tab);
|
$tab_size=count($tab);
|
||||||
for($i=0;$i < $tab_size;$i++)
|
for($i=0;$i < $tab_size;$i++)
|
||||||
{
|
{
|
||||||
$remise = $tab[$i]['remise'];
|
$remise = $tab[$i]['remise'];
|
||||||
echo ('<tr><td>'.$tab[$i]['ref'].'</td><td>'.$tab[$i]['label'].'</td><td>'.$tab[$i]['qte'].'</td><td>'.$tab[$i]['remise_percent'].'</td><td class="total">'.price(price2num($tab[$i]['total_ht'],'MT'),0,$langs,0,0,-1,$conf->currency).'</td></tr>'."\n");
|
?>
|
||||||
|
<tr>
|
||||||
|
<td><?php echo $tab[$i]['ref'];?></td>
|
||||||
|
<td><?php echo $tab[$i]['label'];?></td>
|
||||||
|
<td><?php echo $tab[$i]['qte'];?></td>
|
||||||
|
<td><?php echo $tab[$i]['remise_percent'];?></td>
|
||||||
|
<td class="total"><?php echo price(price2num($tab[$i]['total_ht'],'MT'),0,$langs,0,0,-1,$conf->currency);?></td>
|
||||||
|
</tr>
|
||||||
|
<?php
|
||||||
}
|
}
|
||||||
|
?>
|
||||||
?>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<table class="totaux">
|
<table class="totaux">
|
||||||
<?php
|
<tr>
|
||||||
echo '<tr><th class="nowrap">'.$langs->trans("TotalHT").'</th><td class="nowrap">'.price(price2num($obj_facturation->prixTotalHt(),'MT'),'',$langs,0,-1,-1,$conf->currency)."</td></tr>\n";
|
<th class="nowrap"><?php echo $langs->trans("TotalHT");?></th>
|
||||||
echo '<tr><th class="nowrap">'.$langs->trans("TotalVAT").'</th><td class="nowrap">'.price(price2num($obj_facturation->montantTva(),'MT'),'',$langs,0,-1,-1,$conf->currency)."</td></tr>\n";
|
<td class="nowrap"><?php echo price(price2num($obj_facturation->prixTotalHt(),'MT'),'',$langs,0,-1,-1,$conf->currency)."\n";?></td>
|
||||||
echo '<tr><th class="nowrap">'.$langs->trans("TotalTTC").'</th><td class="nowrap">'.price(price2num($obj_facturation->prixTotalTtc(),'MT'),'',$langs,0,-1,-1,$conf->currency)."</td></tr>\n";
|
</tr>
|
||||||
?>
|
<tr>
|
||||||
|
<th class="nowrap"><?php echo $langs->trans("TotalVAT").'</th><td class="nowrap">'.price(price2num($obj_facturation->montantTva(),'MT'),'',$langs,0,-1,-1,$conf->currency)."\n";?></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th class="nowrap"><?php echo ''.$langs->trans("TotalTTC").'</th><td class="nowrap">'.price(price2num($obj_facturation->prixTotalTtc(),'MT'),'',$langs,0,-1,-1,$conf->currency)."\n";?></td>
|
||||||
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
window.print();
|
window.print();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<a class="lien" href="#"
|
<a class="lien" href="#" onclick="javascript: window.close(); return(false);"><?php echo $langs->trans("Close"); ?></a>
|
||||||
onclick="javascript: window.close(); return(false);"><?php echo $langs->trans("Close"); ?></a>
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@ -22,9 +22,10 @@ $langs->load("bills");
|
|||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<h3 class="titre1"><?php echo $langs->trans("SellFinished"); ?></h3><br>
|
<div class="blocksellfinished">
|
||||||
|
|
||||||
<div class="cadre_facturation">
|
<div class="cadre_facturation">
|
||||||
|
<h3 class="titre1"><?php echo $langs->trans("SellFinished"); ?></h3><br>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
@ -45,3 +46,6 @@ $langs->load("bills");
|
|||||||
<p><a class="lien1" href="#" onclick="Javascript: popupTicket(); return(false);"><?php echo $langs->trans("PrintTicket"); ?></a></p>
|
<p><a class="lien1" href="#" onclick="Javascript: popupTicket(); return(false);"><?php echo $langs->trans("PrintTicket"); ?></a></p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
|||||||
@ -656,7 +656,7 @@ foreach ($typeofevents as $typeofevent)
|
|||||||
if ($todayarray['mday']==$tmpday && $todayarray['mon']==$tmpmonth && $todayarray['year']==$tmpyear) $today=1;
|
if ($todayarray['mday']==$tmpday && $todayarray['mon']==$tmpmonth && $todayarray['year']==$tmpyear) $today=1;
|
||||||
if ($today) $style='cal_today_peruser';
|
if ($today) $style='cal_today_peruser';
|
||||||
|
|
||||||
show_day_events2($username, $tmpday, $tmpmonth, $tmpyear, $monthshown, $style, $eventarray, 0, $maxnbofchar, $newparam, 1, 300, $showheader, $colorsbytype, $var);
|
show_day_events_pertype($username, $tmpday, $tmpmonth, $tmpyear, $monthshown, $style, $eventarray, 0, $maxnbofchar, $newparam, 1, 300, $showheader, $colorsbytype, $var);
|
||||||
|
|
||||||
$i++;
|
$i++;
|
||||||
}
|
}
|
||||||
@ -756,7 +756,7 @@ $db->close();
|
|||||||
* @param bool $var true or false for alternat style on tr/td
|
* @param bool $var true or false for alternat style on tr/td
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
function show_day_events2($username, $day, $month, $year, $monthshown, $style, &$eventarray, $maxprint=0, $maxnbofchar=16, $newparam='', $showinfo=0, $minheight=60, $showheader=false, $colorsbytype=array(), $var=false)
|
function show_day_events_pertype($username, $day, $month, $year, $monthshown, $style, &$eventarray, $maxprint=0, $maxnbofchar=16, $newparam='', $showinfo=0, $minheight=60, $showheader=false, $colorsbytype=array(), $var=false)
|
||||||
{
|
{
|
||||||
global $db;
|
global $db;
|
||||||
global $user, $conf, $langs, $hookmanager, $action;
|
global $user, $conf, $langs, $hookmanager, $action;
|
||||||
|
|||||||
@ -2045,7 +2045,7 @@ if ($action == 'create')
|
|||||||
$form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'multicurrency_tx', $object->multicurrency_code);
|
$form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'multicurrency_tx', $object->multicurrency_code);
|
||||||
} else {
|
} else {
|
||||||
$form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'none', $object->multicurrency_code);
|
$form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'none', $object->multicurrency_code);
|
||||||
if($object->statut == 0) {
|
if ($object->statut == $object::STATUS_DRAFT && $object->multicurrency_code != $conf->currency) {
|
||||||
print '<div class="inline-block"> ';
|
print '<div class="inline-block"> ';
|
||||||
print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=actualizemulticurrencyrate">'.$langs->trans("ActualizeCurrency").'</a>';
|
print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=actualizemulticurrencyrate">'.$langs->trans("ActualizeCurrency").'</a>';
|
||||||
print '</div>';
|
print '</div>';
|
||||||
|
|||||||
@ -227,7 +227,7 @@ if (empty($reshook))
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Categorisation dans projet
|
// Link to a project
|
||||||
else if ($action == 'classin' && $user->rights->commande->creer)
|
else if ($action == 'classin' && $user->rights->commande->creer)
|
||||||
{
|
{
|
||||||
$object->setProject(GETPOST('projectid'));
|
$object->setProject(GETPOST('projectid'));
|
||||||
@ -2238,7 +2238,7 @@ if ($action == 'create' && $user->rights->commande->creer)
|
|||||||
$form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'multicurrency_tx', $object->multicurrency_code);
|
$form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'multicurrency_tx', $object->multicurrency_code);
|
||||||
} else {
|
} else {
|
||||||
$form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'none', $object->multicurrency_code);
|
$form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'none', $object->multicurrency_code);
|
||||||
if($object->statut == 0) {
|
if($object->statut == $object::STATUS_DRAFT && $object->multicurrency_code != $conf->currency) {
|
||||||
print '<div class="inline-block"> ';
|
print '<div class="inline-block"> ';
|
||||||
print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=actualizemulticurrencyrate">'.$langs->trans("ActualizeCurrency").'</a>';
|
print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=actualizemulticurrencyrate">'.$langs->trans("ActualizeCurrency").'</a>';
|
||||||
print '</div>';
|
print '</div>';
|
||||||
|
|||||||
@ -194,7 +194,7 @@ class CommandeApi extends DolibarrApi
|
|||||||
* @return array Array of order objects
|
* @return array Array of order objects
|
||||||
*/
|
*/
|
||||||
function getListForSoc($socid = 0) {
|
function getListForSoc($socid = 0) {
|
||||||
return getList(0,"s.rowid","ASC",0,0,$socid);
|
return $this->getList(0,"s.rowid","ASC",0,0,$socid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1062,6 +1062,7 @@ if ($resql)
|
|||||||
$text_warning='';
|
$text_warning='';
|
||||||
$nbprod=0;
|
$nbprod=0;
|
||||||
|
|
||||||
|
// Ref
|
||||||
if (! empty($arrayfields['c.ref']['checked']))
|
if (! empty($arrayfields['c.ref']['checked']))
|
||||||
{
|
{
|
||||||
print '<td class="nowrap">';
|
print '<td class="nowrap">';
|
||||||
@ -1186,12 +1187,12 @@ if ($resql)
|
|||||||
print '</td>';
|
print '</td>';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Warning late icon
|
// Warning late icon and note
|
||||||
print '<td class="nobordernopadding nowrap">';
|
print '<td class="nobordernopadding nowrap">';
|
||||||
if ($generic_commande->hasDelay()) {
|
if ($generic_commande->hasDelay()) {
|
||||||
print img_picto($langs->trans("Late").' : '.$generic_commande->showDelay(), "warning");
|
print img_picto($langs->trans("Late").' : '.$generic_commande->showDelay(), "warning");
|
||||||
}
|
}
|
||||||
if(!empty($obj->note_private))
|
if (!empty($obj->note_private) || !empty($obj->note_public))
|
||||||
{
|
{
|
||||||
print ' <span class="note">';
|
print ' <span class="note">';
|
||||||
print '<a href="'.DOL_URL_ROOT.'/commande/note.php?id='.$obj->rowid.'">'.img_picto($langs->trans("ViewPrivateNote"),'object_generic').'</a>';
|
print '<a href="'.DOL_URL_ROOT.'/commande/note.php?id='.$obj->rowid.'">'.img_picto($langs->trans("ViewPrivateNote"),'object_generic').'</a>';
|
||||||
|
|||||||
@ -54,6 +54,7 @@ $langs->load("loan");
|
|||||||
$langs->load("donations");
|
$langs->load("donations");
|
||||||
$langs->load("trips");
|
$langs->load("trips");
|
||||||
$langs->load("members");
|
$langs->load("members");
|
||||||
|
$langs->load("compta");
|
||||||
|
|
||||||
$id = GETPOST('id','int');
|
$id = GETPOST('id','int');
|
||||||
$ref = GETPOST('ref','alpha');
|
$ref = GETPOST('ref','alpha');
|
||||||
|
|||||||
@ -449,7 +449,7 @@ foreach ($accounts as $key=>$type)
|
|||||||
// Ref
|
// Ref
|
||||||
if (! empty($arrayfields['b.ref']['checked']))
|
if (! empty($arrayfields['b.ref']['checked']))
|
||||||
{
|
{
|
||||||
print '<td class="titlefield">'.$acc->getNomUrl(1).'</td>';
|
print '<td>'.$acc->getNomUrl(1).'</td>';
|
||||||
if (! $i) $totalarray['nbfield']++;
|
if (! $i) $totalarray['nbfield']++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1350,8 +1350,16 @@ if (empty($reshook))
|
|||||||
setEventMessages($langs->trans('ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv('UnitPriceHT'), $langs->transnoentitiesnoconv('Qty')), null, 'errors');
|
setEventMessages($langs->trans('ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv('UnitPriceHT'), $langs->transnoentitiesnoconv('Qty')), null, 'errors');
|
||||||
$error ++;
|
$error ++;
|
||||||
}
|
}
|
||||||
|
if (!$prod_entry_mode)
|
||||||
|
{
|
||||||
|
if (GETPOST('type') < 0 && ! GETPOST('search_idprod'))
|
||||||
|
{
|
||||||
|
setEventMessages($langs->trans('ErrorChooseBetweenFreeAntryOrPredefinedProduct'), null, 'errors');
|
||||||
|
$error ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
if ($prod_entry_mode == 'free' && empty($idprod) && GETPOST('type') < 0) {
|
if ($prod_entry_mode == 'free' && empty($idprod) && GETPOST('type') < 0) {
|
||||||
setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Type')), null, 'errors');
|
setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Type')), null, 'errors');
|
||||||
$error ++;
|
$error ++;
|
||||||
}
|
}
|
||||||
if ($prod_entry_mode == 'free' && empty($idprod) && (! ($price_ht >= 0) || $price_ht == '') && $price_ht_devise == '') // Unit price can be 0 but not ''
|
if ($prod_entry_mode == 'free' && empty($idprod) && (! ($price_ht >= 0) || $price_ht == '') && $price_ht_devise == '') // Unit price can be 0 but not ''
|
||||||
@ -3278,7 +3286,7 @@ else if ($id > 0 || ! empty($ref))
|
|||||||
$form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'multicurrency_tx', $object->multicurrency_code);
|
$form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'multicurrency_tx', $object->multicurrency_code);
|
||||||
} else {
|
} else {
|
||||||
$form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'none', $object->multicurrency_code);
|
$form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'none', $object->multicurrency_code);
|
||||||
if($object->statut == 0) {
|
if($object->statut == $object::STATUS_DRAFT && $object->multicurrency_code != $conf->currency) {
|
||||||
print '<div class="inline-block"> ';
|
print '<div class="inline-block"> ';
|
||||||
print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=actualizemulticurrencyrate">'.$langs->trans("ActualizeCurrency").'</a>';
|
print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=actualizemulticurrencyrate">'.$langs->trans("ActualizeCurrency").'</a>';
|
||||||
print '</div>';
|
print '</div>';
|
||||||
|
|||||||
@ -39,10 +39,6 @@ class Cpaiement
|
|||||||
*/
|
*/
|
||||||
public $table_element = 'c_paiement';
|
public $table_element = 'c_paiement';
|
||||||
|
|
||||||
/**
|
|
||||||
* @var CpaiementLine[] Lines
|
|
||||||
*/
|
|
||||||
public $lines = array();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
@ -227,84 +223,6 @@ class Cpaiement
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Load object in memory from the database
|
|
||||||
*
|
|
||||||
* @param string $sortorder Sort Order
|
|
||||||
* @param string $sortfield Sort field
|
|
||||||
* @param int $limit offset limit
|
|
||||||
* @param int $offset offset limit
|
|
||||||
* @param array $filter filter array
|
|
||||||
* @param string $filtermode filter mode (AND or OR)
|
|
||||||
*
|
|
||||||
* @return int <0 if KO, >0 if OK
|
|
||||||
*/
|
|
||||||
public function fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, array $filter = array(), $filtermode='AND')
|
|
||||||
{
|
|
||||||
dol_syslog(__METHOD__, LOG_DEBUG);
|
|
||||||
|
|
||||||
$sql = 'SELECT';
|
|
||||||
$sql .= ' t.id,';
|
|
||||||
$sql .= " t.code,";
|
|
||||||
$sql .= " t.libelle,";
|
|
||||||
$sql .= " t.type,";
|
|
||||||
$sql .= " t.active,";
|
|
||||||
$sql .= " t.accountancy_code,";
|
|
||||||
$sql .= " t.module";
|
|
||||||
|
|
||||||
|
|
||||||
$sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element. ' as t';
|
|
||||||
|
|
||||||
// Manage filter
|
|
||||||
$sqlwhere = array();
|
|
||||||
if (count($filter) > 0) {
|
|
||||||
foreach ($filter as $key => $value) {
|
|
||||||
$sqlwhere [] = $key . ' LIKE \'%' . $this->db->escape($value) . '%\'';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (count($sqlwhere) > 0) {
|
|
||||||
$sql .= ' WHERE ' . implode(' '.$filtermode.' ', $sqlwhere);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($sortfield)) {
|
|
||||||
$sql .= $this->db->order($sortfield,$sortorder);
|
|
||||||
}
|
|
||||||
if (!empty($limit)) {
|
|
||||||
$sql .= ' ' . $this->db->plimit($limit + 1, $offset);
|
|
||||||
}
|
|
||||||
$this->lines = array();
|
|
||||||
|
|
||||||
$resql = $this->db->query($sql);
|
|
||||||
if ($resql) {
|
|
||||||
$num = $this->db->num_rows($resql);
|
|
||||||
|
|
||||||
while ($obj = $this->db->fetch_object($resql)) {
|
|
||||||
$line = new CpaiementLine();
|
|
||||||
|
|
||||||
$line->id = $obj->id;
|
|
||||||
|
|
||||||
$line->code = $obj->code;
|
|
||||||
$line->libelle = $obj->libelle;
|
|
||||||
$line->type = $obj->type;
|
|
||||||
$line->active = $obj->active;
|
|
||||||
$line->accountancy_code = $obj->accountancy_code;
|
|
||||||
$line->module = $obj->module;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$this->lines[$line->id] = $line;
|
|
||||||
}
|
|
||||||
$this->db->free($resql);
|
|
||||||
|
|
||||||
return $num;
|
|
||||||
} else {
|
|
||||||
$this->errors[] = 'Error ' . $this->db->lasterror();
|
|
||||||
dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR);
|
|
||||||
|
|
||||||
return - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update object into database
|
* Update object into database
|
||||||
*
|
*
|
||||||
|
|||||||
@ -30,14 +30,14 @@ require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php';
|
|||||||
$langs->load("companies");
|
$langs->load("companies");
|
||||||
if (! empty($conf->facture->enabled)) $langs->load("bills");
|
if (! empty($conf->facture->enabled)) $langs->load("bills");
|
||||||
|
|
||||||
// Security check
|
$id = GETPOST('id')?GETPOST('id','int'):GETPOST('socid','int');
|
||||||
$socid = GETPOST("socid",'int');
|
|
||||||
if ($user->societe_id > 0)
|
|
||||||
{
|
|
||||||
$action = '';
|
|
||||||
$socid = $user->societe_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// Security check
|
||||||
|
if ($user->societe_id) $id=$user->societe_id;
|
||||||
|
$result = restrictedArea($user, 'societe', $id, '&societe');
|
||||||
|
|
||||||
|
$object = new Societe($db);
|
||||||
|
if ($id > 0) $object->fetch($id);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -47,20 +47,21 @@ if ($user->societe_id > 0)
|
|||||||
$form = new Form($db);
|
$form = new Form($db);
|
||||||
$userstatic=new User($db);
|
$userstatic=new User($db);
|
||||||
|
|
||||||
llxHeader();
|
$title=$langs->trans("ThirdParty").' - '.$langs->trans("Summary");
|
||||||
|
if (! empty($conf->global->MAIN_HTML_TITLE) && preg_match('/thirdpartynameonly/',$conf->global->MAIN_HTML_TITLE) && $object->name) $title=$object->name.' - '.$langs->trans("Symmary");
|
||||||
|
$help_url='EN:Module_Third_Parties|FR:Module_Tiers|ES:Empresas';
|
||||||
|
|
||||||
if ($socid > 0)
|
llxHeader('',$title,$help_url);
|
||||||
|
|
||||||
|
if ($id > 0)
|
||||||
{
|
{
|
||||||
$societe = new Societe($db);
|
|
||||||
$societe->fetch($socid);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Affichage onglets
|
* Affichage onglets
|
||||||
*/
|
*/
|
||||||
$head = societe_prepare_head($societe);
|
$head = societe_prepare_head($object);
|
||||||
|
|
||||||
dol_fiche_head($head, 'customer', $langs->trans("ThirdParty"), 0, 'company');
|
dol_fiche_head($head, 'customer', $langs->trans("ThirdParty"), 0, 'company');
|
||||||
dol_banner_tab($societe, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom');
|
dol_banner_tab($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom', '', '', 0, '', '', 1);
|
||||||
dol_fiche_end();
|
dol_fiche_end();
|
||||||
|
|
||||||
if (! empty($conf->facture->enabled) && $user->rights->facture->lire)
|
if (! empty($conf->facture->enabled) && $user->rights->facture->lire)
|
||||||
@ -86,7 +87,7 @@ if ($socid > 0)
|
|||||||
$sql.= " f.paye as paye, f.fk_statut as statut, f.rowid as facid,";
|
$sql.= " f.paye as paye, f.fk_statut as statut, f.rowid as facid,";
|
||||||
$sql.= " u.login, u.rowid as userid";
|
$sql.= " u.login, u.rowid as userid";
|
||||||
$sql.= " FROM ".MAIN_DB_PREFIX."societe as s,".MAIN_DB_PREFIX."facture as f,".MAIN_DB_PREFIX."user as u";
|
$sql.= " FROM ".MAIN_DB_PREFIX."societe as s,".MAIN_DB_PREFIX."facture as f,".MAIN_DB_PREFIX."user as u";
|
||||||
$sql.= " WHERE f.fk_soc = s.rowid AND s.rowid = ".$societe->id;
|
$sql.= " WHERE f.fk_soc = s.rowid AND s.rowid = ".$object->id;
|
||||||
$sql.= " AND f.entity = ".$conf->entity;
|
$sql.= " AND f.entity = ".$conf->entity;
|
||||||
$sql.= " AND f.fk_user_valid = u.rowid";
|
$sql.= " AND f.fk_user_valid = u.rowid";
|
||||||
$sql.= " ORDER BY f.datef ASC";
|
$sql.= " ORDER BY f.datef ASC";
|
||||||
|
|||||||
@ -646,7 +646,7 @@ print '<tr class="liste_titre"><td class="liste_titre"> </td>';
|
|||||||
|
|
||||||
for ($annee = $year_start ; $annee <= $year_end ; $annee++)
|
for ($annee = $year_start ; $annee <= $year_end ; $annee++)
|
||||||
{
|
{
|
||||||
print '<td align="center" colspan="2" class="borderrightlight">';
|
print '<td align="center" colspan="2" class="liste_titre borderrightlight">';
|
||||||
print '<a href="clientfourn.php?year='.$annee.'">';
|
print '<a href="clientfourn.php?year='.$annee.'">';
|
||||||
print $annee;
|
print $annee;
|
||||||
if ($conf->global->SOCIETE_FISCAL_MONTH_START > 1) print '-'.($annee+1);
|
if ($conf->global->SOCIETE_FISCAL_MONTH_START > 1) print '-'.($annee+1);
|
||||||
@ -656,8 +656,8 @@ print '</tr>';
|
|||||||
print '<tr class="liste_titre"><td class="liste_titre">'.$langs->trans("Month").'</td>';
|
print '<tr class="liste_titre"><td class="liste_titre">'.$langs->trans("Month").'</td>';
|
||||||
for ($annee = $year_start ; $annee <= $year_end ; $annee++)
|
for ($annee = $year_start ; $annee <= $year_end ; $annee++)
|
||||||
{
|
{
|
||||||
print '<td align="center">'.$langs->trans("Outcome").'</td>';
|
print '<td class="liste_titre" align="center">'.$langs->trans("Outcome").'</td>';
|
||||||
print '<td align="center" class="borderrightlight">'.$langs->trans("Income").'</td>';
|
print '<td class="liste_titre" align="center" class="borderrightlight">'.$langs->trans("Income").'</td>';
|
||||||
}
|
}
|
||||||
print '</tr>';
|
print '</tr>';
|
||||||
|
|
||||||
@ -678,7 +678,7 @@ for ($mois = 1+$nb_mois_decalage ; $mois <= 12+$nb_mois_decalage ; $mois++)
|
|||||||
if($mois>12) {$annee_decalage=$annee+1;}
|
if($mois>12) {$annee_decalage=$annee+1;}
|
||||||
$case = strftime("%Y-%m",dol_mktime(12,0,0,$mois_modulo,1,$annee_decalage));
|
$case = strftime("%Y-%m",dol_mktime(12,0,0,$mois_modulo,1,$annee_decalage));
|
||||||
|
|
||||||
print '<td align="right"> ';
|
print '<td class="liste_titre" align="right"> ';
|
||||||
if (isset($decaiss_ttc[$case]) && $decaiss_ttc[$case] != 0)
|
if (isset($decaiss_ttc[$case]) && $decaiss_ttc[$case] != 0)
|
||||||
{
|
{
|
||||||
print '<a href="clientfourn.php?year='.$annee_decalage.'&month='.$mois_modulo.($modecompta?'&modecompta='.$modecompta:'').'">'.price(price2num($decaiss_ttc[$case],'MT')).'</a>';
|
print '<a href="clientfourn.php?year='.$annee_decalage.'&month='.$mois_modulo.($modecompta?'&modecompta='.$modecompta:'').'">'.price(price2num($decaiss_ttc[$case],'MT')).'</a>';
|
||||||
@ -687,7 +687,7 @@ for ($mois = 1+$nb_mois_decalage ; $mois <= 12+$nb_mois_decalage ; $mois++)
|
|||||||
}
|
}
|
||||||
print "</td>";
|
print "</td>";
|
||||||
|
|
||||||
print '<td align="right" class="borderrightlight"> ';
|
print '<td align="right" class="liste_titre borderrightlight"> ';
|
||||||
//if (isset($encaiss_ttc[$case]) && $encaiss_ttc[$case] != 0)
|
//if (isset($encaiss_ttc[$case]) && $encaiss_ttc[$case] != 0)
|
||||||
if (isset($encaiss_ttc[$case]))
|
if (isset($encaiss_ttc[$case]))
|
||||||
{
|
{
|
||||||
@ -704,7 +704,7 @@ for ($mois = 1+$nb_mois_decalage ; $mois <= 12+$nb_mois_decalage ; $mois++)
|
|||||||
// Total
|
// Total
|
||||||
$var=!$var;
|
$var=!$var;
|
||||||
$nbcols=0;
|
$nbcols=0;
|
||||||
print '<tr class="liste_total"><td>'.$langs->trans("TotalTTC").'</td>';
|
print '<tr class="liste_total impair"><td>'.$langs->trans("TotalTTC").'</td>';
|
||||||
for ($annee = $year_start ; $annee <= $year_end ; $annee++)
|
for ($annee = $year_start ; $annee <= $year_end ; $annee++)
|
||||||
{
|
{
|
||||||
$nbcols+=2;
|
$nbcols+=2;
|
||||||
@ -714,7 +714,7 @@ for ($annee = $year_start ; $annee <= $year_end ; $annee++)
|
|||||||
print "</tr>\n";
|
print "</tr>\n";
|
||||||
|
|
||||||
// Empty line
|
// Empty line
|
||||||
print '<tr><td> </td>';
|
print '<tr class="impair"><td> </td>';
|
||||||
print '<td colspan="'.$nbcols.'"> </td>';
|
print '<td colspan="'.$nbcols.'"> </td>';
|
||||||
print "</tr>\n";
|
print "</tr>\n";
|
||||||
|
|
||||||
|
|||||||
@ -43,11 +43,6 @@ class Cchargesociales
|
|||||||
*/
|
*/
|
||||||
public $table_element = 'c_chargesociales';
|
public $table_element = 'c_chargesociales';
|
||||||
|
|
||||||
/**
|
|
||||||
* @var CchargesocialesLine[] Lines
|
|
||||||
*/
|
|
||||||
public $lines = array();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -237,83 +232,6 @@ class Cchargesociales
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Load object in memory from the database
|
|
||||||
*
|
|
||||||
* @param string $sortorder Sort Order
|
|
||||||
* @param string $sortfield Sort field
|
|
||||||
* @param int $limit offset limit
|
|
||||||
* @param int $offset offset limit
|
|
||||||
* @param array $filter filter array
|
|
||||||
* @param string $filtermode filter mode (AND or OR)
|
|
||||||
*
|
|
||||||
* @return int <0 if KO, >0 if OK
|
|
||||||
*/
|
|
||||||
public function fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, array $filter = array(), $filtermode='AND')
|
|
||||||
{
|
|
||||||
dol_syslog(__METHOD__, LOG_DEBUG);
|
|
||||||
|
|
||||||
$sql = 'SELECT';
|
|
||||||
$sql .= " t.id,";
|
|
||||||
$sql .= " t.libelle,";
|
|
||||||
$sql .= " t.deductible,";
|
|
||||||
$sql .= " t.active,";
|
|
||||||
$sql .= " t.code,";
|
|
||||||
$sql .= " t.fk_pays,";
|
|
||||||
$sql .= " t.module,";
|
|
||||||
$sql .= " t.accountancy_code";
|
|
||||||
|
|
||||||
|
|
||||||
$sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element. ' as t';
|
|
||||||
|
|
||||||
// Manage filter
|
|
||||||
$sqlwhere = array();
|
|
||||||
if (count($filter) > 0) {
|
|
||||||
foreach ($filter as $key => $value) {
|
|
||||||
$sqlwhere [] = $key . ' LIKE \'%' . $this->db->escape($value) . '%\'';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (count($sqlwhere) > 0) {
|
|
||||||
$sql .= ' WHERE ' . implode(' '.$filtermode.' ', $sqlwhere);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($sortfield)) {
|
|
||||||
$sql .= $this->db->order($sortfield,$sortorder);
|
|
||||||
}
|
|
||||||
if (!empty($limit)) {
|
|
||||||
$sql .= ' ' . $this->db->plimit($limit + 1, $offset);
|
|
||||||
}
|
|
||||||
$this->lines = array();
|
|
||||||
|
|
||||||
$resql = $this->db->query($sql);
|
|
||||||
if ($resql) {
|
|
||||||
$num = $this->db->num_rows($resql);
|
|
||||||
|
|
||||||
while ($obj = $this->db->fetch_object($resql)) {
|
|
||||||
$line = new CchargesocialesLine();
|
|
||||||
|
|
||||||
$line->id = $obj->id;
|
|
||||||
$line->libelle = $obj->libelle;
|
|
||||||
$line->deductible = $obj->deductible;
|
|
||||||
$line->active = $obj->active;
|
|
||||||
$line->code = $obj->code;
|
|
||||||
$line->fk_pays = $obj->fk_pays;
|
|
||||||
$line->module = $obj->module;
|
|
||||||
$line->accountancy_code = $obj->accountancy_code;
|
|
||||||
|
|
||||||
$this->lines[$line->id] = $line;
|
|
||||||
}
|
|
||||||
$this->db->free($resql);
|
|
||||||
|
|
||||||
return $num;
|
|
||||||
} else {
|
|
||||||
$this->errors[] = 'Error ' . $this->db->lasterror();
|
|
||||||
dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR);
|
|
||||||
|
|
||||||
return - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update object into database
|
* Update object into database
|
||||||
*
|
*
|
||||||
|
|||||||
@ -456,10 +456,10 @@ print '<td class="liste_titre" align="left">';
|
|||||||
print $form->select_country($search_country, 'search_country');
|
print $form->select_country($search_country, 'search_country');
|
||||||
//print '<input class="flat" size="6" type="text" name="search_country" value="'.$search_country.'">';
|
//print '<input class="flat" size="6" type="text" name="search_country" value="'.$search_country.'">';
|
||||||
print '</td>';
|
print '</td>';
|
||||||
print '<td> </td>';
|
print '<td class="liste_titre"> </td>';
|
||||||
print '<td> </td>';
|
print '<td class="liste_titre"> </td>';
|
||||||
print '<td> </td>';
|
print '<td class="liste_titre"> </td>';
|
||||||
print '<td> </td>';
|
print '<td class="liste_titre"> </td>';
|
||||||
print '</tr>';
|
print '</tr>';
|
||||||
|
|
||||||
$var=true;
|
$var=true;
|
||||||
|
|||||||
@ -197,13 +197,13 @@ for ($annee = $year_start ; $annee <= $year_end ; $annee++)
|
|||||||
}
|
}
|
||||||
print '</tr>';
|
print '</tr>';
|
||||||
|
|
||||||
print '<tr class="liste_titre"><td>'.$langs->trans("Month").'</td>';
|
print '<tr class="liste_titre"><td class="liste_titre">'.$langs->trans("Month").'</td>';
|
||||||
for ($annee = $year_start ; $annee <= $year_end ; $annee++)
|
for ($annee = $year_start ; $annee <= $year_end ; $annee++)
|
||||||
{
|
{
|
||||||
if ($modecompta == 'CREANCES-DETTES') print '<td align="right">'.$langs->trans("AmountHT").'</td>';
|
if ($modecompta == 'CREANCES-DETTES') print '<td class="liste_titre" align="right">'.$langs->trans("AmountHT").'</td>';
|
||||||
print '<td align="right">'.$langs->trans("AmountTTC").'</td>';
|
print '<td class="liste_titre" align="right">'.$langs->trans("AmountTTC").'</td>';
|
||||||
print '<td align="right" class="borderrightlight">'.$langs->trans("Delta").'</td>';
|
print '<td class="liste_titre" align="right" class="borderrightlight">'.$langs->trans("Delta").'</td>';
|
||||||
if ($annee != $year_end) print '<td width="15"> </td>';
|
if ($annee != $year_end) print '<td class="liste_titre" width="15"> </td>';
|
||||||
}
|
}
|
||||||
print '</tr>';
|
print '</tr>';
|
||||||
|
|
||||||
|
|||||||
@ -131,6 +131,7 @@ class Contact extends CommonObject
|
|||||||
$clause = "AND";
|
$clause = "AND";
|
||||||
}
|
}
|
||||||
$sql.= ' '.$clause.' sp.entity IN ('.getEntity($this->element, 1).')';
|
$sql.= ' '.$clause.' sp.entity IN ('.getEntity($this->element, 1).')';
|
||||||
|
$sql.= " AND (sp.priv='0' OR (sp.priv='1' AND sp.fk_user_creat=".$user->id."))";
|
||||||
if ($user->societe_id > 0) $sql.=" AND sp.fk_soc = ".$user->societe_id;
|
if ($user->societe_id > 0) $sql.=" AND sp.fk_soc = ".$user->societe_id;
|
||||||
|
|
||||||
$resql=$this->db->query($sql);
|
$resql=$this->db->query($sql);
|
||||||
|
|||||||
@ -920,6 +920,18 @@ if (empty($reshook))
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Send mail
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Actions to send emails
|
||||||
|
$actiontypecode='AC_CONT';
|
||||||
|
$trigger_name='CONTRACT_SENTBYMAIL';
|
||||||
|
$paramname='id';
|
||||||
|
$mode='emailfromcontract';
|
||||||
|
$trackid='cont'.$object->id;
|
||||||
|
include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
|
||||||
|
|
||||||
if (! empty($conf->global->MAIN_DISABLE_CONTACTS_TAB) && $user->rights->contrat->creer)
|
if (! empty($conf->global->MAIN_DISABLE_CONTACTS_TAB) && $user->rights->contrat->creer)
|
||||||
{
|
{
|
||||||
if ($action == 'addcontact')
|
if ($action == 'addcontact')
|
||||||
@ -2026,37 +2038,164 @@ else
|
|||||||
|
|
||||||
print "</div>";
|
print "</div>";
|
||||||
}
|
}
|
||||||
|
// Select mail models is same action as presend
|
||||||
|
if (GETPOST('modelselected')) {
|
||||||
|
$action = 'presend';
|
||||||
|
}
|
||||||
|
|
||||||
print '<div class="fichecenter"><div class="fichehalfleft">';
|
if ($action != 'presend')
|
||||||
|
{
|
||||||
|
print '<div class="fichecenter"><div class="fichehalfleft">';
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Documents generes
|
* Documents generes
|
||||||
*/
|
*/
|
||||||
$filename = dol_sanitizeFileName($object->ref);
|
$filename = dol_sanitizeFileName($object->ref);
|
||||||
$filedir = $conf->contrat->dir_output . "/" . dol_sanitizeFileName($object->ref);
|
$filedir = $conf->contrat->dir_output . "/" . dol_sanitizeFileName($object->ref);
|
||||||
$urlsource = $_SERVER["PHP_SELF"] . "?id=" . $object->id;
|
$urlsource = $_SERVER["PHP_SELF"] . "?id=" . $object->id;
|
||||||
$genallowed = $user->rights->contrat->creer;
|
$genallowed = $user->rights->contrat->creer;
|
||||||
$delallowed = $user->rights->contrat->supprimer;
|
$delallowed = $user->rights->contrat->supprimer;
|
||||||
|
|
||||||
$var = true;
|
$var = true;
|
||||||
|
|
||||||
print $formfile->showdocuments('contract', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 1, 0, 0, 28, 0, '', 0, '', $soc->default_lang);
|
print $formfile->showdocuments('contract', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 1, 0, 0, 28, 0, '', 0, '', $soc->default_lang);
|
||||||
|
|
||||||
|
|
||||||
// Show links to link elements
|
// Show links to link elements
|
||||||
$linktoelem = $form->showLinkToObjectBlock($object, null, array('contrat'));
|
$linktoelem = $form->showLinkToObjectBlock($object, null, array('contrat'));
|
||||||
$somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
|
$somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
|
||||||
|
|
||||||
|
|
||||||
print '</div><div class="fichehalfright"><div class="ficheaddleft">';
|
print '</div><div class="fichehalfright"><div class="ficheaddleft">';
|
||||||
|
|
||||||
// List of actions on element
|
// List of actions on element
|
||||||
include_once DOL_DOCUMENT_ROOT . '/core/class/html.formactions.class.php';
|
include_once DOL_DOCUMENT_ROOT . '/core/class/html.formactions.class.php';
|
||||||
$formactions = new FormActions($db);
|
$formactions = new FormActions($db);
|
||||||
$somethingshown = $formactions->showactions($object, 'contract', $socid);
|
$somethingshown = $formactions->showactions($object, 'contract', $socid);
|
||||||
|
|
||||||
|
|
||||||
print '</div></div></div>';
|
print '</div></div></div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Action presend
|
||||||
|
*/
|
||||||
|
if ($action == 'presend')
|
||||||
|
{
|
||||||
|
$object->fetch_projet();
|
||||||
|
|
||||||
|
$ref = dol_sanitizeFileName($object->ref);
|
||||||
|
include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php';
|
||||||
|
$fileparams = dol_most_recent_file($conf->contrat->dir_output . '/' . $ref, preg_quote($ref, '/').'[^\-]+');
|
||||||
|
$file = $fileparams['fullname'];
|
||||||
|
|
||||||
|
// Define output language
|
||||||
|
$outputlangs = $langs;
|
||||||
|
$newlang = '';
|
||||||
|
if ($conf->global->MAIN_MULTILANGS && empty($newlang) && ! empty($_REQUEST['lang_id']))
|
||||||
|
$newlang = $_REQUEST['lang_id'];
|
||||||
|
if ($conf->global->MAIN_MULTILANGS && empty($newlang))
|
||||||
|
$newlang = $object->thirdparty->default_lang;
|
||||||
|
|
||||||
|
if (!empty($newlang))
|
||||||
|
{
|
||||||
|
$outputlangs = new Translate('', $conf);
|
||||||
|
$outputlangs->setDefaultLang($newlang);
|
||||||
|
$outputlangs->load('commercial');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build document if it not exists
|
||||||
|
if (! $file || ! is_readable($file)) {
|
||||||
|
$result = $object->generateDocument(GETPOST('model') ? GETPOST('model') : $object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
|
||||||
|
if ($result <= 0) {
|
||||||
|
dol_print_error($db, $object->error, $object->errors);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
$fileparams = dol_most_recent_file($conf->commande->dir_output . '/' . $ref, preg_quote($ref, '/').'[^\-]+');
|
||||||
|
$file = $fileparams['fullname'];
|
||||||
|
}
|
||||||
|
|
||||||
|
print '<div class="clearboth"></div>';
|
||||||
|
print '<br>';
|
||||||
|
print load_fiche_titre($langs->trans('SendOrderByMail'));
|
||||||
|
|
||||||
|
dol_fiche_head('');
|
||||||
|
|
||||||
|
// Cree l'objet formulaire mail
|
||||||
|
include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php';
|
||||||
|
$formmail = new FormMail($db);
|
||||||
|
$formmail->param['langsmodels']=(empty($newlang)?$langs->defaultlang:$newlang);
|
||||||
|
$formmail->fromtype = (GETPOST('fromtype')?GETPOST('fromtype'):(!empty($conf->global->MAIN_MAIL_DEFAULT_FROMTYPE)?$conf->global->MAIN_MAIL_DEFAULT_FROMTYPE:'user'));
|
||||||
|
|
||||||
|
if($formmail->fromtype === 'user'){
|
||||||
|
$formmail->fromid = $user->id;
|
||||||
|
|
||||||
|
}
|
||||||
|
$formmail->trackid='ord'.$object->id;
|
||||||
|
if (! empty($conf->global->MAIN_EMAIL_ADD_TRACK_ID) && ($conf->global->MAIN_EMAIL_ADD_TRACK_ID & 2)) // If bit 2 is set
|
||||||
|
{
|
||||||
|
include DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
|
||||||
|
$formmail->frommail=dolAddEmailTrackId($formmail->frommail, 'ord'.$object->id);
|
||||||
|
}
|
||||||
|
$formmail->withfrom = 1;
|
||||||
|
$liste = array();
|
||||||
|
foreach ($object->thirdparty->thirdparty_and_contact_email_array(1) as $key => $value)
|
||||||
|
$liste [$key] = $value;
|
||||||
|
$formmail->withto = GETPOST('sendto') ? GETPOST('sendto') : $liste;
|
||||||
|
$formmail->withtocc = $liste;
|
||||||
|
$formmail->withtoccc = $conf->global->MAIN_EMAIL_USECCC;
|
||||||
|
if (empty($object->ref_client)) {
|
||||||
|
$formmail->withtopic = $outputlangs->trans('SendOrderRef', '__ORDERREF__');
|
||||||
|
} else if (! empty($object->ref_client)) {
|
||||||
|
$formmail->withtopic = $outputlangs->trans('SendOrderRef', '__ORDERREF__ (__REFCLIENT__)');
|
||||||
|
}
|
||||||
|
$formmail->withfile = 2;
|
||||||
|
$formmail->withbody = 1;
|
||||||
|
$formmail->withdeliveryreceipt = 1;
|
||||||
|
$formmail->withcancel = 1;
|
||||||
|
// Tableau des substitutions
|
||||||
|
$formmail->setSubstitFromObject($object);
|
||||||
|
$formmail->substit ['__ORDERREF__'] = $object->ref;
|
||||||
|
|
||||||
|
$custcontact = '';
|
||||||
|
$contactarr = array();
|
||||||
|
$contactarr = $object->liste_contact(- 1, 'external');
|
||||||
|
|
||||||
|
if (is_array($contactarr) && count($contactarr) > 0)
|
||||||
|
{
|
||||||
|
foreach ($contactarr as $contact)
|
||||||
|
{
|
||||||
|
if ($contact['libelle'] == $langs->trans('TypeContact_commande_external_CUSTOMER')) { // TODO Use code and not label
|
||||||
|
$contactstatic = new Contact($db);
|
||||||
|
$contactstatic->fetch($contact ['id']);
|
||||||
|
$custcontact = $contactstatic->getFullName($langs, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! empty($custcontact)) {
|
||||||
|
$formmail->substit['__CONTACTCIVNAME__'] = $custcontact;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tableau des parametres complementaires
|
||||||
|
$formmail->param['action'] = 'send';
|
||||||
|
$formmail->param['models'] = 'order_send';
|
||||||
|
$formmail->param['models_id']=GETPOST('modelmailselected','int');
|
||||||
|
$formmail->param['orderid'] = $object->id;
|
||||||
|
$formmail->param['returnurl'] = $_SERVER["PHP_SELF"] . '?id=' . $object->id;
|
||||||
|
|
||||||
|
// Init list of files
|
||||||
|
if (GETPOST("mode") == 'init') {
|
||||||
|
$formmail->clear_attached_files();
|
||||||
|
$formmail->add_attached_files($file, basename($file), dol_mimetype($file));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show form
|
||||||
|
print $formmail->get_form();
|
||||||
|
|
||||||
|
dol_fiche_end();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -18,10 +18,12 @@
|
|||||||
* or see http://www.gnu.org/
|
* or see http://www.gnu.org/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
// Variable $upload_dir must be defined when entering here
|
// Variable $upload_dir must be defined when entering here
|
||||||
// Variable $upload_dirold may also exists.
|
// Variable $upload_dirold may also exists.
|
||||||
|
|
||||||
|
//var_dump($upload_dir);
|
||||||
|
//var_dump($upload_dirold);
|
||||||
|
|
||||||
// Submit file/link
|
// Submit file/link
|
||||||
if (GETPOST('sendit') && ! empty($conf->global->MAIN_UPLOAD_DOC))
|
if (GETPOST('sendit') && ! empty($conf->global->MAIN_UPLOAD_DOC))
|
||||||
{
|
{
|
||||||
@ -165,7 +167,11 @@ elseif ($action == 'renamefile' && GETPOST('renamefilesave'))
|
|||||||
|
|
||||||
setEventMessages($langs->trans("FileRenamed"), null);
|
setEventMessages($langs->trans("FileRenamed"), null);
|
||||||
}
|
}
|
||||||
else setEventMessages($langs->trans("ErrorFailToRenameFile", $filenamefrom, $filenameto), null, 'errors');
|
else
|
||||||
|
{
|
||||||
|
$langs->load("errors"); // key must be loaded because we can't rely on loading during output, we need var substitution to be done now.
|
||||||
|
setEventMessages($langs->trans("ErrorFailToRenameFile", $filenamefrom, $filenameto), null, 'errors');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -210,6 +210,7 @@ class CMailFile
|
|||||||
$this->addr_bcc = $addr_bcc;
|
$this->addr_bcc = $addr_bcc;
|
||||||
$this->deliveryreceipt = $deliveryreceipt;
|
$this->deliveryreceipt = $deliveryreceipt;
|
||||||
$this->trackid = $trackid;
|
$this->trackid = $trackid;
|
||||||
|
|
||||||
$smtp_headers = $this->write_smtpheaders();
|
$smtp_headers = $this->write_smtpheaders();
|
||||||
if (! empty($moreinheader)) $smtp_headers.=$moreinheader; // $moreinheader contains the \r\n
|
if (! empty($moreinheader)) $smtp_headers.=$moreinheader; // $moreinheader contains the \r\n
|
||||||
|
|
||||||
@ -272,6 +273,7 @@ class CMailFile
|
|||||||
$smtps->setFrom($this->getValidAddress($from,0,1));
|
$smtps->setFrom($this->getValidAddress($from,0,1));
|
||||||
$smtps->setTrackId($trackid);
|
$smtps->setTrackId($trackid);
|
||||||
$smtps->setReplyTo($this->getValidAddress($from,0,1)); // Set property with this->smtps->setReplyTo after constructor if you want to use another value than the From
|
$smtps->setReplyTo($this->getValidAddress($from,0,1)); // Set property with this->smtps->setReplyTo after constructor if you want to use another value than the From
|
||||||
|
|
||||||
if (! empty($moreinheader)) $smtps->setMoreInHeader($moreinheader);
|
if (! empty($moreinheader)) $smtps->setMoreInHeader($moreinheader);
|
||||||
|
|
||||||
if (! empty($this->html))
|
if (! empty($this->html))
|
||||||
@ -487,7 +489,7 @@ class CMailFile
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check number of recipient is lower or equal than MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL
|
// Check number of recipient is lower or equal than MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL
|
||||||
if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL=10;
|
if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL=10;
|
||||||
$tmparray1 = explode(',', $this->addr_to);
|
$tmparray1 = explode(',', $this->addr_to);
|
||||||
if (count($tmparray1) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL)
|
if (count($tmparray1) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL)
|
||||||
{
|
{
|
||||||
@ -495,6 +497,7 @@ class CMailFile
|
|||||||
dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
|
dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL=10;
|
||||||
$tmparray2 = explode(',', $this->addr_cc);
|
$tmparray2 = explode(',', $this->addr_cc);
|
||||||
if (count($tmparray2) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL)
|
if (count($tmparray2) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL)
|
||||||
{
|
{
|
||||||
@ -502,6 +505,7 @@ class CMailFile
|
|||||||
dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
|
dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL=10;
|
||||||
$tmparray3 = explode(',', $this->addr_bcc);
|
$tmparray3 = explode(',', $this->addr_bcc);
|
||||||
if (count($tmparray3) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL)
|
if (count($tmparray3) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL)
|
||||||
{
|
{
|
||||||
@ -509,6 +513,7 @@ class CMailFile
|
|||||||
dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
|
dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL=10;
|
||||||
if ((count($tmparray1)+count($tmparray2)+count($tmparray3)) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL)
|
if ((count($tmparray1)+count($tmparray2)+count($tmparray3)) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL)
|
||||||
{
|
{
|
||||||
$this->error = 'Too much recipients in to:, cc:, bcc:';
|
$this->error = 'Too much recipients in to:, cc:, bcc:';
|
||||||
@ -516,7 +521,6 @@ class CMailFile
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Action according to choosed sending method
|
// Action according to choosed sending method
|
||||||
if ($conf->global->MAIN_MAIL_SENDMODE == 'mail')
|
if ($conf->global->MAIN_MAIL_SENDMODE == 'mail')
|
||||||
{
|
{
|
||||||
@ -558,6 +562,7 @@ class CMailFile
|
|||||||
{
|
{
|
||||||
$additionnalparam .= ($additionnalparam?' ':'').'-ba';
|
$additionnalparam .= ($additionnalparam?' ':'').'-ba';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! empty($conf->global->MAIN_MAIL_SENDMAIL_FORCE_ADDPARAM)) $additionnalparam .= ($additionnalparam?' ':'').'-U '.$additionnalparam; // Use -U to add additionnal params
|
if (! empty($conf->global->MAIN_MAIL_SENDMAIL_FORCE_ADDPARAM)) $additionnalparam .= ($additionnalparam?' ':'').'-U '.$additionnalparam; // Use -U to add additionnal params
|
||||||
|
|
||||||
dol_syslog("CMailFile::sendfile: mail start HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port').", additionnal_parameters=".$additionnalparam, LOG_DEBUG);
|
dol_syslog("CMailFile::sendfile: mail start HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port').", additionnal_parameters=".$additionnalparam, LOG_DEBUG);
|
||||||
@ -881,7 +886,7 @@ class CMailFile
|
|||||||
|
|
||||||
// Receiver
|
// Receiver
|
||||||
if (isset($this->addr_cc) && $this->addr_cc) $out.= "Cc: ".$this->getValidAddress($this->addr_cc,2).$this->eol2;
|
if (isset($this->addr_cc) && $this->addr_cc) $out.= "Cc: ".$this->getValidAddress($this->addr_cc,2).$this->eol2;
|
||||||
if (isset($this->addr_bcc) && $this->addr_bcc) $out.= "Bcc: ".$this->getValidAddress($this->addr_bcc,2).$this->eol2; // Question: bcc must not be into header, only into SMTP command "RCPT TO". Does php mail support this ?
|
if (isset($this->addr_bcc) && $this->addr_bcc) $out.= "Bcc: ".$this->getValidAddress($this->addr_bcc,2).$this->eol2; // TODO Question: bcc must not be into header, only into SMTP command "RCPT TO". Does php mail support this ?
|
||||||
|
|
||||||
// Delivery receipt
|
// Delivery receipt
|
||||||
if (isset($this->deliveryreceipt) && $this->deliveryreceipt == 1) $out.= "Disposition-Notification-To: ".$this->getValidAddress($this->addr_from,2).$this->eol2;
|
if (isset($this->deliveryreceipt) && $this->deliveryreceipt == 1) $out.= "Disposition-Notification-To: ".$this->getValidAddress($this->addr_from,2).$this->eol2;
|
||||||
|
|||||||
@ -1929,7 +1929,10 @@ abstract class CommonObject
|
|||||||
*/
|
*/
|
||||||
function updateRangOfLine($rowid,$rang)
|
function updateRangOfLine($rowid,$rang)
|
||||||
{
|
{
|
||||||
$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET rang = '.$rang;
|
$fieldposition = 'rang';
|
||||||
|
if ($this->table_element_line == 'ecm_files') $fieldposition = 'position';
|
||||||
|
|
||||||
|
$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang;
|
||||||
$sql.= ' WHERE rowid = '.$rowid;
|
$sql.= ' WHERE rowid = '.$rowid;
|
||||||
|
|
||||||
dol_syslog(get_class($this)."::updateRangOfLine", LOG_DEBUG);
|
dol_syslog(get_class($this)."::updateRangOfLine", LOG_DEBUG);
|
||||||
@ -2445,9 +2448,10 @@ abstract class CommonObject
|
|||||||
* Fetch array of objects linked to current object. Links are loaded into this->linkedObjects array and this->linkedObjectsIds
|
* Fetch array of objects linked to current object. Links are loaded into this->linkedObjects array and this->linkedObjectsIds
|
||||||
* Possible usage for parameters:
|
* Possible usage for parameters:
|
||||||
* - all parameters empty -> we look all link to current object (current object can be source or target)
|
* - all parameters empty -> we look all link to current object (current object can be source or target)
|
||||||
* - one couple id+type is provided -> this will set $justsource or $justtarget
|
* - source id+type -> will get target list linked to source
|
||||||
* - one couple id+type is provided and other type is provided -> this will set $justsource or $justtarget + criteria on other type
|
* - target id+type -> will get source list linked to target
|
||||||
*
|
* - source id+type + target type -> will get target list of the type
|
||||||
|
* - target id+type + target source -> will get source list of the type
|
||||||
*
|
*
|
||||||
* @param int $sourceid Object source id (if not defined, id of object)
|
* @param int $sourceid Object source id (if not defined, id of object)
|
||||||
* @param string $sourcetype Object source type (if not defined, element name of object)
|
* @param string $sourcetype Object source type (if not defined, element name of object)
|
||||||
@ -3296,85 +3300,91 @@ abstract class CommonObject
|
|||||||
$usemargins=0;
|
$usemargins=0;
|
||||||
if (! empty($conf->margin->enabled) && ! empty($this->element) && in_array($this->element,array('facture','propal','commande'))) $usemargins=1;
|
if (! empty($conf->margin->enabled) && ! empty($this->element) && in_array($this->element,array('facture','propal','commande'))) $usemargins=1;
|
||||||
|
|
||||||
print '<tr class="liste_titre nodrag nodrop">';
|
|
||||||
|
|
||||||
if (! empty($conf->global->MAIN_VIEW_LINE_NUMBER)) print '<td class="linecolnum" align="center" width="5"> </td>';
|
|
||||||
|
|
||||||
// Description
|
|
||||||
print '<td class="linecoldescription">'.$langs->trans('Description').'</td>';
|
|
||||||
|
|
||||||
if ($this->element == 'supplier_proposal')
|
|
||||||
{
|
|
||||||
print '<td class="linerefsupplier" align="right"><span id="title_fourn_ref">'.$langs->trans("SupplierProposalRefFourn").'</span></td>';
|
|
||||||
}
|
|
||||||
|
|
||||||
// VAT
|
|
||||||
print '<td class="linecolvat" align="right" width="80">'.$langs->trans('VAT').'</td>';
|
|
||||||
|
|
||||||
// Price HT
|
|
||||||
print '<td class="linecoluht" align="right" width="80">'.$langs->trans('PriceUHT').'</td>';
|
|
||||||
|
|
||||||
// Multicurrency
|
|
||||||
if (!empty($conf->multicurrency->enabled)) print '<td class="linecoluht_currency" align="right" width="80">'.$langs->trans('PriceUHTCurrency', $this->multicurrency_code).'</td>';
|
|
||||||
|
|
||||||
if ($inputalsopricewithtax) print '<td align="right" width="80">'.$langs->trans('PriceUTTC').'</td>';
|
|
||||||
|
|
||||||
// Qty
|
|
||||||
print '<td class="linecolqty" align="right">'.$langs->trans('Qty').'</td>';
|
|
||||||
|
|
||||||
if($conf->global->PRODUCT_USE_UNITS)
|
|
||||||
{
|
|
||||||
print '<td class="linecoluseunit" align="left">'.$langs->trans('Unit').'</td>';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reduction short
|
|
||||||
print '<td class="linecoldiscount" align="right">'.$langs->trans('ReductionShort').'</td>';
|
|
||||||
|
|
||||||
if ($this->situation_cycle_ref) {
|
|
||||||
print '<td class="linecolcycleref" align="right">' . $langs->trans('Progress') . '</td>';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($usemargins && ! empty($conf->margin->enabled) && empty($user->societe_id))
|
|
||||||
{
|
|
||||||
if (!empty($user->rights->margins->creer))
|
|
||||||
{
|
|
||||||
if ($conf->global->MARGIN_TYPE == "1")
|
|
||||||
print '<td class="linecolmargin1 margininfos" align="right" width="80">'.$langs->trans('BuyingPrice').'</td>';
|
|
||||||
else
|
|
||||||
print '<td class="linecolmargin1 margininfos" align="right" width="80">'.$langs->trans('CostPrice').'</td>';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! empty($conf->global->DISPLAY_MARGIN_RATES) && $user->rights->margins->liretous)
|
|
||||||
print '<td class="linecolmargin2 margininfos" align="right" width="50">'.$langs->trans('MarginRate').'</td>';
|
|
||||||
if (! empty($conf->global->DISPLAY_MARK_RATES) && $user->rights->margins->liretous)
|
|
||||||
print '<td class="linecolmargin2 margininfos" align="right" width="50">'.$langs->trans('MarkRate').'</td>';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Total HT
|
|
||||||
print '<td class="linecolht" align="right">'.$langs->trans('TotalHTShort').'</td>';
|
|
||||||
|
|
||||||
// Multicurrency
|
|
||||||
if (!empty($conf->multicurrency->enabled)) print '<td class="linecoltotalht_currency" align="right">'.$langs->trans('TotalHTShortCurrency', $this->multicurrency_code).'</td>';
|
|
||||||
|
|
||||||
if ($outputalsopricetotalwithtax) print '<td align="right" width="80">'.$langs->trans('TotalTTCShort').'</td>';
|
|
||||||
|
|
||||||
print '<td class="linecoledit"></td>'; // No width to allow autodim
|
|
||||||
|
|
||||||
print '<td class="linecoldelete" width="10"></td>';
|
|
||||||
|
|
||||||
print '<td class="linecolmove" width="10"></td>';
|
|
||||||
|
|
||||||
print "</tr>\n";
|
|
||||||
|
|
||||||
$num = count($this->lines);
|
$num = count($this->lines);
|
||||||
$var = true;
|
|
||||||
$i = 0;
|
|
||||||
|
|
||||||
//Line extrafield
|
//Line extrafield
|
||||||
require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
|
require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
|
||||||
$extrafieldsline = new ExtraFields($this->db);
|
$extrafieldsline = new ExtraFields($this->db);
|
||||||
$extralabelslines=$extrafieldsline->fetch_name_optionals_label($this->table_element_line);
|
$extralabelslines=$extrafieldsline->fetch_name_optionals_label($this->table_element_line);
|
||||||
|
|
||||||
|
$parameters = array('num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
|
||||||
|
$reshook = $hookmanager->executeHooks('printObjectLineTitle', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
|
||||||
|
if (empty($reshook))
|
||||||
|
{
|
||||||
|
print '<tr class="liste_titre nodrag nodrop">';
|
||||||
|
|
||||||
|
if (! empty($conf->global->MAIN_VIEW_LINE_NUMBER)) print '<td class="linecolnum" align="center" width="5"> </td>';
|
||||||
|
|
||||||
|
// Description
|
||||||
|
print '<td class="linecoldescription">'.$langs->trans('Description').'</td>';
|
||||||
|
|
||||||
|
if ($this->element == 'supplier_proposal')
|
||||||
|
{
|
||||||
|
print '<td class="linerefsupplier" align="right"><span id="title_fourn_ref">'.$langs->trans("SupplierProposalRefFourn").'</span></td>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// VAT
|
||||||
|
print '<td class="linecolvat" align="right" width="80">'.$langs->trans('VAT').'</td>';
|
||||||
|
|
||||||
|
// Price HT
|
||||||
|
print '<td class="linecoluht" align="right" width="80">'.$langs->trans('PriceUHT').'</td>';
|
||||||
|
|
||||||
|
// Multicurrency
|
||||||
|
if (!empty($conf->multicurrency->enabled)) print '<td class="linecoluht_currency" align="right" width="80">'.$langs->trans('PriceUHTCurrency', $this->multicurrency_code).'</td>';
|
||||||
|
|
||||||
|
if ($inputalsopricewithtax) print '<td align="right" width="80">'.$langs->trans('PriceUTTC').'</td>';
|
||||||
|
|
||||||
|
// Qty
|
||||||
|
print '<td class="linecolqty" align="right">'.$langs->trans('Qty').'</td>';
|
||||||
|
|
||||||
|
if($conf->global->PRODUCT_USE_UNITS)
|
||||||
|
{
|
||||||
|
print '<td class="linecoluseunit" align="left">'.$langs->trans('Unit').'</td>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reduction short
|
||||||
|
print '<td class="linecoldiscount" align="right">'.$langs->trans('ReductionShort').'</td>';
|
||||||
|
|
||||||
|
if ($this->situation_cycle_ref) {
|
||||||
|
print '<td class="linecolcycleref" align="right">' . $langs->trans('Progress') . '</td>';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($usemargins && ! empty($conf->margin->enabled) && empty($user->societe_id))
|
||||||
|
{
|
||||||
|
if (!empty($user->rights->margins->creer))
|
||||||
|
{
|
||||||
|
if ($conf->global->MARGIN_TYPE == "1")
|
||||||
|
print '<td class="linecolmargin1 margininfos" align="right" width="80">'.$langs->trans('BuyingPrice').'</td>';
|
||||||
|
else
|
||||||
|
print '<td class="linecolmargin1 margininfos" align="right" width="80">'.$langs->trans('CostPrice').'</td>';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! empty($conf->global->DISPLAY_MARGIN_RATES) && $user->rights->margins->liretous)
|
||||||
|
print '<td class="linecolmargin2 margininfos" align="right" width="50">'.$langs->trans('MarginRate').'</td>';
|
||||||
|
if (! empty($conf->global->DISPLAY_MARK_RATES) && $user->rights->margins->liretous)
|
||||||
|
print '<td class="linecolmargin2 margininfos" align="right" width="50">'.$langs->trans('MarkRate').'</td>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Total HT
|
||||||
|
print '<td class="linecolht" align="right">'.$langs->trans('TotalHTShort').'</td>';
|
||||||
|
|
||||||
|
// Multicurrency
|
||||||
|
if (!empty($conf->multicurrency->enabled)) print '<td class="linecoltotalht_currency" align="right">'.$langs->trans('TotalHTShortCurrency', $this->multicurrency_code).'</td>';
|
||||||
|
|
||||||
|
if ($outputalsopricetotalwithtax) print '<td align="right" width="80">'.$langs->trans('TotalTTCShort').'</td>';
|
||||||
|
|
||||||
|
print '<td class="linecoledit"></td>'; // No width to allow autodim
|
||||||
|
|
||||||
|
print '<td class="linecoldelete" width="10"></td>';
|
||||||
|
|
||||||
|
print '<td class="linecolmove" width="10"></td>';
|
||||||
|
|
||||||
|
print "</tr>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
$var = true;
|
||||||
|
$i = 0;
|
||||||
|
|
||||||
foreach ($this->lines as $line)
|
foreach ($this->lines as $line)
|
||||||
{
|
{
|
||||||
//Line extrafield
|
//Line extrafield
|
||||||
@ -3392,7 +3402,7 @@ abstract class CommonObject
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$parameters = array('line'=>$line,'var'=>$var,'num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
|
$parameters = array('line'=>$line,'var'=>$var,'num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline, 'fk_parent_line'=>$line->fk_parent_line);
|
||||||
$reshook = $hookmanager->executeHooks('printObjectSubLine', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
|
$reshook = $hookmanager->executeHooks('printObjectSubLine', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -331,15 +331,39 @@ class ExtraFields
|
|||||||
|
|
||||||
$table=$elementtype.'_extrafields';
|
$table=$elementtype.'_extrafields';
|
||||||
|
|
||||||
|
$error=0;
|
||||||
|
|
||||||
if (! empty($attrname) && preg_match("/^\w[a-zA-Z0-9-_]*$/",$attrname))
|
if (! empty($attrname) && preg_match("/^\w[a-zA-Z0-9-_]*$/",$attrname))
|
||||||
{
|
{
|
||||||
$result=$this->db->DDLDropField(MAIN_DB_PREFIX.$table,$attrname); // This also drop the unique key
|
$result=$this->delete_label($attrname,$elementtype);
|
||||||
if ($result < 0)
|
if ($result < 0)
|
||||||
{
|
{
|
||||||
$this->error=$this->db->lasterror();
|
$this->error=$this->db->lasterror();
|
||||||
|
$error++;
|
||||||
}
|
}
|
||||||
|
|
||||||
$result=$this->delete_label($attrname,$elementtype);
|
if (! $error)
|
||||||
|
{
|
||||||
|
$sql = "SELECT COUNT(rowid) as nb";
|
||||||
|
$sql.= " FROM ".MAIN_DB_PREFIX."extrafields";
|
||||||
|
$sql.= " WHERE elementtype = '".$elementtype."'";
|
||||||
|
$sql.= " AND name = '".$attrname."'";
|
||||||
|
//$sql.= " AND entity IN (0,".$conf->entity.")"; Do not test on entity here. We want to see if there is still on field remaning in other entities before deleting field in table
|
||||||
|
$resql = $this->db->query($sql);
|
||||||
|
if ($resql)
|
||||||
|
{
|
||||||
|
$obj = $this->db->fetch_object($resql);
|
||||||
|
if ($obj->nb <= 0)
|
||||||
|
{
|
||||||
|
$result=$this->db->DDLDropField(MAIN_DB_PREFIX.$table,$attrname); // This also drop the unique key
|
||||||
|
if ($result < 0)
|
||||||
|
{
|
||||||
|
$this->error=$this->db->lasterror();
|
||||||
|
$error++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -116,8 +116,8 @@ class HookManager
|
|||||||
* @param array $parameters Array of parameters
|
* @param array $parameters Array of parameters
|
||||||
* @param Object $object Object to use hooks on
|
* @param Object $object Object to use hooks on
|
||||||
* @param string $action Action code on calling page ('create', 'edit', 'view', 'add', 'update', 'delete'...)
|
* @param string $action Action code on calling page ('create', 'edit', 'view', 'add', 'update', 'delete'...)
|
||||||
* @return mixed For 'addreplace hooks (doActions,formObjectOptions,pdf_xxx,...): Return 0 if we want to keep standard actions, >0 if we want to stop standard actions, <0 if KO. Things to print are returned into ->resprints and set into ->resPrint. Things to return are returned into ->results and set into ->resArray.
|
* @return mixed For 'addreplace' hooks (doActions,formObjectOptions,pdf_xxx,...): Return 0 if we want to keep standard actions, >0 if we want to stop standard actions, <0 if KO. Things to print are returned into ->resprints and set into ->resPrint. Things to return are returned into ->results by hook and set into ->resArray for caller.
|
||||||
* For 'output' hooks (printLeftBlock, formAddObjectLine, formBuilddocOptions, ...): Return 0, <0 if KO. Things to print are returned into ->resprints and set into ->resPrint. Things to return are returned into ->results and set into ->resArray.
|
* For 'output' hooks (printLeftBlock, formAddObjectLine, formBuilddocOptions, ...): Return 0, <0 if KO. Things to print are returned into ->resprints and set into ->resPrint. Things to return are returned into ->results bu hook and set into ->resArray for caller.
|
||||||
* All types can also return some values into an array ->results.
|
* All types 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.
|
* $this->error or this->errors are also defined by class called by this function if error.
|
||||||
*/
|
*/
|
||||||
@ -142,6 +142,7 @@ class HookManager
|
|||||||
'formObjectOptions',
|
'formObjectOptions',
|
||||||
'formattachOptions',
|
'formattachOptions',
|
||||||
'formBuilddocLineOptions',
|
'formBuilddocLineOptions',
|
||||||
|
'formatNotificationMessage',
|
||||||
'getFormMail',
|
'getFormMail',
|
||||||
'getIdProfUrl',
|
'getIdProfUrl',
|
||||||
'moveUploadedFile',
|
'moveUploadedFile',
|
||||||
|
|||||||
@ -5961,7 +5961,7 @@ class Form
|
|||||||
*/
|
*/
|
||||||
global $dolibarr_main_url_root;
|
global $dolibarr_main_url_root;
|
||||||
$ret.='<!-- Put link to gravatar -->';
|
$ret.='<!-- Put link to gravatar -->';
|
||||||
$ret.='<img class="photo'.$modulepart.($cssclass?' '.$cssclass:'').'" alt="Gravatar avatar" title="'.$email.' Gravatar avatar" border="0"'.($width?' width="'.$width.'"':'').($height?' height="'.$height.'"':'').' src="https://www.gravatar.com/avatar/'.dol_hash(strtolower(trim($email)),3).'?s='.$width.'&d='.urlencode(dol_buildpath($nophoto,2)).'">'; // gravatar need md5 hash
|
$ret.='<img class="photo'.$modulepart.($cssclass?' '.$cssclass:'').'" alt="Gravatar avatar" title="'.$email.' Gravatar avatar" border="0"'.($width?' width="'.$width.'"':'').($height?' height="'.$height.'"':'').' src="https://www.gravatar.com/avatar/'.dol_hash(strtolower(trim($email)),3).'?s='.$width.'&d='.urlencode(dol_buildpath($nophoto,3)).'">'; // gravatar need md5 hash
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@ -856,38 +856,62 @@ class FormFile
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show list of documents in a directory
|
* Show list of documents in $filearray (may be they are all in same directory but may not)
|
||||||
*
|
*
|
||||||
* @param array $filearray Array of files loaded by dol_dir_list('files') function before calling this
|
* @param array $filearray Array of files loaded by dol_dir_list('files') function before calling this.
|
||||||
* @param Object $object Object on which document is linked to
|
* @param Object $object Object on which document is linked to.
|
||||||
* @param string $modulepart Value for modulepart used by download or viewimage wrapper
|
* @param string $modulepart Value for modulepart used by download or viewimage wrapper.
|
||||||
* @param string $param Parameters on sort links (param must start with &, example &aaa=bbb&ccc=ddd)
|
* @param string $param Parameters on sort links (param must start with &, example &aaa=bbb&ccc=ddd)
|
||||||
* @param int $forcedownload Force to open dialog box "Save As" when clicking on file
|
* @param int $forcedownload Force to open dialog box "Save As" when clicking on file.
|
||||||
* @param string $relativepath Relative path of docs (autodefined if not provided)
|
* @param string $relativepath Relative path of docs (autodefined if not provided), relative to module dir, not to MAIN_DATA_ROOT.
|
||||||
* @param int $permonobject Permission on object (so permission to delete or crop document)
|
* @param int $permonobject Permission on object (so permission to delete or crop document)
|
||||||
* @param int $useinecm Change output for use in ecm module
|
* @param int $useinecm Change output for use in ecm module
|
||||||
* @param string $textifempty Text to show if filearray is empty ('NoFileFound' if not defined)
|
* @param string $textifempty Text to show if filearray is empty ('NoFileFound' if not defined)
|
||||||
* @param int $maxlength Maximum length of file name shown
|
* @param int $maxlength Maximum length of file name shown.
|
||||||
* @param string $title Title before list
|
* @param string $title Title before list
|
||||||
* @param string $url Full url to use for click links ('' = autodetect)
|
* @param string $url Full url to use for click links ('' = autodetect)
|
||||||
* @param int $showrelpart 0=Show only filename (default), 1=Show first level 1 dir
|
* @param int $showrelpart 0=Show only filename (default), 1=Show first level 1 dir
|
||||||
* @param int $permtoeditline Permission to edit document line (-1 is deprecated)
|
* @param int $permtoeditline Permission to edit document line (You must provide a value, -1 is deprecated and must not be used any more)
|
||||||
|
* @param string $upload_dir Full path directory so we can know dir relative to MAIN_DATA_ROOT. Fill this if you want to complete file data with database indexes.
|
||||||
|
* @param string $sortfield Sort field ('name', 'size', 'position', ...)
|
||||||
|
* @param string $sortorder Sort order ('ASC' or 'DESC')
|
||||||
|
* @param int $disablemove 1=Disable move button, 0=Position move is possible.
|
||||||
* @return int <0 if KO, nb of files shown if OK
|
* @return int <0 if KO, nb of files shown if OK
|
||||||
*/
|
*/
|
||||||
function list_of_documents($filearray,$object,$modulepart,$param='',$forcedownload=0,$relativepath='',$permonobject=1,$useinecm=0,$textifempty='',$maxlength=0,$title='',$url='', $showrelpart=0, $permtoeditline=-1)
|
function list_of_documents($filearray,$object,$modulepart,$param='',$forcedownload=0,$relativepath='',$permonobject=1,$useinecm=0,$textifempty='',$maxlength=0,$title='',$url='', $showrelpart=0, $permtoeditline=-1,$upload_dir='',$sortfield='',$sortorder='ASC', $disablemove=1)
|
||||||
{
|
{
|
||||||
global $user, $conf, $langs, $hookmanager;
|
global $user, $conf, $langs, $hookmanager;
|
||||||
global $bc;
|
global $bc,$bcdd;
|
||||||
global $sortfield, $sortorder, $maxheightmini;
|
global $sortfield, $sortorder, $maxheightmini;
|
||||||
|
|
||||||
$hookmanager->initHooks(array('formfile'));
|
// Define relative path used to store the file
|
||||||
|
if (empty($relativepath))
|
||||||
|
{
|
||||||
|
$relativepath=(! empty($object->ref)?dol_sanitizeFileName($object->ref):'').'/';
|
||||||
|
if ($object->element == 'invoice_supplier') $relativepath=get_exdir($object->id,2,0,0,$object,'invoice_supplier').$relativepath; // TODO Call using a defined value for $relativepath
|
||||||
|
if ($object->element == 'project_task') $relativepath='Call_not_supported_._Call_function_using_a_defined_relative_path_.';
|
||||||
|
}
|
||||||
|
// For backward compatiblity, we detect file is stored into an old path
|
||||||
|
if (! empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO) && $file['level1name'] == 'photos')
|
||||||
|
{
|
||||||
|
$relativepath=preg_replace('/^.*\/produit\//','',$file['path']).'/';
|
||||||
|
}
|
||||||
|
// Defined relative dir to DOL_DATA_ROOT
|
||||||
|
$relativedir = '';
|
||||||
|
if ($upload_dir)
|
||||||
|
{
|
||||||
|
$relativedir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $upload_dir);
|
||||||
|
$relativedir = preg_replace('/^[\\/]/','',$relativedir);
|
||||||
|
}
|
||||||
|
|
||||||
|
$hookmanager->initHooks(array('formfile'));
|
||||||
$parameters=array(
|
$parameters=array(
|
||||||
'filearray' => $filearray,
|
'filearray' => $filearray,
|
||||||
'modulepart'=> $modulepart,
|
'modulepart'=> $modulepart,
|
||||||
'param' => $param,
|
'param' => $param,
|
||||||
'forcedownload' => $forcedownload,
|
'forcedownload' => $forcedownload,
|
||||||
'relativepath' => $relativepath,
|
'relativepath' => $relativepath, // relative filename to module dir
|
||||||
|
'relativedir' => $relativedir, // relative dirname to DOL_DATA_ROOT
|
||||||
'permtodelete' => $permonobject,
|
'permtodelete' => $permonobject,
|
||||||
'useinecm' => $useinecm,
|
'useinecm' => $useinecm,
|
||||||
'textifempty' => $textifempty,
|
'textifempty' => $textifempty,
|
||||||
@ -932,45 +956,119 @@ class FormFile
|
|||||||
print '<input type="hidden" name="id" value="'.$object->id.'">';
|
print '<input type="hidden" name="id" value="'.$object->id.'">';
|
||||||
print '<input type="hidden" name="modulepart" value="'.$modulepart.'">';
|
print '<input type="hidden" name="modulepart" value="'.$modulepart.'">';
|
||||||
}
|
}
|
||||||
print '<table width="100%" class="'.($useinecm?'liste noborderbottom':'liste').'">'."\n";
|
print '<table width="100%" id="tablelines" class="'.($useinecm?'liste noborderbottom':'liste').'">'."\n";
|
||||||
|
|
||||||
print '<tr class="liste_titre">';
|
print '<tr class="liste_titre nodrag nodrop">';
|
||||||
print_liste_field_titre($langs->trans("Documents2"),$url,"name","",$param,'align="left"',$sortfield,$sortorder);
|
print_liste_field_titre($langs->trans("Documents2"),$url,"name","",$param,'align="left"',$sortfield,$sortorder);
|
||||||
print_liste_field_titre($langs->trans("Size"),$url,"size","",$param,'align="right"',$sortfield,$sortorder);
|
print_liste_field_titre($langs->trans("Size"),$url,"size","",$param,'align="right"',$sortfield,$sortorder);
|
||||||
print_liste_field_titre($langs->trans("Date"),$url,"date","",$param,'align="center"',$sortfield,$sortorder);
|
print_liste_field_titre($langs->trans("Date"),$url,"date","",$param,'align="center"',$sortfield,$sortorder);
|
||||||
if (empty($useinecm)) print_liste_field_titre('',$url,"","",$param,'align="center"');
|
if (empty($useinecm)) print_liste_field_titre('',$url,"","",$param,'align="center"');
|
||||||
print_liste_field_titre('');
|
print_liste_field_titre('');
|
||||||
|
if (! $disablemove) print_liste_field_titre('');
|
||||||
print "</tr>\n";
|
print "</tr>\n";
|
||||||
|
|
||||||
$nboffiles=count($filearray);
|
// Get list of files stored into database for same relative directory
|
||||||
|
if ($relativedir)
|
||||||
|
{
|
||||||
|
$filearrayindatabase = dol_dir_list_in_database($relativedir, '', null, 'name', SORT_ASC);
|
||||||
|
|
||||||
|
//var_dump($filearray);
|
||||||
|
//var_dump($filearrayindatabase);
|
||||||
|
|
||||||
|
// Complete filearray with properties found into $filearrayindatabase
|
||||||
|
foreach($filearray as $key => $val)
|
||||||
|
{
|
||||||
|
$found=0;
|
||||||
|
// Search if it exists into $filearrayindatabase
|
||||||
|
foreach($filearrayindatabase as $key2 => $val2)
|
||||||
|
{
|
||||||
|
if ($filearrayindatabase[$key2]['name'] == $filearray[$key]['name'])
|
||||||
|
{
|
||||||
|
$filearray[$key]['position_name']=($filearrayindatabase[$key2]['position']?$filearrayindatabase[$key2]['position']:'0').'_'.$filearrayindatabase[$key2]['name'];
|
||||||
|
$filearray[$key]['position']=$filearrayindatabase[$key2]['position'];
|
||||||
|
$filearray[$key]['cover']=$filearrayindatabase[$key2]['cover'];
|
||||||
|
$filearray[$key]['acl']=$filearrayindatabase[$key2]['acl'];
|
||||||
|
$filearray[$key]['rowid']=$filearrayindatabase[$key2]['rowid'];
|
||||||
|
$filearray[$key]['label']=$filearrayindatabase[$key2]['label'];
|
||||||
|
$found=1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! $found) // This happen in transition towerd version 6, or if files were added manually into os dir.
|
||||||
|
{
|
||||||
|
$filearray[$key]['position']='999999'; // File not indexed are at end. So if we add a file, it will not replace an existing position
|
||||||
|
$filearray[$key]['cover']=0;
|
||||||
|
$filearray[$key]['acl']='';
|
||||||
|
|
||||||
|
$rel_filename = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $filearray[$key]['fullname']);
|
||||||
|
if (! preg_match('/(\/temp\/|\/thumbs|\.meta$)/', $rel_filetorenameafter)) // If not a tmp file
|
||||||
|
{
|
||||||
|
dol_syslog("list_of_documents We found a file called '".$filearray[$key]['name']."' not indexed into database. We add it");
|
||||||
|
include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
|
||||||
|
$ecmfile=new EcmFiles($this->db);
|
||||||
|
|
||||||
|
// Add entry into database
|
||||||
|
$filename = basename($rel_filename);
|
||||||
|
$rel_dir = dirname($rel_filename);
|
||||||
|
$rel_dir = preg_replace('/[\\/]$/', '', $rel_dir);
|
||||||
|
$rel_dir = preg_replace('/^[\\/]/', '', $rel_dir);
|
||||||
|
|
||||||
|
$ecmfile->filepath = $rel_dir;
|
||||||
|
$ecmfile->filename = $filename;
|
||||||
|
$ecmfile->label = md5_file(dol_osencode($filearray[$key]['fullname'])); // $destfile is a full path to file
|
||||||
|
$ecmfile->fullpath_orig = $filearray[$key]['fullname'];
|
||||||
|
$ecmfile->gen_or_uploaded = 'unknown';
|
||||||
|
$ecmfile->description = ''; // indexed content
|
||||||
|
$ecmfile->keyword = ''; // keyword content
|
||||||
|
$result = $ecmfile->create($user);
|
||||||
|
if ($result < 0)
|
||||||
|
{
|
||||||
|
setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$filearray[$key]['rowid']=$result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$filearray[$key]['rowid']=0; // Should not happened
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*var_dump($filearray);
|
||||||
|
var_dump($sortfield);
|
||||||
|
var_dump($sortorder);*/
|
||||||
|
|
||||||
|
if ($sortfield && $sortorder)
|
||||||
|
{
|
||||||
|
$filearray=dol_sort_array($filearray, $sortfield, $sortorder);
|
||||||
|
}
|
||||||
|
//var_dump($filearray);
|
||||||
|
}
|
||||||
|
|
||||||
|
$nboffiles=count($filearray);
|
||||||
if ($nboffiles > 0) include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
|
if ($nboffiles > 0) include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
|
||||||
|
|
||||||
$var=true;
|
$var=true; $i=0; $nboflines = 0; $lastrowid=0;
|
||||||
foreach($filearray as $key => $file) // filearray must be only files here
|
foreach($filearray as $key => $file) // filearray must be only files here
|
||||||
{
|
{
|
||||||
if ($file['name'] != '.'
|
if ($file['name'] != '.'
|
||||||
&& $file['name'] != '..'
|
&& $file['name'] != '..'
|
||||||
&& ! preg_match('/\.meta$/i',$file['name']))
|
&& ! preg_match('/\.meta$/i',$file['name']))
|
||||||
{
|
{
|
||||||
// Define relative path used to store the file
|
|
||||||
if (empty($relativepath))
|
|
||||||
{
|
|
||||||
$relativepath=(! empty($object->ref)?dol_sanitizeFileName($object->ref):'').'/';
|
|
||||||
if ($object->element == 'invoice_supplier') $relativepath=get_exdir($object->id,2,0,0,$object,'invoice_supplier').$relativepath; // TODO Call using a defined value for $relativepath
|
|
||||||
if ($object->element == 'project_task') $relativepath='Call_not_supported_._Call_function_using_a_defined_relative_path_.';
|
|
||||||
}
|
|
||||||
// For backward compatiblity, we detect file is stored into an old path
|
|
||||||
if (! empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO) && $file['level1name'] == 'photos')
|
|
||||||
{
|
|
||||||
$relativepath=preg_replace('/^.*\/produit\//','',$file['path']).'/';
|
|
||||||
}
|
|
||||||
$var=!$var;
|
$var=!$var;
|
||||||
|
|
||||||
$editline=0;
|
if ($filearray[$key]['rowid'] > 0) $lastrowid = $filearray[$key]['rowid'];
|
||||||
|
|
||||||
print '<!-- Line list_of_documents '.$key.' -->'."\n";
|
$editline=0;
|
||||||
print '<tr '.$bc[$var].'>';
|
$nboflines++;
|
||||||
|
print '<!-- Line list_of_documents '.$key.' relativepath = '.$relativepath.' -->'."\n";
|
||||||
|
// Do we have entry into database ?
|
||||||
|
print '<!-- In database: position='.$filearray[$key]['position'].' -->'."\n";
|
||||||
|
print '<tr id="row-'.($filearray[$key]['rowid']>0?$filearray[$key]['rowid']:'-AFTER'.$lastrowid.'POS'.($i+1)).'" '.$bcdd[$var].'>';
|
||||||
print '<td class="tdoverflow">';
|
print '<td class="tdoverflow">';
|
||||||
|
|
||||||
//print "XX".$file['name']; //$file['name'] must be utf8
|
//print "XX".$file['name']; //$file['name'] must be utf8
|
||||||
@ -1074,6 +1172,24 @@ class FormFile
|
|||||||
print '<a href="'.(($useinecm && $useajax)?'#':$url.'?action=delete&urlfile='.urlencode($filepath).$param).'" class="deletefilelink" rel="'.$filepath.'">'.img_delete().'</a>';
|
print '<a href="'.(($useinecm && $useajax)?'#':$url.'?action=delete&urlfile='.urlencode($filepath).$param).'" class="deletefilelink" rel="'.$filepath.'">'.img_delete().'</a>';
|
||||||
}
|
}
|
||||||
print "</td>";
|
print "</td>";
|
||||||
|
|
||||||
|
if (empty($disablemove))
|
||||||
|
{
|
||||||
|
if ($nboffiles > 1 && empty($conf->browser->phone)) {
|
||||||
|
print '<td align="center" class="linecolmove tdlineupdown">';
|
||||||
|
if ($i > 0) {
|
||||||
|
print '<a class="lineupdown" href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&action=up&rowid='.$line->id.'">'.img_up('default',0,'imgupforline').'</a>';
|
||||||
|
}
|
||||||
|
if ($i < $nboffiles-1) {
|
||||||
|
print '<a class="lineupdown" href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&action=down&rowid='.$line->id.'">'.img_down('default',0,'imgdownforline').'</a>';
|
||||||
|
}
|
||||||
|
print '</td>';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
print '<td align="center"'.((empty($conf->browser->phone) && empty($disablemove)) ?' class="linecolmove tdlineupdown"':' class="linecolmove"').'>';
|
||||||
|
print '</td>';
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1081,18 +1197,32 @@ class FormFile
|
|||||||
print '<input type="submit" class="button" name="renamefilesave" value="'.dol_escape_htmltag($langs->trans("Save")).'">';
|
print '<input type="submit" class="button" name="renamefilesave" value="'.dol_escape_htmltag($langs->trans("Save")).'">';
|
||||||
print '<input type="submit" class="button" name="cancel" value="'.dol_escape_htmltag($langs->trans("Cancel")).'">';
|
print '<input type="submit" class="button" name="cancel" value="'.dol_escape_htmltag($langs->trans("Cancel")).'">';
|
||||||
print '</td>';
|
print '</td>';
|
||||||
|
if (empty($disablemove)) print '<td class="right"></td>';
|
||||||
}
|
}
|
||||||
print "</tr>\n";
|
print "</tr>\n";
|
||||||
|
|
||||||
|
$i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($nboffiles == 0)
|
if ($nboffiles == 0)
|
||||||
{
|
{
|
||||||
print '<tr '.$bc[false].'><td colspan="'.(empty($useinecm)?'5':'5').'" class="opacitymedium">';
|
$colspan=(empty($useinecm)?'5':'5');
|
||||||
|
if (empty($disablemove)) $colspan++;
|
||||||
|
print '<tr '.$bc[false].'><td colspan="'.$colspan.'" class="opacitymedium">';
|
||||||
if (empty($textifempty)) print $langs->trans("NoFileFound");
|
if (empty($textifempty)) print $langs->trans("NoFileFound");
|
||||||
else print $textifempty;
|
else print $textifempty;
|
||||||
print '</td></tr>';
|
print '</td></tr>';
|
||||||
}
|
}
|
||||||
print "</table>";
|
print "</table>";
|
||||||
|
|
||||||
|
|
||||||
|
if (! $editline && $nboflines > 1) {
|
||||||
|
if (! empty($conf->use_javascript_ajax) && $permtoeditline) {
|
||||||
|
$table_element_line = 'ecm_files';
|
||||||
|
include DOL_DOCUMENT_ROOT . '/core/tpl/ajaxrow.tpl.php';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (GETPOST('action') == 'editfile' && $permtoeditline)
|
if (GETPOST('action') == 'editfile' && $permtoeditline)
|
||||||
{
|
{
|
||||||
print '</form>';
|
print '</form>';
|
||||||
|
|||||||
@ -79,7 +79,7 @@ class FormProjets
|
|||||||
$project->fetch($selected);
|
$project->fetch($selected);
|
||||||
$selected_input_value=$project->ref;
|
$selected_input_value=$project->ref;
|
||||||
}
|
}
|
||||||
$urloption='socid='.$socid.'&htmlname='.$htmlname;
|
$urloption='socid='.$socid.'&htmlname='.$htmlname.'&discardclosed='.$discard_closed;
|
||||||
$out.=ajax_autocompleter($selected, $htmlname, DOL_URL_ROOT.'/projet/ajax/projects.php', $urloption, $conf->global->PROJECT_USE_SEARCH_TO_SELECT, 0, array(
|
$out.=ajax_autocompleter($selected, $htmlname, DOL_URL_ROOT.'/projet/ajax/projects.php', $urloption, $conf->global->PROJECT_USE_SEARCH_TO_SELECT, 0, array(
|
||||||
// 'update' => array(
|
// 'update' => array(
|
||||||
// 'projectid' => 'id'
|
// 'projectid' => 'id'
|
||||||
@ -458,13 +458,16 @@ class FormProjets
|
|||||||
if ($table_element == 'projet_task') return ''; // Special cas of element we never link to a project (already always done)
|
if ($table_element == 'projet_task') return ''; // Special cas of element we never link to a project (already always done)
|
||||||
|
|
||||||
$linkedtothirdparty=false;
|
$linkedtothirdparty=false;
|
||||||
if (! in_array($table_element, array('don','expensereport_det','expensereport'))) $linkedtothirdparty=true;
|
if (! in_array($table_element, array('don','expensereport_det','expensereport','loan'))) $linkedtothirdparty=true;
|
||||||
|
|
||||||
$sqlfilter='';
|
$sqlfilter='';
|
||||||
$projectkey="fk_projet";
|
$projectkey="fk_projet";
|
||||||
//print $table_element;
|
//print $table_element;
|
||||||
switch ($table_element)
|
switch ($table_element)
|
||||||
{
|
{
|
||||||
|
case "loan":
|
||||||
|
$sql = "SELECT t.rowid, t.label as ref";
|
||||||
|
break;
|
||||||
case "facture":
|
case "facture":
|
||||||
$sql = "SELECT t.rowid, t.facnumber as ref";
|
$sql = "SELECT t.rowid, t.facnumber as ref";
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -278,11 +278,19 @@ class Notify
|
|||||||
*/
|
*/
|
||||||
function send($notifcode, $object)
|
function send($notifcode, $object)
|
||||||
{
|
{
|
||||||
global $user,$conf,$langs,$mysoc,$dolibarr_main_url_root;
|
global $user,$conf,$langs,$mysoc;
|
||||||
|
global $hookmanager;
|
||||||
|
global $dolibarr_main_url_root;
|
||||||
|
|
||||||
if (! in_array($notifcode, $this->arrayofnotifsupported)) return 0;
|
if (! in_array($notifcode, $this->arrayofnotifsupported)) return 0;
|
||||||
|
|
||||||
include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
|
include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
|
||||||
|
if (! is_object($hookmanager))
|
||||||
|
{
|
||||||
|
include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
|
||||||
|
$hookmanager=new HookManager($this->db);
|
||||||
|
}
|
||||||
|
$hookmanager->initHooks(array('notification'));
|
||||||
|
|
||||||
dol_syslog(get_class($this)."::send notifcode=".$notifcode.", object=".$object->id);
|
dol_syslog(get_class($this)."::send notifcode=".$notifcode.", object=".$object->id);
|
||||||
|
|
||||||
@ -294,8 +302,8 @@ class Notify
|
|||||||
//$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
|
//$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
|
||||||
|
|
||||||
// Define some vars
|
// Define some vars
|
||||||
$application = $mysoc->name;
|
$application = 'Dolibarr';
|
||||||
//if (! empty($conf->global->MAIN_APPLICATION_TITLE)) $application = $conf->global->MAIN_APPLICATION_TITLE;
|
if (! empty($conf->global->MAIN_APPLICATION_TITLE)) $application = $conf->global->MAIN_APPLICATION_TITLE;
|
||||||
$replyto = $conf->notification->email_from;
|
$replyto = $conf->notification->email_from;
|
||||||
$filename = basename($file);
|
$filename = basename($file);
|
||||||
$mimefile = dol_mimetype($file);
|
$mimefile = dol_mimetype($file);
|
||||||
@ -321,18 +329,7 @@ class Notify
|
|||||||
|
|
||||||
// Check notification per user
|
// Check notification per user
|
||||||
$sql.= "\nUNION\n";
|
$sql.= "\nUNION\n";
|
||||||
/*
|
|
||||||
$sql.= "SELECT 1 as user, c.email, c.rowid as cid, c.lastname, c.firstname, '$langs->defaultlang' as default_lang,";
|
|
||||||
$sql.= " a.rowid as adid, a.label, a.code, n.rowid, n.type";
|
|
||||||
$sql.= " FROM ".MAIN_DB_PREFIX."user as c,";
|
|
||||||
$sql.= " ".MAIN_DB_PREFIX."c_action_trigger as a,";
|
|
||||||
$sql.= " ".MAIN_DB_PREFIX."notify_def as n,";
|
|
||||||
$sql.= " ".MAIN_DB_PREFIX."element_contact as ec";
|
|
||||||
$sql.= " WHERE n.fk_user = c.rowid AND a.rowid = n.fk_action";
|
|
||||||
$sql.= " AND n.fk_user = ec.fk_socpeople";
|
|
||||||
if (is_numeric($notifcode)) $sql.= " AND n.fk_action = ".$notifcode; // Old usage
|
|
||||||
else $sql.= " AND a.code = '".$notifcode."'"; // New usage
|
|
||||||
$sql .= " AND ec.element_id = ".$object->id;*/
|
|
||||||
$sql.= "SELECT 'touserid' as type_target, c.email, c.rowid as cid, c.lastname, c.firstname, c.lang as default_lang,";
|
$sql.= "SELECT 'touserid' as type_target, c.email, c.rowid as cid, c.lastname, c.firstname, c.lang as default_lang,";
|
||||||
$sql.= " a.rowid as adid, a.label, a.code, n.rowid, n.type";
|
$sql.= " a.rowid as adid, a.label, a.code, n.rowid, n.type";
|
||||||
$sql.= " FROM ".MAIN_DB_PREFIX."user as c,";
|
$sql.= " FROM ".MAIN_DB_PREFIX."user as c,";
|
||||||
@ -367,6 +364,8 @@ class Notify
|
|||||||
$outputlangs->setDefaultLang($obj->default_lang);
|
$outputlangs->setDefaultLang($obj->default_lang);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$subject = '['.$mysoc->name.'] '.$outputlangs->transnoentitiesnoconv("DolibarrNotification");
|
||||||
|
|
||||||
switch ($notifcode) {
|
switch ($notifcode) {
|
||||||
case 'BILL_VALIDATE':
|
case 'BILL_VALIDATE':
|
||||||
$link='/compta/facture.php?facid='.$object->id;
|
$link='/compta/facture.php?facid='.$object->id;
|
||||||
@ -446,14 +445,20 @@ class Notify
|
|||||||
$filepdf = $pdf_path;
|
$filepdf = $pdf_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
$subject = '['.$application.'] '.$outputlangs->transnoentitiesnoconv("DolibarrNotification");
|
|
||||||
|
|
||||||
$message = $outputlangs->transnoentities("YouReceiveMailBecauseOfNotification",$application,$mysoc->name)."\n";
|
$message = $outputlangs->transnoentities("YouReceiveMailBecauseOfNotification",$application,$mysoc->name)."\n";
|
||||||
$message.= $outputlangs->transnoentities("YouReceiveMailBecauseOfNotification2",$application,$mysoc->name)."\n";
|
$message.= $outputlangs->transnoentities("YouReceiveMailBecauseOfNotification2",$application,$mysoc->name)."\n";
|
||||||
$message.= "\n";
|
$message.= "\n";
|
||||||
$message.= $mesg;
|
$message.= $mesg;
|
||||||
if ($link) $message=dol_concatdesc($message,$urlwithroot.$link);
|
if ($link) $message=dol_concatdesc($message,$urlwithroot.$link);
|
||||||
|
|
||||||
|
$parameters=array('notifcode'=>$notifcode, 'sendto'=>$sendto, 'replyto'=>$replyto, 'file'=>$file, 'mimefile'=>$mimefile, 'filename'=>$filename);
|
||||||
|
$reshook=$hookmanager->executeHooks('formatNotificationMessage',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks
|
||||||
|
if (empty($reshook))
|
||||||
|
{
|
||||||
|
if (! empty($hookmanager->resArray['subject'])) $subject.=$hookmanager->resArray['subject'];
|
||||||
|
if (! empty($hookmanager->resArray['message'])) $message.=$hookmanager->resArray['message'];
|
||||||
|
}
|
||||||
|
|
||||||
$mailfile = new CMailFile(
|
$mailfile = new CMailFile(
|
||||||
$subject,
|
$subject,
|
||||||
$sendto,
|
$sendto,
|
||||||
@ -535,7 +540,9 @@ class Notify
|
|||||||
$link = '';
|
$link = '';
|
||||||
$num++;
|
$num++;
|
||||||
|
|
||||||
switch ($notifcode) {
|
$subject = '['.$mysoc->name.'] '.$langs->transnoentitiesnoconv("DolibarrNotification");
|
||||||
|
|
||||||
|
switch ($notifcode) {
|
||||||
case 'BILL_VALIDATE':
|
case 'BILL_VALIDATE':
|
||||||
$link='/compta/facture.php?facid='.$object->id;
|
$link='/compta/facture.php?facid='.$object->id;
|
||||||
$dir_output = $conf->facture->dir_output;
|
$dir_output = $conf->facture->dir_output;
|
||||||
@ -622,8 +629,6 @@ class Notify
|
|||||||
$filepdf = $pdf_path;
|
$filepdf = $pdf_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
$subject = '['.$application.'] '.$langs->transnoentitiesnoconv("DolibarrNotification");
|
|
||||||
|
|
||||||
$message = $langs->transnoentities("YouReceiveMailBecauseOfNotification",$application,$mysoc->name)."\n";
|
$message = $langs->transnoentities("YouReceiveMailBecauseOfNotification",$application,$mysoc->name)."\n";
|
||||||
$message.= $langs->transnoentities("YouReceiveMailBecauseOfNotification2",$application,$mysoc->name)."\n";
|
$message.= $langs->transnoentities("YouReceiveMailBecauseOfNotification2",$application,$mysoc->name)."\n";
|
||||||
$message.= "\n";
|
$message.= "\n";
|
||||||
@ -648,7 +653,15 @@ class Notify
|
|||||||
|
|
||||||
if ($sendto)
|
if ($sendto)
|
||||||
{
|
{
|
||||||
$mailfile = new CMailFile(
|
$parameters=array('notifcode'=>$notifcode, 'sendto'=>$sendto, 'replyto'=>$replyto, 'file'=>$file, 'mimefile'=>$mimefile, 'filename'=>$filename);
|
||||||
|
$reshook=$hookmanager->executeHooks('formatNotificationMessage',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks
|
||||||
|
if (empty($reshook))
|
||||||
|
{
|
||||||
|
if (! empty($hookmanager->resArray['subject'])) $subject.=$hookmanager->resArray['subject'];
|
||||||
|
if (! empty($hookmanager->resArray['message'])) $message.=$hookmanager->resArray['message'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$mailfile = new CMailFile(
|
||||||
$subject,
|
$subject,
|
||||||
$sendto,
|
$sendto,
|
||||||
$replyto,
|
$replyto,
|
||||||
|
|||||||
@ -965,7 +965,7 @@ function show_actions_todo($conf,$langs,$db,$filterobj,$objcon='',$noprint=0,$ac
|
|||||||
* @return mixed Return html part or void if noprint is 1
|
* @return mixed Return html part or void if noprint is 1
|
||||||
* TODO change function to be able to list event linked to an object.
|
* TODO change function to be able to list event linked to an object.
|
||||||
*/
|
*/
|
||||||
function show_actions_done($conf, $langs, $db, $filterobj, $objcon='', $noprint=0, $actioncode='', $donetodo='done', $filters=array(), $sortfield='a.datep, a.id', $sortorder='DESC')
|
function show_actions_done($conf, $langs, $db, $filterobj, $objcon='', $noprint=0, $actioncode='', $donetodo='done', $filters=array(), $sortfield='a.datep,a.id', $sortorder='DESC')
|
||||||
{
|
{
|
||||||
global $bc,$user,$conf;
|
global $bc,$user,$conf;
|
||||||
global $form;
|
global $form;
|
||||||
@ -1183,7 +1183,7 @@ function show_actions_done($conf, $langs, $db, $filterobj, $objcon='', $noprint=
|
|||||||
}
|
}
|
||||||
$out.=getTitleFieldOfList($langs->trans("Ref"), 0, $_SERVER["PHP_SELF"], 'a.id', '', $param, '', $sortfield, $sortorder);
|
$out.=getTitleFieldOfList($langs->trans("Ref"), 0, $_SERVER["PHP_SELF"], 'a.id', '', $param, '', $sortfield, $sortorder);
|
||||||
$out.='<td class="maxwidth100onsmartphone">'.$langs->trans("Label").'</td>';
|
$out.='<td class="maxwidth100onsmartphone">'.$langs->trans("Label").'</td>';
|
||||||
$out.=getTitleFieldOfList($langs->trans("Date"), 0, $_SERVER["PHP_SELF"], 'a.datep, a.id', '', $param, '', $sortfield, $sortorder);
|
$out.=getTitleFieldOfList($langs->trans("Date"), 0, $_SERVER["PHP_SELF"], 'a.datep,a.id', '', $param, '', $sortfield, $sortorder);
|
||||||
$out.='<td>'.$langs->trans("Type").'</td>';
|
$out.='<td>'.$langs->trans("Type").'</td>';
|
||||||
$out.='<td></td>';
|
$out.='<td></td>';
|
||||||
$out.='<td></td>';
|
$out.='<td></td>';
|
||||||
|
|||||||
@ -41,7 +41,7 @@ function dol_basename($pathfile)
|
|||||||
* Scan a directory and return a list of files/directories.
|
* Scan a directory and return a list of files/directories.
|
||||||
* Content for string is UTF8 and dir separator is "/".
|
* Content for string is UTF8 and dir separator is "/".
|
||||||
*
|
*
|
||||||
* @param string $path Starting path from which to search
|
* @param string $path Starting path from which to search. This is a full path.
|
||||||
* @param string $types Can be "directories", "files", or "all"
|
* @param string $types Can be "directories", "files", or "all"
|
||||||
* @param int $recursive Determines whether subdirectories are searched
|
* @param int $recursive Determines whether subdirectories are searched
|
||||||
* @param string $filter Regex filter to restrict list. This regex value must be escaped for '/', since this char is used for preg_match function
|
* @param string $filter Regex filter to restrict list. This regex value must be escaped for '/', since this char is used for preg_match function
|
||||||
@ -50,7 +50,8 @@ function dol_basename($pathfile)
|
|||||||
* @param string $sortorder Sort order (SORT_ASC, SORT_DESC)
|
* @param string $sortorder Sort order (SORT_ASC, SORT_DESC)
|
||||||
* @param int $mode 0=Return array minimum keys loaded (faster), 1=Force all keys like date and size to be loaded (slower), 2=Force load of date only, 3=Force load of size only
|
* @param int $mode 0=Return array minimum keys loaded (faster), 1=Force all keys like date and size to be loaded (slower), 2=Force load of date only, 3=Force load of size only
|
||||||
* @param int $nohook Disable all hooks
|
* @param int $nohook Disable all hooks
|
||||||
* @return array Array of array('name'=>'xxx','fullname'=>'/abc/xxx','date'=>'yyy','size'=>99,'type'=>'dir|file')
|
* @return array Array of array('name'=>'xxx','fullname'=>'/abc/xxx','date'=>'yyy','size'=>99,'type'=>'dir|file',...)
|
||||||
|
* @see dol_dir_list_indatabase
|
||||||
*/
|
*/
|
||||||
function dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter="", $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=false)
|
function dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter="", $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=false)
|
||||||
{
|
{
|
||||||
@ -87,7 +88,7 @@ function dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefil
|
|||||||
}
|
}
|
||||||
|
|
||||||
// $reshook may contain returns stacked by other modules
|
// $reshook may contain returns stacked by other modules
|
||||||
// $reshook is always empty with an array for can not lose returns stacked with other modules
|
// $reshook is always empty with an array to not lose returns stacked with other modules
|
||||||
// $hookmanager->resArray may contain array stacked by other modules
|
// $hookmanager->resArray may contain array stacked by other modules
|
||||||
if (! $nohook && ! empty($hookmanager->resArray)) // forced to use $hookmanager->resArray even if $hookmanager->resArray['nodes'] is empty
|
if (! $nohook && ! empty($hookmanager->resArray)) // forced to use $hookmanager->resArray even if $hookmanager->resArray['nodes'] is empty
|
||||||
{
|
{
|
||||||
@ -205,6 +206,84 @@ function dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefil
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scan a directory and return a list of files/directories.
|
||||||
|
* Content for string is UTF8 and dir separator is "/".
|
||||||
|
*
|
||||||
|
* @param string $path Starting path from which to search. Example: 'produit/MYPROD'
|
||||||
|
* @param string $filter Regex filter to restrict list. This regex value must be escaped for '/', since this char is used for preg_match function
|
||||||
|
* @param array|null $excludefilter Array of Regex for exclude filter (example: array('(\.meta|_preview\.png)$','^\.'))
|
||||||
|
* @param string $sortcriteria Sort criteria ("","fullname","name","date","size")
|
||||||
|
* @param string $sortorder Sort order (SORT_ASC, SORT_DESC)
|
||||||
|
* @param int $mode 0=Return array minimum keys loaded (faster), 1=Force all keys like description
|
||||||
|
* @return array Array of array('name'=>'xxx','fullname'=>'/abc/xxx','type'=>'dir|file',...)
|
||||||
|
* @see dol_dir_list
|
||||||
|
*/
|
||||||
|
function dol_dir_list_in_database($path, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0)
|
||||||
|
{
|
||||||
|
global $conf, $db;
|
||||||
|
|
||||||
|
$sql=" SELECT rowid, label, entity, filename, filepath, fullpath_orig, keywords, cover, gen_or_uploaded, extraparams, date_c, date_m, fk_user_c, fk_user_m, acl, position";
|
||||||
|
if ($mode) $sql.=", description";
|
||||||
|
$sql.=" FROM ".MAIN_DB_PREFIX."ecm_files";
|
||||||
|
$sql.=" WHERE filepath = '".$db->escape($path)."'";
|
||||||
|
$sql.=" AND entity = ".$conf->entity;
|
||||||
|
|
||||||
|
$resql = $db->query($sql);
|
||||||
|
if ($resql)
|
||||||
|
{
|
||||||
|
$file_list=array();
|
||||||
|
$num = $db->num_rows($resql);
|
||||||
|
$i = 0;
|
||||||
|
while ($i < $num)
|
||||||
|
{
|
||||||
|
$obj = $db->fetch_object($resql);
|
||||||
|
if ($obj)
|
||||||
|
{
|
||||||
|
preg_match('/([^\/]+)\/[^\/]+$/',DOL_DATA_ROOT.'/'.$obj->filepath.'/'.$obj->filename,$reg);
|
||||||
|
$level1name=(isset($reg[1])?$reg[1]:'');
|
||||||
|
$file_list[] = array(
|
||||||
|
"rowid" => $obj->rowid,
|
||||||
|
"label" => $obj->label, // md5
|
||||||
|
"name" => $obj->filename,
|
||||||
|
"path" => DOL_DATA_ROOT.'/'.$obj->filepath,
|
||||||
|
"level1name" => $level1name,
|
||||||
|
"fullname" => DOL_DATA_ROOT.'/'.$obj->filepath.'/'.$obj->filename,
|
||||||
|
"fullpath_orig" => $obj->fullpath_orig,
|
||||||
|
"date_c" => $db->jdate($obj->date_c),
|
||||||
|
"date_m" => $db->jdate($obj->date_m),
|
||||||
|
"type" => 'file',
|
||||||
|
"keywords" => $obj->keywords,
|
||||||
|
"cover" => $obj->cover,
|
||||||
|
"position" => (int) $obj->position,
|
||||||
|
"acl" => $obj->acl
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Obtain a list of columns
|
||||||
|
if (! empty($sortcriteria))
|
||||||
|
{
|
||||||
|
$myarray=array();
|
||||||
|
foreach ($file_list as $key => $row)
|
||||||
|
{
|
||||||
|
$myarray[$key] = (isset($row[$sortcriteria])?$row[$sortcriteria]:'');
|
||||||
|
}
|
||||||
|
// Sort the data
|
||||||
|
if ($sortorder) array_multisort($myarray, $sortorder, $file_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $file_list;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dol_print_error($db);
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fast compare of 2 files identified by their properties ->name, ->date and ->size
|
* Fast compare of 2 files identified by their properties ->name, ->date and ->size
|
||||||
*
|
*
|
||||||
@ -497,11 +576,19 @@ function dolCopyDir($srcfile, $destfile, $newmask, $overwriteifexists)
|
|||||||
*/
|
*/
|
||||||
function dol_move($srcfile, $destfile, $newmask=0, $overwriteifexists=1)
|
function dol_move($srcfile, $destfile, $newmask=0, $overwriteifexists=1)
|
||||||
{
|
{
|
||||||
global $conf;
|
global $user, $db, $conf;
|
||||||
$result=false;
|
$result=false;
|
||||||
|
|
||||||
dol_syslog("files.lib.php::dol_move srcfile=".$srcfile." destfile=".$destfile." newmask=".$newmask." overwritifexists=".$overwriteifexists);
|
dol_syslog("files.lib.php::dol_move srcfile=".$srcfile." destfile=".$destfile." newmask=".$newmask." overwritifexists=".$overwriteifexists);
|
||||||
|
$srcexists=dol_is_file($srcfile);
|
||||||
$destexists=dol_is_file($destfile);
|
$destexists=dol_is_file($destfile);
|
||||||
|
|
||||||
|
if (! $srcexists)
|
||||||
|
{
|
||||||
|
dol_syslog("files.lib.php::dol_move srcfile does not exists. we ignore the move request.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if ($overwriteifexists || ! $destexists)
|
if ($overwriteifexists || ! $destexists)
|
||||||
{
|
{
|
||||||
$newpathofsrcfile=dol_osencode($srcfile);
|
$newpathofsrcfile=dol_osencode($srcfile);
|
||||||
@ -512,13 +599,68 @@ function dol_move($srcfile, $destfile, $newmask=0, $overwriteifexists=1)
|
|||||||
{
|
{
|
||||||
if ($destexists)
|
if ($destexists)
|
||||||
{
|
{
|
||||||
dol_syslog("files.lib.php::dol_move failed. We try to delete first and move after.", LOG_WARNING);
|
dol_syslog("files.lib.php::dol_move Failed. We try to delete target first and move after.", LOG_WARNING);
|
||||||
// We force delete and try again. Rename function sometimes fails to replace dest file with some windows NTFS partitions.
|
// We force delete and try again. Rename function sometimes fails to replace dest file with some windows NTFS partitions.
|
||||||
dol_delete_file($destfile);
|
dol_delete_file($destfile);
|
||||||
$result=@rename($newpathofsrcfile, $newpathofdestfile); // To see errors, remove @
|
$result=@rename($newpathofsrcfile, $newpathofdestfile); // To see errors, remove @
|
||||||
}
|
}
|
||||||
else dol_syslog("files.lib.php::dol_move failed", LOG_WARNING);
|
else dol_syslog("files.lib.php::dol_move Failed.", LOG_WARNING);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Move ok
|
||||||
|
if ($result)
|
||||||
|
{
|
||||||
|
// Rename entry into ecm database
|
||||||
|
$rel_filetorenamebefore = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $srcfile);
|
||||||
|
$rel_filetorenameafter = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $destfile);
|
||||||
|
if (! preg_match('/(\/temp\/|\/thumbs|\.meta$)/', $rel_filetorenameafter)) // If not a tmp file
|
||||||
|
{
|
||||||
|
$rel_filetorenamebefore = preg_replace('/^[\\/]/', '', $rel_filetorenamebefore);
|
||||||
|
$rel_filetorenameafter = preg_replace('/^[\\/]/', '', $rel_filetorenameafter);
|
||||||
|
//var_dump($rel_filetorenamebefore.' - '.$rel_filetorenameafter);
|
||||||
|
|
||||||
|
dol_syslog("Try to rename also entries in database for full relative path before = ".$rel_filetorenamebefore." after = ".$rel_filetorenameafter, LOG_DEBUG);
|
||||||
|
include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
|
||||||
|
$ecmfile=new EcmFiles($db);
|
||||||
|
$result = $ecmfile->fetch(0, '', $rel_filetorenamebefore);
|
||||||
|
if ($result > 0) // If found
|
||||||
|
{
|
||||||
|
$filename = basename($rel_filetorenameafter);
|
||||||
|
$rel_dir = dirname($rel_filetorenameafter);
|
||||||
|
$rel_dir = preg_replace('/[\\/]$/', '', $rel_dir);
|
||||||
|
$rel_dir = preg_replace('/^[\\/]/', '', $rel_dir);
|
||||||
|
|
||||||
|
$ecmfile->filepath = $rel_dir;
|
||||||
|
$ecmfile->filename = $filename;
|
||||||
|
$result = $ecmfile->update($user);
|
||||||
|
}
|
||||||
|
elseif ($result == 0) // If not found
|
||||||
|
{
|
||||||
|
$filename = basename($rel_filetorenameafter);
|
||||||
|
$rel_dir = dirname($rel_filetorenameafter);
|
||||||
|
$rel_dir = preg_replace('/[\\/]$/', '', $rel_dir);
|
||||||
|
$rel_dir = preg_replace('/^[\\/]/', '', $rel_dir);
|
||||||
|
|
||||||
|
$ecmfile->filepath = $rel_dir;
|
||||||
|
$ecmfile->filename = $filename;
|
||||||
|
$ecmfile->label = md5_file(dol_osencode($destfile)); // $destfile is a full path to file
|
||||||
|
$ecmfile->fullpath_orig = $srcfile;
|
||||||
|
$ecmfile->gen_or_uploaded = 'unknown';
|
||||||
|
$ecmfile->description = ''; // indexed content
|
||||||
|
$ecmfile->keyword = ''; // keyword content
|
||||||
|
$result = $ecmfile->create($user);
|
||||||
|
if ($result < 0)
|
||||||
|
{
|
||||||
|
setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elseif ($result < 0)
|
||||||
|
{
|
||||||
|
setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (empty($newmask)) $newmask=empty($conf->global->MAIN_UMASK)?'0755':$conf->global->MAIN_UMASK;
|
if (empty($newmask)) $newmask=empty($conf->global->MAIN_UMASK)?'0755':$conf->global->MAIN_UMASK;
|
||||||
$newmaskdec=octdec($newmask);
|
$newmaskdec=octdec($newmask);
|
||||||
// Currently method is restricted to files (dol_delete_files previously used is for files, and mask usage if for files too)
|
// Currently method is restricted to files (dol_delete_files previously used is for files, and mask usage if for files too)
|
||||||
@ -743,10 +885,33 @@ function dol_delete_file($file,$disableglob=0,$nophperrors=0,$nohook=0,$object=n
|
|||||||
{
|
{
|
||||||
if ($nophperrors) $ok=@unlink($filename);
|
if ($nophperrors) $ok=@unlink($filename);
|
||||||
else $ok=unlink($filename);
|
else $ok=unlink($filename);
|
||||||
if ($ok) dol_syslog("Removed file ".$filename, LOG_DEBUG);
|
if ($ok)
|
||||||
|
{
|
||||||
|
dol_syslog("Removed file ".$filename, LOG_DEBUG);
|
||||||
|
|
||||||
|
// Delete entry into ecm database
|
||||||
|
$rel_filetodelete = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $filename);
|
||||||
|
if (! preg_match('/(\/temp\/|\/thumbs\/|\.meta$)/', $rel_filetodelete)) // If not a tmp file
|
||||||
|
{
|
||||||
|
$rel_filetodelete = preg_replace('/^[\\/]/', '', $rel_filetodelete);
|
||||||
|
|
||||||
|
dol_syslog("Try to remove also entries in database for full relative path = ".$rel_filetodelete, LOG_DEBUG);
|
||||||
|
include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
|
||||||
|
$ecmfile=new EcmFiles($db);
|
||||||
|
$result = $ecmfile->fetch(0, '', $rel_filetodelete);
|
||||||
|
if ($result >= 0)
|
||||||
|
{
|
||||||
|
$result = $ecmfile->delete($user);
|
||||||
|
}
|
||||||
|
if ($result < 0)
|
||||||
|
{
|
||||||
|
setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else dol_syslog("Failed to remove file ".$filename, LOG_WARNING);
|
else dol_syslog("Failed to remove file ".$filename, LOG_WARNING);
|
||||||
// TODO Failure to remove can be because file was already removed or because of permission
|
// TODO Failure to remove can be because file was already removed or because of permission
|
||||||
// If error because of not exists, we must can return true but we should return false if this is a permission problem
|
// If error because of not exists, we must should return true and we should return false if this is a permission problem
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else dol_syslog("No files to delete found", LOG_WARNING);
|
else dol_syslog("No files to delete found", LOG_WARNING);
|
||||||
@ -995,12 +1160,12 @@ function dol_init_file_process($pathtoscan='', $trackid='')
|
|||||||
* All information used are in db, conf, langs, user and _FILES.
|
* All information used are in db, conf, langs, user and _FILES.
|
||||||
* Note: This function can be used only into a HTML page context.
|
* Note: This function can be used only into a HTML page context.
|
||||||
*
|
*
|
||||||
* @param string $upload_dir Directory where to store uploaded file (note: also find in first part of dest_file)
|
* @param string $upload_dir Directory where to store uploaded file (note: used to forge $destpath = $upload_dir + filename)
|
||||||
* @param int $allowoverwrite 1=Allow overwrite existing file
|
* @param int $allowoverwrite 1=Allow overwrite existing file
|
||||||
* @param int $donotupdatesession 1=Do no edit _SESSION variable
|
* @param int $donotupdatesession 1=Do no edit _SESSION variable
|
||||||
* @param string $varfiles _FILES var name
|
* @param string $varfiles _FILES var name
|
||||||
* @param string $savingdocmask Mask to use to define output filename. For example 'XXXXX-__YYYYMMDD__-__file__'
|
* @param string $savingdocmask Mask to use to define output filename. For example 'XXXXX-__YYYYMMDD__-__file__'
|
||||||
* @param string $link Link to add
|
* @param string $link Link to add (to add a link instead of a file)
|
||||||
* @param string $trackid Track id (used to prefix name of session vars to avoid conflict)
|
* @param string $trackid Track id (used to prefix name of session vars to avoid conflict)
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
@ -1026,47 +1191,80 @@ function dol_add_file_process($upload_dir, $allowoverwrite=0, $donotupdatesessio
|
|||||||
|
|
||||||
for ($i = 0; $i < $nbfile; $i++)
|
for ($i = 0; $i < $nbfile; $i++)
|
||||||
{
|
{
|
||||||
// Define $destpath (path to file including filename) and $destfile (only filename)
|
// Define $destfull (path to file including filename) and $destfile (only filename)
|
||||||
$destpath=$upload_dir . "/" . $TFile['name'][$i];
|
$destfull=$upload_dir . "/" . $TFile['name'][$i];
|
||||||
$destfile=$TFile['name'][$i];
|
$destfile=$TFile['name'][$i];
|
||||||
|
|
||||||
$savingdocmask = dol_sanitizeFileName($savingdocmask);
|
$savingdocmask = dol_sanitizeFileName($savingdocmask);
|
||||||
|
|
||||||
if ($savingdocmask)
|
if ($savingdocmask)
|
||||||
{
|
{
|
||||||
$destpath=$upload_dir . "/" . preg_replace('/__file__/',$TFile['name'][$i],$savingdocmask);
|
$destfull=$upload_dir . "/" . preg_replace('/__file__/',$TFile['name'][$i],$savingdocmask);
|
||||||
$destfile=preg_replace('/__file__/',$TFile['name'][$i],$savingdocmask);
|
$destfile=preg_replace('/__file__/',$TFile['name'][$i],$savingdocmask);
|
||||||
}
|
}
|
||||||
|
|
||||||
// lowercase extension
|
// lowercase extension
|
||||||
$info = pathinfo($destpath);
|
$info = pathinfo($destfull);
|
||||||
$destpath = $info['dirname'].'/'.$info['filename'].'.'.strtolower($info['extension']);
|
$destfull = $info['dirname'].'/'.$info['filename'].'.'.strtolower($info['extension']);
|
||||||
$info = pathinfo($destfile);
|
$info = pathinfo($destfile);
|
||||||
$destfile = $info['filename'].'.'.strtolower($info['extension']);
|
$destfile = $info['filename'].'.'.strtolower($info['extension']);
|
||||||
|
|
||||||
$resupload = dol_move_uploaded_file($TFile['tmp_name'][$i], $destpath, $allowoverwrite, 0, $TFile['error'][$i], 0, $varfiles);
|
$resupload = dol_move_uploaded_file($TFile['tmp_name'][$i], $destfull, $allowoverwrite, 0, $TFile['error'][$i], 0, $varfiles);
|
||||||
if (is_numeric($resupload) && $resupload > 0)
|
|
||||||
|
if (is_numeric($resupload) && $resupload > 0) // $resupload can be 'ErrorFileAlreadyExists'
|
||||||
{
|
{
|
||||||
global $maxwidthsmall, $maxheightsmall, $maxwidthmini, $maxheightmini;
|
global $maxwidthsmall, $maxheightsmall, $maxwidthmini, $maxheightmini;
|
||||||
|
|
||||||
include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
|
include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
|
||||||
|
|
||||||
|
// Generate thumbs.
|
||||||
|
if (image_format_supported($destfull) == 1)
|
||||||
|
{
|
||||||
|
// Create thumbs
|
||||||
|
// We can't use $object->addThumbs here because there is no $object known
|
||||||
|
|
||||||
|
// Used on logon for example
|
||||||
|
$imgThumbSmall = vignette($destfull, $maxwidthsmall, $maxheightsmall, '_small', 50, "thumbs");
|
||||||
|
// Create mini thumbs for image (Ratio is near 16/9)
|
||||||
|
// Used on menu or for setup page for example
|
||||||
|
$imgThumbMini = vignette($destfull, $maxwidthmini, $maxheightmini, '_mini', 50, "thumbs");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update session
|
||||||
if (empty($donotupdatesession))
|
if (empty($donotupdatesession))
|
||||||
{
|
{
|
||||||
include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
|
include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
|
||||||
$formmail = new FormMail($db);
|
$formmail = new FormMail($db);
|
||||||
$formmail->trackid = $trackid;
|
$formmail->trackid = $trackid;
|
||||||
$formmail->add_attached_files($destpath, $destfile, $TFile['type'][$i]);
|
$formmail->add_attached_files($destfull, $destfile, $TFile['type'][$i]);
|
||||||
}
|
}
|
||||||
if (image_format_supported($destpath) == 1)
|
|
||||||
{
|
|
||||||
// Create thumbs
|
|
||||||
// We can't use $object->addThumbs here because there is no $object known
|
|
||||||
|
|
||||||
// Used on logon for example
|
// Update table of files
|
||||||
$imgThumbSmall = vignette($destpath, $maxwidthsmall, $maxheightsmall, '_small', 50, "thumbs");
|
if ($donotupdatesession)
|
||||||
// Create mini thumbs for image (Ratio is near 16/9)
|
{
|
||||||
// Used on menu or for setup page for example
|
$rel_dir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $upload_dir);
|
||||||
$imgThumbMini = vignette($destpath, $maxwidthmini, $maxheightmini, '_mini', 50, "thumbs");
|
|
||||||
|
if (! preg_match('/[\\/]temp[\\/]/', $rel_dir)) // If not a tmp dir
|
||||||
|
{
|
||||||
|
$filename = basename($destfile);
|
||||||
|
$rel_dir = preg_replace('/[\\/]$/', '', $rel_dir);
|
||||||
|
$rel_dir = preg_replace('/^[\\/]/', '', $rel_dir);
|
||||||
|
|
||||||
|
include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
|
||||||
|
$ecmfile=new EcmFiles($db);
|
||||||
|
$ecmfile->filepath = $rel_dir;
|
||||||
|
$ecmfile->filename = $filename;
|
||||||
|
$ecmfile->label = md5_file(dol_osencode($destfull));
|
||||||
|
$ecmfile->fullpath_orig = $TFile['name'][$i];
|
||||||
|
$ecmfile->gen_or_uploaded = 'uploaded';
|
||||||
|
$ecmfile->description = ''; // indexed content
|
||||||
|
$ecmfile->keyword = ''; // keyword content
|
||||||
|
$result = $ecmfile->create($user);
|
||||||
|
if ($result < 0)
|
||||||
|
{
|
||||||
|
setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings');
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setEventMessages($langs->trans("FileTransferComplete"), null, 'mesgs');
|
setEventMessages($langs->trans("FileTransferComplete"), null, 'mesgs');
|
||||||
@ -1145,7 +1343,7 @@ function dol_remove_file_process($filenb,$donotupdatesession=0,$donotdeletefile=
|
|||||||
{
|
{
|
||||||
$pathtodelete=$listofpaths[$keytodelete];
|
$pathtodelete=$listofpaths[$keytodelete];
|
||||||
$filetodelete=$listofnames[$keytodelete];
|
$filetodelete=$listofnames[$keytodelete];
|
||||||
if (empty($donotdeletefile)) $result = dol_delete_file($pathtodelete,1);
|
if (empty($donotdeletefile)) $result = dol_delete_file($pathtodelete,1); // The delete of ecm database is inside the function dol_delete_file
|
||||||
else $result=0;
|
else $result=0;
|
||||||
if ($result >= 0)
|
if ($result >= 0)
|
||||||
{
|
{
|
||||||
@ -1337,11 +1535,11 @@ function dol_most_recent_file($dir,$regexfilter='',$excludefilter=array('(\.meta
|
|||||||
* Security check when accessing to a document (used by document.php, viewimage.php and webservices)
|
* Security check when accessing to a document (used by document.php, viewimage.php and webservices)
|
||||||
*
|
*
|
||||||
* @param string $modulepart Module of document ('module', 'module_user_temp', 'module_user' or 'module_temp')
|
* @param string $modulepart Module of document ('module', 'module_user_temp', 'module_user' or 'module_temp')
|
||||||
* @param string $original_file Relative path with filename
|
* @param string $original_file Relative path with filename, relative to modulepart.
|
||||||
* @param string $entity Restrict onto entity
|
* @param string $entity Restrict onto entity
|
||||||
* @param User $fuser User object (forced)
|
* @param User $fuser User object (forced)
|
||||||
* @param string $refname Ref of object to check permission for external users (autodetect if not provided)
|
* @param string $refname Ref of object to check permission for external users (autodetect if not provided)
|
||||||
* @return mixed Array with access information : accessallowed & sqlprotectagainstexternals & original_file (as full path name)
|
* @return mixed Array with access information : 'accessallowed' & 'sqlprotectagainstexternals' & 'original_file' (as a full path name)
|
||||||
*/
|
*/
|
||||||
function dol_check_secure_access_document($modulepart,$original_file,$entity,$fuser='',$refname='')
|
function dol_check_secure_access_document($modulepart,$original_file,$entity,$fuser='',$refname='')
|
||||||
{
|
{
|
||||||
@ -1635,7 +1833,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu
|
|||||||
$accessallowed=1;
|
$accessallowed=1;
|
||||||
}
|
}
|
||||||
$original_file=$conf->projet->dir_output.'/'.$original_file;
|
$original_file=$conf->projet->dir_output.'/'.$original_file;
|
||||||
$sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."projet WHERE ref='".$db->escape($refname)."' AND entity=".$conf->entity;
|
$sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."projet WHERE ref='".$db->escape($refname)."' AND entity IN (".getEntity('project', 1).")";
|
||||||
}
|
}
|
||||||
else if ($modulepart == 'project_task')
|
else if ($modulepart == 'project_task')
|
||||||
{
|
{
|
||||||
@ -1644,7 +1842,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu
|
|||||||
$accessallowed=1;
|
$accessallowed=1;
|
||||||
}
|
}
|
||||||
$original_file=$conf->projet->dir_output.'/'.$original_file;
|
$original_file=$conf->projet->dir_output.'/'.$original_file;
|
||||||
$sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."projet WHERE ref='".$db->escape($refname)."' AND entity=".$conf->entity;
|
$sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."projet WHERE ref='".$db->escape($refname)."' AND entity IN (".getEntity('project', 1).")";
|
||||||
}
|
}
|
||||||
// Wrapping for interventions
|
// Wrapping for interventions
|
||||||
else if ($modulepart == 'fichinter')
|
else if ($modulepart == 'fichinter')
|
||||||
@ -1759,6 +1957,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu
|
|||||||
$accessallowed=1;
|
$accessallowed=1;
|
||||||
}
|
}
|
||||||
$original_file=$conf->contrat->dir_output.'/'.$original_file;
|
$original_file=$conf->contrat->dir_output.'/'.$original_file;
|
||||||
|
$sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."contrat WHERE ref='".$db->escape($refname)."' AND entity IN (".getEntity('contract', 1).")";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wrapping pour les dons
|
// Wrapping pour les dons
|
||||||
|
|||||||
@ -5677,7 +5677,7 @@ function dol_getmypid()
|
|||||||
* If param $mode is 1, can contains an operator <, > or = like "<10" or ">=100.5 < 1000"
|
* If param $mode is 1, can contains an operator <, > or = like "<10" or ">=100.5 < 1000"
|
||||||
* If param $mode is 2, can contains a list of id separated by comma like "1,3,4"
|
* If param $mode is 2, can contains a list of id separated by comma like "1,3,4"
|
||||||
* @param integer $mode 0=value is list of keywords, 1=value is a numeric test (Example ">5.5 <10"), 2=value is a list of id separated with comma (Example '1,3,4')
|
* @param integer $mode 0=value is list of keywords, 1=value is a numeric test (Example ">5.5 <10"), 2=value is a list of id separated with comma (Example '1,3,4')
|
||||||
* @param integer $nofirstand 1=Do now output the first 'AND'
|
* @param integer $nofirstand 1=Do not output the first 'AND'
|
||||||
* @return string $res The statement to append to the SQL query
|
* @return string $res The statement to append to the SQL query
|
||||||
*/
|
*/
|
||||||
function natural_search($fields, $value, $mode=0, $nofirstand=0)
|
function natural_search($fields, $value, $mode=0, $nofirstand=0)
|
||||||
@ -5692,6 +5692,9 @@ function natural_search($fields, $value, $mode=0, $nofirstand=0)
|
|||||||
{
|
{
|
||||||
$value=preg_replace('/([<>=]+)\s+([0-9'.preg_quote($langs->trans("DecimalSeparator"),'/').'\-])/','\1\2',$value); // Clean string '< 10' into '<10' so we can the explode on space to get all tests to do
|
$value=preg_replace('/([<>=]+)\s+([0-9'.preg_quote($langs->trans("DecimalSeparator"),'/').'\-])/','\1\2',$value); // Clean string '< 10' into '<10' so we can the explode on space to get all tests to do
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$value = preg_replace('/\s*\|\s*/','|', $value);
|
||||||
|
|
||||||
$crits = explode(' ', $value);
|
$crits = explode(' ', $value);
|
||||||
$res = '';
|
$res = '';
|
||||||
if (! is_array($fields)) $fields = array($fields);
|
if (! is_array($fields)) $fields = array($fields);
|
||||||
|
|||||||
@ -37,8 +37,10 @@ $quality = 80;
|
|||||||
*/
|
*/
|
||||||
function image_format_supported($file)
|
function image_format_supported($file)
|
||||||
{
|
{
|
||||||
|
$regeximgext='\.gif|\.jpg|\.jpeg|\.png|\.bmp|\.xpm|\.xbm'; // See also into product.class.php
|
||||||
|
|
||||||
// Case filename is not a format image
|
// Case filename is not a format image
|
||||||
if (! preg_match('/(\.gif|\.jpg|\.jpeg|\.png|\.bmp)$/i',$file,$reg)) return -1;
|
if (! preg_match('/('.$regeximgext.')$/i',$file,$reg)) return -1;
|
||||||
|
|
||||||
// Case filename is a format image but not supported by this PHP
|
// Case filename is a format image but not supported by this PHP
|
||||||
$imgfonction='';
|
$imgfonction='';
|
||||||
@ -47,6 +49,8 @@ function image_format_supported($file)
|
|||||||
if (strtolower($reg[1]) == '.jpg') $imgfonction = 'imagecreatefromjpeg';
|
if (strtolower($reg[1]) == '.jpg') $imgfonction = 'imagecreatefromjpeg';
|
||||||
if (strtolower($reg[1]) == '.jpeg') $imgfonction = 'imagecreatefromjpeg';
|
if (strtolower($reg[1]) == '.jpeg') $imgfonction = 'imagecreatefromjpeg';
|
||||||
if (strtolower($reg[1]) == '.bmp') $imgfonction = 'imagecreatefromwbmp';
|
if (strtolower($reg[1]) == '.bmp') $imgfonction = 'imagecreatefromwbmp';
|
||||||
|
if (strtolower($reg[1]) == '.xpm') $imgfonction = 'imagecreatefromxpm';
|
||||||
|
if (strtolower($reg[1]) == '.xbm') $imgfonction = 'imagecreatefromxbm';
|
||||||
if ($imgfonction)
|
if ($imgfonction)
|
||||||
{
|
{
|
||||||
if (! function_exists($imgfonction))
|
if (! function_exists($imgfonction))
|
||||||
|
|||||||
@ -26,9 +26,13 @@
|
|||||||
// Supported OAUTH (a provider is supported when a file xxx_oauthcallback.php is available into htdocs/core/modules/oauth)
|
// Supported OAUTH (a provider is supported when a file xxx_oauthcallback.php is available into htdocs/core/modules/oauth)
|
||||||
$supportedoauth2array=array(
|
$supportedoauth2array=array(
|
||||||
'OAUTH_GOOGLE_NAME'=>'google',
|
'OAUTH_GOOGLE_NAME'=>'google',
|
||||||
'OAUTH_GITHUB_NAME'=>'github'
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if ($conf->global->MAIN_FEATURES_LEVEL >= 2)
|
||||||
|
{
|
||||||
|
$supportedoauth2array['OAUTH_GITHUB_NAME']='github';
|
||||||
|
}
|
||||||
|
$supportedoauth2array['OAUTH_GITHUB_NAME']='github';
|
||||||
// API access parameters OAUTH
|
// API access parameters OAUTH
|
||||||
$list = array (
|
$list = array (
|
||||||
array(
|
array(
|
||||||
@ -264,7 +268,7 @@ function oauthadmin_prepare_head()
|
|||||||
$h++;
|
$h++;
|
||||||
|
|
||||||
$head[$h][0] = dol_buildpath('/admin/oauthlogintokens.php', 1);
|
$head[$h][0] = dol_buildpath('/admin/oauthlogintokens.php', 1);
|
||||||
$head[$h][1] = $langs->trans("ManualTokenGeneration");
|
$head[$h][1] = $langs->trans("TokenManager");
|
||||||
$head[$h][2] = 'tokengeneration';
|
$head[$h][2] = 'tokengeneration';
|
||||||
$h++;
|
$h++;
|
||||||
|
|
||||||
|
|||||||
@ -1248,11 +1248,15 @@ function pdf_getlinedesc($object,$i,$outputlangs,$hideref=0,$hidedesc=0,$issuppl
|
|||||||
{
|
{
|
||||||
if ($issupplierline)
|
if ($issupplierline)
|
||||||
{
|
{
|
||||||
//$ref_prodserv = $prodser->ref.($ref_supplier ? ' ('.$outputlangs->transnoentitiesnoconv("SupplierRef").' '.$ref_supplier.')' : ''); // Show local ref and supplier ref
|
if ($conf->global->PDF_HIDE_PRODUCT_REF_IN_SUPPLIER_LINES == 1)
|
||||||
if (! empty($conf->global->PDF_HIDE_PRODUCT_REF_IN_SUPPLIER_LINES)) $ref_prodserv =$ref_supplier;
|
$ref_prodserv = $ref_supplier;
|
||||||
else $ref_prodserv = $prodser->ref.($ref_supplier ? ' ('.$outputlangs->transnoentitiesnoconv("SupplierRef").' '.$ref_supplier.')' : ''); // Show local ref and supplier ref
|
elseif ($conf->global->PDF_HIDE_PRODUCT_REF_IN_SUPPLIER_LINES == 2)
|
||||||
|
$ref_prodserv = $ref_supplier. ' ('.$outputlangs->transnoentitiesnoconv("InternalRef").' '.$prodser->ref.')';
|
||||||
|
else
|
||||||
|
$ref_prodserv = $prodser->ref.' ('.$outputlangs->transnoentitiesnoconv("SupplierRef").' '.$ref_supplier.')';
|
||||||
}
|
}
|
||||||
else $ref_prodserv = $prodser->ref; // Show local ref only
|
else
|
||||||
|
$ref_prodserv = $prodser->ref; // Show local ref only
|
||||||
|
|
||||||
if (! empty($libelleproduitservice)) $ref_prodserv .= " - ";
|
if (! empty($libelleproduitservice)) $ref_prodserv .= " - ";
|
||||||
}
|
}
|
||||||
|
|||||||
@ -110,12 +110,9 @@ function report_header($nom,$variante,$period,$periodlink,$description,$builddat
|
|||||||
if ($exportlink) print '</td><td>'.$langs->trans("Export").'</td><td>'.$exportlink;
|
if ($exportlink) print '</td><td>'.$langs->trans("Export").'</td><td>'.$exportlink;
|
||||||
print '</td></tr>';
|
print '</td></tr>';
|
||||||
|
|
||||||
print '<tr>';
|
|
||||||
print '<td colspan="4" align="center"><input type="submit" class="button" name="submit" value="'.$langs->trans("Refresh").'"></td>';
|
|
||||||
print '</tr>';
|
|
||||||
|
|
||||||
print '</table>';
|
print '</table>';
|
||||||
|
|
||||||
|
print '<br><div class="center"><input type="submit" class="button" name="submit" value="'.$langs->trans("Refresh").'"></div>';
|
||||||
print '</form>';
|
print '</form>';
|
||||||
|
|
||||||
dol_fiche_end();
|
dol_fiche_end();
|
||||||
|
|||||||
@ -111,13 +111,13 @@ function print_eldy_menu($db,$atarget,$type_user,&$tabMenu,&$menu,$noout=0,$mode
|
|||||||
|
|
||||||
$chaine="";
|
$chaine="";
|
||||||
if (! empty($conf->product->enabled)) {
|
if (! empty($conf->product->enabled)) {
|
||||||
$chaine.=$langs->trans("Products");
|
$chaine.=$langs->trans("TMenuProducts");
|
||||||
}
|
}
|
||||||
if (! empty($conf->product->enabled) && ! empty($conf->service->enabled)) {
|
if (! empty($conf->product->enabled) && ! empty($conf->service->enabled)) {
|
||||||
$chaine.="/";
|
$chaine.=" | ";
|
||||||
}
|
}
|
||||||
if (! empty($conf->service->enabled)) {
|
if (! empty($conf->service->enabled)) {
|
||||||
$chaine.=$langs->trans("Services");
|
$chaine.=$langs->trans("TMenuServices");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($noout)) print_start_menu_entry($idsel,$classname,$showmode);
|
if (empty($noout)) print_start_menu_entry($idsel,$classname,$showmode);
|
||||||
@ -261,7 +261,7 @@ function print_eldy_menu($db,$atarget,$type_user,&$tabMenu,&$menu,$noout=0,$mode
|
|||||||
$idsel='tools';
|
$idsel='tools';
|
||||||
|
|
||||||
if (empty($noout)) print_start_menu_entry($idsel,$classname,$showmode);
|
if (empty($noout)) print_start_menu_entry($idsel,$classname,$showmode);
|
||||||
if (empty($noout)) print_text_menu_entry($langs->trans("Tools"), $showmode, DOL_URL_ROOT.'/core/tools.php?mainmenu=tools&leftmenu=', $id, $idsel, $classname, $atarget);
|
if (empty($noout)) print_text_menu_entry($langs->trans("TMenuTools"), $showmode, DOL_URL_ROOT.'/core/tools.php?mainmenu=tools&leftmenu=', $id, $idsel, $classname, $atarget);
|
||||||
if (empty($noout)) print_end_menu_entry($showmode);
|
if (empty($noout)) print_end_menu_entry($showmode);
|
||||||
$menu->add('/core/tools.php?mainmenu=tools&leftmenu=', $langs->trans("Tools"), 0, $showmode, $atarget, "tools", '');
|
$menu->add('/core/tools.php?mainmenu=tools&leftmenu=', $langs->trans("Tools"), 0, $showmode, $atarget, "tools", '');
|
||||||
}
|
}
|
||||||
|
|||||||
@ -110,8 +110,8 @@ class pdf_einstein extends ModelePDFCommandes
|
|||||||
{
|
{
|
||||||
$this->posxtva=99;
|
$this->posxtva=99;
|
||||||
$this->posxup=114;
|
$this->posxup=114;
|
||||||
$this->posxqty=133;
|
$this->posxqty=130;
|
||||||
$this->posxunit=150;
|
$this->posxunit=147;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@ -119,8 +119,8 @@ class pdf_crabe extends ModelePDFFactures
|
|||||||
{
|
{
|
||||||
$this->posxtva=99;
|
$this->posxtva=99;
|
||||||
$this->posxup=114;
|
$this->posxup=114;
|
||||||
$this->posxqty=133;
|
$this->posxqty=130;
|
||||||
$this->posxunit=150;
|
$this->posxunit=147;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@ -50,8 +50,8 @@ class modAccounting extends DolibarrModules
|
|||||||
$this->name = preg_replace('/^mod/i', '', get_class($this));
|
$this->name = preg_replace('/^mod/i', '', get_class($this));
|
||||||
$this->description = "Advanced accounting management";
|
$this->description = "Advanced accounting management";
|
||||||
|
|
||||||
// Possible values for version are: 'development', 'experimental', 'dolibarr' or version
|
// Possible values for version are: 'development', 'experimental', 'dolibarr' or 'dolibarr_deprecated' or version
|
||||||
$this->version = 'experimental';
|
$this->version = 'dolibarr';
|
||||||
|
|
||||||
$this->const_name = 'MAIN_MODULE_' . strtoupper($this->name);
|
$this->const_name = 'MAIN_MODULE_' . strtoupper($this->name);
|
||||||
$this->special = 0;
|
$this->special = 0;
|
||||||
|
|||||||
@ -189,7 +189,7 @@ class modAgenda extends DolibarrModules
|
|||||||
// $r++;
|
// $r++;
|
||||||
$this->menu[$r]=array('fk_menu'=>0,
|
$this->menu[$r]=array('fk_menu'=>0,
|
||||||
'type'=>'top',
|
'type'=>'top',
|
||||||
'titre'=>'Agenda',
|
'titre'=>'TMenuAgenda',
|
||||||
'mainmenu'=>'agenda',
|
'mainmenu'=>'agenda',
|
||||||
'url'=>'/comm/action/index.php',
|
'url'=>'/comm/action/index.php',
|
||||||
'langs'=>'agenda',
|
'langs'=>'agenda',
|
||||||
|
|||||||
@ -135,10 +135,13 @@ class modDeplacement extends DolibarrModules
|
|||||||
$this->export_sql_end[$r] .=' AND d.entity IN ('.getEntity('deplacement',1).')';
|
$this->export_sql_end[$r] .=' AND d.entity IN ('.getEntity('deplacement',1).')';
|
||||||
if (empty($user->rights->societe->client->voir)) $this->export_sql_end[$r] .=' AND (sc.fk_user = '.(empty($user)?0:$user->id).' OR d.fk_soc IS NULL)';
|
if (empty($user->rights->societe->client->voir)) $this->export_sql_end[$r] .=' AND (sc.fk_user = '.(empty($user)?0:$user->id).' OR d.fk_soc IS NULL)';
|
||||||
|
|
||||||
$childids = $user->getAllChildIds();
|
if (! empty($user)) // Not defined during migration process
|
||||||
$childids[]=$user->id;
|
{
|
||||||
|
$childids = $user->getAllChildIds();
|
||||||
|
$childids[]=$user->id;
|
||||||
|
|
||||||
if (empty($user->rights->deplacement->readall) && empty($user->rights->deplacement->lire_tous)) $sql.=' AND d.fk_user IN ('.join(',',$childids).')';
|
if (empty($user->rights->deplacement->readall) && empty($user->rights->deplacement->lire_tous)) $sql.=' AND d.fk_user IN ('.join(',',$childids).')';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -62,7 +62,7 @@ class modMultiCurrency extends DolibarrModules
|
|||||||
$this->description = "Module to enter elements with a foreign currency";
|
$this->description = "Module to enter elements with a foreign currency";
|
||||||
|
|
||||||
// Possible values for version are: 'development', 'experimental', 'dolibarr' or 'dolibarr_deprecated' or version
|
// Possible values for version are: 'development', 'experimental', 'dolibarr' or 'dolibarr_deprecated' or version
|
||||||
$this->version = 'experimental';
|
$this->version = 'dolibarr';
|
||||||
// Key used in llx_const table to save module status enabled/disabled (where MYMODULE is value of property name of module in uppercase)
|
// Key used in llx_const table to save module status enabled/disabled (where MYMODULE is value of property name of module in uppercase)
|
||||||
$this->const_name = 'MAIN_MODULE_'.strtoupper($this->name);
|
$this->const_name = 'MAIN_MODULE_'.strtoupper($this->name);
|
||||||
// Where to store the module in setup page (0=common,1=interface,2=others,3=very specific)
|
// Where to store the module in setup page (0=common,1=interface,2=others,3=very specific)
|
||||||
|
|||||||
@ -281,7 +281,14 @@ class modSociete extends DolibarrModules
|
|||||||
$this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'c_payment_term as payterm ON s.cond_reglement = payterm.rowid';
|
$this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'c_payment_term as payterm ON s.cond_reglement = payterm.rowid';
|
||||||
$this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'c_paiement as paymode ON s.mode_reglement = paymode.id';
|
$this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'c_paiement as paymode ON s.mode_reglement = paymode.id';
|
||||||
$this->export_sql_end[$r] .=' WHERE s.entity IN ('.getEntity('societe', 1).')';
|
$this->export_sql_end[$r] .=' WHERE s.entity IN ('.getEntity('societe', 1).')';
|
||||||
if(!$user->rights->societe->client->voir) $this->export_sql_end[$r] .=' AND sc.fk_user = '.$user->id;
|
if(!$user->rights->societe->client->voir) {
|
||||||
|
$this->export_sql_end[$r] .=' AND (sc.fk_user = '.$user->id.' ';
|
||||||
|
if ($conf->global->SOCIETE_EXPORT_SUBORDINATES_CHILDS) {
|
||||||
|
$subordinatesids = $user->getAllChildIds();
|
||||||
|
$this->export_sql_end[$r] .=count($subronidatesids)>0 ? ' OR (sc.fk_user IN ('.implode(',',$subronidatesids).')' : '';
|
||||||
|
}
|
||||||
|
$this->export_sql_end[$r] .=')';
|
||||||
|
}
|
||||||
|
|
||||||
// Export list of contacts and attributes
|
// Export list of contacts and attributes
|
||||||
$r++;
|
$r++;
|
||||||
@ -311,7 +318,14 @@ class modSociete extends DolibarrModules
|
|||||||
$this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'c_country as co ON c.fk_pays = co.rowid';
|
$this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'c_country as co ON c.fk_pays = co.rowid';
|
||||||
$this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'socpeople_extrafields as extra ON extra.fk_object = c.rowid';
|
$this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'socpeople_extrafields as extra ON extra.fk_object = c.rowid';
|
||||||
$this->export_sql_end[$r] .=' WHERE c.entity IN ('.getEntity("societe", 1).')';
|
$this->export_sql_end[$r] .=' WHERE c.entity IN ('.getEntity("societe", 1).')';
|
||||||
if(!$user->rights->societe->client->voir) $this->export_sql_end[$r] .=' AND sc.fk_user = '.$user->id;
|
if(!$user->rights->societe->client->voir) {
|
||||||
|
$this->export_sql_end[$r] .=' AND (sc.fk_user = '.$user->id.' ';
|
||||||
|
if ($conf->global->SOCIETE_EXPORT_SUBORDINATES_CHILDS) {
|
||||||
|
$subordinatesids = $user->getAllChildIds();
|
||||||
|
$this->export_sql_end[$r] .=count($subronidatesids)>0 ? ' OR (sc.fk_user IN ('.implode(',',$subronidatesids).')' : '';
|
||||||
|
}
|
||||||
|
$this->export_sql_end[$r] .=')';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Imports
|
// Imports
|
||||||
|
|||||||
171
htdocs/core/modules/oauth/github_oauthcallback.php
Normal file
171
htdocs/core/modules/oauth/github_oauthcallback.php
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015 Frederic France <frederic.france@free.fr>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file htdocs/core/modules/oauth/github_oauthcallback.php
|
||||||
|
* \ingroup oauth
|
||||||
|
* \brief Page to get oauth callback
|
||||||
|
*/
|
||||||
|
|
||||||
|
require '../../../main.inc.php';
|
||||||
|
require_once DOL_DOCUMENT_ROOT.'/includes/OAuth/bootstrap.php';
|
||||||
|
use OAuth\Common\Storage\DoliStorage;
|
||||||
|
use OAuth\Common\Consumer\Credentials;
|
||||||
|
use OAuth\OAuth2\Service\GitHub;
|
||||||
|
|
||||||
|
// Define $urlwithroot
|
||||||
|
$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
|
||||||
|
$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
|
||||||
|
//$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$action = GETPOST('action', 'alpha');
|
||||||
|
$backtourl = GETPOST('backtourl', 'alpha');
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new instance of the URI class with the current URI, stripping the query string
|
||||||
|
*/
|
||||||
|
$uriFactory = new \OAuth\Common\Http\Uri\UriFactory();
|
||||||
|
//$currentUri = $uriFactory->createFromSuperGlobalArray($_SERVER);
|
||||||
|
//$currentUri->setQuery('');
|
||||||
|
$currentUri = $uriFactory->createFromAbsolute($urlwithroot.'/core/modules/oauth/github_oauthcallback.php');
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the credential for the service
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @var $serviceFactory \OAuth\ServiceFactory An OAuth service factory. */
|
||||||
|
$serviceFactory = new \OAuth\ServiceFactory();
|
||||||
|
$httpClient = new \OAuth\Common\Http\Client\CurlClient();
|
||||||
|
// TODO Set options for proxy and timeout
|
||||||
|
// $params=array('CURLXXX'=>value, ...)
|
||||||
|
//$httpClient->setCurlParameters($params);
|
||||||
|
$serviceFactory->setHttpClient($httpClient);
|
||||||
|
|
||||||
|
// Dolibarr storage
|
||||||
|
$storage = new DoliStorage($db, $conf);
|
||||||
|
|
||||||
|
// Setup the credentials for the requests
|
||||||
|
$credentials = new Credentials(
|
||||||
|
$conf->global->OAUTH_GITHUB_ID,
|
||||||
|
$conf->global->OAUTH_GITHUB_SECRET,
|
||||||
|
$currentUri->getAbsoluteUri()
|
||||||
|
);
|
||||||
|
|
||||||
|
$requestedpermissionsarray=array();
|
||||||
|
if (GETPOST('state')) $requestedpermissionsarray=explode(',', GETPOST('state')); // Example: 'userinfo_email,userinfo_profile,cloud_print'. 'state' parameter is standard to retrieve some parameters back
|
||||||
|
if ($action != 'delete' && empty($requestedpermissionsarray))
|
||||||
|
{
|
||||||
|
print 'Error, parameter state is not defined';
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
//var_dump($requestedpermissionsarray);exit;
|
||||||
|
|
||||||
|
// Instantiate the Api service using the credentials, http client and storage mechanism for the token
|
||||||
|
/** @var $apiService Service */
|
||||||
|
$apiService = $serviceFactory->createService('GitHub', $credentials, $storage, $requestedpermissionsarray);
|
||||||
|
|
||||||
|
// access type needed to have oauth provider refreshing token
|
||||||
|
//$apiService->setAccessType('offline');
|
||||||
|
|
||||||
|
$langs->load("oauth");
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Actions
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
if ($action == 'delete')
|
||||||
|
{
|
||||||
|
$storage->clearToken('GitHub');
|
||||||
|
|
||||||
|
setEventMessages($langs->trans('TokenDeleted'), null, 'mesgs');
|
||||||
|
|
||||||
|
header('Location: ' . $backtourl);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! empty($_GET['code'])) // We are coming from oauth provider page
|
||||||
|
{
|
||||||
|
//llxHeader('',$langs->trans("OAuthSetup"));
|
||||||
|
|
||||||
|
//$linkback='<a href="'.DOL_URL_ROOT.'/admin/modules.php">'.$langs->trans("BackToModuleList").'</a>';
|
||||||
|
//print load_fiche_titre($langs->trans("OAuthSetup"),$linkback,'title_setup');
|
||||||
|
|
||||||
|
//dol_fiche_head();
|
||||||
|
// retrieve the CSRF state parameter
|
||||||
|
$state = isset($_GET['state']) ? $_GET['state'] : null;
|
||||||
|
//print '<table>';
|
||||||
|
|
||||||
|
// This was a callback request from service, get the token
|
||||||
|
try {
|
||||||
|
//var_dump($_GET['code']);
|
||||||
|
//var_dump($state);
|
||||||
|
//var_dump($apiService); // OAuth\OAuth2\Service\GitHub
|
||||||
|
|
||||||
|
//$token = $apiService->requestAccessToken($_GET['code'], $state);
|
||||||
|
$token = $apiService->requestAccessToken($_GET['code']);
|
||||||
|
// Github is a service that does not need state yo be stored.
|
||||||
|
// Into constructor of GitHub, the call
|
||||||
|
// parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri)
|
||||||
|
// has not the ending parameter to true like the Google class constructor.
|
||||||
|
|
||||||
|
setEventMessages($langs->trans('NewTokenStored'), null, 'mesgs'); // Stored into object managed by class DoliStorage so into table oauth_token
|
||||||
|
} catch (Exception $e) {
|
||||||
|
print $e->getMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
$backtourl = $_SESSION["backtourlsavedbeforeoauthjump"];
|
||||||
|
unset($_SESSION["backtourlsavedbeforeoauthjump"]);
|
||||||
|
|
||||||
|
header('Location: ' . $backtourl);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
else // If entry on page with no parameter, we arrive here
|
||||||
|
{
|
||||||
|
$_SESSION["backtourlsavedbeforeoauthjump"]=$backtourl;
|
||||||
|
|
||||||
|
// This may create record into oauth_state before the header redirect.
|
||||||
|
// Creation of record with state in this tables depend on the Provider used (see its constructor).
|
||||||
|
if (GETPOST('state'))
|
||||||
|
{
|
||||||
|
$url = $apiService->getAuthorizationUri(array('state'=>GETPOST('state')));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$url = $apiService->getAuthorizationUri(); // Parameter state will be randomly generated
|
||||||
|
}
|
||||||
|
|
||||||
|
// we go on oauth provider authorization page
|
||||||
|
header('Location: ' . $url);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* View
|
||||||
|
*/
|
||||||
|
|
||||||
|
// No view at all, just actions
|
||||||
|
|
||||||
|
$db->close();
|
||||||
|
|
||||||
@ -17,7 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \file htdocs/core/modules/oauth/getoauthcallback.php
|
* \file htdocs/core/modules/oauth/google_oauthcallback.php
|
||||||
* \ingroup oauth
|
* \ingroup oauth
|
||||||
* \brief Page to get oauth callback
|
* \brief Page to get oauth callback
|
||||||
*/
|
*/
|
||||||
@ -83,7 +83,7 @@ if ($action != 'delete' && empty($requestedpermissionsarray))
|
|||||||
/** @var $apiService Service */
|
/** @var $apiService Service */
|
||||||
$apiService = $serviceFactory->createService('Google', $credentials, $storage, $requestedpermissionsarray);
|
$apiService = $serviceFactory->createService('Google', $credentials, $storage, $requestedpermissionsarray);
|
||||||
|
|
||||||
// access type needed for google refresh token
|
// access type needed to have oauth provider refreshing token
|
||||||
$apiService->setAccessType('offline');
|
$apiService->setAccessType('offline');
|
||||||
|
|
||||||
$langs->load("oauth");
|
$langs->load("oauth");
|
||||||
@ -104,7 +104,7 @@ if ($action == 'delete')
|
|||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! empty($_GET['code'])) // We are coming from Google oauth page
|
if (! empty($_GET['code'])) // We are coming from oauth provider page
|
||||||
{
|
{
|
||||||
//llxHeader('',$langs->trans("OAuthSetup"));
|
//llxHeader('',$langs->trans("OAuthSetup"));
|
||||||
|
|
||||||
@ -121,6 +121,7 @@ if (! empty($_GET['code'])) // We are coming from Google oauth page
|
|||||||
//var_dump($_GET['code']);
|
//var_dump($_GET['code']);
|
||||||
//var_dump($state);
|
//var_dump($state);
|
||||||
//var_dump($apiService); // OAuth\OAuth2\Service\Google
|
//var_dump($apiService); // OAuth\OAuth2\Service\Google
|
||||||
|
|
||||||
$token = $apiService->requestAccessToken($_GET['code'], $state);
|
$token = $apiService->requestAccessToken($_GET['code'], $state);
|
||||||
|
|
||||||
setEventMessages($langs->trans('NewTokenStored'), null, 'mesgs'); // Stored into object managed by class DoliStorage so into table oauth_token
|
setEventMessages($langs->trans('NewTokenStored'), null, 'mesgs'); // Stored into object managed by class DoliStorage so into table oauth_token
|
||||||
@ -138,6 +139,8 @@ else // If entry on page with no parameter, we arrive here
|
|||||||
{
|
{
|
||||||
$_SESSION["backtourlsavedbeforeoauthjump"]=$backtourl;
|
$_SESSION["backtourlsavedbeforeoauthjump"]=$backtourl;
|
||||||
|
|
||||||
|
// This may create record into oauth_state before the header redirect.
|
||||||
|
// Creation of record with state in this tables depend on the Provider used (see its constructor).
|
||||||
if (GETPOST('state'))
|
if (GETPOST('state'))
|
||||||
{
|
{
|
||||||
$url = $apiService->getAuthorizationUri(array('state'=>GETPOST('state')));
|
$url = $apiService->getAuthorizationUri(array('state'=>GETPOST('state')));
|
||||||
@ -146,7 +149,8 @@ else // If entry on page with no parameter, we arrive here
|
|||||||
{
|
{
|
||||||
$url = $apiService->getAuthorizationUri(); // Parameter state will be randomly generated
|
$url = $apiService->getAuthorizationUri(); // Parameter state will be randomly generated
|
||||||
}
|
}
|
||||||
// we go on google authorization page
|
|
||||||
|
// we go on oauth provider authorization page
|
||||||
header('Location: ' . $url);
|
header('Location: ' . $url);
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -66,6 +66,7 @@ class printing_printgcp extends PrintingDriver
|
|||||||
$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
|
$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
|
||||||
$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
|
$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
|
||||||
//$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
|
//$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
|
||||||
|
|
||||||
$this->db = $db;
|
$this->db = $db;
|
||||||
|
|
||||||
if (!$conf->oauth->enabled) {
|
if (!$conf->oauth->enabled) {
|
||||||
@ -117,10 +118,28 @@ class printing_printgcp extends PrintingDriver
|
|||||||
$this->conf[] = array('varname'=>'PRINTGCP_INFO', 'info'=>'GoogleAuthConfigured', 'type'=>'info');
|
$this->conf[] = array('varname'=>'PRINTGCP_INFO', 'info'=>'GoogleAuthConfigured', 'type'=>'info');
|
||||||
$this->conf[] = array('varname'=>'PRINTGCP_TOKEN_ACCESS', 'info'=>$access, 'type'=>'info', 'renew'=>$urlwithroot.'/core/modules/oauth/google_oauthcallback.php?state=userinfo_email,userinfo_profile,cloud_print&backtourl='.urlencode(DOL_URL_ROOT.'/printing/admin/printing.php?mode=setup&driver=printgcp'), 'delete'=>($storage->hasAccessToken($this->OAUTH_SERVICENAME_GOOGLE)?$urlwithroot.'/core/modules/oauth/google_oauthcallback.php?action=delete&backtourl='.urlencode(DOL_URL_ROOT.'/printing/admin/printing.php?mode=setup&driver=printgcp'):''));
|
$this->conf[] = array('varname'=>'PRINTGCP_TOKEN_ACCESS', 'info'=>$access, 'type'=>'info', 'renew'=>$urlwithroot.'/core/modules/oauth/google_oauthcallback.php?state=userinfo_email,userinfo_profile,cloud_print&backtourl='.urlencode(DOL_URL_ROOT.'/printing/admin/printing.php?mode=setup&driver=printgcp'), 'delete'=>($storage->hasAccessToken($this->OAUTH_SERVICENAME_GOOGLE)?$urlwithroot.'/core/modules/oauth/google_oauthcallback.php?action=delete&backtourl='.urlencode(DOL_URL_ROOT.'/printing/admin/printing.php?mode=setup&driver=printgcp'):''));
|
||||||
if ($token_ok) {
|
if ($token_ok) {
|
||||||
|
$expiredat='';
|
||||||
|
|
||||||
$refreshtoken = $token->getRefreshToken();
|
$refreshtoken = $token->getRefreshToken();
|
||||||
|
|
||||||
|
$endoflife=$token->getEndOfLife();
|
||||||
|
|
||||||
|
if ($endoflife == $token::EOL_NEVER_EXPIRES)
|
||||||
|
{
|
||||||
|
$expiredat = $langs->trans("Never");
|
||||||
|
}
|
||||||
|
elseif ($endoflife == $token::EOL_UNKNOWN)
|
||||||
|
{
|
||||||
|
$expiredat = $langs->trans("Unknown");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$expiredat=dol_print_date($endoflife, "dayhour");
|
||||||
|
}
|
||||||
|
|
||||||
$this->conf[] = array('varname'=>'TOKEN_REFRESH', 'info'=>((! empty($refreshtoken))?'Yes':'No'), 'type'=>'info');
|
$this->conf[] = array('varname'=>'TOKEN_REFRESH', 'info'=>((! empty($refreshtoken))?'Yes':'No'), 'type'=>'info');
|
||||||
$this->conf[] = array('varname'=>'TOKEN_EXPIRED', 'info'=>($expire?'Yes':'No'), 'type'=>'info');
|
$this->conf[] = array('varname'=>'TOKEN_EXPIRED', 'info'=>($expire?'Yes':'No'), 'type'=>'info');
|
||||||
$this->conf[] = array('varname'=>'TOKEN_EXPIRE_AT', 'info'=>(dol_print_date($token->getEndOfLife(), "dayhour")), 'type'=>'info');
|
$this->conf[] = array('varname'=>'TOKEN_EXPIRE_AT', 'info'=>($expiredat), 'type'=>'info');
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
if ($storage->hasAccessToken($this->OAUTH_SERVICENAME_GOOGLE)) {
|
if ($storage->hasAccessToken($this->OAUTH_SERVICENAME_GOOGLE)) {
|
||||||
|
|||||||
@ -108,8 +108,8 @@ class pdf_azur extends ModelePDFPropales
|
|||||||
{
|
{
|
||||||
$this->posxtva=99;
|
$this->posxtva=99;
|
||||||
$this->posxup=114;
|
$this->posxup=114;
|
||||||
$this->posxqty=133;
|
$this->posxqty=130;
|
||||||
$this->posxunit=150;
|
$this->posxunit=147;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@ -102,8 +102,8 @@ class pdf_canelle extends ModelePDFSuppliersInvoices
|
|||||||
if($conf->global->PRODUCT_USE_UNITS) {
|
if($conf->global->PRODUCT_USE_UNITS) {
|
||||||
$this->posxtva=99;
|
$this->posxtva=99;
|
||||||
$this->posxup=114;
|
$this->posxup=114;
|
||||||
$this->posxqty=133;
|
$this->posxqty=130;
|
||||||
$this->posxunit=150;
|
$this->posxunit=147;
|
||||||
}
|
}
|
||||||
//if (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT)) $this->posxtva=$this->posxup;
|
//if (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT)) $this->posxtva=$this->posxup;
|
||||||
$this->posxpicture=$this->posxtva - (empty($conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH)?20:$conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH); // width of images
|
$this->posxpicture=$this->posxtva - (empty($conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH)?20:$conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH); // width of images
|
||||||
|
|||||||
@ -111,8 +111,8 @@ class pdf_muscadet extends ModelePDFSuppliersOrders
|
|||||||
{
|
{
|
||||||
$this->posxtva=99;
|
$this->posxtva=99;
|
||||||
$this->posxup=114;
|
$this->posxup=114;
|
||||||
$this->posxqty=133;
|
$this->posxqty=130;
|
||||||
$this->posxunit=150;
|
$this->posxunit=147;
|
||||||
} else {
|
} else {
|
||||||
$this->posxtva=112;
|
$this->posxtva=112;
|
||||||
$this->posxup=126;
|
$this->posxup=126;
|
||||||
|
|||||||
@ -139,6 +139,45 @@ if ($action == 'confirm_resize' && (isset($_POST["file"]) != "") && (isset($_POS
|
|||||||
{
|
{
|
||||||
$object->addThumbs($fullpath);
|
$object->addThumbs($fullpath);
|
||||||
|
|
||||||
|
// Update/create database for file $fullpath
|
||||||
|
$rel_filename = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $fullpath);
|
||||||
|
$rel_filename = preg_replace('/^[\\/]/','',$rel_filename);
|
||||||
|
|
||||||
|
include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
|
||||||
|
$ecmfile=new EcmFiles($db);
|
||||||
|
$result = $ecmfile->fetch(0, '', $rel_filename);
|
||||||
|
if ($result > 0) // If found
|
||||||
|
{
|
||||||
|
$filename = basename($rel_filename);
|
||||||
|
$rel_dir = dirname($rel_filename);
|
||||||
|
$rel_dir = preg_replace('/[\\/]$/', '', $rel_dir);
|
||||||
|
$rel_dir = preg_replace('/^[\\/]/', '', $rel_dir);
|
||||||
|
|
||||||
|
$ecmfile->label = md5_file(dol_osencode($fullpath));
|
||||||
|
$result = $ecmfile->update($user);
|
||||||
|
}
|
||||||
|
elseif ($result == 0) // If not found
|
||||||
|
{
|
||||||
|
$filename = basename($rel_filename);
|
||||||
|
$rel_dir = dirname($rel_filename);
|
||||||
|
$rel_dir = preg_replace('/[\\/]$/', '', $rel_dir);
|
||||||
|
$rel_dir = preg_replace('/^[\\/]/', '', $rel_dir);
|
||||||
|
|
||||||
|
$ecmfile->filepath = $rel_dir;
|
||||||
|
$ecmfile->filename = $filename;
|
||||||
|
$ecmfile->label = md5_file(dol_osencode($fullpath)); // $fullpath is a full path to file
|
||||||
|
$ecmfile->fullpath_orig = $fullpath;
|
||||||
|
$ecmfile->gen_or_uploaded = 'unknown';
|
||||||
|
$ecmfile->description = ''; // indexed content
|
||||||
|
$ecmfile->keyword = ''; // keyword content
|
||||||
|
$result = $ecmfile->create($user);
|
||||||
|
if ($result < 0)
|
||||||
|
{
|
||||||
|
setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings');
|
||||||
|
}
|
||||||
|
$result = $ecmfile->create($user);
|
||||||
|
}
|
||||||
|
|
||||||
if ($backtourl)
|
if ($backtourl)
|
||||||
{
|
{
|
||||||
header("Location: ".$backtourl);
|
header("Location: ".$backtourl);
|
||||||
@ -168,6 +207,45 @@ if ($action == 'confirm_crop')
|
|||||||
{
|
{
|
||||||
$object->addThumbs($fullpath);
|
$object->addThumbs($fullpath);
|
||||||
|
|
||||||
|
// Update/create database for file $fullpath
|
||||||
|
$rel_filename = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $fullpath);
|
||||||
|
$rel_filename = preg_replace('/^[\\/]/','',$rel_filename);
|
||||||
|
|
||||||
|
include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
|
||||||
|
$ecmfile=new EcmFiles($db);
|
||||||
|
$result = $ecmfile->fetch(0, '', $rel_filename);
|
||||||
|
if ($result > 0) // If found
|
||||||
|
{
|
||||||
|
$filename = basename($rel_filename);
|
||||||
|
$rel_dir = dirname($rel_filename);
|
||||||
|
$rel_dir = preg_replace('/[\\/]$/', '', $rel_dir);
|
||||||
|
$rel_dir = preg_replace('/^[\\/]/', '', $rel_dir);
|
||||||
|
|
||||||
|
$ecmfile->label = md5_file(dol_osencode($fullpath));
|
||||||
|
$result = $ecmfile->update($user);
|
||||||
|
}
|
||||||
|
elseif ($result == 0) // If not found
|
||||||
|
{
|
||||||
|
$filename = basename($rel_filename);
|
||||||
|
$rel_dir = dirname($rel_filename);
|
||||||
|
$rel_dir = preg_replace('/[\\/]$/', '', $rel_dir);
|
||||||
|
$rel_dir = preg_replace('/^[\\/]/', '', $rel_dir);
|
||||||
|
|
||||||
|
$ecmfile->filepath = $rel_dir;
|
||||||
|
$ecmfile->filename = $filename;
|
||||||
|
$ecmfile->label = md5_file(dol_osencode($fullpath)); // $fullpath is a full path to file
|
||||||
|
$ecmfile->fullpath_orig = $fullpath;
|
||||||
|
$ecmfile->gen_or_uploaded = 'unknown';
|
||||||
|
$ecmfile->description = ''; // indexed content
|
||||||
|
$ecmfile->keyword = ''; // keyword content
|
||||||
|
$result = $ecmfile->create($user);
|
||||||
|
if ($result < 0)
|
||||||
|
{
|
||||||
|
setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings');
|
||||||
|
}
|
||||||
|
$result = $ecmfile->create($user);
|
||||||
|
}
|
||||||
|
|
||||||
if ($backtourl)
|
if ($backtourl)
|
||||||
{
|
{
|
||||||
header("Location: ".$backtourl);
|
header("Location: ".$backtourl);
|
||||||
@ -218,10 +296,11 @@ print '<legend>'.$langs->trans("Resize").'</legend>';
|
|||||||
print $langs->trans("ResizeDesc").'<br>';
|
print $langs->trans("ResizeDesc").'<br>';
|
||||||
print $langs->trans("NewLength").': <input class="flat" name="sizex" size="10" type="text" > px '.$langs->trans("or").' ';
|
print $langs->trans("NewLength").': <input class="flat" name="sizex" size="10" type="text" > px '.$langs->trans("or").' ';
|
||||||
print $langs->trans("NewHeight").': <input class="flat" name="sizey" size="10" type="text" > px <br>';
|
print $langs->trans("NewHeight").': <input class="flat" name="sizey" size="10" type="text" > px <br>';
|
||||||
|
|
||||||
print '<input type="hidden" name="file" value="'.dol_escape_htmltag(GETPOST('file')).'" />';
|
print '<input type="hidden" name="file" value="'.dol_escape_htmltag(GETPOST('file')).'" />';
|
||||||
print '<input type="hidden" name="action" value="confirm_resize" />';
|
print '<input type="hidden" name="action" value="confirm_resize" />';
|
||||||
print '<input type="hidden" name="product" value="'.$id.'" />';
|
print '<input type="hidden" name="product" value="'.$id.'" />';
|
||||||
print '<input type="hidden" name="modulepart" value="'.$modulepart.'" />';
|
print '<input type="hidden" name="modulepart" value="'.dol_escape_htmltag($modulepart).'" />';
|
||||||
print '<input type="hidden" name="id" value="'.$id.'" />';
|
print '<input type="hidden" name="id" value="'.$id.'" />';
|
||||||
print '<br>';
|
print '<br>';
|
||||||
print '<input class="button" id="submitresize" name="sendit" value="'.dol_escape_htmltag($langs->trans("Resize")).'" type="submit" />';
|
print '<input class="button" id="submitresize" name="sendit" value="'.dol_escape_htmltag($langs->trans("Resize")).'" type="submit" />';
|
||||||
|
|||||||
@ -17,18 +17,19 @@
|
|||||||
*
|
*
|
||||||
* Javascript code to activate drag and drop on lines
|
* Javascript code to activate drag and drop on lines
|
||||||
* You can use this if you want to be abale to drag and drop rows of a table.
|
* You can use this if you want to be abale to drag and drop rows of a table.
|
||||||
* You must add id="tablelines" on table level tag and have count($object->lines) or count($taskarray) > 0
|
* You must add id="tablelines" on table level tag and have ($nboflines or count($object->lines) or count($taskarray) > 0)
|
||||||
*/
|
*/
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<!-- BEGIN PHP TEMPLATE AJAXROW.TPL.PHP -->
|
<!-- BEGIN PHP TEMPLATE AJAXROW.TPL.PHP - Script to enable drag and drop on tables -->
|
||||||
<?php
|
<?php
|
||||||
$id=$object->id;
|
$id=$object->id;
|
||||||
$fk_element=$object->fk_element;
|
$fk_element=$object->fk_element;
|
||||||
$table_element_line=$object->table_element_line;
|
$table_element_line=(empty($table_element_line)?$object->table_element_line:$table_element_line);
|
||||||
$nboflines=(isset($object->lines)?count($object->lines):(isset($tasksarray)?count($tasksarray):0));
|
$nboflines=(isset($object->lines)?count($object->lines):(isset($tasksarray)?count($tasksarray):(empty($nboflines)?0:$nboflines)));
|
||||||
$forcereloadpage=empty($conf->global->MAIN_FORCE_RELOAD_PAGE)?0:1;
|
$forcereloadpage=empty($conf->global->MAIN_FORCE_RELOAD_PAGE)?0:1;
|
||||||
$tagidfortablednd=(empty($tagidfortablednd)?'tablelines':$tagidfortablednd);
|
$tagidfortablednd=(empty($tagidfortablednd)?'tablelines':$tagidfortablednd);
|
||||||
|
$filepath=(empty($filepath)?'':$filepath);
|
||||||
|
|
||||||
if (GETPOST('action') != 'editline' && $nboflines > 1) { ?>
|
if (GETPOST('action') != 'editline' && $nboflines > 1) { ?>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
@ -43,16 +44,19 @@ $(document).ready(function(){
|
|||||||
$("#<?php echo $tagidfortablednd; ?>").tableDnD({
|
$("#<?php echo $tagidfortablednd; ?>").tableDnD({
|
||||||
onDrop: function(table, row) {
|
onDrop: function(table, row) {
|
||||||
var reloadpage = "<?php echo $forcereloadpage; ?>";
|
var reloadpage = "<?php echo $forcereloadpage; ?>";
|
||||||
|
console.log($("#<?php echo $tagidfortablednd; ?>").tableDnDSerialize());
|
||||||
var roworder = cleanSerialize($("#<?php echo $tagidfortablednd; ?>").tableDnDSerialize());
|
var roworder = cleanSerialize($("#<?php echo $tagidfortablednd; ?>").tableDnDSerialize());
|
||||||
var table_element_line = "<?php echo $table_element_line; ?>";
|
var table_element_line = "<?php echo $table_element_line; ?>";
|
||||||
var fk_element = "<?php echo $fk_element; ?>";
|
var fk_element = "<?php echo $fk_element; ?>";
|
||||||
var element_id = "<?php echo $id; ?>";
|
var element_id = "<?php echo $id; ?>";
|
||||||
|
var filepath = "<?php echo urlencode($filepath); ?>";
|
||||||
$.post("<?php echo DOL_URL_ROOT; ?>/core/ajax/row.php",
|
$.post("<?php echo DOL_URL_ROOT; ?>/core/ajax/row.php",
|
||||||
{
|
{
|
||||||
roworder: roworder,
|
roworder: roworder,
|
||||||
table_element_line: table_element_line,
|
table_element_line: table_element_line,
|
||||||
fk_element: fk_element,
|
fk_element: fk_element,
|
||||||
element_id: element_id
|
element_id: element_id,
|
||||||
|
filepath: filepath
|
||||||
},
|
},
|
||||||
function() {
|
function() {
|
||||||
if (reloadpage == 1) {
|
if (reloadpage == 1) {
|
||||||
|
|||||||
@ -72,6 +72,9 @@ $formfile->form_attach_new_file(
|
|||||||
$savingdocmask
|
$savingdocmask
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$disablemove=1;
|
||||||
|
if ($modulepart == 'produit') $disablemove=0;
|
||||||
|
|
||||||
// List of document
|
// List of document
|
||||||
$formfile->list_of_documents(
|
$formfile->list_of_documents(
|
||||||
$filearray,
|
$filearray,
|
||||||
@ -79,7 +82,7 @@ $formfile->list_of_documents(
|
|||||||
$modulepart,
|
$modulepart,
|
||||||
$param,
|
$param,
|
||||||
0,
|
0,
|
||||||
$relativepathwithnofile, // relative path with no file. For example "moduledir/0/1"
|
$relativepathwithnofile, // relative path with no file. For example "0/1"
|
||||||
$permission,
|
$permission,
|
||||||
0,
|
0,
|
||||||
'',
|
'',
|
||||||
@ -87,7 +90,11 @@ $formfile->list_of_documents(
|
|||||||
'',
|
'',
|
||||||
'',
|
'',
|
||||||
0,
|
0,
|
||||||
$permtoedit
|
$permtoedit,
|
||||||
|
$upload_dir,
|
||||||
|
$sortfield,
|
||||||
|
$sortorder,
|
||||||
|
$disablemove
|
||||||
);
|
);
|
||||||
|
|
||||||
print "<br>";
|
print "<br>";
|
||||||
|
|||||||
@ -89,7 +89,7 @@ $(document).ready(function () {
|
|||||||
|
|
||||||
<div id="login_right">
|
<div id="login_right">
|
||||||
|
|
||||||
<table class="left centpercent" title="Login pass">
|
<table class="left centpercent" title="<?php echo $langs->trans("EnterLoginDetail"); ?>">
|
||||||
<!-- Login -->
|
<!-- Login -->
|
||||||
<tr>
|
<tr>
|
||||||
<td class="nowrap center valignmiddle">
|
<td class="nowrap center valignmiddle">
|
||||||
@ -102,9 +102,9 @@ $(document).ready(function () {
|
|||||||
<!-- Password -->
|
<!-- Password -->
|
||||||
<tr>
|
<tr>
|
||||||
<td class="nowrap center valignmiddle">
|
<td class="nowrap center valignmiddle">
|
||||||
<?php if (! empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) { ?><label for="password" hidden><?php echo $langs->trans("Password"); ?></label><?php } ?>
|
<?php if (! empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) { ?><label for="password" class="hidden"><?php echo $langs->trans("Password"); ?></label><?php } ?>
|
||||||
<span class="span-icon-password">
|
<span class="span-icon-password">
|
||||||
<input id="password" placeholder="<?php echo $langs->trans("Password"); ?>" name="password" class="flat input-icon-password" type="password" size="20" value="<?php echo dol_escape_htmltag($password); ?>" tabindex="2" autocomplete="off" />
|
<input id="password" placeholder="<?php echo $langs->trans("Password"); ?>" name="password" class="flat input-icon-password" type="password" size="20" value="<?php echo dol_escape_htmltag($password); ?>" tabindex="2" autocomplete="<?php echo empty($conf->global->MAIN_LOGIN_ENABLE_PASSWORD_AUTOCOMPLETE)?'off':'on'; ?>" />
|
||||||
</span>
|
</span>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<?php
|
<?php
|
||||||
|
|||||||
@ -109,7 +109,7 @@ if (empty($modulepart)) accessforbidden('Bad value for parameter modulepart');
|
|||||||
$check_access = dol_check_secure_access_document($modulepart,$original_file,$entity,$refname);
|
$check_access = dol_check_secure_access_document($modulepart,$original_file,$entity,$refname);
|
||||||
$accessallowed = $check_access['accessallowed'];
|
$accessallowed = $check_access['accessallowed'];
|
||||||
$sqlprotectagainstexternals = $check_access['sqlprotectagainstexternals'];
|
$sqlprotectagainstexternals = $check_access['sqlprotectagainstexternals'];
|
||||||
$original_file = $check_access['original_file'];
|
$original_file = $check_access['original_file']; // original_file is now a full path name
|
||||||
|
|
||||||
// Basic protection (against external users only)
|
// Basic protection (against external users only)
|
||||||
if ($user->societe_id > 0)
|
if ($user->societe_id > 0)
|
||||||
|
|||||||
@ -126,7 +126,7 @@ if ($object->id)
|
|||||||
if ($user->rights->don->creer)
|
if ($user->rights->don->creer)
|
||||||
{
|
{
|
||||||
if ($action != 'classify')
|
if ($action != 'classify')
|
||||||
$morehtmlref.='<a href="' . $_SERVER['PHP_SELF'] . '?action=classify&id=' . $object->id . '">' . img_edit($langs->transnoentitiesnoconv('SetProject')) . '</a> : ';
|
// $morehtmlref.='<a href="' . $_SERVER['PHP_SELF'] . '?action=classify&id=' . $object->id . '">' . img_edit($langs->transnoentitiesnoconv('SetProject')) . '</a> : ';
|
||||||
if ($action == 'classify') {
|
if ($action == 'classify') {
|
||||||
//$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
|
//$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
|
||||||
$morehtmlref.='<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
|
$morehtmlref.='<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
|
||||||
|
|||||||
@ -80,7 +80,7 @@ if (! empty($conf->projet->enabled))
|
|||||||
if ($user->rights->don->creer)
|
if ($user->rights->don->creer)
|
||||||
{
|
{
|
||||||
if ($action != 'classify')
|
if ($action != 'classify')
|
||||||
$morehtmlref.='<a href="' . $_SERVER['PHP_SELF'] . '?action=classify&id=' . $object->id . '">' . img_edit($langs->transnoentitiesnoconv('SetProject')) . '</a> : ';
|
// $morehtmlref.='<a href="' . $_SERVER['PHP_SELF'] . '?action=classify&id=' . $object->id . '">' . img_edit($langs->transnoentitiesnoconv('SetProject')) . '</a> : ';
|
||||||
if ($action == 'classify') {
|
if ($action == 'classify') {
|
||||||
//$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
|
//$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
|
||||||
$morehtmlref.='<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
|
$morehtmlref.='<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
|
||||||
|
|||||||
@ -97,7 +97,7 @@ if ($id > 0 || ! empty($ref))
|
|||||||
if ($user->rights->don->creer)
|
if ($user->rights->don->creer)
|
||||||
{
|
{
|
||||||
if ($action != 'classify')
|
if ($action != 'classify')
|
||||||
$morehtmlref.='<a href="' . $_SERVER['PHP_SELF'] . '?action=classify&id=' . $object->id . '">' . img_edit($langs->transnoentitiesnoconv('SetProject')) . '</a> : ';
|
// $morehtmlref.='<a href="' . $_SERVER['PHP_SELF'] . '?action=classify&id=' . $object->id . '">' . img_edit($langs->transnoentitiesnoconv('SetProject')) . '</a> : ';
|
||||||
if ($action == 'classify') {
|
if ($action == 'classify') {
|
||||||
//$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
|
//$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
|
||||||
$morehtmlref.='<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
|
$morehtmlref.='<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
|
||||||
|
|||||||
@ -23,8 +23,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \class EcmDirectory
|
* Class to manage ECM directories
|
||||||
* \brief Class to manage ECM directories
|
|
||||||
*/
|
*/
|
||||||
class EcmDirectory // extends CommonObject
|
class EcmDirectory // extends CommonObject
|
||||||
{
|
{
|
||||||
|
|||||||
782
htdocs/ecm/class/ecmfiles.class.php
Normal file
782
htdocs/ecm/class/ecmfiles.class.php
Normal file
@ -0,0 +1,782 @@
|
|||||||
|
<?php
|
||||||
|
/* Copyright (C) 2007-2012 Laurent Destailleur <eldy@users.sourceforge.net>
|
||||||
|
* Copyright (C) 2014-2016 Juanjo Menent <jmenent@2byte.es>
|
||||||
|
* Copyright (C) 2015 Florian Henry <florian.henry@open-concept.pro>
|
||||||
|
* Copyright (C) 2015 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
|
||||||
|
* Copyright (C) ---Put here your own copyright and developer email---
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file ecm/ecmfiles.class.php
|
||||||
|
* \ingroup ecm
|
||||||
|
* \brief Class to manage ECM Files (Create/Read/Update/Delete)
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Put here all includes required by your class file
|
||||||
|
require_once DOL_DOCUMENT_ROOT . '/core/class/commonobject.class.php';
|
||||||
|
//require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
|
||||||
|
//require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to manage ECM files
|
||||||
|
*/
|
||||||
|
class EcmFiles //extends CommonObject
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var string Id to identify managed objects
|
||||||
|
*/
|
||||||
|
public $element = 'ecmfiles';
|
||||||
|
/**
|
||||||
|
* @var string Name of table without prefix where object is stored
|
||||||
|
*/
|
||||||
|
public $table_element = 'ecm_files';
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public $label;
|
||||||
|
public $entity;
|
||||||
|
public $filename;
|
||||||
|
public $filepath;
|
||||||
|
public $fullpath_orig;
|
||||||
|
public $description;
|
||||||
|
public $keywords;
|
||||||
|
public $cover;
|
||||||
|
public $position;
|
||||||
|
public $gen_or_uploaded; // can be 'generated', 'uploaded', 'unknown'
|
||||||
|
public $extraparams;
|
||||||
|
public $date_c = '';
|
||||||
|
public $date_m = '';
|
||||||
|
public $fk_user_c;
|
||||||
|
public $fk_user_m;
|
||||||
|
public $acl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* @param DoliDb $db Database handler
|
||||||
|
*/
|
||||||
|
public function __construct(DoliDB $db)
|
||||||
|
{
|
||||||
|
$this->db = $db;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create object into database
|
||||||
|
*
|
||||||
|
* @param User $user User that creates
|
||||||
|
* @param bool $notrigger false=launch triggers after, true=disable triggers
|
||||||
|
*
|
||||||
|
* @return int <0 if KO, Id of created object if OK
|
||||||
|
*/
|
||||||
|
public function create(User $user, $notrigger = false)
|
||||||
|
{
|
||||||
|
global $conf;
|
||||||
|
|
||||||
|
dol_syslog(__METHOD__, LOG_DEBUG);
|
||||||
|
|
||||||
|
$error = 0;
|
||||||
|
|
||||||
|
// Clean parameters
|
||||||
|
|
||||||
|
if (isset($this->label)) {
|
||||||
|
$this->label = trim($this->label);
|
||||||
|
}
|
||||||
|
if (isset($this->entity)) {
|
||||||
|
$this->entity = trim($this->entity);
|
||||||
|
}
|
||||||
|
if (isset($this->filename)) {
|
||||||
|
$this->filename = trim($this->filename);
|
||||||
|
}
|
||||||
|
if (isset($this->filepath)) {
|
||||||
|
$this->filepath = trim($this->filepath);
|
||||||
|
}
|
||||||
|
if (isset($this->fullpath_orig)) {
|
||||||
|
$this->fullpath_orig = trim($this->fullpath_orig);
|
||||||
|
}
|
||||||
|
if (isset($this->description)) {
|
||||||
|
$this->description = trim($this->description);
|
||||||
|
}
|
||||||
|
if (isset($this->keywords)) {
|
||||||
|
$this->keywords = trim($this->keywords);
|
||||||
|
}
|
||||||
|
if (isset($this->cover)) {
|
||||||
|
$this->cover = trim($this->cover);
|
||||||
|
}
|
||||||
|
if (isset($this->gen_or_uploaded)) {
|
||||||
|
$this->gen_or_uploaded = trim($this->gen_or_uploaded);
|
||||||
|
}
|
||||||
|
if (isset($this->extraparams)) {
|
||||||
|
$this->extraparams = trim($this->extraparams);
|
||||||
|
}
|
||||||
|
if (isset($this->fk_user_c)) {
|
||||||
|
$this->fk_user_c = trim($this->fk_user_c);
|
||||||
|
}
|
||||||
|
if (isset($this->fk_user_m)) {
|
||||||
|
$this->fk_user_m = trim($this->fk_user_m);
|
||||||
|
}
|
||||||
|
if (isset($this->acl)) {
|
||||||
|
$this->acl = trim($this->acl);
|
||||||
|
}
|
||||||
|
if (empty($this->date_c)) $this->date_c = dol_now();
|
||||||
|
|
||||||
|
$maxposition=0;
|
||||||
|
if (empty($this->position)) // Get max used
|
||||||
|
{
|
||||||
|
$sql = "SELECT MAX(position) as maxposition FROM " . MAIN_DB_PREFIX . $this->table_element;
|
||||||
|
$sql.= " WHERE filepath ='".$this->filepath."'";
|
||||||
|
|
||||||
|
$resql = $this->db->query($sql);
|
||||||
|
if ($resql)
|
||||||
|
{
|
||||||
|
$obj = $this->db->fetch_object($resql);
|
||||||
|
$maxposition = (int) $obj->maxposition;
|
||||||
|
}
|
||||||
|
else dol_print_error($this->db);
|
||||||
|
}
|
||||||
|
$maxposition=$maxposition+1;
|
||||||
|
|
||||||
|
// Check parameters
|
||||||
|
// Put here code to add control on parameters values
|
||||||
|
|
||||||
|
// Insert request
|
||||||
|
$sql = 'INSERT INTO ' . MAIN_DB_PREFIX . $this->table_element . '(';
|
||||||
|
$sql.= 'label,';
|
||||||
|
$sql.= 'entity,';
|
||||||
|
$sql.= 'filename,';
|
||||||
|
$sql.= 'filepath,';
|
||||||
|
$sql.= 'fullpath_orig,';
|
||||||
|
$sql.= 'description,';
|
||||||
|
$sql.= 'keywords,';
|
||||||
|
$sql.= 'cover,';
|
||||||
|
$sql.= 'position,';
|
||||||
|
$sql.= 'gen_or_uploaded,';
|
||||||
|
$sql.= 'extraparams,';
|
||||||
|
$sql.= 'date_c,';
|
||||||
|
$sql.= 'date_m,';
|
||||||
|
$sql.= 'fk_user_c,';
|
||||||
|
$sql.= 'fk_user_m,';
|
||||||
|
$sql.= 'acl';
|
||||||
|
$sql .= ') VALUES (';
|
||||||
|
$sql .= ' '.(! isset($this->label)?'NULL':"'".$this->db->escape($this->label)."'").',';
|
||||||
|
$sql .= ' '.(! isset($this->entity)?$conf->entity:$this->entity).',';
|
||||||
|
$sql .= ' '.(! isset($this->filename)?'NULL':"'".$this->db->escape($this->filename)."'").',';
|
||||||
|
$sql .= ' '.(! isset($this->filepath)?'NULL':"'".$this->db->escape($this->filepath)."'").',';
|
||||||
|
$sql .= ' '.(! isset($this->fullpath_orig)?'NULL':"'".$this->db->escape($this->fullpath_orig)."'").',';
|
||||||
|
$sql .= ' '.(! isset($this->description)?'NULL':"'".$this->db->escape($this->description)."'").',';
|
||||||
|
$sql .= ' '.(! isset($this->keywords)?'NULL':"'".$this->db->escape($this->keywords)."'").',';
|
||||||
|
$sql .= ' '.(! isset($this->cover)?'NULL':"'".$this->db->escape($this->cover)."'").',';
|
||||||
|
$sql .= ' '.$maxposition.',';
|
||||||
|
$sql .= ' '.(! isset($this->gen_or_uploaded)?'NULL':"'".$this->db->escape($this->gen_or_uploaded)."'").',';
|
||||||
|
$sql .= ' '.(! isset($this->extraparams)?'NULL':"'".$this->db->escape($this->extraparams)."'").',';
|
||||||
|
$sql .= ' '."'".$this->db->idate($this->date_c)."'".',';
|
||||||
|
$sql .= ' '.(! isset($this->date_m) || dol_strlen($this->date_m)==0?'NULL':"'".$this->db->idate($this->date_m)."'").',';
|
||||||
|
$sql .= ' '.(! isset($this->fk_user_c)?$user->id:$this->fk_user_c).',';
|
||||||
|
$sql .= ' '.(! isset($this->fk_user_m)?'NULL':$this->fk_user_m).',';
|
||||||
|
$sql .= ' '.(! isset($this->acl)?'NULL':"'".$this->db->escape($this->acl)."'");
|
||||||
|
$sql .= ')';
|
||||||
|
|
||||||
|
$this->db->begin();
|
||||||
|
|
||||||
|
$resql = $this->db->query($sql);
|
||||||
|
if (!$resql) {
|
||||||
|
$error ++;
|
||||||
|
$this->errors[] = 'Error ' . $this->db->lasterror();
|
||||||
|
dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . $this->table_element);
|
||||||
|
$this->position = $maxposition;
|
||||||
|
|
||||||
|
if (!$notrigger) {
|
||||||
|
// Uncomment this and change MYOBJECT to your own tag if you
|
||||||
|
// want this action to call a trigger.
|
||||||
|
|
||||||
|
//// Call triggers
|
||||||
|
//$result=$this->call_trigger('MYOBJECT_CREATE',$user);
|
||||||
|
//if ($result < 0) $error++;
|
||||||
|
//// End call triggers
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Commit or rollback
|
||||||
|
if ($error) {
|
||||||
|
$this->db->rollback();
|
||||||
|
|
||||||
|
return - 1 * $error;
|
||||||
|
} else {
|
||||||
|
$this->db->commit();
|
||||||
|
|
||||||
|
return $this->id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load object in memory from the database
|
||||||
|
*
|
||||||
|
* @param int $id Id object
|
||||||
|
* @param string $ref Not used yet. Will contains a hash id from filename+filepath
|
||||||
|
* @param string $fullpath Full path of file (relative path to document directory)
|
||||||
|
* @return int <0 if KO, 0 if not found, >0 if OK
|
||||||
|
*/
|
||||||
|
public function fetch($id, $ref = null, $fullpath = '')
|
||||||
|
{
|
||||||
|
dol_syslog(__METHOD__, LOG_DEBUG);
|
||||||
|
|
||||||
|
$sql = 'SELECT';
|
||||||
|
$sql .= ' t.rowid,';
|
||||||
|
$sql .= " t.ref,";
|
||||||
|
$sql .= " t.label,";
|
||||||
|
$sql .= " t.entity,";
|
||||||
|
$sql .= " t.filename,";
|
||||||
|
$sql .= " t.filepath,";
|
||||||
|
$sql .= " t.fullpath_orig,";
|
||||||
|
$sql .= " t.description,";
|
||||||
|
$sql .= " t.keywords,";
|
||||||
|
$sql .= " t.cover,";
|
||||||
|
$sql .= " t.position,";
|
||||||
|
$sql .= " t.gen_or_uploaded,";
|
||||||
|
$sql .= " t.extraparams,";
|
||||||
|
$sql .= " t.date_c,";
|
||||||
|
$sql .= " t.date_m,";
|
||||||
|
$sql .= " t.fk_user_c,";
|
||||||
|
$sql .= " t.fk_user_m,";
|
||||||
|
$sql .= " t.acl";
|
||||||
|
$sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element . ' as t';
|
||||||
|
$sql.= ' WHERE 1 = 1';
|
||||||
|
/* Fetching this table depends on filepath+filename, it must not depends on entity
|
||||||
|
if (! empty($conf->multicompany->enabled)) {
|
||||||
|
$sql .= " AND entity IN (" . getEntity("ecmfiles", 1) . ")";
|
||||||
|
}*/
|
||||||
|
if ($fullpath) {
|
||||||
|
$sql .= " AND t.filepath = '" . $this->db->escape(dirname($fullpath)) . "' AND t.filename = '".$this->db->escape(basename($fullpath))."'";
|
||||||
|
}
|
||||||
|
elseif (null !== $ref) {
|
||||||
|
$sql .= " AND t.ref = '".$this->db->escape($ref)."'";
|
||||||
|
} else {
|
||||||
|
$sql .= ' AND t.rowid = ' . $id;
|
||||||
|
}
|
||||||
|
|
||||||
|
$resql = $this->db->query($sql);
|
||||||
|
if ($resql) {
|
||||||
|
$numrows = $this->db->num_rows($resql);
|
||||||
|
if ($numrows) {
|
||||||
|
$obj = $this->db->fetch_object($resql);
|
||||||
|
|
||||||
|
$this->id = $obj->rowid;
|
||||||
|
$this->ref = $obj->ref;
|
||||||
|
$this->label = $obj->label;
|
||||||
|
$this->entity = $obj->entity;
|
||||||
|
$this->filename = $obj->filename;
|
||||||
|
$this->filepath = $obj->filepath;
|
||||||
|
$this->fullpath_orig = $obj->fullpath_orig;
|
||||||
|
$this->description = $obj->description;
|
||||||
|
$this->keywords = $obj->keywords;
|
||||||
|
$this->cover = $obj->cover;
|
||||||
|
$this->position = $obj->position;
|
||||||
|
$this->gen_or_uploaded = $obj->gen_or_uploaded;
|
||||||
|
$this->extraparams = $obj->extraparams;
|
||||||
|
$this->date_c = $this->db->jdate($obj->date_c);
|
||||||
|
$this->date_m = $this->db->jdate($obj->date_m);
|
||||||
|
$this->fk_user_c = $obj->fk_user_c;
|
||||||
|
$this->fk_user_m = $obj->fk_user_m;
|
||||||
|
$this->acl = $obj->acl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve all extrafields for invoice
|
||||||
|
// fetch optionals attributes and labels
|
||||||
|
/*
|
||||||
|
require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
|
||||||
|
$extrafields=new ExtraFields($this->db);
|
||||||
|
$extralabels=$extrafields->fetch_name_optionals_label($this->table_element,true);
|
||||||
|
$this->fetch_optionals($this->id,$extralabels);
|
||||||
|
*/
|
||||||
|
// $this->fetch_lines();
|
||||||
|
|
||||||
|
$this->db->free($resql);
|
||||||
|
|
||||||
|
if ($numrows) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$this->errors[] = 'Error ' . $this->db->lasterror();
|
||||||
|
dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
|
||||||
|
|
||||||
|
return - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load object in memory from the database
|
||||||
|
*
|
||||||
|
* @param string $sortorder Sort Order
|
||||||
|
* @param string $sortfield Sort field
|
||||||
|
* @param int $limit offset limit
|
||||||
|
* @param int $offset offset limit
|
||||||
|
* @param array $filter filter array
|
||||||
|
* @param string $filtermode filter mode (AND or OR)
|
||||||
|
*
|
||||||
|
* @return int <0 if KO, >0 if OK
|
||||||
|
*/
|
||||||
|
public function fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, array $filter = array(), $filtermode='AND')
|
||||||
|
{
|
||||||
|
dol_syslog(__METHOD__, LOG_DEBUG);
|
||||||
|
|
||||||
|
$sql = 'SELECT';
|
||||||
|
$sql .= ' t.rowid,';
|
||||||
|
$sql .= " t.label,";
|
||||||
|
$sql .= " t.entity,";
|
||||||
|
$sql .= " t.filename,";
|
||||||
|
$sql .= " t.filepath,";
|
||||||
|
$sql .= " t.fullpath_orig,";
|
||||||
|
$sql .= " t.description,";
|
||||||
|
$sql .= " t.keywords,";
|
||||||
|
$sql .= " t.cover,";
|
||||||
|
$sql .= " t.position,";
|
||||||
|
$sql .= " t.gen_or_uploaded,";
|
||||||
|
$sql .= " t.extraparams,";
|
||||||
|
$sql .= " t.date_c,";
|
||||||
|
$sql .= " t.date_m,";
|
||||||
|
$sql .= " t.fk_user_c,";
|
||||||
|
$sql .= " t.fk_user_m,";
|
||||||
|
$sql .= " t.acl";
|
||||||
|
$sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element. ' as t';
|
||||||
|
|
||||||
|
// Manage filter
|
||||||
|
$sqlwhere = array();
|
||||||
|
if (count($filter) > 0) {
|
||||||
|
foreach ($filter as $key => $value) {
|
||||||
|
$sqlwhere [] = $key . ' LIKE \'%' . $this->db->escape($value) . '%\'';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$sql.= ' WHERE 1 = 1';
|
||||||
|
/* Fetching this table depends on filepath+filename, it must not depends on entity
|
||||||
|
if (! empty($conf->multicompany->enabled)) {
|
||||||
|
$sql .= " AND entity IN (" . getEntity("ecmfiles", 1) . ")";
|
||||||
|
}*/
|
||||||
|
if (count($sqlwhere) > 0) {
|
||||||
|
$sql .= ' AND ' . implode(' '.$filtermode.' ', $sqlwhere);
|
||||||
|
}
|
||||||
|
if (!empty($sortfield)) {
|
||||||
|
$sql .= $this->db->order($sortfield,$sortorder);
|
||||||
|
}
|
||||||
|
if (!empty($limit)) {
|
||||||
|
$sql .= ' ' . $this->db->plimit($limit, $offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->lines = array();
|
||||||
|
|
||||||
|
$resql = $this->db->query($sql);
|
||||||
|
if ($resql) {
|
||||||
|
$num = $this->db->num_rows($resql);
|
||||||
|
|
||||||
|
while ($obj = $this->db->fetch_object($resql)) {
|
||||||
|
$line = new EcmfilesLine();
|
||||||
|
|
||||||
|
$line->id = $obj->rowid;
|
||||||
|
|
||||||
|
$line->label = $obj->label;
|
||||||
|
$line->entity = $obj->entity;
|
||||||
|
$line->filename = $obj->filename;
|
||||||
|
$line->filepath = $obj->filepath;
|
||||||
|
$line->fullpath_orig = $obj->fullpath_orig;
|
||||||
|
$line->description = $obj->description;
|
||||||
|
$line->keywords = $obj->keywords;
|
||||||
|
$line->cover = $obj->cover;
|
||||||
|
$line->position = $obj->position;
|
||||||
|
$line->gen_or_uploaded = $obj->gen_or_uploaded;
|
||||||
|
$line->extraparams = $obj->extraparams;
|
||||||
|
$line->date_c = $this->db->jdate($obj->date_c);
|
||||||
|
$line->date_m = $this->db->jdate($obj->date_m);
|
||||||
|
$line->fk_user_c = $obj->fk_user_c;
|
||||||
|
$line->fk_user_m = $obj->fk_user_m;
|
||||||
|
$line->acl = $obj->acl;
|
||||||
|
}
|
||||||
|
$this->db->free($resql);
|
||||||
|
|
||||||
|
return $num;
|
||||||
|
} else {
|
||||||
|
$this->errors[] = 'Error ' . $this->db->lasterror();
|
||||||
|
dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
|
||||||
|
|
||||||
|
return - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update object into database
|
||||||
|
*
|
||||||
|
* @param User $user User that modifies
|
||||||
|
* @param bool $notrigger false=launch triggers after, true=disable triggers
|
||||||
|
*
|
||||||
|
* @return int <0 if KO, >0 if OK
|
||||||
|
*/
|
||||||
|
public function update(User $user, $notrigger = false)
|
||||||
|
{
|
||||||
|
$error = 0;
|
||||||
|
|
||||||
|
dol_syslog(__METHOD__, LOG_DEBUG);
|
||||||
|
|
||||||
|
// Clean parameters
|
||||||
|
|
||||||
|
if (isset($this->label)) {
|
||||||
|
$this->label = trim($this->label);
|
||||||
|
}
|
||||||
|
if (isset($this->entity)) {
|
||||||
|
$this->entity = trim($this->entity);
|
||||||
|
}
|
||||||
|
if (isset($this->filename)) {
|
||||||
|
$this->filename = trim($this->filename);
|
||||||
|
}
|
||||||
|
if (isset($this->filepath)) {
|
||||||
|
$this->filepath = trim($this->filepath);
|
||||||
|
}
|
||||||
|
if (isset($this->fullpath_orig)) {
|
||||||
|
$this->fullpath_orig = trim($this->fullpath_orig);
|
||||||
|
}
|
||||||
|
if (isset($this->description)) {
|
||||||
|
$this->description = trim($this->description);
|
||||||
|
}
|
||||||
|
if (isset($this->keywords)) {
|
||||||
|
$this->keywords = trim($this->keywords);
|
||||||
|
}
|
||||||
|
if (isset($this->cover)) {
|
||||||
|
$this->cover = trim($this->cover);
|
||||||
|
}
|
||||||
|
if (isset($this->gen_or_uploaded)) {
|
||||||
|
$this->gen_or_uploaded = trim($this->gen_or_uploaded);
|
||||||
|
}
|
||||||
|
if (isset($this->extraparams)) {
|
||||||
|
$this->extraparams = trim($this->extraparams);
|
||||||
|
}
|
||||||
|
if (isset($this->fk_user_c)) {
|
||||||
|
$this->fk_user_c = trim($this->fk_user_c);
|
||||||
|
}
|
||||||
|
if (isset($this->fk_user_m)) {
|
||||||
|
$this->fk_user_m = trim($this->fk_user_m);
|
||||||
|
}
|
||||||
|
if (isset($this->acl)) {
|
||||||
|
$this->acl = trim($this->acl);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Check parameters
|
||||||
|
// Put here code to add a control on parameters values
|
||||||
|
|
||||||
|
// Update request
|
||||||
|
$sql = 'UPDATE ' . MAIN_DB_PREFIX . $this->table_element . ' SET';
|
||||||
|
$sql .= ' label = '.(isset($this->label)?"'".$this->db->escape($this->label)."'":"null").',';
|
||||||
|
$sql .= ' entity = '.(isset($this->entity)?$this->entity:$conf->entity).',';
|
||||||
|
$sql .= ' filename = '.(isset($this->filename)?"'".$this->db->escape($this->filename)."'":"null").',';
|
||||||
|
$sql .= ' filepath = '.(isset($this->filepath)?"'".$this->db->escape($this->filepath)."'":"null").',';
|
||||||
|
$sql .= ' fullpath_orig = '.(isset($this->fullpath_orig)?"'".$this->db->escape($this->fullpath_orig)."'":"null").',';
|
||||||
|
$sql .= ' description = '.(isset($this->description)?"'".$this->db->escape($this->description)."'":"null").',';
|
||||||
|
$sql .= ' keywords = '.(isset($this->keywords)?"'".$this->db->escape($this->keywords)."'":"null").',';
|
||||||
|
$sql .= ' cover = '.(isset($this->cover)?"'".$this->db->escape($this->cover)."'":"null").',';
|
||||||
|
$sql .= ' position = '.(isset($this->position)?$this->db->escape($this->position):"0").',';
|
||||||
|
$sql .= ' gen_or_uploaded = '.(isset($this->gen_or_uploaded)?"'".$this->db->escape($this->gen_or_uploaded)."'":"null").',';
|
||||||
|
$sql .= ' extraparams = '.(isset($this->extraparams)?"'".$this->db->escape($this->extraparams)."'":"null").',';
|
||||||
|
$sql .= ' date_c = '.(! isset($this->date_c) || dol_strlen($this->date_c) != 0 ? "'".$this->db->idate($this->date_c)."'" : 'null').',';
|
||||||
|
//$sql .= ' date_m = '.(! isset($this->date_m) || dol_strlen($this->date_m) != 0 ? "'".$this->db->idate($this->date_m)."'" : 'null').','; // Field automatically updated
|
||||||
|
$sql .= ' fk_user_c = '.(isset($this->fk_user_c)?$this->fk_user_c:"null").',';
|
||||||
|
$sql .= ' fk_user_m = '.($this->fk_user_m > 0?$this->fk_user_m:$user->id).',';
|
||||||
|
$sql .= ' acl = '.(isset($this->acl)?"'".$this->db->escape($this->acl)."'":"null");
|
||||||
|
$sql .= ' WHERE rowid=' . $this->id;
|
||||||
|
|
||||||
|
$this->db->begin();
|
||||||
|
|
||||||
|
$resql = $this->db->query($sql);
|
||||||
|
if (!$resql) {
|
||||||
|
$error ++;
|
||||||
|
$this->errors[] = 'Error ' . $this->db->lasterror();
|
||||||
|
dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$error && !$notrigger) {
|
||||||
|
// Uncomment this and change MYOBJECT to your own tag if you
|
||||||
|
// want this action calls a trigger.
|
||||||
|
|
||||||
|
//// Call triggers
|
||||||
|
//$result=$this->call_trigger('MYOBJECT_MODIFY',$user);
|
||||||
|
//if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail}
|
||||||
|
//// End call triggers
|
||||||
|
}
|
||||||
|
|
||||||
|
// Commit or rollback
|
||||||
|
if ($error) {
|
||||||
|
$this->db->rollback();
|
||||||
|
|
||||||
|
return - 1 * $error;
|
||||||
|
} else {
|
||||||
|
$this->db->commit();
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete object in database
|
||||||
|
*
|
||||||
|
* @param User $user User that deletes
|
||||||
|
* @param bool $notrigger false=launch triggers after, true=disable triggers
|
||||||
|
*
|
||||||
|
* @return int <0 if KO, >0 if OK
|
||||||
|
*/
|
||||||
|
public function delete(User $user, $notrigger = false)
|
||||||
|
{
|
||||||
|
dol_syslog(__METHOD__, LOG_DEBUG);
|
||||||
|
|
||||||
|
$error = 0;
|
||||||
|
|
||||||
|
$this->db->begin();
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
if (!$notrigger) {
|
||||||
|
// Uncomment this and change MYOBJECT to your own tag if you
|
||||||
|
// want this action calls a trigger.
|
||||||
|
|
||||||
|
//// Call triggers
|
||||||
|
//$result=$this->call_trigger('MYOBJECT_DELETE',$user);
|
||||||
|
//if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail}
|
||||||
|
//// End call triggers
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If you need to delete child tables to, you can insert them here
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$sql = 'DELETE FROM ' . MAIN_DB_PREFIX . $this->table_element;
|
||||||
|
$sql .= ' WHERE rowid=' . $this->id;
|
||||||
|
|
||||||
|
$resql = $this->db->query($sql);
|
||||||
|
if (!$resql) {
|
||||||
|
$error ++;
|
||||||
|
$this->errors[] = 'Error ' . $this->db->lasterror();
|
||||||
|
dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Commit or rollback
|
||||||
|
if ($error) {
|
||||||
|
$this->db->rollback();
|
||||||
|
|
||||||
|
return - 1 * $error;
|
||||||
|
} else {
|
||||||
|
$this->db->commit();
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load an object from its id and create a new one in database
|
||||||
|
*
|
||||||
|
* @param int $fromid Id of object to clone
|
||||||
|
*
|
||||||
|
* @return int New id of clone
|
||||||
|
*/
|
||||||
|
public function createFromClone($fromid)
|
||||||
|
{
|
||||||
|
dol_syslog(__METHOD__, LOG_DEBUG);
|
||||||
|
|
||||||
|
global $user;
|
||||||
|
$error = 0;
|
||||||
|
$object = new Ecmfiles($this->db);
|
||||||
|
|
||||||
|
$this->db->begin();
|
||||||
|
|
||||||
|
// Load source object
|
||||||
|
$object->fetch($fromid);
|
||||||
|
// Reset object
|
||||||
|
$object->id = 0;
|
||||||
|
|
||||||
|
// Clear fields
|
||||||
|
// ...
|
||||||
|
|
||||||
|
// Create clone
|
||||||
|
$result = $object->create($user);
|
||||||
|
|
||||||
|
// Other options
|
||||||
|
if ($result < 0) {
|
||||||
|
$error ++;
|
||||||
|
$this->errors = $object->errors;
|
||||||
|
dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
|
||||||
|
}
|
||||||
|
|
||||||
|
// End
|
||||||
|
if (!$error) {
|
||||||
|
$this->db->commit();
|
||||||
|
|
||||||
|
return $object->id;
|
||||||
|
} else {
|
||||||
|
$this->db->rollback();
|
||||||
|
|
||||||
|
return - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a link to the object card (with optionaly the picto)
|
||||||
|
*
|
||||||
|
* @param int $withpicto Include picto in link (0=No picto, 1=Include picto into link, 2=Only picto)
|
||||||
|
* @param string $option On what the link point to
|
||||||
|
* @param int $notooltip 1=Disable tooltip
|
||||||
|
* @param int $maxlen Max length of visible user name
|
||||||
|
* @param string $morecss Add more css on link
|
||||||
|
* @return string String with URL
|
||||||
|
*/
|
||||||
|
function getNomUrl($withpicto=0, $option='', $notooltip=0, $maxlen=24, $morecss='')
|
||||||
|
{
|
||||||
|
global $db, $conf, $langs;
|
||||||
|
global $dolibarr_main_authentication, $dolibarr_main_demo;
|
||||||
|
global $menumanager;
|
||||||
|
|
||||||
|
if (! empty($conf->dol_no_mouse_hover)) $notooltip=1; // Force disable tooltips
|
||||||
|
|
||||||
|
$result = '';
|
||||||
|
$companylink = '';
|
||||||
|
|
||||||
|
$label = '<u>' . $langs->trans("MyModule") . '</u>';
|
||||||
|
$label.= '<br>';
|
||||||
|
$label.= '<b>' . $langs->trans('Ref') . ':</b> ' . $this->ref;
|
||||||
|
|
||||||
|
$url = DOL_URL_ROOT.'/ecm/'.$this->table_name.'_card.php?id='.$this->id;
|
||||||
|
|
||||||
|
$linkclose='';
|
||||||
|
if (empty($notooltip))
|
||||||
|
{
|
||||||
|
if (! empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER))
|
||||||
|
{
|
||||||
|
$label=$langs->trans("ShowProject");
|
||||||
|
$linkclose.=' alt="'.dol_escape_htmltag($label, 1).'"';
|
||||||
|
}
|
||||||
|
$linkclose.=' title="'.dol_escape_htmltag($label, 1).'"';
|
||||||
|
$linkclose.=' class="classfortooltip'.($morecss?' '.$morecss:'').'"';
|
||||||
|
}
|
||||||
|
else $linkclose = ($morecss?' class="'.$morecss.'"':'');
|
||||||
|
|
||||||
|
$linkstart = '<a href="'.$url.'"';
|
||||||
|
$linkstart.=$linkclose.'>';
|
||||||
|
$linkend='</a>';
|
||||||
|
|
||||||
|
if ($withpicto)
|
||||||
|
{
|
||||||
|
$result.=($linkstart.img_object(($notooltip?'':$label), 'label', ($notooltip?'':'class="classfortooltip"')).$linkend);
|
||||||
|
if ($withpicto != 2) $result.=' ';
|
||||||
|
}
|
||||||
|
$result.= $linkstart . $this->ref . $linkend;
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retourne le libelle du status d'un user (actif, inactif)
|
||||||
|
*
|
||||||
|
* @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto
|
||||||
|
* @return string Label of status
|
||||||
|
*/
|
||||||
|
function getLibStatut($mode=0)
|
||||||
|
{
|
||||||
|
return $this->LibStatut($this->status,$mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the status
|
||||||
|
*
|
||||||
|
* @param int $status Id status
|
||||||
|
* @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 5=Long label + Picto
|
||||||
|
* @return string Label of status
|
||||||
|
*/
|
||||||
|
static function LibStatut($status,$mode=0)
|
||||||
|
{
|
||||||
|
global $langs;
|
||||||
|
|
||||||
|
if ($mode == 0)
|
||||||
|
{
|
||||||
|
$prefix='';
|
||||||
|
if ($status == 1) return $langs->trans('Enabled');
|
||||||
|
if ($status == 0) return $langs->trans('Disabled');
|
||||||
|
}
|
||||||
|
if ($mode == 1)
|
||||||
|
{
|
||||||
|
if ($status == 1) return $langs->trans('Enabled');
|
||||||
|
if ($status == 0) return $langs->trans('Disabled');
|
||||||
|
}
|
||||||
|
if ($mode == 2)
|
||||||
|
{
|
||||||
|
if ($status == 1) return img_picto($langs->trans('Enabled'),'statut4').' '.$langs->trans('Enabled');
|
||||||
|
if ($status == 0) return img_picto($langs->trans('Disabled'),'statut5').' '.$langs->trans('Disabled');
|
||||||
|
}
|
||||||
|
if ($mode == 3)
|
||||||
|
{
|
||||||
|
if ($status == 1) return img_picto($langs->trans('Enabled'),'statut4');
|
||||||
|
if ($status == 0) return img_picto($langs->trans('Disabled'),'statut5');
|
||||||
|
}
|
||||||
|
if ($mode == 4)
|
||||||
|
{
|
||||||
|
if ($status == 1) return img_picto($langs->trans('Enabled'),'statut4').' '.$langs->trans('Enabled');
|
||||||
|
if ($status == 0) return img_picto($langs->trans('Disabled'),'statut5').' '.$langs->trans('Disabled');
|
||||||
|
}
|
||||||
|
if ($mode == 5)
|
||||||
|
{
|
||||||
|
if ($status == 1) return $langs->trans('Enabled').' '.img_picto($langs->trans('Enabled'),'statut4');
|
||||||
|
if ($status == 0) return $langs->trans('Disabled').' '.img_picto($langs->trans('Disabled'),'statut5');
|
||||||
|
}
|
||||||
|
if ($mode == 6)
|
||||||
|
{
|
||||||
|
if ($status == 1) return $langs->trans('Enabled').' '.img_picto($langs->trans('Enabled'),'statut4');
|
||||||
|
if ($status == 0) return $langs->trans('Disabled').' '.img_picto($langs->trans('Disabled'),'statut5');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise object with example values
|
||||||
|
* Id must be 0 if object instance is a specimen
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function initAsSpecimen()
|
||||||
|
{
|
||||||
|
global $conf,$user;
|
||||||
|
|
||||||
|
$this->id = 0;
|
||||||
|
|
||||||
|
$this->label = '0a1b2c3e4f59999999';
|
||||||
|
$this->entity = '1';
|
||||||
|
$this->filename = 'myspecimenfilefile.pdf';
|
||||||
|
$this->filepath = '/aaa/bbb';
|
||||||
|
$this->fullpath_orig = 'c:/file on my disk.pdf';
|
||||||
|
$this->description = 'This is a long description of file';
|
||||||
|
$this->keywords = 'key1,key2';
|
||||||
|
$this->cover = '1';
|
||||||
|
$this->position = '5';
|
||||||
|
$this->gen_or_uploaded = 'uploaded';
|
||||||
|
$this->extraparams = '';
|
||||||
|
$this->date_c = (dol_now() - 3600 * 24 * 10);
|
||||||
|
$this->date_m = '';
|
||||||
|
$this->fk_user_c = $user->id;
|
||||||
|
$this->fk_user_m = '';
|
||||||
|
$this->acl = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@ -2,7 +2,7 @@
|
|||||||
/* Copyright (C) 2003 Rodolphe Quiedeville <rodolphe@quiedeville.org>
|
/* Copyright (C) 2003 Rodolphe Quiedeville <rodolphe@quiedeville.org>
|
||||||
* Copyright (C) 2004-2015 Laurent Destailleur <eldy@users.sourceforge.net>
|
* Copyright (C) 2004-2015 Laurent Destailleur <eldy@users.sourceforge.net>
|
||||||
* Copyright (C) 2005-2009 Regis Houssin <regis@dolibarr.fr>
|
* Copyright (C) 2005-2009 Regis Houssin <regis@dolibarr.fr>
|
||||||
* Copyright (C) 2015-2016 Alexandre Spangaro <aspangaro.dolibarr@gmail.com>
|
* Copyright (C) 2015-2016 Alexandre Spangaro <aspangaro@zendsi.com>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -342,11 +342,11 @@ if (empty($reshook))
|
|||||||
$filename=array(); $filedir=array(); $mimetype=array();
|
$filename=array(); $filedir=array(); $mimetype=array();
|
||||||
|
|
||||||
// SUBJECT
|
// SUBJECT
|
||||||
$subject = $langs->trans("ExpenseReportWaitingForApproval");
|
$subject = $langs->transnoentities("ExpenseReportWaitingForApproval");
|
||||||
|
|
||||||
// CONTENT
|
// CONTENT
|
||||||
$link = $urlwithroot.'/expensereport/card.php?id='.$object->id;
|
$link = $urlwithroot.'/expensereport/card.php?id='.$object->id;
|
||||||
$message = $langs->trans("ExpenseReportWaitingForApprovalMessage", $expediteur->getFullName($langs), get_date_range($object->date_debut,$object->date_fin,'',$langs), $link);
|
$message = $langs->transnoentities("ExpenseReportWaitingForApprovalMessage", $expediteur->getFullName($langs), get_date_range($object->date_debut,$object->date_fin,'',$langs), $link);
|
||||||
|
|
||||||
// Rebuild pdf
|
// Rebuild pdf
|
||||||
/*
|
/*
|
||||||
@ -436,74 +436,83 @@ if (empty($reshook))
|
|||||||
|
|
||||||
if ($result > 0)
|
if ($result > 0)
|
||||||
{
|
{
|
||||||
if (! empty($conf->global->DEPLACEMENT_TO_CLEAN)) // TODO Translate this so we can remove condition
|
// Send mail
|
||||||
{
|
|
||||||
// Send mail
|
|
||||||
|
|
||||||
// TO
|
// TO
|
||||||
$destinataire = new User($db);
|
$destinataire = new User($db);
|
||||||
$destinataire->fetch($object->fk_user_validator);
|
$destinataire->fetch($object->fk_user_validator);
|
||||||
$emailTo = $destinataire->email;
|
$emailTo = $destinataire->email;
|
||||||
|
|
||||||
if ($emailTo)
|
if ($emailTo)
|
||||||
|
{
|
||||||
|
// FROM
|
||||||
|
$expediteur = new User($db);
|
||||||
|
$expediteur->fetch($object->fk_user_author);
|
||||||
|
$emailFrom = $expediteur->email;
|
||||||
|
|
||||||
|
// SUBJECT
|
||||||
|
$subject = $langs->transnoentities("ExpenseReportWaitingForReApproval");
|
||||||
|
|
||||||
|
// CONTENT
|
||||||
|
$link = $urlwithroot.'/expensereport/card.php?id='.$object->id;
|
||||||
|
$dateRefusEx = explode(" ",$object->date_refuse);
|
||||||
|
$message = $langs->transnoentities("ExpenseReportWaitingForReApprovalMessage", $dateRefusEx[0], $object->detail_refuse, $expediteur->getFullName($langs), $link);
|
||||||
|
|
||||||
|
// Rebuild pdf
|
||||||
|
/*
|
||||||
|
$object->setDocModel($user,"");
|
||||||
|
$resultPDF = expensereport_pdf_create($db,$object,'',"",$langs);
|
||||||
|
|
||||||
|
if($resultPDF)
|
||||||
|
{
|
||||||
|
// ATTACHMENT
|
||||||
|
$filename=array(); $filedir=array(); $mimetype=array();
|
||||||
|
array_push($filename,dol_sanitizeFileName($object->ref).".pdf");
|
||||||
|
array_push($filedir,$conf->expensereport->dir_output . "/" . dol_sanitizeFileName($object->ref) . "/" . dol_sanitizeFileName($object->ref_number).".pdf");
|
||||||
|
array_push($mimetype,"application/pdf");
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// PREPARE SEND
|
||||||
|
$mailfile = new CMailFile($subject,$emailTo,$emailFrom,$message,$filedir,$mimetype,$filename);
|
||||||
|
|
||||||
|
if ($mailfile)
|
||||||
{
|
{
|
||||||
// FROM
|
// SEND
|
||||||
$expediteur = new User($db);
|
$result=$mailfile->sendfile();
|
||||||
$expediteur->fetch($object->fk_user_author);
|
if ($result)
|
||||||
$emailFrom = $expediteur->email;
|
|
||||||
|
|
||||||
// SUBJECT
|
|
||||||
$subject = "' ERP - Note de frais à re-approuver";
|
|
||||||
|
|
||||||
// CONTENT
|
|
||||||
$dateRefusEx = explode(" ",$object->date_refuse);
|
|
||||||
|
|
||||||
$message = "Bonjour {$destinataire->firstname},\n\n";
|
|
||||||
$message.= "Le {$dateRefusEx[0]} à {$dateRefusEx[1]} vous avez refusé d'approuver la note de frais \"{$object->ref}\". Vous aviez émis le motif suivant : {$object->detail_refuse}\n\n";
|
|
||||||
$message.= "L'auteur vient de modifier la note de frais, veuillez trouver la nouvelle version en pièce jointe.\n";
|
|
||||||
$message.= "- Déclarant : {$expediteur->firstname} {$expediteur->lastname}\n";
|
|
||||||
$message.= "- Période : du {$object->date_debut} au {$object->date_fin}\n";
|
|
||||||
$message.= "- Lien : {$dolibarr_main_url_root}/expensereport/card.php?id={$object->id}\n\n";
|
|
||||||
$message.= "Bien cordialement,\n' SI";
|
|
||||||
|
|
||||||
// Génération du pdf avant attachement
|
|
||||||
$object->setDocModel($user,"");
|
|
||||||
$resultPDF = expensereport_pdf_create($db,$object,'',"",$langs);
|
|
||||||
|
|
||||||
if($resultPDF)
|
|
||||||
{
|
{
|
||||||
// ATTACHMENT
|
$mesg=$langs->trans('MailSuccessfulySent',$mailfile->getValidAddress($emailFrom,2),$mailfile->getValidAddress($emailTo,2));
|
||||||
$filename=array(); $filedir=array(); $mimetype=array();
|
setEventMessages($mesg, null, 'mesgs');
|
||||||
array_push($filename,dol_sanitizeFileName($object->ref).".pdf");
|
header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
|
||||||
array_push($filedir,$conf->expensereport->dir_output . "/" . dol_sanitizeFileName($object->ref) . "/" . dol_sanitizeFileName($object->ref_number).".pdf");
|
exit;
|
||||||
array_push($mimetype,"application/pdf");
|
}
|
||||||
|
else
|
||||||
// PREPARE SEND
|
{
|
||||||
$mailfile = new CMailFile($subject,$emailTo,$emailFrom,$message,$filedir,$mimetype,$filename);
|
$langs->load("other");
|
||||||
|
if ($mailfile->error)
|
||||||
if (! $mailfile->error)
|
|
||||||
{
|
{
|
||||||
// SEND
|
$mesg='';
|
||||||
$result=$mailfile->sendfile();
|
$mesg.=$langs->trans('ErrorFailedToSendMail', $emailFrom, $emailTo);
|
||||||
if ($result)
|
$mesg.='<br>'.$mailfile->error;
|
||||||
{
|
setEventMessages($mesg, null, 'errors');
|
||||||
Header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$mesg=$mailfile->error;
|
|
||||||
setEventMessages($mesg, null, 'errors');
|
|
||||||
}
|
|
||||||
// END - Send mail
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dol_print_error($db,$resultPDF);
|
setEventMessages('No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', null, 'warnings');
|
||||||
exit;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setEventMessages($mailfile->error,$mailfile->errors,'errors');
|
||||||
|
$action='';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setEventMessages($langs->trans("NoEmailSentBadSenderOrRecipientEmail"), null, 'warnings');
|
||||||
|
$action='';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -542,80 +551,89 @@ if (empty($reshook))
|
|||||||
|
|
||||||
if ($result > 0)
|
if ($result > 0)
|
||||||
{
|
{
|
||||||
if (! empty($conf->global->DEPLACEMENT_TO_CLEAN)) // TODO Translate this so we can remove condition
|
// Send mail
|
||||||
{
|
|
||||||
// Send mail
|
|
||||||
|
|
||||||
// TO
|
// TO
|
||||||
$destinataire = new User($db);
|
$destinataire = new User($db);
|
||||||
$destinataire->fetch($object->fk_user_author);
|
$destinataire->fetch($object->fk_user_author);
|
||||||
$emailTo = $destinataire->email;
|
$emailTo = $destinataire->email;
|
||||||
|
|
||||||
// CC
|
// CC
|
||||||
$emailCC = $conf->global->NDF_CC_EMAILS;
|
$emailCC = $conf->global->NDF_CC_EMAILS;
|
||||||
|
|
||||||
// FROM
|
// FROM
|
||||||
$expediteur = new User($db);
|
$expediteur = new User($db);
|
||||||
$expediteur->fetch($object->fk_user_valid);
|
$expediteur->fetch($object->fk_user_valid);
|
||||||
$emailFrom = $expediteur->email;
|
$emailFrom = $expediteur->email;
|
||||||
|
|
||||||
// SUBJECT
|
// SUBJECT
|
||||||
$subject = "' ERP - Note de frais validée";
|
$subject = $langs->transnoentities("ExpenseReportApproved");
|
||||||
|
|
||||||
// CONTENT
|
// CONTENT
|
||||||
$message = "Bonjour {$destinataire->firstname},\n\n";
|
$link = $urlwithroot.'/expensereport/card.php?id='.$object->id;
|
||||||
$message.= "Votre note de frais \"{$object->ref}\" vient d'être approuvé!\n";
|
$message = $langs->transnoentities("ExpenseReportApprovedMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $link);
|
||||||
$message.= "- Approbateur : {$expediteur->firstname} {$expediteur->lastname}\n";
|
|
||||||
$message.= "- Lien : {$dolibarr_main_url_root}/expensereport/card.php?id={$object->id}\n\n";
|
|
||||||
$message.= "Bien cordialement,\n' SI";
|
|
||||||
|
|
||||||
// Génération du pdf avant attachement
|
// Rebuilt pdf
|
||||||
$object->setDocModel($user,"");
|
/*
|
||||||
$resultPDF = expensereport_pdf_create($db,$object,'',"",$langs);
|
$object->setDocModel($user,"");
|
||||||
|
$resultPDF = expensereport_pdf_create($db,$object,'',"",$langs);
|
||||||
|
|
||||||
if($resultPDF):
|
if($resultPDF
|
||||||
// ATTACHMENT
|
{
|
||||||
$filename=array(); $filedir=array(); $mimetype=array();
|
// ATTACHMENT
|
||||||
array_push($filename,dol_sanitizeFileName($object->ref).".pdf");
|
$filename=array(); $filedir=array(); $mimetype=array();
|
||||||
array_push($filedir, $conf->expensereport->dir_output.
|
array_push($filename,dol_sanitizeFileName($object->ref).".pdf");
|
||||||
"/".
|
array_push($filedir, $conf->expensereport->dir_output."/".dol_sanitizeFileName($object->ref)."/".dol_sanitizeFileName($object->ref).".pdf");
|
||||||
dol_sanitizeFileName($object->ref) .
|
array_push($mimetype,"application/pdf");
|
||||||
"/".
|
}
|
||||||
dol_sanitizeFileName($object->ref).
|
*/
|
||||||
".pdf"
|
|
||||||
);
|
|
||||||
array_push($mimetype,"application/pdf");
|
|
||||||
|
|
||||||
// PREPARE SEND
|
// PREPARE SEND
|
||||||
$mailfile = new CMailFile($subject,$emailTo,$emailFrom,$message,$filedir,$mimetype,$filename,$emailCC);
|
$mailfile = new CMailFile($subject,$emailTo,$emailFrom,$message,$filedir,$mimetype,$filename);
|
||||||
|
|
||||||
if(!$mailfile->error):
|
if ($mailfile)
|
||||||
|
{
|
||||||
// SEND
|
// SEND
|
||||||
$result=$mailfile->sendfile();
|
$result=$mailfile->sendfile();
|
||||||
if ($result):
|
if ($result)
|
||||||
setEventMessages($langs->trans("MailSuccessfulySent",$emailFrom,$emailTo), null, 'mesgs');
|
{
|
||||||
Header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
|
$mesg=$langs->trans('MailSuccessfulySent',$mailfile->getValidAddress($emailFrom,2),$mailfile->getValidAddress($emailTo,2));
|
||||||
exit;
|
setEventMessages($mesg, null, 'mesgs');
|
||||||
else:
|
header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
|
||||||
setEventMessages($langs->trans("ErrorFailedToSendMail",$emailFrom,$emailTo), null, 'errors');
|
exit;
|
||||||
endif;
|
}
|
||||||
|
else
|
||||||
else:
|
{
|
||||||
setEventMessages($langs->trans("ErrorFailedToSendMail",$emailFrom,$emailTo), null, 'errors');
|
$langs->load("other");
|
||||||
endif;
|
if ($mailfile->error)
|
||||||
// END - Send mail
|
{
|
||||||
else : // if ($resultPDF)
|
$mesg='';
|
||||||
dol_print_error($db,$resultPDF);
|
$mesg.=$langs->trans('ErrorFailedToSendMail', $emailFrom, $emailTo);
|
||||||
exit;
|
$mesg.='<br>'.$mailfile->error;
|
||||||
endif;
|
setEventMessages($mesg, null, 'errors');
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
else
|
{
|
||||||
{
|
setEventMessages('No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', null, 'warnings');
|
||||||
setEventMessages($object->error, $object->errors, 'errors');
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setEventMessages($mailfile->error,$mailfile->errors,'errors');
|
||||||
|
$action='';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setEventMessages($langs->trans("NoEmailSentBadSenderOrRecipientEmail"), null, 'warnings');
|
||||||
|
$action='';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setEventMessages($object->error, $object->errors, 'errors');
|
||||||
|
}
|
||||||
|
|
||||||
if ($action == "confirm_refuse" && GETPOST('confirm')=="yes" && $id > 0 && $user->rights->expensereport->approve)
|
if ($action == "confirm_refuse" && GETPOST('confirm')=="yes" && $id > 0 && $user->rights->expensereport->approve)
|
||||||
{
|
{
|
||||||
@ -646,57 +664,86 @@ if (empty($reshook))
|
|||||||
|
|
||||||
if ($result > 0)
|
if ($result > 0)
|
||||||
{
|
{
|
||||||
if (! empty($conf->global->DEPLACEMENT_TO_CLEAN)) // TODO Translate this so we can remove condition
|
// Send mail
|
||||||
|
|
||||||
|
// TO
|
||||||
|
$destinataire = new User($db);
|
||||||
|
$destinataire->fetch($object->fk_user_author);
|
||||||
|
$emailTo = $destinataire->email;
|
||||||
|
|
||||||
|
// FROM
|
||||||
|
$expediteur = new User($db);
|
||||||
|
$expediteur->fetch($object->fk_user_refuse);
|
||||||
|
$emailFrom = $expediteur->email;
|
||||||
|
|
||||||
|
// SUBJECT
|
||||||
|
$subject = $langs->transnoentities("ExpenseReportRefused");
|
||||||
|
|
||||||
|
// CONTENT
|
||||||
|
$link = $urlwithroot.'/expensereport/card.php?id='.$object->id;
|
||||||
|
$message = $langs->transnoentities("ExpenseReportRefusedMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $_POST['detail_refuse'], $link);
|
||||||
|
|
||||||
|
// Rebuilt pdf
|
||||||
|
/*
|
||||||
|
$object->setDocModel($user,"");
|
||||||
|
$resultPDF = expensereport_pdf_create($db,$object,'',"",$langs);
|
||||||
|
|
||||||
|
if($resultPDF
|
||||||
|
{
|
||||||
|
// ATTACHMENT
|
||||||
|
$filename=array(); $filedir=array(); $mimetype=array();
|
||||||
|
array_push($filename,dol_sanitizeFileName($object->ref).".pdf");
|
||||||
|
array_push($filedir, $conf->expensereport->dir_output."/".dol_sanitizeFileName($object->ref)."/".dol_sanitizeFileName($object->ref).".pdf");
|
||||||
|
array_push($mimetype,"application/pdf");
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// PREPARE SEND
|
||||||
|
$mailfile = new CMailFile($subject,$emailTo,$emailFrom,$message,$filedir,$mimetype,$filename);
|
||||||
|
|
||||||
|
if ($mailfile)
|
||||||
{
|
{
|
||||||
// Send mail
|
// SEND
|
||||||
|
$result=$mailfile->sendfile();
|
||||||
// TO
|
if ($result)
|
||||||
$destinataire = new User($db);
|
|
||||||
$destinataire->fetch($object->fk_user_author);
|
|
||||||
$emailTo = $destinataire->email;
|
|
||||||
|
|
||||||
// FROM
|
|
||||||
$expediteur = new User($db);
|
|
||||||
$expediteur->fetch($object->fk_user_refuse);
|
|
||||||
$emailFrom = $expediteur->email;
|
|
||||||
|
|
||||||
// SUBJECT
|
|
||||||
$subject = "' ERP - Note de frais refusée";
|
|
||||||
|
|
||||||
// CONTENT
|
|
||||||
$message = "Bonjour {$destinataire->firstname},\n\n";
|
|
||||||
$message.= "Votre note de frais \"{$object->ref}\" vient d'être refusée.\n";
|
|
||||||
$message.= "- Refuseur : {$expediteur->firstname} {$expediteur->lastname}\n";
|
|
||||||
$message.= "- Motif de refus : {$_POST['detail_refuse']}\n";
|
|
||||||
$message.= "- Lien : {$dolibarr_main_url_root}/expensereport/card.php?id={$object->id}\n\n";
|
|
||||||
$message.= "Bien cordialement,\n' SI";
|
|
||||||
|
|
||||||
// PREPARE SEND
|
|
||||||
$mailfile = new CMailFile($subject,$emailTo,$emailFrom,$message);
|
|
||||||
|
|
||||||
if(!$mailfile->error)
|
|
||||||
{
|
{
|
||||||
// SEND
|
$mesg=$langs->trans('MailSuccessfulySent',$mailfile->getValidAddress($emailFrom,2),$mailfile->getValidAddress($emailTo,2));
|
||||||
$result=$mailfile->sendfile();
|
setEventMessages($mesg, null, 'mesgs');
|
||||||
if ($result)
|
header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$langs->load("other");
|
||||||
|
if ($mailfile->error)
|
||||||
{
|
{
|
||||||
setEventMessages($langs->trans("MailSuccessfulySent",$emailFrom,$emailTo), null, 'mesgs');
|
$mesg='';
|
||||||
Header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
|
$mesg.=$langs->trans('ErrorFailedToSendMail', $emailFrom, $emailTo);
|
||||||
exit;
|
$mesg.='<br>'.$mailfile->error;
|
||||||
|
setEventMessages($mesg, null, 'errors');
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
setEventMessages($langs->trans("ErrorFailedToSendMail",$emailFrom,$emailTo), null, 'errors');
|
setEventMessages('No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', null, 'warnings');
|
||||||
}
|
}
|
||||||
// END - Send mail
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setEventMessages($mailfile->error,$mailfile->errors,'errors');
|
||||||
|
$action='';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
setEventMessages($object->error, $object->errors, 'errors');
|
setEventMessages($langs->trans("NoEmailSentBadSenderOrRecipientEmail"), null, 'warnings');
|
||||||
|
$action='';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setEventMessages($object->error, $object->errors, 'errors');
|
||||||
|
}
|
||||||
|
|
||||||
//var_dump($user->id == $object->fk_user_validator);exit;
|
//var_dump($user->id == $object->fk_user_validator);exit;
|
||||||
if ($action == "confirm_cancel" && GETPOST('confirm')=="yes" && GETPOST('detail_cancel') && $id > 0 && $user->rights->expensereport->creer)
|
if ($action == "confirm_cancel" && GETPOST('confirm')=="yes" && GETPOST('detail_cancel') && $id > 0 && $user->rights->expensereport->creer)
|
||||||
@ -730,64 +777,85 @@ if (empty($reshook))
|
|||||||
|
|
||||||
if ($result > 0)
|
if ($result > 0)
|
||||||
{
|
{
|
||||||
if (! empty($conf->global->DEPLACEMENT_TO_CLEAN)) // TODO Translate this so we can remove condition
|
// Send mail
|
||||||
|
|
||||||
|
// TO
|
||||||
|
$destinataire = new User($db);
|
||||||
|
$destinataire->fetch($object->fk_user_author);
|
||||||
|
$emailTo = $destinataire->email;
|
||||||
|
|
||||||
|
// FROM
|
||||||
|
$expediteur = new User($db);
|
||||||
|
$expediteur->fetch($object->fk_user_cancel);
|
||||||
|
$emailFrom = $expediteur->email;
|
||||||
|
|
||||||
|
// SUBJECT
|
||||||
|
$subject = $langs->transnoentities("ExpenseReportCanceled");
|
||||||
|
|
||||||
|
// CONTENT
|
||||||
|
$link = $urlwithroot.'/expensereport/card.php?id='.$object->id;
|
||||||
|
$message = $langs->transnoentities("ExpenseReportCanceledMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $_POST['detail_cancel'], $link);
|
||||||
|
|
||||||
|
// Rebuilt pdf
|
||||||
|
/*
|
||||||
|
$object->setDocModel($user,"");
|
||||||
|
$resultPDF = expensereport_pdf_create($db,$object,'',"",$langs);
|
||||||
|
|
||||||
|
if($resultPDF
|
||||||
|
{
|
||||||
|
// ATTACHMENT
|
||||||
|
$filename=array(); $filedir=array(); $mimetype=array();
|
||||||
|
array_push($filename,dol_sanitizeFileName($object->ref).".pdf");
|
||||||
|
array_push($filedir, $conf->expensereport->dir_output."/".dol_sanitizeFileName($object->ref)."/".dol_sanitizeFileName($object->ref).".pdf");
|
||||||
|
array_push($mimetype,"application/pdf");
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// PREPARE SEND
|
||||||
|
$mailfile = new CMailFile($subject,$emailTo,$emailFrom,$message,$filedir,$mimetype,$filename);
|
||||||
|
|
||||||
|
if ($mailfile)
|
||||||
{
|
{
|
||||||
// Send mail
|
// SEND
|
||||||
|
$result=$mailfile->sendfile();
|
||||||
// TO
|
if ($result)
|
||||||
$destinataire = new User($db);
|
|
||||||
$destinataire->fetch($object->fk_user_author);
|
|
||||||
$emailTo = $destinataire->email;
|
|
||||||
|
|
||||||
// FROM
|
|
||||||
$expediteur = new User($db);
|
|
||||||
$expediteur->fetch($object->fk_user_cancel);
|
|
||||||
$emailFrom = $expediteur->email;
|
|
||||||
|
|
||||||
// SUBJECT
|
|
||||||
$subject = "' ERP - Note de frais annulée";
|
|
||||||
|
|
||||||
// CONTENT
|
|
||||||
$message = "Bonjour {$destinataire->firstname},\n\n";
|
|
||||||
$message.= "Votre note de frais \"{$object->ref}\" vient d'être annulée.\n";
|
|
||||||
$message.= "- Annuleur : {$expediteur->firstname} {$expediteur->lastname}\n";
|
|
||||||
$message.= "- Motif d'annulation : {$_POST['detail_cancel']}\n";
|
|
||||||
$message.= "- Lien : {$dolibarr_main_url_root}/expensereport/card.php?id={$object->id}\n\n";
|
|
||||||
$message.= "Bien cordialement,\n' SI";
|
|
||||||
|
|
||||||
// PREPARE SEND
|
|
||||||
$mailfile = new CMailFile($subject,$emailTo,$emailFrom,$message);
|
|
||||||
|
|
||||||
if(!$mailfile->error)
|
|
||||||
{
|
{
|
||||||
// SEND
|
$mesg=$langs->trans('MailSuccessfulySent',$mailfile->getValidAddress($emailFrom,2),$mailfile->getValidAddress($emailTo,2));
|
||||||
$result=$mailfile->sendfile();
|
setEventMessages($mesg, null, 'mesgs');
|
||||||
if ($result)
|
header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
|
||||||
{
|
exit;
|
||||||
header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$mesg="Impossible d'envoyer l'email.";
|
|
||||||
setEventMessages($mesg, null, 'errors');
|
|
||||||
}
|
|
||||||
// END - Send mail
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
setEventMessages($mail->error, $mail->errors, 'errors');
|
$langs->load("other");
|
||||||
|
if ($mailfile->error)
|
||||||
|
{
|
||||||
|
$mesg='';
|
||||||
|
$mesg.=$langs->trans('ErrorFailedToSendMail', $emailFrom, $emailTo);
|
||||||
|
$mesg.='<br>'.$mailfile->error;
|
||||||
|
setEventMessages($mesg, null, 'errors');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setEventMessages('No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', null, 'warnings');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setEventMessages($mailfile->error,$mailfile->errors,'errors');
|
||||||
|
$action='';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
setEventMessages($object->error, $object->errors, 'errors');
|
setEventMessages($langs->trans("NoEmailSentBadSenderOrRecipientEmail"), null, 'warnings');
|
||||||
|
$action='';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
setEventMessages($langs->transnoentitiesnoconv("OnlyOwnerCanCancel"), '', 'errors'); // Should not happened
|
setEventMessages($object->error, $object->errors, 'errors');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -864,67 +932,82 @@ if (empty($reshook))
|
|||||||
|
|
||||||
if ($result > 0)
|
if ($result > 0)
|
||||||
{
|
{
|
||||||
if (! empty($conf->global->DEPLACEMENT_TO_CLEAN)) // TODO Translate this so we can remove condition
|
// Send mail
|
||||||
|
|
||||||
|
// TO
|
||||||
|
$destinataire = new User($db);
|
||||||
|
$destinataire->fetch($object->fk_user_author);
|
||||||
|
$emailTo = $destinataire->email;
|
||||||
|
|
||||||
|
// FROM
|
||||||
|
$expediteur = new User($db);
|
||||||
|
$expediteur->fetch($user->id);
|
||||||
|
$emailFrom = $expediteur->email;
|
||||||
|
|
||||||
|
// SUBJECT
|
||||||
|
$subject = $langs->transnoentities("ExpenseReportPaid");
|
||||||
|
|
||||||
|
// CONTENT
|
||||||
|
$link = $urlwithroot.'/expensereport/card.php?id='.$object->id;
|
||||||
|
$message = $langs->transnoentities("ExpenseReportPaidMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $link);
|
||||||
|
|
||||||
|
// CONTENT
|
||||||
|
$message = "Bonjour {$destinataire->firstname},\n\n";
|
||||||
|
$message.= "Votre note de frais \"{$object->ref}\" vient d'être payée.\n";
|
||||||
|
$message.= "- Payeur : {$expediteur->firstname} {$expediteur->lastname}\n";
|
||||||
|
$message.= "- Lien : {$dolibarr_main_url_root}/expensereport/card.php?id={$object->id}\n\n";
|
||||||
|
$message.= "Bien cordialement,\n' SI";
|
||||||
|
|
||||||
|
// Generate pdf before attachment
|
||||||
|
$object->setDocModel($user,"");
|
||||||
|
$resultPDF = expensereport_pdf_create($db,$object,'',"",$langs);
|
||||||
|
|
||||||
|
// PREPARE SEND
|
||||||
|
$mailfile = new CMailFile($subject,$emailTo,$emailFrom,$message,$filedir,$mimetype,$filename);
|
||||||
|
|
||||||
|
if ($mailfile)
|
||||||
{
|
{
|
||||||
// Send mail
|
|
||||||
|
|
||||||
// TO
|
|
||||||
$destinataire = new User($db);
|
|
||||||
$destinataire->fetch($object->fk_user_author);
|
|
||||||
$emailTo = $destinataire->email;
|
|
||||||
|
|
||||||
// FROM
|
|
||||||
$expediteur = new User($db);
|
|
||||||
$expediteur->fetch($user->id);
|
|
||||||
$emailFrom = $expediteur->email;
|
|
||||||
|
|
||||||
// SUBJECT
|
|
||||||
$subject = "'ERP - Note de frais payée";
|
|
||||||
|
|
||||||
// CONTENT
|
|
||||||
$message = "Bonjour {$destinataire->firstname},\n\n";
|
|
||||||
$message.= "Votre note de frais \"{$object->ref}\" vient d'être payée.\n";
|
|
||||||
$message.= "- Payeur : {$expediteur->firstname} {$expediteur->lastname}\n";
|
|
||||||
$message.= "- Lien : {$dolibarr_main_url_root}/expensereport/card.php?id={$object->id}\n\n";
|
|
||||||
$message.= "Bien cordialement,\n' SI";
|
|
||||||
|
|
||||||
// Generate pdf before attachment
|
|
||||||
$object->setDocModel($user,"");
|
|
||||||
$resultPDF = expensereport_pdf_create($db,$object,'',"",$langs);
|
|
||||||
|
|
||||||
// PREPARE SEND
|
|
||||||
$mailfile = new CMailFile($subject,$emailTo,$emailFrom,$message);
|
|
||||||
|
|
||||||
if(!$mailfile->error):
|
|
||||||
|
|
||||||
// SEND
|
// SEND
|
||||||
$result=$mailfile->sendfile();
|
$result=$mailfile->sendfile();
|
||||||
if ($result):
|
if ($result)
|
||||||
|
{
|
||||||
// Retour
|
$mesg=$langs->trans('MailSuccessfulySent',$mailfile->getValidAddress($emailFrom,2),$mailfile->getValidAddress($emailTo,2));
|
||||||
if($result):
|
setEventMessages($mesg, null, 'mesgs');
|
||||||
Header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
|
header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
|
||||||
exit;
|
exit;
|
||||||
else:
|
}
|
||||||
dol_print_error($db);
|
else
|
||||||
endif;
|
{
|
||||||
|
$langs->load("other");
|
||||||
else:
|
if ($mailfile->error)
|
||||||
dol_print_error($db,$acct->error);
|
{
|
||||||
endif;
|
$mesg='';
|
||||||
|
$mesg.=$langs->trans('ErrorFailedToSendMail', $emailFrom, $emailTo);
|
||||||
else:
|
$mesg.='<br>'.$mailfile->error;
|
||||||
$mesg="Impossible d'envoyer l'email.";
|
setEventMessages($mesg, null, 'errors');
|
||||||
setEventMessages($mesg, null, 'errors');
|
}
|
||||||
endif;
|
else
|
||||||
// END - Send mail
|
{
|
||||||
|
setEventMessages('No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', null, 'warnings');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setEventMessages($mailfile->error,$mailfile->errors,'errors');
|
||||||
|
$action='';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
setEventMessages($object->error, $object->errors, 'errors');
|
setEventMessages($langs->trans("NoEmailSentBadSenderOrRecipientEmail"), null, 'warnings');
|
||||||
|
$action='';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setEventMessages($object->error, $object->errors, 'errors');
|
||||||
|
}
|
||||||
|
|
||||||
if ($action == "addline" && $user->rights->expensereport->creer)
|
if ($action == "addline" && $user->rights->expensereport->creer)
|
||||||
{
|
{
|
||||||
@ -1806,6 +1889,7 @@ else
|
|||||||
$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_type_fees as ctf ON fde.fk_c_type_fees=ctf.id';
|
$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_type_fees as ctf ON fde.fk_c_type_fees=ctf.id';
|
||||||
$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'projet as pjt ON fde.fk_projet=pjt.rowid';
|
$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'projet as pjt ON fde.fk_projet=pjt.rowid';
|
||||||
$sql.= ' WHERE fde.fk_expensereport = '.$object->id;
|
$sql.= ' WHERE fde.fk_expensereport = '.$object->id;
|
||||||
|
$sql.= ' ORDER BY fde.date ASC';
|
||||||
|
|
||||||
print '<div style="clear: both;">';
|
print '<div style="clear: both;">';
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
/* Copyright (C) 2011 Dimitri Mouillard <dmouillard@teclib.com>
|
/* Copyright (C) 2011 Dimitri Mouillard <dmouillard@teclib.com>
|
||||||
* Copyright (C) 2015 Laurent Destailleur <eldy@users.sourceforge.net>
|
* Copyright (C) 2015 Laurent Destailleur <eldy@users.sourceforge.net>
|
||||||
* Copyright (C) 2015 Alexandre Spangaro <aspangaro.dolibarr@gmail.com>
|
* Copyright (C) 2015 Alexandre Spangaro <aspangaro@zendsi.com>
|
||||||
* Copyright (C) 2016 Ferran Marcet <fmarcet@2byte.es>
|
* Copyright (C) 2016 Ferran Marcet <fmarcet@2byte.es>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@ -830,6 +830,7 @@ class ExpenseReport extends CommonObject
|
|||||||
$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_type_fees as ctf ON de.fk_c_type_fees = ctf.id';
|
$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_type_fees as ctf ON de.fk_c_type_fees = ctf.id';
|
||||||
$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'projet as p ON de.fk_projet = p.rowid';
|
$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'projet as p ON de.fk_projet = p.rowid';
|
||||||
$sql.= ' WHERE de.'.$this->fk_element.' = '.$this->id;
|
$sql.= ' WHERE de.'.$this->fk_element.' = '.$this->id;
|
||||||
|
$sql.= ' ORDER BY de.date ASC';
|
||||||
|
|
||||||
dol_syslog('ExpenseReport::fetch_lines sql='.$sql, LOG_DEBUG);
|
dol_syslog('ExpenseReport::fetch_lines sql='.$sql, LOG_DEBUG);
|
||||||
$resql = $this->db->query($sql);
|
$resql = $this->db->query($sql);
|
||||||
@ -1207,15 +1208,14 @@ class ExpenseReport extends CommonObject
|
|||||||
$expld_car = (empty($conf->global->NDF_EXPLODE_CHAR))?"-":$conf->global->NDF_EXPLODE_CHAR;
|
$expld_car = (empty($conf->global->NDF_EXPLODE_CHAR))?"-":$conf->global->NDF_EXPLODE_CHAR;
|
||||||
$num_car = (empty($conf->global->NDF_NUM_CAR_REF))?"5":$conf->global->NDF_NUM_CAR_REF;
|
$num_car = (empty($conf->global->NDF_NUM_CAR_REF))?"5":$conf->global->NDF_NUM_CAR_REF;
|
||||||
|
|
||||||
$sql = 'SELECT de.ref_number_int';
|
$sql = 'SELECT MAX(de.ref_number_int) as max';
|
||||||
$sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' de';
|
$sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' de';
|
||||||
$sql.= ' ORDER BY de.ref_number_int DESC';
|
|
||||||
|
|
||||||
$result = $this->db->query($sql);
|
$result = $this->db->query($sql);
|
||||||
|
|
||||||
if($this->db->num_rows($result) > 0):
|
if($this->db->num_rows($result) > 0):
|
||||||
$objp = $this->db->fetch_object($result);
|
$objp = $this->db->fetch_object($result);
|
||||||
$this->ref = $objp->ref_number_int;
|
$this->ref = $objp->max;
|
||||||
$this->ref++;
|
$this->ref++;
|
||||||
while(strlen($this->ref) < $num_car):
|
while(strlen($this->ref) < $num_car):
|
||||||
$this->ref = "0".$this->ref;
|
$this->ref = "0".$this->ref;
|
||||||
|
|||||||
@ -183,7 +183,7 @@ $min_year = 5;
|
|||||||
|
|
||||||
|
|
||||||
$sql = "SELECT d.rowid, d.ref, d.fk_user_author, d.total_ht, d.total_tva, d.total_ttc, d.fk_statut as status,";
|
$sql = "SELECT d.rowid, d.ref, d.fk_user_author, d.total_ht, d.total_tva, d.total_ttc, d.fk_statut as status,";
|
||||||
$sql.= " d.date_debut, d.date_fin, d.date_create, d.tms as date_modif, d.date_valid, d.date_approve,";
|
$sql.= " d.date_debut, d.date_fin, d.date_create, d.tms as date_modif, d.date_valid, d.date_approve, d.note_private, d.note_public,";
|
||||||
$sql.= " u.rowid as id_user, u.firstname, u.lastname, u.login, u.statut, u.photo";
|
$sql.= " u.rowid as id_user, u.firstname, u.lastname, u.login, u.statut, u.photo";
|
||||||
// Add fields from extrafields
|
// Add fields from extrafields
|
||||||
foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key.' as options_'.$key : '');
|
foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key.' as options_'.$key : '');
|
||||||
@ -524,17 +524,40 @@ if ($resql)
|
|||||||
$expensereportstatic->date_modif=$db->jdate($obj->date_modif);
|
$expensereportstatic->date_modif=$db->jdate($obj->date_modif);
|
||||||
$expensereportstatic->date_valid=$db->jdate($obj->date_valid);
|
$expensereportstatic->date_valid=$db->jdate($obj->date_valid);
|
||||||
$expensereportstatic->date_approve=$db->jdate($obj->date_approve);
|
$expensereportstatic->date_approve=$db->jdate($obj->date_approve);
|
||||||
|
$expensereportstatic->note_private=$obj->note_private;
|
||||||
|
$expensereportstatic->note_public=$obj->note_public;
|
||||||
|
|
||||||
$var=!$var;
|
$var=!$var;
|
||||||
print "<tr ".$bc[$var].">";
|
print "<tr ".$bc[$var].">";
|
||||||
|
// Ref
|
||||||
if (! empty($arrayfields['d.ref']['checked'])) {
|
if (! empty($arrayfields['d.ref']['checked'])) {
|
||||||
print '<td>';
|
print '<td>';
|
||||||
|
print '<table class="nobordernopadding"><tr class="nocellnopadd">';
|
||||||
|
print '<td class="nobordernopadding nowrap">';
|
||||||
print $expensereportstatic->getNomUrl(1);
|
print $expensereportstatic->getNomUrl(1);
|
||||||
|
print '</td>';
|
||||||
|
// Warning late icon and note
|
||||||
|
print '<td class="nobordernopadding nowrap">';
|
||||||
if ($expensereportstatic->status == 2 && $expensereportstatic->hasDelay('toappove')) print img_warning($langs->trans("Late"));
|
if ($expensereportstatic->status == 2 && $expensereportstatic->hasDelay('toappove')) print img_warning($langs->trans("Late"));
|
||||||
if ($expensereportstatic->status == 5 && $expensereportstatic->hasDelay('topay')) print img_warning($langs->trans("Late"));
|
if ($expensereportstatic->status == 5 && $expensereportstatic->hasDelay('topay')) print img_warning($langs->trans("Late"));
|
||||||
|
if (!empty($obj->note_private) || !empty($obj->note_public))
|
||||||
|
{
|
||||||
|
print ' <span class="note">';
|
||||||
|
print '<a href="'.DOL_URL_ROOT.'/commande/note.php?id='.$obj->rowid.'">'.img_picto($langs->trans("ViewPrivateNote"),'object_generic').'</a>';
|
||||||
|
print '</span>';
|
||||||
|
}
|
||||||
|
print '</td>';
|
||||||
|
print '<td width="16" align="right" class="nobordernopadding hideonsmartphone">';
|
||||||
|
$filename=dol_sanitizeFileName($obj->ref);
|
||||||
|
$filedir=$conf->expensereport->dir_output . '/' . dol_sanitizeFileName($obj->ref);
|
||||||
|
$urlsource=$_SERVER['PHP_SELF'].'?id='.$obj->rowid;
|
||||||
|
print $formfile->getDocumentsLink($expensereportstatic->element, $filename, $filedir);
|
||||||
|
print '</td>';
|
||||||
|
print '</tr></table>';
|
||||||
print '</td>';
|
print '</td>';
|
||||||
if (! $i) $totalarray['nbfield']++;
|
if (! $i) $totalarray['nbfield']++;
|
||||||
}
|
}
|
||||||
|
// User
|
||||||
if (! empty($arrayfields['user']['checked'])) {
|
if (! empty($arrayfields['user']['checked'])) {
|
||||||
print '<td align="left">';
|
print '<td align="left">';
|
||||||
$usertmp->id=$obj->id_user;
|
$usertmp->id=$obj->id_user;
|
||||||
@ -547,18 +570,22 @@ if ($resql)
|
|||||||
print '</td>';
|
print '</td>';
|
||||||
if (! $i) $totalarray['nbfield']++;
|
if (! $i) $totalarray['nbfield']++;
|
||||||
}
|
}
|
||||||
|
// Start date
|
||||||
if (! empty($arrayfields['d.date_debut']['checked'])) {
|
if (! empty($arrayfields['d.date_debut']['checked'])) {
|
||||||
print '<td align="center">'.($obj->date_debut > 0 ? dol_print_date($obj->date_debut, 'day') : '').'</td>';
|
print '<td align="center">'.($obj->date_debut > 0 ? dol_print_date($obj->date_debut, 'day') : '').'</td>';
|
||||||
if (! $i) $totalarray['nbfield']++;
|
if (! $i) $totalarray['nbfield']++;
|
||||||
}
|
}
|
||||||
|
// End date
|
||||||
if (! empty($arrayfields['d.date_fin']['checked'])) {
|
if (! empty($arrayfields['d.date_fin']['checked'])) {
|
||||||
print '<td align="center">'.($obj->date_fin > 0 ? dol_print_date($obj->date_fin, 'day') : '').'</td>';
|
print '<td align="center">'.($obj->date_fin > 0 ? dol_print_date($obj->date_fin, 'day') : '').'</td>';
|
||||||
if (! $i) $totalarray['nbfield']++;
|
if (! $i) $totalarray['nbfield']++;
|
||||||
}
|
}
|
||||||
|
// Date validation
|
||||||
if (! empty($arrayfields['d.date_valid']['checked'])) {
|
if (! empty($arrayfields['d.date_valid']['checked'])) {
|
||||||
print '<td align="center">'.($obj->date_valid > 0 ? dol_print_date($obj->date_valid, 'day') : '').'</td>';
|
print '<td align="center">'.($obj->date_valid > 0 ? dol_print_date($obj->date_valid, 'day') : '').'</td>';
|
||||||
if (! $i) $totalarray['nbfield']++;
|
if (! $i) $totalarray['nbfield']++;
|
||||||
}
|
}
|
||||||
|
// Date approval
|
||||||
if (! empty($arrayfields['d.date_approve']['checked'])) {
|
if (! empty($arrayfields['d.date_approve']['checked'])) {
|
||||||
print '<td align="center">'.($obj->date_approve > 0 ? dol_print_date($obj->date_approve, 'day') : '').'</td>';
|
print '<td align="center">'.($obj->date_approve > 0 ? dol_print_date($obj->date_approve, 'day') : '').'</td>';
|
||||||
if (! $i) $totalarray['nbfield']++;
|
if (! $i) $totalarray['nbfield']++;
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
/* Copyright (C) 2002-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
|
/* Copyright (C) 2002-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
|
||||||
* Copyright (C) 2003 Xavier Dutoit <doli@sydesy.com>
|
* Copyright (C) 2003 Xavier Dutoit <doli@sydesy.com>
|
||||||
* Copyright (C) 2004-2016 Laurent Destailleur <eldy@users.sourceforge.net>
|
* Copyright (C) 2004-2017 Laurent Destailleur <eldy@users.sourceforge.net>
|
||||||
* Copyright (C) 2004 Sebastien Di Cintio <sdicintio@ressource-toi.org>
|
* Copyright (C) 2004 Sebastien Di Cintio <sdicintio@ressource-toi.org>
|
||||||
* Copyright (C) 2004 Benoit Mortier <benoit.mortier@opensides.be>
|
* Copyright (C) 2004 Benoit Mortier <benoit.mortier@opensides.be>
|
||||||
* Copyright (C) 2005-2011 Regis Houssin <regis.houssin@capnetworks.com>
|
* Copyright (C) 2005-2011 Regis Houssin <regis.houssin@capnetworks.com>
|
||||||
@ -31,7 +31,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if (! defined('DOL_APPLICATION_TITLE')) define('DOL_APPLICATION_TITLE','Dolibarr');
|
if (! defined('DOL_APPLICATION_TITLE')) define('DOL_APPLICATION_TITLE','Dolibarr');
|
||||||
if (! defined('DOL_VERSION')) define('DOL_VERSION','5.0.0-beta');
|
if (! defined('DOL_VERSION')) define('DOL_VERSION','6.0.0-alpha');
|
||||||
|
|
||||||
if (! defined('EURO')) define('EURO',chr(128));
|
if (! defined('EURO')) define('EURO',chr(128));
|
||||||
|
|
||||||
|
|||||||
@ -128,6 +128,12 @@ class CommandeFournisseur extends CommonOrder
|
|||||||
public $multicurrency_total_tva;
|
public $multicurrency_total_tva;
|
||||||
public $multicurrency_total_ttc;
|
public $multicurrency_total_ttc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draft status
|
||||||
|
*/
|
||||||
|
const STATUS_DRAFT = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
|
|||||||
@ -596,7 +596,7 @@ class CommandeFournisseurDispatch extends CommonObject
|
|||||||
$sql .= $this->db->order($sortfield,$sortorder);
|
$sql .= $this->db->order($sortfield,$sortorder);
|
||||||
}
|
}
|
||||||
if (!empty($limit)) {
|
if (!empty($limit)) {
|
||||||
$sql .= ' ' . $this->db->plimit($limit + 1, $offset);
|
$sql .= ' ' . $this->db->plimit($limit, $offset);
|
||||||
}
|
}
|
||||||
$this->lines = array();
|
$this->lines = array();
|
||||||
|
|
||||||
|
|||||||
@ -1918,7 +1918,7 @@ elseif (! empty($object->id))
|
|||||||
$form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'multicurrency_tx', $object->multicurrency_code);
|
$form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'multicurrency_tx', $object->multicurrency_code);
|
||||||
} else {
|
} else {
|
||||||
$form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'none', $object->multicurrency_code);
|
$form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'none', $object->multicurrency_code);
|
||||||
if($object->statut == 0) {
|
if($object->statut == $object::STATUS_DRAFT && $object->multicurrency_code != $conf->currency) {
|
||||||
print '<div class="inline-block"> ';
|
print '<div class="inline-block"> ';
|
||||||
print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=actualizemulticurrencyrate">'.$langs->trans("ActualizeCurrency").'</a>';
|
print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=actualizemulticurrencyrate">'.$langs->trans("ActualizeCurrency").'</a>';
|
||||||
print '</div>';
|
print '</div>';
|
||||||
|
|||||||
@ -2171,7 +2171,7 @@ else
|
|||||||
$form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'multicurrency_tx', $object->multicurrency_code);
|
$form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'multicurrency_tx', $object->multicurrency_code);
|
||||||
} else {
|
} else {
|
||||||
$form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'none', $object->multicurrency_code);
|
$form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'none', $object->multicurrency_code);
|
||||||
if($object->statut == 0) {
|
if($object->statut == $object::STATUS_DRAFT && $object->multicurrency_code != $conf->currency) {
|
||||||
print '<div class="inline-block"> ';
|
print '<div class="inline-block"> ';
|
||||||
print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=actualizemulticurrencyrate">'.$langs->trans("ActualizeCurrency").'</a>';
|
print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=actualizemulticurrencyrate">'.$langs->trans("ActualizeCurrency").'</a>';
|
||||||
print '</div>';
|
print '</div>';
|
||||||
@ -2288,7 +2288,7 @@ else
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Amount
|
// Amount
|
||||||
print '<tr><td>'.$langs->trans('AmountHT').'</td><td>'.price($object->total_ht,1,$langs,0,-1,-1,$conf->currency).'</td></tr>';
|
print '<tr><td class="titlefield">'.$langs->trans('AmountHT').'</td><td>'.price($object->total_ht,1,$langs,0,-1,-1,$conf->currency).'</td></tr>';
|
||||||
print '<tr><td>'.$langs->trans('AmountVAT').'</td><td>'.price($object->total_tva,1,$langs,0,-1,-1,$conf->currency).'<div class="inline-block"> ';
|
print '<tr><td>'.$langs->trans('AmountVAT').'</td><td>'.price($object->total_tva,1,$langs,0,-1,-1,$conf->currency).'<div class="inline-block"> ';
|
||||||
if (GETPOST('calculationrule')) $calculationrule=GETPOST('calculationrule','alpha');
|
if (GETPOST('calculationrule')) $calculationrule=GETPOST('calculationrule','alpha');
|
||||||
else $calculationrule=(empty($conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND)?'totalofround':'roundoftotal');
|
else $calculationrule=(empty($conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND)?'totalofround':'roundoftotal');
|
||||||
|
|||||||
@ -134,32 +134,66 @@ if ($id > 0 || ! empty($ref))
|
|||||||
{
|
{
|
||||||
$object->fetch_thirdparty();
|
$object->fetch_thirdparty();
|
||||||
|
|
||||||
|
$alreadypaid=$object->getSommePaiement();
|
||||||
|
|
||||||
$head = facturefourn_prepare_head($object);
|
$head = facturefourn_prepare_head($object);
|
||||||
|
|
||||||
dol_fiche_head($head, 'contact', $langs->trans('SupplierInvoice'), 0, 'bill');
|
dol_fiche_head($head, 'contact', $langs->trans('SupplierInvoice'), 0, 'bill');
|
||||||
|
|
||||||
/*
|
$linkback = '<a href="' . DOL_URL_ROOT . '/compta/facture/list.php' . (! empty($socid) ? '?socid=' . $socid : '') . '">' . $langs->trans("BackToList") . '</a>';
|
||||||
* Facture synthese pour rappel
|
|
||||||
*/
|
$morehtmlref='<div class="refidno">';
|
||||||
|
// Ref supplier
|
||||||
|
$morehtmlref.=$form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->rights->fournisseur->commande->creer, 'string', '', 0, 1);
|
||||||
|
$morehtmlref.=$form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->rights->fournisseur->commande->creer, 'string', '', null, null, '', 1);
|
||||||
|
// Thirdparty
|
||||||
|
$morehtmlref.='<br>'.$langs->trans('ThirdParty') . ' : ' . $object->thirdparty->getNomUrl(1);
|
||||||
|
// Project
|
||||||
|
if (! empty($conf->projet->enabled))
|
||||||
|
{
|
||||||
|
$langs->load("projects");
|
||||||
|
$morehtmlref.='<br>'.$langs->trans('Project') . ' ';
|
||||||
|
if ($user->rights->facture->creer)
|
||||||
|
{
|
||||||
|
if ($action != 'classify')
|
||||||
|
//$morehtmlref.='<a href="' . $_SERVER['PHP_SELF'] . '?action=classify&id=' . $object->id . '">' . img_edit($langs->transnoentitiesnoconv('SetProject')) . '</a> : ';
|
||||||
|
$morehtmlref.=' : ';
|
||||||
|
if ($action == 'classify') {
|
||||||
|
//$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
|
||||||
|
$morehtmlref.='<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
|
||||||
|
$morehtmlref.='<input type="hidden" name="action" value="classin">';
|
||||||
|
$morehtmlref.='<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||||
|
$morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
|
||||||
|
$morehtmlref.='<input type="submit" class="button valignmiddle" value="'.$langs->trans("Modify").'">';
|
||||||
|
$morehtmlref.='</form>';
|
||||||
|
} else {
|
||||||
|
$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (! empty($object->fk_project)) {
|
||||||
|
$proj = new Project($db);
|
||||||
|
$proj->fetch($object->fk_project);
|
||||||
|
$morehtmlref.='<a href="'.DOL_URL_ROOT.'/projet/card.php?id=' . $object->fk_project . '" title="' . $langs->trans('ShowProject') . '">';
|
||||||
|
$morehtmlref.=$proj->ref;
|
||||||
|
$morehtmlref.='</a>';
|
||||||
|
} else {
|
||||||
|
$morehtmlref.='';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$morehtmlref.='</div>';
|
||||||
|
|
||||||
|
$object->totalpaye = $alreadypaid; // To give a chance to dol_banner_tab to use already paid amount to show correct status
|
||||||
|
|
||||||
|
dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
|
||||||
|
|
||||||
|
print '<div class="fichecenter">';
|
||||||
|
print '<div class="underbanner clearboth"></div>';
|
||||||
|
|
||||||
print '<table class="border" width="100%">';
|
print '<table class="border" width="100%">';
|
||||||
|
|
||||||
$linkback = '<a href="'.DOL_URL_ROOT.'/fourn/facture/list.php'.(! empty($socid)?'?socid='.$socid:'').'">'.$langs->trans("BackToList").'</a>';
|
|
||||||
|
|
||||||
// Reference du facture
|
|
||||||
print '<tr><td class="titlefield">'.$langs->trans("Ref").'</td><td colspan="3">';
|
|
||||||
print $form->showrefnav($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
|
|
||||||
print "</td></tr>";
|
|
||||||
|
|
||||||
// Ref supplier
|
|
||||||
print '<tr><td class="nowrap">'.$langs->trans("RefSupplier").'</td><td colspan="3">'.$object->ref_supplier.'</td>';
|
|
||||||
print "</tr>\n";
|
|
||||||
|
|
||||||
// Third party
|
|
||||||
print "<tr><td>".$langs->trans("Supplier")."</td>";
|
|
||||||
print '<td colspan="3">'.$object->thirdparty->getNomUrl(1,'supplier').'</td></tr>';
|
|
||||||
|
|
||||||
// Type
|
// Type
|
||||||
print '<tr><td>'.$langs->trans('Type').'</td><td colspan="4">';
|
print '<tr><td class="titlefield">'.$langs->trans('Type').'</td><td colspan="4">';
|
||||||
print $object->getLibType();
|
print $object->getLibType();
|
||||||
if ($object->type == FactureFournisseur::TYPE_REPLACEMENT)
|
if ($object->type == FactureFournisseur::TYPE_REPLACEMENT)
|
||||||
{
|
{
|
||||||
@ -198,33 +232,29 @@ if ($id > 0 || ! empty($ref))
|
|||||||
print '</td></tr>';
|
print '</td></tr>';
|
||||||
|
|
||||||
// Label
|
// Label
|
||||||
print '<tr><td>'.$form->editfieldkey("Label",'label',$object->label,$object,0).'</td><td colspan="3">';
|
print '<tr><td>'.$form->editfieldkey("Label",'label',$object->label,$object,0).'</td><td>';
|
||||||
print $form->editfieldval("Label",'label',$object->label,$object,0);
|
print $form->editfieldval("Label",'label',$object->label,$object,0);
|
||||||
print '</td></tr>';
|
print '</td></tr>';
|
||||||
|
|
||||||
// Status
|
|
||||||
$alreadypaid=$object->getSommePaiement();
|
|
||||||
print '<tr><td>'.$langs->trans('Status').'</td><td colspan="3">'.$object->getLibStatut(4,$alreadypaid).'</td></tr>';
|
|
||||||
|
|
||||||
// Amount
|
// Amount
|
||||||
print '<tr><td>'.$langs->trans('AmountHT').'</td><td colspan="3">'.price($object->total_ht,1,$langs,0,-1,-1,$conf->currency).'</td></tr>';
|
print '<tr><td>'.$langs->trans('AmountHT').'</td><td>'.price($object->total_ht,1,$langs,0,-1,-1,$conf->currency).'</td></tr>';
|
||||||
print '<tr><td>'.$langs->trans('AmountVAT').'</td><td colspan="3">'.price($object->total_tva,1,$langs,0,-1,-1,$conf->currency).'</td></tr>';
|
print '<tr><td>'.$langs->trans('AmountVAT').'</td><td>'.price($object->total_tva,1,$langs,0,-1,-1,$conf->currency).'</td></tr>';
|
||||||
|
|
||||||
// Amount Local Taxes
|
// Amount Local Taxes
|
||||||
//TODO: Place into a function to control showing by country or study better option
|
//TODO: Place into a function to control showing by country or study better option
|
||||||
if ($societe->localtax1_assuj=="1") //Localtax1
|
if ($societe->localtax1_assuj=="1") //Localtax1
|
||||||
{
|
{
|
||||||
print '<tr><td>'.$langs->transcountry("AmountLT1",$societe->country_code).'</td>';
|
print '<tr><td>'.$langs->transcountry("AmountLT1",$societe->country_code).'</td>';
|
||||||
print '<td colspan="3">'.price($object->total_localtax1,1,$langs,0,-1,-1,$conf->currency).'</td>';
|
print '<td>'.price($object->total_localtax1,1,$langs,0,-1,-1,$conf->currency).'</td>';
|
||||||
print '</tr>';
|
print '</tr>';
|
||||||
}
|
}
|
||||||
if ($societe->localtax2_assuj=="1") //Localtax2
|
if ($societe->localtax2_assuj=="1") //Localtax2
|
||||||
{
|
{
|
||||||
print '<tr><td>'.$langs->transcountry("AmountLT2",$societe->country_code).'</td>';
|
print '<tr><td>'.$langs->transcountry("AmountLT2",$societe->country_code).'</td>';
|
||||||
print '<td colspan="3">'.price($object->total_localtax2,1,$langs,0,-1,-1,$conf->currency).'</td>';
|
print '<td>'.price($object->total_localtax2,1,$langs,0,-1,-1,$conf->currency).'</td>';
|
||||||
print '</tr>';
|
print '</tr>';
|
||||||
}
|
}
|
||||||
print '<tr><td>'.$langs->trans('AmountTTC').'</td><td colspan="3">'.price($object->total_ttc,1,$langs,0,-1,-1,$conf->currency).'</td></tr>';
|
print '<tr><td>'.$langs->trans('AmountTTC').'</td><td>'.price($object->total_ttc,1,$langs,0,-1,-1,$conf->currency).'</td></tr>';
|
||||||
|
|
||||||
print "</table>";
|
print "</table>";
|
||||||
|
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
* Copyright (C) 2005 Marc Barilley / Ocebo <marc@ocebo.com>
|
* Copyright (C) 2005 Marc Barilley / Ocebo <marc@ocebo.com>
|
||||||
* Copyright (C) 2005-2012 Regis Houssin <regis.houssin@capnetworks.com>
|
* Copyright (C) 2005-2012 Regis Houssin <regis.houssin@capnetworks.com>
|
||||||
* Copyright (C) 2013 Cédric Salvador <csalvador@gpcsolutions.fr>
|
* Copyright (C) 2013 Cédric Salvador <csalvador@gpcsolutions.fr>
|
||||||
|
* Copyright (C) 2016 Alexandre Spangaro <aspangaro@zendsi.com>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -90,6 +91,58 @@ if ($object->id > 0)
|
|||||||
$head = facturefourn_prepare_head($object);
|
$head = facturefourn_prepare_head($object);
|
||||||
dol_fiche_head($head, 'documents', $langs->trans('SupplierInvoice'), 0, 'bill');
|
dol_fiche_head($head, 'documents', $langs->trans('SupplierInvoice'), 0, 'bill');
|
||||||
|
|
||||||
|
$totalpaye = $object->getSommePaiement();
|
||||||
|
|
||||||
|
$linkback = '<a href="' . DOL_URL_ROOT . '/compta/facture/list.php' . (! empty($socid) ? '?socid=' . $socid : '') . '">' . $langs->trans("BackToList") . '</a>';
|
||||||
|
|
||||||
|
$morehtmlref='<div class="refidno">';
|
||||||
|
// Ref supplier
|
||||||
|
$morehtmlref.=$form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->rights->fournisseur->commande->creer, 'string', '', 0, 1);
|
||||||
|
$morehtmlref.=$form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->rights->fournisseur->commande->creer, 'string', '', null, null, '', 1);
|
||||||
|
// Thirdparty
|
||||||
|
$morehtmlref.='<br>'.$langs->trans('ThirdParty') . ' : ' . $object->thirdparty->getNomUrl(1);
|
||||||
|
// Project
|
||||||
|
if (! empty($conf->projet->enabled))
|
||||||
|
{
|
||||||
|
$langs->load("projects");
|
||||||
|
$morehtmlref.='<br>'.$langs->trans('Project') . ' ';
|
||||||
|
if ($user->rights->facture->creer)
|
||||||
|
{
|
||||||
|
if ($action != 'classify')
|
||||||
|
//$morehtmlref.='<a href="' . $_SERVER['PHP_SELF'] . '?action=classify&id=' . $object->id . '">' . img_edit($langs->transnoentitiesnoconv('SetProject')) . '</a> : ';
|
||||||
|
$morehtmlref.=' : ';
|
||||||
|
if ($action == 'classify') {
|
||||||
|
//$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
|
||||||
|
$morehtmlref.='<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
|
||||||
|
$morehtmlref.='<input type="hidden" name="action" value="classin">';
|
||||||
|
$morehtmlref.='<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||||
|
$morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
|
||||||
|
$morehtmlref.='<input type="submit" class="button valignmiddle" value="'.$langs->trans("Modify").'">';
|
||||||
|
$morehtmlref.='</form>';
|
||||||
|
} else {
|
||||||
|
$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (! empty($object->fk_project)) {
|
||||||
|
$proj = new Project($db);
|
||||||
|
$proj->fetch($object->fk_project);
|
||||||
|
$morehtmlref.='<a href="'.DOL_URL_ROOT.'/projet/card.php?id=' . $object->fk_project . '" title="' . $langs->trans('ShowProject') . '">';
|
||||||
|
$morehtmlref.=$proj->ref;
|
||||||
|
$morehtmlref.='</a>';
|
||||||
|
} else {
|
||||||
|
$morehtmlref.='';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$morehtmlref.='</div>';
|
||||||
|
|
||||||
|
$object->totalpaye = $totalpaye; // To give a chance to dol_banner_tab to use already paid amount to show correct status
|
||||||
|
|
||||||
|
dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref, '', 0);
|
||||||
|
|
||||||
|
print '<div class="fichecenter">';
|
||||||
|
print '<div class="underbanner clearboth"></div>';
|
||||||
|
|
||||||
// Construit liste des fichiers
|
// Construit liste des fichiers
|
||||||
$filearray=dol_dir_list($upload_dir,"files",0,'','(\.meta|_preview\.png)$',$sortfield,(strtolower($sortorder)=='desc'?SORT_DESC:SORT_ASC),1);
|
$filearray=dol_dir_list($upload_dir,"files",0,'','(\.meta|_preview\.png)$',$sortfield,(strtolower($sortorder)=='desc'?SORT_DESC:SORT_ASC),1);
|
||||||
$totalsize=0;
|
$totalsize=0;
|
||||||
@ -109,23 +162,8 @@ if ($object->id > 0)
|
|||||||
|
|
||||||
print '<table class="border" width="100%">';
|
print '<table class="border" width="100%">';
|
||||||
|
|
||||||
$linkback = '<a href="'.DOL_URL_ROOT.'/fourn/facture/list.php'.(! empty($socid)?'?socid='.$socid:'').'">'.$langs->trans("BackToList").'</a>';
|
|
||||||
|
|
||||||
// Ref
|
|
||||||
print '<tr><td class="titlefield nowrap">'.$langs->trans("Ref").'</td><td colspan="3">';
|
|
||||||
print $form->showrefnav($object, 'ref', $linkback, 1, 'ref', 'ref');
|
|
||||||
print '</td>';
|
|
||||||
print "</tr>\n";
|
|
||||||
|
|
||||||
// Ref supplier
|
|
||||||
print '<tr><td class="nowrap">'.$langs->trans("RefSupplier").'</td><td colspan="3">'.$object->ref_supplier.'</td>';
|
|
||||||
print "</tr>\n";
|
|
||||||
|
|
||||||
// Thirdparty
|
|
||||||
print '<tr><td>'.$langs->trans('Supplier').'</td><td colspan="3">'.$object->thirdparty->getNomUrl(1,'supplier').'</td></tr>';
|
|
||||||
|
|
||||||
// Type
|
// Type
|
||||||
print '<tr><td>'.$langs->trans('Type').'</td><td colspan="4">';
|
print '<tr><td class="titlefield">'.$langs->trans('Type').'</td><td>';
|
||||||
print $object->getLibType();
|
print $object->getLibType();
|
||||||
if ($object->type == FactureFournisseur::TYPE_REPLACEMENT)
|
if ($object->type == FactureFournisseur::TYPE_REPLACEMENT)
|
||||||
{
|
{
|
||||||
@ -166,42 +204,38 @@ if ($object->id > 0)
|
|||||||
print '</td></tr>';
|
print '</td></tr>';
|
||||||
|
|
||||||
// Label
|
// Label
|
||||||
print '<tr><td>'.$form->editfieldkey("Label",'label',$object->label,$object,0).'</td><td colspan="3">';
|
print '<tr><td>'.$form->editfieldkey("Label",'label',$object->label,$object,0).'</td><td>';
|
||||||
print $form->editfieldval("Label",'label',$object->label,$object,0);
|
print $form->editfieldval("Label",'label',$object->label,$object,0);
|
||||||
print '</td>';
|
print '</td>';
|
||||||
|
|
||||||
// Status
|
|
||||||
$alreadypaid=$object->getSommePaiement();
|
|
||||||
print '<tr><td>'.$langs->trans('Status').'</td><td colspan="3">'.$object->getLibStatut(4,$alreadypaid).'</td></tr>';
|
|
||||||
|
|
||||||
// Amount
|
// Amount
|
||||||
print '<tr><td>'.$langs->trans('AmountHT').'</td><td colspan="3">'.price($object->total_ht,1,$langs,0,-1,-1,$conf->currency).'</td></tr>';
|
print '<tr><td>'.$langs->trans('AmountHT').'</td><td>'.price($object->total_ht,1,$langs,0,-1,-1,$conf->currency).'</td></tr>';
|
||||||
print '<tr><td>'.$langs->trans('AmountVAT').'</td><td colspan="3">'.price($object->total_tva,1,$langs,0,-1,-1,$conf->currency).'</td></tr>';
|
print '<tr><td>'.$langs->trans('AmountVAT').'</td><td>'.price($object->total_tva,1,$langs,0,-1,-1,$conf->currency).'</td></tr>';
|
||||||
|
|
||||||
// Amount Local Taxes
|
// Amount Local Taxes
|
||||||
//TODO: Place into a function to control showing by country or study better option
|
//TODO: Place into a function to control showing by country or study better option
|
||||||
if ($societe->localtax1_assuj=="1") //Localtax1
|
if ($societe->localtax1_assuj=="1") //Localtax1
|
||||||
{
|
{
|
||||||
print '<tr><td>'.$langs->transcountry("AmountLT1",$societe->country_code).'</td>';
|
print '<tr><td>'.$langs->transcountry("AmountLT1",$societe->country_code).'</td>';
|
||||||
print '<td colspan="3">'.price($object->total_localtax1,1,$langs,0,-1,-1,$conf->currency).'</td>';
|
print '<td>'.price($object->total_localtax1,1,$langs,0,-1,-1,$conf->currency).'</td>';
|
||||||
print '</tr>';
|
print '</tr>';
|
||||||
}
|
}
|
||||||
if ($societe->localtax2_assuj=="1") //Localtax2
|
if ($societe->localtax2_assuj=="1") //Localtax2
|
||||||
{
|
{
|
||||||
print '<tr><td>'.$langs->transcountry("AmountLT2",$societe->country_code).'</td>';
|
print '<tr><td>'.$langs->transcountry("AmountLT2",$societe->country_code).'</td>';
|
||||||
print '<td colspan="3">'.price($object->total_localtax2,1,$langs,0,-1,-1,$conf->currency).'</td>';
|
print '<td>'.price($object->total_localtax2,1,$langs,0,-1,-1,$conf->currency).'</td>';
|
||||||
print '</tr>';
|
print '</tr>';
|
||||||
}
|
}
|
||||||
print '<tr><td>'.$langs->trans('AmountTTC').'</td><td colspan="3">'.price($object->total_ttc,1,$langs,0,-1,-1,$conf->currency).'</td></tr>';
|
print '<tr><td>'.$langs->trans('AmountTTC').'</td><td>'.price($object->total_ttc,1,$langs,0,-1,-1,$conf->currency).'</td></tr>';
|
||||||
|
|
||||||
print '</table><br>';
|
print '</table><br>';
|
||||||
|
|
||||||
print '<table class="border" width="100%">';
|
print '<table class="border" width="100%">';
|
||||||
|
|
||||||
// Nb of files
|
// Nb of files
|
||||||
print '<tr><td class="titlefield nowrap">'.$langs->trans('NbOfAttachedFiles').'</td><td colspan="3">'.count($filearray).'</td></tr>';
|
print '<tr><td class="titlefield nowrap">'.$langs->trans('NbOfAttachedFiles').'</td><td>'.count($filearray).'</td></tr>';
|
||||||
|
|
||||||
print '<tr><td>'.$langs->trans('TotalSizeOfAttachedFiles').'</td><td colspan="3">'.$totalsize.' '.$langs->trans('bytes').'</td></tr>';
|
print '<tr><td>'.$langs->trans('TotalSizeOfAttachedFiles').'</td><td>'.$totalsize.' '.$langs->trans('bytes').'</td></tr>';
|
||||||
|
|
||||||
print '</table>';
|
print '</table>';
|
||||||
print '</div>';
|
print '</div>';
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
/* Copyright (C) 2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
|
/* Copyright (C) 2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
|
||||||
* Copyright (C) 2004-2006 Laurent Destailleur <eldy@users.sourceforge.net>
|
* Copyright (C) 2004-2006 Laurent Destailleur <eldy@users.sourceforge.net>
|
||||||
* Copyright (C) 2005-2009 Regis Houssin <regis.houssin@capnetworks.com>
|
* Copyright (C) 2005-2009 Regis Houssin <regis.houssin@capnetworks.com>
|
||||||
|
* Copyright (C) 2016 Alexandre Spangaro <aspangaro@zendsi.com>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -26,17 +27,19 @@
|
|||||||
require '../../main.inc.php';
|
require '../../main.inc.php';
|
||||||
require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php';
|
require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php';
|
||||||
require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
|
require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
|
||||||
require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
|
|
||||||
require_once DOL_DOCUMENT_ROOT.'/core/lib/fourn.lib.php';
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/fourn.lib.php';
|
||||||
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
|
||||||
|
|
||||||
$langs->load('bills');
|
$langs->load('bills');
|
||||||
|
|
||||||
$id = GETPOST("facid",'int');
|
$id = GETPOST("facid",'int')?GETPOST("facid",'int'):GETPOST("id",'int');
|
||||||
|
$ref = GETPOST("ref",'alpha');
|
||||||
|
|
||||||
// Security check
|
// Security check
|
||||||
if ($user->societe_id) $socid=$user->societe_id;
|
if ($user->societe_id) $socid=$user->societe_id;
|
||||||
$result = restrictedArea($user, 'fournisseur', $id, 'facture_fourn', 'facture');
|
$result = restrictedArea($user, 'fournisseur', $id, 'facture_fourn', 'facture');
|
||||||
|
|
||||||
|
$object = new FactureFournisseur($db);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -47,16 +50,69 @@ $title = $langs->trans('SupplierInvoice') . " - " . $langs->trans('Info');
|
|||||||
$helpurl = "EN:Module_Suppliers_Invoices|FR:Module_Fournisseurs_Factures|ES:Módulo_Facturas_de_proveedores";
|
$helpurl = "EN:Module_Suppliers_Invoices|FR:Module_Fournisseurs_Factures|ES:Módulo_Facturas_de_proveedores";
|
||||||
llxHeader('', $title, $helpurl);
|
llxHeader('', $title, $helpurl);
|
||||||
|
|
||||||
$object = new FactureFournisseur($db);
|
$object->fetch($id, $ref);
|
||||||
$object->fetch($id);
|
$object->fetch_thirdparty();
|
||||||
$object->info($id);
|
|
||||||
$soc = new Societe($db);
|
$object->info($object->id);
|
||||||
$soc->fetch($object->socid);
|
|
||||||
|
$alreadypaid=$object->getSommePaiement();
|
||||||
|
|
||||||
$head = facturefourn_prepare_head($object);
|
$head = facturefourn_prepare_head($object);
|
||||||
$titre=$langs->trans('SupplierInvoice');
|
$titre=$langs->trans('SupplierInvoice');
|
||||||
dol_fiche_head($head, 'info', $langs->trans('SupplierInvoice'), 0, 'bill');
|
dol_fiche_head($head, 'info', $langs->trans('SupplierInvoice'), 0, 'bill');
|
||||||
|
|
||||||
|
$linkback = '<a href="' . DOL_URL_ROOT . '/compta/facture/list.php' . (! empty($socid) ? '?socid=' . $socid : '') . '">' . $langs->trans("BackToList") . '</a>';
|
||||||
|
|
||||||
|
$morehtmlref='<div class="refidno">';
|
||||||
|
// Ref supplier
|
||||||
|
$morehtmlref.=$form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->rights->fournisseur->commande->creer, 'string', '', 0, 1);
|
||||||
|
$morehtmlref.=$form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->rights->fournisseur->commande->creer, 'string', '', null, null, '', 1);
|
||||||
|
// Thirdparty
|
||||||
|
// $morehtmlref.='<br>'.$langs->trans('ThirdParty') . ' : ' . $object->thirdparty->getNomUrl(1);
|
||||||
|
// Project
|
||||||
|
if (! empty($conf->projet->enabled))
|
||||||
|
{
|
||||||
|
$langs->load("projects");
|
||||||
|
$morehtmlref.='<br>'.$langs->trans('Project') . ' ';
|
||||||
|
if ($user->rights->facture->creer)
|
||||||
|
{
|
||||||
|
if ($action != 'classify')
|
||||||
|
//$morehtmlref.='<a href="' . $_SERVER['PHP_SELF'] . '?action=classify&id=' . $object->id . '">' . img_edit($langs->transnoentitiesnoconv('SetProject')) . '</a> : ';
|
||||||
|
$morehtmlref.=' : ';
|
||||||
|
if ($action == 'classify') {
|
||||||
|
//$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
|
||||||
|
$morehtmlref.='<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
|
||||||
|
$morehtmlref.='<input type="hidden" name="action" value="classin">';
|
||||||
|
$morehtmlref.='<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||||
|
$morehtmlref.=$formproject->select_projects($object->thirdparty->id, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
|
||||||
|
$morehtmlref.='<input type="submit" class="button valignmiddle" value="'.$langs->trans("Modify").'">';
|
||||||
|
$morehtmlref.='</form>';
|
||||||
|
} else {
|
||||||
|
$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->thirdparty->id, $object->fk_project, 'none', 0, 0, 0, 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (! empty($object->fk_project)) {
|
||||||
|
$proj = new Project($db);
|
||||||
|
$proj->fetch($object->fk_project);
|
||||||
|
$morehtmlref.='<a href="'.DOL_URL_ROOT.'/projet/card.php?id=' . $object->fk_project . '" title="' . $langs->trans('ShowProject') . '">';
|
||||||
|
$morehtmlref.=$proj->ref;
|
||||||
|
$morehtmlref.='</a>';
|
||||||
|
} else {
|
||||||
|
$morehtmlref.='';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$morehtmlref.='</div>';
|
||||||
|
|
||||||
|
$object->totalpaye = $alreadypaid; // To give a chance to dol_banner_tab to use already paid amount to show correct status
|
||||||
|
|
||||||
|
dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref, '', 0);
|
||||||
|
|
||||||
|
print '<div class="fichecenter">';
|
||||||
|
print '<div class="underbanner clearboth"></div>';
|
||||||
|
|
||||||
|
print '<br>';
|
||||||
|
|
||||||
print '<table width="100%"><tr><td>';
|
print '<table width="100%"><tr><td>';
|
||||||
dol_print_object_info($object);
|
dol_print_object_info($object);
|
||||||
print '</td></tr></table>';
|
print '</td></tr></table>';
|
||||||
|
|||||||
@ -75,6 +75,8 @@ if ($object->id > 0)
|
|||||||
{
|
{
|
||||||
$object->fetch_thirdparty();
|
$object->fetch_thirdparty();
|
||||||
|
|
||||||
|
$alreadypaid=$object->getSommePaiement();
|
||||||
|
|
||||||
$head = facturefourn_prepare_head($object);
|
$head = facturefourn_prepare_head($object);
|
||||||
$titre=$langs->trans('SupplierInvoice');
|
$titre=$langs->trans('SupplierInvoice');
|
||||||
dol_fiche_head($head, 'note', $titre, 0, 'bill');
|
dol_fiche_head($head, 'note', $titre, 0, 'bill');
|
||||||
@ -82,23 +84,59 @@ if ($object->id > 0)
|
|||||||
|
|
||||||
print '<table class="border" width="100%">';
|
print '<table class="border" width="100%">';
|
||||||
|
|
||||||
$linkback = '<a href="'.DOL_URL_ROOT.'/fourn/facture/list.php'.(! empty($socid)?'?socid='.$socid:'').'">'.$langs->trans("BackToList").'</a>';
|
// Supplier invoice card
|
||||||
|
$linkback = '<a href="'.DOL_URL_ROOT.'/fourn/facture/list.php'.(! empty($socid)?'?socid='.$socid:'').'">'.$langs->trans("BackToList").'</a>';
|
||||||
|
|
||||||
// Ref
|
$morehtmlref='<div class="refidno">';
|
||||||
print '<tr><td class="titlefield nowrap">'.$langs->trans("Ref").'</td><td colspan="3">';
|
// Ref supplier
|
||||||
print $form->showrefnav($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
|
$morehtmlref.=$form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->rights->fournisseur->commande->creer, 'string', '', 0, 1);
|
||||||
print '</td>';
|
$morehtmlref.=$form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $user->rights->fournisseur->commande->creer, 'string', '', null, null, '', 1);
|
||||||
print "</tr>\n";
|
// Thirdparty
|
||||||
|
$morehtmlref.='<br>'.$langs->trans('ThirdParty') . ' : ' . $object->thirdparty->getNomUrl(1);
|
||||||
|
// Project
|
||||||
|
if (! empty($conf->projet->enabled))
|
||||||
|
{
|
||||||
|
$langs->load("projects");
|
||||||
|
$morehtmlref.='<br>'.$langs->trans('Project') . ' ';
|
||||||
|
if ($user->rights->fournisseur->commande->creer)
|
||||||
|
{
|
||||||
|
if ($action != 'classify')
|
||||||
|
// $morehtmlref.='<a href="' . $_SERVER['PHP_SELF'] . '?action=classify&id=' . $object->id . '">' . img_edit($langs->transnoentitiesnoconv('SetProject')) . '</a> : ';
|
||||||
|
$morehtmlref.=' : ';
|
||||||
|
if ($action == 'classify') {
|
||||||
|
//$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
|
||||||
|
$morehtmlref.='<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
|
||||||
|
$morehtmlref.='<input type="hidden" name="action" value="classin">';
|
||||||
|
$morehtmlref.='<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||||
|
$morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
|
||||||
|
$morehtmlref.='<input type="submit" class="button valignmiddle" value="'.$langs->trans("Modify").'">';
|
||||||
|
$morehtmlref.='</form>';
|
||||||
|
} else {
|
||||||
|
$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (! empty($object->fk_project)) {
|
||||||
|
$proj = new Project($db);
|
||||||
|
$proj->fetch($object->fk_project);
|
||||||
|
$morehtmlref.='<a href="'.DOL_URL_ROOT.'/projet/card.php?id=' . $object->fk_project . '" title="' . $langs->trans('ShowProject') . '">';
|
||||||
|
$morehtmlref.=$proj->ref;
|
||||||
|
$morehtmlref.='</a>';
|
||||||
|
} else {
|
||||||
|
$morehtmlref.='';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$morehtmlref.='</div>';
|
||||||
|
|
||||||
// Ref supplier
|
$object->totalpaye = $alreadypaid; // To give a chance to dol_banner_tab to use already paid amount to show correct status
|
||||||
print '<tr><td class="nowrap">'.$langs->trans("RefSupplier").'</td><td colspan="3">'.$object->ref_supplier.'</td>';
|
|
||||||
print "</tr>\n";
|
|
||||||
|
|
||||||
// Company
|
dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
|
||||||
print '<tr><td>'.$langs->trans('Supplier').'</td><td colspan="3">'.$object->thirdparty->getNomUrl(1,'supplier').'</td></tr>';
|
|
||||||
|
print '<div class="fichecenter">';
|
||||||
|
print '<div class="underbanner clearboth"></div>';
|
||||||
|
|
||||||
// Type
|
// Type
|
||||||
print '<tr><td>'.$langs->trans('Type').'</td><td colspan="4">';
|
print '<tr><td class="titlefield">'.$langs->trans('Type').'</td><td>';
|
||||||
print $object->getLibType();
|
print $object->getLibType();
|
||||||
if ($object->type == FactureFournisseur::TYPE_REPLACEMENT)
|
if ($object->type == FactureFournisseur::TYPE_REPLACEMENT)
|
||||||
{
|
{
|
||||||
@ -137,38 +175,35 @@ if ($object->id > 0)
|
|||||||
print '</td></tr>';
|
print '</td></tr>';
|
||||||
|
|
||||||
// Label
|
// Label
|
||||||
print '<tr><td>'.$form->editfieldkey("Label",'label',$object->label,$object,0).'</td><td colspan="3">';
|
print '<tr><td>'.$form->editfieldkey("Label",'label',$object->label,$object,0).'</td><td>';
|
||||||
print $form->editfieldval("Label",'label',$object->label,$object,0);
|
print $form->editfieldval("Label",'label',$object->label,$object,0);
|
||||||
print '</td></tr>';
|
print '</td></tr>';
|
||||||
|
|
||||||
// Status
|
|
||||||
$alreadypaid=$object->getSommePaiement();
|
|
||||||
print '<tr><td>'.$langs->trans('Status').'</td><td colspan="3">'.$object->getLibStatut(4,$alreadypaid).'</td></tr>';
|
|
||||||
|
|
||||||
// Amount
|
// Amount
|
||||||
print '<tr><td>'.$langs->trans('AmountHT').'</td><td colspan="3">'.price($object->total_ht,1,$langs,0,-1,-1,$conf->currency).'</td></tr>';
|
print '<tr><td>'.$langs->trans('AmountHT').'</td><td>'.price($object->total_ht,1,$langs,0,-1,-1,$conf->currency).'</td></tr>';
|
||||||
print '<tr><td>'.$langs->trans('AmountVAT').'</td><td colspan="3">'.price($object->total_tva,1,$langs,0,-1,-1,$conf->currency).'</td></tr>';
|
print '<tr><td>'.$langs->trans('AmountVAT').'</td><td>'.price($object->total_tva,1,$langs,0,-1,-1,$conf->currency).'</td></tr>';
|
||||||
|
|
||||||
// Amount Local Taxes
|
// Amount Local Taxes
|
||||||
//TODO: Place into a function to control showing by country or study better option
|
//TODO: Place into a function to control showing by country or study better option
|
||||||
if ($societe->localtax1_assuj=="1") //Localtax1
|
if ($societe->localtax1_assuj=="1") //Localtax1
|
||||||
{
|
{
|
||||||
print '<tr><td>'.$langs->transcountry("AmountLT1",$societe->country_code).'</td>';
|
print '<tr><td>'.$langs->transcountry("AmountLT1",$societe->country_code).'</td>';
|
||||||
print '<td colspan="3">'.price($object->total_localtax1,1,$langs,0,-1,-1,$conf->currency).'</td>';
|
print '<td>'.price($object->total_localtax1,1,$langs,0,-1,-1,$conf->currency).'</td>';
|
||||||
print '</tr>';
|
print '</tr>';
|
||||||
}
|
}
|
||||||
if ($societe->localtax2_assuj=="1") //Localtax2
|
if ($societe->localtax2_assuj=="1") //Localtax2
|
||||||
{
|
{
|
||||||
print '<tr><td>'.$langs->transcountry("AmountLT2",$societe->country_code).'</td>';
|
print '<tr><td>'.$langs->transcountry("AmountLT2",$societe->country_code).'</td>';
|
||||||
print '<td colspan="3">'.price($object->total_localtax2,1,$langs,0,-1,-1,$conf->currency).'</td>';
|
print '<td>'.price($object->total_localtax2,1,$langs,0,-1,-1,$conf->currency).'</td>';
|
||||||
print '</tr>';
|
print '</tr>';
|
||||||
}
|
}
|
||||||
print '<tr><td>'.$langs->trans('AmountTTC').'</td><td colspan="3">'.price($object->total_ttc,1,$langs,0,-1,-1,$conf->currency).'</td></tr>';
|
print '<tr><td>'.$langs->trans('AmountTTC').'</td><td>'.price($object->total_ttc,1,$langs,0,-1,-1,$conf->currency).'</td></tr>';
|
||||||
|
|
||||||
print "</table>";
|
print "</table>";
|
||||||
|
|
||||||
print '<br>';
|
print '<br>';
|
||||||
|
|
||||||
|
$cssclass="titlefield";
|
||||||
include DOL_DOCUMENT_ROOT.'/core/tpl/notes.tpl.php';
|
include DOL_DOCUMENT_ROOT.'/core/tpl/notes.tpl.php';
|
||||||
|
|
||||||
dol_fiche_end();
|
dol_fiche_end();
|
||||||
|
|||||||
@ -34,20 +34,20 @@ class Establishment extends CommonObject
|
|||||||
public $fk_element = 'fk_establishment';
|
public $fk_element = 'fk_establishment';
|
||||||
protected $ismultientitymanaged = 1; // 0=No test on entity, 1=Test with field entity, 2=Test with link by societe
|
protected $ismultientitymanaged = 1; // 0=No test on entity, 1=Test with field entity, 2=Test with link by societe
|
||||||
|
|
||||||
var $id;
|
public $id;
|
||||||
var $rowid;
|
public $rowid;
|
||||||
|
|
||||||
var $name;
|
public $name;
|
||||||
var $address;
|
public $address;
|
||||||
var $zip;
|
public $zip;
|
||||||
var $town;
|
public $town;
|
||||||
var $status; // 0=open, 1=closed
|
public $status; // 0=open, 1=closed
|
||||||
var $entity;
|
public $entity;
|
||||||
|
|
||||||
var $country_id;
|
public $country_id;
|
||||||
|
|
||||||
var $statuts=array();
|
public $statuts=array();
|
||||||
var $statuts_short=array();
|
public $statuts_short=array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
|
|||||||
@ -97,7 +97,7 @@ class DoliStorage implements TokenStorageInterface
|
|||||||
$this->tokens = array();
|
$this->tokens = array();
|
||||||
}
|
}
|
||||||
$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."oauth_token";
|
$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."oauth_token";
|
||||||
$sql.= " WHERE service='".$service."' AND entity=1";
|
$sql.= " WHERE service='".$this->db->escape($service)."' AND entity=1";
|
||||||
$resql = $this->db->query($sql);
|
$resql = $this->db->query($sql);
|
||||||
if (! $resql)
|
if (! $resql)
|
||||||
{
|
{
|
||||||
@ -113,7 +113,7 @@ class DoliStorage implements TokenStorageInterface
|
|||||||
} else {
|
} else {
|
||||||
// save
|
// save
|
||||||
$sql = "INSERT INTO ".MAIN_DB_PREFIX."oauth_token (service, token, entity)";
|
$sql = "INSERT INTO ".MAIN_DB_PREFIX."oauth_token (service, token, entity)";
|
||||||
$sql.= " VALUES ('".$service."', '".$this->db->escape($serializedToken)."', 1)";
|
$sql.= " VALUES ('".$this->db->escape($service)."', '".$this->db->escape($serializedToken)."', 1)";
|
||||||
$resql = $this->db->query($sql);
|
$resql = $this->db->query($sql);
|
||||||
}
|
}
|
||||||
//print $sql;
|
//print $sql;
|
||||||
@ -130,7 +130,7 @@ class DoliStorage implements TokenStorageInterface
|
|||||||
// get from db
|
// get from db
|
||||||
dol_syslog("hasAccessToken service=".$service);
|
dol_syslog("hasAccessToken service=".$service);
|
||||||
$sql = "SELECT token FROM ".MAIN_DB_PREFIX."oauth_token";
|
$sql = "SELECT token FROM ".MAIN_DB_PREFIX."oauth_token";
|
||||||
$sql.= " WHERE service='".$service."'";
|
$sql.= " WHERE service='".$this->db->escape($service)."'";
|
||||||
$resql = $this->db->query($sql);
|
$resql = $this->db->query($sql);
|
||||||
if (! $resql)
|
if (! $resql)
|
||||||
{
|
{
|
||||||
@ -159,7 +159,7 @@ class DoliStorage implements TokenStorageInterface
|
|||||||
// unset($tokens[$service]);
|
// unset($tokens[$service]);
|
||||||
|
|
||||||
$sql = "DELETE FROM ".MAIN_DB_PREFIX."oauth_token";
|
$sql = "DELETE FROM ".MAIN_DB_PREFIX."oauth_token";
|
||||||
$sql.= " WHERE service='".$service."'";
|
$sql.= " WHERE service='".$this->db->escape($service)."'";
|
||||||
$resql = $this->db->query($sql);
|
$resql = $this->db->query($sql);
|
||||||
//}
|
//}
|
||||||
|
|
||||||
@ -189,7 +189,7 @@ class DoliStorage implements TokenStorageInterface
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new AuthorizationStateNotFoundException('State not found in conf, are you sure you stored it?');
|
throw new AuthorizationStateNotFoundException('State not found in db, are you sure you stored it?');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -207,7 +207,7 @@ class DoliStorage implements TokenStorageInterface
|
|||||||
$this->states[$service] = $state;
|
$this->states[$service] = $state;
|
||||||
|
|
||||||
$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."oauth_state";
|
$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."oauth_state";
|
||||||
$sql.= " WHERE service='".$service."' AND entity=1";
|
$sql.= " WHERE service='".$this->db->escape($service)."' AND entity=1";
|
||||||
$resql = $this->db->query($sql);
|
$resql = $this->db->query($sql);
|
||||||
if (! $resql)
|
if (! $resql)
|
||||||
{
|
{
|
||||||
@ -223,7 +223,7 @@ class DoliStorage implements TokenStorageInterface
|
|||||||
} else {
|
} else {
|
||||||
// save
|
// save
|
||||||
$sql = "INSERT INTO ".MAIN_DB_PREFIX."oauth_state (service, state, entity)";
|
$sql = "INSERT INTO ".MAIN_DB_PREFIX."oauth_state (service, state, entity)";
|
||||||
$sql.= " VALUES ('".$service."', '".$state."', 1)";
|
$sql.= " VALUES ('".$this->db->escape($service)."', '".$this->db->escape($state)."', 1)";
|
||||||
$resql = $this->db->query($sql);
|
$resql = $this->db->query($sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,9 +236,10 @@ class DoliStorage implements TokenStorageInterface
|
|||||||
*/
|
*/
|
||||||
public function hasAuthorizationState($service)
|
public function hasAuthorizationState($service)
|
||||||
{
|
{
|
||||||
// get from db
|
// get state from db
|
||||||
|
dol_syslog("get state from db");
|
||||||
$sql = "SELECT state FROM ".MAIN_DB_PREFIX."oauth_state";
|
$sql = "SELECT state FROM ".MAIN_DB_PREFIX."oauth_state";
|
||||||
$sql.= " WHERE service='".$service."'";
|
$sql.= " WHERE service='".$this->db->escape($service)."'";
|
||||||
$resql = $this->db->query($sql);
|
$resql = $this->db->query($sql);
|
||||||
$result = $this->db->fetch_array($resql);
|
$result = $this->db->fetch_array($resql);
|
||||||
$states[$service] = $result[state];
|
$states[$service] = $result[state];
|
||||||
|
|||||||
@ -411,7 +411,8 @@ else
|
|||||||
array('from'=>'3.7.0', 'to'=>'3.8.0'),
|
array('from'=>'3.7.0', 'to'=>'3.8.0'),
|
||||||
array('from'=>'3.8.0', 'to'=>'3.9.0'),
|
array('from'=>'3.8.0', 'to'=>'3.9.0'),
|
||||||
array('from'=>'3.9.0', 'to'=>'4.0.0'),
|
array('from'=>'3.9.0', 'to'=>'4.0.0'),
|
||||||
array('from'=>'4.0.0', 'to'=>'5.0.0')
|
array('from'=>'4.0.0', 'to'=>'5.0.0'),
|
||||||
|
array('from'=>'5.0.0', 'to'=>'6.0.0')
|
||||||
);
|
);
|
||||||
|
|
||||||
$count=0;
|
$count=0;
|
||||||
|
|||||||
@ -343,8 +343,8 @@ ul {
|
|||||||
|
|
||||||
|
|
||||||
.button {
|
.button {
|
||||||
background: #eee;
|
background: #fcfcfc;
|
||||||
/*border: 1px solid #C0C0C0;*/
|
border: 1px solid #d0d0d0;
|
||||||
padding: 0.3em 0.7em;
|
padding: 0.3em 0.7em;
|
||||||
margin: 0 0.5em;
|
margin: 0 0.5em;
|
||||||
-moz-border-radius:0 5px 0 5px;
|
-moz-border-radius:0 5px 0 5px;
|
||||||
|
|||||||
@ -191,7 +191,7 @@ if (constant('DOL_DATA_ROOT') === null) {
|
|||||||
}
|
}
|
||||||
if (@file_exists($lockfile))
|
if (@file_exists($lockfile))
|
||||||
{
|
{
|
||||||
print 'Install pages have been disabled for security reason (by lock file install.lock into dolibarr root directory).<br>';
|
print 'Install pages have been disabled for security reason (by lock file install.lock into dolibarr documents directory).<br>';
|
||||||
if (! empty($dolibarr_main_url_root))
|
if (! empty($dolibarr_main_url_root))
|
||||||
{
|
{
|
||||||
print 'Click on following link. ';
|
print 'Click on following link. ';
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user