Merge branch '11.0' of https://github.com/Dolibarr/dolibarr into 11.0_NEW_AddHook_SelectWarehouses

This commit is contained in:
atm-lena 2020-06-02 09:55:56 +02:00
commit ae9c490134
29 changed files with 1469 additions and 1376 deletions

View File

@ -2282,7 +2282,7 @@ class Adherent extends CommonObject
$sql.= " WHERE a.fk_adherent_type = t.rowid"; $sql.= " WHERE a.fk_adherent_type = t.rowid";
$sql.= " AND a.statut = 1"; $sql.= " AND a.statut = 1";
$sql.= " AND a.entity IN (".getEntity('adherent').")"; $sql.= " AND a.entity IN (".getEntity('adherent').")";
$sql.= " AND ((a.datefin IS NULL or a.datefin < '".$this->db->idate($now)."') AND t.subscription = 1)"; $sql.= " AND ((a.datefin IS NULL or a.datefin < '".$this->db->idate($now)."') AND t.subscription = '1')";
$resql=$this->db->query($sql); $resql=$this->db->query($sql);
if ($resql) if ($resql)

View File

@ -179,7 +179,7 @@ $sqlrequestforbankline = $sql;
if ($action == 'confirm_editbankreceipt' && !empty($oldbankreceipt) && !empty($newbankreceipt)) if ($action == 'confirm_editbankreceipt' && !empty($oldbankreceipt) && !empty($newbankreceipt))
{ {
// TODO Add a test to check newbankreceipt does not exists yet // TODO Add a test to check newbankreceipt does not exists yet
$sqlupdate = 'UPDATE '.MAIN_DB_PREFIX.'bank SET num_releve = "'.$db->escape($newbankreceipt).'" WHERE num_releve = "'.$db->escape($oldbankreceipt).'"'; $sqlupdate = 'UPDATE '.MAIN_DB_PREFIX.'bank SET num_releve = "'.$db->escape($newbankreceipt).'" WHERE num_releve = "'.$db->escape($oldbankreceipt).'" AND fk_account = '.$id;
$result = $db->query($sqlupdate); $result = $db->query($sqlupdate);
if ($result < 0) dol_print_error($db); if ($result < 0) dol_print_error($db);

View File

@ -1208,7 +1208,7 @@ if (empty($reshook))
} }
// Add link between credit note and origin // Add link between credit note and origin
if (!empty($object->fk_facture_source)) { if (!empty($object->fk_facture_source) && $id > 0) {
$facture_source->fetch($object->fk_facture_source); $facture_source->fetch($object->fk_facture_source);
$facture_source->fetchObjectLinked(); $facture_source->fetchObjectLinked();

View File

@ -31,6 +31,8 @@ require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
// Load translation files required by the page // Load translation files required by the page
$langs->loadLangs(array('banks', 'categories', 'widthdrawals')); $langs->loadLangs(array('banks', 'categories', 'widthdrawals'));
$contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'contractlist'; // To manage different context of search
// Security check // Security check
$socid = GETPOST('socid', 'int'); $socid = GETPOST('socid', 'int');
if ($user->socid) $socid=$user->socid; if ($user->socid) $socid=$user->socid;
@ -102,7 +104,9 @@ if ($result)
$num = $db->num_rows($result); $num = $db->num_rows($result);
$i = 0; $i = 0;
$urladd = "&amp;statut=".$statut; $param = '';
$param .= "&statut=".$statut;
if ($limit != $conf->liste_limit) $param .= '&limit=' . $limit;
$selectedfields = ''; $selectedfields = '';
@ -123,7 +127,7 @@ if ($result)
print '<input type="hidden" name="page" value="'.$page.'">'; print '<input type="hidden" name="page" value="'.$page.'">';
print '<input type="hidden" name="contextpage" value="'.$contextpage.'">'; print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
print_barre_liste($langs->trans("WithdrawalsReceipts"), $page, $_SERVER["PHP_SELF"], $urladd, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'generic', 0, $newcardbutton, '', $limit); print_barre_liste($langs->trans("WithdrawalsReceipts"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'generic', 0, $newcardbutton, '', $limit);
$moreforfilter = ''; $moreforfilter = '';

View File

@ -1030,14 +1030,18 @@ if (!$error && $massaction == "builddoc" && $permissiontoread && !GETPOST('butto
$input_files .= ' '.escapeshellarg($f); $input_files .= ' '.escapeshellarg($f);
} }
$cmd = 'pdftk '.escapeshellarg($input_files).' cat output '.escapeshellarg($file); $cmd = 'pdftk ' . $input_files . ' cat output '.escapeshellarg($file);
exec($cmd); exec($cmd);
if (!empty($conf->global->MAIN_UMASK)) // check if pdftk is installed
@chmod($file, octdec($conf->global->MAIN_UMASK)); if (file_exists($file)) {
if (!empty($conf->global->MAIN_UMASK))
$langs->load("exports"); @chmod($file, octdec($conf->global->MAIN_UMASK));
setEventMessages($langs->trans('FileSuccessfullyBuilt', $filename.'_'.dol_print_date($now, 'dayhourlog')), null, 'mesgs'); $langs->load("exports");
setEventMessages($langs->trans('FileSuccessfullyBuilt', $filename.'_'.dol_print_date($now, 'dayhourlog')), null, 'mesgs');
} else {
setEventMessages($langs->trans('ErrorPDFTkOutputFileNotFound'), null, 'errors');
}
} }
else else
{ {

View File

@ -212,8 +212,8 @@ abstract class CommonDocGenerator
'company_idprof6'=>$object->idprof6, 'company_idprof6'=>$object->idprof6,
'company_note_public'=>$object->note_public, 'company_note_public'=>$object->note_public,
'company_note_private'=>$object->note_private, 'company_note_private'=>$object->note_private,
'company_default_bank_iban'=>$object->bank_account->iban, 'company_default_bank_iban'=>(is_object($object->bank_account) ? $object->bank_account->iban : ''),
'company_default_bank_bic'=>$object->bank_account->bic 'company_default_bank_bic'=>(is_object($object->bank_account) ? $object->bank_account->bic : '')
); );
// Retrieve extrafields // Retrieve extrafields

View File

@ -1686,8 +1686,13 @@ class ExtraFields
} }
elseif ($type == 'select') elseif ($type == 'select')
{ {
if ($langfile && $param['options'][$value]) $value = $langs->trans($param['options'][$value]); $valstr = $param['options'][$value];
else $value = $param['options'][$value]; if (($pos = strpos($valstr, "|")) !== false)
{
$valstr = substr($valstr, 0, $pos);
}
if ($langfile && $valstr) $value = $langs->trans($valstr);
else $value = $valstr;
} }
elseif ($type == 'sellist') elseif ($type == 'sellist')
{ {

View File

@ -3711,7 +3711,8 @@ class Form
$sql = 'SELECT rowid, ref, situation_cycle_ref, situation_counter, situation_final, fk_soc'; $sql = 'SELECT rowid, ref, situation_cycle_ref, situation_counter, situation_final, fk_soc';
$sql .= ' FROM '.MAIN_DB_PREFIX.'facture'; $sql .= ' FROM '.MAIN_DB_PREFIX.'facture';
$sql .= ' WHERE entity IN ('.getEntity('invoice').')'; $sql .= ' WHERE entity IN ('.getEntity('invoice').')';
$sql .= ' AND situation_counter>=1'; $sql .= ' AND situation_counter >= 1';
$sql .= ' AND type <> 2';
$sql .= ' ORDER by situation_cycle_ref, situation_counter desc'; $sql .= ' ORDER by situation_cycle_ref, situation_counter desc';
$resql = $this->db->query($sql); $resql = $this->db->query($sql);
if ($resql && $this->db->num_rows($resql) > 0) { if ($resql && $this->db->num_rows($resql) > 0) {

View File

@ -1269,7 +1269,8 @@ class FormFile
} }
else else
{ {
print dol_trunc($file['name'], 200); $filenametoshow = preg_replace('/\.noexe$/', '', $file['name']);
print dol_trunc($filenametoshow, 200);
print '</a>'; print '</a>';
} }
// Preview link // Preview link

View File

@ -870,7 +870,7 @@ function dol_move($srcfile, $destfile, $newmask = 0, $overwriteifexists = 1, $te
{ {
$rel_filetorenamebefore = preg_replace('/^[\\/]/', '', $rel_filetorenamebefore); $rel_filetorenamebefore = preg_replace('/^[\\/]/', '', $rel_filetorenamebefore);
$rel_filetorenameafter = preg_replace('/^[\\/]/', '', $rel_filetorenameafter); $rel_filetorenameafter = preg_replace('/^[\\/]/', '', $rel_filetorenameafter);
//var_dump($rel_filetorenamebefore.' - '.$rel_filetorenameafter); //var_dump($rel_filetorenamebefore.' - '.$rel_filetorenameafter);exit;
dol_syslog("Try to rename also entries in database for full relative path before = ".$rel_filetorenamebefore." after = ".$rel_filetorenameafter, LOG_DEBUG); 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'; include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
@ -893,6 +893,7 @@ function dol_move($srcfile, $destfile, $newmask = 0, $overwriteifexists = 1, $te
$ecmfile->filepath = $rel_dir; $ecmfile->filepath = $rel_dir;
$ecmfile->filename = $filename; $ecmfile->filename = $filename;
$resultecm = $ecmfile->update($user); $resultecm = $ecmfile->update($user);
} }
elseif ($resultecm == 0) // If no entry were found for src files, create/update target file elseif ($resultecm == 0) // If no entry were found for src files, create/update target file
@ -995,7 +996,7 @@ function dolCheckVirus($src_file)
* @param integer $uploaderrorcode Value of PHP upload error code ($_FILES['field']['error']) * @param integer $uploaderrorcode Value of PHP upload error code ($_FILES['field']['error'])
* @param int $nohook Disable all hooks * @param int $nohook Disable all hooks
* @param string $varfiles _FILES var name * @param string $varfiles _FILES var name
* @return int|string >0 if OK, <0 or string if KO * @return int|string 1 if OK, 2 if OK and .noexe appended, <0 or string if KO
* @see dol_move() * @see dol_move()
*/ */
function dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disablevirusscan = 0, $uploaderrorcode = 0, $nohook = 0, $varfiles = 'addedfile') function dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disablevirusscan = 0, $uploaderrorcode = 0, $nohook = 0, $varfiles = 'addedfile')
@ -1005,6 +1006,7 @@ function dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disable
$reshook = 0; $reshook = 0;
$file_name = $dest_file; $file_name = $dest_file;
$successcode = 1;
if (empty($nohook)) if (empty($nohook))
{ {
@ -1055,6 +1057,7 @@ function dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disable
if (isAFileWithExecutableContent($dest_file) && empty($conf->global->MAIN_DOCUMENT_IS_OUTSIDE_WEBROOT_SO_NOEXE_NOT_REQUIRED)) if (isAFileWithExecutableContent($dest_file) && empty($conf->global->MAIN_DOCUMENT_IS_OUTSIDE_WEBROOT_SO_NOEXE_NOT_REQUIRED))
{ {
$file_name .= '.noexe'; $file_name .= '.noexe';
$successcode = 2;
} }
// Security: // Security:
@ -1109,7 +1112,7 @@ function dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disable
{ {
if (!empty($conf->global->MAIN_UMASK)) @chmod($file_name_osencoded, octdec($conf->global->MAIN_UMASK)); if (!empty($conf->global->MAIN_UMASK)) @chmod($file_name_osencoded, octdec($conf->global->MAIN_UMASK));
dol_syslog("Files.lib::dol_move_uploaded_file Success to move ".$src_file." to ".$file_name." - Umask=".$conf->global->MAIN_UMASK, LOG_DEBUG); dol_syslog("Files.lib::dol_move_uploaded_file Success to move ".$src_file." to ".$file_name." - Umask=".$conf->global->MAIN_UMASK, LOG_DEBUG);
return 1; // Success return $successcode; // Success
} }
else else
{ {
@ -1118,7 +1121,7 @@ function dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disable
} }
} }
return 1; // Success return $successcode; // Success
} }
/** /**
@ -1173,8 +1176,6 @@ function dol_delete_file($file, $disableglob = 0, $nophperrors = 0, $nohook = 0,
} }
else else
{ {
$error = 0;
//print "x".$file." ".$disableglob;exit; //print "x".$file." ".$disableglob;exit;
$file_osencoded = dol_osencode($file); // New filename encoded in OS filesystem encoding charset $file_osencoded = dol_osencode($file); // New filename encoded in OS filesystem encoding charset
if (empty($disableglob) && !empty($file_osencoded)) if (empty($disableglob) && !empty($file_osencoded))
@ -1197,10 +1198,11 @@ function dol_delete_file($file, $disableglob = 0, $nophperrors = 0, $nohook = 0,
$rel_filetodelete = preg_replace('/^'.preg_quote(DOL_DATA_ROOT, '/').'/', '', $filename); $rel_filetodelete = preg_replace('/^'.preg_quote(DOL_DATA_ROOT, '/').'/', '', $filename);
if (!preg_match('/(\/temp\/|\/thumbs\/|\.meta$)/', $rel_filetodelete)) // If not a tmp file if (!preg_match('/(\/temp\/|\/thumbs\/|\.meta$)/', $rel_filetodelete)) // If not a tmp file
{ {
$rel_filetodelete = preg_replace('/^[\\/]/', '', $rel_filetodelete);
if (is_object($db) && $indexdatabase) // $db may not be defined when lib is in a context with define('NOREQUIREDB',1) if (is_object($db) && $indexdatabase) // $db may not be defined when lib is in a context with define('NOREQUIREDB',1)
{ {
$rel_filetodelete = preg_replace('/^[\\/]/', '', $rel_filetodelete);
$rel_filetodelete = preg_replace('/\.noexe$/', '', $rel_filetodelete);
dol_syslog("Try to remove also entries in database for full relative path = ".$rel_filetodelete, LOG_DEBUG); 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'; include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
$ecmfile = new EcmFiles($db); $ecmfile = new EcmFiles($db);
@ -1564,6 +1566,7 @@ function dol_add_file_process($upload_dir, $allowoverwrite = 0, $donotupdatesess
$destfile = dol_string_nohtmltag($destfile); $destfile = dol_string_nohtmltag($destfile);
$destfull = dol_string_nohtmltag($destfull); $destfull = dol_string_nohtmltag($destfull);
// Move file from temp directory to final directory. A .noexe may also be appended on file name.
$resupload = dol_move_uploaded_file($TFile['tmp_name'][$i], $destfull, $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) // $resupload can be 'ErrorFileAlreadyExists' if (is_numeric($resupload) && $resupload > 0) // $resupload can be 'ErrorFileAlreadyExists'
@ -1600,10 +1603,10 @@ function dol_add_file_process($upload_dir, $allowoverwrite = 0, $donotupdatesess
// Update table of files // Update table of files
if ($donotupdatesession == 1) if ($donotupdatesession == 1)
{ {
$result = addFileIntoDatabaseIndex($upload_dir, basename($destfile), $TFile['name'][$i], 'uploaded', 0); $result = addFileIntoDatabaseIndex($upload_dir, basename($destfile).($resupload == 2 ? '.noexe' : ''), $TFile['name'][$i], 'uploaded', 0);
if ($result < 0) if ($result < 0)
{ {
setEventMessages('FailedToAddFileIntoDatabaseIndex', '', 'warnings'); setEventMessages('WarningFailedToAddFileIntoDatabaseIndex', '', 'warnings');
} }
} }
@ -1714,7 +1717,7 @@ function dol_remove_file_process($filenb, $donotupdatesession = 0, $donotdeletef
* See also commonGenerateDocument that also add/update database index when a file is generated. * See also commonGenerateDocument that also add/update database index when a file is generated.
* *
* @param string $dir Directory name (full real path without ending /) * @param string $dir Directory name (full real path without ending /)
* @param string $file File name * @param string $file File name (May end with '.noexe')
* @param string $fullpathorig Full path of origin for file (can be '') * @param string $fullpathorig Full path of origin for file (can be '')
* @param string $mode How file was created ('uploaded', 'generated', ...) * @param string $mode How file was created ('uploaded', 'generated', ...)
* @param int $setsharekey Set also the share key * @param int $setsharekey Set also the share key
@ -1730,7 +1733,7 @@ function addFileIntoDatabaseIndex($dir, $file, $fullpathorig = '', $mode = 'uplo
if (!preg_match('/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir)) // If not a tmp dir if (!preg_match('/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir)) // If not a tmp dir
{ {
$filename = basename($file); $filename = basename(preg_replace('/\.noexe$/', '', $file));
$rel_dir = preg_replace('/[\\/]$/', '', $rel_dir); $rel_dir = preg_replace('/[\\/]$/', '', $rel_dir);
$rel_dir = preg_replace('/^[\\/]/', '', $rel_dir); $rel_dir = preg_replace('/^[\\/]/', '', $rel_dir);

View File

@ -1275,7 +1275,7 @@ class pdf_crabe extends ModelePDFFactures
$pdf->MultiCell($col2x - $col1x, $tab2_hl, $totalvat, 0, 'L', 1); $pdf->MultiCell($col2x - $col1x, $tab2_hl, $totalvat, 0, 'L', 1);
$pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index);
$pdf->MultiCell($largcol2, $tab2_hl, price($tvaval, 0, $outputlangs), 0, 'R', 1); $pdf->MultiCell($largcol2, $tab2_hl, price(price2num($tvaval, 'MT'), 0, $outputlangs), 0, 'R', 1);
} }
} }

View File

@ -178,7 +178,7 @@ if (empty($action) || $action == 'editfile' || $action == 'file_manager' || preg
print '</td></tr>'; print '</td></tr>';
} }
else // Show filtree when ajax is disabled (rare) else // Show file tree when ajax is disabled (rare)
{ {
print '<tr><td style="padding-left: 20px">'; print '<tr><td style="padding-left: 20px">';
@ -212,7 +212,7 @@ if (empty($action) || $action == 'editfile' || $action == 'file_manager' || preg
<div class="pane-in ecm-in-layout-center"> <div class="pane-in ecm-in-layout-center">
<div id="ecmfileview" class="ecmfileview"> <div id="ecmfileview" class="ecmfileview">
<?php <?php
// Start right panel // Start right panel - List of content of a directory
$mode='noajax'; $mode='noajax';

View File

@ -83,7 +83,7 @@ print '<td class="linecoldiscount right">'.$langs->trans('ReductionShort').'</td
// Fields for situation invoice // Fields for situation invoice
if ($this->situation_cycle_ref) { if ($this->situation_cycle_ref) {
print '<td class="linecolcycleref right">' . $langs->trans('Progress') . '</td>'; print '<td class="linecolcycleref right">' . $langs->trans('Progress') . '</td>';
print '<td class="linecolcycleref2 right">' . $langs->trans('TotalHT100Short') . '</td>'; print '<td class="linecolcycleref2 right">' . $form->textwithpicto($langs->trans('TotalHT100Short'), $langs->trans('UnitPriceXQtyLessDiscount')) . '</td>';
} }
if ($usemargins && ! empty($conf->margin->enabled) && empty($user->socid)) if ($usemargins && ! empty($conf->margin->enabled) && empty($user->socid))

View File

@ -138,7 +138,7 @@ class EcmFiles extends CommonObject
$this->entity = trim($this->entity); $this->entity = trim($this->entity);
} }
if (isset($this->filename)) { if (isset($this->filename)) {
$this->filename = trim($this->filename); $this->filename = preg_replace('/\.noexe$/', '', trim($this->filename));
} }
if (isset($this->filepath)) { if (isset($this->filepath)) {
$this->filepath = trim($this->filepath); $this->filepath = trim($this->filepath);
@ -346,12 +346,13 @@ class EcmFiles extends CommonObject
$sql .= " t.src_object_id"; $sql .= " t.src_object_id";
$sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element . ' as t'; $sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element . ' as t';
$sql.= ' WHERE 1 = 1'; $sql.= ' WHERE 1 = 1';
/* Fetching this table depends on filepath+filename, it must not depends on entity /* Fetching this table depends on filepath+filename, it must not depends on entity because filesystem on disk does not know what is Dolibarr entities
if (! empty($conf->multicompany->enabled)) { if (! empty($conf->multicompany->enabled)) {
$sql .= " AND entity IN (" . getEntity('ecmfiles') . ")"; $sql .= " AND entity IN (" . getEntity('ecmfiles') . ")";
}*/ }*/
if ($relativepath) { if ($relativepath) {
$sql .= " AND t.filepath = '" . $this->db->escape(dirname($relativepath)) . "' AND t.filename = '".$this->db->escape(basename($relativepath))."'"; $relativepathwithnoexe = preg_replace('/\.noexe$/', '', $relativepath); // We must never have the .noexe into the database
$sql .= " AND t.filepath = '" . $this->db->escape(dirname($relativepath)) . "' AND t.filename = '".$this->db->escape(basename($relativepathwithnoexe))."'";
$sql .= " AND t.entity = ".$conf->entity; // unique key include the entity so each company has its own index $sql .= " AND t.entity = ".$conf->entity; // unique key include the entity so each company has its own index
} }
elseif (! empty($ref)) { // hash of file path elseif (! empty($ref)) { // hash of file path
@ -552,46 +553,47 @@ class EcmFiles extends CommonObject
// Clean parameters // Clean parameters
if (isset($this->ref)) { if (isset($this->ref)) {
$this->ref = trim($this->ref); $this->ref = trim($this->ref);
} }
if (isset($this->label)) { if (isset($this->label)) {
$this->label = trim($this->label); $this->label = trim($this->label);
} }
if (isset($this->share)) { if (isset($this->share)) {
$this->share = trim($this->share); $this->share = trim($this->share);
} }
if (isset($this->entity)) { if (isset($this->entity)) {
$this->entity = trim($this->entity); $this->entity = trim($this->entity);
} }
if (isset($this->filename)) { if (isset($this->filename)) {
$this->filename = trim($this->filename); $this->filename = preg_replace('/\.noexe$/', '', trim($this->filename));
} }
if (isset($this->filepath)) { if (isset($this->filepath)) {
$this->filepath = trim($this->filepath); $this->filepath = trim($this->filepath);
$this->filepath = preg_replace('/[\\/]+$/', '', $this->filepath); // Remove last /
} }
if (isset($this->fullpath_orig)) { if (isset($this->fullpath_orig)) {
$this->fullpath_orig = trim($this->fullpath_orig); $this->fullpath_orig = trim($this->fullpath_orig);
} }
if (isset($this->description)) { if (isset($this->description)) {
$this->description = trim($this->description); $this->description = trim($this->description);
} }
if (isset($this->keywords)) { if (isset($this->keywords)) {
$this->keywords = trim($this->keywords); $this->keywords = trim($this->keywords);
} }
if (isset($this->cover)) { if (isset($this->cover)) {
$this->cover = trim($this->cover); $this->cover = trim($this->cover);
} }
if (isset($this->gen_or_uploaded)) { if (isset($this->gen_or_uploaded)) {
$this->gen_or_uploaded = trim($this->gen_or_uploaded); $this->gen_or_uploaded = trim($this->gen_or_uploaded);
} }
if (isset($this->extraparams)) { if (isset($this->extraparams)) {
$this->extraparams = trim($this->extraparams); $this->extraparams = trim($this->extraparams);
} }
if (isset($this->fk_user_m)) { if (isset($this->fk_user_m)) {
$this->fk_user_m = trim($this->fk_user_m); $this->fk_user_m = trim($this->fk_user_m);
} }
if (isset($this->acl)) { if (isset($this->acl)) {
$this->acl = trim($this->acl); $this->acl = trim($this->acl);
} }
if (isset($this->src_object_type)) { if (isset($this->src_object_type)) {
$this->src_object_type = trim($this->src_object_type); $this->src_object_type = trim($this->src_object_type);

View File

@ -139,6 +139,12 @@ if ($action == 'update')
$oldfile = $olddir.$oldlabel; $oldfile = $olddir.$oldlabel;
$newfile = $newdir.$newlabel; $newfile = $newdir.$newlabel;
$newfileformove = $newfile;
// If old file end with .noexe, new file must also end with .noexe
if (preg_match('/\.noexe$/', $oldfile) && ! preg_match('/\.noexe$/', $newfileformove)) {
$newfileformove .= '.noexe';
}
//var_dump($oldfile);var_dump($newfile);exit;
// Now we update index of file // Now we update index of file
$db->begin(); $db->begin();
@ -146,7 +152,7 @@ if ($action == 'update')
//print $oldfile.' - '.$newfile; //print $oldfile.' - '.$newfile;
if ($newlabel != $oldlabel) if ($newlabel != $oldlabel)
{ {
$result = dol_move($oldfile, $newfile); // This include update of database $result = dol_move($oldfile, $newfileformove); // This include update of database
if (!$result) if (!$result)
{ {
$langs->load('errors'); $langs->load('errors');
@ -190,7 +196,7 @@ if ($action == 'update')
$object->entity = $conf->entity; $object->entity = $conf->entity;
$object->filepath = preg_replace('/[\\/]+$/', '', $newdirrelativetodocument); $object->filepath = preg_replace('/[\\/]+$/', '', $newdirrelativetodocument);
$object->filename = $newlabel; $object->filename = $newlabel;
$object->label = md5_file(dol_osencode($newfile)); // hash of file content $object->label = md5_file(dol_osencode($newfileformove)); // hash of file content
$object->fullpath_orig = ''; $object->fullpath_orig = '';
$object->gen_or_uploaded = 'unknown'; $object->gen_or_uploaded = 'unknown';
$object->description = ''; // indexed content $object->description = ''; // indexed content
@ -208,6 +214,11 @@ if ($action == 'update')
$db->commit(); $db->commit();
$urlfile = $newlabel; $urlfile = $newlabel;
// If old file end with .noexe, new file must also end with .noexe
if (preg_match('/\.noexe$/', $newfileformove)) {
$urlfile .= '.noexe';
}
header('Location: '.$_SERVER["PHP_SELF"].'?urlfile='.urlencode($urlfile).'&section='.urlencode($section)); header('Location: '.$_SERVER["PHP_SELF"].'?urlfile='.urlencode($urlfile).'&section='.urlencode($section));
exit; exit;
} }
@ -264,9 +275,13 @@ while ($tmpecmdir && $result > 0)
$i++; $i++;
} }
$urlfiletoshow = preg_replace('/\.noexe$/', '', $urlfile);
$s = img_picto('', 'object_dir').' <a href="'.DOL_URL_ROOT.'/ecm/index.php">'.$langs->trans("ECMRoot").'</a> -> '.$s.' -> '; $s = img_picto('', 'object_dir').' <a href="'.DOL_URL_ROOT.'/ecm/index.php">'.$langs->trans("ECMRoot").'</a> -> '.$s.' -> ';
if ($action == 'edit') $s .= '<input type="text" name="label" class="quatrevingtpercent" value="'.$urlfile.'">'; if ($action == 'edit') $s .= '<input type="text" name="label" class="quatrevingtpercent" value="'.$urlfiletoshow.'">';
else $s .= $urlfile; else $s .= $urlfiletoshow;
$morehtml = '';
$object->ref = ''; // Force to hide ref $object->ref = ''; // Force to hide ref
dol_banner_tab($object, '', $morehtml, 0, '', '', $s); dol_banner_tab($object, '', $morehtml, 0, '', '', $s);
@ -289,10 +304,9 @@ print dol_print_size($totalsize);
print '</td></tr>'; print '</td></tr>';
*/ */
// Hash of file content
print '<tr><td>'.$langs->trans("HashOfFileContent").'</td><td>'; print '<tr><td>'.$langs->trans("HashOfFileContent").'</td><td>';
$object = new EcmFiles($db); $object = new EcmFiles($db);
//$filenametosearch=basename($filepath);
//$filedirtosearch=basedir($filepath);
$object->fetch(0, '', $filepathtodocument); $object->fetch(0, '', $filepathtodocument);
if (!empty($object->label)) if (!empty($object->label))
{ {

View File

@ -124,15 +124,17 @@ if ($action == 'confirm_deletefile')
if (GETPOST('confirm') == 'yes') if (GETPOST('confirm') == 'yes')
{ {
// GETPOST('urlfile','alpha') is full relative URL from ecm root dir. Contains path of all sections. // GETPOST('urlfile','alpha') is full relative URL from ecm root dir. Contains path of all sections.
//var_dump(GETPOST('urlfile'));exit;
$upload_dir = $conf->ecm->dir_output.($relativepath?'/'.$relativepath:''); $upload_dir = $conf->ecm->dir_output.($relativepath?'/'.$relativepath:'');
$file = $upload_dir . "/" . GETPOST('urlfile', 'alpha'); $file = $upload_dir . "/" . GETPOST('urlfile', 'alpha');
//var_dump($file);exit;
$ret=dol_delete_file($file); // This include also the delete from file index in database. $ret=dol_delete_file($file); // This include also the delete from file index in database.
if ($ret) if ($ret)
{ {
setEventMessages($langs->trans("FileWasRemoved", GETPOST('urlfile', 'alpha')), null, 'mesgs'); $urlfiletoshow = GETPOST('urlfile', 'alpha');
$urlfiletoshow = preg_replace('/\.noexe$/', '', $urlfiletoshow);
setEventMessages($langs->trans("FileWasRemoved", $urlfiletoshow), null, 'mesgs');
$result=$ecmdir->changeNbOfFiles('-'); $result=$ecmdir->changeNbOfFiles('-');
} }
else else

View File

@ -2318,7 +2318,7 @@ class ExpenseReport extends CommonObject
public function load_state_board() public function load_state_board()
{ {
// phpcs:enable // phpcs:enable
global $conf; global $conf, $user;
$this->nb = array(); $this->nb = array();
@ -2326,6 +2326,12 @@ class ExpenseReport extends CommonObject
$sql .= " FROM ".MAIN_DB_PREFIX."expensereport as ex"; $sql .= " FROM ".MAIN_DB_PREFIX."expensereport as ex";
$sql .= " WHERE ex.fk_statut > 0"; $sql .= " WHERE ex.fk_statut > 0";
$sql .= " AND ex.entity IN (".getEntity('expensereport').")"; $sql .= " AND ex.entity IN (".getEntity('expensereport').")";
if (empty($user->rights->expensereport->readall))
{
$userchildids = $user->getAllChildIds(1);
$sql .= " AND (ex.fk_user_author IN (".join(',', $userchildids).")";
$sql .= " OR ex.fk_user_validator IN (".join(',', $userchildids)."))";
}
$resql = $this->db->query($sql); $resql = $this->db->query($sql);
if ($resql) { if ($resql) {
@ -2360,15 +2366,17 @@ class ExpenseReport extends CommonObject
$now = dol_now(); $now = dol_now();
$userchildids = $user->getAllChildIds(1);
$sql = "SELECT ex.rowid, ex.date_valid"; $sql = "SELECT ex.rowid, ex.date_valid";
$sql .= " FROM ".MAIN_DB_PREFIX."expensereport as ex"; $sql .= " FROM ".MAIN_DB_PREFIX."expensereport as ex";
if ($option == 'toapprove') $sql .= " WHERE ex.fk_statut = 2"; if ($option == 'toapprove') $sql .= " WHERE ex.fk_statut = 2";
else $sql .= " WHERE ex.fk_statut = 5"; else $sql .= " WHERE ex.fk_statut = 5";
$sql .= " AND ex.entity IN (".getEntity('expensereport').")"; $sql .= " AND ex.entity IN (".getEntity('expensereport').")";
$sql .= " AND (ex.fk_user_author IN (".join(',', $userchildids).")"; if (empty($user->rights->expensereport->readall))
$sql .= " OR ex.fk_user_validator IN (".join(',', $userchildids)."))"; {
$userchildids = $user->getAllChildIds(1);
$sql .= " AND (ex.fk_user_author IN (".join(',', $userchildids).")";
$sql .= " OR ex.fk_user_validator IN (".join(',', $userchildids)."))";
}
$resql = $this->db->query($sql); $resql = $this->db->query($sql);
if ($resql) if ($resql)

View File

@ -75,8 +75,6 @@ $pagenext = $page + 1;
if (!$sortorder) $sortorder = "DESC"; if (!$sortorder) $sortorder = "DESC";
if (!$sortfield) if (!$sortfield)
{ {
//if (empty($conf->global->FICHINTER_DISABLE_DETAILS)) $sortfield="fd.date";
//else
$sortfield = "f.ref"; $sortfield = "f.ref";
} }
@ -203,7 +201,7 @@ foreach ($arrayfields as $tmpkey => $tmpval)
$sql = "SELECT"; $sql = "SELECT";
$sql .= " f.ref, f.rowid, f.fk_statut, f.description, f.datec as date_creation, f.tms as date_update, f.note_private,"; $sql .= " f.ref, f.rowid, f.fk_statut, f.description, f.datec as date_creation, f.tms as date_update, f.note_private,";
if (empty($conf->global->FICHINTER_DISABLE_DETAILS) && $atleastonefieldinlines) $sql .= "fd.rowid as lineid, fd.description as descriptiondetail, fd.date as dp, fd.duree,"; if (empty($conf->global->FICHINTER_DISABLE_DETAILS) && $atleastonefieldinlines) $sql .= " fd.rowid as lineid, fd.description as descriptiondetail, fd.date as dp, fd.duree,";
$sql .= " s.nom as name, s.rowid as socid, s.client"; $sql .= " s.nom as name, s.rowid as socid, s.client";
if (!empty($conf->projet->enabled)) { if (!empty($conf->projet->enabled)) {
$sql .= ", pr.rowid as projet_id, pr.ref as projet_ref, pr.title as projet_title"; $sql .= ", pr.rowid as projet_id, pr.ref as projet_ref, pr.title as projet_title";
@ -245,7 +243,7 @@ if ($search_contrat_ref) {
$sql .= natural_search('c.ref', $search_contrat_ref); $sql .= natural_search('c.ref', $search_contrat_ref);
} }
if ($search_desc) { if ($search_desc) {
if (empty($conf->global->FICHINTER_DISABLE_DETAILS)) $sql .= natural_search(array('f.description', 'fd.description'), $search_desc); if (empty($conf->global->FICHINTER_DISABLE_DETAILS) && $atleastonefieldinlines) $sql .= natural_search(array('f.description', 'fd.description'), $search_desc);
else $sql .= natural_search(array('f.description'), $search_desc); else $sql .= natural_search(array('f.description'), $search_desc);
} }
if ($search_status != '' && $search_status >= 0) { if ($search_status != '' && $search_status >= 0) {

View File

@ -1881,7 +1881,6 @@ class CommandeFournisseur extends CommonOrder
if ($result < 0) if ($result < 0)
{ {
$error++; $error++;
return -1;
} }
// End call triggers // End call triggers
} }
@ -1989,6 +1988,7 @@ class CommandeFournisseur extends CommonOrder
{ {
$this->errors[] = 'ErrorWhenRunningTrigger'; $this->errors[] = 'ErrorWhenRunningTrigger';
dol_syslog(get_class($this)."::delete ".$this->error, LOG_ERR); dol_syslog(get_class($this)."::delete ".$this->error, LOG_ERR);
$this->db->rollback();
return -1; return -1;
} }
// End call triggers // End call triggers

View File

@ -2173,12 +2173,20 @@ class Holiday extends CommonObject
public function load_state_board() public function load_state_board()
{ {
// phpcs:enable // phpcs:enable
global $user;
$this->nb = array(); $this->nb = array();
$sql = "SELECT count(h.rowid) as nb"; $sql = "SELECT count(h.rowid) as nb";
$sql .= " FROM ".MAIN_DB_PREFIX."holiday as h"; $sql .= " FROM ".MAIN_DB_PREFIX."holiday as h";
$sql .= " WHERE h.statut > 1"; $sql .= " WHERE h.statut > 1";
$sql .= " AND h.entity IN (".getEntity('holiday').")"; $sql .= " AND h.entity IN (".getEntity('holiday').")";
if (empty($user->rights->expensereport->read_all))
{
$userchildids = $user->getAllChildIds(1);
$sql.= " AND (h.fk_user IN (".join(',', $userchildids).")";
$sql.= " OR h.fk_validator IN (".join(',', $userchildids)."))";
}
$resql = $this->db->query($sql); $resql = $this->db->query($sql);
if ($resql) { if ($resql) {
@ -2212,14 +2220,16 @@ class Holiday extends CommonObject
$now=dol_now(); $now=dol_now();
$userchildids = $user->getAllChildIds(1);
$sql = "SELECT h.rowid, h.date_debut"; $sql = "SELECT h.rowid, h.date_debut";
$sql.= " FROM ".MAIN_DB_PREFIX."holiday as h"; $sql.= " FROM ".MAIN_DB_PREFIX."holiday as h";
$sql.= " WHERE h.statut = 2"; $sql.= " WHERE h.statut = 2";
$sql.= " AND h.entity IN (".getEntity('holiday').")"; $sql.= " AND h.entity IN (".getEntity('holiday').")";
$sql.= " AND (h.fk_user IN (".join(',', $userchildids).")"; if(!$user->rights->expensereport->read_all)
$sql.= " OR h.fk_validator IN (".join(',', $userchildids)."))"; {
$userchildids = $user->getAllChildIds(1);
$sql.= " AND (h.fk_user IN (".join(',', $userchildids).")";
$sql.= " OR h.fk_validator IN (".join(',', $userchildids)."))";
}
$resql=$this->db->query($sql); $resql=$this->db->query($sql);
if ($resql) if ($resql)

View File

@ -322,7 +322,7 @@ if (empty($user->socid) && empty($conf->global->MAIN_DISABLE_GLOBAL_BOXSTATS))
include_once $includes[$key]; // Loading a class cost around 1Mb include_once $includes[$key]; // Loading a class cost around 1Mb
$board = new $classe($db); $board = new $classe($db);
$board->load_state_board($user); $board->load_state_board();
$boardloaded[$classe] = $board; $boardloaded[$classe] = $board;
} }
else else

View File

@ -491,8 +491,13 @@ UPDATE llx_accounting_bookkeeping set date_creation = tms where date_creation IS
-- UPDATE llx_facturedet_rec set label = NULL WHERE label IS NOT NULL; -- UPDATE llx_facturedet_rec set label = NULL WHERE label IS NOT NULL;
UPDATE llx_facturedet SET situation_percent = 100 WHERE situation_percent IS NULL AND fk_prev_id IS NULL; UPDATE llx_facturedet SET situation_percent = 100 WHERE situation_percent IS NULL AND fk_prev_id IS NULL;
-- Test inconsistency of data into situation invoices: If it differs, it may be the total_ht that is wrong and situation_percent that is good.
-- select f.rowid, f.type, qty, subprice, situation_percent, total_ht, total_ttc, total_tva, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc, (situation_percent / 100 * subprice * qty * (1 - (fd.remise_percent / 100)))
-- from llx_facturedet as fd, llx_facture as f where fd.fk_facture = f.rowid AND (total_ht - situation_percent / 100 * subprice * qty * (1 - (fd.remise_percent / 100))) > 0.01 and f.type = 5;
-- Note to make all deposit as payed when there is already a discount generated from it. -- Note to make all deposit as payed when there is already a discount generated from it.
--drop table tmp_invoice_deposit_mark_as_available; --drop table tmp_invoice_deposit_mark_as_available;
@ -501,6 +506,7 @@ UPDATE llx_facturedet SET situation_percent = 100 WHERE situation_percent IS NUL
-- Note to migrate from old counter aquarium to new one -- Note to migrate from old counter aquarium to new one
-- drop table tmp; -- drop table tmp;
-- create table tmp select rowid, code_client, concat(substr(code_client, 1, 6),'-0',substr(code_client, 8, 5)) as code_client2 from llx_societe where code_client like 'CU____-____'; -- create table tmp select rowid, code_client, concat(substr(code_client, 1, 6),'-0',substr(code_client, 8, 5)) as code_client2 from llx_societe where code_client like 'CU____-____';

View File

@ -574,3 +574,4 @@ AutoFillDateTo=Set end date for service line with next invoice date
AutoFillDateToShort=Set end date AutoFillDateToShort=Set end date
MaxNumberOfGenerationReached=Max number of gen. reached MaxNumberOfGenerationReached=Max number of gen. reached
BILL_DELETEInDolibarr=Invoice deleted BILL_DELETEInDolibarr=Invoice deleted
UnitPriceXQtyLessDiscount=Unit price x Qty - Discount

View File

@ -255,3 +255,4 @@ WarningNumberOfRecipientIsRestrictedInMassAction=Warning, number of different re
WarningDateOfLineMustBeInExpenseReportRange=Warning, the date of line is not in the range of the expense report WarningDateOfLineMustBeInExpenseReportRange=Warning, the date of line is not in the range of the expense report
WarningProjectClosed=Project is closed. You must re-open it first. WarningProjectClosed=Project is closed. You must re-open it first.
WarningSomeBankTransactionByChequeWereRemovedAfter=Some bank transaction were removed after that the receipt including them were generated. So nb of cheques and total of receipt may differ from number and total in list. WarningSomeBankTransactionByChequeWereRemovedAfter=Some bank transaction were removed after that the receipt including them were generated. So nb of cheques and total of receipt may differ from number and total in list.
WarningFailedToAddFileIntoDatabaseIndex=Warnin, failed to add file entry into ECM database index table

View File

@ -837,6 +837,7 @@ Sincerely=Sincerely
ConfirmDeleteObject=Are you sure you want to delete this object? ConfirmDeleteObject=Are you sure you want to delete this object?
DeleteLine=Delete line DeleteLine=Delete line
ConfirmDeleteLine=Are you sure you want to delete this line? ConfirmDeleteLine=Are you sure you want to delete this line?
ErrorPDFTkOutputFileNotFound=Error: the file was not generated. Please check that the 'pdftk' command is installed in a directory included in the $PATH environment variable (linux/unix only) or contact your system administrator.
NoPDFAvailableForDocGenAmongChecked=No PDF were available for the document generation among checked record NoPDFAvailableForDocGenAmongChecked=No PDF were available for the document generation among checked record
TooManyRecordForMassAction=Too many records selected for mass action. The action is restricted to a list of %s records. TooManyRecordForMassAction=Too many records selected for mass action. The action is restricted to a list of %s records.
NoRecordSelected=No record selected NoRecordSelected=No record selected

View File

@ -692,7 +692,7 @@ class Entrepot extends CommonObject
*/ */
public function getNomUrl($withpicto = 0, $option = '', $showfullpath = 0, $notooltip = 0) public function getNomUrl($withpicto = 0, $option = '', $showfullpath = 0, $notooltip = 0)
{ {
global $conf, $langs; global $conf, $langs, $hookmanager;
$langs->load("stocks"); $langs->load("stocks");
if (! empty($conf->dol_no_mouse_hover)) $notooltip=1; // Force disable tooltips if (! empty($conf->dol_no_mouse_hover)) $notooltip=1; // Force disable tooltips
@ -731,6 +731,16 @@ class Entrepot extends CommonObject
if ($withpicto != 2) $result.= ($showfullpath ? $this->get_full_arbo() : (empty($this->label)?$this->libelle:$this->label)); if ($withpicto != 2) $result.= ($showfullpath ? $this->get_full_arbo() : (empty($this->label)?$this->libelle:$this->label));
$result .= $linkend; $result .= $linkend;
global $action;
$hookmanager->initHooks(array('warehousedao'));
$parameters = array('id'=>$this->id, 'getnomurl'=>$result, 'withpicto' => $withpicto, 'option' => $option, 'showfullpath' => $showfullpath, 'notooltip'=> $notooltip);
$reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
if ($reshook > 0) {
$result = $hookmanager->resPrint;
} else {
$result .= $hookmanager->resPrint;
}
return $result; return $result;
} }

View File

@ -34,6 +34,9 @@ require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php';
// Load translation files required by the page // Load translation files required by the page
$langs->loadLangs(array('products', 'stocks', 'orders', 'productbatch')); $langs->loadLangs(array('products', 'stocks', 'orders', 'productbatch'));
//init Hook
$hookmanager->initHooks(array('massstockmove'));
// Security check // Security check
if ($user->socid) { if ($user->socid) {
$socid = $user->socid; $socid = $user->socid;

File diff suppressed because it is too large Load Diff

View File

@ -636,6 +636,12 @@ class Societe extends CommonObject
*/ */
public $multicurrency_code; public $multicurrency_code;
/**
* @var Account Default BAN account
*/
public $bank_account;
/** /**
* Constructor * Constructor
* *
@ -4155,6 +4161,17 @@ class Societe extends CommonObject
} }
} }
if (! isset($this->bank_account)) {
require_once DOL_DOCUMENT_ROOT.'/societe/class/companybankaccount.class.php';
$bac = new CompanyBankAccount($this->db);
$result = $bac->fetch(0, $this->id);
if ($result > 0) {
$this->bank_account = $bac;
} else {
$this->bank_account = '';
}
}
$modelpath = "core/modules/societe/doc/"; $modelpath = "core/modules/societe/doc/";
$result = $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams); $result = $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);