Merge remote-tracking branch 'upstream/develop' into reminder

This commit is contained in:
Frédéric FRANCE 2023-03-02 14:13:24 +01:00
commit e08ff855d2
403 changed files with 3208 additions and 1982 deletions

View File

@ -243,6 +243,8 @@ Following changes may create regressions for some external modules, but were nec
* Rename the substitution for "project label" instead of "project title" in substitution variables * Rename the substitution for "project label" instead of "project title" in substitution variables
* You must use "$objectoffield" to manipulate the current object inside the formulare of computed custom extrafields instead of $obj/$object. * You must use "$objectoffield" to manipulate the current object inside the formulare of computed custom extrafields instead of $obj/$object.
* Making a global search is sending the parameter using always the name search_all (instead of sometimes sall and search_all) * Making a global search is sending the parameter using always the name search_all (instead of sometimes sall and search_all)
* The property $url_last_version must be public if defined into module descriptor files;

View File

@ -46,6 +46,7 @@ require_once DOL_DOCUMENT_ROOT."/core/lib/files.lib.php";
$includecustom=0; $includecustom=0;
$includeconstants=array(); $includeconstants=array();
$buildzip=0;
if (empty($argv[1])) { if (empty($argv[1])) {
print "Usage: ".$script_file." release=autostable|auto[-mybuild]|x.y.z[-mybuild] [includecustom=1] [includeconstant=CC:MY_CONF_NAME:value] [buildzip=1]\n"; print "Usage: ".$script_file." release=autostable|auto[-mybuild]|x.y.z[-mybuild] [includecustom=1] [includeconstant=CC:MY_CONF_NAME:value] [buildzip=1]\n";
@ -69,6 +70,9 @@ while ($i < $argc) {
if (!empty($result["includeconstant"])) { if (!empty($result["includeconstant"])) {
$includeconstants[$i] = $result["includeconstant"]; $includeconstants[$i] = $result["includeconstant"];
} }
if (!empty($result["buildzip"])) {
$buildzip=1;
}
if (preg_match('/includeconstant=/', strval($argv[$i]))) { if (preg_match('/includeconstant=/', strval($argv[$i]))) {
$tmp=explode(':', $result['includeconstant'], 3); // $includeconstant has been set with previous parse_str() $tmp=explode(':', $result['includeconstant'], 3); // $includeconstant has been set with previous parse_str()
if (count($tmp) != 3) { if (count($tmp) != 3) {

View File

@ -729,6 +729,7 @@ if ($action == 'export_fileconfirm' && $user->hasRight('accounting', 'mouvements
// Export files then exit // Export files then exit
$accountancyexport = new AccountancyExport($db); $accountancyexport = new AccountancyExport($db);
$formatexport = GETPOST('formatexport', 'int');
$notexportlettering = GETPOST('notexportlettering', 'alpha'); $notexportlettering = GETPOST('notexportlettering', 'alpha');
if (!empty($notexportlettering)) { if (!empty($notexportlettering)) {
@ -745,7 +746,7 @@ if ($action == 'export_fileconfirm' && $user->hasRight('accounting', 'mouvements
$withAttachment = !empty(trim(GETPOST('notifiedexportfull', 'alphanohtml'))) ? 1 : 0; $withAttachment = !empty(trim(GETPOST('notifiedexportfull', 'alphanohtml'))) ? 1 : 0;
// Output data on screen or download // Output data on screen or download
$result = $accountancyexport->export($object->lines, $formatexportset, $withAttachment); $result = $accountancyexport->export($object->lines, $formatexport, $withAttachment);
$error = 0; $error = 0;
if ($result < 0) { if ($result < 0) {
@ -856,11 +857,13 @@ $formconfirm = '';
if ($action == 'export_file') { if ($action == 'export_file') {
$form_question = array(); $form_question = array();
$form_question['notexportlettering'] = array( $form_question['formatexport'] = array(
'name' => 'notexportlettering', 'name' => 'formatexport',
'type' => 'other', 'type' => 'select',
'label' => '', // TODO Use Selectmodelcsv and show a select combo 'label' => $langs->trans('Modelcsv'), // TODO Use Selectmodelcsv and show a select combo
'value' => $langs->trans('Modelcsv').' : <b>'.$listofformat[$formatexportset].'</b>' 'values' => $listofformat,
'default' => $formatexportset,
'morecss' => 'minwidth200 maxwidth200'
); );
$form_question['separator0'] = array('name'=>'separator0', 'type'=>'separator'); $form_question['separator0'] = array('name'=>'separator0', 'type'=>'separator');

View File

@ -3323,7 +3323,7 @@ class Adherent extends CommonObject
$return .= '<br><span class="info-box-label">'.$this->getmorphylib('', 2).'</span>'; $return .= '<br><span class="info-box-label">'.$this->getmorphylib('', 2).'</span>';
} }
if (method_exists($this, 'getLibStatut')) { if (method_exists($this, 'getLibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(5).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
} }
$return .= '</div>'; $return .= '</div>';
$return .= '</div>'; $return .= '</div>';

View File

@ -1016,7 +1016,7 @@ class AdherentType extends CommonObject
} }
} }
if (method_exists($this, 'getLibStatut')) { if (method_exists($this, 'getLibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(5).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
} }
$return .= '</div>'; $return .= '</div>';
$return .= '</div>'; $return .= '</div>';

View File

@ -194,6 +194,10 @@ if (!empty($triggers)) {
if ($trigger['code'] == 'FICHINTER_CLASSIFY_UNBILLED' && empty($conf->global->FICHINTER_CLASSIFY_BILLED)) { if ($trigger['code'] == 'FICHINTER_CLASSIFY_UNBILLED' && empty($conf->global->FICHINTER_CLASSIFY_BILLED)) {
continue; continue;
} }
if ($trigger['code'] == 'ACTION_CREATE') {
// This is the trigger to add an event, enabling it will create infinite loop
continue;
}
if ($search_event === '' || preg_match('/'.preg_quote($search_event, '/').'/i', $trigger['code'])) { if ($search_event === '' || preg_match('/'.preg_quote($search_event, '/').'/i', $trigger['code'])) {
print '<!-- '.$trigger['position'].' -->'; print '<!-- '.$trigger['position'].' -->';

View File

@ -205,6 +205,7 @@ if ($action == 'install') {
dol_syslog("Uncompress of module file is a success."); dol_syslog("Uncompress of module file is a success.");
// We check if this is a metapackage
$modulenamearrays = array(); $modulenamearrays = array();
if (dol_is_file($modulenamedir.'/metapackage.conf')) { if (dol_is_file($modulenamedir.'/metapackage.conf')) {
// This is a meta package // This is a meta package
@ -214,6 +215,7 @@ if ($action == 'install') {
$modulenamearrays[$modulename] = $modulename; $modulenamearrays[$modulename] = $modulename;
//var_dump($modulenamearrays);exit; //var_dump($modulenamearrays);exit;
// Lop on each packacge of the metapackage
foreach ($modulenamearrays as $modulenameval) { foreach ($modulenamearrays as $modulenameval) {
if (strpos($modulenameval, '#') === 0) { if (strpos($modulenameval, '#') === 0) {
continue; // Discard comments continue; // Discard comments
@ -227,13 +229,14 @@ if ($action == 'install') {
// Now we install the module // Now we install the module
if (!$error) { if (!$error) {
@dol_delete_dir_recursive($dirins.'/'.$modulenameval); // delete the zip file @dol_delete_dir_recursive($dirins.'/'.$modulenameval); // delete the target directory
dol_syslog("We copy now directory ".$conf->admin->dir_temp.'/'.$tmpdir.'/htdocs/'.$modulenameval." into target dir ".$dirins.'/'.$modulenameval); $submodulenamedir = $conf->admin->dir_temp.'/'.$tmpdir.'/htdocs/'.$modulenameval;
$result = dolCopyDir($modulenamedir, $dirins.'/'.$modulenameval, '0444', 1); dol_syslog("We copy now directory ".$submodulenamedir." into target dir ".$dirins.'/'.$modulenameval);
$result = dolCopyDir($submodulenamedir, $dirins.'/'.$modulenameval, '0444', 1);
if ($result <= 0) { if ($result <= 0) {
dol_syslog('Failed to call dolCopyDir result='.$result." with param ".$modulenamedir." and ".$dirins.'/'.$modulenameval, LOG_WARNING); dol_syslog('Failed to call dolCopyDir result='.$result." with param ".$submodulenamedir." and ".$dirins.'/'.$modulenameval, LOG_WARNING);
$langs->load("errors"); $langs->load("errors");
setEventMessages($langs->trans("ErrorFailToCopyDir", $modulenamedir, $dirins.'/'.$modulenameval), null, 'errors'); setEventMessages($langs->trans("ErrorFailToCopyDir", $submodulenamedir, $dirins.'/'.$modulenameval), null, 'errors');
$error++; $error++;
} }
} }

View File

@ -427,11 +427,13 @@ foreach ($listofnotifiedevents as $notifiedevent) {
} elseif ($notifiedevent['elementtype'] == 'expensereport' || $notifiedevent['elementtype'] == 'expense_report') { } elseif ($notifiedevent['elementtype'] == 'expensereport' || $notifiedevent['elementtype'] == 'expense_report') {
$elementPicto = 'expensereport'; $elementPicto = 'expensereport';
$elementLabel = $langs->trans('ExpenseReport'); $elementLabel = $langs->trans('ExpenseReport');
} elseif ($notifiedevent['elementtype'] == 'agenda') {
$elementPicto = 'action';
} }
$labelfortrigger = 'AmountHT'; $labelfortrigger = 'AmountHT';
$codehasnotrigger = 0; $codehasnotrigger = 0;
if (preg_match('/^HOLIDAY/', $notifiedevent['code'])) { if (preg_match('/^(ACTION|HOLIDAY)/', $notifiedevent['code'])) {
$codehasnotrigger++; $codehasnotrigger++;
} }

View File

@ -271,9 +271,19 @@ print '<input type="hidden" name="action" value="update">';
clearstatcache(); clearstatcache();
if (getDolGlobalString('PDF_SECURITY_ENCRYPTION')) {
print '<div class="warning">';
print 'The not supported and hidden option PDF_SECURITY_ENCRYPTION has been enabled. This means a lof of feature related to PDF will be broken, like mass PDF generation or online signature of PDF.'."\n";
print 'You should disable this option.';
print '</div>';
}
// Misc options // Misc options
print load_fiche_titre($langs->trans("DictionaryPaperFormat"), '', ''); print load_fiche_titre($langs->trans("DictionaryPaperFormat"), '', '');
print '<div class="div-table-responsive-no-min">'; print '<div class="div-table-responsive-no-min">';
print '<table summary="more" class="noborder centpercent">'; print '<table summary="more" class="noborder centpercent">';
print '<tr class="liste_titre"><td class="titlefieldmiddle">'.$langs->trans("Parameters").'</td><td width="200px">'.$langs->trans("Value").'</td></tr>'; print '<tr class="liste_titre"><td class="titlefieldmiddle">'.$langs->trans("Parameters").'</td><td width="200px">'.$langs->trans("Value").'</td></tr>';

View File

@ -580,15 +580,23 @@ print '<br>';
print '<strong>MAIN_DOCUMENT_IS_OUTSIDE_WEBROOT_SO_NOEXE_NOT_REQUIRED</strong> = '.getDolGlobalString('MAIN_DOCUMENT_IS_OUTSIDE_WEBROOT_SO_NOEXE_NOT_REQUIRED', '<span class="opacitymedium">'.$langs->trans("Undefined").' &nbsp; ('.$langs->trans("Recommended").': '.$langs->trans("Undefined").' '.$langs->trans("or").' 0)</span>')."<br>"; print '<strong>MAIN_DOCUMENT_IS_OUTSIDE_WEBROOT_SO_NOEXE_NOT_REQUIRED</strong> = '.getDolGlobalString('MAIN_DOCUMENT_IS_OUTSIDE_WEBROOT_SO_NOEXE_NOT_REQUIRED', '<span class="opacitymedium">'.$langs->trans("Undefined").' &nbsp; ('.$langs->trans("Recommended").': '.$langs->trans("Undefined").' '.$langs->trans("or").' 0)</span>')."<br>";
print '<br>'; print '<br>';
print '<strong>MAIN_SECURITY_FORCECSP</strong> = '.getDolGlobalString('MAIN_SECURITY_FORCECSP', '<span class="opacitymedium">'.$langs->trans("Undefined").'</span>').' &nbsp; <span class="opacitymedium">('.$langs->trans("Example").": \"frame-ancestors 'self'; default-src *; img-src * data:; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';\")</span><br>"; $examplecsprule = "frame-ancestors 'self'; img-src * data:; font-src *; default-src 'self' 'unsafe-inline' 'unsafe-eval' *.paypal.com *.stripe.com *.google.com *.googleapis.com *.google-analytics.com *.googletagmanager.com;";
print '<strong>MAIN_SECURITY_FORCECSPRO</strong> = '.getDolGlobalString('MAIN_SECURITY_FORCECSP', '<span class="opacitymedium">'.$langs->trans("Undefined").'</span>').' &nbsp; <span class="opacitymedium">('.$langs->trans("Example").': "'.$examplecsprule.'")</span><br>';
print '<br>';
$examplecsprule = "frame-ancestors 'self'; img-src * data:; font-src *; default-src 'self' 'unsafe-inline' 'unsafe-eval' *.paypal.com *.stripe.com *.google.com *.googleapis.com *.google-analytics.com *.googletagmanager.com;";
print '<strong>MAIN_SECURITY_FORCECSP</strong> = '.getDolGlobalString('MAIN_SECURITY_FORCERP', '<span class="opacitymedium">'.$langs->trans("Undefined").'</span>').' &nbsp; <span class="opacitymedium">('.$langs->trans("Example").': "'.$examplecsprule.'")</span><br>';
print '<br>'; print '<br>';
print '<strong>MAIN_SECURITY_FORCERP</strong> = '.getDolGlobalString('MAIN_SECURITY_FORCERP', '<span class="opacitymedium">'.$langs->trans("Undefined").'</span>').' &nbsp; <span class="opacitymedium">('.$langs->trans("Recommended").': '.$langs->trans("Undefined").' '.$langs->trans("or")." \"same-origin\" so browser doesn't send any referrer when going into another web site domain)</span><br>"; print '<strong>MAIN_SECURITY_FORCERP</strong> = '.getDolGlobalString('MAIN_SECURITY_FORCERP', '<span class="opacitymedium">'.$langs->trans("Undefined").'</span>').' &nbsp; <span class="opacitymedium">('.$langs->trans("Recommended").': '.$langs->trans("Undefined").' '.$langs->trans("or")." \"same-origin\" so browser doesn't send any referrer when going into another web site domain)</span><br>";
print '<br>'; print '<br>';
print '<strong>WEBSITE_MAIN_SECURITY_FORCECSP</strong> = '.getDolGlobalString('WEBSITE_MAIN_SECURITY_FORCECSP', '<span class="opacitymedium">'.$langs->trans("Undefined").'</span>'); print '<strong>WEBSITE_MAIN_SECURITY_FORCECSPRO</strong> = '.getDolGlobalString('WEBSITE_MAIN_SECURITY_FORCECSPRO', '<span class="opacitymedium">'.$langs->trans("Undefined").'</span>');
print ' &nbsp; <span class="opacitymedium">('.$langs->trans("Example").": \"frame-ancestors 'self'; default-src 'self' 'unsafe-inline'; style-src https://cdnjs.cloudflare.com https://fonts.googleapis.com 'unsafe-inline'; script-src https://cdn.transifex.com https://www.googletagmanager.com 'unsafe-inline'; object-src https://youtube.com; frame-src https://youtube.com; img-src * data:;\")</span><br>"; print ' &nbsp; <span class="opacitymedium">('.$langs->trans("Example").": \"frame-ancestors 'self'; default-src 'self' 'unsafe-inline'; style-src https://cdnjs.cloudflare.com *.googleapis.com; script-src *.transifex.com *.google-analytics.com *.googletagmanager.com; object-src https://youtube.com; frame-src https://youtube.com; img-src * data:;\")</span><br>";
print '<br>';
print '<strong>WEBSITE_MAIN_SECURITY_FORCECSP</strong> = '.getDolGlobalString('WEBSITE_MAIN_SECURITY_FORCECSP', '<span class="opacitymedium">'.$langs->trans("Undefined").'</span>');
print ' &nbsp; <span class="opacitymedium">('.$langs->trans("Example").": \"frame-ancestors 'self'; default-src 'self' 'unsafe-inline'; style-src https://cdnjs.cloudflare.com *.googleapis.com; script-src *.transifex.com *.google-analytics.com *.googletagmanager.com; object-src https://youtube.com; frame-src https://youtube.com; img-src * data:;\")</span><br>";
print '<br>'; print '<br>';
print '<strong>WEBSITE_MAIN_SECURITY_FORCERP</strong> = '.getDolGlobalString('WEBSITE_MAIN_SECURITY_FORCERP', '<span class="opacitymedium">'.$langs->trans("Undefined").'</span>').' &nbsp; <span class="opacitymedium">('.$langs->trans("Recommended").': '.$langs->trans("Undefined").' '.$langs->trans("or")." \"strict-origin-when-cross-origin\")</span><br>"; print '<strong>WEBSITE_MAIN_SECURITY_FORCERP</strong> = '.getDolGlobalString('WEBSITE_MAIN_SECURITY_FORCERP', '<span class="opacitymedium">'.$langs->trans("Undefined").'</span>').' &nbsp; <span class="opacitymedium">('.$langs->trans("Recommended").': '.$langs->trans("Undefined").' '.$langs->trans("or")." \"strict-origin-when-cross-origin\")</span><br>";

View File

@ -751,7 +751,7 @@ class Documents extends DolibarrApi
throw new RestException(500, "Failed to open file '".$destfiletmp."' for write"); throw new RestException(500, "Failed to open file '".$destfiletmp."' for write");
} }
$result = dol_move($destfiletmp, $destfile, 0, $overwriteifexists, 1); $result = dol_move($destfiletmp, $destfile, 0, $overwriteifexists, 1, 1);
if (!$result) { if (!$result) {
throw new RestException(500, "Failed to move file into '".$destfile."'"); throw new RestException(500, "Failed to move file into '".$destfile."'");
} }

View File

@ -1589,7 +1589,7 @@ class BOM extends CommonObject
$return .= '<br><span class="info-box-label">'.$prod->getNomUrl(1).'</span>'; $return .= '<br><span class="info-box-label">'.$prod->getNomUrl(1).'</span>';
} }
if (method_exists($this, 'getLibStatut')) { if (method_exists($this, 'getLibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(5).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
} }
$return .= '</div>'; $return .= '</div>';

View File

@ -2290,7 +2290,7 @@ class ActionComm extends CommonObject
} }
if ($result >= 0) { if ($result >= 0) {
if (dol_move($outputfiletmp, $outputfile, 0, 1)) { if (dol_move($outputfiletmp, $outputfile, 0, 1, 0, 0)) {
$result = 1; $result = 1;
} else { } else {
$this->error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile; $this->error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile;

View File

@ -1010,7 +1010,8 @@ while ($i < $imaxinloop) {
// User owner // User owner
if (!empty($arrayfields['owner']['checked'])) { if (!empty($arrayfields['owner']['checked'])) {
print '<td class="tdoverflowmax150"' . ($event_owner_style != '' ? ' style="'.$event_owner_style.'"' : '') . '>'; // With edge and chrome the td overflow is not supported correctly when content is not full text. //print '<td class="tdoverflowmax150"' . ($event_owner_style != '' ? ' style="'.$event_owner_style.'"' : '') . '>';
print '<td class="tdoverflowmax150">';
if ($obj->fk_user_action > 0 && !isset($cache_user_list[$obj->fk_user_action])) { if ($obj->fk_user_action > 0 && !isset($cache_user_list[$obj->fk_user_action])) {
$userstatic = new User($db); $userstatic = new User($db);
$res = $userstatic->fetch($obj->fk_user_action); $res = $userstatic->fetch($obj->fk_user_action);

View File

@ -3976,7 +3976,7 @@ class Propal extends CommonObject
$return .='<br><span class="" >'.$langs->trans("AmountHT").' : </span><span class="info-box-label amount">'.price($this->total_ht).'</span>'; $return .='<br><span class="" >'.$langs->trans("AmountHT").' : </span><span class="info-box-label amount">'.price($this->total_ht).'</span>';
} }
if (method_exists($this, 'getLibStatut')) { if (method_exists($this, 'getLibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(5).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
} }
$return .= '</div>'; $return .= '</div>';
$return .= '</div>'; $return .= '</div>';

View File

@ -1844,10 +1844,10 @@ class Account extends CommonObject
} }
if (method_exists($this, 'solde')) { if (method_exists($this, 'solde')) {
$return .= '<br><a href="'.DOL_URL_ROOT.'/compta/bank/bankentries_list.php?id='.$this->id.'">'; $return .= '<br><a href="'.DOL_URL_ROOT.'/compta/bank/bankentries_list.php?id='.$this->id.'">';
$return .= '<span class="opacitymedium">'.$langs->trans("Balance").'</span> : <span class="amount">'.price($this->solde(1), 0, $langs, 1, -1, -1, $this->currency_code).'</span>'; $return .= '<span class="opacitymedium">'.$langs->trans("Balance").'</span> : <span class="amount">'.price(price2num($this->solde(1), 'MT'), 0, $langs, 1, -1, -1, $this->currency_code).'</span>';
} }
if (method_exists($this, 'getLibStatut')) { if (method_exists($this, 'getLibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(5).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
} }
$return .= '</div>'; $return .= '</div>';
$return .= '</div>'; $return .= '</div>';

View File

@ -787,7 +787,7 @@ foreach ($accounts as $key => $type) {
if (!empty($arrayfields['balance']['checked'])) { if (!empty($arrayfields['balance']['checked'])) {
print '<td class="nowraponall right">'; print '<td class="nowraponall right">';
print '<a href="'.DOL_URL_ROOT.'/compta/bank/bankentries_list.php?id='.$objecttmp->id.'">'; print '<a href="'.DOL_URL_ROOT.'/compta/bank/bankentries_list.php?id='.$objecttmp->id.'">';
print '<span class="amount">'.price($solde, 0, $langs, 1, -1, -1, $objecttmp->currency_code).'</span>'; print '<span class="amount">'.price(price2num($solde, 'MT'), 0, $langs, 1, -1, -1, $objecttmp->currency_code).'</span>';
print '</a>'; print '</a>';
print '</td>'; print '</td>';
if (!$i) { if (!$i) {

View File

@ -495,7 +495,7 @@ class CashControl extends CommonObject
$return .= '<br><span class="info-box-label opacitymedium" >'.$langs->trans("Year").'</span> : <span>'.$this->year_close.'</span>'; $return .= '<br><span class="info-box-label opacitymedium" >'.$langs->trans("Year").'</span> : <span>'.$this->year_close.'</span>';
} }
if (method_exists($this, 'getLibStatut')) { if (method_exists($this, 'getLibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(5).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
} }
$return .= '</div>'; $return .= '</div>';
$return .= '</div>'; $return .= '</div>';

View File

@ -2129,6 +2129,7 @@ if (empty($reshook)) {
$date_start = dol_mktime(GETPOST('date_start'.$predef.'hour'), GETPOST('date_start'.$predef.'min'), GETPOST('date_start'.$predef.'sec'), GETPOST('date_start'.$predef.'month'), GETPOST('date_start'.$predef.'day'), GETPOST('date_start'.$predef.'year')); $date_start = dol_mktime(GETPOST('date_start'.$predef.'hour'), GETPOST('date_start'.$predef.'min'), GETPOST('date_start'.$predef.'sec'), GETPOST('date_start'.$predef.'month'), GETPOST('date_start'.$predef.'day'), GETPOST('date_start'.$predef.'year'));
$date_end = dol_mktime(GETPOST('date_end'.$predef.'hour'), GETPOST('date_end'.$predef.'min'), GETPOST('date_end'.$predef.'sec'), GETPOST('date_end'.$predef.'month'), GETPOST('date_end'.$predef.'day'), GETPOST('date_end'.$predef.'year')); $date_end = dol_mktime(GETPOST('date_end'.$predef.'hour'), GETPOST('date_end'.$predef.'min'), GETPOST('date_end'.$predef.'sec'), GETPOST('date_end'.$predef.'month'), GETPOST('date_end'.$predef.'day'), GETPOST('date_end'.$predef.'year'));
$price_base_type = (GETPOST('price_base_type', 'alpha') ? GETPOST('price_base_type', 'alpha') : 'HT'); $price_base_type = (GETPOST('price_base_type', 'alpha') ? GETPOST('price_base_type', 'alpha') : 'HT');
$tva_npr = "";
// Define special_code for special lines // Define special_code for special lines
$special_code = 0; $special_code = 0;
@ -2157,8 +2158,7 @@ if (empty($reshook)) {
//$tva_tx = $datapriceofproduct['tva_tx']; //$tva_tx = $datapriceofproduct['tva_tx'];
//$tva_npr = $datapriceofproduct['tva_npr']; //$tva_npr = $datapriceofproduct['tva_npr'];
$tmpvat = (float) price2num(preg_replace('/\s*\(.*\)/', '', $tva_tx));
$tmpvat = price2num(preg_replace('/\s*\(.*\)/', '', $tva_tx));
$tmpprodvat = price2num(preg_replace('/\s*\(.*\)/', '', $prod->tva_tx)); $tmpprodvat = price2num(preg_replace('/\s*\(.*\)/', '', $prod->tva_tx));
// Set unit price to use // Set unit price to use

View File

@ -5819,7 +5819,7 @@ class Facture extends CommonInvoice
$return .= '<br><span class="info-box-label">'.$this->fk_user_author.'</span>'; $return .= '<br><span class="info-box-label">'.$this->fk_user_author.'</span>';
} }
if (method_exists($this, 'getLibStatut')) { if (method_exists($this, 'getLibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(5).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
} }
$return .= '</div>'; $return .= '</div>';
$return .= '</div>'; $return .= '</div>';

View File

@ -1,4 +1,6 @@
<?php <?php
use Stripe\BankAccount;
/* Copyright (C) 2002-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org> /* Copyright (C) 2002-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004 Eric Seigne <eric.seigne@ryxeo.com> * Copyright (C) 2004 Eric Seigne <eric.seigne@ryxeo.com>
* Copyright (C) 2004-2016 Laurent Destailleur <eldy@users.sourceforge.net> * Copyright (C) 2004-2016 Laurent Destailleur <eldy@users.sourceforge.net>
@ -138,7 +140,7 @@ if (empty($reshook)) {
} }
} }
// Payment with Direct Debit Stripe // Make payment with Direct Debit Stripe
if ($action == 'sepastripepayment' && $usercancreate) { if ($action == 'sepastripepayment' && $usercancreate) {
$result = $object->makeStripeSepaRequest($user, GETPOST('did', 'int'), 'direct-debit', 'facture'); $result = $object->makeStripeSepaRequest($user, GETPOST('did', 'int'), 'direct-debit', 'facture');
if ($result < 0) { if ($result < 0) {
@ -153,7 +155,7 @@ if (empty($reshook)) {
} }
} }
// payments conditions // Set payments conditions
if ($action == 'setconditions' && $usercancreate) { if ($action == 'setconditions' && $usercancreate) {
$object->fetch($id); $object->fetch($id);
$object->cond_reglement_code = 0; // To clean property $object->cond_reglement_code = 0; // To clean property
@ -404,7 +406,7 @@ if ($object->id > 0) {
print '<span class="badgeneutral">'; print '<span class="badgeneutral">';
print $object->getLibType(); print $object->getLibType();
print '</span>'; print '</span>';
if ($object->module_source) { if (!empty($object->module_source)) {
print ' <span class="opacitymediumbycolor paddingleft">('.$langs->trans("POS").' '.$object->module_source.' - '.$langs->trans("Terminal").' '.$object->pos_source.')</span>'; print ' <span class="opacitymediumbycolor paddingleft">('.$langs->trans("POS").' '.$object->module_source.' - '.$langs->trans("Terminal").' '.$object->pos_source.')</span>';
} }
if ($object->type == $object::TYPE_REPLACEMENT) { if ($object->type == $object::TYPE_REPLACEMENT) {
@ -915,7 +917,7 @@ if ($object->id > 0) {
// Past requests // Past requests
$sql = "SELECT pfd.rowid, pfd.traite, pfd.date_demande, pfd.date_traite, pfd.fk_prelevement_bons, pfd.amount,"; $sql = "SELECT pfd.rowid, pfd.traite, pfd.date_demande, pfd.date_traite, pfd.fk_prelevement_bons, pfd.amount,";
$sql .= " pb.ref, pb.date_trans, pb.method_trans, pb.credite, pb.date_credit, pb.datec, pb.statut as status,"; $sql .= " pb.ref, pb.date_trans, pb.method_trans, pb.credite, pb.date_credit, pb.datec, pb.statut as status, pb.fk_bank_account,";
$sql .= " u.rowid as user_id, u.email, u.lastname, u.firstname, u.login, u.statut as user_status"; $sql .= " u.rowid as user_id, u.email, u.lastname, u.firstname, u.login, u.statut as user_status";
$sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd"; $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on pfd.fk_user_demande = u.rowid"; $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on pfd.fk_user_demande = u.rowid";
@ -929,16 +931,16 @@ if ($object->id > 0) {
$sql .= " AND pfd.type = 'ban'"; $sql .= " AND pfd.type = 'ban'";
$sql .= " ORDER BY pfd.date_demande DESC"; $sql .= " ORDER BY pfd.date_demande DESC";
$result = $db->query($sql); $resql = $db->query($sql);
if ($result) { if ($resql) {
$num = $db->num_rows($result); $num = $db->num_rows($resql);
$numclosed = $num; $numclosed = $num;
$i = 0; $i = 0;
$tmpuser = new User($db); $tmpuser = new User($db);
while ($i < $num) { while ($i < $num) {
$obj = $db->fetch_object($result); $obj = $db->fetch_object($resql);
$tmpuser->id = $obj->user_id; $tmpuser->id = $obj->user_id;
$tmpuser->login = $obj->login; $tmpuser->login = $obj->login;
@ -975,9 +977,26 @@ if ($object->id > 0) {
$withdrawreceipt->date_creation = $db->jdate($obj->datec); $withdrawreceipt->date_creation = $db->jdate($obj->datec);
$withdrawreceipt->statut = $obj->status; $withdrawreceipt->statut = $obj->status;
$withdrawreceipt->status = $obj->status; $withdrawreceipt->status = $obj->status;
$withdrawreceipt->fk_bank_account = $obj->fk_bank_account;
//$withdrawreceipt->credite = $db->jdate($obj->credite); //$withdrawreceipt->credite = $db->jdate($obj->credite);
print $withdrawreceipt->getNomUrl(1); print $withdrawreceipt->getNomUrl(1);
print ' ';
print $withdrawreceipt->getLibStatut(2);
// Show the bank account
$fk_bank_account = $withdrawreceipt->fk_bank_account;
if (empty($fk_bank_account)) {
$fk_bank_account = ($object->type == 'bank-transfer' ? $conf->global->PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT : $conf->global->PRELEVEMENT_ID_BANKACCOUNT);
}
if ($fk_bank_account > 0) {
$bankaccount = new Account($db);
$result = $bankaccount->fetch($fk_bank_account);
if ($result > 0) {
print ' - ';
print $bankaccount->getNomUrl(1);
}
}
} }
print "</td>\n"; print "</td>\n";
@ -995,7 +1014,7 @@ if ($object->id > 0) {
print '<tr class="oddeven"><td colspan="7"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>'; print '<tr class="oddeven"><td colspan="7"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
} }
$db->free($result); $db->free($resql);
} else { } else {
dol_print_error($db); dol_print_error($db);
} }

View File

@ -1050,7 +1050,7 @@ class RemiseCheque extends CommonObject
$return .= ' | <span class="info-box-label">'.$this->account_id.'</span>'; $return .= ' | <span class="info-box-label">'.$this->account_id.'</span>';
} }
if (method_exists($this, 'LibStatut')) { if (method_exists($this, 'LibStatut')) {
$return .= '<br><div style="display:inline-block" class="info-box-status margintoponly">'.$this->LibStatut($this->statut, 5).'</div>'; $return .= '<br><div style="display:inline-block" class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
} }
if (property_exists($this, 'amount')) { if (property_exists($this, 'amount')) {
$return .= ' | <div style="display:inline-block"><span class="opacitymedium">'.$langs->trans("Amount").'</span> : <span class="amount">'.price($this->amount).'</div>'; $return .= ' | <div style="display:inline-block"><span class="opacitymedium">'.$langs->trans("Amount").'</span> : <span class="amount">'.price($this->amount).'</div>';

View File

@ -71,11 +71,22 @@ $type = $object->type;
if ($type == 'bank-transfer') { if ($type == 'bank-transfer') {
$result = restrictedArea($user, 'paymentbybanktransfer', '', '', ''); $result = restrictedArea($user, 'paymentbybanktransfer', '', '', '');
$permissiontoadd = $user->hasRight('paymentbybanktransfer', 'read');
$permissiontosend = $user->hasRight('paymentbybanktransfer', 'send');
$permissiontocreditdebit = $user->hasRight('paymentbybanktransfer', 'debit');
$permissiontodelete = $user->hasRight('paymentbybanktransfer', 'read');
} else { } else {
$result = restrictedArea($user, 'prelevement', '', '', 'bons'); $result = restrictedArea($user, 'prelevement', '', '', 'bons');
$permissiontoadd = $user->hasRight('prelevement', 'bons', 'read');
$permissiontosend = $user->hasRight('prelevement', 'bons', 'send');
$permissiontocreditdebit = $user->hasRight('prelevement', 'bons', 'credit');
$permissiontodelete = $user->hasRight('prelevement', 'bons', 'read');
} }
/* /*
* Actions * Actions
*/ */
@ -87,20 +98,13 @@ if ($reshook < 0) {
} }
if (empty($reshook)) { if (empty($reshook)) {
if ($action == 'confirm_delete') { if ($action == 'setbankaccount' && $permissiontoadd) {
$savtype = $object->type; $object->oldcopy = dol_clone($object);
$res = $object->delete($user); $object->fk_bank_account = GETPOST('fk_bank_account', 'int');
if ($res > 0) { $object->update($user);
if ($savtype == 'bank-transfer') {
header("Location: ".DOL_URL_ROOT.'/compta/paymentbybanktransfer/index.php');
} else {
header("Location: ".DOL_URL_ROOT.'/compta/prelevement/index.php');
}
exit;
}
} }
if ($action == 'infotrans' && (($user->rights->prelevement->bons->send && $object->type != 'bank-transfer') || ($user->rights->paymentbybanktransfer->send && $object->type == 'bank-transfer'))) { if ($action == 'infotrans' && $permissiontosend) {
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
$dt = dol_mktime(12, 0, 0, GETPOST('remonth', 'int'), GETPOST('reday', 'int'), GETPOST('reyear', 'int')); $dt = dol_mktime(12, 0, 0, GETPOST('remonth', 'int'), GETPOST('reday', 'int'), GETPOST('reyear', 'int'));
@ -133,7 +137,7 @@ if (empty($reshook)) {
} }
// Set direct debit order to credited, create payment and close invoices // Set direct debit order to credited, create payment and close invoices
if ($action == 'infocredit' && (($user->rights->prelevement->bons->credit && $object->type != 'bank-transfer') || ($user->rights->paymentbybanktransfer->debit && $object->type == 'bank-transfer'))) { if ($action == 'infocredit' && $permissiontocreditdebit) {
$dt = dol_mktime(12, 0, 0, GETPOST('remonth', 'int'), GETPOST('reday', 'int'), GETPOST('reyear', 'int')); $dt = dol_mktime(12, 0, 0, GETPOST('remonth', 'int'), GETPOST('reday', 'int'), GETPOST('reyear', 'int'));
if (($object->type != 'bank-transfer' && $object->statut == BonPrelevement::STATUS_CREDITED) || ($object->type == 'bank-transfer' && $object->statut == BonPrelevement::STATUS_DEBITED)) { if (($object->type != 'bank-transfer' && $object->statut == BonPrelevement::STATUS_CREDITED) || ($object->type == 'bank-transfer' && $object->statut == BonPrelevement::STATUS_DEBITED)) {
@ -147,6 +151,19 @@ if (empty($reshook)) {
setEventMessages($object->error, $object->errors, 'errors'); setEventMessages($object->error, $object->errors, 'errors');
} }
} }
if ($action == 'confirm_delete' && $permissiontodelete) {
$savtype = $object->type;
$res = $object->delete($user);
if ($res > 0) {
if ($savtype == 'bank-transfer') {
header("Location: ".DOL_URL_ROOT.'/compta/paymentbybanktransfer/index.php');
} else {
header("Location: ".DOL_URL_ROOT.'/compta/prelevement/index.php');
}
exit;
}
}
} }
@ -179,13 +196,6 @@ if ($id > 0 || $ref) {
print '<tr><td>'.$langs->trans("Amount").'</td><td><span class="amount">'.price($object->amount).'</span></td></tr>'; print '<tr><td>'.$langs->trans("Amount").'</td><td><span class="amount">'.price($object->amount).'</span></td></tr>';
// Status
/*
print '<tr><td>'.$langs->trans('Status').'</td>';
print '<td>'.$object->getLibStatut(1).'</td>';
print '</tr>';
*/
if (!empty($object->date_trans)) { if (!empty($object->date_trans)) {
$muser = new User($db); $muser = new User($db);
$muser->fetch($object->user_trans); $muser->fetch($object->user_trans);
@ -210,23 +220,53 @@ if ($id > 0 || $ref) {
print '<div class="underbanner clearboth"></div>'; print '<div class="underbanner clearboth"></div>';
print '<table class="border centpercent tableforfield">'; print '<table class="border centpercent tableforfield">';
// Get bank account for the payment
$acc = new Account($db); $acc = new Account($db);
$result = $acc->fetch(($object->type == 'bank-transfer' ? $conf->global->PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT : $conf->global->PRELEVEMENT_ID_BANKACCOUNT)); $fk_bank_account = $object->fk_bank_account;
if (empty($fk_bank_account)) {
$fk_bank_account = ($object->type == 'bank-transfer' ? getDolGlobalInt('PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT') : getDolGlobalInt('PRELEVEMENT_ID_BANKACCOUNT'));
}
if ($fk_bank_account > 0) {
$result = $acc->fetch($fk_bank_account);
}
print '<tr><td class="titlefieldcreate">'; // Bank account
$labelofbankfield = "BankToReceiveWithdraw"; $labelofbankfield = "BankToReceiveWithdraw";
if ($object->type == 'bank-transfer') { if ($object->type == 'bank-transfer') {
$labelofbankfield = 'BankToPayCreditTransfer'; $labelofbankfield = 'BankToPayCreditTransfer';
} }
print $langs->trans($labelofbankfield); //print $langs->trans($labelofbankfield);
$caneditbank = $permissiontoadd;
if ($object->status != $object::STATUS_DRAFT) {
$caneditbank = 0;
}
/*
print '<tr><td class="titlefieldcreate">';
print $form->editfieldkey($langs->trans($labelofbankfield), 'fk_bank_account', $acc->id, $object, $caneditbank);
print '</td>'; print '</td>';
print '<td>'; print '<td>';
if ($acc->id > 0) { print $form->editfieldval($langs->trans($labelofbankfield), 'fk_bank_account', $acc->id, $acc, $caneditbank, 'string', '', null, null, '', 1, 'getNomUrl');
print $acc->getNomUrl(1);
}
print '</td>'; print '</td>';
print '</tr>'; print '</tr>';
*/
print '<tr><td class="nowrap">';
print '<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
print $form->textwithpicto($langs->trans("BankAccount"), $langs->trans($labelofbankfield));
print '<td>';
if (($action != 'editbankaccount') && $caneditbank) {
print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editfkbankaccount&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->trans('SetBankAccount'), 1).'</a></td>';
}
print '</tr></table>';
print '</td><td>';
if ($action == 'editfkbankaccount') {
$form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $fk_bank_account, 'fk_bank_account', 0);
} else {
$form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $fk_bank_account, 'none');
}
print "</td>";
print '</tr>';
// Donwload file
print '<tr><td class="titlefieldcreate">'; print '<tr><td class="titlefieldcreate">';
$labelfororderfield = 'WithdrawalFile'; $labelfororderfield = 'WithdrawalFile';
if ($object->type == 'bank-transfer') { if ($object->type == 'bank-transfer') {

View File

@ -70,13 +70,11 @@ class BonPrelevement extends CommonObject
public $emetteur_bic; public $emetteur_bic;
public $emetteur_ics; public $emetteur_ics;
public $date_trans;
public $user_trans; public $user_trans;
public $method_trans; public $user_credit;
public $total; public $total;
public $fetched; public $fetched;
public $statut; // 0-Wait, 1-Trans, 2-Done
public $labelStatus = array(); public $labelStatus = array();
public $factures = array(); public $factures = array();
@ -84,14 +82,6 @@ class BonPrelevement extends CommonObject
public $invoice_in_error = array(); public $invoice_in_error = array();
public $thirdparty_in_error = array(); public $thirdparty_in_error = array();
public $amount;
public $note;
public $datec;
public $date_credit;
public $user_credit;
public $type;
const STATUS_DRAFT = 0; const STATUS_DRAFT = 0;
const STATUS_TRANSFERED = 1; const STATUS_TRANSFERED = 1;
@ -99,6 +89,83 @@ class BonPrelevement extends CommonObject
const STATUS_DEBITED = 2; // STATUS_CREDITED and STATUS_DEBITED is same. Difference is in ->type const STATUS_DEBITED = 2; // STATUS_CREDITED and STATUS_DEBITED is same. Difference is in ->type
/**
* 'type' field format:
* 'integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter[:Sortfield]]]',
* 'select' (list of values are in 'options'),
* 'sellist:TableName:LabelFieldName[:KeyFieldName[:KeyFieldParent[:Filter[:Sortfield]]]]',
* 'chkbxlst:...',
* 'varchar(x)',
* 'text', 'text:none', 'html',
* 'double(24,8)', 'real', 'price',
* 'date', 'datetime', 'timestamp', 'duration',
* 'boolean', 'checkbox', 'radio', 'array',
* 'mail', 'phone', 'url', 'password', 'ip'
* Note: Filter must be a Dolibarr filter syntax string. Example: "(t.ref:like:'SO-%') or (t.date_creation:<:'20160101') or (t.status:!=:0) or (t.nature:is:NULL)"
* 'label' the translation key.
* 'picto' is code of a picto to show before value in forms
* 'enabled' is a condition when the field must be managed (Example: 1 or '$conf->global->MY_SETUP_PARAM' or 'isModEnabled("multicurrency")' ...)
* 'position' is the sort order of field.
* 'notnull' is set to 1 if not null in database. Set to -1 if we must set data to null if empty ('' or 0).
* 'visible' says if field is visible in list (Examples: 0=Not visible, 1=Visible on list and create/update/view forms, 2=Visible on list only, 3=Visible on create/update/view form only (not list), 4=Visible on list and update/view form only (not create). 5=Visible on list and view only (not create/not update). Using a negative value means field is not shown by default on list but can be selected for viewing)
* 'noteditable' says if field is not editable (1 or 0)
* 'alwayseditable' says if field can be modified also when status is not draft ('1' or '0')
* 'default' is a default value for creation (can still be overwrote by the Setup of Default Values if field is editable in creation form). Note: If default is set to '(PROV)' and field is 'ref', the default value will be set to '(PROVid)' where id is rowid when a new record is created.
* 'index' if we want an index in database.
* 'foreignkey'=>'tablename.field' if the field is a foreign key (it is recommanded to name the field fk_...).
* 'searchall' is 1 if we want to search in this field when making a search from the quick search button.
* 'isameasure' must be set to 1 or 2 if field can be used for measure. Field type must be summable like integer or double(24,8). Use 1 in most cases, or 2 if you don't want to see the column total into list (for example for percentage)
* 'css' and 'cssview' and 'csslist' is the CSS style to use on field. 'css' is used in creation and update. 'cssview' is used in view mode. 'csslist' is used for columns in lists. For example: 'css'=>'minwidth300 maxwidth500 widthcentpercentminusx', 'cssview'=>'wordbreak', 'csslist'=>'tdoverflowmax200'
* 'help' is a 'TranslationString' to use to show a tooltip on field. You can also use 'TranslationString:keyfortooltiponlick' for a tooltip on click.
* 'showoncombobox' if value of the field must be visible into the label of the combobox that list record
* 'disabled' is 1 if we want to have the field locked by a 'disabled' attribute. In most cases, this is never set into the definition of $fields into class, but is set dynamically by some part of code.
* 'arrayofkeyval' to set a list of values if type is a list of predefined values. For example: array("0"=>"Draft","1"=>"Active","-1"=>"Cancel"). Note that type can be 'integer' or 'varchar'
* 'autofocusoncreate' to have field having the focus on a create form. Only 1 field should have this property set to 1.
* 'comment' is not used. You can store here any text of your choice. It is not used by application.
* 'validate' is 1 if need to validate with $this->validateField()
* 'copytoclipboard' is 1 or 2 to allow to add a picto to copy value into clipboard (1=picto after label, 2=picto after value)
*
* Note: To have value dynamic, you can set value to 0 in definition and edit the value on the fly into the constructor.
*/
// BEGIN MODULEBUILDER PROPERTIES
/**
* @var array Array with all fields and their property. Do not use it as a static var. It may be modified by constructor.
*/
public $fields=array(
'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>'1', 'position'=>10, 'notnull'=>1, 'visible'=>0,),
'ref' => array('type'=>'varchar(12)', 'label'=>'Ref', 'enabled'=>'1', 'position'=>15, 'notnull'=>0, 'visible'=>-1, 'csslist'=>'tdoverflowmax150', 'showoncombobox'=>'1',),
'datec' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>'1', 'position'=>25, 'notnull'=>0, 'visible'=>-1,),
'amount' => array('type'=>'double(24,8)', 'label'=>'Amount', 'enabled'=>'1', 'position'=>30, 'notnull'=>0, 'visible'=>-1,),
'statut' => array('type'=>'smallint(6)', 'label'=>'Statut', 'enabled'=>'1', 'position'=>500, 'notnull'=>0, 'visible'=>-1, 'arrayofkeyval'=>array(0=>'Wait', 1=>'Transfered', 2=>'Credited')),
'credite' => array('type'=>'smallint(6)', 'label'=>'Credite', 'enabled'=>'1', 'position'=>40, 'notnull'=>0, 'visible'=>-1,),
'note' => array('type'=>'text', 'label'=>'Note', 'enabled'=>'1', 'position'=>45, 'notnull'=>0, 'visible'=>-1,),
'date_trans' => array('type'=>'datetime', 'label'=>'Datetrans', 'enabled'=>'1', 'position'=>50, 'notnull'=>0, 'visible'=>-1,),
'method_trans' => array('type'=>'smallint(6)', 'label'=>'Methodtrans', 'enabled'=>'1', 'position'=>55, 'notnull'=>0, 'visible'=>-1,),
'fk_user_trans' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'Fkusertrans', 'enabled'=>'1', 'position'=>60, 'notnull'=>0, 'visible'=>-1, 'css'=>'maxwidth500 widthcentpercentminusxx', 'csslist'=>'tdoverflowmax150',),
'date_credit' => array('type'=>'datetime', 'label'=>'Datecredit', 'enabled'=>'1', 'position'=>65, 'notnull'=>0, 'visible'=>-1,),
'fk_user_credit' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'Fkusercredit', 'enabled'=>'1', 'position'=>70, 'notnull'=>0, 'visible'=>-1, 'css'=>'maxwidth500 widthcentpercentminusxx', 'csslist'=>'tdoverflowmax150',),
'type' => array('type'=>'varchar(16)', 'label'=>'Type', 'enabled'=>'1', 'position'=>75, 'notnull'=>0, 'visible'=>-1,),
'fk_bank_account' => array('type'=>'integer', 'label'=>'Fkbankaccount', 'enabled'=>'1', 'position'=>80, 'notnull'=>0, 'visible'=>-1, 'css'=>'maxwidth500 widthcentpercentminusxx',),
);
public $rowid;
public $ref;
public $datec;
public $amount;
public $statut;
public $credite;
public $note;
public $date_trans;
public $method_trans;
public $fk_user_trans;
public $date_credit;
public $fk_user_credit;
public $type;
public $fk_bank_account;
// END MODULEBUILDER PROPERTIES
/** /**
* Constructor * Constructor
* *
@ -290,8 +357,6 @@ class BonPrelevement extends CommonObject
*/ */
public function fetch($rowid, $ref = '') public function fetch($rowid, $ref = '')
{ {
global $conf;
$sql = "SELECT p.rowid, p.ref, p.amount, p.note"; $sql = "SELECT p.rowid, p.ref, p.amount, p.note";
$sql .= ", p.datec as dc"; $sql .= ", p.datec as dc";
$sql .= ", p.date_trans as date_trans"; $sql .= ", p.date_trans as date_trans";
@ -299,6 +364,7 @@ class BonPrelevement extends CommonObject
$sql .= ", p.date_credit as date_credit"; $sql .= ", p.date_credit as date_credit";
$sql .= ", p.fk_user_credit"; $sql .= ", p.fk_user_credit";
$sql .= ", p.type"; $sql .= ", p.type";
$sql .= ", p.fk_bank_account";
$sql .= ", p.statut as status"; $sql .= ", p.statut as status";
$sql .= " FROM ".MAIN_DB_PREFIX."prelevement_bons as p"; $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_bons as p";
$sql .= " WHERE p.entity IN (".getEntity('invoice').")"; $sql .= " WHERE p.entity IN (".getEntity('invoice').")";
@ -328,6 +394,7 @@ class BonPrelevement extends CommonObject
$this->user_credit = $obj->fk_user_credit; $this->user_credit = $obj->fk_user_credit;
$this->type = $obj->type; $this->type = $obj->type;
$this->fk_bank_account = $obj->fk_bank_account;
$this->status = $obj->status; $this->status = $obj->status;
$this->statut = $obj->status; // For backward compatibility $this->statut = $obj->status; // For backward compatibility
@ -344,6 +411,18 @@ class BonPrelevement extends CommonObject
} }
} }
/**
* 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)
{
return $this->updateCommon($user, $notrigger);
}
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/** /**
* Set direct debit or credit transfer order to "paid" status. * Set direct debit or credit transfer order to "paid" status.
@ -369,7 +448,7 @@ class BonPrelevement extends CommonObject
$this->db->begin(); $this->db->begin();
$sql = " UPDATE ".MAIN_DB_PREFIX."prelevement_bons "; $sql = " UPDATE ".MAIN_DB_PREFIX."prelevement_bons";
$sql .= " SET fk_user_credit = ".$user->id; $sql .= " SET fk_user_credit = ".$user->id;
$sql .= ", statut = ".self::STATUS_CREDITED; $sql .= ", statut = ".self::STATUS_CREDITED;
$sql .= ", date_credit = '".$this->db->idate($date)."'"; $sql .= ", date_credit = '".$this->db->idate($date)."'";
@ -383,8 +462,12 @@ class BonPrelevement extends CommonObject
$subject = $langs->trans("InfoCreditSubject", $this->ref); $subject = $langs->trans("InfoCreditSubject", $this->ref);
$message = $langs->trans("InfoCreditMessage", $this->ref, dol_print_date($date, 'dayhour')); $message = $langs->trans("InfoCreditMessage", $this->ref, dol_print_date($date, 'dayhour'));
//Add payment of withdrawal into bank // Add payment of withdrawal into bank
$bankaccount = ($this->type == 'bank-transfer' ? $conf->global->PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT : $conf->global->PRELEVEMENT_ID_BANKACCOUNT); $fk_bank_account = $this->fk_bank_account;
if (empty($fk_bank_account)) {
$fk_bank_account = ($this->type == 'bank-transfer' ? $conf->global->PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT : $conf->global->PRELEVEMENT_ID_BANKACCOUNT);
}
$facs = array(); $facs = array();
$amounts = array(); $amounts = array();
$amountsperthirdparty = array(); $amountsperthirdparty = array();
@ -455,7 +538,7 @@ class BonPrelevement extends CommonObject
$modeforaddpayment = 'payment'; $modeforaddpayment = 'payment';
} }
$result = $paiement->addPaymentToBank($user, $modeforaddpayment, '(WithdrawalPayment)', $bankaccount, '', ''); $result = $paiement->addPaymentToBank($user, $modeforaddpayment, '(WithdrawalPayment)', $fk_bank_account, '', '');
if ($result < 0) { if ($result < 0) {
$error++; $error++;
$this->error = $paiement->error; $this->error = $paiement->error;
@ -742,17 +825,18 @@ class BonPrelevement extends CommonObject
* - Link the order with the prelevement_demande lines * - Link the order with the prelevement_demande lines
* TODO delete params banque and agence when not necessary * TODO delete params banque and agence when not necessary
* *
* @param int $banque dolibarr mysoc bank * @param int $banque dolibarr mysoc bank
* @param int $agence dolibarr mysoc bank office (guichet) * @param int $agence dolibarr mysoc bank office (guichet)
* @param string $mode real=do action, simu=test only * @param string $mode real=do action, simu=test only
* @param string $format FRST, RCUR or ALL * @param string $format FRST, RCUR or ALL
* @param string $executiondate Date to execute the transfer * @param string $executiondate Date to execute the transfer
* @param int $notrigger Disable triggers * @param int $notrigger Disable triggers
* @param string $type 'direct-debit' or 'bank-transfer' * @param string $type 'direct-debit' or 'bank-transfer'
* @param int $did ID of an existing payment request. If $did is defined, no entry * @param int $did ID of an existing payment request. If $did is defined, no entry
* @return int <0 if KO, No of invoice included into file if OK * @param int $fk_bank_account Bank account ID the receipt is generated for. Will use the ID into the setup of module Direct Debit or Credit Transfer if 0.
* @return int <0 if KO, No of invoice included into file if OK
*/ */
public function create($banque = 0, $agence = 0, $mode = 'real', $format = 'ALL', $executiondate = '', $notrigger = 0, $type = 'direct-debit', $did = 0) public function create($banque = 0, $agence = 0, $mode = 'real', $format = 'ALL', $executiondate = '', $notrigger = 0, $type = 'direct-debit', $did = 0, $fk_bank_account = 0)
{ {
// phpcs:enable // phpcs:enable
global $conf, $langs, $user; global $conf, $langs, $user;
@ -762,6 +846,7 @@ class BonPrelevement extends CommonObject
require_once DOL_DOCUMENT_ROOT."/compta/facture/class/facture.class.php"; require_once DOL_DOCUMENT_ROOT."/compta/facture/class/facture.class.php";
require_once DOL_DOCUMENT_ROOT."/societe/class/societe.class.php"; require_once DOL_DOCUMENT_ROOT."/societe/class/societe.class.php";
// Check params
if ($type != 'bank-transfer') { if ($type != 'bank-transfer') {
if (empty($format)) { if (empty($format)) {
$this->error = 'ErrorBadParametersForDirectDebitFileCreate'; $this->error = 'ErrorBadParametersForDirectDebitFileCreate';
@ -769,6 +854,11 @@ class BonPrelevement extends CommonObject
} }
} }
// Clean params
if (empty($fk_bank_account)) {
$fk_bank_account = ($type == 'bank-transfer' ? $conf->global->PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT : $conf->global->PRELEVEMENT_ID_BANKACCOUNT);
}
$error = 0; $error = 0;
$datetimeprev = dol_now('gmt'); $datetimeprev = dol_now('gmt');
@ -969,12 +1059,13 @@ class BonPrelevement extends CommonObject
// Create withdraw order in database // Create withdraw order in database
$sql = "INSERT INTO ".MAIN_DB_PREFIX."prelevement_bons ("; $sql = "INSERT INTO ".MAIN_DB_PREFIX."prelevement_bons (";
$sql .= "ref, entity, datec, type"; $sql .= "ref, entity, datec, type, fk_bank_account";
$sql .= ") VALUES ("; $sql .= ") VALUES (";
$sql .= "'".$this->db->escape($ref)."'"; $sql .= "'".$this->db->escape($ref)."'";
$sql .= ", ".((int) $conf->entity); $sql .= ", ".((int) $conf->entity);
$sql .= ", '".$this->db->idate($now)."'"; $sql .= ", '".$this->db->idate($now)."'";
$sql .= ", '".($type == 'bank-transfer' ? 'bank-transfer' : 'debit-order')."'"; $sql .= ", '".($type == 'bank-transfer' ? 'bank-transfer' : 'debit-order')."'";
$sql .= ", ".((int) $fk_bank_account);
$sql .= ")"; $sql .= ")";
$resql = $this->db->query($sql); $resql = $this->db->query($sql);
@ -1055,12 +1146,8 @@ class BonPrelevement extends CommonObject
$this->date_echeance = $datetimeprev; $this->date_echeance = $datetimeprev;
$this->reference_remise = $ref; $this->reference_remise = $ref;
$id = $conf->global->PRELEVEMENT_ID_BANKACCOUNT;
if ($type == 'bank-transfer') {
$id = $conf->global->PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT;
}
$account = new Account($this->db); $account = new Account($this->db);
if ($account->fetch($id) > 0) { if ($account->fetch($fk_bank_account) > 0) {
$this->emetteur_code_banque = $account->code_banque; $this->emetteur_code_banque = $account->code_banque;
$this->emetteur_code_guichet = $account->code_guichet; $this->emetteur_code_guichet = $account->code_guichet;
$this->emetteur_numero_compte = $account->number; $this->emetteur_numero_compte = $account->number;
@ -1382,16 +1469,22 @@ class BonPrelevement extends CommonObject
* File is generated with name this->filename * File is generated with name this->filename
* *
* @param string $format FRST, RCUR or ALL * @param string $format FRST, RCUR or ALL
* @param string $executiondate Date to execute transfer * @param int $executiondate Timestamp date to execute transfer
* @param string $type 'direct-debit' or 'bank-transfer' * @param string $type 'direct-debit' or 'bank-transfer'
* @param int $fk_bank_account Bank account ID the receipt is generated for. Will use the ID into the setup of module Direct Debit or Credit Transfer if 0.
* @return int >=0 if OK, <0 if KO * @return int >=0 if OK, <0 if KO
*/ */
public function generate($format = 'ALL', $executiondate = '', $type = 'direct-debit') public function generate($format = 'ALL', $executiondate = 0, $type = 'direct-debit', $fk_bank_account = 0)
{ {
global $conf, $langs, $mysoc; global $conf, $langs, $mysoc;
//TODO: Optimize code to read lines in a single function //TODO: Optimize code to read lines in a single function
// Clean params
if (empty($fk_bank_account)) {
$fk_bank_account = ($type == 'bank-transfer' ? $conf->global->PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT : $conf->global->PRELEVEMENT_ID_BANKACCOUNT);
}
$result = 0; $result = 0;
dol_syslog(get_class($this)."::generate build file=".$this->filename." type=".$type); dol_syslog(get_class($this)."::generate build file=".$this->filename." type=".$type);
@ -1486,7 +1579,7 @@ class BonPrelevement extends CommonObject
// Define $fileEmetteurSection. Start of bloc PmtInf. Will contains all $nbtotalDrctDbtTxInf // Define $fileEmetteurSection. Start of bloc PmtInf. Will contains all $nbtotalDrctDbtTxInf
if ($result != -2) { if ($result != -2) {
$fileEmetteurSection .= $this->EnregEmetteurSEPA($conf, $date_actu, $nbtotalDrctDbtTxInf, $this->total, $CrLf, $format, $type); $fileEmetteurSection .= $this->EnregEmetteurSEPA($conf, $date_actu, $nbtotalDrctDbtTxInf, $this->total, $CrLf, $format, $type, $fk_bank_account);
} }
/** /**
@ -2041,31 +2134,36 @@ class BonPrelevement extends CommonObject
* Write sender of request (me). * Write sender of request (me).
* Note: The tag PmtInf is opened here but closed into caller * Note: The tag PmtInf is opened here but closed into caller
* *
* @param Conf $configuration conf * @param Conf $configuration conf
* @param int $ladate Date * @param int $ladate Date
* @param int $nombre 0 or 1 * @param int $nombre 0 or 1
* @param float $total Total * @param float $total Total
* @param string $CrLf End of line character * @param string $CrLf End of line character
* @param string $format FRST or RCUR or ALL * @param string $format FRST or RCUR or ALL
* @param string $type 'direct-debit' or 'bank-transfer' * @param string $type 'direct-debit' or 'bank-transfer'
* @return string String with SEPA Sender * @param int $fk_bank_account Bank account ID the receipt is generated for. Will use the ID into the setup of module Direct Debit or Credit Transfer if 0.
* @return string String with SEPA Sender
* @see EnregEmetteur() * @see EnregEmetteur()
*/ */
public function EnregEmetteurSEPA($configuration, $ladate, $nombre, $total, $CrLf = '\n', $format = 'FRST', $type = 'direct-debit') public function EnregEmetteurSEPA($configuration, $ladate, $nombre, $total, $CrLf = '\n', $format = 'FRST', $type = 'direct-debit', $fk_bank_account = 0)
{ {
// phpcs:enable // phpcs:enable
// SEPA INITIALISATION // SEPA INITIALISATION
global $conf; global $conf;
// Clean parameters
$dateTime_YMD = dol_print_date($ladate, '%Y%m%d'); $dateTime_YMD = dol_print_date($ladate, '%Y%m%d');
$dateTime_ETAD = dol_print_date($ladate, '%Y-%m-%d'); $dateTime_ETAD = dol_print_date($ladate, '%Y-%m-%d');
$dateTime_YMDHMS = dol_print_date($ladate, '%Y-%m-%dT%H:%M:%S'); $dateTime_YMDHMS = dol_print_date($ladate, '%Y-%m-%dT%H:%M:%S');
// Clean params
if (empty($fk_bank_account)) {
$fk_bank_account = ($type == 'bank-transfer' ? $conf->global->PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT : $conf->global->PRELEVEMENT_ID_BANKACCOUNT);
}
// Get data of bank account // Get data of bank account
//$id = $configuration->global->PRELEVEMENT_ID_BANKACCOUNT;
$id = ($type == 'bank-transfer' ? $conf->global->PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT : $conf->global->PRELEVEMENT_ID_BANKACCOUNT);
$account = new Account($this->db); $account = new Account($this->db);
if ($account->fetch($id) > 0) { if ($account->fetch($fk_bank_account) > 0) {
$this->emetteur_code_banque = $account->code_banque; $this->emetteur_code_banque = $account->code_banque;
$this->emetteur_code_guichet = $account->code_guichet; $this->emetteur_code_guichet = $account->code_guichet;
$this->emetteur_numero_compte = $account->number; $this->emetteur_numero_compte = $account->number;
@ -2081,8 +2179,7 @@ class BonPrelevement extends CommonObject
// Get pending payments // Get pending payments
$sql = "SELECT rowid, ref"; $sql = "SELECT rowid, ref";
$sql .= " FROM"; $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_bons as pb";
$sql .= " ".MAIN_DB_PREFIX."prelevement_bons as pb";
$sql .= " WHERE pb.rowid = ".((int) $this->id); $sql .= " WHERE pb.rowid = ".((int) $this->id);
$resql = $this->db->query($sql); $resql = $this->db->query($sql);
@ -2294,10 +2391,10 @@ class BonPrelevement extends CommonObject
} }
/** /**
* Return status label of object * Return status label of object
* *
* @param int $mode 0=Label, 1=Picto + label, 2=Picto, 3=Label + Picto * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto
* @return string Label * @return string Label
*/ */
public function getLibStatut($mode = 0) public function getLibStatut($mode = 0)
{ {
@ -2427,7 +2524,6 @@ class BonPrelevement extends CommonObject
{ {
global $langs; global $langs;
$return = '<div class="box-flex-item box-flex-grow-zero">'; $return = '<div class="box-flex-item box-flex-grow-zero">';
$return .= '<div class="info-box info-box-sm">'; $return .= '<div class="info-box info-box-sm">';
$return .= '<span class="info-box-icon bg-infobox-action">'; $return .= '<span class="info-box-icon bg-infobox-action">';
@ -2443,7 +2539,7 @@ class BonPrelevement extends CommonObject
$return .= '<br><span class="opacitymedium">'.$langs->trans("Amount").'</span> : <span class="amount">'.price($this->total).'</span>'; $return .= '<br><span class="opacitymedium">'.$langs->trans("Amount").'</span> : <span class="amount">'.price($this->total).'</span>';
} }
if (method_exists($this, 'LibStatut')) { if (method_exists($this, 'LibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->LibStatut($this->statut, 5).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
} }
$return .= '</div>'; $return .= '</div>';
$return .= '</div>'; $return .= '</div>';

View File

@ -105,7 +105,7 @@ if ($id > 0 || $ref) {
print '<tr><td class="titlefieldcreate">'.$langs->trans("Date").'</td><td>'.dol_print_date($object->datec, 'day').'</td></tr>'; print '<tr><td class="titlefieldcreate">'.$langs->trans("Date").'</td><td>'.dol_print_date($object->datec, 'day').'</td></tr>';
print '<tr><td>'.$langs->trans("Amount").'</td><td><span class="amount">'.price($object->amount).'</span></td></tr>'; print '<tr><td>'.$langs->trans("Amount").'</td><td><span class="amount">'.price($object->amount).'</span></td></tr>';
if ($object->date_trans <> 0) { if (!empty($object->date_trans)) {
$muser = new User($db); $muser = new User($db);
$muser->fetch($object->user_trans); $muser->fetch($object->user_trans);
@ -116,7 +116,7 @@ if ($id > 0 || $ref) {
print $object->methodes_trans[$object->method_trans]; print $object->methodes_trans[$object->method_trans];
print '</td></tr>'; print '</td></tr>';
} }
if ($object->date_credit <> 0) { if (!empty($object->date_credit)) {
print '<tr><td>'.$langs->trans('CreditDate').'</td><td>'; print '<tr><td>'.$langs->trans('CreditDate').'</td><td>';
print dol_print_date($object->date_credit, 'day'); print dol_print_date($object->date_credit, 'day');
print '</td></tr>'; print '</td></tr>';
@ -129,15 +129,23 @@ if ($id > 0 || $ref) {
print '<div class="underbanner clearboth"></div>'; print '<div class="underbanner clearboth"></div>';
print '<table class="border centpercent tableforfield">'; print '<table class="border centpercent tableforfield">';
// Get bank account for the payment
$acc = new Account($db); $acc = new Account($db);
$result = $acc->fetch($conf->global->PRELEVEMENT_ID_BANKACCOUNT); $fk_bank_account = $object->fk_bank_account;
if (empty($fk_bank_account)) {
$fk_bank_account = ($object->type == 'bank-transfer' ? getDolGlobalInt('PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT') : getDolGlobalInt('PRELEVEMENT_ID_BANKACCOUNT'));
}
if ($fk_bank_account > 0) {
$result = $acc->fetch($fk_bank_account);
}
print '<tr><td class="titlefieldcreate">';
$labelofbankfield = "BankToReceiveWithdraw"; $labelofbankfield = "BankToReceiveWithdraw";
if ($object->type == 'bank-transfer') { if ($object->type == 'bank-transfer') {
$labelofbankfield = 'BankToPayCreditTransfer'; $labelofbankfield = 'BankToPayCreditTransfer';
} }
print $langs->trans($labelofbankfield);
print '<tr><td class="titlefieldcreate">';
print $form->textwithpicto($langs->trans("BankAccount"), $langs->trans($labelofbankfield));
print '</td>'; print '</td>';
print '<td>'; print '<td>';
if ($acc->id > 0) { if ($acc->id > 0) {

View File

@ -100,7 +100,7 @@ if ($id > 0 || $ref) {
print '<tr><td class="titlefieldcreate">'.$langs->trans("Date").'</td><td>'.dol_print_date($object->datec, 'day').'</td></tr>'; print '<tr><td class="titlefieldcreate">'.$langs->trans("Date").'</td><td>'.dol_print_date($object->datec, 'day').'</td></tr>';
print '<tr><td>'.$langs->trans("Amount").'</td><td><span class="amount">'.price($object->amount).'</span></td></tr>'; print '<tr><td>'.$langs->trans("Amount").'</td><td><span class="amount">'.price($object->amount).'</span></td></tr>';
if ($object->date_trans <> 0) { if (!empty($object->date_trans)) {
$muser = new User($db); $muser = new User($db);
$muser->fetch($object->user_trans); $muser->fetch($object->user_trans);
@ -111,7 +111,7 @@ if ($id > 0 || $ref) {
print $object->methodes_trans[$object->method_trans]; print $object->methodes_trans[$object->method_trans];
print '</td></tr>'; print '</td></tr>';
} }
if ($object->date_credit <> 0) { if (!empty($object->date_credit)) {
print '<tr><td>'.$langs->trans('CreditDate').'</td><td>'; print '<tr><td>'.$langs->trans('CreditDate').'</td><td>';
print dol_print_date($object->date_credit, 'day'); print dol_print_date($object->date_credit, 'day');
print '</td></tr>'; print '</td></tr>';
@ -124,15 +124,23 @@ if ($id > 0 || $ref) {
print '<div class="underbanner clearboth"></div>'; print '<div class="underbanner clearboth"></div>';
print '<table class="border centpercent tableforfield">'; print '<table class="border centpercent tableforfield">';
// Get bank account for the payment
$acc = new Account($db); $acc = new Account($db);
$result = $acc->fetch($conf->global->PRELEVEMENT_ID_BANKACCOUNT); $fk_bank_account = $object->fk_bank_account;
if (empty($fk_bank_account)) {
$fk_bank_account = ($object->type == 'bank-transfer' ? getDolGlobalInt('PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT') : getDolGlobalInt('PRELEVEMENT_ID_BANKACCOUNT'));
}
if ($fk_bank_account > 0) {
$result = $acc->fetch($fk_bank_account);
}
print '<tr><td class="titlefieldcreate">';
$labelofbankfield = "BankToReceiveWithdraw"; $labelofbankfield = "BankToReceiveWithdraw";
if ($object->type == 'bank-transfer') { if ($object->type == 'bank-transfer') {
$labelofbankfield = 'BankToPayCreditTransfer'; $labelofbankfield = 'BankToPayCreditTransfer';
} }
print $langs->trans($labelofbankfield);
print '<tr><td class="titlefieldcreate">';
print $form->textwithpicto($langs->trans("BankAccount"), $langs->trans($labelofbankfield));
print '</td>'; print '</td>';
print '<td>'; print '<td>';
if ($acc->id > 0) { if ($acc->id > 0) {
@ -242,7 +250,7 @@ if ($resql) {
$i++; $i++;
} }
} else { } else {
print '<tr><td colspan="6" class="opacitymedium">'.$langs->trans("None").'</td></tr>'; print '<tr><td colspan="6"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
} }
if ($num > 0) { if ($num > 0) {

View File

@ -94,7 +94,7 @@ if ($id > 0 || $ref) {
print '<tr><td class="titlefieldcreate">'.$langs->trans("Date").'</td><td>'.dol_print_date($object->datec, 'day').'</td></tr>'; print '<tr><td class="titlefieldcreate">'.$langs->trans("Date").'</td><td>'.dol_print_date($object->datec, 'day').'</td></tr>';
print '<tr><td>'.$langs->trans("Amount").'</td><td><span class="amount">'.price($object->amount).'</span></td></tr>'; print '<tr><td>'.$langs->trans("Amount").'</td><td><span class="amount">'.price($object->amount).'</span></td></tr>';
if ($object->date_trans <> 0) { if (!empty($object->date_trans)) {
$muser = new User($db); $muser = new User($db);
$muser->fetch($object->user_trans); $muser->fetch($object->user_trans);
@ -105,7 +105,7 @@ if ($id > 0 || $ref) {
print $object->methodes_trans[$object->method_trans]; print $object->methodes_trans[$object->method_trans];
print '</td></tr>'; print '</td></tr>';
} }
if ($object->date_credit <> 0) { if (!empty($object->date_credit)) {
print '<tr><td>'.$langs->trans('CreditDate').'</td><td>'; print '<tr><td>'.$langs->trans('CreditDate').'</td><td>';
print dol_print_date($object->date_credit, 'day'); print dol_print_date($object->date_credit, 'day');
print '</td></tr>'; print '</td></tr>';
@ -118,15 +118,23 @@ if ($id > 0 || $ref) {
print '<div class="underbanner clearboth"></div>'; print '<div class="underbanner clearboth"></div>';
print '<table class="border centpercent tableforfield">'; print '<table class="border centpercent tableforfield">';
// Get bank account for the payment
$acc = new Account($db); $acc = new Account($db);
$result = $acc->fetch($conf->global->PRELEVEMENT_ID_BANKACCOUNT); $fk_bank_account = $object->fk_bank_account;
if (empty($fk_bank_account)) {
$fk_bank_account = ($object->type == 'bank-transfer' ? getDolGlobalInt('PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT') : getDolGlobalInt('PRELEVEMENT_ID_BANKACCOUNT'));
}
if ($fk_bank_account > 0) {
$result = $acc->fetch($fk_bank_account);
}
print '<tr><td class="titlefieldcreate">';
$labelofbankfield = "BankToReceiveWithdraw"; $labelofbankfield = "BankToReceiveWithdraw";
if ($object->type == 'bank-transfer') { if ($object->type == 'bank-transfer') {
$labelofbankfield = 'BankToPayCreditTransfer'; $labelofbankfield = 'BankToPayCreditTransfer';
} }
print $langs->trans($labelofbankfield);
print '<tr><td class="titlefieldcreate">';
print $form->textwithpicto($langs->trans("BankAccount"), $langs->trans($labelofbankfield));
print '</td>'; print '</td>';
print '<td>'; print '<td>';
if ($acc->id > 0) { if ($acc->id > 0) {

View File

@ -779,7 +779,7 @@ class ChargeSociales extends CommonObject
$return .= '<span class="info-box-label amount">'.price($this->amount, 0, $langs, 1, -1, -1, $conf->currency).'</span>'; $return .= '<span class="info-box-label amount">'.price($this->amount, 0, $langs, 1, -1, -1, $conf->currency).'</span>';
} }
if (method_exists($this, 'LibStatut')) { if (method_exists($this, 'LibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->LibStatut($this->paye, 5, $this->alreadypaid).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3, $this->alreadypaid).'</div>';
} }
$return .= '</div>'; $return .= '</div>';
$return .= '</div>'; $return .= '</div>';

View File

@ -935,7 +935,7 @@ class Tva extends CommonObject
$return .= '<br><span class="opacitymedium">'.$langs->trans("DateEnd").'</span> : <span class="info-box-label" >'.dol_print_date($this->datev).'</span>'; $return .= '<br><span class="opacitymedium">'.$langs->trans("DateEnd").'</span> : <span class="info-box-label" >'.dol_print_date($this->datev).'</span>';
} }
if (method_exists($this, 'LibStatut')) { if (method_exists($this, 'LibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->LibStatut($this->paiementtype, 5, $this->alreadypaid).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3, $this->alreadypaid).'</div>';
} }
$return .= '</div>'; $return .= '</div>';
$return .= '</div>'; $return .= '</div>';

View File

@ -2202,7 +2202,7 @@ class Contact extends CommonObject
$return .= '<span> : '.$this->LibPubPriv($this->priv).'</span>'; $return .= '<span> : '.$this->LibPubPriv($this->priv).'</span>';
}*/ }*/
if (method_exists($this, 'getLibStatut')) { if (method_exists($this, 'getLibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(5).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
} }
$return .= '</div>'; $return .= '</div>';
$return .= '</div>'; $return .= '</div>';

View File

@ -942,15 +942,8 @@ if (empty($reshook)) {
$old_filedir = $conf->contrat->multidir_output[$object->entity].'/'.dol_sanitizeFileName($old_ref); $old_filedir = $conf->contrat->multidir_output[$object->entity].'/'.dol_sanitizeFileName($old_ref);
$new_filedir = $conf->contrat->multidir_output[$object->entity].'/'.dol_sanitizeFileName($object->ref); $new_filedir = $conf->contrat->multidir_output[$object->entity].'/'.dol_sanitizeFileName($object->ref);
$files = dol_dir_list($old_filedir); // Rename directory of contract with new name
if (!empty($files)) { dol_move_dir($old_filedir, $new_filedir);
if (!is_dir($new_filedir)) {
dol_mkdir($new_filedir);
}
foreach ($files as $file) {
dol_move($file['fullname'], $new_filedir.'/'.$file['name']);
}
}
header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id); header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
exit; exit;

View File

@ -2844,7 +2844,7 @@ class Contrat extends CommonObject
$return .= '<br><span class="opacitymedium">'.$langs->trans("DateContract").' : </span><span class="info-box-label">'.dol_print_date($this->date_contrat, 'day').'</span>'; $return .= '<br><span class="opacitymedium">'.$langs->trans("DateContract").' : </span><span class="info-box-label">'.dol_print_date($this->date_contrat, 'day').'</span>';
} }
if (method_exists($this, 'getLibStatut')) { if (method_exists($this, 'getLibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(5).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
} }
$return .= '</div>'; $return .= '</div>';
$return .= '</div>'; $return .= '</div>';

View File

@ -45,9 +45,14 @@ error_reporting(E_ALL | E_STRICT);
$fk_element = GETPOST('fk_element', 'int'); $fk_element = GETPOST('fk_element', 'int');
$element = GETPOST('element', 'alpha'); $element = GETPOST('element', 'alpha');
$upload_handler = new FileUpload(null, $fk_element, $element); $upload_handler = new FileUpload(null, $fk_element, $element);
// Feature not enabled. Warning feature not used and not secured so disabled.
if (!getDolGlobalInt('MAIN_USE_JQUERY_FILEUPLOAD')) {
return;
}
/* /*
* View * View
*/ */

View File

@ -59,6 +59,7 @@ $signature = GETPOST('signaturebase64');
$ref = GETPOST('ref', 'aZ09'); $ref = GETPOST('ref', 'aZ09');
$mode = GETPOST('mode', 'aZ09'); // 'proposal', ... $mode = GETPOST('mode', 'aZ09'); // 'proposal', ...
$SECUREKEY = GETPOST("securekey"); // Secure key $SECUREKEY = GETPOST("securekey"); // Secure key
$online_sign_name = GETPOST("onlinesignname") ? GETPOST("onlinesignname") : '';
$error = 0; $error = 0;
$response = ""; $response = "";
@ -90,7 +91,8 @@ if (empty($SECUREKEY) || !dol_verifyHash($securekeyseed.$type.$ref.(!isModEnable
top_httphead(); top_httphead();
if ($action == "importSignature") { if ($action == "importSignature") {
if (!empty($signature) && $signature[0] == "image/png;base64") { $issignatureok = (!empty($signature) && $signature[0] == "image/png;base64");
if ($issignatureok) {
$signature = $signature[1]; $signature = $signature[1];
$data = base64_decode($signature); $data = base64_decode($signature);
@ -103,6 +105,10 @@ if ($action == "importSignature") {
$upload_dir = !empty($conf->propal->multidir_output[$object->entity])?$conf->propal->multidir_output[$object->entity]:$conf->propal->dir_output; $upload_dir = !empty($conf->propal->multidir_output[$object->entity])?$conf->propal->multidir_output[$object->entity]:$conf->propal->dir_output;
$upload_dir .= '/'.dol_sanitizeFileName($object->ref).'/'; $upload_dir .= '/'.dol_sanitizeFileName($object->ref).'/';
$default_font_size = pdf_getPDFFontSize($langs); // Must be after pdf_getInstance
$default_font = pdf_getPDFFont($langs); // Must be after pdf_getInstance
$langs->loadLangs(array("main", "companies"));
$date = dol_print_date(dol_now(), "%Y%m%d%H%M%S"); $date = dol_print_date(dol_now(), "%Y%m%d%H%M%S");
$filename = "signatures/".$date."_signature.png"; $filename = "signatures/".$date."_signature.png";
if (!is_dir($upload_dir."signatures/")) { if (!is_dir($upload_dir."signatures/")) {
@ -143,7 +149,6 @@ if ($action == "importSignature") {
$pdf->SetCompression(false); $pdf->SetCompression(false);
} }
//$pdf->Open(); //$pdf->Open();
$pagecount = $pdf->setSourceFile($sourcefile); // original PDF $pagecount = $pdf->setSourceFile($sourcefile); // original PDF
@ -155,7 +160,7 @@ if ($action == "importSignature") {
$pdf->AddPage($s['h'] > $s['w'] ? 'P' : 'L'); $pdf->AddPage($s['h'] > $s['w'] ? 'P' : 'L');
$pdf->useTemplate($tppl); $pdf->useTemplate($tppl);
} catch (Exception $e) { } catch (Exception $e) {
dol_syslog("Error when manipulating some PDF by onlineSign: ".$e->getMessage(), LOG_ERR); dol_syslog("Error when manipulating the PDF ".$sourcefile." by onlineSign: ".$e->getMessage(), LOG_ERR);
$response = $e->getMessage(); $response = $e->getMessage();
$error++; $error++;
} }
@ -167,7 +172,14 @@ if ($action == "importSignature") {
$yforimgstart = (empty($s['h']) ? 240 : $s['h'] - 60); $yforimgstart = (empty($s['h']) ? 240 : $s['h'] - 60);
$wforimg = $s['w'] - 20 - $xforimgstart; $wforimg = $s['w'] - 20 - $xforimgstart;
$pdf->SetXY($xforimgstart, $yforimgstart + round($wforimg / 4) - 4);
$pdf->SetFont($default_font, '', $default_font_size - 1);
$pdf->MultiCell($wforimg, 4, $langs->trans("DateSigning").': '.dol_print_date(dol_now(), "daytext", false, $langs, true), 0, 'L');
$pdf->SetXY($xforimgstart, $yforimgstart + round($wforimg / 4));
$pdf->MultiCell($wforimg, 4, $langs->trans("Lastname").': '.$online_sign_name, 0, 'L');
$pdf->Image($upload_dir.$filename, $xforimgstart, $yforimgstart, $wforimg, round($wforimg / 4)); $pdf->Image($upload_dir.$filename, $xforimgstart, $yforimgstart, $wforimg, round($wforimg / 4));
//$pdf->Close(); //$pdf->Close();
$pdf->Output($newpdffilename, "F"); $pdf->Output($newpdffilename, "F");
@ -187,7 +199,6 @@ if ($action == "importSignature") {
$db->begin(); $db->begin();
$online_sign_ip = getUserRemoteIP(); $online_sign_ip = getUserRemoteIP();
$online_sign_name = ''; // TODO Ask name on form to sign
$sql = "UPDATE ".MAIN_DB_PREFIX."propal"; $sql = "UPDATE ".MAIN_DB_PREFIX."propal";
$sql .= " SET fk_statut = ".((int) $object::STATUS_SIGNED).", note_private = '".$db->escape($object->note_private)."',"; $sql .= " SET fk_statut = ".((int) $object::STATUS_SIGNED).", note_private = '".$db->escape($object->note_private)."',";
@ -207,9 +218,6 @@ if ($action == "importSignature") {
} }
if (!$error) { if (!$error) {
$db->commit();
$response = "success";
setEventMessages("PropalSigned", null, 'warnings');
if (method_exists($object, 'call_trigger')) { if (method_exists($object, 'call_trigger')) {
//customer is not a user !?! so could we use same user as validation ? //customer is not a user !?! so could we use same user as validation ?
$user = new User($db); $user = new User($db);
@ -218,17 +226,25 @@ if ($action == "importSignature") {
$result = $object->call_trigger('PROPAL_CLOSE_SIGNED', $user); $result = $object->call_trigger('PROPAL_CLOSE_SIGNED', $user);
if ($result < 0) { if ($result < 0) {
$error++; $error++;
$response = "error in trigger ".$object->error;
} else {
$response = "success";
} }
$result = $object->call_trigger('PROPAL_CLOSE_SIGNED_WEB', $user); } else {
if ($result < 0) { $response = "success";
$error++;
}
} }
} else { } else {
$db->rollback();
$error++; $error++;
$response = "error sql"; $response = "error sql";
} }
if (!$error) {
$db->commit();
$response = "success";
setEventMessages("PropalSigned", null, 'warnings');
} else {
$db->rollback();
}
} }
} elseif ($mode == 'contract') { } elseif ($mode == 'contract') {
require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php'; require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';

View File

@ -839,6 +839,10 @@ class CMailFile
$this->error .= ".<br>"; $this->error .= ".<br>";
$this->error .= $langs->trans("ErrorPhpMailDelivery"); $this->error .= $langs->trans("ErrorPhpMailDelivery");
dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR); dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
if (!empty($conf->global->MAIN_MAIL_DEBUG)) {
$this->save_dump_mail_in_err();
}
} else { } else {
dol_syslog("CMailFile::sendfile: mail end success", LOG_DEBUG); dol_syslog("CMailFile::sendfile: mail end success", LOG_DEBUG);
} }
@ -903,6 +907,7 @@ class CMailFile
if (getDolGlobalString($keyforsmtpauthtype) === "XOAUTH2") { if (getDolGlobalString($keyforsmtpauthtype) === "XOAUTH2") {
require_once DOL_DOCUMENT_ROOT.'/core/lib/oauth.lib.php'; // define $supportedoauth2array require_once DOL_DOCUMENT_ROOT.'/core/lib/oauth.lib.php'; // define $supportedoauth2array
$keyforsupportedoauth2array = $conf->global->$keyforsmtpoauthservice; $keyforsupportedoauth2array = $conf->global->$keyforsmtpoauthservice;
if (preg_match('/^.*-/', $keyforsupportedoauth2array)) { if (preg_match('/^.*-/', $keyforsupportedoauth2array)) {
$keyforprovider = preg_replace('/^.*-/', '', $keyforsupportedoauth2array); $keyforprovider = preg_replace('/^.*-/', '', $keyforsupportedoauth2array);
@ -996,6 +1001,10 @@ class CMailFile
} }
dol_syslog("CMailFile::sendfile: mail end error with smtps lib to HOST=".$server.", PORT=".$conf->global->$keyforsmtpport." - ".$this->error, LOG_ERR); dol_syslog("CMailFile::sendfile: mail end error with smtps lib to HOST=".$server.", PORT=".$conf->global->$keyforsmtpport." - ".$this->error, LOG_ERR);
$res = false; $res = false;
if (!empty($conf->global->MAIN_MAIL_DEBUG)) {
$this->save_dump_mail_in_err();
}
} }
} }
} elseif ($this->sendmode == 'swiftmailer') { } elseif ($this->sendmode == 'swiftmailer') {
@ -1031,6 +1040,7 @@ class CMailFile
} }
if (getDolGlobalString($keyforsmtpauthtype) === "XOAUTH2") { if (getDolGlobalString($keyforsmtpauthtype) === "XOAUTH2") {
require_once DOL_DOCUMENT_ROOT.'/core/lib/oauth.lib.php'; // define $supportedoauth2array require_once DOL_DOCUMENT_ROOT.'/core/lib/oauth.lib.php'; // define $supportedoauth2array
$keyforsupportedoauth2array = getDolGlobalString($keyforsmtpoauthservice); $keyforsupportedoauth2array = getDolGlobalString($keyforsmtpoauthservice);
if (preg_match('/^.*-/', $keyforsupportedoauth2array)) { if (preg_match('/^.*-/', $keyforsupportedoauth2array)) {
$keyforprovider = preg_replace('/^.*-/', '', $keyforsupportedoauth2array); $keyforprovider = preg_replace('/^.*-/', '', $keyforsupportedoauth2array);
@ -1131,6 +1141,10 @@ class CMailFile
} }
dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR); dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
$res = false; $res = false;
if (!empty($conf->global->MAIN_MAIL_DEBUG)) {
$this->save_dump_mail_in_err();
}
} else { } else {
dol_syslog("CMailFile::sendfile: mail end success", LOG_DEBUG); dol_syslog("CMailFile::sendfile: mail end success", LOG_DEBUG);
} }
@ -1218,7 +1232,7 @@ class CMailFile
if (@is_writeable($dolibarr_main_data_root)) { // Avoid fatal error on fopen with open_basedir if (@is_writeable($dolibarr_main_data_root)) { // Avoid fatal error on fopen with open_basedir
$outputfile = $dolibarr_main_data_root."/dolibarr_mail.log"; $outputfile = $dolibarr_main_data_root."/dolibarr_mail.log";
$fp = fopen($outputfile, "w"); $fp = fopen($outputfile, "w"); // overwrite
if ($this->sendmode == 'mail') { if ($this->sendmode == 'mail') {
fputs($fp, $this->headers); fputs($fp, $this->headers);
@ -1235,6 +1249,25 @@ class CMailFile
} }
} }
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Save content if mail is in error
* Used for debugging.
*
* @return void
*/
public function save_dump_mail_in_err()
{
global $dolibarr_main_data_root;
if (@is_writeable($dolibarr_main_data_root)) { // Avoid fatal error on fopen with open_basedir
$srcfile = $dolibarr_main_data_root."/dolibarr_mail.log";
$destfile = $dolibarr_main_data_root."/dolibarr_mail.err";
dol_move($srcfile, $destfile, 0, 1, 0, 0);
}
}
/** /**
* Correct an uncomplete html string * Correct an uncomplete html string

View File

@ -80,6 +80,11 @@ abstract class CommonDocGenerator
*/ */
public $format; public $format;
/**
* @var string pdf, odt, etc
*/
public $type;
public $page_hauteur; public $page_hauteur;
public $page_largeur; public $page_largeur;
public $marge_gauche; public $marge_gauche;

View File

@ -900,7 +900,7 @@ abstract class CommonInvoice extends CommonObject
dol_syslog(get_class($this)."::makeStripeSepaRequest start", LOG_DEBUG); dol_syslog(get_class($this)."::makeStripeSepaRequest start", LOG_DEBUG);
if ($this->statut > self::STATUS_DRAFT && $this->paye == 0) { if ($this->statut > self::STATUS_DRAFT && $this->paye == 0) {
// Get the default payment mode for BAN payment // Get the default payment mode for BAN payment of the third party
require_once DOL_DOCUMENT_ROOT.'/societe/class/companybankaccount.class.php'; require_once DOL_DOCUMENT_ROOT.'/societe/class/companybankaccount.class.php';
$bac = new CompanyBankAccount($this->db); // table societe_rib $bac = new CompanyBankAccount($this->db); // table societe_rib
$result = $bac->fetch(0, $this->socid, 1, 'ban'); $result = $bac->fetch(0, $this->socid, 1, 'ban');
@ -974,295 +974,307 @@ abstract class CommonInvoice extends CommonObject
$amountstripe = $amountstripe * 100; $amountstripe = $amountstripe * 100;
} }
$fk_bank_account = getDolGlobalInt('STRIPE_BANK_ACCOUNT_FOR_PAYMENTS');
if (!($fk_bank_account > 0)) {
$error++;
$errorforinvoice++;
dol_syslog("Error no bank account defined for Stripe payments", LOG_ERR);
$this->errors[] = "Error bank account for Stripe payments not defined into Stripe module";
}
$this->db->begin(); $this->db->begin();
// Create a prelevement_bon // Create a prelevement_bon
$bon = new BonPrelevement($this->db); $bon = new BonPrelevement($this->db);
if (empty($obj->fk_prelevement_bons)) { if (!$error) {
// This create record into llx_prelevment_bons and update link with llx_prelevement_demande if (empty($obj->fk_prelevement_bons)) {
$nbinvoices = $bon->create(0, 0, 'real', 'ALL', '', 0, 'direct-debit', $did); // This create record into llx_prelevment_bons and update link with llx_prelevement_demande
if ($nbinvoices <= 0) { $nbinvoices = $bon->create(0, 0, 'real', 'ALL', '', 0, 'direct-debit', $did, $fk_bank_account);
if ($nbinvoices <= 0) {
$error++;
$errorforinvoice++;
dol_syslog("Error on BonPrelevement creation", LOG_ERR);
$this->errors[] = "Error on BonPrelevement creation";
}
/*
if (!$error) {
// Update the direct debit payment request of the processed request to save the id of the prelevement_bon
$sql = "UPDATE ".MAIN_DB_PREFIX."prelevement_demande SET";
$sql .= " fk_prelevement_bons = ".((int) $bon->id);
$sql .= " WHERE rowid = ".((int) $did);
$result = $this->db->query($sql);
if ($result < 0) {
$error++;
$this->errors[] = "Error on updateing fk_prelevement_bons to ".$bon->id;
}
}
*/
} else {
$error++; $error++;
$errorforinvoice++; $errorforinvoice++;
dol_syslog("Error on BonPrelevement creation", LOG_ERR); dol_syslog("Error Line already part of a bank payment order", LOG_ERR);
$this->errors[] = "Error on BonPrelevement creation"; $this->errors[] = "The line is already included into a bank payment order. Delete the bank payment order first.";
} }
/*
if (!$error) {
// Update the direct debit payment request of the processed request to save the id of the prelevement_bon
$sql = "UPDATE ".MAIN_DB_PREFIX."prelevement_demande SET";
$sql .= " fk_prelevement_bons = ".((int) $bon->id);
$sql .= " WHERE rowid = ".((int) $did);
$result = $this->db->query($sql);
if ($result < 0) {
$error++;
$this->errors[] = "Error on updateing fk_prelevement_bons to ".$bon->id;
}
}
*/
} else {
$error++;
$errorforinvoice++;
dol_syslog("Error Line already part of a bank payment order", LOG_ERR);
$this->errors[] = "The line is already included into a bank payment order. Delete the bank payment order first.";
} }
if (!$error && $amountstripe > 0) { if (!$error) {
try { if ($amountstripe > 0) {
//var_dump($companypaymentmode); try {
dol_syslog("We will try to pay with companypaymentmodeid=" . $companypaymentmode->id . " stripe_card_ref=" . $companypaymentmode->stripe_card_ref . " mode=" . $companypaymentmode->status, LOG_DEBUG); //var_dump($companypaymentmode);
dol_syslog("We will try to pay with companypaymentmodeid=" . $companypaymentmode->id . " stripe_card_ref=" . $companypaymentmode->stripe_card_ref . " mode=" . $companypaymentmode->status, LOG_DEBUG);
$thirdparty = new Societe($this->db); $thirdparty = new Societe($this->db);
$resultthirdparty = $thirdparty->fetch($this->socid); $resultthirdparty = $thirdparty->fetch($this->socid);
include_once DOL_DOCUMENT_ROOT . '/stripe/class/stripe.class.php'; // This include the include of htdocs/stripe/config.php include_once DOL_DOCUMENT_ROOT . '/stripe/class/stripe.class.php'; // This include the include of htdocs/stripe/config.php
// So it inits or erases the $stripearrayofkeysbyenv // So it inits or erases the $stripearrayofkeysbyenv
$stripe = new Stripe($this->db); $stripe = new Stripe($this->db);
dol_syslog("makeStripeSepaRequest Current Stripe environment is " . $stripearrayofkeysbyenv[$servicestatus]['publishable_key']); dol_syslog("makeStripeSepaRequest Current Stripe environment is " . $stripearrayofkeysbyenv[$servicestatus]['publishable_key']);
$stripearrayofkeys = $stripearrayofkeysbyenv[$servicestatus]; $stripearrayofkeys = $stripearrayofkeysbyenv[$servicestatus];
\Stripe\Stripe::setApiKey($stripearrayofkeys['secret_key']); \Stripe\Stripe::setApiKey($stripearrayofkeys['secret_key']);
dol_syslog("makeStripeSepaRequest get stripe connet account", LOG_DEBUG); dol_syslog("makeStripeSepaRequest get stripe connet account", LOG_DEBUG);
$stripeacc = $stripe->getStripeAccount($service, $this->socid); // Get Stripe OAuth connect account if it exists (no network access here) $stripeacc = $stripe->getStripeAccount($service, $this->socid); // Get Stripe OAuth connect account if it exists (no network access here)
dol_syslog("makeStripeSepaRequest get stripe connect account return " . json_encode($stripeacc), LOG_DEBUG); dol_syslog("makeStripeSepaRequest get stripe connect account return " . json_encode($stripeacc), LOG_DEBUG);
$customer = $stripe->customerStripe($thirdparty, $stripeacc, $servicestatus, 0); $customer = $stripe->customerStripe($thirdparty, $stripeacc, $servicestatus, 0);
if (empty($customer) && !empty($stripe->error)) { if (empty($customer) && !empty($stripe->error)) {
$this->errors[] = $stripe->error; $this->errors[] = $stripe->error;
} }
// $nbhoursbetweentries = (empty($conf->global->SELLYOURSAAS_NBHOURSBETWEENTRIES) ? 49 : $conf->global->SELLYOURSAAS_NBHOURSBETWEENTRIES); // Must have more that 48 hours + 1 between each try (so 1 try every 3 daily batch) // $nbhoursbetweentries = (empty($conf->global->SELLYOURSAAS_NBHOURSBETWEENTRIES) ? 49 : $conf->global->SELLYOURSAAS_NBHOURSBETWEENTRIES); // Must have more that 48 hours + 1 between each try (so 1 try every 3 daily batch)
// $nbdaysbeforeendoftries = (empty($conf->global->SELLYOURSAAS_NBDAYSBEFOREENDOFTRIES) ? 35 : $conf->global->SELLYOURSAAS_NBDAYSBEFOREENDOFTRIES); // $nbdaysbeforeendoftries = (empty($conf->global->SELLYOURSAAS_NBDAYSBEFOREENDOFTRIES) ? 35 : $conf->global->SELLYOURSAAS_NBDAYSBEFOREENDOFTRIES);
$postactionmessages = []; $postactionmessages = [];
if ($resultthirdparty > 0 && !empty($customer)) { if ($resultthirdparty > 0 && !empty($customer)) {
if (!$error) { // Payment was not canceled if (!$error) { // Payment was not canceled
$sepaMode = false; $sepaMode = false;
$stripecard = null; $stripecard = null;
if ($companypaymentmode->type == 'ban') { if ($companypaymentmode->type == 'ban') {
$sepaMode = true; $sepaMode = true;
// Check into societe_rib if a payment mode for Stripe and ban payment exists // Check into societe_rib if a payment mode for Stripe and ban payment exists
// To make a Stripe SEPA payment request, we must have the payment mode source already saved into societe_rib and retreived with ->sepaStripe // To make a Stripe SEPA payment request, we must have the payment mode source already saved into societe_rib and retreived with ->sepaStripe
// The payment mode source is created when we create the bank account on Stripe with paymentmodes.php?action=create // The payment mode source is created when we create the bank account on Stripe with paymentmodes.php?action=create
$stripecard = $stripe->sepaStripe($customer, $companypaymentmode, $stripeacc, $servicestatus, 0); $stripecard = $stripe->sepaStripe($customer, $companypaymentmode, $stripeacc, $servicestatus, 0);
}
if ($stripecard) { // Can be src_... (for sepa) or pm_... (new card mode). Note that card_... (old card mode) should not happen here.
$FULLTAG = 'DID='.$did.'-INV=' . $this->id . '-CUS=' . $thirdparty->id;
$description = 'Stripe payment from makeStripeSepaRequest: ' . $FULLTAG . ' did='.$did.' ref=' . $this->ref;
$stripefailurecode = '';
$stripefailuremessage = '';
$stripefailuredeclinecode = '';
// Using new SCA method
dol_syslog("* Create payment on SEPA " . $stripecard->id . ", amounttopay=" . $amounttopay . ", amountstripe=" . $amountstripe . ", FULLTAG=" . $FULLTAG, LOG_DEBUG);
// Create payment intent and charge payment (confirmnow = true)
$paymentintent = $stripe->getPaymentIntent($amounttopay, $currency, $FULLTAG, $description, $this, $customer->id, $stripeacc, $servicestatus, 0, 'automatic', true, $stripecard->id, 1, 1, $did);
$charge = new stdClass();
if ($paymentintent->status === 'succeeded' || $paymentintent->status === 'processing') {
$charge->status = 'ok';
$charge->id = $paymentintent->id;
$charge->customer = $customer->id;
} elseif ($paymentintent->status === 'requires_action') {
//paymentintent->status may be => 'requires_action' (no error in such a case)
dol_syslog(var_export($paymentintent, true), LOG_DEBUG);
$charge->status = 'failed';
$charge->customer = $customer->id;
$charge->failure_code = $stripe->code;
$charge->failure_message = $stripe->error;
$charge->failure_declinecode = $stripe->declinecode;
$stripefailurecode = $stripe->code;
$stripefailuremessage = 'Action required. Contact the support at ';// . $conf->global->SELLYOURSAAS_MAIN_EMAIL;
$stripefailuredeclinecode = $stripe->declinecode;
} else {
dol_syslog(var_export($paymentintent, true), LOG_DEBUG);
$charge->status = 'failed';
$charge->customer = $customer->id;
$charge->failure_code = $stripe->code;
$charge->failure_message = $stripe->error;
$charge->failure_declinecode = $stripe->declinecode;
$stripefailurecode = $stripe->code;
$stripefailuremessage = $stripe->error;
$stripefailuredeclinecode = $stripe->declinecode;
} }
//var_dump("stripefailurecode=".$stripefailurecode." stripefailuremessage=".$stripefailuremessage." stripefailuredeclinecode=".$stripefailuredeclinecode); if ($stripecard) { // Can be src_... (for sepa) or pm_... (new card mode). Note that card_... (old card mode) should not happen here.
//exit; $FULLTAG = 'DID='.$did.'-INV=' . $this->id . '-CUS=' . $thirdparty->id;
$description = 'Stripe payment from makeStripeSepaRequest: ' . $FULLTAG . ' did='.$did.' ref=' . $this->ref;
$stripefailurecode = '';
$stripefailuremessage = '';
$stripefailuredeclinecode = '';
// Return $charge = array('id'=>'ch_XXXX', 'status'=>'succeeded|pending|failed', 'failure_code'=>, 'failure_message'=>...) // Using new SCA method
if (empty($charge) || $charge->status == 'failed') { dol_syslog("* Create payment on SEPA " . $stripecard->id . ", amounttopay=" . $amounttopay . ", amountstripe=" . $amountstripe . ", FULLTAG=" . $FULLTAG, LOG_DEBUG);
dol_syslog('Failed to charge payment mode ' . $stripecard->id . ' stripefailurecode=' . $stripefailurecode . ' stripefailuremessage=' . $stripefailuremessage . ' stripefailuredeclinecode=' . $stripefailuredeclinecode, LOG_WARNING);
// Save a stripe payment was in error // Create payment intent and charge payment (confirmnow = true)
$this->stripechargeerror++; $paymentintent = $stripe->getPaymentIntent($amounttopay, $currency, $FULLTAG, $description, $this, $customer->id, $stripeacc, $servicestatus, 0, 'automatic', true, $stripecard->id, 1, 1, $did);
$error++; $charge = new stdClass();
$errorforinvoice++;
$errmsg = $langs->trans("FailedToChargeCard"); if ($paymentintent->status === 'succeeded' || $paymentintent->status === 'processing') {
if (!empty($charge)) { $charge->status = 'ok';
if ($stripefailuredeclinecode == 'authentication_required') { $charge->id = $paymentintent->id;
$errauthenticationmessage = $langs->trans("ErrSCAAuthentication"); $charge->customer = $customer->id;
$errmsg = $errauthenticationmessage; } elseif ($paymentintent->status === 'requires_action') {
} elseif (in_array($stripefailuredeclinecode, ['insufficient_funds', 'generic_decline'])) { //paymentintent->status may be => 'requires_action' (no error in such a case)
$errmsg .= ': ' . $charge->failure_code; dol_syslog(var_export($paymentintent, true), LOG_DEBUG);
$errmsg .= ($charge->failure_message ? ' - ' : '') . ' ' . $charge->failure_message;
if (empty($stripefailurecode)) { $charge->status = 'failed';
$stripefailurecode = $charge->failure_code; $charge->customer = $customer->id;
} $charge->failure_code = $stripe->code;
if (empty($stripefailuremessage)) { $charge->failure_message = $stripe->error;
$stripefailuremessage = $charge->failure_message; $charge->failure_declinecode = $stripe->declinecode;
} $stripefailurecode = $stripe->code;
} else { $stripefailuremessage = 'Action required. Contact the support at ';// . $conf->global->SELLYOURSAAS_MAIN_EMAIL;
$errmsg .= ': failure_code=' . $charge->failure_code; $stripefailuredeclinecode = $stripe->declinecode;
$errmsg .= ($charge->failure_message ? ' - ' : '') . ' failure_message=' . $charge->failure_message;
if (empty($stripefailurecode)) {
$stripefailurecode = $charge->failure_code;
}
if (empty($stripefailuremessage)) {
$stripefailuremessage = $charge->failure_message;
}
}
} else { } else {
$errmsg .= ': ' . $stripefailurecode . ' - ' . $stripefailuremessage; dol_syslog(var_export($paymentintent, true), LOG_DEBUG);
$errmsg .= ($stripefailuredeclinecode ? ' - ' . $stripefailuredeclinecode : '');
$charge->status = 'failed';
$charge->customer = $customer->id;
$charge->failure_code = $stripe->code;
$charge->failure_message = $stripe->error;
$charge->failure_declinecode = $stripe->declinecode;
$stripefailurecode = $stripe->code;
$stripefailuremessage = $stripe->error;
$stripefailuredeclinecode = $stripe->declinecode;
} }
$description = 'Stripe payment ERROR from makeStripeSepaRequest: ' . $FULLTAG; //var_dump("stripefailurecode=".$stripefailurecode." stripefailuremessage=".$stripefailuremessage." stripefailuredeclinecode=".$stripefailuredeclinecode);
$postactionmessages[] = $errmsg . ' (' . $stripearrayofkeys['publishable_key'] . ')'; //exit;
$this->errors[] = $errmsg;
// Return $charge = array('id'=>'ch_XXXX', 'status'=>'succeeded|pending|failed', 'failure_code'=>, 'failure_message'=>...)
if (empty($charge) || $charge->status == 'failed') {
dol_syslog('Failed to charge payment mode ' . $stripecard->id . ' stripefailurecode=' . $stripefailurecode . ' stripefailuremessage=' . $stripefailuremessage . ' stripefailuredeclinecode=' . $stripefailuredeclinecode, LOG_WARNING);
// Save a stripe payment was in error
$this->stripechargeerror++;
$error++;
$errorforinvoice++;
$errmsg = $langs->trans("FailedToChargeCard");
if (!empty($charge)) {
if ($stripefailuredeclinecode == 'authentication_required') {
$errauthenticationmessage = $langs->trans("ErrSCAAuthentication");
$errmsg = $errauthenticationmessage;
} elseif (in_array($stripefailuredeclinecode, ['insufficient_funds', 'generic_decline'])) {
$errmsg .= ': ' . $charge->failure_code;
$errmsg .= ($charge->failure_message ? ' - ' : '') . ' ' . $charge->failure_message;
if (empty($stripefailurecode)) {
$stripefailurecode = $charge->failure_code;
}
if (empty($stripefailuremessage)) {
$stripefailuremessage = $charge->failure_message;
}
} else {
$errmsg .= ': failure_code=' . $charge->failure_code;
$errmsg .= ($charge->failure_message ? ' - ' : '') . ' failure_message=' . $charge->failure_message;
if (empty($stripefailurecode)) {
$stripefailurecode = $charge->failure_code;
}
if (empty($stripefailuremessage)) {
$stripefailuremessage = $charge->failure_message;
}
}
} else {
$errmsg .= ': ' . $stripefailurecode . ' - ' . $stripefailuremessage;
$errmsg .= ($stripefailuredeclinecode ? ' - ' . $stripefailuredeclinecode : '');
}
$description = 'Stripe payment ERROR from makeStripeSepaRequest: ' . $FULLTAG;
$postactionmessages[] = $errmsg . ' (' . $stripearrayofkeys['publishable_key'] . ')';
$this->errors[] = $errmsg;
} else {
dol_syslog('Successfuly request direct debit ' . $stripecard->id);
$postactionmessages[] = 'Success to request direct debit (' . $charge->id . ' with ' . $stripearrayofkeys['publishable_key'] . ')';
// Save a stripe payment was done in realy life so later we will be able to force a commit on recorded payments
// even if in batch mode (method doTakePaymentStripe), we will always make all action in one transaction with a forced commit.
$this->stripechargedone++;
// Default description used for label of event. Will be overwrite by another value later.
$description = 'Stripe payment request OK (' . $charge->id . ') from makeStripeSepaRequest: ' . $FULLTAG;
}
$object = $this;
// Track an event
if (empty($charge) || $charge->status == 'failed') {
$actioncode = 'PAYMENT_STRIPE_KO';
$extraparams = $stripefailurecode;
$extraparams .= (($extraparams && $stripefailuremessage) ? ' - ' : '') . $stripefailuremessage;
$extraparams .= (($extraparams && $stripefailuredeclinecode) ? ' - ' : '') . $stripefailuredeclinecode;
} else {
$actioncode = 'PAYMENT_STRIPE_OK';
$extraparams = '';
}
} else { } else {
dol_syslog('Successfuly request direct debit ' . $stripecard->id); $error++;
$errorforinvoice++;
dol_syslog("No direct debit payment method found for this stripe customer " . $customer->id, LOG_WARNING);
$this->errors[] = 'Failed to get direct debit payment method for stripe customer = ' . $customer->id;
$postactionmessages[] = 'Success to request direct debit (' . $charge->id . ' with ' . $stripearrayofkeys['publishable_key'] . ')'; $description = 'Failed to find or use the payment mode - no credit card defined for the customer account';
$stripefailurecode = 'BADPAYMENTMODE';
$stripefailuremessage = 'Failed to find or use the payment mode - no credit card defined for the customer account';
$postactionmessages[] = $description . ' (' . $stripearrayofkeys['publishable_key'] . ')';
// Save a stripe payment was done in realy life so later we will be able to force a commit on recorded payments $object = $this;
// even if in batch mode (method doTakePaymentStripe), we will always make all action in one transaction with a forced commit.
$this->stripechargedone++;
// Default description used for label of event. Will be overwrite by another value later.
$description = 'Stripe payment request OK (' . $charge->id . ') from makeStripeSepaRequest: ' . $FULLTAG;
}
$object = $this;
// Track an event
if (empty($charge) || $charge->status == 'failed') {
$actioncode = 'PAYMENT_STRIPE_KO'; $actioncode = 'PAYMENT_STRIPE_KO';
$extraparams = $stripefailurecode;
$extraparams .= (($extraparams && $stripefailuremessage) ? ' - ' : '') . $stripefailuremessage;
$extraparams .= (($extraparams && $stripefailuredeclinecode) ? ' - ' : '') . $stripefailuredeclinecode;
} else {
$actioncode = 'PAYMENT_STRIPE_OK';
$extraparams = ''; $extraparams = '';
} }
} else { } else {
$error++; // If error because payment was canceled for a logical reason, we do nothing (no event added)
$errorforinvoice++; $description = '';
dol_syslog("No direct debit payment method found for this stripe customer " . $customer->id, LOG_WARNING); $stripefailurecode = '';
$this->errors[] = 'Failed to get direct debit payment method for stripe customer = ' . $customer->id; $stripefailuremessage = '';
$description = 'Failed to find or use the payment mode - no credit card defined for the customer account';
$stripefailurecode = 'BADPAYMENTMODE';
$stripefailuremessage = 'Failed to find or use the payment mode - no credit card defined for the customer account';
$postactionmessages[] = $description . ' (' . $stripearrayofkeys['publishable_key'] . ')';
$object = $this; $object = $this;
$actioncode = 'PAYMENT_STRIPE_KO'; $actioncode = '';
$extraparams = ''; $extraparams = '';
} }
} else { } else { // Else of the if ($resultthirdparty > 0 && ! empty($customer)) {
// If error because payment was canceled for a logical reason, we do nothing (no event added) if ($resultthirdparty <= 0) {
$description = ''; dol_syslog('SellYourSaasUtils Failed to load customer for thirdparty_id = ' . $thirdparty->id, LOG_WARNING);
$stripefailurecode = ''; $this->errors[] = 'Failed to load customer for thirdparty_id = ' . $thirdparty->id;
$stripefailuremessage = ''; } else { // $customer stripe not found
dol_syslog('SellYourSaasUtils Failed to get Stripe customer id for thirdparty_id = ' . $thirdparty->id . " in mode " . $servicestatus . " in Stripe env " . $stripearrayofkeysbyenv[$servicestatus]['publishable_key'], LOG_WARNING);
$this->errors[] = 'Failed to get Stripe customer id for thirdparty_id = ' . $thirdparty->id . " in mode " . $servicestatus . " in Stripe env " . $stripearrayofkeysbyenv[$servicestatus]['publishable_key'];
}
$error++;
$errorforinvoice++;
$description = 'Failed to find or use your payment mode (no payment mode for this customer id)';
$stripefailurecode = 'BADPAYMENTMODE';
$stripefailuremessage = 'Failed to find or use your payment mode (no payment mode for this customer id)';
$postactionmessages = [];
$object = $this; $object = $this;
$actioncode = ''; $actioncode = 'PAYMENT_STRIPE_KO';
$extraparams = ''; $extraparams = '';
} }
} else { // Else of the if ($resultthirdparty > 0 && ! empty($customer)) {
if ($resultthirdparty <= 0) { if ($description) {
dol_syslog('SellYourSaasUtils Failed to load customer for thirdparty_id = ' . $thirdparty->id, LOG_WARNING); dol_syslog("* Record event for credit transfer or direct debit request result - " . $description);
$this->errors[] = 'Failed to load customer for thirdparty_id = ' . $thirdparty->id; require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
} else { // $customer stripe not found
dol_syslog('SellYourSaasUtils Failed to get Stripe customer id for thirdparty_id = ' . $thirdparty->id . " in mode " . $servicestatus . " in Stripe env " . $stripearrayofkeysbyenv[$servicestatus]['publishable_key'], LOG_WARNING); // Insert record of payment (success or error)
$this->errors[] = 'Failed to get Stripe customer id for thirdparty_id = ' . $thirdparty->id . " in mode " . $servicestatus . " in Stripe env " . $stripearrayofkeysbyenv[$servicestatus]['publishable_key']; $actioncomm = new ActionComm($this->db);
$actioncomm->type_code = 'AC_OTH_AUTO'; // Type of event ('AC_OTH', 'AC_OTH_AUTO', 'AC_XXX'...)
$actioncomm->code = 'AC_' . $actioncode;
$actioncomm->label = $description;
$actioncomm->note_private = join(",\n", $postactionmessages);
$actioncomm->fk_project = $this->fk_project;
$actioncomm->datep = $now;
$actioncomm->datef = $now;
$actioncomm->percentage = -1; // Not applicable
$actioncomm->socid = $thirdparty->id;
$actioncomm->contactid = 0;
$actioncomm->authorid = $user->id; // User saving action
$actioncomm->userownerid = $user->id; // Owner of action
// Fields when action is a real email (content is already into note)
/*$actioncomm->email_msgid = $object->email_msgid;
$actioncomm->email_from = $object->email_from;
$actioncomm->email_sender= $object->email_sender;
$actioncomm->email_to = $object->email_to;
$actioncomm->email_tocc = $object->email_tocc;
$actioncomm->email_tobcc = $object->email_tobcc;
$actioncomm->email_subject = $object->email_subject;
$actioncomm->errors_to = $object->errors_to;*/
$actioncomm->fk_element = $this->id;
$actioncomm->elementtype = $this->element;
$actioncomm->extraparams = dol_trunc($extraparams, 250);
$actioncomm->create($user);
} }
$this->description = $description;
$this->postactionmessages = $postactionmessages;
} catch (Exception $e) {
$error++; $error++;
$errorforinvoice++; $errorforinvoice++;
dol_syslog('Error ' . $e->getMessage(), LOG_ERR);
$description = 'Failed to find or use your payment mode (no payment mode for this customer id)'; $this->errors[] = 'Error ' . $e->getMessage();
$stripefailurecode = 'BADPAYMENTMODE';
$stripefailuremessage = 'Failed to find or use your payment mode (no payment mode for this customer id)';
$postactionmessages = [];
$object = $this;
$actioncode = 'PAYMENT_STRIPE_KO';
$extraparams = '';
} }
} else { // If remain to pay is null
if ($description) {
dol_syslog("* Record event for credit transfer or direct debit request result - " . $description);
require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
// Insert record of payment (success or error)
$actioncomm = new ActionComm($this->db);
$actioncomm->type_code = 'AC_OTH_AUTO'; // Type of event ('AC_OTH', 'AC_OTH_AUTO', 'AC_XXX'...)
$actioncomm->code = 'AC_' . $actioncode;
$actioncomm->label = $description;
$actioncomm->note_private = join(",\n", $postactionmessages);
$actioncomm->fk_project = $this->fk_project;
$actioncomm->datep = $now;
$actioncomm->datef = $now;
$actioncomm->percentage = -1; // Not applicable
$actioncomm->socid = $thirdparty->id;
$actioncomm->contactid = 0;
$actioncomm->authorid = $user->id; // User saving action
$actioncomm->userownerid = $user->id; // Owner of action
// Fields when action is a real email (content is already into note)
/*$actioncomm->email_msgid = $object->email_msgid;
$actioncomm->email_from = $object->email_from;
$actioncomm->email_sender= $object->email_sender;
$actioncomm->email_to = $object->email_to;
$actioncomm->email_tocc = $object->email_tocc;
$actioncomm->email_tobcc = $object->email_tobcc;
$actioncomm->email_subject = $object->email_subject;
$actioncomm->errors_to = $object->errors_to;*/
$actioncomm->fk_element = $this->id;
$actioncomm->elementtype = $this->element;
$actioncomm->extraparams = dol_trunc($extraparams, 250);
$actioncomm->create($user);
}
$this->description = $description;
$this->postactionmessages = $postactionmessages;
} catch (Exception $e) {
$error++; $error++;
$errorforinvoice++; $errorforinvoice++;
dol_syslog('Error ' . $e->getMessage(), LOG_ERR); dol_syslog("Remain to pay is null for the invoice " . $this->id . " " . $this->ref . ". Why is the invoice not classified 'Paid' ?", LOG_WARNING);
$this->errors[] = 'Error ' . $e->getMessage(); $this->errors[] = "Remain to pay is null for the invoice " . $this->id . " " . $this->ref . ". Why is the invoice not classified 'Paid' ?";
} }
} else { // If remain to pay is null
$error++;
$errorforinvoice++;
dol_syslog("Remain to pay is null for the invoice " . $this->id . " " . $this->ref . ". Why is the invoice not classified 'Paid' ?", LOG_WARNING);
$this->errors[] = "Remain to pay is null for the invoice " . $this->id . " " . $this->ref . ". Why is the invoice not classified 'Paid' ?";
} }
// Set status of the order to "Transferred" with method 'api' // Set status of the order to "Transferred" with method 'api'

View File

@ -46,6 +46,12 @@ class FileUpload
global $db, $conf; global $db, $conf;
global $object; global $object;
global $hookmanager; global $hookmanager;
// Feature not enabled. Warning feature not used and not secured so disabled.
if (!getDolGlobalInt('MAIN_USE_JQUERY_FILEUPLOAD')) {
return;
}
$hookmanager->initHooks(array('fileupload')); $hookmanager->initHooks(array('fileupload'));
$this->fk_element = $fk_element; $this->fk_element = $fk_element;
@ -238,6 +244,10 @@ class FileUpload
*/ */
protected function getFileObject($file_name) protected function getFileObject($file_name)
{ {
if (!getDolGlobalInt('MAIN_USE_JQUERY_FILEUPLOAD')) {
return;
}
$file_path = $this->options['upload_dir'].$file_name; $file_path = $this->options['upload_dir'].$file_name;
if (is_file($file_path) && $file_name[0] !== '.') { if (is_file($file_path) && $file_name[0] !== '.') {
$file = new stdClass(); $file = new stdClass();
@ -278,6 +288,10 @@ class FileUpload
{ {
global $maxwidthmini, $maxheightmini; global $maxwidthmini, $maxheightmini;
if (!getDolGlobalInt('MAIN_USE_JQUERY_FILEUPLOAD')) {
return;
}
$file_path = $this->options['upload_dir'].$file_name; $file_path = $this->options['upload_dir'].$file_name;
$new_file_path = $options['upload_dir'].$file_name; $new_file_path = $options['upload_dir'].$file_name;
@ -309,6 +323,10 @@ class FileUpload
*/ */
protected function validate($uploaded_file, $file, $error, $index) protected function validate($uploaded_file, $file, $error, $index)
{ {
if (!getDolGlobalInt('MAIN_USE_JQUERY_FILEUPLOAD')) {
return;
}
if ($error) { if ($error) {
$file->error = $error; $file->error = $error;
return false; return false;
@ -399,8 +417,8 @@ class FileUpload
// Also remove control characters and spaces (\x00..\x20) around the filename: // Also remove control characters and spaces (\x00..\x20) around the filename:
$file_name = trim(basename(stripslashes($name)), ".\x00..\x20"); $file_name = trim(basename(stripslashes($name)), ".\x00..\x20");
// Add missing file extension for known image types: // Add missing file extension for known image types:
if (strpos($file_name, '.') === false && $matches = array();
preg_match('/^image\/(gif|jpe?g|png)/', $type, $matches)) { if (strpos($file_name, '.') === false && preg_match('/^image\/(gif|jpe?g|png)/', $type, $matches)) {
$file_name .= '.'.$matches[1]; $file_name .= '.'.$matches[1];
} }
if ($this->options['discard_aborted_uploads']) { if ($this->options['discard_aborted_uploads']) {
@ -424,6 +442,10 @@ class FileUpload
*/ */
protected function handleFileUpload($uploaded_file, $name, $size, $type, $error, $index) protected function handleFileUpload($uploaded_file, $name, $size, $type, $error, $index)
{ {
if (!getDolGlobalInt('MAIN_USE_JQUERY_FILEUPLOAD')) {
return;
}
$file = new stdClass(); $file = new stdClass();
$file->name = $this->trimFileName($name, $type, $index); $file->name = $this->trimFileName($name, $type, $index);
$file->mime = dol_mimetype($file->name, '', 2); $file->mime = dol_mimetype($file->name, '', 2);
@ -470,6 +492,10 @@ class FileUpload
*/ */
public function get() public function get()
{ {
if (!getDolGlobalInt('MAIN_USE_JQUERY_FILEUPLOAD')) {
return;
}
$file_name = isset($_REQUEST['file']) ? $file_name = isset($_REQUEST['file']) ?
basename(stripslashes($_REQUEST['file'])) : null; basename(stripslashes($_REQUEST['file'])) : null;
if ($file_name) { if ($file_name) {
@ -488,6 +514,10 @@ class FileUpload
*/ */
public function post() public function post()
{ {
if (!getDolGlobalInt('MAIN_USE_JQUERY_FILEUPLOAD')) {
return;
}
if (isset($_REQUEST['_method']) && $_REQUEST['_method'] === 'DELETE') { if (isset($_REQUEST['_method']) && $_REQUEST['_method'] === 'DELETE') {
return $this->delete(); return $this->delete();
} }
@ -543,6 +573,10 @@ class FileUpload
*/ */
public function delete() public function delete()
{ {
if (!getDolGlobalInt('MAIN_USE_JQUERY_FILEUPLOAD')) {
return;
}
$file_name = isset($_REQUEST['file']) ? $file_name = isset($_REQUEST['file']) ?
basename(stripslashes($_REQUEST['file'])) : null; basename(stripslashes($_REQUEST['file'])) : null;
$file_path = $this->options['upload_dir'].$file_name; $file_path = $this->options['upload_dir'].$file_name;

View File

@ -94,7 +94,7 @@ class Form
* @param string $text Text of label or key to translate * @param string $text Text of label or key to translate
* @param string $htmlname Name of select field ('edit' prefix will be added) * @param string $htmlname Name of select field ('edit' prefix will be added)
* @param string $preselected Value to show/edit (not used in this function) * @param string $preselected Value to show/edit (not used in this function)
* @param object $object Object * @param object $object Object (on the page we show)
* @param boolean $perm Permission to allow button to edit parameter. Set it to 0 to have a not edited field. * @param boolean $perm Permission to allow button to edit parameter. Set it to 0 to have a not edited field.
* @param string $typeofdata Type of data ('string' by default, 'email', 'amount:99', 'numeric:99', 'text' or 'textarea:rows:cols', 'datepicker' ('day' do not work, don't know why), 'dayhour' or 'datehourpicker' 'checkbox:ckeditor:dolibarr_zzz:width:height:savemethod:1:rows:cols', 'select;xxx[:class]'...) * @param string $typeofdata Type of data ('string' by default, 'email', 'amount:99', 'numeric:99', 'text' or 'textarea:rows:cols', 'datepicker' ('day' do not work, don't know why), 'dayhour' or 'datehourpicker' 'checkbox:ckeditor:dolibarr_zzz:width:height:savemethod:1:rows:cols', 'select;xxx[:class]'...)
* @param string $moreparam More param to add on a href URL. * @param string $moreparam More param to add on a href URL.
@ -194,7 +194,7 @@ class Form
* @param string $text Text of label (not used in this function) * @param string $text Text of label (not used in this function)
* @param string $htmlname Name of select field * @param string $htmlname Name of select field
* @param string $value Value to show/edit * @param string $value Value to show/edit
* @param object $object Object * @param object $object Object (that we want to show)
* @param boolean $perm Permission to allow button to edit parameter * @param boolean $perm Permission to allow button to edit parameter
* @param string $typeofdata Type of data ('string' by default, 'email', 'amount:99', 'numeric:99', 'text' or 'textarea:rows:cols%', 'datepicker' ('day' do not work, don't know why), 'dayhour' or 'datehourpicker', 'ckeditor:dolibarr_zzz:width:height:savemethod:toolbarstartexpanded:rows:cols', 'select;xkey:xval,ykey:yval,...') * @param string $typeofdata Type of data ('string' by default, 'email', 'amount:99', 'numeric:99', 'text' or 'textarea:rows:cols%', 'datepicker' ('day' do not work, don't know why), 'dayhour' or 'datehourpicker', 'ckeditor:dolibarr_zzz:width:height:savemethod:toolbarstartexpanded:rows:cols', 'select;xkey:xval,ykey:yval,...')
* @param string $editvalue When in edit mode, use this value as $value instead of value (for example, you can provide here a formated price instead of numeric value). Use '' to use same than $value * @param string $editvalue When in edit mode, use this value as $value instead of value (for example, you can provide here a formated price instead of numeric value). Use '' to use same than $value
@ -303,6 +303,8 @@ class Form
$arraylist[$tmpkey] = $tmp[1]; $arraylist[$tmpkey] = $tmp[1];
} }
$ret .= $this->selectarray($htmlname, $arraylist, $value); $ret .= $this->selectarray($htmlname, $arraylist, $value);
} elseif (preg_match('/^link/', $typeofdata)) {
// TODO Not yet implemented. See code for extrafields
} elseif (preg_match('/^ckeditor/', $typeofdata)) { } elseif (preg_match('/^ckeditor/', $typeofdata)) {
$tmp = explode(':', $typeofdata); // Example: ckeditor:dolibarr_zzz:width:height:savemethod:toolbarstartexpanded:rows:cols:uselocalbrowser $tmp = explode(':', $typeofdata); // Example: ckeditor:dolibarr_zzz:width:height:savemethod:toolbarstartexpanded:rows:cols:uselocalbrowser
require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';

View File

@ -41,7 +41,7 @@ class FormCategory extends Form
* @param string $showempty 1 or 'string' to add an empty entry * @param string $showempty 1 or 'string' to add an empty entry
* @return string A HTML filter box (Note: selected results can get with GETPOST("search_category_".$type."_list")) * @return string A HTML filter box (Note: selected results can get with GETPOST("search_category_".$type."_list"))
*/ */
public function getFilterBox($type, array $preSelected, $morecss = "minwidth300 widthcentpercentminusx", $searchCategoryProductOperator = -1, $multiselect = 1, $nocateg = 1, $showempty = '') public function getFilterBox($type, array $preSelected, $morecss = "minwidth300imp widthcentpercentminusx", $searchCategoryProductOperator = -1, $multiselect = 1, $nocateg = 1, $showempty = '')
{ {
global $langs, $db; global $langs, $db;

View File

@ -908,7 +908,7 @@ class FormCompany extends Form
* @param string $morecss More css * @param string $morecss More css
* @return string HTML string with prof id * @return string HTML string with prof id
*/ */
public function get_input_id_prof($idprof, $htmlname, $preselected, $country_code, $morecss = 'maxwidth100onsmartphone quatrevingtpercent') public function get_input_id_prof($idprof, $htmlname, $preselected, $country_code, $morecss = 'maxwidth200')
{ {
// phpcs:enable // phpcs:enable
global $conf, $langs, $hookmanager; global $conf, $langs, $hookmanager;

View File

@ -1431,7 +1431,7 @@ class FormTicket
$res = $ticketstat->fetch('', '', $this->track_id); $res = $ticketstat->fetch('', '', $this->track_id);
print '<tr><td></td><td>'; print '<tr><td></td><td>';
$checkbox_selected = (GETPOST('send_email') == "1" ? ' checked' : ($conf->global->TICKETS_MESSAGE_FORCE_MAIL?'checked':'')); $checkbox_selected = (GETPOST('send_email') == "1" ? ' checked' : (getDolGlobalInt('TICKETS_MESSAGE_FORCE_MAIL')?'checked':''));
print '<input type="checkbox" name="send_email" value="1" id="send_msg_email" '.$checkbox_selected.'/> '; print '<input type="checkbox" name="send_email" value="1" id="send_msg_email" '.$checkbox_selected.'/> ';
print '<label for="send_msg_email">'.$langs->trans('SendMessageByEmail').'</label>'; print '<label for="send_msg_email">'.$langs->trans('SendMessageByEmail').'</label>';
$texttooltip = $langs->trans("TicketMessageSendEmailHelp", '{s1}'); $texttooltip = $langs->trans("TicketMessageSendEmailHelp", '{s1}');
@ -1463,7 +1463,7 @@ class FormTicket
// Subject // Subject
print '<tr class="email_line"><td>'.$langs->trans('Subject').'</td>'; print '<tr class="email_line"><td>'.$langs->trans('Subject').'</td>';
print '<td><input type="text" class="text minwidth500" name="subject" value="['.$conf->global->MAIN_INFO_SOCIETE_NOM.' - '.$langs->trans("Ticket").' '.$ticketstat->ref.'] '.$langs->trans('TicketNewMessage').'" />'; print '<td><input type="text" class="text minwidth500" name="subject" value="['.getDolGlobalString('MAIN_INFO_SOCIETE_NOM').' - '.$langs->trans("Ticket").' '.$ticketstat->ref.'] '.$langs->trans('TicketNewMessage').'" />';
print '</td></tr>'; print '</td></tr>';
// Recipients / adressed-to // Recipients / adressed-to
@ -1497,8 +1497,8 @@ class FormTicket
} }
} }
if ($conf->global->TICKET_NOTIFICATION_ALSO_MAIN_ADDRESS) { if (getDolGlobalInt('TICKET_NOTIFICATION_ALSO_MAIN_ADDRESS')) {
$sendto[] = $conf->global->TICKET_NOTIFICATION_EMAIL_TO.' <small class="opacitymedium">(generic email)</small>'; $sendto[] = getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO').' <small class="opacitymedium">(generic email)</small>';
} }
// Print recipient list // Print recipient list

View File

@ -71,9 +71,7 @@ class Notify
'ORDER_VALIDATE', 'ORDER_VALIDATE',
'PROPAL_VALIDATE', 'PROPAL_VALIDATE',
'PROPAL_CLOSE_SIGNED', 'PROPAL_CLOSE_SIGNED',
'PROPAL_CLOSE_SIGNED_WEB',
'PROPAL_CLOSE_REFUSED', 'PROPAL_CLOSE_REFUSED',
'PROPAL_CLOSE_REFUSED_WEB',
'FICHINTER_VALIDATE', 'FICHINTER_VALIDATE',
'FICHINTER_ADD_CONTACT', 'FICHINTER_ADD_CONTACT',
'ORDER_SUPPLIER_VALIDATE', 'ORDER_SUPPLIER_VALIDATE',
@ -359,6 +357,7 @@ class Notify
global $dolibarr_main_url_root; global $dolibarr_main_url_root;
global $action; global $action;
// Complete the array Notify::$arrayofnotifsupported
if (!is_object($hookmanager)) { if (!is_object($hookmanager)) {
include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php'; include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
$hookmanager = new HookManager($this->db); $hookmanager = new HookManager($this->db);
@ -373,13 +372,14 @@ class Notify
} }
} }
// If the trigger code is not managed by the Notification module
if (!in_array($notifcode, Notify::$arrayofnotifsupported)) { if (!in_array($notifcode, Notify::$arrayofnotifsupported)) {
return 0; return 0;
} }
include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
dol_syslog(get_class($this)."::send notifcode=".$notifcode.", object=".$object->id); dol_syslog(get_class($this)."::send notifcode=".$notifcode.", object id=".$object->id);
$langs->load("other"); $langs->load("other");
@ -407,7 +407,7 @@ class Notify
// Check notification per third party // Check notification per third party
if (!empty($object->socid) && $object->socid > 0) { if (!empty($object->socid) && $object->socid > 0) {
$sql .= "SELECT 'tocontactid' as type_target, c.email, c.rowid as cid, c.lastname, c.firstname, c.default_lang,"; $sql .= "SELECT 'tocontactid' as type_target, c.email, c.rowid as cid, c.lastname, c.firstname, c.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.threshold, n.context, n.type";
$sql .= " FROM ".$this->db->prefix()."socpeople as c,"; $sql .= " FROM ".$this->db->prefix()."socpeople as c,";
$sql .= " ".$this->db->prefix()."c_action_trigger as a,"; $sql .= " ".$this->db->prefix()."c_action_trigger as a,";
$sql .= " ".$this->db->prefix()."notify_def as n,"; $sql .= " ".$this->db->prefix()."notify_def as n,";
@ -427,7 +427,7 @@ class Notify
// Check notification per user // Check notification per user
$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.threshold, n.context, n.type";
$sql .= " FROM ".$this->db->prefix()."user as c,"; $sql .= " FROM ".$this->db->prefix()."user as c,";
$sql .= " ".$this->db->prefix()."c_action_trigger as a,"; $sql .= " ".$this->db->prefix()."c_action_trigger as a,";
$sql .= " ".$this->db->prefix()."notify_def as n"; $sql .= " ".$this->db->prefix()."notify_def as n";
@ -439,6 +439,11 @@ class Notify
$sql .= " AND a.code = '".$this->db->escape($notifcode)."'"; // New usage $sql .= " AND a.code = '".$this->db->escape($notifcode)."'"; // New usage
} }
// Check notification fixed
// TODO Move part found after, into a sql here
// Loop on all notifications enabled
$result = $this->db->query($sql); $result = $this->db->query($sql);
if ($result) { if ($result) {
$num = $this->db->num_rows($result); $num = $this->db->num_rows($result);
@ -511,13 +516,9 @@ class Notify
$object_type = 'propal'; $object_type = 'propal';
$labeltouse = $conf->global->PROPAL_CLOSE_REFUSED_TEMPLATE; $labeltouse = $conf->global->PROPAL_CLOSE_REFUSED_TEMPLATE;
$mesg = $outputlangs->transnoentitiesnoconv("EMailTextProposalClosedRefused", $link); $mesg = $outputlangs->transnoentitiesnoconv("EMailTextProposalClosedRefused", $link);
break; if (!empty($object->context['closedfromonlinesignature'])) {
case 'PROPAL_CLOSE_REFUSED_WEB': $mesg .= ' - From online page';
$link = '<a href="'.$urlwithroot.'/comm/propal/card.php?id='.$object->id.'&entity='.$object->entity.'">'.$newref.'</a>'; }
$dir_output = $conf->propal->multidir_output[$object->entity]."/".get_exdir(0, 0, 0, 1, $object, 'propal');
$object_type = 'propal';
$labeltouse = $conf->global->PROPAL_CLOSE_REFUSED_TEMPLATE;
$mesg = $outputlangs->transnoentitiesnoconv("EMailTextProposalClosedRefusedWeb", $link);
break; break;
case 'PROPAL_CLOSE_SIGNED': case 'PROPAL_CLOSE_SIGNED':
$link = '<a href="'.$urlwithroot.'/comm/propal/card.php?id='.$object->id.'&entity='.$object->entity.'">'.$newref.'</a>'; $link = '<a href="'.$urlwithroot.'/comm/propal/card.php?id='.$object->id.'&entity='.$object->entity.'">'.$newref.'</a>';
@ -525,13 +526,9 @@ class Notify
$object_type = 'propal'; $object_type = 'propal';
$labeltouse = $conf->global->PROPAL_CLOSE_SIGNED_TEMPLATE; $labeltouse = $conf->global->PROPAL_CLOSE_SIGNED_TEMPLATE;
$mesg = $outputlangs->transnoentitiesnoconv("EMailTextProposalClosedSigned", $link); $mesg = $outputlangs->transnoentitiesnoconv("EMailTextProposalClosedSigned", $link);
break; if (!empty($object->context['closedfromonlinesignature'])) {
case 'PROPAL_CLOSE_SIGNED_WEB': $mesg .= ' - From online page';
$link = '<a href="'.$urlwithroot.'/comm/propal/card.php?id='.$object->id.'&entity='.$object->entity.'">'.$newref.'</a>'; }
$dir_output = $conf->propal->multidir_output[$object->entity]."/".get_exdir(0, 0, 0, 1, $object, 'propal');
$object_type = 'propal';
$labeltouse = $conf->global->PROPAL_CLOSE_SIGNED_TEMPLATE;
$mesg = $outputlangs->transnoentitiesnoconv("EMailTextProposalClosedSigned", $link);
break; break;
case 'FICHINTER_ADD_CONTACT': case 'FICHINTER_ADD_CONTACT':
$link = '<a href="'.$urlwithroot.'/fichinter/card.php?id='.$object->id.'&entity='.$object->entity.'">'.$newref.'</a>'; $link = '<a href="'.$urlwithroot.'/fichinter/card.php?id='.$object->id.'&entity='.$object->entity.'">'.$newref.'</a>';
@ -651,6 +648,23 @@ class Notify
$labeltouse = !empty($labeltouse) ? $labeltouse : ''; $labeltouse = !empty($labeltouse) ? $labeltouse : '';
// Replace keyword __SUPERVISOREMAIL__
if (preg_match('/__SUPERVISOREMAIL__/', $sendto)) {
$newval = '';
if ($user->fk_user > 0) {
$supervisoruser = new User($this->db);
$supervisoruser->fetch($user->fk_user);
if ($supervisoruser->email) {
$newval = trim(dolGetFirstLastname($supervisoruser->firstname, $supervisoruser->lastname).' <'.$supervisoruser->email.'>');
}
}
dol_syslog("Replace the __SUPERVISOREMAIL__ key into recipient email string with ".$newval);
$sendto = preg_replace('/__SUPERVISOREMAIL__/', $newval, $sendto);
$sendto = preg_replace('/,\s*,/', ',', $sendto); // in some case you can have $sendto like "email, __SUPERVISOREMAIL__ , otheremail" then you have "email, , othermail" and it's not valid
$sendto = preg_replace('/^[\s,]+/', '', $sendto); // Clean start of string
$sendto = preg_replace('/[\s,]+$/', '', $sendto); // Clean end of string
}
$parameters = array('notifcode'=>$notifcode, 'sendto'=>$sendto, 'replyto'=>$replyto, 'file'=>$filename_list, 'mimefile'=>$mimetype_list, 'filename'=>$mimefilename_list, 'outputlangs'=>$outputlangs, 'labeltouse'=>$labeltouse); $parameters = array('notifcode'=>$notifcode, 'sendto'=>$sendto, 'replyto'=>$replyto, 'file'=>$filename_list, 'mimefile'=>$mimetype_list, 'filename'=>$mimefilename_list, 'outputlangs'=>$outputlangs, 'labeltouse'=>$labeltouse);
if (!isset($action)) { if (!isset($action)) {
$action = ''; $action = '';
@ -721,6 +735,7 @@ class Notify
} }
// Check notification using fixed email // Check notification using fixed email
// TODO Move vars NOTIFICATION_FIXEDEMAIL into table llx_notify_def and inclulde the case into previous loop of sql result
if (!$error) { if (!$error) {
foreach ($conf->global as $key => $val) { foreach ($conf->global as $key => $val) {
$reg = array(); $reg = array();

View File

@ -1003,8 +1003,8 @@ function dol_move($srcfile, $destfile, $newmask = 0, $overwriteifexists = 1, $te
* @param string $srcdir Source directory * @param string $srcdir Source directory
* @param string $destdir Destination directory * @param string $destdir Destination directory
* @param int $overwriteifexists Overwrite directory if exists (1 by default) * @param int $overwriteifexists Overwrite directory if exists (1 by default)
* @param int $indexdatabase Index new file into database. * @param int $indexdatabase Index new name of files into database.
* @param int $renamedircontent Rename contents inside srcdir. * @param int $renamedircontent Also rename contents inside srcdir after the move to match new destination name.
* *
* @return boolean True if OK, false if KO * @return boolean True if OK, false if KO
*/ */
@ -1045,7 +1045,7 @@ function dol_move_dir($srcdir, $destdir, $overwriteifexists = 1, $indexdatabase
if ($file["type"] == "dir") { if ($file["type"] == "dir") {
$res = dol_move_dir($filepath.'/'.$oldname, $filepath.'/'.$newname, $overwriteifexists, $indexdatabase, $renamedircontent); $res = dol_move_dir($filepath.'/'.$oldname, $filepath.'/'.$newname, $overwriteifexists, $indexdatabase, $renamedircontent);
} else { } else {
$res = dol_move($filepath.'/'.$oldname, $filepath.'/'.$newname); $res = dol_move($filepath.'/'.$oldname, $filepath.'/'.$newname, 0, $overwriteifexists, 0, $indexdatabase);
} }
if (!$res) { if (!$res) {
return $result; return $result;

View File

@ -4006,8 +4006,9 @@ function dol_trunc($string, $size = 40, $trunc = 'right', $stringencoding = 'UTF
* Show picto whatever it's its name (generic function) * Show picto whatever it's its name (generic function)
* *
* @param string $titlealt Text on title tag for tooltip. Not used if param notitle is set to 1. * @param string $titlealt Text on title tag for tooltip. Not used if param notitle is set to 1.
* @param string $picto Name of image file to show ('filenew', ...) * @param string $picto Name of image file to show ('filenew', ...).
* If no extension provided, we use '.png'. Image must be stored into theme/xxx/img directory. * For font awesome icon (example 'user'), you can use picto_nocolor to not have the color of picto forced.
* If no extension provided and it is not a font awesome icon, we use '.png'. Image must be stored into theme/xxx/img directory.
* Example: picto.png if picto.png is stored into htdocs/theme/mytheme/img * Example: picto.png if picto.png is stored into htdocs/theme/mytheme/img
* Example: picto.png@mymodule if picto.png is stored into htdocs/mymodule/img * Example: picto.png@mymodule if picto.png is stored into htdocs/mymodule/img
* Example: /mydir/mysubdir/picto.png if picto.png is stored into htdocs/mydir/mysubdir (pictoisfullpath must be set to 1) * Example: /mydir/mysubdir/picto.png if picto.png is stored into htdocs/mydir/mysubdir (pictoisfullpath must be set to 1)
@ -4045,6 +4046,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $
} else { } else {
$pictowithouttext = preg_replace('/(\.png|\.gif|\.svg)$/', '', $picto); $pictowithouttext = preg_replace('/(\.png|\.gif|\.svg)$/', '', $picto);
$pictowithouttext = str_replace('object_', '', $pictowithouttext); $pictowithouttext = str_replace('object_', '', $pictowithouttext);
$pictowithouttext = str_replace('_nocolor', '', $pictowithouttext);
if (strpos($pictowithouttext, 'fontawesome_') !== false || preg_match('/^fa-/', $pictowithouttext)) { if (strpos($pictowithouttext, 'fontawesome_') !== false || preg_match('/^fa-/', $pictowithouttext)) {
// This is a font awesome image 'fonwtawesome_xxx' or 'fa-xxx' // This is a font awesome image 'fonwtawesome_xxx' or 'fa-xxx'
@ -4102,7 +4104,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $
'edit', 'ellipsis-h', 'email', 'entity', 'envelope', 'eraser', 'establishment', 'expensereport', 'external-link-alt', 'external-link-square-alt', 'eye', 'edit', 'ellipsis-h', 'email', 'entity', 'envelope', 'eraser', 'establishment', 'expensereport', 'external-link-alt', 'external-link-square-alt', 'eye',
'filter', 'file-code', 'file-export', 'file-import', 'file-upload', 'autofill', 'folder', 'folder-open', 'folder-plus', 'filter', 'file-code', 'file-export', 'file-import', 'file-upload', 'autofill', 'folder', 'folder-open', 'folder-plus',
'gears', 'generate', 'globe', 'globe-americas', 'graph', 'grip', 'grip_title', 'group', 'gears', 'generate', 'globe', 'globe-americas', 'graph', 'grip', 'grip_title', 'group',
'help', 'holiday', 'hands-helping', 'help', 'holiday',
'id-card', 'images', 'incoterm', 'info', 'intervention', 'inventory', 'intracommreport', 'jobprofile', 'id-card', 'images', 'incoterm', 'info', 'intervention', 'inventory', 'intracommreport', 'jobprofile',
'knowledgemanagement', 'knowledgemanagement',
'label', 'language', 'line', 'link', 'list', 'list-alt', 'listlight', 'loan', 'lock', 'lot', 'long-arrow-alt-right', 'label', 'language', 'line', 'link', 'list', 'list-alt', 'listlight', 'loan', 'lock', 'lot', 'long-arrow-alt-right',
@ -4254,7 +4256,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $
//'title_setup'=>'infobox-action', 'tools'=>'infobox-action', //'title_setup'=>'infobox-action', 'tools'=>'infobox-action',
'list-alt'=>'imgforviewmode', 'calendar'=>'imgforviewmode', 'calendarweek'=>'imgforviewmode', 'calendarmonth'=>'imgforviewmode', 'calendarday'=>'imgforviewmode', 'calendarperuser'=>'imgforviewmode' 'list-alt'=>'imgforviewmode', 'calendar'=>'imgforviewmode', 'calendarweek'=>'imgforviewmode', 'calendarmonth'=>'imgforviewmode', 'calendarday'=>'imgforviewmode', 'calendarperuser'=>'imgforviewmode'
); );
if (!empty($arrayconvpictotomorcess[$pictowithouttext])) { if (!empty($arrayconvpictotomorcess[$pictowithouttext]) && strpos($picto, '_nocolor') === false) {
$morecss .= ($morecss ? ' ' : '').$arrayconvpictotomorcess[$pictowithouttext]; $morecss .= ($morecss ? ' ' : '').$arrayconvpictotomorcess[$pictowithouttext];
} }
@ -4274,7 +4276,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $
'uncheck'=>'#800', 'uparrow'=>'#555', 'user-cog'=>'#999', 'country'=>'#aaa', 'globe-americas'=>'#aaa', 'region'=>'#aaa', 'state'=>'#aaa', 'uncheck'=>'#800', 'uparrow'=>'#555', 'user-cog'=>'#999', 'country'=>'#aaa', 'globe-americas'=>'#aaa', 'region'=>'#aaa', 'state'=>'#aaa',
'website'=>'#304', 'workstation'=>'#a69944' 'website'=>'#304', 'workstation'=>'#a69944'
); );
if (isset($arrayconvpictotocolor[$pictowithouttext])) { if (isset($arrayconvpictotocolor[$pictowithouttext]) && strpos($picto, '_nocolor') === false) {
$facolor = $arrayconvpictotocolor[$pictowithouttext]; $facolor = $arrayconvpictotocolor[$pictowithouttext];
} }
@ -9091,11 +9093,9 @@ function dol_eval($s, $returnvalue = 0, $hideerrors = 1, $onlysimplestring = '1'
} }
} }
} catch (Error $e) { } catch (Error $e) {
$error = 'Caught error : '; $error = 'dol_eval try/catch error : ';
$error .= $e->getMessage() . ', '; $error .= $e->getMessage();
$error .= 'Trace : '; dol_syslog($error);
$error .= json_encode($e->getTrace());
error_log($error, 1);
} }
} }

View File

@ -45,6 +45,11 @@ class pdf_strato extends ModelePDFContract
*/ */
public $db; public $db;
/**
* @var int The environment ID when using a multicompany module
*/
public $entity;
/** /**
* @var string model name * @var string model name
*/ */
@ -114,7 +119,7 @@ class pdf_strato extends ModelePDFContract
/** /**
* Issuer * Issuer
* @var Societe * @var Societe Object that emits
*/ */
public $emetteur; public $emetteur;
@ -138,7 +143,7 @@ class pdf_strato extends ModelePDFContract
$this->description = $langs->trans("StandardContractsTemplate"); $this->description = $langs->trans("StandardContractsTemplate");
$this->update_main_doc_field = 1; // Save the name of generated file as the main doc when generating a doc with this template $this->update_main_doc_field = 1; // Save the name of generated file as the main doc when generating a doc with this template
// Page size for A4 format // Dimension page
$this->type = 'pdf'; $this->type = 'pdf';
$formatarray = pdf_getFormat(); $formatarray = pdf_getFormat();
@ -160,7 +165,7 @@ class pdf_strato extends ModelePDFContract
// Get source company // Get source company
$this->emetteur = $mysoc; $this->emetteur = $mysoc;
if (empty($this->emetteur->country_code)) { if (empty($this->emetteur->country_code)) {
$this->emetteur->country_code = substr($langs->defaultlang, -2); // By default, if not defined $this->emetteur->country_code = substr($langs->defaultlang, -2); // By default, if was not defined
} }
// Define position of columns // Define position of columns
@ -182,7 +187,7 @@ class pdf_strato extends ModelePDFContract
public function write_file($object, $outputlangs, $srctemplatepath = '', $hidedetails = 0, $hidedesc = 0, $hideref = 0) public function write_file($object, $outputlangs, $srctemplatepath = '', $hidedetails = 0, $hidedesc = 0, $hideref = 0)
{ {
// phpcs:enable // phpcs:enable
global $user, $langs, $conf, $hookmanager, $mysoc; global $user, $langs, $conf, $mysoc, $db, $hookmanager, $nblines;
if (!is_object($outputlangs)) { if (!is_object($outputlangs)) {
$outputlangs = $langs; $outputlangs = $langs;
@ -192,15 +197,30 @@ class pdf_strato extends ModelePDFContract
$outputlangs->charset_output = 'ISO-8859-1'; $outputlangs->charset_output = 'ISO-8859-1';
} }
// Load traductions files required by page // Load translation files required by page
$outputlangs->loadLangs(array("main", "dict", "companies", "contracts")); $outputlangs->loadLangs(array("main", "dict", "companies", "contracts"));
if ($conf->contrat->dir_output) { // Show Draft Watermark
if ($object->statut == $object::STATUS_DRAFT && (!empty($conf->global->CONTRACT_DRAFT_WATERMARK))) {
$this->watermark = $conf->global->CONTRACT_DRAFT_WATERMARK;
}
global $outputlangsbis;
$outputlangsbis = null;
if (!empty($conf->global->PDF_USE_ALSO_LANGUAGE_CODE) && $outputlangs->defaultlang != $conf->global->PDF_USE_ALSO_LANGUAGE_CODE) {
$outputlangsbis = new Translate('', $conf);
$outputlangsbis->setDefaultLang($conf->global->PDF_USE_ALSO_LANGUAGE_CODE);
$outputlangsbis->loadLangs(array("main", "dict", "companies", "bills", "products", "orders", "deliveries"));
}
$nblines = count($object->lines);
if ($conf->contract->multidir_output[$conf->entity]) {
$object->fetch_thirdparty(); $object->fetch_thirdparty();
// Definition of $dir and $file // Definition of $dir and $file
if ($object->specimen) { if ($object->specimen) {
$dir = $conf->contrat->dir_output; $dir = $conf->contract->multidir_output[$conf->entity];
$file = $dir."/SPECIMEN.pdf"; $file = $dir."/SPECIMEN.pdf";
} else { } else {
$objectref = dol_sanitizeFileName($object->ref); $objectref = dol_sanitizeFileName($object->ref);
@ -210,7 +230,7 @@ class pdf_strato extends ModelePDFContract
if (!file_exists($dir)) { if (!file_exists($dir)) {
if (dol_mkdir($dir) < 0) { if (dol_mkdir($dir) < 0) {
$this->error = $outputlangs->trans("ErrorCanNotCreateDir", $dir); $this->error = $langs->trans("ErrorCanNotCreateDir", $dir);
return 0; return 0;
} }
} }
@ -226,15 +246,20 @@ class pdf_strato extends ModelePDFContract
global $action; global $action;
$reshook = $hookmanager->executeHooks('beforePDFCreation', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks $reshook = $hookmanager->executeHooks('beforePDFCreation', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
// Set nblines with the new command lines content after hook
$nblines = count($object->lines);
// Create pdf instance
$pdf = pdf_getInstance($this->format); $pdf = pdf_getInstance($this->format);
$default_font_size = pdf_getPDFFontSize($outputlangs); // Must be after pdf_getInstance $default_font_size = pdf_getPDFFontSize($outputlangs); // Must be after pdf_getInstance
$pdf->SetAutoPageBreak(1, 0);
$heightforinfotot = 50; // Height reserved to output the info and total part $heightforinfotot = 50; // Height reserved to output the info and total part
$heightforfreetext = (isset($conf->global->MAIN_PDF_FREETEXT_HEIGHT) ? $conf->global->MAIN_PDF_FREETEXT_HEIGHT : 5); // Height reserved to output the free text on last page $heightforfreetext = (isset($conf->global->MAIN_PDF_FREETEXT_HEIGHT) ? $conf->global->MAIN_PDF_FREETEXT_HEIGHT : 5); // Height reserved to output the free text on last page
$heightforfooter = $this->marge_basse + 9; // Height reserved to output the footer (value include bottom margin) $heightforfooter = $this->marge_basse + 9; // Height reserved to output the footer (value include bottom margin)
if (!empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS)) { if (!empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS)) {
$heightforfooter += 6; $heightforfooter += 6;
} }
$pdf->SetAutoPageBreak(1, 0);
if (class_exists('TCPDF')) { if (class_exists('TCPDF')) {
$pdf->setPrintHeader(false); $pdf->setPrintHeader(false);
@ -243,7 +268,11 @@ class pdf_strato extends ModelePDFContract
$pdf->SetFont(pdf_getPDFFont($outputlangs)); $pdf->SetFont(pdf_getPDFFont($outputlangs));
// Set path to the background PDF File // Set path to the background PDF File
if (!empty($conf->global->MAIN_ADD_PDF_BACKGROUND)) { if (!empty($conf->global->MAIN_ADD_PDF_BACKGROUND)) {
$pagecount = $pdf->setSourceFile($conf->mycompany->dir_output.'/'.$conf->global->MAIN_ADD_PDF_BACKGROUND); $logodir = $conf->mycompany->dir_output;
if (!empty($conf->mycompany->multidir_output[$object->entity])) {
$logodir = $conf->mycompany->multidir_output[$object->entity];
}
$pagecount = $pdf->setSourceFile($logodir.'/'.$conf->global->MAIN_ADD_PDF_BACKGROUND);
$tplidx = $pdf->importPage(1); $tplidx = $pdf->importPage(1);
} }
@ -252,10 +281,10 @@ class pdf_strato extends ModelePDFContract
$pdf->SetDrawColor(128, 128, 128); $pdf->SetDrawColor(128, 128, 128);
$pdf->SetTitle($outputlangs->convToOutputCharset($object->ref)); $pdf->SetTitle($outputlangs->convToOutputCharset($object->ref));
$pdf->SetSubject($outputlangs->transnoentities("ContractCard")); $pdf->SetSubject($outputlangs->transnoentities("Contract"));
$pdf->SetCreator("Dolibarr ".DOL_VERSION); $pdf->SetCreator("Dolibarr ".DOL_VERSION);
$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs))); $pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("ContractCard")." ".$outputlangs->convToOutputCharset($object->thirdparty->name)); $pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("Contract")." ".$outputlangs->convToOutputCharset($object->thirdparty->name));
if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) { if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
$pdf->SetCompression(false); $pdf->SetCompression(false);
} }
@ -268,7 +297,7 @@ class pdf_strato extends ModelePDFContract
$pdf->useTemplate($tplidx); $pdf->useTemplate($tplidx);
} }
$pagenb++; $pagenb++;
$this->_pagehead($pdf, $object, 1, $outputlangs); $top_shift = $this->_pagehead($pdf, $object, 1, $outputlangs, (is_object($outputlangsbis) ? $outputlangsbis : null));
$pdf->SetFont('', '', $default_font_size - 1); $pdf->SetFont('', '', $default_font_size - 1);
$pdf->MultiCell(0, 3, ''); // Set interline to 3 $pdf->MultiCell(0, 3, ''); // Set interline to 3
$pdf->SetTextColor(0, 0, 0); $pdf->SetTextColor(0, 0, 0);
@ -408,6 +437,7 @@ class pdf_strato extends ModelePDFContract
{ {
$pdf->commitTransaction(); $pdf->commitTransaction();
} }
$posYAfterDescription = $pdf->GetY();
$nexY = $pdf->GetY() + 2; $nexY = $pdf->GetY() + 2;
$pageposafter = $pdf->getPage(); $pageposafter = $pdf->getPage();
@ -417,7 +447,7 @@ class pdf_strato extends ModelePDFContract
$pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it. $pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
// We suppose that a too long description is moved completely on next page // We suppose that a too long description is moved completely on next page
if ($pageposafter > $pageposbefore) { if ($pageposafter > $pageposbefore && empty($showpricebeforepagebreak)) {
$pdf->setPage($pageposafter); $pdf->setPage($pageposafter);
$curY = $tab_top_newpage; $curY = $tab_top_newpage;
} }
@ -483,10 +513,6 @@ class pdf_strato extends ModelePDFContract
$pdf->Output($file, 'F'); $pdf->Output($file, 'F');
// Add pdfgeneration hook // Add pdfgeneration hook
if (!is_object($hookmanager)) {
include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
$hookmanager = new HookManager($this->db);
}
$hookmanager->initHooks(array('pdfgeneration')); $hookmanager->initHooks(array('pdfgeneration'));
$parameters = array('file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs); $parameters = array('file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs);
global $action; global $action;
@ -500,13 +526,13 @@ class pdf_strato extends ModelePDFContract
$this->result = array('fullpath'=>$file); $this->result = array('fullpath'=>$file);
return 1; return 1; // No error
} else { } else {
$this->error = $langs->trans("ErrorCanNotCreateDir", $dir); $this->error = $langs->transnoentities("ErrorCanNotCreateDir", $dir);
return 0; return 0;
} }
} else { } else {
$this->error = $langs->trans("ErrorConstantNotDefined", "CONTRACT_OUTPUTDIR"); $this->error = $langs->transnoentities("ErrorConstantNotDefined", "CONTRACT_OUTPUTDIR");
return 0; return 0;
} }
} }
@ -534,7 +560,9 @@ class pdf_strato extends ModelePDFContract
$hidetop = -1; $hidetop = -1;
} }
$currency = !empty($currency) ? $currency : $conf->currency;
$default_font_size = pdf_getPDFFontSize($outputlangs); $default_font_size = pdf_getPDFFontSize($outputlangs);
/* /*
$pdf->SetXY($this->marge_gauche, $tab_top); $pdf->SetXY($this->marge_gauche, $tab_top);
$pdf->MultiCell(190,8,$outputlangs->transnoentities("Description"),0,'L',0); $pdf->MultiCell(190,8,$outputlangs->transnoentities("Description"),0,'L',0);
@ -600,76 +628,97 @@ class pdf_strato extends ModelePDFContract
* @param Contrat $object Object to show * @param Contrat $object Object to show
* @param int $showaddress 0=no, 1=yes * @param int $showaddress 0=no, 1=yes
* @param Translate $outputlangs Object lang for output * @param Translate $outputlangs Object lang for output
* @return void * @param Translate $outputlangsbis Object lang for output bis
* @param string $titlekey Translation key to show as title of document
* @return int Return topshift value
*/ */
protected function _pagehead(&$pdf, $object, $showaddress, $outputlangs) protected function _pagehead(&$pdf, $object, $showaddress, $outputlangs, $outputlangsbis = null, $titlekey = "Contract")
{ {
global $conf, $langs; // phpcs:enable
global $conf, $langs, $hookmanager;
$default_font_size = pdf_getPDFFontSize($outputlangs); $ltrdirection = 'L';
if ($outputlangs->trans("DIRECTION") == 'rtl') {
$ltrdirection = 'R';
}
// Load traductions files required by page // Load traductions files required by page
$outputlangs->loadLangs(array("main", "dict", "contract", "companies")); $outputlangs->loadLangs(array("main", "dict", "contract", "companies"));
$default_font_size = pdf_getPDFFontSize($outputlangs);
pdf_pagehead($pdf, $outputlangs, $this->page_hauteur); pdf_pagehead($pdf, $outputlangs, $this->page_hauteur);
//Affiche le filigrane brouillon - Print Draft Watermark
if ($object->statut == 0 && (!empty($conf->global->CONTRACT_DRAFT_WATERMARK))) {
pdf_watermark($pdf, $outputlangs, $this->page_hauteur, $this->page_largeur, 'mm', $conf->global->CONTRACT_DRAFT_WATERMARK);
}
//Prepare next
$pdf->SetTextColor(0, 0, 60); $pdf->SetTextColor(0, 0, 60);
$pdf->SetFont('', 'B', $default_font_size + 3); $pdf->SetFont('', 'B', $default_font_size + 3);
$posx = $this->page_largeur - $this->marge_droite - 100; $w = 100;
$posy = $this->marge_haute; $posy = $this->marge_haute;
$posx = $this->page_largeur - $this->marge_droite - $w;
$pdf->SetXY($this->marge_gauche, $posy); $pdf->SetXY($this->marge_gauche, $posy);
// Logo // Logo
$logo = $conf->mycompany->dir_output.'/logos/'.$this->emetteur->logo; if (empty($conf->global->PDF_DISABLE_MYCOMPANY_LOGO)) {
if ($this->emetteur->logo) { if ($this->emetteur->logo) {
if (is_readable($logo)) { $logodir = $conf->mycompany->dir_output;
$height = pdf_getHeightForLogo($logo); if (!empty($conf->mycompany->multidir_output[$object->entity])) {
$pdf->Image($logo, $this->marge_gauche, $posy, 0, $height); // width=0 (auto) $logodir = $conf->mycompany->multidir_output[$object->entity];
}
if (empty($conf->global->MAIN_PDF_USE_LARGE_LOGO)) {
$logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small;
} else {
$logo = $logodir.'/logos/'.$this->emetteur->logo;
}
if (is_readable($logo)) {
$height = pdf_getHeightForLogo($logo);
$pdf->Image($logo, $this->marge_gauche, $posy, 0, $height); // width=0 (auto)
} else {
$pdf->SetTextColor(200, 0, 0);
$pdf->SetFont('', 'B', $default_font_size - 2);
$pdf->MultiCell($w, 3, $outputlangs->transnoentities("ErrorLogoFileNotFound", $logo), 0, 'L');
$pdf->MultiCell($w, 3, $outputlangs->transnoentities("ErrorGoToGlobalSetup"), 0, 'L');
}
} else { } else {
$pdf->SetTextColor(200, 0, 0); $text = $this->emetteur->name;
$pdf->SetFont('', 'B', $default_font_size - 2); $pdf->MultiCell($w, 4, $outputlangs->convToOutputCharset($text), 0, $ltrdirection);
$pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorLogoFileNotFound", $logo), 0, 'L');
$pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorGoToGlobalSetup"), 0, 'L');
} }
} else {
$text = $this->emetteur->name;
$pdf->MultiCell(100, 4, $outputlangs->convToOutputCharset($text), 0, 'L');
} }
$pdf->SetFont('', 'B', $default_font_size + 3); $pdf->SetFont('', 'B', $default_font_size + 3);
$pdf->SetXY($posx, $posy); $pdf->SetXY($posx, $posy);
$pdf->SetTextColor(0, 0, 60); $pdf->SetTextColor(0, 0, 60);
$title = $outputlangs->transnoentities("ContractCard"); $title = $outputlangs->transnoentities($titlekey);
$pdf->MultiCell(100, 4, $title, '', 'R'); $title .= ' '.$outputlangs->convToOutputCharset($object->ref);
if ($object->statut == $object::STATUS_DRAFT) {
$pdf->SetTextColor(128, 0, 0);
$title .= ' - '.$outputlangs->transnoentities("NotValidated");
}
$pdf->MultiCell($w, 3, $title, '', 'R');
$pdf->SetFont('', 'B', $default_font_size + 2); $pdf->SetFont('', 'B', $default_font_size);
/*
$posy += 5; $posy += 5;
$pdf->SetXY($posx, $posy); $pdf->SetXY($posx, $posy);
$pdf->SetTextColor(0, 0, 60); $pdf->SetTextColor(0, 0, 60);
$pdf->MultiCell(100, 4, $outputlangs->transnoentities("Ref")." : ".$outputlangs->convToOutputCharset($object->ref), '', 'R'); $pdf->MultiCell(100, 4, $outputlangs->transnoentities("Ref")." : ".$outputlangs->convToOutputCharset($object->ref), '', 'R');
*/
$posy += 1; $posy += 3;
$pdf->SetFont('', '', $default_font_size); $pdf->SetFont('', '', $default_font_size - 1);
$posy += 4; $posy += 4;
$pdf->SetXY($posx, $posy); $pdf->SetXY($posx, $posy);
$pdf->SetTextColor(0, 0, 60); $pdf->SetTextColor(0, 0, 60);
$pdf->MultiCell(100, 3, $outputlangs->transnoentities("Date")." : ".dol_print_date($object->date_contrat, "day", false, $outputlangs, true), '', 'R'); $pdf->MultiCell($w, 3, $outputlangs->transnoentities("Date")." : ".dol_print_date($object->date_contrat, "day", false, $outputlangs, true), '', 'R');
if (empty($conf->global->MAIN_PDF_HIDE_CUSTOMER_CODE) && $object->thirdparty->code_client) { if (empty($conf->global->MAIN_PDF_HIDE_CUSTOMER_CODE) && $object->thirdparty->code_client) {
$posy += 4; $posy += 4;
$pdf->SetXY($posx, $posy); $pdf->SetXY($posx, $posy);
$pdf->SetTextColor(0, 0, 60); $pdf->SetTextColor(0, 0, 60);
$pdf->MultiCell(100, 3, $outputlangs->transnoentities("CustomerCode")." : ".$outputlangs->transnoentities($object->thirdparty->code_client), '', 'R'); $pdf->MultiCell($w, 3, $outputlangs->transnoentities("CustomerCode")." : ".$outputlangs->transnoentities($object->thirdparty->code_client), '', 'R');
} }
if ($showaddress) { if ($showaddress) {
@ -700,6 +749,7 @@ class pdf_strato extends ModelePDFContract
$pdf->SetXY($posx, $posy); $pdf->SetXY($posx, $posy);
$pdf->SetFillColor(230, 230, 230); $pdf->SetFillColor(230, 230, 230);
$pdf->MultiCell(82, $hautcadre, "", 0, 'R', 1); $pdf->MultiCell(82, $hautcadre, "", 0, 'R', 1);
$pdf->SetTextColor(0, 0, 60);
} }
// Show sender name // Show sender name
@ -707,13 +757,13 @@ class pdf_strato extends ModelePDFContract
$pdf->SetXY($posx + 2, $posy + 3); $pdf->SetXY($posx + 2, $posy + 3);
$pdf->SetTextColor(0, 0, 60); $pdf->SetTextColor(0, 0, 60);
$pdf->SetFont('', 'B', $default_font_size); $pdf->SetFont('', 'B', $default_font_size);
$pdf->MultiCell(80, 3, $outputlangs->convToOutputCharset($this->emetteur->name), 0, 'L'); $pdf->MultiCell(80, 4, $outputlangs->convToOutputCharset($this->emetteur->name), 0, 'L');
$posy = $pdf->getY(); $posy = $pdf->getY();
} }
// Show sender information // Show sender information
$pdf->SetFont('', '', $default_font_size - 1);
$pdf->SetXY($posx + 2, $posy); $pdf->SetXY($posx + 2, $posy);
$pdf->SetFont('', '', $default_font_size - 1);
$pdf->MultiCell(80, 4, $carac_emetteur, 0, 'L'); $pdf->MultiCell(80, 4, $carac_emetteur, 0, 'L');
@ -736,14 +786,16 @@ class pdf_strato extends ModelePDFContract
$this->recipient->name = pdfBuildThirdpartyName($thirdparty, $outputlangs); $this->recipient->name = pdfBuildThirdpartyName($thirdparty, $outputlangs);
$carac_client = pdf_build_address($outputlangs, $this->emetteur, $object->thirdparty, (isset($object->contact) ? $object->contact : ''), $usecontact, 'target', $object); $mode = 'target';
$carac_client = pdf_build_address($outputlangs, $this->emetteur, $object->thirdparty, (isset($object->contact) ? $object->contact : ''), $usecontact, $mode, $object);
// Show recipient // Show recipient
$widthrecbox = 100; $widthrecbox = !empty($conf->global->MAIN_PDF_USE_ISO_LOCATION) ? 92 : 100;
if ($this->page_largeur < 210) { if ($this->page_largeur < 210) {
$widthrecbox = 84; // To work with US executive format $widthrecbox = 84; // To work with US executive format
} }
$posy = 42; $posy = !empty($conf->global->MAIN_PDF_USE_ISO_LOCATION) ? 40 : 42;
$posy += $top_shift;
$posx = $this->page_largeur - $this->marge_droite - $widthrecbox; $posx = $this->page_largeur - $this->marge_droite - $widthrecbox;
if (!empty($conf->global->MAIN_INVERT_SENDER_RECIPIENT)) { if (!empty($conf->global->MAIN_INVERT_SENDER_RECIPIENT)) {
$posx = $this->marge_gauche; $posx = $this->marge_gauche;
@ -761,15 +813,18 @@ class pdf_strato extends ModelePDFContract
// Show recipient name // Show recipient name
$pdf->SetXY($posx + 2, $posy + 3); $pdf->SetXY($posx + 2, $posy + 3);
$pdf->SetFont('', 'B', $default_font_size); $pdf->SetFont('', 'B', $default_font_size);
$pdf->MultiCell($widthrecbox, 4, $this->recipient->name, 0, 'L'); $pdf->MultiCell($widthrecbox, 4, $this->recipient->name, 0, $ltrdirection);
$posy = $pdf->getY(); $posy = $pdf->getY();
// Show recipient information // Show recipient information
$pdf->SetFont('', '', $default_font_size - 1); $pdf->SetFont('', '', $default_font_size - 1);
$pdf->SetXY($posx + 2, $posy); $pdf->SetXY($posx + 2, $posy);
$pdf->MultiCell($widthrecbox, 4, $carac_client, 0, 'L'); $pdf->MultiCell($widthrecbox, 4, $carac_client, 0, $ltrdirection);
} }
$pdf->SetTextColor(0, 0, 0);
return $top_shift;
} }
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
@ -785,6 +840,6 @@ class pdf_strato extends ModelePDFContract
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0) protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
{ {
$showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0); $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
return pdf_pagefoot($pdf, $outputlangs, 'CONTRACT_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext); return pdf_pagefoot($pdf, $outputlangs, 'CONTRACT_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext, $this->page_largeur, $this->watermark);
} }
} }

View File

@ -212,7 +212,7 @@ class modPartnership extends DolibarrModules
// Dictionaries // Dictionaries
$this->dictionaries=array( $this->dictionaries=array(
'langs'=>'partnership@partnership', 'langs'=>'partnership',
// List of tables we want to see into dictonnary editor // List of tables we want to see into dictonnary editor
'tabname'=>array("c_partnership_type"), 'tabname'=>array("c_partnership_type"),
// Label of tables // Label of tables
@ -291,7 +291,7 @@ class modPartnership extends DolibarrModules
// 'leftmenu'=>'partnership', // 'leftmenu'=>'partnership',
// 'url'=>'/partnership/partnership_list.php', // 'url'=>'/partnership/partnership_list.php',
// // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. // // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
// 'langs'=>'partnership@partnership', // 'langs'=>'partnership',
// 'position'=>1100+$r, // 'position'=>1100+$r,
// // Define condition to show or hide menu entry. Use '$conf->partnership->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected. // // Define condition to show or hide menu entry. Use '$conf->partnership->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected.
// 'enabled'=>'$conf->partnership->enabled', // 'enabled'=>'$conf->partnership->enabled',
@ -349,18 +349,18 @@ class modPartnership extends DolibarrModules
$r = 1; $r = 1;
/* BEGIN MODULEBUILDER EXPORT PARTNERSHIP */ /* BEGIN MODULEBUILDER EXPORT PARTNERSHIP */
/* /*
$langs->load("partnership@partnership"); $langs->load("partnership");
$this->export_code[$r]=$this->rights_class.'_'.$r; $this->export_code[$r]=$this->rights_class.'_'.$r;
$this->export_label[$r]='PartnershipLines'; // Translation key (used only if key ExportDataset_xxx_z not found) $this->export_label[$r]='PartnershipLines'; // Translation key (used only if key ExportDataset_xxx_z not found)
$this->export_icon[$r]='partnership@partnership'; $this->export_icon[$r]='partnership';
// Define $this->export_fields_array, $this->export_TypeFields_array and $this->export_entities_array // Define $this->export_fields_array, $this->export_TypeFields_array and $this->export_entities_array
$keyforclass = 'Partnership'; $keyforclassfile='/partnership/class/partnership.class.php'; $keyforelement='partnership@partnership'; $keyforclass = 'Partnership'; $keyforclassfile='/partnership/class/partnership.class.php'; $keyforelement='partnership';
include DOL_DOCUMENT_ROOT.'/core/commonfieldsinexport.inc.php'; include DOL_DOCUMENT_ROOT.'/core/commonfieldsinexport.inc.php';
//$this->export_fields_array[$r]['t.fieldtoadd']='FieldToAdd'; $this->export_TypeFields_array[$r]['t.fieldtoadd']='Text'; //$this->export_fields_array[$r]['t.fieldtoadd']='FieldToAdd'; $this->export_TypeFields_array[$r]['t.fieldtoadd']='Text';
//unset($this->export_fields_array[$r]['t.fieldtoremove']); //unset($this->export_fields_array[$r]['t.fieldtoremove']);
//$keyforclass = 'PartnershipLine'; $keyforclassfile='/partnership/class/partnership.class.php'; $keyforelement='partnershipline@partnership'; $keyforalias='tl'; //$keyforclass = 'PartnershipLine'; $keyforclassfile='/partnership/class/partnership.class.php'; $keyforelement='partnershipline@partnership'; $keyforalias='tl';
//include DOL_DOCUMENT_ROOT.'/core/commonfieldsinexport.inc.php'; //include DOL_DOCUMENT_ROOT.'/core/commonfieldsinexport.inc.php';
$keyforselect='partnership'; $keyforaliasextra='extra'; $keyforelement='partnership@partnership'; $keyforselect='partnership'; $keyforaliasextra='extra'; $keyforelement='partnership';
include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php'; include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php';
//$keyforselect='partnershipline'; $keyforaliasextra='extraline'; $keyforelement='partnershipline@partnership'; //$keyforselect='partnershipline'; $keyforaliasextra='extraline'; $keyforelement='partnershipline@partnership';
//include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php'; //include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php';
@ -380,13 +380,13 @@ class modPartnership extends DolibarrModules
$r = 1; $r = 1;
/* BEGIN MODULEBUILDER IMPORT PARTNERSHIP */ /* BEGIN MODULEBUILDER IMPORT PARTNERSHIP */
/* /*
$langs->load("partnership@partnership"); $langs->load("partnership");
$this->export_code[$r]=$this->rights_class.'_'.$r; $this->export_code[$r]=$this->rights_class.'_'.$r;
$this->export_label[$r]='PartnershipLines'; // Translation key (used only if key ExportDataset_xxx_z not found) $this->export_label[$r]='PartnershipLines'; // Translation key (used only if key ExportDataset_xxx_z not found)
$this->export_icon[$r]='partnership@partnership'; $this->export_icon[$r]='partnership';
$keyforclass = 'Partnership'; $keyforclassfile='/partnership/class/partnership.class.php'; $keyforelement='partnership@partnership'; $keyforclass = 'Partnership'; $keyforclassfile='/partnership/class/partnership.class.php'; $keyforelement='partnership';
include DOL_DOCUMENT_ROOT.'/core/commonfieldsinexport.inc.php'; include DOL_DOCUMENT_ROOT.'/core/commonfieldsinexport.inc.php';
$keyforselect='partnership'; $keyforaliasextra='extra'; $keyforelement='partnership@partnership'; $keyforselect='partnership'; $keyforaliasextra='extra'; $keyforelement='partnership';
include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php'; include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php';
//$this->export_dependencies_array[$r]=array('mysubobject'=>'ts.rowid', 't.myfield'=>array('t.myfield2','t.myfield3')); // To force to activate one or several fields if we select some fields that need same (like to select a unique key if we ask a field of a child to avoid the DISTINCT to discard them, or for computed field than need several other fields) //$this->export_dependencies_array[$r]=array('mysubobject'=>'ts.rowid', 't.myfield'=>array('t.myfield2','t.myfield3')); // To force to activate one or several fields if we select some fields that need same (like to select a unique key if we ask a field of a child to avoid the DISTINCT to discard them, or for computed field than need several other fields)
$this->export_sql_start[$r]='SELECT DISTINCT '; $this->export_sql_start[$r]='SELECT DISTINCT ';
@ -417,11 +417,11 @@ class modPartnership extends DolibarrModules
// Create extrafields during init // Create extrafields during init
//include_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; //include_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
//$extrafields = new ExtraFields($this->db); //$extrafields = new ExtraFields($this->db);
//$result1=$extrafields->addExtraField('partnership_myattr1', "New Attr 1 label", 'boolean', 1, 3, 'thirdparty', 0, 0, '', '', 1, '', 0, 0, '', '', 'partnership@partnership', '$conf->partnership->enabled'); //$result1=$extrafields->addExtraField('partnership_myattr1', "New Attr 1 label", 'boolean', 1, 3, 'thirdparty', 0, 0, '', '', 1, '', 0, 0, '', '', 'partnership', '$conf->partnership->enabled');
//$result2=$extrafields->addExtraField('partnership_myattr2', "New Attr 2 label", 'varchar', 1, 10, 'project', 0, 0, '', '', 1, '', 0, 0, '', '', 'partnership@partnership', '$conf->partnership->enabled'); //$result2=$extrafields->addExtraField('partnership_myattr2', "New Attr 2 label", 'varchar', 1, 10, 'project', 0, 0, '', '', 1, '', 0, 0, '', '', 'partnership', '$conf->partnership->enabled');
//$result3=$extrafields->addExtraField('partnership_myattr3', "New Attr 3 label", 'varchar', 1, 10, 'bank_account', 0, 0, '', '', 1, '', 0, 0, '', '', 'partnership@partnership', '$conf->partnership->enabled'); //$result3=$extrafields->addExtraField('partnership_myattr3', "New Attr 3 label", 'varchar', 1, 10, 'bank_account', 0, 0, '', '', 1, '', 0, 0, '', '', 'partnership', '$conf->partnership->enabled');
//$result4=$extrafields->addExtraField('partnership_myattr4', "New Attr 4 label", 'select', 1, 3, 'thirdparty', 0, 1, '', array('options'=>array('code1'=>'Val1','code2'=>'Val2','code3'=>'Val3')), 1,'', 0, 0, '', '', 'partnership@partnership', '$conf->partnership->enabled'); //$result4=$extrafields->addExtraField('partnership_myattr4', "New Attr 4 label", 'select', 1, 3, 'thirdparty', 0, 1, '', array('options'=>array('code1'=>'Val1','code2'=>'Val2','code3'=>'Val3')), 1,'', 0, 0, '', '', 'partnership', '$conf->partnership->enabled');
//$result5=$extrafields->addExtraField('partnership_myattr5', "New Attr 5 label", 'text', 1, 10, 'user', 0, 0, '', '', 1, '', 0, 0, '', '', 'partnership@partnership', '$conf->partnership->enabled'); //$result5=$extrafields->addExtraField('partnership_myattr5', "New Attr 5 label", 'text', 1, 10, 'user', 0, 0, '', '', 1, '', 0, 0, '', '', 'partnership', '$conf->partnership->enabled');
// Permissions // Permissions
$this->remove($options); $this->remove($options);

View File

@ -328,7 +328,7 @@ if ($action == 'presend') {
} }
$contactarr = array(); $contactarr = array();
$contactarr = $tmpobject->liste_contact(-1, 'external'); $contactarr = $tmpobject->liste_contact(-1, 'external', 0, '', 1);
if (is_array($contactarr) && count($contactarr) > 0) { if (is_array($contactarr) && count($contactarr) > 0) {
require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php'; require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';

View File

@ -75,7 +75,10 @@ class InterfaceWorkflowManager extends DolibarrTriggers
if (isModEnabled('commande') && !empty($conf->global->WORKFLOW_PROPAL_AUTOCREATE_ORDER)) { if (isModEnabled('commande') && !empty($conf->global->WORKFLOW_PROPAL_AUTOCREATE_ORDER)) {
$object->fetchObjectLinked(); $object->fetchObjectLinked();
if (!empty($object->linkedObjectsIds['commande'])) { if (!empty($object->linkedObjectsIds['commande'])) {
setEventMessages($langs->trans("OrderExists"), null, 'warnings'); if (empty($object->context['closedfromonlinesignature'])) {
$langs->load("orders");
setEventMessages($langs->trans("OrderExists"), null, 'warnings');
}
return $ret; return $ret;
} else { } else {
include_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php'; include_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';

View File

@ -992,6 +992,8 @@ class InterfaceActionsAuto extends DolibarrTriggers
$object->trackid = 'sub'.$object->id; $object->trackid = 'sub'.$object->id;
} elseif (preg_match('/^MEMBER_/', $action)) { } elseif (preg_match('/^MEMBER_/', $action)) {
$object->trackid = 'mem'.$object->id; $object->trackid = 'mem'.$object->id;
} elseif (preg_match('/^PARTNERSHIP_/', $action)) {
$object->trackid = 'pship'.$object->id;
} elseif (preg_match('/^PROJECT_/', $action)) { } elseif (preg_match('/^PROJECT_/', $action)) {
$object->trackid = 'proj'.$object->id; $object->trackid = 'proj'.$object->id;
} elseif (preg_match('/^TASK_/', $action)) { } elseif (preg_match('/^TASK_/', $action)) {
@ -1090,7 +1092,7 @@ class InterfaceActionsAuto extends DolibarrTriggers
$actioncomm->errors_to = empty($object->errors_to) ? null : $object->errors_to; $actioncomm->errors_to = empty($object->errors_to) ? null : $object->errors_to;
} }
// Object linked (if link is for thirdparty, contact, project it is a recording error. We should not have links in link table // Object linked (if link is for thirdparty, contact or project, it is a recording error. We should not have links in link table
// for such objects because there is already a dedicated field into table llx_actioncomm or llx_actioncomm_resources. // for such objects because there is already a dedicated field into table llx_actioncomm or llx_actioncomm_resources.
if (!in_array($elementtype, array('societe', 'contact', 'project'))) { if (!in_array($elementtype, array('societe', 'contact', 'project'))) {
$actioncomm->fk_element = $elementid; $actioncomm->fk_element = $elementid;

View File

@ -45,7 +45,7 @@ class InterfaceNotification extends DolibarrTriggers
$this->name = preg_replace('/^Interface/i', '', get_class($this)); $this->name = preg_replace('/^Interface/i', '', get_class($this));
$this->family = "notification"; $this->family = "notification";
$this->description = "Triggers of this module send email notifications according to Notification module setup."; $this->description = "Triggers of this module send Email notifications according to Notification module setup.";
// 'development', 'experimental', 'dolibarr' or version // 'development', 'experimental', 'dolibarr' or version
$this->version = self::VERSION_DOLIBARR; $this->version = self::VERSION_DOLIBARR;
$this->picto = 'email'; $this->picto = 'email';
@ -70,6 +70,7 @@ class InterfaceNotification extends DolibarrTriggers
return 0; // Module not active, we do nothing return 0; // Module not active, we do nothing
} }
// If the trigger code is not managed by the Notification module
if (!in_array($action, $this->listofmanagedevents)) { if (!in_array($action, $this->listofmanagedevents)) {
return 0; return 0;
} }
@ -112,7 +113,7 @@ class InterfaceNotification extends DolibarrTriggers
$ret = array(); $ret = array();
$sql = "SELECT rowid, code, label, description, elementtype"; $sql = "SELECT rowid, code, contexts, label, description, elementtype";
$sql .= " FROM ".MAIN_DB_PREFIX."c_action_trigger"; $sql .= " FROM ".MAIN_DB_PREFIX."c_action_trigger";
$sql .= $this->db->order("rang, elementtype, code"); $sql .= $this->db->order("rang, elementtype, code");
@ -153,7 +154,7 @@ class InterfaceNotification extends DolibarrTriggers
} }
if ($qualified) { if ($qualified) {
$ret[] = array('rowid'=>$obj->rowid, 'code'=>$obj->code, 'label'=>$obj->label, 'description'=>$obj->description, 'elementtype'=>$obj->elementtype); $ret[] = array('rowid'=>$obj->rowid, 'code'=>$obj->code, 'contexts'=>$obj->contexts, 'label'=>$obj->label, 'description'=>$obj->description, 'elementtype'=>$obj->elementtype);
} }
$i++; $i++;

View File

@ -107,20 +107,58 @@ if (!defined('USEDOLIBARRSERVER') && !defined('USEDOLIBARREDITOR')) {
// X-XSS-Protection // X-XSS-Protection
//header("X-XSS-Protection: 1"); // XSS filtering protection of some browsers (note: use of Content-Security-Policy is more efficient). Disabled as deprecated. //header("X-XSS-Protection: 1"); // XSS filtering protection of some browsers (note: use of Content-Security-Policy is more efficient). Disabled as deprecated.
// Content-Security-Policy // Content-Security-Policy-Report-Only
if (!defined('WEBSITE_MAIN_SECURITY_FORCECSP')) { if (!defined('WEBSITE_MAIN_SECURITY_FORCECSPRO')) {
// The constant WEBSITE_MAIN_SECURITY_FORCECSP should never be defined by page, but the variable used just after may be
// A default security policy that keep usage of js external component like ckeditor, stripe, google, working // A default security policy that keep usage of js external component like ckeditor, stripe, google, working
// $contentsecuritypolicy = "font-src *; img-src *; style-src * 'unsafe-inline' 'unsafe-eval'; default-src 'self' *.stripe.com 'unsafe-inline' 'unsafe-eval'; script-src 'self' *.stripe.com 'unsafe-inline' 'unsafe-eval'; frame-ancestors 'self'; frame-src 'self' *.stripe.com; connect-src 'self';"; // For example: to restrict to only local resources, except for css (cloudflare+google), and js (transifex + google tags) and object/iframe (youtube)
$contentsecuritypolicy = getDolGlobalString('WEBSITE_MAIN_SECURITY_FORCECSP'); // default-src 'self'; style-src: https://cdnjs.cloudflare.com https://fonts.googleapis.com; script-src: https://cdn.transifex.com https://www.googletagmanager.com; object-src https://youtube.com; frame-src https://youtube.com; img-src: *;
// For example, to restrict everything to itself except img that can be on other servers:
// default-src 'self'; img-src *;
// Pre-existing site that uses too much js code to fix but wants to ensure resources are loaded only over https and disable plugins:
// default-src https: 'unsafe-inline' 'unsafe-eval'; object-src 'none'
//
// $contentsecuritypolicy = "frame-ancestors 'self'; img-src * data:; font-src *; default-src 'self' 'unsafe-inline' 'unsafe-eval' *.paypal.com *.stripe.com *.google.com *.googleapis.com *.google-analytics.com *.googletagmanager.com;";
// $contentsecuritypolicy = "frame-ancestors 'self'; img-src * data:; font-src *; default-src *; script-src 'self' 'unsafe-inline' *.paypal.com *.stripe.com *.google.com *.googleapis.com *.google-analytics.com *.googletagmanager.com; style-src 'self' 'unsafe-inline'; connect-src 'self';";
$contentsecuritypolicy = getDolGlobalString('WEBSITE_MAIN_SECURITY_FORCECSPRO');
if (!is_object($hookmanager)) { if (!is_object($hookmanager)) {
$hookmanager = new HookManager($db); $hookmanager = new HookManager($db);
} }
$hookmanager->initHooks(array("main")); $hookmanager->initHooks(array("main"));
$parameters = array('contentsecuritypolicy'=>$contentsecuritypolicy); $parameters = array('contentsecuritypolicy'=>$contentsecuritypolicy, 'mode'=>'reportonly');
$result = $hookmanager->executeHooks('setContentSecurityPolicy', $parameters); // Note that $action and $object may have been modified by some hooks
if ($result > 0) {
$contentsecuritypolicy = $hookmanager->resPrint; // Replace CSP
} else {
$contentsecuritypolicy .= $hookmanager->resPrint; // Concat CSP
}
if (!empty($contentsecuritypolicy)) {
header("Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
}
}
// Content-Security-Policy
if (!defined('WEBSITE_MAIN_SECURITY_FORCECSP')) {
// A default security policy that keep usage of js external component like ckeditor, stripe, google, working
// For example: to restrict to only local resources, except for css (cloudflare+google), and js (transifex + google tags) and object/iframe (youtube)
// default-src 'self'; style-src: https://cdnjs.cloudflare.com https://fonts.googleapis.com; script-src: https://cdn.transifex.com https://www.googletagmanager.com; object-src https://youtube.com; frame-src https://youtube.com; img-src: *;
// For example, to restrict everything to itself except img that can be on other servers:
// default-src 'self'; img-src *;
// Pre-existing site that uses too much js code to fix but wants to ensure resources are loaded only over https and disable plugins:
// default-src https: 'unsafe-inline' 'unsafe-eval'; object-src 'none'
//
// $contentsecuritypolicy = "frame-ancestors 'self'; img-src * data:; font-src *; default-src 'self' 'unsafe-inline' 'unsafe-eval' *.paypal.com *.stripe.com *.google.com *.googleapis.com *.google-analytics.com *.googletagmanager.com;";
// $contentsecuritypolicy = "frame-ancestors 'self'; img-src * data:; font-src *; default-src *; script-src 'self' 'unsafe-inline' *.paypal.com *.stripe.com *.google.com *.googleapis.com *.google-analytics.com *.googletagmanager.com; style-src 'self' 'unsafe-inline'; connect-src 'self';";
$contentsecuritypolicy = getDolGlobalString('WEBSITE_MAIN_SECURITY_FORCECSP');
if (!is_object($hookmanager)) {
$hookmanager = new HookManager($db);
}
$hookmanager->initHooks(array("main"));
$parameters = array('contentsecuritypolicy'=>$contentsecuritypolicy, 'mode'=>'active');
$result = $hookmanager->executeHooks('setContentSecurityPolicy', $parameters); // Note that $action and $object may have been modified by some hooks $result = $hookmanager->executeHooks('setContentSecurityPolicy', $parameters); // Note that $action and $object may have been modified by some hooks
if ($result > 0) { if ($result > 0) {
$contentsecuritypolicy = $hookmanager->resPrint; // Replace CSP $contentsecuritypolicy = $hookmanager->resPrint; // Replace CSP
@ -129,12 +167,6 @@ if (!defined('USEDOLIBARRSERVER') && !defined('USEDOLIBARREDITOR')) {
} }
if (!empty($contentsecuritypolicy)) { if (!empty($contentsecuritypolicy)) {
// For example: to restrict to only local resources, except for css (cloudflare+google), and js (transifex + google tags) and object/iframe (youtube)
// default-src 'self'; style-src: https://cdnjs.cloudflare.com https://fonts.googleapis.com; script-src: https://cdn.transifex.com https://www.googletagmanager.com; object-src https://youtube.com; frame-src https://youtube.com; img-src: *;
// For example, to restrict everything to itself except img that can be on other servers:
// default-src 'self'; img-src *;
// Pre-existing site that uses too much js code to fix but wants to ensure resources are loaded only over https and disable plugins:
// default-src https: 'unsafe-inline' 'unsafe-eval'; object-src 'none'
header("Content-Security-Policy: ".$contentsecuritypolicy); header("Content-Security-Policy: ".$contentsecuritypolicy);
} }
} }

View File

@ -1171,7 +1171,7 @@ class Don extends CommonObject
$return .= '<br><span class="opacitymedium" >'.$langs->trans("Amount").'</span> : <span class="info-box-label amount">'.price($this->amount).'</span>'; $return .= '<br><span class="opacitymedium" >'.$langs->trans("Amount").'</span> : <span class="info-box-label amount">'.price($this->amount).'</span>';
} }
if (method_exists($this, 'LibStatut')) { if (method_exists($this, 'LibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->LibStatut($this->labelStatus, 5).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
} }
$return .= '</div>'; $return .= '</div>';
$return .= '</div>'; $return .= '</div>';

View File

@ -5,6 +5,7 @@
* Copyright (C) 2016-2021 Ferran Marcet <fmarcet@2byte.es> * Copyright (C) 2016-2021 Ferran Marcet <fmarcet@2byte.es>
* Copyright (C) 2019 Nicolas ZABOURI <info@inovea-conseil.com> * Copyright (C) 2019 Nicolas ZABOURI <info@inovea-conseil.com>
* Copyright (C) 2020 Thibault FOUCART <support@ptibogxiv.net> * Copyright (C) 2020 Thibault FOUCART <support@ptibogxiv.net>
* Copyright (C) 2023 Christophe Battarel <christophe@altairis.fr>
* *
* 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
@ -72,7 +73,6 @@ $search_datedelivery_end = dol_mktime(23, 59, 59, GETPOST('search_datedelivery_e
$search_datereceipt_start = dol_mktime(0, 0, 0, GETPOST('search_datereceipt_startmonth', 'int'), GETPOST('search_datereceipt_startday', 'int'), GETPOST('search_datereceipt_startyear', 'int')); $search_datereceipt_start = dol_mktime(0, 0, 0, GETPOST('search_datereceipt_startmonth', 'int'), GETPOST('search_datereceipt_startday', 'int'), GETPOST('search_datereceipt_startyear', 'int'));
$search_datereceipt_end = dol_mktime(23, 59, 59, GETPOST('search_datereceipt_endmonth', 'int'), GETPOST('search_datereceipt_endday', 'int'), GETPOST('search_datereceipt_endyear', 'int')); $search_datereceipt_end = dol_mktime(23, 59, 59, GETPOST('search_datereceipt_endmonth', 'int'), GETPOST('search_datereceipt_endday', 'int'), GETPOST('search_datereceipt_endyear', 'int'));
$sall = trim((GETPOST('search_all', 'alphanohtml') != '') ?GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml')); $sall = trim((GETPOST('search_all', 'alphanohtml') != '') ?GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml'));
$socid = GETPOST('socid', 'int');
$search_user = GETPOST('search_user', 'int'); $search_user = GETPOST('search_user', 'int');
$search_sale = GETPOST('search_sale', 'int'); $search_sale = GETPOST('search_sale', 'int');
$search_categ_cus = GETPOST("search_categ_cus", 'int'); $search_categ_cus = GETPOST("search_categ_cus", 'int');

View File

@ -2793,7 +2793,7 @@ class ExpenseReport extends CommonObject
$return .= '<span class="info-box-label">'.dol_print_date($this->date_fin, 'day').'</span>'; $return .= '<span class="info-box-label">'.dol_print_date($this->date_fin, 'day').'</span>';
} }
if (method_exists($this, 'getLibStatut')) { if (method_exists($this, 'getLibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(5).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
} }
$return .= '</div>'; $return .= '</div>';
$return .= '</div>'; $return .= '</div>';

View File

@ -744,7 +744,7 @@ class PaymentExpenseReport extends CommonObject
$return .= '<br><span class="opacitymedium">'.$langs->trans("Amount").'</span> : <span class="info-box-label amount">'.price($this->amount).'</span>'; $return .= '<br><span class="opacitymedium">'.$langs->trans("Amount").'</span> : <span class="info-box-label amount">'.price($this->amount).'</span>';
} }
if (method_exists($this, 'getLibStatut')) { if (method_exists($this, 'getLibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(5).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
} }
$return .= '</div>'; $return .= '</div>';
$return .= '</div>'; $return .= '</div>';

View File

@ -1503,7 +1503,7 @@ class Fichinter extends CommonObject
$return .= '<br><span class="info-box-label ">'.$langs->trans("Duration").' : '.convertSecondToTime($this->duration, 'allhourmin').'</span>'; $return .= '<br><span class="info-box-label ">'.$langs->trans("Duration").' : '.convertSecondToTime($this->duration, 'allhourmin').'</span>';
} }
if (method_exists($this, 'getLibStatut')) { if (method_exists($this, 'getLibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(5).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
} }
$return .= '</div>'; $return .= '</div>';
$return .= '</div>'; $return .= '</div>';

View File

@ -3648,7 +3648,7 @@ class CommandeFournisseur extends CommonOrder
$return .= '<br><span class="opacitymedium">'.$langs->trans("Billed").' : </span><span class="info-box-label">'.yn($this->billed).'</span>'; $return .= '<br><span class="opacitymedium">'.$langs->trans("Billed").' : </span><span class="info-box-label">'.yn($this->billed).'</span>';
} }
if (method_exists($this, 'getLibStatut')) { if (method_exists($this, 'getLibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(5).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
} }
$return .= '</div>'; $return .= '</div>';
$return .= '</div>'; $return .= '</div>';

View File

@ -3307,7 +3307,7 @@ class FactureFournisseur extends CommonInvoice
$return .= '<br><span class="opacitymedium">'.$langs->trans("AmountHT").'</span> : <span class="info-box-label amount">'.price($this->total_ht).'</span>'; $return .= '<br><span class="opacitymedium">'.$langs->trans("AmountHT").'</span> : <span class="info-box-label amount">'.price($this->total_ht).'</span>';
} }
if (method_exists($this, 'getLibStatut')) { if (method_exists($this, 'getLibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(5).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
} }
$return .= '</div>'; $return .= '</div>';
$return .= '</div>'; $return .= '</div>';

View File

@ -2493,7 +2493,7 @@ class Holiday extends CommonObject
$return .= '<span class="info-box-label">'.dol_print_date($this->date_fin, 'day').'</span>'; $return .= '<span class="info-box-label">'.dol_print_date($this->date_fin, 'day').'</span>';
} }
if (method_exists($this, 'getLibStatut')) { if (method_exists($this, 'getLibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(5).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
} }
$return .= '</div>'; $return .= '</div>';
$return .= '</div>'; $return .= '</div>';

View File

@ -1084,7 +1084,7 @@ class Evaluation extends CommonObject
} }
if (method_exists($this, 'getLibStatut')) { if (method_exists($this, 'getLibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(5).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
} }
$return .= '</span>'; $return .= '</span>';
$return .= '</div>'; $return .= '</div>';

View File

@ -333,7 +333,7 @@ class TCPDI extends FPDF_TPL {
break; break;
} }
} }
} elseif ($tpl['x'] != 0 || $tpl['y'] != 0) { } elseif (!empty($tpl['x']) || !empty($tpl['y'])) {
$tx = -$tpl['x'] * 2; $tx = -$tpl['x'] * 2;
$ty = $tpl['y'] * 2; $ty = $tpl['y'] * 2;
} }

View File

@ -162,7 +162,7 @@ if ($rss) {
$result = build_rssfile($format, $title, $desc, $eventarray, $outputfiletmp, '', $website->virtualhost.'/wrapper.php?rss=1'.($l ? '&l='.$l : ''), $l); $result = build_rssfile($format, $title, $desc, $eventarray, $outputfiletmp, '', $website->virtualhost.'/wrapper.php?rss=1'.($l ? '&l='.$l : ''), $l);
if ($result >= 0) { if ($result >= 0) {
if (dol_move($outputfiletmp, $outputfile, 0, 1)) { if (dol_move($outputfiletmp, $outputfile, 0, 1, 0, 0)) {
$result = 1; $result = 1;
} else { } else {
$error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile; $error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile;

View File

@ -162,7 +162,7 @@ if ($rss) {
$result = build_rssfile($format, $title, $desc, $eventarray, $outputfiletmp, '', $website->virtualhost.'/wrapper.php?rss=1'.($l ? '&l='.$l : ''), $l); $result = build_rssfile($format, $title, $desc, $eventarray, $outputfiletmp, '', $website->virtualhost.'/wrapper.php?rss=1'.($l ? '&l='.$l : ''), $l);
if ($result >= 0) { if ($result >= 0) {
if (dol_move($outputfiletmp, $outputfile, 0, 1)) { if (dol_move($outputfiletmp, $outputfile, 0, 1, 0, 0)) {
$result = 1; $result = 1;
} else { } else {
$error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile; $error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile;

View File

@ -162,7 +162,7 @@ if ($rss) {
$result = build_rssfile($format, $title, $desc, $eventarray, $outputfiletmp, '', $website->virtualhost.'/wrapper.php?rss=1'.($l ? '&l='.$l : ''), $l); $result = build_rssfile($format, $title, $desc, $eventarray, $outputfiletmp, '', $website->virtualhost.'/wrapper.php?rss=1'.($l ? '&l='.$l : ''), $l);
if ($result >= 0) { if ($result >= 0) {
if (dol_move($outputfiletmp, $outputfile, 0, 1)) { if (dol_move($outputfiletmp, $outputfile, 0, 1, 0, 0)) {
$result = 1; $result = 1;
} else { } else {
$error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile; $error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile;

View File

@ -162,7 +162,7 @@ if ($rss) {
$result = build_rssfile($format, $title, $desc, $eventarray, $outputfiletmp, '', $website->virtualhost.'/wrapper.php?rss=1'.($l ? '&l='.$l : ''), $l); $result = build_rssfile($format, $title, $desc, $eventarray, $outputfiletmp, '', $website->virtualhost.'/wrapper.php?rss=1'.($l ? '&l='.$l : ''), $l);
if ($result >= 0) { if ($result >= 0) {
if (dol_move($outputfiletmp, $outputfile, 0, 1)) { if (dol_move($outputfiletmp, $outputfile, 0, 1, 0, 0)) {
$result = 1; $result = 1;
} else { } else {
$error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile; $error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile;

View File

@ -162,7 +162,7 @@ if ($rss) {
$result = build_rssfile($format, $title, $desc, $eventarray, $outputfiletmp, '', $website->virtualhost.'/wrapper.php?rss=1'.($l ? '&l='.$l : ''), $l); $result = build_rssfile($format, $title, $desc, $eventarray, $outputfiletmp, '', $website->virtualhost.'/wrapper.php?rss=1'.($l ? '&l='.$l : ''), $l);
if ($result >= 0) { if ($result >= 0) {
if (dol_move($outputfiletmp, $outputfile, 0, 1)) { if (dol_move($outputfiletmp, $outputfile, 0, 1, 0, 0)) {
$result = 1; $result = 1;
} else { } else {
$error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile; $error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile;

View File

@ -143,7 +143,7 @@ if ($rss) {
$result = build_rssfile($format, $title, $desc, $eventarray, $outputfiletmp, '', $website->virtualhost.'/wrapper.php?rss=1'.($l ? '&l='.$l : ''), $l); $result = build_rssfile($format, $title, $desc, $eventarray, $outputfiletmp, '', $website->virtualhost.'/wrapper.php?rss=1'.($l ? '&l='.$l : ''), $l);
if ($result >= 0) { if ($result >= 0) {
if (dol_move($outputfiletmp, $outputfile, 0, 1)) $result = 1; if (dol_move($outputfiletmp, $outputfile, 0, 1, 0, 0)) $result = 1;
else { else {
$error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile; $error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile;
dol_syslog("build_exportfile ".$error, LOG_ERR); dol_syslog("build_exportfile ".$error, LOG_ERR);

View File

@ -43,9 +43,7 @@ insert into llx_c_action_trigger (code,label,description,elementtype,rang) value
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_MODIFY','Customer proposal modified','Executed when a customer proposal is modified','propal',2); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_MODIFY','Customer proposal modified','Executed when a customer proposal is modified','propal',2);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_SENTBYMAIL','Commercial proposal sent by mail','Executed when a commercial proposal is sent by mail','propal',3); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_SENTBYMAIL','Commercial proposal sent by mail','Executed when a commercial proposal is sent by mail','propal',3);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLOSE_SIGNED','Customer proposal closed signed','Executed when a customer proposal is closed signed','propal',2); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLOSE_SIGNED','Customer proposal closed signed','Executed when a customer proposal is closed signed','propal',2);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLOSE_SIGNED_WEB','Customer proposal closed signed on portal','Executed when a customer proposal is closed signed on portal','propal',2);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLOSE_REFUSED','Customer proposal closed refused','Executed when a customer proposal is closed refused','propal',2); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLOSE_REFUSED','Customer proposal closed refused','Executed when a customer proposal is closed refused','propal',2);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLOSE_REFUSED_WEB','Customer proposal closed refused on portal','Executed when a customer proposal is closed refused on portal','propal',2);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLASSIFY_BILLED','Customer proposal set billed','Executed when a customer proposal is set to billed','propal',2); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLASSIFY_BILLED','Customer proposal set billed','Executed when a customer proposal is set to billed','propal',2);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_DELETE','Customer proposal deleted','Executed when a customer proposal is deleted','propal',2); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_DELETE','Customer proposal deleted','Executed when a customer proposal is deleted','propal',2);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_VALIDATE','Customer order validate','Executed when a customer order is validated','commande',4); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_VALIDATE','Customer order validate','Executed when a customer order is validated','commande',4);
@ -153,6 +151,8 @@ insert into llx_c_action_trigger (code,label,description,elementtype,rang) value
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('CONTACT_MODIFY','Contact address update','Executed when a contact is updated','contact',51); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('CONTACT_MODIFY','Contact address update','Executed when a contact is updated','contact',51);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('CONTACT_SENTBYMAIL','Mails sent from third party card','Executed when you send email from contact address record','contact',52); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('CONTACT_SENTBYMAIL','Mails sent from third party card','Executed when you send email from contact address record','contact',52);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('CONTACT_DELETE','Contact address deleted','Executed when a contact is deleted','contact',53); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('CONTACT_DELETE','Contact address deleted','Executed when a contact is deleted','contact',53);
-- recruitment module
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('RECRUITMENTJOBPOSITION_CREATE','Job created','Executed when a job is created','recruitment',7500); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('RECRUITMENTJOBPOSITION_CREATE','Job created','Executed when a job is created','recruitment',7500);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('RECRUITMENTJOBPOSITION_MODIFY','Job modified','Executed when a job is modified','recruitment',7502); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('RECRUITMENTJOBPOSITION_MODIFY','Job modified','Executed when a job is modified','recruitment',7502);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('RECRUITMENTJOBPOSITION_SENTBYMAIL','Mails sent from job record','Executed when you send email from job record','recruitment',7504); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('RECRUITMENTJOBPOSITION_SENTBYMAIL','Mails sent from job record','Executed when you send email from job record','recruitment',7504);
@ -181,3 +181,10 @@ insert into llx_c_action_trigger (code,label,description,elementtype,rang) value
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILLREC_MODIFY','Template invoices update','Executed when a Template invoices is updated','facturerec',901); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILLREC_MODIFY','Template invoices update','Executed when a Template invoices is updated','facturerec',901);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILLREC_DELETE','Template invoices deleted','Executed when a Template invoices is deleted','facturerec',902); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILLREC_DELETE','Template invoices deleted','Executed when a Template invoices is deleted','facturerec',902);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILLREC_AUTOCREATEBILL','Template invoices use to create invoices with auto batch','Executed when a Template invoices is use to create invoice with auto batch','facturerec',903); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILLREC_AUTOCREATEBILL','Template invoices use to create invoices with auto batch','Executed when a Template invoices is use to create invoice with auto batch','facturerec',903);
-- partnership module
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PARTNERSHIP_CREATE','Partnership created','Executed when a partnership is created','partnership',58000);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PARTNERSHIP_MODIFY','Partnership modified','Executed when a partnership is modified','partnership',58002);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PARTNERSHIP_SENTBYMAIL','Mails sent from partnership file','Executed when you send email from partnership file','partnership',58004);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PARTNERSHIP_DELETE','Partnership deleted','Executed when a partnership is deleted','partnership',58006);

View File

@ -64,6 +64,7 @@ ALTER TABLE llx_actioncomm ADD INDEX idx_actioncomm_percent (percent);
UPDATE llx_c_paiement SET code = 'BANCON' WHERE code = 'BAN' AND libelle = 'Bancontact'; UPDATE llx_c_paiement SET code = 'BANCON' WHERE code = 'BAN' AND libelle = 'Bancontact';
ALTER TABLE llx_partnership DROP FOREIGN KEY llx_partnership_fk_user_creat;
-- VMYSQL4.3 ALTER TABLE llx_partnership MODIFY COLUMN fk_user_creat integer NULL; -- VMYSQL4.3 ALTER TABLE llx_partnership MODIFY COLUMN fk_user_creat integer NULL;
-- VPGSQL8.2 ALTER TABLE llx_partnership ALTER COLUMN fk_user_creat DROP NOT NULL; -- VPGSQL8.2 ALTER TABLE llx_partnership ALTER COLUMN fk_user_creat DROP NOT NULL;
@ -241,9 +242,7 @@ insert into llx_c_action_trigger (code,label,description,elementtype,rang) value
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_MODIFY','Customer proposal modified','Executed when a customer proposal is modified','propal',2); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_MODIFY','Customer proposal modified','Executed when a customer proposal is modified','propal',2);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_SENTBYMAIL','Commercial proposal sent by mail','Executed when a commercial proposal is sent by mail','propal',3); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_SENTBYMAIL','Commercial proposal sent by mail','Executed when a commercial proposal is sent by mail','propal',3);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLOSE_SIGNED','Customer proposal closed signed','Executed when a customer proposal is closed signed','propal',2); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLOSE_SIGNED','Customer proposal closed signed','Executed when a customer proposal is closed signed','propal',2);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLOSE_SIGNED_WEB','Customer proposal closed signed on portal','Executed when a customer proposal is closed signed on portal','propal',2);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLOSE_REFUSED','Customer proposal closed refused','Executed when a customer proposal is closed refused','propal',2); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLOSE_REFUSED','Customer proposal closed refused','Executed when a customer proposal is closed refused','propal',2);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLOSE_REFUSED_WEB','Customer proposal closed refused on portal','Executed when a customer proposal is closed refused on portal','propal',2);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLASSIFY_BILLED','Customer proposal set billed','Executed when a customer proposal is set to billed','propal',2); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLASSIFY_BILLED','Customer proposal set billed','Executed when a customer proposal is set to billed','propal',2);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_DELETE','Customer proposal deleted','Executed when a customer proposal is deleted','propal',2); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_DELETE','Customer proposal deleted','Executed when a customer proposal is deleted','propal',2);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_VALIDATE','Customer order validate','Executed when a customer order is validated','commande',4); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_VALIDATE','Customer order validate','Executed when a customer order is validated','commande',4);

View File

@ -45,6 +45,12 @@ ALTER TABLE llx_facture_fourn_det MODIFY COLUMN ref varchar(128);
-- v18 -- v18
ALTER TABLE llx_notify_def ADD COLUMN email varchar(255);
ALTER TABLE llx_notify_def ADD COLUMN threshold double(24,8);
ALTER TABLE llx_notify_def ADD COLUMN context varchar(128);
ALTER TABLE llx_c_action_trigger ADD COLUMN contexts varchar(255) NULL;
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROJECT_CLOSE','Project closed','Executed when a project is closed','project',145); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROJECT_CLOSE','Project closed','Executed when a project is closed','project',145);
-- amount was removed in v12 -- amount was removed in v12
@ -73,6 +79,7 @@ ALTER TABLE llx_bank_account ADD COLUMN owner_zip varchar(25);
ALTER TABLE llx_bank_account ADD COLUMN owner_town varchar(50); ALTER TABLE llx_bank_account ADD COLUMN owner_town varchar(50);
ALTER TABLE llx_bank_account ADD COLUMN owner_country_id integer DEFAULT NULL; ALTER TABLE llx_bank_account ADD COLUMN owner_country_id integer DEFAULT NULL;
ALTER TABLE llx_prelevement_bons ADD COLUMN fk_bank_account integer DEFAULT NULL;
ALTER TABLE llx_supplier_proposal ADD UNIQUE INDEX uk_supplier_proposal_ref (ref, entity); ALTER TABLE llx_supplier_proposal ADD UNIQUE INDEX uk_supplier_proposal_ref (ref, entity);

View File

@ -24,6 +24,7 @@ create table llx_c_action_trigger
rowid integer AUTO_INCREMENT PRIMARY KEY, rowid integer AUTO_INCREMENT PRIMARY KEY,
elementtype varchar(64) NOT NULL, elementtype varchar(64) NOT NULL,
code varchar(128) NOT NULL, code varchar(128) NOT NULL,
contexts varchar(255) NULL, -- list of possible contexts when ther is different context of trigger
label varchar(128) NOT NULL, label varchar(128) NOT NULL,
description varchar(255), description varchar(255),
rang integer DEFAULT 0 rang integer DEFAULT 0

View File

@ -27,5 +27,8 @@ create table llx_notify_def
fk_soc integer, fk_soc integer,
fk_contact integer, fk_contact integer,
fk_user integer, fk_user integer,
email varchar(255), -- for fixed email notif
threshold double(24,8), -- threshold on an amount to qualify the notification
context varchar(128), -- only for a particular contet
type varchar(16) DEFAULT 'email' -- 'browser', 'email', 'sms', 'webservice', ... type varchar(16) DEFAULT 'email' -- 'browser', 'email', 'sms', 'webservice', ...
)ENGINE=innodb; )ENGINE=innodb;

View File

@ -20,24 +20,25 @@
-- --
-- Direct debit or credit orders -- Direct debit or credit orders
-- --
-- statut 0 : draft
-- statut 1 : sent to the bank -- statut 1 : sent to the bank
-- statut 2 : paid -- statut 2 : paid
-- --
create table llx_prelevement_bons create table llx_prelevement_bons
( (
rowid integer AUTO_INCREMENT PRIMARY KEY, rowid integer AUTO_INCREMENT PRIMARY KEY,
type varchar(16) DEFAULT 'debit-order', -- 'debit-order' or 'bank-transfer' type varchar(16) DEFAULT 'debit-order', -- 'debit-order' or 'bank-transfer'
ref varchar(12), -- reference ref varchar(12), -- reference
entity integer DEFAULT 1 NOT NULL, -- multi company id entity integer DEFAULT 1 NOT NULL, -- multi company id
datec datetime, -- date de creation datec datetime, -- date de creation
amount double(24,8) DEFAULT 0, -- montant total du prelevement amount double(24,8) DEFAULT 0, -- montant total du prelevement
statut smallint DEFAULT 0, -- statut statut smallint DEFAULT 0, -- statut
credite smallint DEFAULT 0, -- indique si le prelevement a ete credite credite smallint DEFAULT 0, -- indique si le prelevement a ete credite
note text, note text,
date_trans datetime, -- date de transmission a la banque date_trans datetime, -- date de transmission a la banque
method_trans smallint, -- methode de transmission method_trans smallint, -- methode de transmission
fk_user_trans integer, -- user qui a effectue la transmission fk_user_trans integer, -- user qui a effectue la transmission
date_credit datetime, -- date de credit sur le compte date_credit datetime, -- date de credit sur le compte
fk_user_credit integer -- user qui a remonte l'info de credit fk_user_credit integer, -- user qui a remonte l'info de credit
fk_bank_account integer DEFAULT NULL
)ENGINE=innodb; )ENGINE=innodb;

View File

@ -1145,7 +1145,7 @@ class KnowledgeRecord extends CommonObject
$return .= '<span class="info-box-label">'.dolGetFirstLineOfText($this->question).'</span>'; $return .= '<span class="info-box-label">'.dolGetFirstLineOfText($this->question).'</span>';
} }
if (method_exists($this, 'getLibStatut')) { if (method_exists($this, 'getLibStatut')) {
$return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(5).'</div>'; $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
} }
$return .= '</div>'; $return .= '</div>';
$return .= '</div>'; $return .= '</div>';

View File

@ -167,9 +167,9 @@ ACCOUNTANCY_COMBO_FOR_AUX=تمكين قائمة التحرير والسرد لل
ACCOUNTING_DATE_START_BINDING=تحديد موعد لبدء الربط والتحويل في المحاسبة. بعد هذا التاريخ ، لن يتم تحويل المعاملات إلى المحاسبة. ACCOUNTING_DATE_START_BINDING=تحديد موعد لبدء الربط والتحويل في المحاسبة. بعد هذا التاريخ ، لن يتم تحويل المعاملات إلى المحاسبة.
ACCOUNTING_DEFAULT_PERIOD_ON_TRANSFER=في تحويل المحاسبة ، ما هي الفترة المحددة افتراضيا ACCOUNTING_DEFAULT_PERIOD_ON_TRANSFER=في تحويل المحاسبة ، ما هي الفترة المحددة افتراضيا
ACCOUNTING_SELL_JOURNAL=المبيعات في اليومية العامة (المبيعات و المرتجعات) ACCOUNTING_SELL_JOURNAL=Sales journal - sales and returns
ACCOUNTING_PURCHASE_JOURNAL=المشتريات في اليومية العامة (المشتريات و المرتجعات) ACCOUNTING_PURCHASE_JOURNAL=Purchase journal - purchase and returns
ACCOUNTING_BANK_JOURNAL=النقدي اليومية ( المقبوضات و المدفوعات) ACCOUNTING_BANK_JOURNAL=Cash journal - receipts and disbursements
ACCOUNTING_EXPENSEREPORT_JOURNAL=دفتر تقرير المصروف اليومي ACCOUNTING_EXPENSEREPORT_JOURNAL=دفتر تقرير المصروف اليومي
ACCOUNTING_MISCELLANEOUS_JOURNAL=اليومية العامة ACCOUNTING_MISCELLANEOUS_JOURNAL=اليومية العامة
ACCOUNTING_HAS_NEW_JOURNAL=له دفتر يوميات جديد ACCOUNTING_HAS_NEW_JOURNAL=له دفتر يوميات جديد
@ -238,6 +238,7 @@ ConfirmDeleteMvt=سيؤدي هذا إلى حذف جميع سطور المحاس
ConfirmDeleteMvtPartial=سيؤدي هذا إلى حذف المعاملة من المحاسبة (سيتم حذف جميع الأسطر المتعلقة بنفس المعاملة) ConfirmDeleteMvtPartial=سيؤدي هذا إلى حذف المعاملة من المحاسبة (سيتم حذف جميع الأسطر المتعلقة بنفس المعاملة)
FinanceJournal=دفتر المالية اليومي FinanceJournal=دفتر المالية اليومي
ExpenseReportsJournal=دفتر تقارير المصاريف ExpenseReportsJournal=دفتر تقارير المصاريف
InventoryJournal=المخزون في اليومية
DescFinanceJournal=دفتر المالية اليومي المتضمن لجميع الدفعات عن طريق الحساب المصرفي DescFinanceJournal=دفتر المالية اليومي المتضمن لجميع الدفعات عن طريق الحساب المصرفي
DescJournalOnlyBindedVisible=هذه طريقة عرض للسجل مرتبطة بالحساب ويمكن تسجيلها في دفتر اليوميات و الأستاذ. DescJournalOnlyBindedVisible=هذه طريقة عرض للسجل مرتبطة بالحساب ويمكن تسجيلها في دفتر اليوميات و الأستاذ.
VATAccountNotDefined=حساب ضريبة القيمة المضافة غير محدد VATAccountNotDefined=حساب ضريبة القيمة المضافة غير محدد

View File

@ -145,6 +145,7 @@ Box=بريمج
Boxes=بريمجات Boxes=بريمجات
MaxNbOfLinesForBoxes=الحد الأعلى لعدد أسطر البريمجات MaxNbOfLinesForBoxes=الحد الأعلى لعدد أسطر البريمجات
AllWidgetsWereEnabled=جميع البريمجات المتاحة ممكنة AllWidgetsWereEnabled=جميع البريمجات المتاحة ممكنة
WidgetAvailable=Widget available
PositionByDefault=الطلبية الإفتراضية PositionByDefault=الطلبية الإفتراضية
Position=الوضع Position=الوضع
MenusDesc=يقوم مديرو القائمة بتعيين محتوى شريطي القائمة (الأفقي والعمودي). MenusDesc=يقوم مديرو القائمة بتعيين محتوى شريطي القائمة (الأفقي والعمودي).
@ -374,7 +375,7 @@ DoTestSendHTML=اختبار ارسال هتمل
ErrorCantUseRazIfNoYearInMask=خطأ، لا يمكن استخدام الخيار @ لإعادة تعيين عداد سنويا إذا تسلسل {} أو {yyyy إنهاء س س س س} ليس في قناع. ErrorCantUseRazIfNoYearInMask=خطأ، لا يمكن استخدام الخيار @ لإعادة تعيين عداد سنويا إذا تسلسل {} أو {yyyy إنهاء س س س س} ليس في قناع.
ErrorCantUseRazInStartedYearIfNoYearMonthInMask=خطأ ، لا يمكن للمستخدم الخيار في حال تسلسل @ (ذ ذ م م)) ((سنة أو ملم)) (لا تخفي. ErrorCantUseRazInStartedYearIfNoYearMonthInMask=خطأ ، لا يمكن للمستخدم الخيار في حال تسلسل @ (ذ ذ م م)) ((سنة أو ملم)) (لا تخفي.
UMask=معلمة جديدة UMask صورة يونيكس / لينكس / بي إس دي نظام الملفات. UMask=معلمة جديدة UMask صورة يونيكس / لينكس / بي إس دي نظام الملفات.
UMaskExplanation=تسمح لك هذه المعلمة لتحديد الاذونات التي حددها تقصير من الملفات التي أنشأتها Dolibarr على الخادم (خلال تحميلها على سبيل المثال). <br> يجب أن يكون ثمانية القيمة (على سبيل المثال ، 0666 وسائل القراءة والكتابة للجميع). <br> م شمال شرق paramètre سرت sous الامم المتحدة لتقييم الأداء ويندوز serveur. UMaskExplanation=This parameter allow you to define permissions set by default on files created by Dolibarr on server (during upload for example).<br>It must be the octal value (for example, 0666 means read and write for everyone.). Recommended value is 0600 or 0660<br>This parameter is useless on a Windows server.
SeeWikiForAllTeam=قم بإلقاء نظرة على صفحة Wiki للحصول على قائمة بالمساهمين ومنظمتهم SeeWikiForAllTeam=قم بإلقاء نظرة على صفحة Wiki للحصول على قائمة بالمساهمين ومنظمتهم
UseACacheDelay= التخزين المؤقت للتأخير في الرد على الصادرات ثانية (0 فارغة أو لا مخبأ) UseACacheDelay= التخزين المؤقت للتأخير في الرد على الصادرات ثانية (0 فارغة أو لا مخبأ)
DisableLinkToHelpCenter=إخفاء الارتباط "<b> بحاجة إلى مساعدة أو دعم </b>" في صفحة تسجيل الدخول DisableLinkToHelpCenter=إخفاء الارتباط "<b> بحاجة إلى مساعدة أو دعم </b>" في صفحة تسجيل الدخول
@ -663,7 +664,7 @@ Module2900Desc=GeoIP التحويلات Maxmind القدرات
Module3200Name=المحفوظات غير القابلة للتغيير Module3200Name=المحفوظات غير القابلة للتغيير
Module3200Desc=تمكين سجل غير قابل للتغيير لأحداث العمل. يتم أرشفة الأحداث في الوقت الحقيقي. السجل هو جدول للقراءة فقط للأحداث المتسلسلة التي يمكن تصديرها. قد تكون هذه الوحدة إلزامية لبعض البلدان. Module3200Desc=تمكين سجل غير قابل للتغيير لأحداث العمل. يتم أرشفة الأحداث في الوقت الحقيقي. السجل هو جدول للقراءة فقط للأحداث المتسلسلة التي يمكن تصديرها. قد تكون هذه الوحدة إلزامية لبعض البلدان.
Module3300Name=Module Builder Module3300Name=Module Builder
Module3200Desc=تمكين سجل غير قابل للتغيير لأحداث العمل. يتم أرشفة الأحداث في الوقت الحقيقي. السجل هو جدول للقراءة فقط للأحداث المتسلسلة التي يمكن تصديرها. قد تكون هذه الوحدة إلزامية لبعض البلدان. Module3300Desc=A RAD (Rapid Application Development - low-code and no-code) tool to help developers or advanced users to build their own module/application.
Module3400Name=الشبكات الاجتماعية Module3400Name=الشبكات الاجتماعية
Module3400Desc=قم بتمكين حقول الشبكات الاجتماعية في عناوين وعناوين الأطراف الثالثة (سكايب ، تويتر ، فيسبوك ، ...). Module3400Desc=قم بتمكين حقول الشبكات الاجتماعية في عناوين وعناوين الأطراف الثالثة (سكايب ، تويتر ، فيسبوك ، ...).
Module4000Name=HRM Module4000Name=HRM
@ -2299,7 +2300,7 @@ ExportUseLowMemoryMode=استخدم وضع ذاكرة منخفضة
ExportUseLowMemoryModeHelp=Use the low memory mode to generate the dump file (compression is done through a pipe instead of into the PHP memory). This method does not allow to check that the file is complete and error message can't be reported if it fails. Use it if you experience not enough memory errors. ExportUseLowMemoryModeHelp=Use the low memory mode to generate the dump file (compression is done through a pipe instead of into the PHP memory). This method does not allow to check that the file is complete and error message can't be reported if it fails. Use it if you experience not enough memory errors.
ModuleWebhookName = الويب هوك ModuleWebhookName = الويب هوك
ModuleWebhookDesc = واجهة للقبض على مشغلات dolibarr وإرسالها إلى عنوان URL ModuleWebhookDesc = Interface to catch dolibarr triggers and send data of the event to an URL
WebhookSetup = إعداد Webhook WebhookSetup = إعداد Webhook
Settings = الإعدادات Settings = الإعدادات
WebhookSetupPage = صفحة إعداد Webhook WebhookSetupPage = صفحة إعداد Webhook
@ -2372,3 +2373,6 @@ WarningModuleHasChangedLastVersionCheckParameter=Warning: the module %s has set
WarningModuleHasChangedSecurityCsrfParameter=Warning: the module %s has disabled the CSRF security of your instance. This action is suspect and your installation may no more be secured. Please contact the author of the module for explanation. WarningModuleHasChangedSecurityCsrfParameter=Warning: the module %s has disabled the CSRF security of your instance. This action is suspect and your installation may no more be secured. Please contact the author of the module for explanation.
EMailsInGoingDesc=Incoming emails are managed by the module %s. You must enable and configure it if you need to support ingoing emails. EMailsInGoingDesc=Incoming emails are managed by the module %s. You must enable and configure it if you need to support ingoing emails.
MAIN_IMAP_USE_PHPIMAP=Use the PHP-IMAP library for IMAP instead of native PHP IMAP. This also allows the use of an OAuth2 connection for IMAP (module OAuth must also be activated). MAIN_IMAP_USE_PHPIMAP=Use the PHP-IMAP library for IMAP instead of native PHP IMAP. This also allows the use of an OAuth2 connection for IMAP (module OAuth must also be activated).
MAIN_CHECKBOX_LEFT_COLUMN=Show the column for field and line selection on the left (on the right by default)
CSSPage=CSS Style

View File

@ -50,7 +50,7 @@ UseDateWithoutHourOnFichinter=يخفي الساعات والدقائق خارج
InterventionStatistics=إحصائيات التدخلات InterventionStatistics=إحصائيات التدخلات
NbOfinterventions=عدد بطاقات التدخل NbOfinterventions=عدد بطاقات التدخل
NumberOfInterventionsByMonth=عدد بطاقات التدخل بالشهر (تاريخ المصادقة) NumberOfInterventionsByMonth=عدد بطاقات التدخل بالشهر (تاريخ المصادقة)
AmountOfInteventionNotIncludedByDefault=لا يتم تضمين مقدار التدخل بشكل افتراضي في الربح (في معظم الحالات ، يتم استخدام الجداول الزمنية لحساب الوقت المنقضي). أضف الخيار PROJECT_INCLUDE_INTERVENTION_AMOUNT_IN_PROFIT إلى 1 في المنزل-الإعداد الآخر لتضمينها. AmountOfInteventionNotIncludedByDefault=Amount of intervention is not included by default into profit (in most cases, timesheets are used to count time spent). You can use PROJECT_ELEMENTS_FOR_ADD_MARGIN and PROJECT_ELEMENTS_FOR_MINUS_MARGIN option into home-setup-other to complete list of element included into profit.
InterId=تدخل معرف InterId=تدخل معرف
InterRef=تدخل المرجع. InterRef=تدخل المرجع.
InterDateCreation=تدخل تاريخ الإنشاء InterDateCreation=تدخل تاريخ الإنشاء

View File

@ -91,7 +91,7 @@ MailingModuleDescContactsByFunction=Contacts by position
MailingModuleDescEmailsFromFile=رسائل البريد الإلكتروني من الملف MailingModuleDescEmailsFromFile=رسائل البريد الإلكتروني من الملف
MailingModuleDescEmailsFromUser=إدخال رسائل البريد الإلكتروني من قبل المستخدم MailingModuleDescEmailsFromUser=إدخال رسائل البريد الإلكتروني من قبل المستخدم
MailingModuleDescDolibarrUsers=المستخدمون الذين لديهم رسائل بريد إلكتروني MailingModuleDescDolibarrUsers=المستخدمون الذين لديهم رسائل بريد إلكتروني
MailingModuleDescThirdPartiesByCategories=الأطراف الثالثة (حسب الفئات) MailingModuleDescThirdPartiesByCategories=أطراف ثالثة
SendingFromWebInterfaceIsNotAllowed=الإرسال من واجهة الويب غير مسموح به. SendingFromWebInterfaceIsNotAllowed=الإرسال من واجهة الويب غير مسموح به.
EmailCollectorFilterDesc=يجب أن تتطابق جميع المرشحات حتى يتم جمع بريد إلكتروني EmailCollectorFilterDesc=يجب أن تتطابق جميع المرشحات حتى يتم جمع بريد إلكتروني
@ -179,3 +179,4 @@ RecordCreatedByEmailCollector=السجل الذي تم إنشاؤه بواسطة
DefaultBlacklistMailingStatus=القيمة الافتراضية للحقل "%s" عند تكوين جهة اتصال جديدة DefaultBlacklistMailingStatus=القيمة الافتراضية للحقل "%s" عند تكوين جهة اتصال جديدة
DefaultStatusEmptyMandatory=فارغ ولكنه إلزامي DefaultStatusEmptyMandatory=فارغ ولكنه إلزامي
WarningLimitSendByDay=تحذير: إعداد أو عقد المثيل الخاص بك يحد من عدد رسائل البريد الإلكتروني يوميًا إلى <b> %s </b>. قد تؤدي محاولة إرسال المزيد إلى إبطاء المثيل أو تعليقه. يرجى الاتصال بالدعم الخاص بك إذا كنت بحاجة إلى حصة أعلى. WarningLimitSendByDay=تحذير: إعداد أو عقد المثيل الخاص بك يحد من عدد رسائل البريد الإلكتروني يوميًا إلى <b> %s </b>. قد تؤدي محاولة إرسال المزيد إلى إبطاء المثيل أو تعليقه. يرجى الاتصال بالدعم الخاص بك إذا كنت بحاجة إلى حصة أعلى.
NoMoreRecipientToSendTo=No more recipient to send the email to

View File

@ -186,7 +186,7 @@ CreatedBy=تم الإنشاء بواسطة
NewTicket=تذكرة جديدة NewTicket=تذكرة جديدة
SubjectAnswerToTicket=إجابة التذكرة SubjectAnswerToTicket=إجابة التذكرة
TicketTypeRequest=نوع الطلب TicketTypeRequest=نوع الطلب
TicketCategory=تصنيف التذكرة TicketCategory=Ticket group
SeeTicket=عرض التذكرة SeeTicket=عرض التذكرة
TicketMarkedAsRead=تم تحديد التذكرة كمقروءة TicketMarkedAsRead=تم تحديد التذكرة كمقروءة
TicketReadOn=تمت القراءة في TicketReadOn=تمت القراءة في

View File

@ -145,6 +145,7 @@ Box=Джаджа
Boxes=Джаджи Boxes=Джаджи
MaxNbOfLinesForBoxes=Максимален брой редове за джаджи MaxNbOfLinesForBoxes=Максимален брой редове за джаджи
AllWidgetsWereEnabled=Всички налични джаджи са активирани AllWidgetsWereEnabled=Всички налични джаджи са активирани
WidgetAvailable=Widget available
PositionByDefault=Позиция по подразбиране PositionByDefault=Позиция по подразбиране
Position=Позиция Position=Позиция
MenusDesc=Меню мениджърите определят съдържанието на двете ленти с менюта (хоризонтална и вертикална). MenusDesc=Меню мениджърите определят съдържанието на двете ленти с менюта (хоризонтална и вертикална).
@ -374,7 +375,7 @@ DoTestSendHTML=Тестово изпращане на HTML
ErrorCantUseRazIfNoYearInMask=Грешка, не може да се използва опция @, за да нулирате брояча всяка година, ако последователността {yy} или {yyyy} не е в маската. ErrorCantUseRazIfNoYearInMask=Грешка, не може да се използва опция @, за да нулирате брояча всяка година, ако последователността {yy} или {yyyy} не е в маската.
ErrorCantUseRazInStartedYearIfNoYearMonthInMask=Грешка, не може да се използва опция @, ако последователността {yy}{mm} или {yyyy}{mm} не са в маската. ErrorCantUseRazInStartedYearIfNoYearMonthInMask=Грешка, не може да се използва опция @, ако последователността {yy}{mm} или {yyyy}{mm} не са в маската.
UMask=UMask параметър за нови файлове на Unix / Linux / BSD / Mac файлова система. UMask=UMask параметър за нови файлове на Unix / Linux / BSD / Mac файлова система.
UMaskExplanation=Този параметър ви позволява да дефинирате права, зададени по подразбиране на файлове, които са създадени от Dolibarr на сървъра (например при качване). <br> Необходимо е да бъде в осмична стойност (например 0666 означава четене и запис за всички). <br> Този параметър е безполезен на Windows сървър. UMaskExplanation=This parameter allow you to define permissions set by default on files created by Dolibarr on server (during upload for example).<br>It must be the octal value (for example, 0666 means read and write for everyone.). Recommended value is 0600 or 0660<br>This parameter is useless on a Windows server.
SeeWikiForAllTeam=Разгледайте страницата на Wiki за списък на сътрудниците и тяхната организация SeeWikiForAllTeam=Разгледайте страницата на Wiki за списък на сътрудниците и тяхната организация
UseACacheDelay= Забавяне при кеширане на отговора за експорт в секунди (0 или празно, за да не се използва кеш) UseACacheDelay= Забавяне при кеширане на отговора за експорт в секунди (0 или празно, за да не се използва кеш)
DisableLinkToHelpCenter=Hide the link "<b>Need help or support</b>" on the login page DisableLinkToHelpCenter=Hide the link "<b>Need help or support</b>" on the login page
@ -663,7 +664,7 @@ Module2900Desc=GeoIP Maxmind възможности за преобразува
Module3200Name=Неизменими архиви Module3200Name=Неизменими архиви
Module3200Desc=Непроменлив дневник на бизнес събития. Събитията се архивират в реално време. Дневникът е таблица, достъпна единствено за четене, която съдържа последователни събития, които могат да бъдат експортирани. Този модул може да е задължителен за някои страни. Module3200Desc=Непроменлив дневник на бизнес събития. Събитията се архивират в реално време. Дневникът е таблица, достъпна единствено за четене, която съдържа последователни събития, които могат да бъдат експортирани. Този модул може да е задължителен за някои страни.
Module3300Name=Module Builder Module3300Name=Module Builder
Module3200Desc=Непроменлив дневник на бизнес събития. Събитията се архивират в реално време. Дневникът е таблица, достъпна единствено за четене, която съдържа последователни събития, които могат да бъдат експортирани. Този модул може да е задължителен за някои страни. Module3300Desc=A RAD (Rapid Application Development - low-code and no-code) tool to help developers or advanced users to build their own module/application.
Module3400Name=Социални мрежи Module3400Name=Социални мрежи
Module3400Desc=Enable Social Networks fields into third parties and addresses (skype, twitter, facebook, ...). Module3400Desc=Enable Social Networks fields into third parties and addresses (skype, twitter, facebook, ...).
Module4000Name=ЧР Module4000Name=ЧР
@ -2299,7 +2300,7 @@ ExportUseLowMemoryMode=Use a low memory mode
ExportUseLowMemoryModeHelp=Use the low memory mode to generate the dump file (compression is done through a pipe instead of into the PHP memory). This method does not allow to check that the file is complete and error message can't be reported if it fails. Use it if you experience not enough memory errors. ExportUseLowMemoryModeHelp=Use the low memory mode to generate the dump file (compression is done through a pipe instead of into the PHP memory). This method does not allow to check that the file is complete and error message can't be reported if it fails. Use it if you experience not enough memory errors.
ModuleWebhookName = Webhook ModuleWebhookName = Webhook
ModuleWebhookDesc = Interface to catch dolibarr triggers and send it to an URL ModuleWebhookDesc = Interface to catch dolibarr triggers and send data of the event to an URL
WebhookSetup = Webhook setup WebhookSetup = Webhook setup
Settings = Настройки Settings = Настройки
WebhookSetupPage = Webhook setup page WebhookSetupPage = Webhook setup page
@ -2372,3 +2373,6 @@ WarningModuleHasChangedLastVersionCheckParameter=Warning: the module %s has set
WarningModuleHasChangedSecurityCsrfParameter=Warning: the module %s has disabled the CSRF security of your instance. This action is suspect and your installation may no more be secured. Please contact the author of the module for explanation. WarningModuleHasChangedSecurityCsrfParameter=Warning: the module %s has disabled the CSRF security of your instance. This action is suspect and your installation may no more be secured. Please contact the author of the module for explanation.
EMailsInGoingDesc=Incoming emails are managed by the module %s. You must enable and configure it if you need to support ingoing emails. EMailsInGoingDesc=Incoming emails are managed by the module %s. You must enable and configure it if you need to support ingoing emails.
MAIN_IMAP_USE_PHPIMAP=Use the PHP-IMAP library for IMAP instead of native PHP IMAP. This also allows the use of an OAuth2 connection for IMAP (module OAuth must also be activated). MAIN_IMAP_USE_PHPIMAP=Use the PHP-IMAP library for IMAP instead of native PHP IMAP. This also allows the use of an OAuth2 connection for IMAP (module OAuth must also be activated).
MAIN_CHECKBOX_LEFT_COLUMN=Show the column for field and line selection on the left (on the right by default)
CSSPage=CSS Style

View File

@ -50,7 +50,7 @@ UseDateWithoutHourOnFichinter=Скриване на часовете и мину
InterventionStatistics=Статистика на интервенции InterventionStatistics=Статистика на интервенции
NbOfinterventions=Брой интервенции NbOfinterventions=Брой интервенции
NumberOfInterventionsByMonth=Брой интервенции по месец (по дата на валидиране) NumberOfInterventionsByMonth=Брой интервенции по месец (по дата на валидиране)
AmountOfInteventionNotIncludedByDefault=Общата продължителност на интервенцията не е включена по подразбиране в печалбата (в повечето случаи за отчитане на времето се използват графиците за отделно време). Добавете опцията PROJECT_INCLUDE_INTERVENTION_AMOUNT_IN_PROFIT със стойност 1 в Начало -> Настройки -> Други настройки, за да я включите. AmountOfInteventionNotIncludedByDefault=Amount of intervention is not included by default into profit (in most cases, timesheets are used to count time spent). You can use PROJECT_ELEMENTS_FOR_ADD_MARGIN and PROJECT_ELEMENTS_FOR_MINUS_MARGIN option into home-setup-other to complete list of element included into profit.
InterId=Идентификатор на интервенция InterId=Идентификатор на интервенция
InterRef=Съгласно интервенция № InterRef=Съгласно интервенция №
InterDateCreation=Дата на създаване на интервенцията InterDateCreation=Дата на създаване на интервенцията
@ -66,3 +66,7 @@ RepeatableIntervention=Шаблон на интервенция
ToCreateAPredefinedIntervention=За да създадете предварително определена или повтаряща се интервенция, създайте интервенция и я превърнете в шаблон за интервенция. ToCreateAPredefinedIntervention=За да създадете предварително определена или повтаряща се интервенция, създайте интервенция и я превърнете в шаблон за интервенция.
ConfirmReopenIntervention=Are you sure you want to open back the intervention <b>%s</b>? ConfirmReopenIntervention=Are you sure you want to open back the intervention <b>%s</b>?
GenerateInter=Generate intervention GenerateInter=Generate intervention
FichinterNoContractLinked=Intervention %s has been created without a linked contract.
ErrorFicheinterCompanyDoesNotExist=Company does not exist. Intervention has not been created.
NextDateToIntervention=Date for next intervention generation
NoIntervention=No intervention

View File

@ -91,7 +91,7 @@ MailingModuleDescContactsByFunction=Контакти с длъжност
MailingModuleDescEmailsFromFile=Имейли от файл MailingModuleDescEmailsFromFile=Имейли от файл
MailingModuleDescEmailsFromUser=Имейли, въведени от потребител MailingModuleDescEmailsFromUser=Имейли, въведени от потребител
MailingModuleDescDolibarrUsers=Потребители с имейли MailingModuleDescDolibarrUsers=Потребители с имейли
MailingModuleDescThirdPartiesByCategories=Контрагенти (с категории) MailingModuleDescThirdPartiesByCategories=Контрагенти
SendingFromWebInterfaceIsNotAllowed=Изпращането от уеб интерфейса не е позволено. SendingFromWebInterfaceIsNotAllowed=Изпращането от уеб интерфейса не е позволено.
EmailCollectorFilterDesc=All filters must match to have an email being collected EmailCollectorFilterDesc=All filters must match to have an email being collected
@ -179,3 +179,4 @@ RecordCreatedByEmailCollector=Record created by the Email Collector %s from emai
DefaultBlacklistMailingStatus=Default value for field '%s' when creating a new contact DefaultBlacklistMailingStatus=Default value for field '%s' when creating a new contact
DefaultStatusEmptyMandatory=Empty but mandatory DefaultStatusEmptyMandatory=Empty but mandatory
WarningLimitSendByDay=WARNING: The setup or contract of your instance limits your number of emails per day to <b>%s</b>. Trying to send more may result in having your instance slow down or suspended. Please contact your support if you need a higher quota. WarningLimitSendByDay=WARNING: The setup or contract of your instance limits your number of emails per day to <b>%s</b>. Trying to send more may result in having your instance slow down or suspended. Please contact your support if you need a higher quota.
NoMoreRecipientToSendTo=No more recipient to send the email to

View File

@ -91,7 +91,7 @@ MailingModuleDescContactsByFunction=Contacts by position
MailingModuleDescEmailsFromFile=Emails from file MailingModuleDescEmailsFromFile=Emails from file
MailingModuleDescEmailsFromUser=Emails input by user MailingModuleDescEmailsFromUser=Emails input by user
MailingModuleDescDolibarrUsers=Users with Emails MailingModuleDescDolibarrUsers=Users with Emails
MailingModuleDescThirdPartiesByCategories=Third parties (by categories) MailingModuleDescThirdPartiesByCategories=Subjekti
SendingFromWebInterfaceIsNotAllowed=Sending from web interface is not allowed. SendingFromWebInterfaceIsNotAllowed=Sending from web interface is not allowed.
EmailCollectorFilterDesc=All filters must match to have an email being collected EmailCollectorFilterDesc=All filters must match to have an email being collected
@ -179,3 +179,4 @@ RecordCreatedByEmailCollector=Record created by the Email Collector %s from emai
DefaultBlacklistMailingStatus=Default value for field '%s' when creating a new contact DefaultBlacklistMailingStatus=Default value for field '%s' when creating a new contact
DefaultStatusEmptyMandatory=Empty but mandatory DefaultStatusEmptyMandatory=Empty but mandatory
WarningLimitSendByDay=WARNING: The setup or contract of your instance limits your number of emails per day to <b>%s</b>. Trying to send more may result in having your instance slow down or suspended. Please contact your support if you need a higher quota. WarningLimitSendByDay=WARNING: The setup or contract of your instance limits your number of emails per day to <b>%s</b>. Trying to send more may result in having your instance slow down or suspended. Please contact your support if you need a higher quota.
NoMoreRecipientToSendTo=No more recipient to send the email to

View File

@ -95,13 +95,13 @@ ChangeAndLoad=Canviar i carregar
Addanaccount=Afegir un compte comptable Addanaccount=Afegir un compte comptable
AccountAccounting=Compte comptable AccountAccounting=Compte comptable
AccountAccountingShort=Compte AccountAccountingShort=Compte
SubledgerAccount=Subcompte comptable SubledgerAccount=Compte de subllibre
SubledgerAccountLabel=Nom del compte del llibre major SubledgerAccountLabel=Nom del compte de subllibre
ShowAccountingAccount=Mostrar diari de comptes ShowAccountingAccount=Mostrar diari de comptes
ShowAccountingJournal=Mostrar diari comptable ShowAccountingJournal=Mostrar diari comptable
ShowAccountingAccountInLedger=Mostra el compte comptable al Llibre major ShowAccountingAccountInLedger=Mostra el compte comptable al Llibre major
ShowAccountingAccountInJournals=Mostra el compte comptable als diaris ShowAccountingAccountInJournals=Mostra el compte comptable als diaris
DataUsedToSuggestAccount=Data used to suggest account DataUsedToSuggestAccount=Dades utilitzades per a suggerir un compte
AccountAccountingSuggest=Compte suggerit AccountAccountingSuggest=Compte suggerit
MenuDefaultAccounts=Comptes per defecte MenuDefaultAccounts=Comptes per defecte
MenuBankAccounts=Comptes bancaris MenuBankAccounts=Comptes bancaris
@ -125,7 +125,7 @@ UpdateMvts=Modificació d'una transacció
ValidTransaction=Valida l'assentament ValidTransaction=Valida l'assentament
WriteBookKeeping=Registrar transaccions en comptabilitat WriteBookKeeping=Registrar transaccions en comptabilitat
Bookkeeping=Llibre major Bookkeeping=Llibre major
BookkeepingSubAccount=Subcompte BookkeepingSubAccount=Subquadern
AccountBalance=Compte saldo AccountBalance=Compte saldo
AccountBalanceSubAccount=Saldo de subcomptes AccountBalanceSubAccount=Saldo de subcomptes
ObjectsRef=Referència de l'objecte origen ObjectsRef=Referència de l'objecte origen
@ -167,9 +167,9 @@ ACCOUNTANCY_COMBO_FOR_AUX=Activa la llista combinada per a un compte subsidiari
ACCOUNTING_DATE_START_BINDING=Definiu una data per a començar la vinculació i transferència a la comptabilitat. Per sota d’aquesta data, les transaccions no es transferiran a la comptabilitat. ACCOUNTING_DATE_START_BINDING=Definiu una data per a començar la vinculació i transferència a la comptabilitat. Per sota d’aquesta data, les transaccions no es transferiran a la comptabilitat.
ACCOUNTING_DEFAULT_PERIOD_ON_TRANSFER=En la transferència comptable, quin és el període seleccionat per defecte ACCOUNTING_DEFAULT_PERIOD_ON_TRANSFER=En la transferència comptable, quin és el període seleccionat per defecte
ACCOUNTING_SELL_JOURNAL=Diari de vendes (vendes i devolucions) ACCOUNTING_SELL_JOURNAL=Diari de vendes: vendes i devolucions
ACCOUNTING_PURCHASE_JOURNAL=Diari de compres (compres i devolucions) ACCOUNTING_PURCHASE_JOURNAL=Diari de compres: compres i devolucions
ACCOUNTING_BANK_JOURNAL=Diari d'efectiu (entrades i desemborsaments) ACCOUNTING_BANK_JOURNAL=Diari d'efectiu: rebuts i desemborsaments
ACCOUNTING_EXPENSEREPORT_JOURNAL=Diari de l'informe de despeses ACCOUNTING_EXPENSEREPORT_JOURNAL=Diari de l'informe de despeses
ACCOUNTING_MISCELLANEOUS_JOURNAL=Diari general ACCOUNTING_MISCELLANEOUS_JOURNAL=Diari general
ACCOUNTING_HAS_NEW_JOURNAL=Té un nou Diari ACCOUNTING_HAS_NEW_JOURNAL=Té un nou Diari
@ -185,27 +185,27 @@ TransitionalAccount=Compte de transferència bancària transitòria
ACCOUNTING_ACCOUNT_SUSPENSE=Compte (del pla comptable) que s'utilitzarà com a compte per als fons no assignats, ja siguin rebuts o pagats, és a dir, fons en "espera" ACCOUNTING_ACCOUNT_SUSPENSE=Compte (del pla comptable) que s'utilitzarà com a compte per als fons no assignats, ja siguin rebuts o pagats, és a dir, fons en "espera"
DONATION_ACCOUNTINGACCOUNT=Compte (del pla comptable) que s'utilitzarà per a registrar donacions (mòdul de donacions) DONATION_ACCOUNTINGACCOUNT=Compte (del pla comptable) que s'utilitzarà per a registrar donacions (mòdul de donacions)
ADHERENT_SUBSCRIPTION_ACCOUNTINGACCOUNT=Account (from the Chart Of Account) to be used to register memberships subscriptions (Membership module - if membership recorded without invoice) ADHERENT_SUBSCRIPTION_ACCOUNTINGACCOUNT=Compte (del pla comptable) que s'utilitzarà per a registrar les subscripcions de socis (mòdul d'afiliació - si l'afiliació es registra sense factura)
ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Account (from the Chart Of Account) to be used as the default account to register customer deposit ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT=Compte (del pla comptable) que s'utilitzarà com a compte predeterminat per registrar el dipòsit del client
UseAuxiliaryAccountOnCustomerDeposit=Emmagatzema el compte del client com a compte individual al llibre major subsidiari per a les línies de pagament inicial (si està desactivat, el compte individual per a les línies de pagament inicial romandrà buit) UseAuxiliaryAccountOnCustomerDeposit=Emmagatzema el compte del client com a compte individual al llibre major subsidiari per a les línies de pagament inicial (si està desactivat, el compte individual per a les línies de pagament inicial romandrà buit)
ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Account (from the Chart Of Account) to be used as the default ACCOUNTING_ACCOUNT_SUPPLIER_DEPOSIT=Compte (del pla comptable) que s'utilitzarà com a predeterminat
UseAuxiliaryAccountOnSupplierDeposit=Emmagatzema el compte del proveïdor com a compte individual al llibre major subsidiari per a les línies de pagament inicial (si està desactivat, el compte individual de les línies de pagament inicial romandrà buit) UseAuxiliaryAccountOnSupplierDeposit=Emmagatzema el compte del proveïdor com a compte individual al llibre major subsidiari per a les línies de pagament inicial (si està desactivat, el compte individual de les línies de pagament inicial romandrà buit)
ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Accounting account by default to register customer retained warranty ACCOUNTING_ACCOUNT_CUSTOMER_RETAINED_WARRANTY=Compte comptable per defecte per a registrar la garantia retinguda del client
ACCOUNTING_PRODUCT_BUY_ACCOUNT=Compte (del pla comptable) que s'utilitzarà com a compte predeterminat per als productes comprats al mateix país (utilitzat si no està definit a la fitxa del producte) ACCOUNTING_PRODUCT_BUY_ACCOUNT=Compte (del pla comptable) que s'utilitzarà com a compte predeterminat per als productes comprats al mateix país (utilitzat si no està definit a la fitxa del producte)
ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased from EEC to another EEC country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT=Compte (del pla comptable) que s'utilitzarà com a compte predeterminat per als productes comprats des de la CEE a un altre país de la CEE (utilitzat si no està definit a la fitxa del producte)
ACCOUNTING_PRODUCT_BUY_EXPORT_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products purchased and imported from any other foreign country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_BUY_EXPORT_ACCOUNT=Compte (del pla comptable) que s'utilitzarà com a compte predeterminat per als productes comprats i importats de qualsevol altre país estranger (utilitzat si no està definit a la fitxa del producte)
ACCOUNTING_PRODUCT_SOLD_ACCOUNT=Compte (del pla comptable) que s'utilitzarà com a compte predeterminat per als productes venuts (utilitzat si no està definit a la fitxa del producte) ACCOUNTING_PRODUCT_SOLD_ACCOUNT=Compte (del pla comptable) que s'utilitzarà com a compte predeterminat per als productes venuts (utilitzat si no està definit a la fitxa del producte)
ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products sold from EEC to another EEC country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT=Compte (del pla comptable) que s'utilitzarà com a compte predeterminat per als productes venuts des de la CEE a un altre país de la CEE (utilitzat si no està definit a la fitxa del producte)
ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the products sold and exported to any other foreign country (used if not defined in the product sheet) ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT=Compte (del pla comptable) que s'utilitzarà com a compte predeterminat per als productes venuts i exportats a qualsevol altre país estranger (utilitzat si no està definit a la fitxa del producte)
ACCOUNTING_SERVICE_BUY_ACCOUNT=Compte (del pla comptable) que s'utilitzarà com a compte predeterminat per als serveis adquirits al mateix país (utilitzat si no està definit al full de servei) ACCOUNTING_SERVICE_BUY_ACCOUNT=Compte (del pla comptable) que s'utilitzarà com a compte predeterminat per als serveis adquirits al mateix país (utilitzat si no està definit al full de servei)
ACCOUNTING_SERVICE_BUY_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services purchased from EEC to another EEC country (used if not defined in the service sheet) ACCOUNTING_SERVICE_BUY_INTRA_ACCOUNT=Compte (del pla comptable) que s'utilitzarà com a compte predeterminat per als serveis adquirits de la CEE a un altre país de la CEE (utilitzat si no està definit al full de servei)
ACCOUNTING_SERVICE_BUY_EXPORT_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services purchased and imported from other foreign country (used if not defined in the service sheet) ACCOUNTING_SERVICE_BUY_EXPORT_ACCOUNT=Compte (del pla comptable) que s'utilitzarà com a compte predeterminat per als serveis comprats i importats d'un altre país estranger (utilitzat si no està definit al full de servei)
ACCOUNTING_SERVICE_SOLD_ACCOUNT=Compte (del pla comptable) que s'utilitzarà com a compte predeterminat per als serveis venuts (utilitzat si no està definit al full de servei) ACCOUNTING_SERVICE_SOLD_ACCOUNT=Compte (del pla comptable) que s'utilitzarà com a compte predeterminat per als serveis venuts (utilitzat si no està definit al full de servei)
ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services sold from EEC to another EEC country (used if not defined in the service sheet) ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT=Compte (del pla comptable) que s'utilitzarà com a compte predeterminat per als serveis venuts des de la CEE a un altre país de la CEE (utilitzat si no està definit al full de servei)
ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT=Account (from the Chart Of Account) to be used as the default account for the services sold and exported to any other foreign country (used if not defined in the service sheet) ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT=Compte (del pla comptable) que s'utilitzarà com a compte predeterminat per als serveis venuts i exportats a qualsevol altre país estranger (utilitzat si no està definit al full de servei)
Doctype=Tipus de document Doctype=Tipus de document
Docdate=Data Docdate=Data
@ -223,7 +223,7 @@ TransactionNumShort=Número de transacció
AccountingCategory=Grup de comptes personalitzat AccountingCategory=Grup de comptes personalitzat
AccountingCategories=Grups de comptes personalitzats AccountingCategories=Grups de comptes personalitzats
GroupByAccountAccounting=Agrupa per compte major GroupByAccountAccounting=Agrupa per compte major
GroupBySubAccountAccounting=Agrupa per subcompte comptable GroupBySubAccountAccounting=Agrupa per compte del subllibre
AccountingAccountGroupsDesc=Podeu definir aquí alguns grups de comptes comptables. S'utilitzaran per a informes comptables personalitzats. AccountingAccountGroupsDesc=Podeu definir aquí alguns grups de comptes comptables. S'utilitzaran per a informes comptables personalitzats.
ByAccounts=Per comptes ByAccounts=Per comptes
ByPredefinedAccountGroups=Per grups predefinits ByPredefinedAccountGroups=Per grups predefinits
@ -238,6 +238,7 @@ ConfirmDeleteMvt=Això suprimirà totes les línies de comptabilitat per a l'any
ConfirmDeleteMvtPartial=Això suprimirà la transacció de la comptabilitat (se suprimiran totes les línies relacionades amb la mateixa transacció) ConfirmDeleteMvtPartial=Això suprimirà la transacció de la comptabilitat (se suprimiran totes les línies relacionades amb la mateixa transacció)
FinanceJournal=Diari de finances FinanceJournal=Diari de finances
ExpenseReportsJournal=Informe-diari de despeses ExpenseReportsJournal=Informe-diari de despeses
InventoryJournal=Diari d'inventari
DescFinanceJournal=Diari financer que inclou tots els tipus de pagaments per compte bancari DescFinanceJournal=Diari financer que inclou tots els tipus de pagaments per compte bancari
DescJournalOnlyBindedVisible=Aquesta és una vista de registre que està vinculada a un compte comptable i que es pot registrar als diaris i llibres majors. DescJournalOnlyBindedVisible=Aquesta és una vista de registre que està vinculada a un compte comptable i que es pot registrar als diaris i llibres majors.
VATAccountNotDefined=Comptes comptables d'IVA sense definir VATAccountNotDefined=Comptes comptables d'IVA sense definir
@ -257,9 +258,9 @@ DescThirdPartyReport=Consulteu aquí la llista dels clients i proveïdors de ter
ListAccounts=Llistat dels comptes comptables ListAccounts=Llistat dels comptes comptables
UnknownAccountForThirdparty=Compte comptable de tercer desconeguda, utilitzarem %s UnknownAccountForThirdparty=Compte comptable de tercer desconeguda, utilitzarem %s
UnknownAccountForThirdpartyBlocking=Compte comptable de tercer desconegut. Error de bloqueig UnknownAccountForThirdpartyBlocking=Compte comptable de tercer desconegut. Error de bloqueig
ThirdpartyAccountNotDefinedOrThirdPartyUnknown=Compte Subterrani no definit o desconegut per tercers o usuaris. Utilitzarem %s ThirdpartyAccountNotDefinedOrThirdPartyUnknown=Compte de subllibre no definit o tercer o usuari desconegut. Utilitzarem %s
ThirdpartyAccountNotDefinedOrThirdPartyUnknownSubledgerIgnored=Tercer desconegut i subcompte comptable no definit al pagament. Es manté buit el valor del subcompte comptable. ThirdpartyAccountNotDefinedOrThirdPartyUnknownSubledgerIgnored=Tercer desconegut i subcompte comptable no definit al pagament. Es manté buit el valor del subcompte comptable.
ThirdpartyAccountNotDefinedOrThirdPartyUnknownBlocking=Compte Subterrani no definit o desconegut per tercers o usuaris. Error de bloqueig. ThirdpartyAccountNotDefinedOrThirdPartyUnknownBlocking=Compte de subllibre no definit o tercer o usuari desconegut. Error de bloqueig.
UnknownAccountForThirdpartyAndWaitingAccountNotDefinedBlocking=Compte de tercers desconegut i compte d'espera no definit. Error de bloqueig UnknownAccountForThirdpartyAndWaitingAccountNotDefinedBlocking=Compte de tercers desconegut i compte d'espera no definit. Error de bloqueig
PaymentsNotLinkedToProduct=Pagament no vinculat a cap producte / servei PaymentsNotLinkedToProduct=Pagament no vinculat a cap producte / servei
OpeningBalance=Saldo d'obertura OpeningBalance=Saldo d'obertura
@ -269,7 +270,7 @@ ShowSubtotalByGroup=Mostra el subtotal per nivell
Pcgtype=Grup de comptes Pcgtype=Grup de comptes
PcgtypeDesc=S'utilitzen grups de comptes com a criteris predefinits de «filtre» i «agrupació» per a alguns informes de comptabilitat. Per exemple, «INGRESSOS» o «DESPESES» s'utilitzen com a grups per a comptes comptables de productes per a crear l'informe de despeses/ingressos. PcgtypeDesc=S'utilitzen grups de comptes com a criteris predefinits de «filtre» i «agrupació» per a alguns informes de comptabilitat. Per exemple, «INGRESSOS» o «DESPESES» s'utilitzen com a grups per a comptes comptables de productes per a crear l'informe de despeses/ingressos.
AccountingCategoriesDesc=Custom group of accounts can be used to group accounting accounts into one name to ease filter use or building of custom reports. AccountingCategoriesDesc=El grup de comptes personalitzat es pot utilitzar per a agrupar els comptes comptables en un sol nom per a facilitar l'ús del filtre o la creació d'informes personalitzats.
Reconcilable=Reconciliable Reconcilable=Reconciliable
@ -299,7 +300,7 @@ DescValidateMovements=Queda prohibida qualsevol modificació o supressió de reg
ValidateHistory=Comptabilitza automàticament ValidateHistory=Comptabilitza automàticament
AutomaticBindingDone=Enllaços automàtics fets (%s): l'enllaç automàtic no és possible per a alguns registres (%s) AutomaticBindingDone=Enllaços automàtics fets (%s): l'enllaç automàtic no és possible per a alguns registres (%s)
DoManualBindingForFailedRecord=You have to do a manual link for the %s row(s) not linked automatically. DoManualBindingForFailedRecord=Heu de fer un enllaç manual per a les %s files no enllaçades automàticament.
ErrorAccountancyCodeIsAlreadyUse=Error, no podeu eliminar ni desactivar aquest compte del pla comptable perquè està en ús ErrorAccountancyCodeIsAlreadyUse=Error, no podeu eliminar ni desactivar aquest compte del pla comptable perquè està en ús
MvtNotCorrectlyBalanced=Moviment no equilibrat correctament. Dèbit = %s i crèdit = %s MvtNotCorrectlyBalanced=Moviment no equilibrat correctament. Dèbit = %s i crèdit = %s
@ -342,11 +343,11 @@ NumberOfAccountancyMovements=Nombre de moviments
ACCOUNTING_DISABLE_BINDING_ON_SALES=Desactiva la vinculació i transferència de comptabilitat en vendes (les factures dels clients no es tindran en compte a la comptabilitat) ACCOUNTING_DISABLE_BINDING_ON_SALES=Desactiva la vinculació i transferència de comptabilitat en vendes (les factures dels clients no es tindran en compte a la comptabilitat)
ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Desactiva la vinculació i transferència a la comptabilitat de les compres (les factures de proveïdors no es tindran en compte a la comptabilitat) ACCOUNTING_DISABLE_BINDING_ON_PURCHASES=Desactiva la vinculació i transferència a la comptabilitat de les compres (les factures de proveïdors no es tindran en compte a la comptabilitat)
ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Desactiva la vinculació i transferència de comptes en els informes de despeses (els informes de despeses no es tindran en compte a la comptabilitat) ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS=Desactiva la vinculació i transferència de comptes en els informes de despeses (els informes de despeses no es tindran en compte a la comptabilitat)
ACCOUNTING_ENABLE_LETTERING=Enable the lettering function in the accounting ACCOUNTING_ENABLE_LETTERING=Habiliteu la funció de lletres a la comptabilitat
ACCOUNTING_ENABLE_AUTOLETTERING=Habiliteu la lletra automàtica en traspassar a la comptabilitat ACCOUNTING_ENABLE_AUTOLETTERING=Habiliteu la lletra automàtica en traspassar a la comptabilitat
## Export ## Export
NotExportLettering=Do not export the lettering when generating the file NotExportLettering=No exporteu la lletra en generar el fitxer
NotifiedExportDate=Marca les línies exportades com a Exportades <span class="warning">(per a modificar una línia, hauràs de suprimir tota la transacció i tornar-la a transferir a la comptabilitat)</span> NotifiedExportDate=Marca les línies exportades com a Exportades <span class="warning">(per a modificar una línia, hauràs de suprimir tota la transacció i tornar-la a transferir a la comptabilitat)</span>
NotifiedValidationDate=Validar i bloquejar les entrades exportades <span class="warning">(mateix efecte que la característica "%s", la modificació i la supressió de les línies DEFINITIVAMENT no seran possibles)</span> NotifiedValidationDate=Validar i bloquejar les entrades exportades <span class="warning">(mateix efecte que la característica "%s", la modificació i la supressió de les línies DEFINITIVAMENT no seran possibles)</span>
NotifiedExportFull=Exportar documents? NotifiedExportFull=Exportar documents?
@ -406,7 +407,7 @@ SaleLocal=Venda local
SaleExport=Venda d’exportació SaleExport=Venda d’exportació
SaleEEC=Venda en CEE SaleEEC=Venda en CEE
SaleEECWithVAT=Venda a la CEE amb un IVA que no és nul, per la qual cosa suposem que NO es tracta d’una venda intracomunitària i el compte suggerit és el compte estàndard del producte. SaleEECWithVAT=Venda a la CEE amb un IVA que no és nul, per la qual cosa suposem que NO es tracta d’una venda intracomunitària i el compte suggerit és el compte estàndard del producte.
SaleEECWithoutVATNumber=Sale in EEC with no VAT but the VAT ID of thirdparty is not defined. We fall back on the account for standard sales. You can fix the VAT ID of the thirdparty, or change the product account suggested for binding if needed. SaleEECWithoutVATNumber=Venda a la CEE sense IVA, però l'identificador d'IVA del tercer no està definit. Tornem al compte de vendes estàndard. Podeu corregir l'identificador d'IVA del tercer o canviar el compte del producte suggerit per vincular-lo si cal.
ForbiddenTransactionAlreadyExported=Prohibit: la transacció ha estat validada i/o exportada. ForbiddenTransactionAlreadyExported=Prohibit: la transacció ha estat validada i/o exportada.
ForbiddenTransactionAlreadyValidated=Prohibit: la transacció s'ha validat. ForbiddenTransactionAlreadyValidated=Prohibit: la transacció s'ha validat.
## Dictionary ## Dictionary
@ -430,7 +431,7 @@ AccountancyUnletteringModifiedSuccessfully=%s conciliació desfeta correctament
## Confirm box ## Confirm box
ConfirmMassUnletteringAuto=Confirmació de desconciliació automàtica massiva ConfirmMassUnletteringAuto=Confirmació de desconciliació automàtica massiva
ConfirmMassUnletteringManual=Confirmació de desconciliació manual massiva ConfirmMassUnletteringManual=Confirmació de desconciliació manual massiva
ConfirmMassUnletteringQuestion=Are you sure you want to unreconcile the %s selected record(s)? ConfirmMassUnletteringQuestion=Esteu segur que voleu anul·lar la conciliació dels registres seleccionats %s?
ConfirmMassDeleteBookkeepingWriting=Confirmació d'esborrament massiu ConfirmMassDeleteBookkeepingWriting=Confirmació d'esborrament massiu
ConfirmMassDeleteBookkeepingWritingQuestion=Això suprimirà la transacció de la comptabilitat (se suprimiran totes les línies relacionades amb la mateixa transacció) Esteu segur que voleu suprimir els registres seleccionats %s? ConfirmMassDeleteBookkeepingWritingQuestion=Això suprimirà la transacció de la comptabilitat (se suprimiran totes les línies relacionades amb la mateixa transacció) Esteu segur que voleu suprimir els registres seleccionats %s?
@ -461,11 +462,11 @@ FECFormatEntryNum=Número de peça (EcritureNum)
FECFormatEntryDate=Data de la peça (EcritureDate) FECFormatEntryDate=Data de la peça (EcritureDate)
FECFormatGeneralAccountNumber=Número de compte general (CompteNum) FECFormatGeneralAccountNumber=Número de compte general (CompteNum)
FECFormatGeneralAccountLabel=Nom de compte general (CompteLib) FECFormatGeneralAccountLabel=Nom de compte general (CompteLib)
FECFormatSubledgerAccountNumber=Número de compte de Subledger (CompAuxNum) FECFormatSubledgerAccountNumber=Número de compte auxiliar (CompAuxNum)
FECFormatSubledgerAccountLabel=Número de compte de Subledger (CompAuxLib) FECFormatSubledgerAccountLabel=Número de compte auxiliar (CompAuxLib)
FECFormatPieceRef=Peça ref. (PieceRef) FECFormatPieceRef=Peça ref. (PieceRef)
FECFormatPieceDate=Creació de la data de la peça (PieceDate) FECFormatPieceDate=Creació de la data de la peça (PieceDate)
FECFormatLabelOperation=Funcionament de l'etiqueta (EcritureLib) FECFormatLabelOperation=Nom de l'operació (EcritureLib)
FECFormatDebit=Dèbit (dèbit) FECFormatDebit=Dèbit (dèbit)
FECFormatCredit=Crèdit (Crèdit) FECFormatCredit=Crèdit (Crèdit)
FECFormatReconcilableCode=Codi reconciliable (EcritureLet) FECFormatReconcilableCode=Codi reconciliable (EcritureLet)
@ -477,7 +478,7 @@ FECFormatMulticurrencyCode=Codi multidivisa (Idevise)
DateExport=Data d'exportació DateExport=Data d'exportació
WarningReportNotReliable=Avís, aquest informe no està basat en el Llibre Major, de manera que no conté assentaments modificats manualment en el Llibre Major. Si el registre diari està actualitzat, la vista de comptes és més precisa. WarningReportNotReliable=Avís, aquest informe no està basat en el Llibre Major, de manera que no conté assentaments modificats manualment en el Llibre Major. Si el registre diari està actualitzat, la vista de comptes és més precisa.
ExpenseReportJournal=Diari d'informe de despeses ExpenseReportJournal=Diari d'informe de despeses
DocsAlreadyExportedAreExcluded=Docs already exported are excluded DocsAlreadyExportedAreExcluded=S'exclouen els documents ja exportats
ClickToHideAlreadyExportedLines=Click to hide already exported lines ClickToHideAlreadyExportedLines=Feu clic per a amagar les línies ja exportades
NAccounts=comptes %s NAccounts=comptes %s

View File

@ -87,7 +87,7 @@ NotAvailableWhenAjaxDisabled=No disponible quan Ajax estigui desactivat
AllowToSelectProjectFromOtherCompany=En un document d'un tercer, pots triar un projecte enllaçat a un altre tercer AllowToSelectProjectFromOtherCompany=En un document d'un tercer, pots triar un projecte enllaçat a un altre tercer
TimesheetPreventAfterFollowingMonths=Eviteu el temps de gravació passat el següent nombre de mesos TimesheetPreventAfterFollowingMonths=Eviteu el temps de gravació passat el següent nombre de mesos
JavascriptDisabled=Javascript desactivat JavascriptDisabled=Javascript desactivat
UsePreviewTabs=Veure fitxes "vista prèvia" UsePreviewTabs=Utilitzeu pestanyes de vista prèvia
ShowPreview=Veure previsualització ShowPreview=Veure previsualització
ShowHideDetails=Mostra-Amaga els detalls ShowHideDetails=Mostra-Amaga els detalls
PreviewNotAvailable=Vista prèvia no disponible PreviewNotAvailable=Vista prèvia no disponible
@ -111,7 +111,7 @@ UseCaptchaCode=Utilitzeu el codi gràfic (CAPTCHA) a la pàgina d'inici de sessi
AntiVirusCommand=Camí complet a l'ordre antivirus AntiVirusCommand=Camí complet a l'ordre antivirus
AntiVirusCommandExample=Exemple per al dimoni ClamAv (requereix clamav-daemon): /usr/bin/clamdscan<br>Exemple per a ClamWin (molt molt lent): c:\\Progra~1\\ClamWin\\bin\\clamscan.exe AntiVirusCommandExample=Exemple per al dimoni ClamAv (requereix clamav-daemon): /usr/bin/clamdscan<br>Exemple per a ClamWin (molt molt lent): c:\\Progra~1\\ClamWin\\bin\\clamscan.exe
AntiVirusParam= Més paràmetres a la línia d'ordres AntiVirusParam= Més paràmetres a la línia d'ordres
AntiVirusParamExample=Exemple per al dimoni de ClamAv: --fdpass<br>Exemple per a ClamWin: --database="C:\\Program Files (x86)\\ClamWin\\lib" AntiVirusParamExample=Exemple del dimoni de ClamAv: --fdpass<br>Exemple de ClamWin: --database="C:\\Program Files (x86)\\ClamWin\\lib"
ComptaSetup=Configuració del mòdul Comptabilitat ComptaSetup=Configuració del mòdul Comptabilitat
UserSetup=Configuració de gestió d'usuaris UserSetup=Configuració de gestió d'usuaris
MultiCurrencySetup=Configuració multidivisa MultiCurrencySetup=Configuració multidivisa
@ -145,6 +145,7 @@ Box=Panell
Boxes=Panells Boxes=Panells
MaxNbOfLinesForBoxes=Màx. nombre de línies pels panells MaxNbOfLinesForBoxes=Màx. nombre de línies pels panells
AllWidgetsWereEnabled=Tots els widgets disponibles estan habilitats AllWidgetsWereEnabled=Tots els widgets disponibles estan habilitats
WidgetAvailable=Giny disponible
PositionByDefault=Posició per defecte PositionByDefault=Posició per defecte
Position=Lloc Position=Lloc
MenusDesc=Els gestors de menú configuren el contingut de les dues barres de menú (horitzontal i vertical). MenusDesc=Els gestors de menú configuren el contingut de les dues barres de menú (horitzontal i vertical).
@ -346,13 +347,13 @@ UnpackPackageInModulesRoot=Per a implementar/instal·lar un mòdul extern, heu d
SetupIsReadyForUse=La instal·lació del mòdul ha finalitzat. No obstant això, ha d'habilitar i configurar el mòdul en la seva aplicació, aneu a la pàgina per a configurar els mòduls: <a href="%s">%s</a>. SetupIsReadyForUse=La instal·lació del mòdul ha finalitzat. No obstant això, ha d'habilitar i configurar el mòdul en la seva aplicació, aneu a la pàgina per a configurar els mòduls: <a href="%s">%s</a>.
NotExistsDirect=No s'ha definit el directori arrel alternatiu a un directori existent.<br> NotExistsDirect=No s'ha definit el directori arrel alternatiu a un directori existent.<br>
InfDirAlt=Des de la versió 3, és possible definir un directori arrel alternatiu. Això li permet emmagatzemar, en un directori dedicat, plug-ins i plantilles personalitzades.<br>Només ha de crear un directori a l'arrel de Dolibarr (per exemple: custom).<br> InfDirAlt=Des de la versió 3, és possible definir un directori arrel alternatiu. Això li permet emmagatzemar, en un directori dedicat, plug-ins i plantilles personalitzades.<br>Només ha de crear un directori a l'arrel de Dolibarr (per exemple: custom).<br>
InfDirExample=Llavors <br>declareu-ho a l'arxiu <strong>conf.php </strong><br> $dolibarr_main_url_root_alt='/custom'<br> $dolibarr_main_document_root_alt='/ruta/del/dolibarr/htdocs/custom'<br> Si aquestes línies estan comentades amb "#", per a activar-les simplement descomenteu-les traient el caràcter "#". InfDirExample=<br>Llavors declareu-ho al fitxer <strong>conf.php</strong><br> $dolibarr_main_url_root_alt='/custom'<br>$dolibarr_main_document_root_alt='/cami/del/dolibarr/htdocs/custom'<br>Si aquestes línies estan comentades amb «#», per a activar-les només cal treure el comentari eliminant el caràcter «#».
YouCanSubmitFile=Podeu pujar el fitxer .zip del paquet del mòdul des d’aquí: YouCanSubmitFile=Podeu pujar el fitxer .zip del paquet del mòdul des d’aquí:
CurrentVersion=Versió actual de Dolibarr CurrentVersion=Versió actual de Dolibarr
CallUpdatePage=Aneu a la pàgina que actualitza l'estructura i les dades de la base de dades: %s. CallUpdatePage=Aneu a la pàgina que actualitza l'estructura i les dades de la base de dades: %s.
LastStableVersion=Última versió estable LastStableVersion=Última versió estable
LastActivationDate=Data de l'última activació LastActivationDate=Última data d'activació
LastActivationAuthor=Últim autor d'activació LastActivationAuthor=Autor de l'última activació
LastActivationIP=Última IP d'activació LastActivationIP=Última IP d'activació
LastActivationVersion=Última versió d'activació LastActivationVersion=Última versió d'activació
UpdateServerOffline=Actualitza el servidor fora de línia UpdateServerOffline=Actualitza el servidor fora de línia
@ -374,11 +375,11 @@ DoTestSendHTML=Prova l'enviament HTML
ErrorCantUseRazIfNoYearInMask=Error, no es pot utilitzar l'opció @ per a restablir el comptador cada any si la seqüència {yy} o {yyyy} no està emmascarada. ErrorCantUseRazIfNoYearInMask=Error, no es pot utilitzar l'opció @ per a restablir el comptador cada any si la seqüència {yy} o {yyyy} no està emmascarada.
ErrorCantUseRazInStartedYearIfNoYearMonthInMask=Error, no es pot usar opció @ si la seqüència (yy) (mm) o (yyyy) (mm) no es troba a la màscara. ErrorCantUseRazInStartedYearIfNoYearMonthInMask=Error, no es pot usar opció @ si la seqüència (yy) (mm) o (yyyy) (mm) no es troba a la màscara.
UMask=Paràmetre UMask de nous fitxers en Unix/Linux/BSD. UMask=Paràmetre UMask de nous fitxers en Unix/Linux/BSD.
UMaskExplanation=Aquest paràmetre determina els drets dels arxius creats en el servidor Dolibarr (durant la pujada, per exemple).<br>Aquest ha de ser el valor octal (per exemple, 0666 significa lectura/escriptura per a tots).<br>Aquest paràmetre no té cap efecte sobre un servidor Windows. UMaskExplanation=Aquest paràmetre us permet definir els permisos establerts per defecte als fitxers creats per Dolibarr al servidor (durant la càrrega, per exemple).<br>Ha de ser el valor octal (per exemple, 0666 significa llegir i escriure per a tothom). El valor recomanat és 0600 o 0660<br>Aquest paràmetre no té ús en un servidor Windows.
SeeWikiForAllTeam=Mireu la pàgina Wiki per a obtenir una llista dels col·laboradors i la seva organització SeeWikiForAllTeam=Mireu la pàgina Wiki per a obtenir una llista dels col·laboradors i la seva organització
UseACacheDelay= Demora en memòria cau de l'exportació en segons (0 o buit sense memòria) UseACacheDelay= Demora en memòria cau de l'exportació en segons (0 o buit sense memòria)
DisableLinkToHelpCenter=Amagueu l'enllaç "<b> Necessiteu ajuda o assistència </b>" a la pàgina d'inici de sessió DisableLinkToHelpCenter=Amaga l'enllaç «<b>Necessites ajuda o assistència</b>» a la pàgina d'inici de sessió
DisableLinkToHelp=Amagueu l'enllaç a l'ajuda en línia "<b> %s </b>" DisableLinkToHelp=Amaga l'enllaç a l'ajuda en línia «<b>%s</b>»
AddCRIfTooLong=No hi ha cap tall de text automàtic, el text massa llarg no es mostrarà als documents. Si cal, afegiu devolucions de carro a l'àrea de text. AddCRIfTooLong=No hi ha cap tall de text automàtic, el text massa llarg no es mostrarà als documents. Si cal, afegiu devolucions de carro a l'àrea de text.
ConfirmPurge=Esteu segur que voleu executar aquesta purga? <br>Això suprimirà permanentment tots els fitxers de dades sense opció de restaurar-los (fitxers del GED, fitxers adjunts...). ConfirmPurge=Esteu segur que voleu executar aquesta purga? <br>Això suprimirà permanentment tots els fitxers de dades sense opció de restaurar-los (fitxers del GED, fitxers adjunts...).
MinLength=Longitud mínima MinLength=Longitud mínima
@ -393,14 +394,14 @@ FollowingSubstitutionKeysCanBeUsed= <br> Per a saber com crear les teves plantil
FullListOnOnlineDocumentation=http://wiki.dolibarr.org/index.php/Crear_un_modelo_de_documento_ODT FullListOnOnlineDocumentation=http://wiki.dolibarr.org/index.php/Crear_un_modelo_de_documento_ODT
FirstnameNamePosition=Posició del Nom/Cognoms FirstnameNamePosition=Posició del Nom/Cognoms
DescWeather=Les imatges següents es mostraran al tauler de control quan el nombre d'accions posteriors arriba als valors següents: DescWeather=Les imatges següents es mostraran al tauler de control quan el nombre d'accions posteriors arriba als valors següents:
KeyForWebServicesAccess=Clau per a utilitzar els serveis web (paràmetre "dolibarrkey" als serveis web) KeyForWebServicesAccess=Clau per a utilitzar els serveis web (paràmetre «dolibarrkey» als serveis web)
TestSubmitForm=Formulari de proves TestSubmitForm=Formulari de proves
ThisForceAlsoTheme=L’ús d’aquest gestor de menús també farà servir el seu propi tema sigui quina sigui l’opció de l’usuari. A més, aquest gestor de menú especialitzat per a telèfons intel·ligents no funciona en tots els telèfons intel·ligents. Utilitzeu un altre gestor de menús si teniu problemes amb el vostre. ThisForceAlsoTheme=L’ús d’aquest gestor de menús també farà servir el seu propi tema sigui quina sigui l’opció de l’usuari. A més, aquest gestor de menú especialitzat per a telèfons intel·ligents no funciona en tots els telèfons intel·ligents. Utilitzeu un altre gestor de menús si teniu problemes amb el vostre.
ThemeDir=Directori dels temes ThemeDir=Directori dels temes
ConnectionTimeout=Temps d'espera de connexió ConnectionTimeout=Temps d'espera de connexió
ResponseTimeout=Timeout de resposta ResponseTimeout=Timeout de resposta
SmsTestMessage=Missatge de prova de __PHONEFROM__ per __PHONETO__ SmsTestMessage=Missatge de prova de __PHONEFROM__ per __PHONETO__
ModuleMustBeEnabledFirst=El mòdul "<b>%s</b>" ha d'habilitar-se primer si necessita aquesta funcionalitat. ModuleMustBeEnabledFirst=El mòdul <b>%s</b> s'ha d'activar primer si necessiteu aquesta funció.
SecurityToken=Clau per a protegir els URL SecurityToken=Clau per a protegir els URL
NoSmsEngine=No hi ha cap gestor de remitents d'SMS disponible. Un gestor de remitents d'SMS no està instal·lat amb la distribució predeterminada perquè depenen d'un proveïdor extern, però podeu trobar-ne alguns a %s NoSmsEngine=No hi ha cap gestor de remitents d'SMS disponible. Un gestor de remitents d'SMS no està instal·lat amb la distribució predeterminada perquè depenen d'un proveïdor extern, però podeu trobar-ne alguns a %s
PDF=PDF PDF=PDF
@ -451,7 +452,7 @@ ExtrafieldCheckBox=Caselles de selecció
ExtrafieldCheckBoxFromList=Caselles de selecció des d'una taula ExtrafieldCheckBoxFromList=Caselles de selecció des d'una taula
ExtrafieldLink=Enllaç a un objecte ExtrafieldLink=Enllaç a un objecte
ComputedFormula=Camp calculat ComputedFormula=Camp calculat
ComputedFormulaDesc=You can enter here a formula using other properties of object or any PHP coding to get a dynamic computed value. You can use any PHP compatible formulas including the "?" condition operator, and following global object: <strong>$db, $conf, $langs, $mysoc, $user, $objectoffield</strong>.<br><strong>WARNING</strong>: If you need properties of an object not loaded, just fetch yourself the object into your formula like in the second example.<br>Using a computed field means you can't enter yourself any value from interface. Also, if there is a syntax error, the formula may return nothing.<br><br>Example of formula:<br>$objectoffield->id < 10 ? round($objectoffield->id / 2, 2): ($objectoffield->id + 2 * $user->id) * (int) substr($mysoc->zip, 1, 2)<br><br>Example to reload object<br>(($reloadedobj = new Societe($db)) && ($reloadedobj->fetchNoCompute($objectoffield->id) > 0 ? $reloadedobj->array_options['options_extrafieldkey'] * $reloadedobj->capital / 5: '-1')<br><br>Other example of formula to force load of object and its parent object:<br>(($reloadedobj = new Task($db)) && ($reloadedobj->fetchNoCompute($objectoffield->id) > 0) && ($secondloadedobj = new Project($db)) && ($secondloadedobj->fetchNoCompute($reloadedobj->fk_project) > 0)) ? $secondloadedobj->ref: 'Parent project not found' ComputedFormulaDesc=Podeu introduir aquí una fórmula utilitzant altres propietats de l’objecte o qualsevol codi PHP per a obtenir un valor calculat dinàmicament. Podeu utilitzar qualsevol fórmula compatible amb PHP, inclòs l'operador condicional «?» i els següents objectes globals:<strong>$db, $conf, $langs, $mysoc, $user, $object</strong>.<br><strong>ATENCIÓ</strong>: Només poden estar disponibles algunes propietats de $object. Si necessiteu una propietat no carregada, només cal que incorporeu l'objecte a la vostra fórmula com en el segon exemple.<br>Utilitzar un camp calculat implica que no podreu introduir cap valor des de la interfície. A més, si hi ha un error de sintaxi, la fórmula pot no tornar res.<br><br>Exemple de fórmula:<br>$objectoffield->id < 10 ? round($objectoffield->id / 2, 2): ($objectoffield->id + 2 * $user->id) * (int) substr($mysoc->zip, 1, 2)<br><br>Exemple per a tornar a carregar l'objecte <br>(($reloadedobj = new Societe($db)) && ($reloadedobj->fetchNoCompute($objectoffield->id) > 0 ? $reloadedobj->array_options['options_extrafieldkey'] * $reloadedobj->capital / 5: '-1')<br><br>Un altre exemple de fórmula per a forçar la càrrega de l'objecte i el seu objecte pare:<br>(($reloadedobj = new Task($db)) && ($reloadedobj->fetchNoCompute($objectoffield->id) > 0) && ($secondloadedobj = new Project($db)) && ($secondloadedobj->fetchNoCompute($reloadedobj->fk_project) > 0)) ? $secondloadedobj->ref: 'Parent project not found'
Computedpersistent=Emmagatzemar el camp computat Computedpersistent=Emmagatzemar el camp computat
ComputedpersistentDesc=Els camps addicionals calculats s’emmagatzemaran a la base de dades, però el valor només es recalcularà quan es canviï l’objecte d’aquest camp. Si el camp calculat depèn d'altres objectes o dades globals, aquest valor pot ser incorrecte!! ComputedpersistentDesc=Els camps addicionals calculats s’emmagatzemaran a la base de dades, però el valor només es recalcularà quan es canviï l’objecte d’aquest camp. Si el camp calculat depèn d'altres objectes o dades globals, aquest valor pot ser incorrecte!!
ExtrafieldParamHelpPassword=Si deixeu aquest camp en blanc, vol dir que aquest valor s'emmagatzemarà sense xifratge (el camp només s'ha d'amagar amb una estrella a la pantalla). <br> Establiu 'auto' per a utilitzar la regla de xifratge predeterminada per a desar la contrasenya a la base de dades (aleshores, el valor llegit serà només el hash, no hi ha manera de recuperar el valor original) ExtrafieldParamHelpPassword=Si deixeu aquest camp en blanc, vol dir que aquest valor s'emmagatzemarà sense xifratge (el camp només s'ha d'amagar amb una estrella a la pantalla). <br> Establiu 'auto' per a utilitzar la regla de xifratge predeterminada per a desar la contrasenya a la base de dades (aleshores, el valor llegit serà només el hash, no hi ha manera de recuperar el valor original)
@ -512,8 +513,8 @@ DependsOn=Aquest mòdul necessita els mòduls
RequiredBy=Aquest mòdul és requerit pel/s mòdul/s RequiredBy=Aquest mòdul és requerit pel/s mòdul/s
TheKeyIsTheNameOfHtmlField=Aquest és el nom del camp HTML. Es necessiten coneixements tècnics per a llegir el contingut de la pàgina HTML per a obtenir el nom clau d’un camp. TheKeyIsTheNameOfHtmlField=Aquest és el nom del camp HTML. Es necessiten coneixements tècnics per a llegir el contingut de la pàgina HTML per a obtenir el nom clau d’un camp.
PageUrlForDefaultValues=Has d'introduir aquí l'URL relatiu de la pàgina. Si inclous paràmetres a l'URL, els valors predeterminats seran efectius si tots els paràmetres s'estableixen en el mateix valor. PageUrlForDefaultValues=Has d'introduir aquí l'URL relatiu de la pàgina. Si inclous paràmetres a l'URL, els valors predeterminats seran efectius si tots els paràmetres s'estableixen en el mateix valor.
PageUrlForDefaultValuesCreate=<br>Exemple:<br>Per al formulari per a crear un tercer nou, és <strong>%s</strong>.<br>Per a l'URL dels mòduls externs instal·lats al directori personalitzat, no incloeu el "custom/", així que utilitzeu una ruta com <strong>mymodule/mypage.php</strong> i no custom/mymodule/mypage.php.<br>Si només voleu un valor per defecte si l'URL té algun paràmetre, podeu utilitzar <strong>%s</strong> PageUrlForDefaultValuesCreate=<br>Exemple:<br>Per al formulari per a crear un tercer nou, és <strong>%s</strong>.<br>Per a l'URL dels mòduls externs instal·lats al directori personalitzat, no inclogueu el «custom/», de manera que utilitzeu un camí com <strong>elmeumodul/lamevapagina.php</strong> i no custom/elmeumodul/lamevapagina.php.<br>Si només voleu un valor predeterminat si l'URL té algun paràmetre, podeu utilitzar <strong>%s</strong>
PageUrlForDefaultValuesList= <br>Exemple:<br> Per a la pàgina que llista els tercers, és <strong>%s</strong>. <br> Per a l'URL dels mòduls externs instal·lats al directori personalitzat, no incloeu el "custom/", de manera que utilitzeu una ruta com <strong>mymodule/mypagelist.php </strong> i no custom/mymodule/mypagelist.php. <br> Si només voleu un valor per defecte si l'URL té algun paràmetre, podeu utilitzar <strong>%s</strong> PageUrlForDefaultValuesList=<br>Exemple:<br>Per a la pàgina que llista els tercers, és <strong>%s</strong>.<br>Per a l'URL dels mòduls externs instal·lats al directori personalitzat, no inclogueu «custom/», així que utilitzeu un camí com <strong>elmeumodul/lamevapaginallistat.php</strong> i no custom/elmeumodul/lamevapaginallistat.php.<br>Si només voleu un valor predeterminat si l'URL té algun paràmetre, podeu utilitzar <strong>%s</strong>
AlsoDefaultValuesAreEffectiveForActionCreate=També tingueu en compte que sobreescriure valors predeterminats per a la creació de formularis funciona només per a pàgines dissenyades correctament (de manera que amb el paràmetre action = create o presend ...) AlsoDefaultValuesAreEffectiveForActionCreate=També tingueu en compte que sobreescriure valors predeterminats per a la creació de formularis funciona només per a pàgines dissenyades correctament (de manera que amb el paràmetre action = create o presend ...)
EnableDefaultValues=Activa la personalització dels valors predeterminats EnableDefaultValues=Activa la personalització dels valors predeterminats
EnableOverwriteTranslation=Permet la personalització de les traduccions EnableOverwriteTranslation=Permet la personalització de les traduccions
@ -646,7 +647,7 @@ Module2300Desc=Gestió de tasques programades (àlies cron o taula de crons)
Module2400Name=Esdeveniments/Agenda Module2400Name=Esdeveniments/Agenda
Module2400Desc=Seguiment d'esdeveniments. Registre d'esdeveniments automàtics per a fer el seguiment o registrar esdeveniments manuals o reunions. Aquest és el mòdul principal per a una bona gestió de la relació amb clients o proveïdors. Module2400Desc=Seguiment d'esdeveniments. Registre d'esdeveniments automàtics per a fer el seguiment o registrar esdeveniments manuals o reunions. Aquest és el mòdul principal per a una bona gestió de la relació amb clients o proveïdors.
Module2430Name=Sistema de calendari de reserves Module2430Name=Sistema de calendari de reserves
Module2430Desc=Provide an online calendar to allow anyone to book rendez-vous, according to predefined ranges or availabilities. Module2430Desc=Proporcioneu un calendari en línia per a permetre que qualsevol persona pugui reservar una cita, segons els rangs o les disponibilitats predefinits.
Module2500Name=SGD / GCE Module2500Name=SGD / GCE
Module2500Desc=Sistema de gestió de documents / Gestió de continguts electrònics. Organització automàtica dels vostres documents generats o emmagatzemats. Compartiu-los quan ho necessiteu. Module2500Desc=Sistema de gestió de documents / Gestió de continguts electrònics. Organització automàtica dels vostres documents generats o emmagatzemats. Compartiu-los quan ho necessiteu.
Module2600Name=Serveis API / Web (servidor SOAP) Module2600Name=Serveis API / Web (servidor SOAP)
@ -663,7 +664,7 @@ Module2900Desc=Capacitats de conversió GeoIP Maxmind
Module3200Name=Arxius inalterables Module3200Name=Arxius inalterables
Module3200Desc=Activa el registre d'alguns esdeveniments de negoci en un registre inalterable. Els esdeveniments s'arxiven en temps real. El registre és una taula d'esdeveniments encadenats que només es poden llegir i exportar. Aquest mòdul pot ser obligatori per a alguns països. Module3200Desc=Activa el registre d'alguns esdeveniments de negoci en un registre inalterable. Els esdeveniments s'arxiven en temps real. El registre és una taula d'esdeveniments encadenats que només es poden llegir i exportar. Aquest mòdul pot ser obligatori per a alguns països.
Module3300Name=Creador de mòduls Module3300Name=Creador de mòduls
Module3200Desc=Activa el registre d'alguns esdeveniments de negoci en un registre inalterable. Els esdeveniments s'arxiven en temps real. El registre és una taula d'esdeveniments encadenats que només es poden llegir i exportar. Aquest mòdul pot ser obligatori per a alguns països. Module3300Desc=Una eina RAD (Desenvolupament ràpid d'aplicacions: codi baix i sense codi) per a ajudar els desenvolupadors o usuaris avançats a crear el seu propi mòdul/aplicació.
Module3400Name=Xarxes socials Module3400Name=Xarxes socials
Module3400Desc=Activa els camps de les xarxes socials a tercers i adreces (skype, twitter, facebook...). Module3400Desc=Activa els camps de les xarxes socials a tercers i adreces (skype, twitter, facebook...).
Module4000Name=RH Module4000Name=RH
@ -704,8 +705,8 @@ Module62000Name=Incoterms
Module62000Desc=Afegeix funcions per a gestionar Incoterms Module62000Desc=Afegeix funcions per a gestionar Incoterms
Module63000Name=Recursos Module63000Name=Recursos
Module63000Desc=Gestiona els recursos (impressores, cotxes, habitacions...) que pots compartir en esdeveniments Module63000Desc=Gestiona els recursos (impressores, cotxes, habitacions...) que pots compartir en esdeveniments
Module66000Name=Enable OAuth2 authentication Module66000Name=Activa l'autenticació OAuth2
Module66000Desc=Provide a tool to generate and manage OAuth2 tokens. The token can then be used by some other modules. Module66000Desc=Proporcioneu una eina per a generar i gestionar fitxes OAuth2. El testimoni pot ser utilitzat per alguns altres mòduls.
Module94160Name=Recepcions Module94160Name=Recepcions
Permission11=Consulta les factures dels clients (i els cobraments) Permission11=Consulta les factures dels clients (i els cobraments)
Permission12=Crear/Modificar factures Permission12=Crear/Modificar factures
@ -860,7 +861,7 @@ Permission331=Consultar bookmarks
Permission332=Crear/modificar bookmarks Permission332=Crear/modificar bookmarks
Permission333=Eliminar bookmarks Permission333=Eliminar bookmarks
Permission341=Consultar els seus propis permisos Permission341=Consultar els seus propis permisos
Permission342=Crear/modificar la seva pròpia info d'usuari Permission342=Crea/modifica la seva pròpia informació d'usuari
Permission343=Modificar la seva pròpia contrasenya Permission343=Modificar la seva pròpia contrasenya
Permission344=Modificar els seus propis permisos Permission344=Modificar els seus propis permisos
Permission351=Consultar els grups Permission351=Consultar els grups
@ -980,9 +981,9 @@ Permission3301=Genera mòduls nous
Permission4001=Llegir habilitat/ocupació/posició Permission4001=Llegir habilitat/ocupació/posició
Permission4002=Crear/modificar habilitat/ocupació/posició Permission4002=Crear/modificar habilitat/ocupació/posició
Permission4003=Esborra habilitat/ocupació/posició Permission4003=Esborra habilitat/ocupació/posició
Permission4021=Read evaluations (yours and your subordinates) Permission4021=Consulta les avaluacions (teves i dels teus subordinats)
Permission4022=Create/modify evaluations Permission4022=Crear/modificar avaluacions
Permission4023=Validate evaluation Permission4023=Valida l'avaluació
Permission4025=Elimina l'avaluació Permission4025=Elimina l'avaluació
Permission4028=Veure menú comparatiu Permission4028=Veure menú comparatiu
Permission4031=Llegeix informació personal Permission4031=Llegeix informació personal
@ -1102,7 +1103,7 @@ VATManagement=Gestió IVA
VATIsUsedDesc=De manera predeterminada, quan es creen clients potencials, factures, comandes, etc., la tarifa de l'impost de vendes segueix la norma estàndard activa: <br> Si el venedor no està subjecte a l'impost de vendes, l'impost de vendes s'estableix per defecte a 0. Final de la regla. <br> Si el (país del venedor = país del comprador), l'impost de vendes per defecte és igual a l'impost de vendes del producte al país del venedor. Fi de la regla. <br> Si el venedor i el comprador es troben a la Comunitat Europea i els productes són productes relacionats amb el transport (transport, enviament, línia aèria), l'IVA per defecte és 0. Aquesta norma depèn del país del venedor, consulteu amb el vostre comptador. L'IVA s'ha de pagar pel comprador a l'oficina de duanes del seu país i no al venedor. Fi de la regla. <br> Si el venedor i el comprador es troben a la Comunitat Europea i el comprador no és una empresa (amb un número d'IVA intracomunitari registrat), l'IVA es fa per defecte al tipus d'IVA del país del venedor. Fi de la regla. <br> Si el venedor i el comprador es troben a la Comunitat Europea i el comprador és una empresa (amb un número d'IVA intracomunitari registrat), l'IVA és 0 per defecte. Fi de la regla. <br> En qualsevol altre cas, el valor predeterminat proposat és l'impost de vendes = 0. Fi de la regla. VATIsUsedDesc=De manera predeterminada, quan es creen clients potencials, factures, comandes, etc., la tarifa de l'impost de vendes segueix la norma estàndard activa: <br> Si el venedor no està subjecte a l'impost de vendes, l'impost de vendes s'estableix per defecte a 0. Final de la regla. <br> Si el (país del venedor = país del comprador), l'impost de vendes per defecte és igual a l'impost de vendes del producte al país del venedor. Fi de la regla. <br> Si el venedor i el comprador es troben a la Comunitat Europea i els productes són productes relacionats amb el transport (transport, enviament, línia aèria), l'IVA per defecte és 0. Aquesta norma depèn del país del venedor, consulteu amb el vostre comptador. L'IVA s'ha de pagar pel comprador a l'oficina de duanes del seu país i no al venedor. Fi de la regla. <br> Si el venedor i el comprador es troben a la Comunitat Europea i el comprador no és una empresa (amb un número d'IVA intracomunitari registrat), l'IVA es fa per defecte al tipus d'IVA del país del venedor. Fi de la regla. <br> Si el venedor i el comprador es troben a la Comunitat Europea i el comprador és una empresa (amb un número d'IVA intracomunitari registrat), l'IVA és 0 per defecte. Fi de la regla. <br> En qualsevol altre cas, el valor predeterminat proposat és l'impost de vendes = 0. Fi de la regla.
VATIsNotUsedDesc=El tipus d'IVA proposat per defecte és 0. Aquest és el cas d'associacions, particulars o algunes petites societats. VATIsNotUsedDesc=El tipus d'IVA proposat per defecte és 0. Aquest és el cas d'associacions, particulars o algunes petites societats.
VATIsUsedExampleFR=A França, es tracta de les societats o organismes que trien un règim fiscal general (General simplificat o General normal), règim en el qual es declara l'IVA. VATIsUsedExampleFR=A França, es tracta de les societats o organismes que trien un règim fiscal general (General simplificat o General normal), règim en el qual es declara l'IVA.
VATIsNotUsedExampleFR=A França, es tracta d'associacions que no siguin declarades per vendes o empreses, organitzacions o professions liberals que hagin triat el sistema fiscal de la microempresa (Impost sobre vendes en franquícia) i paguen una franquícia. Impost sobre vendes sense declaració d'impost sobre vendes. Aquesta elecció mostrarà la referència "Impost sobre vendes no aplicable - art-293B de CGI" a les factures. VATIsNotUsedExampleFR=A França, s'entén per associacions que no declaren l'impost de vendes o d'empreses, organitzacions o professions liberals que han escollit el sistema fiscal de microempresa (Impost sobre vendes en franquícia) i han pagat un impost sobre vendes de franquícia sense cap declaració d'impost sobre vendes. Aquesta opció mostrarà la referència «Impost sobre vendes no aplicable - art-293B de CGI» a les factures.
##### Local Taxes ##### ##### Local Taxes #####
TypeOfSaleTaxes=Tipus d’impost sobre vendes TypeOfSaleTaxes=Tipus d’impost sobre vendes
LTRate=Tarifa LTRate=Tarifa
@ -1208,7 +1209,7 @@ DoNotSuggestPaymentMode=No ho suggereixis
NoActiveBankAccountDefined=Cap compte bancari actiu definit NoActiveBankAccountDefined=Cap compte bancari actiu definit
OwnerOfBankAccount=Titular del compte %s OwnerOfBankAccount=Titular del compte %s
BankModuleNotActive=Mòdul comptes bancaris no activat BankModuleNotActive=Mòdul comptes bancaris no activat
ShowBugTrackLink=Mostra l'enllaç "<strong> %s </strong>" ShowBugTrackLink=Mostra l'enllaç «<strong>%s</strong>»
ShowBugTrackLinkDesc=Manteniu-lo buit per no mostrar aquest enllaç, utilitzeu el valor 'github' per a l'enllaç al projecte Dolibarr o definiu directament un URL 'https://...' ShowBugTrackLinkDesc=Manteniu-lo buit per no mostrar aquest enllaç, utilitzeu el valor 'github' per a l'enllaç al projecte Dolibarr o definiu directament un URL 'https://...'
Alerts=Alertes Alerts=Alertes
DelaysOfToleranceBeforeWarning=S'està mostrant una alerta d'advertència per... DelaysOfToleranceBeforeWarning=S'està mostrant una alerta d'advertència per...
@ -1236,7 +1237,7 @@ SetupDescription4= <a href="%s"> %s -> %s </a> <br> <br> Aquest programari és
SetupDescription5=Altres entrades del menú d'instal·lació gestionen paràmetres opcionals. SetupDescription5=Altres entrades del menú d'instal·lació gestionen paràmetres opcionals.
SetupDescriptionLink= <a href="%s"> %s - %s </a> SetupDescriptionLink= <a href="%s"> %s - %s </a>
SetupDescription3b=Paràmetres bàsics utilitzats per a personalitzar el comportament predeterminat de la vostra aplicació (p. ex., per a funcions relacionades amb el país). SetupDescription3b=Paràmetres bàsics utilitzats per a personalitzar el comportament predeterminat de la vostra aplicació (p. ex., per a funcions relacionades amb el país).
SetupDescription4b=This software is a suite of many modules/applications. The modules related to your needs must be activated. Menu entries will appears with the activation of these modules. SetupDescription4b=Aquest programari és un conjunt de molts mòduls/aplicacions. Cal activar els mòduls relacionats amb les vostres necessitats. Les entrades del menú apareixeran amb l'activació d'aquests mòduls.
AuditedSecurityEvents=Esdeveniments de seguretat que s’auditen AuditedSecurityEvents=Esdeveniments de seguretat que s’auditen
NoSecurityEventsAreAduited=No s’audita cap esdeveniment de seguretat. Podeu activar-les des del menú %s NoSecurityEventsAreAduited=No s’audita cap esdeveniment de seguretat. Podeu activar-les des del menú %s
Audit=Esdeveniments de seguretat Audit=Esdeveniments de seguretat
@ -1257,7 +1258,7 @@ LogEventDesc=Habiliteu el registre per a esdeveniments de seguretat específics.
AreaForAdminOnly=Els paràmetres de configuració només poden ser establerts per <b>usuaris administradors</b>. AreaForAdminOnly=Els paràmetres de configuració només poden ser establerts per <b>usuaris administradors</b>.
SystemInfoDesc=La informació del sistema és informació tècnica diversa que obteniu en mode de només lectura i visible només per als administradors. SystemInfoDesc=La informació del sistema és informació tècnica diversa que obteniu en mode de només lectura i visible només per als administradors.
SystemAreaForAdminOnly=Aquesta àrea només està disponible per als usuaris administradors. Els permisos d'usuari de Dolibarr no poden canviar aquesta restricció. SystemAreaForAdminOnly=Aquesta àrea només està disponible per als usuaris administradors. Els permisos d'usuari de Dolibarr no poden canviar aquesta restricció.
CompanyFundationDesc=Editeu la informació de la vostra empresa / organització. Feu clic al botó "%s" al final de la pàgina quan hagi acabat. CompanyFundationDesc=Editeu la informació de la vostra empresa/organització. Fes clic al botó «%s» a la part inferior de la pàgina quan hagis acabat.
MoreNetworksAvailableWithModule=És possible que hi hagi més xarxes socials disponibles activant el mòdul "Xarxes socials". MoreNetworksAvailableWithModule=És possible que hi hagi més xarxes socials disponibles activant el mòdul "Xarxes socials".
AccountantDesc=Si teniu un comptable extern, podeu editar aquí la seva informació. AccountantDesc=Si teniu un comptable extern, podeu editar aquí la seva informació.
AccountantFileNumber=Número de fila AccountantFileNumber=Número de fila
@ -1265,7 +1266,7 @@ DisplayDesc=Els paràmetres que afecten l'aspecte i la presentació de l'aplicac
AvailableModules=Mòduls/complements disponibles AvailableModules=Mòduls/complements disponibles
ToActivateModule=Per a activar mòduls, aneu a l'àrea de configuració (Inici->Configuració->Mòduls). ToActivateModule=Per a activar mòduls, aneu a l'àrea de configuració (Inici->Configuració->Mòduls).
SessionTimeOut=Temps de desconnexió per a la sessió SessionTimeOut=Temps de desconnexió per a la sessió
SessionExplanation=Aquest número garanteix que la sessió no caduqui abans d'aquest retard, si el netejador de sessió es fa mitjançant un netejador de sessió de PHP intern (i res més). El netejador de sessió intern de PHP no garanteix que la sessió expire després d'aquest retard. Caducarà, després d'aquest retard, i quan s'executi el netejador de sessió, de manera que cada accés <b> %s / %s </b>, però només durant l'accés fet per altres sessions (si el valor és 0, significa que l'eliminació de la sessió només es fa mitjançant un extern procés). <br> Nota: en alguns servidors amb un mecanisme de neteja de sessió externa (cron sota debian, ubuntu ...), les sessions es poden destruir després d'un període definit per una configuració externa, independentment del valor introduït aquí. SessionExplanation=Aquest número garanteix que la sessió no caducarà mai abans d'aquest retard, si el netejador de sessions el fa el netejador de sessions intern de PHP (i res més). El netejador de sessions intern de PHP no garanteix que la sessió caduqui després d'aquest retard. Caducarà, després d'aquest retard, i quan s'executi el netejador de sessions, de manera que cada accés <b>%s/%s</b>, però només durant l'accés realitzat per altres sessions (si el valor és 0, vol dir que només s'esborra la sessió per un procés extern).<br>Nota: en alguns servidors amb un mecanisme de neteja de sessions extern (cron sota debian, ubuntu...), les sessions es poden destruir després d'un període definit per una configuració externa, sense importar quin sigui el valor introduït aquí.
SessionsPurgedByExternalSystem=Sembla que les sessions en aquest servidor són netejades mitjançant un mecanisme extern (cron sota debian, ubuntu ...), probablement cada <b> %s </b> segons (= el valor del paràmetre sessió.gc_maxlifetime ), així que modificant aquest valor aquí no té cap efecte, Heu de sol·licitar a l’administrador del servidor que canviï la durada de la sessió. SessionsPurgedByExternalSystem=Sembla que les sessions en aquest servidor són netejades mitjançant un mecanisme extern (cron sota debian, ubuntu ...), probablement cada <b> %s </b> segons (= el valor del paràmetre sessió.gc_maxlifetime ), així que modificant aquest valor aquí no té cap efecte, Heu de sol·licitar a l’administrador del servidor que canviï la durada de la sessió.
TriggersAvailable=Triggers disponibles TriggersAvailable=Triggers disponibles
TriggersDesc=Els activadors són fitxers que modificaran el comportament del flux de treball de Dolibarr un cop copiat al directori <b>htdocs/core/triggers</b>. Realitzen accions noves, activades en esdeveniments Dolibarr (creació d'empresa nova, validació de factures...). TriggersDesc=Els activadors són fitxers que modificaran el comportament del flux de treball de Dolibarr un cop copiat al directori <b>htdocs/core/triggers</b>. Realitzen accions noves, activades en esdeveniments Dolibarr (creació d'empresa nova, validació de factures...).
@ -1310,7 +1311,7 @@ YouMustRunCommandFromCommandLineAfterLoginToUser=Heu d'executar aquesta ordre de
YourPHPDoesNotHaveSSLSupport=Funcions SSL no disponibles al vostre PHP YourPHPDoesNotHaveSSLSupport=Funcions SSL no disponibles al vostre PHP
DownloadMoreSkins=Més temes per a descarregar DownloadMoreSkins=Més temes per a descarregar
SimpleNumRefModelDesc=Retorna el número de referència en el format %syymm-nnnn on yy és l'any, mm és el mes i nnnn és un número d'increment automàtic seqüencial sense restablir SimpleNumRefModelDesc=Retorna el número de referència en el format %syymm-nnnn on yy és l'any, mm és el mes i nnnn és un número d'increment automàtic seqüencial sense restablir
SimpleRefNumRefModelDesc=Returns the reference number in the format n where n is a sequential auto-incrementing number with no reset SimpleRefNumRefModelDesc=Retorna el número de referència en el format n on n és un nombre seqüencial d'increment automàtic sense restabliment
AdvancedNumRefModelDesc=Retorna el número de referència en el format %syymm-nnnn on yy és l'any, mm és el mes i nnnn és un número d'increment automàtic seqüencial sense restablir AdvancedNumRefModelDesc=Retorna el número de referència en el format %syymm-nnnn on yy és l'any, mm és el mes i nnnn és un número d'increment automàtic seqüencial sense restablir
SimpleNumRefNoDateModelDesc=Retorna el número de referència en el format %s-nnnn on nnnn és un número d’increment automàtic seqüencial sense restablir SimpleNumRefNoDateModelDesc=Retorna el número de referència en el format %s-nnnn on nnnn és un número d’increment automàtic seqüencial sense restablir
ShowProfIdInAddress=Mostra el DNI professional amb adreces ShowProfIdInAddress=Mostra el DNI professional amb adreces
@ -1369,7 +1370,7 @@ TitleNumberOfActivatedModules=Mòduls activats
TotalNumberOfActivatedModules=Mòduls activats: <b> %s </b> / <b> %s </b> TotalNumberOfActivatedModules=Mòduls activats: <b> %s </b> / <b> %s </b>
YouMustEnableOneModule=Ha d'activar almenys 1 mòdul. YouMustEnableOneModule=Ha d'activar almenys 1 mòdul.
YouMustEnableTranslationOverwriteBefore=Primer heu d'activar la sobreescriptura de traduccions per a poder substituir una traducció YouMustEnableTranslationOverwriteBefore=Primer heu d'activar la sobreescriptura de traduccions per a poder substituir una traducció
ClassNotFoundIntoPathWarning=La classe %s no s'ha trobat a la ruta PHP ClassNotFoundIntoPathWarning=La classe %s no s'ha trobat al camí PHP
YesInSummer=Sí a l'estiu YesInSummer=Sí a l'estiu
OnlyFollowingModulesAreOpenedToExternalUsers=Tingueu en compte que només els següents mòduls estan disponibles per als usuaris externs (independentment dels permisos d'aquests usuaris) i només si es concedeixen permisos: <br> OnlyFollowingModulesAreOpenedToExternalUsers=Tingueu en compte que només els següents mòduls estan disponibles per als usuaris externs (independentment dels permisos d'aquests usuaris) i només si es concedeixen permisos: <br>
SuhosinSessionEncrypt=Emmagatzematge de sessions xifrades per Suhosin SuhosinSessionEncrypt=Emmagatzematge de sessions xifrades per Suhosin
@ -1452,8 +1453,8 @@ SuppliersPayment=Pagaments a proveïdors
SupplierPaymentSetup=Configuració de pagaments a proveïdors SupplierPaymentSetup=Configuració de pagaments a proveïdors
InvoiceCheckPosteriorDate=Comproveu la data de fabricació abans de la validació InvoiceCheckPosteriorDate=Comproveu la data de fabricació abans de la validació
InvoiceCheckPosteriorDateHelp=La validació d'una factura estarà prohibida si la seva data és anterior a la data de l'última factura del mateix tipus. InvoiceCheckPosteriorDateHelp=La validació d'una factura estarà prohibida si la seva data és anterior a la data de l'última factura del mateix tipus.
InvoiceOptionCategoryOfOperations=Display the mention "category of operations" on the invoice. InvoiceOptionCategoryOfOperations=Mostra la menció «categoria d'operacions» a la factura.
InvoiceOptionCategoryOfOperationsHelp=Depending on the situation, the mention will appear in the form:<br>- Category of operations: Delivery of goods<br>- Category of operations: Provision of services<br>- Category of operations: Mixed - Delivery of goods & provision of services InvoiceOptionCategoryOfOperationsHelp=Segons la situació, la menció apareixerà en la forma:<br>- Categoria d'operacions: Entrega de mercaderies<br>- Categoria d'operacions: Prestació de serveis<br>- Categoria d'operacions: Mixta - Entrega de mercaderies i Prestació de serveis
InvoiceOptionCategoryOfOperationsYes1=Sí, a sota del bloc d'adreces InvoiceOptionCategoryOfOperationsYes1=Sí, a sota del bloc d'adreces
InvoiceOptionCategoryOfOperationsYes2=Sí, a la cantonada inferior esquerra InvoiceOptionCategoryOfOperationsYes2=Sí, a la cantonada inferior esquerra
##### Proposals ##### ##### Proposals #####
@ -1700,7 +1701,7 @@ SyslogSetup=Configuració del mòdul Syslog
SyslogOutput=Sortida del log SyslogOutput=Sortida del log
SyslogFacility=Facilitat SyslogFacility=Facilitat
SyslogLevel=Nivell SyslogLevel=Nivell
SyslogFilename=Nom i ruta de l'arxiu SyslogFilename=Nom i camí del fitxer
YouCanUseDOL_DATA_ROOT=Podeu utilitzar DOL_DATA_ROOT/dolibarr.log per a un fitxer de registre al directori "documents" de Dolibarr. Podeu establir un camí diferent per a emmagatzemar aquest fitxer. YouCanUseDOL_DATA_ROOT=Podeu utilitzar DOL_DATA_ROOT/dolibarr.log per a un fitxer de registre al directori "documents" de Dolibarr. Podeu establir un camí diferent per a emmagatzemar aquest fitxer.
ErrorUnknownSyslogConstant=La constant %s no és una constant syslog coneguda ErrorUnknownSyslogConstant=La constant %s no és una constant syslog coneguda
OnlyWindowsLOG_USER=En Windows, només s'admetrà la funció LOG_USER OnlyWindowsLOG_USER=En Windows, només s'admetrà la funció LOG_USER
@ -1766,7 +1767,7 @@ FCKeditorForNotePublic=WYSIWIG creació/edició del camp "notes públiques" d'el
FCKeditorForNotePrivate=Creació/edició WYSIWIG del camp "notes privades" d'elements FCKeditorForNotePrivate=Creació/edició WYSIWIG del camp "notes privades" d'elements
FCKeditorForCompany=Creació / edició de WYSIWIG de la descripció del camp d'elements (excepte productes / serveis) FCKeditorForCompany=Creació / edició de WYSIWIG de la descripció del camp d'elements (excepte productes / serveis)
FCKeditorForProductDetails=Creació/edició WYSIWIG de descripció de productes o línies per objectes (línies de pressupostos, comandes, factures, etc...). FCKeditorForProductDetails=Creació/edició WYSIWIG de descripció de productes o línies per objectes (línies de pressupostos, comandes, factures, etc...).
FCKeditorForProductDetails2=Warning: Using this option for this case is seriously not recommended as it can create problems with special characters and page formatting when building PDF files. FCKeditorForProductDetails2=Avís: l'ús d'aquesta opció per a aquest cas no es recomana, ja que pot crear problemes amb caràcters especials i format de pàgina en crear fitxers PDF.
FCKeditorForMailing= Creació/edició WYSIWIG dels E-Mails FCKeditorForMailing= Creació/edició WYSIWIG dels E-Mails
FCKeditorForUserSignature=Creació/edició WYSIWIG de la signatura de l'usuari FCKeditorForUserSignature=Creació/edició WYSIWIG de la signatura de l'usuari
FCKeditorForMail=Edició/creació WYSIWIG per tots els e-mails (excepte Eines->eMailing) FCKeditorForMail=Edició/creació WYSIWIG per tots els e-mails (excepte Eines->eMailing)
@ -1863,7 +1864,7 @@ StockDecreaseForPointOfSaleDisabledbyBatch=La disminució d'accions en POS no é
CashDeskYouDidNotDisableStockDecease=No vau desactivar la disminució de l'estoc en fer una venda des del TPV. Per tant, es requereix un magatzem. CashDeskYouDidNotDisableStockDecease=No vau desactivar la disminució de l'estoc en fer una venda des del TPV. Per tant, es requereix un magatzem.
CashDeskForceDecreaseStockLabel=S'ha forçat la disminució de l'estoc de productes per lots. CashDeskForceDecreaseStockLabel=S'ha forçat la disminució de l'estoc de productes per lots.
CashDeskForceDecreaseStockDesc=Disminuïu primer les dates més antigues de consumir i vendre. CashDeskForceDecreaseStockDesc=Disminuïu primer les dates més antigues de consumir i vendre.
CashDeskReaderKeyCodeForEnter=Key ASCII code for "Enter" defined in barcode reader (Example: 13) CashDeskReaderKeyCodeForEnter=Codi ASCII per "Enter" definit al lector de codis de barres (Exemple: 13)
##### Bookmark ##### ##### Bookmark #####
BookmarkSetup=Configuració del mòdul Bookmark BookmarkSetup=Configuració del mòdul Bookmark
BookmarkDesc=Aquest mòdul us permet gestionar els marcadors. També podeu afegir dreceres a totes les pàgines de Dolibarr o llocs web externs al menú de l'esquerra. BookmarkDesc=Aquest mòdul us permet gestionar els marcadors. També podeu afegir dreceres a totes les pàgines de Dolibarr o llocs web externs al menú de l'esquerra.
@ -1934,7 +1935,7 @@ SalariesSetup=Configuració del mòdul de salaris
SortOrder=Ordre de classificació SortOrder=Ordre de classificació
Format=Format Format=Format
TypePaymentDesc=0:Forma de pagament a client, 1:Forma de pagament a proveïdor, 2:Mateixa forma de pagament per clients i proveïdors TypePaymentDesc=0:Forma de pagament a client, 1:Forma de pagament a proveïdor, 2:Mateixa forma de pagament per clients i proveïdors
IncludePath=Incloure ruta (que es defineix a la variable %s) IncludePath=Inclou el camí (definit en la variable %s)
ExpenseReportsSetup=Configuració del mòdul Informe de Despeses ExpenseReportsSetup=Configuració del mòdul Informe de Despeses
TemplatePDFExpenseReports=Plantilles de documents per a generar un document d’informe de despeses TemplatePDFExpenseReports=Plantilles de documents per a generar un document d’informe de despeses
ExpenseReportsRulesSetup=Configurar mòdul Informes de despeses - Regles ExpenseReportsRulesSetup=Configurar mòdul Informes de despeses - Regles
@ -1952,7 +1953,7 @@ BackupDumpWizard=Assistent per a crear el fitxer d'exportació de la base de dad
BackupZipWizard=Assistent per a crear el directori d’arxiu de documents BackupZipWizard=Assistent per a crear el directori d’arxiu de documents
SomethingMakeInstallFromWebNotPossible=No és possible la instal·lació de mòduls externs des de la interfície web per la següent raó: SomethingMakeInstallFromWebNotPossible=No és possible la instal·lació de mòduls externs des de la interfície web per la següent raó:
SomethingMakeInstallFromWebNotPossible2=Per aquest motiu, el procés d'actualització descrit aquí és un procés manual que només un usuari privilegiat pot realitzar. SomethingMakeInstallFromWebNotPossible2=Per aquest motiu, el procés d'actualització descrit aquí és un procés manual que només un usuari privilegiat pot realitzar.
InstallModuleFromWebHasBeenDisabledContactUs=Install or development of external modules or dynamic websites, from the application, is currently locked for security purpose. Please contact us if you need to enable this feature. InstallModuleFromWebHasBeenDisabledContactUs=La instal·lació o desenvolupament de mòduls externs o llocs web dinàmics, des de l'aplicació, està actualment bloquejat per motius de seguretat. Si us plau, poseu-vos en contacte amb nosaltres si necessiteu habilitar aquesta funció.
InstallModuleFromWebHasBeenDisabledByFile=El vostre administrador ha desactivat la instal·lació del mòdul extern des de l'aplicació. Heu de demanar-li que suprimeixi el fitxer <strong> %s </strong> per a permetre aquesta funció. InstallModuleFromWebHasBeenDisabledByFile=El vostre administrador ha desactivat la instal·lació del mòdul extern des de l'aplicació. Heu de demanar-li que suprimeixi el fitxer <strong> %s </strong> per a permetre aquesta funció.
ConfFileMustContainCustom=Per a instal·lar o crear un mòdul extern des de l'aplicació es necessita desar els fitxers del mòdul en el directori <strong>%s</strong>. Per a permetre a Dolibarr el processament d'aquest directori, has de configurar el teu <strong>conf/conf.php</strong> afegint aquestes 2 línies:<br><strong>$dolibarr_main_url_root_alt='/custom';</strong><br><strong>$dolibarr_main_document_root_alt='%s/custom';</strong> ConfFileMustContainCustom=Per a instal·lar o crear un mòdul extern des de l'aplicació es necessita desar els fitxers del mòdul en el directori <strong>%s</strong>. Per a permetre a Dolibarr el processament d'aquest directori, has de configurar el teu <strong>conf/conf.php</strong> afegint aquestes 2 línies:<br><strong>$dolibarr_main_url_root_alt='/custom';</strong><br><strong>$dolibarr_main_document_root_alt='%s/custom';</strong>
HighlightLinesOnMouseHover=Remarca línies de la taula quan el ratolí passi per sobre HighlightLinesOnMouseHover=Remarca línies de la taula quan el ratolí passi per sobre
@ -2050,7 +2051,7 @@ activateModuleDependNotSatisfied=El mòdul "%s" depèn del mòdul "%s", que falt
CommandIsNotInsideAllowedCommands=L'ordre que intenteu executar no es troba a la llista de comandaments permesos definits al paràmetre <strong> $ dolibarr_main_restrict_os_commands </strong> al fitxer <strong> conf.php </strong>. CommandIsNotInsideAllowedCommands=L'ordre que intenteu executar no es troba a la llista de comandaments permesos definits al paràmetre <strong> $ dolibarr_main_restrict_os_commands </strong> al fitxer <strong> conf.php </strong>.
LandingPage=Pàgina de destinació principal LandingPage=Pàgina de destinació principal
SamePriceAlsoForSharedCompanies=Si utilitzeu un mòdul multicompany, amb l'opció "Preu únic", el preu també serà el mateix per a totes les empreses si es comparteixen productes entre entorns SamePriceAlsoForSharedCompanies=Si utilitzeu un mòdul multicompany, amb l'opció "Preu únic", el preu també serà el mateix per a totes les empreses si es comparteixen productes entre entorns
ModuleEnabledAdminMustCheckRights=El mòdul s'ha activat. Els permisos per als mòduls activats només es donen als usuaris administradors. És possible que hagueu de concedir permisos a altres usuaris o grups manualment si cal. ModuleEnabledAdminMustCheckRights=El mòdul s'ha activat. Els permisos per als mòduls activats només es donen als usuaris administradors. És possible que hàgiu de concedir permisos a altres usuaris o grups manualment si cal.
UserHasNoPermissions=Aquest usuari no té permisos definits UserHasNoPermissions=Aquest usuari no té permisos definits
TypeCdr=Utilitzeu "Cap" si la data del termini de pagament és la data de la factura més un delta en dies (el delta és el camp "%s") <br> Utilitzeu "Al final del mes", si, després del delta, s'ha d'augmentar la data per a arribar al final del mes (+ opcional "%s" en dies) <br> Utilitzeu "Actual/Següent" perquè la data del termini de pagament sigui la primera N del mes després del delta (el delta és el camp "%s", N s'emmagatzema al camp "%s"). TypeCdr=Utilitzeu "Cap" si la data del termini de pagament és la data de la factura més un delta en dies (el delta és el camp "%s") <br> Utilitzeu "Al final del mes", si, després del delta, s'ha d'augmentar la data per a arribar al final del mes (+ opcional "%s" en dies) <br> Utilitzeu "Actual/Següent" perquè la data del termini de pagament sigui la primera N del mes després del delta (el delta és el camp "%s", N s'emmagatzema al camp "%s").
BaseCurrency=Moneda de referència de l'empresa (anar a la configuració de l'empresa per a canviar-ho) BaseCurrency=Moneda de referència de l'empresa (anar a la configuració de l'empresa per a canviar-ho)
@ -2080,8 +2081,8 @@ RemoveSpecialChars=Elimina els caràcters especials
COMPANY_AQUARIUM_CLEAN_REGEX=Filtre Regex per a netejar el valor (COMPANY_AQUARIUM_CLEAN_REGEX) COMPANY_AQUARIUM_CLEAN_REGEX=Filtre Regex per a netejar el valor (COMPANY_AQUARIUM_CLEAN_REGEX)
COMPANY_DIGITARIA_CLEAN_REGEX=Filtre Regex al valor net (COMPANY_DIGITARIA_CLEAN_REGEX) COMPANY_DIGITARIA_CLEAN_REGEX=Filtre Regex al valor net (COMPANY_DIGITARIA_CLEAN_REGEX)
COMPANY_DIGITARIA_UNIQUE_CODE=No es permet la duplicació COMPANY_DIGITARIA_UNIQUE_CODE=No es permet la duplicació
RemoveSpecialWords=Clean certain words when generating sub-accounts for customers or suppliers RemoveSpecialWords=Netegeu certes paraules en generar subcomptes per a clients o proveïdors
RemoveSpecialWordsHelp=Specify the words to be cleaned before calculating the customer or supplier account. Use a ";" between each word RemoveSpecialWordsHelp=Especifiqueu les paraules a netejar abans de calcular el compte de client o proveïdor. Utilitzeu un ";" entre cada paraula
GDPRContact=Oficial de protecció de dades (PDO, privadesa de dades o contacte amb GDPR) GDPRContact=Oficial de protecció de dades (PDO, privadesa de dades o contacte amb GDPR)
GDPRContactDesc=Si emmagatzemeu dades personals al vostre Sistema d'Informació, podeu anomenar aquí el contacte responsable del Reglament General de Protecció de Dades GDPRContactDesc=Si emmagatzemeu dades personals al vostre Sistema d'Informació, podeu anomenar aquí el contacte responsable del Reglament General de Protecció de Dades
HelpOnTooltip=Ajuda a mostrar el text a la descripció d'informació HelpOnTooltip=Ajuda a mostrar el text a la descripció d'informació
@ -2139,7 +2140,7 @@ CodeLastResult=Últim codi retornat
NbOfEmailsInInbox=Nombre de correus electrònics en el directori font NbOfEmailsInInbox=Nombre de correus electrònics en el directori font
LoadThirdPartyFromName=Carregueu la cerca de tercers al %s (només carrega) LoadThirdPartyFromName=Carregueu la cerca de tercers al %s (només carrega)
LoadThirdPartyFromNameOrCreate=Carregueu la cerca de tercers a %s (crear si no es troba) LoadThirdPartyFromNameOrCreate=Carregueu la cerca de tercers a %s (crear si no es troba)
LoadContactFromEmailOrCreate=Load contact searching on %s (create if not found) LoadContactFromEmailOrCreate=Carregueu el contacte cercant a %s (creeu-lo si no es troba)
AttachJoinedDocumentsToObject=Deseu els fitxers adjunts als documents d'objectes si es troba una referència d'un objecte al tema del correu electrònic. AttachJoinedDocumentsToObject=Deseu els fitxers adjunts als documents d'objectes si es troba una referència d'un objecte al tema del correu electrònic.
WithDolTrackingID=Missatge d'una conversa iniciada per un primer correu electrònic enviat des de Dolibarr WithDolTrackingID=Missatge d'una conversa iniciada per un primer correu electrònic enviat des de Dolibarr
WithoutDolTrackingID=Missatge d'una conversa iniciada per un primer correu electrònic NO enviat des de Dolibarr WithoutDolTrackingID=Missatge d'una conversa iniciada per un primer correu electrònic NO enviat des de Dolibarr
@ -2243,12 +2244,12 @@ MailToPartnership=Associació
AGENDA_EVENT_DEFAULT_STATUS=Estat de l'esdeveniment per defecte en crear un esdeveniment des del formulari AGENDA_EVENT_DEFAULT_STATUS=Estat de l'esdeveniment per defecte en crear un esdeveniment des del formulari
YouShouldDisablePHPFunctions=Hauríeu de desactivar les funcions PHP YouShouldDisablePHPFunctions=Hauríeu de desactivar les funcions PHP
IfCLINotRequiredYouShouldDisablePHPFunctions=Excepte si heu d'executar ordres del sistema en codi personalitzat, hauríeu de desactivar les funcions PHP IfCLINotRequiredYouShouldDisablePHPFunctions=Excepte si heu d'executar ordres del sistema en codi personalitzat, hauríeu de desactivar les funcions PHP
PHPFunctionsRequiredForCLI=For shell purpose (like scheduled job backup or running an antivirus program), you must keep PHP functions PHPFunctionsRequiredForCLI=Per a propòsits d'intèrpret d'ordres (com ara una còpia de seguretat de treballs programats o executar un programa antivirus), heu de mantenir les funcions PHP
NoWritableFilesFoundIntoRootDir=No s'ha trobat cap fitxer ni directori d'escriptura dels programes comuns al directori arrel (Bo) NoWritableFilesFoundIntoRootDir=No s'ha trobat cap fitxer ni directori d'escriptura dels programes comuns al directori arrel (Bo)
RecommendedValueIs=Recomanat: %s RecommendedValueIs=Recomanat: %s
Recommended=Recomanada Recommended=Recomanada
NotRecommended=No es recomana NotRecommended=No es recomana
ARestrictedPath=Some restricted path for data files ARestrictedPath=Algun camí restringit per als fitxers de dades
CheckForModuleUpdate=Comproveu si hi ha actualitzacions de mòduls externs CheckForModuleUpdate=Comproveu si hi ha actualitzacions de mòduls externs
CheckForModuleUpdateHelp=Aquesta acció es connectarà amb editors de mòduls externs per a comprovar si hi ha una versió nova disponible. CheckForModuleUpdateHelp=Aquesta acció es connectarà amb editors de mòduls externs per a comprovar si hi ha una versió nova disponible.
ModuleUpdateAvailable=Hi ha disponible una actualització ModuleUpdateAvailable=Hi ha disponible una actualització
@ -2296,17 +2297,17 @@ LateWarningAfter=Avís "tard" després
TemplateforBusinessCards=Plantilla per a una targeta de visita de diferents mides TemplateforBusinessCards=Plantilla per a una targeta de visita de diferents mides
InventorySetup= Configuració de l'inventari InventorySetup= Configuració de l'inventari
ExportUseLowMemoryMode=Utilitzeu un mode de memòria baixa ExportUseLowMemoryMode=Utilitzeu un mode de memòria baixa
ExportUseLowMemoryModeHelp=Use the low memory mode to generate the dump file (compression is done through a pipe instead of into the PHP memory). This method does not allow to check that the file is complete and error message can't be reported if it fails. Use it if you experience not enough memory errors. ExportUseLowMemoryModeHelp=Utilitzeu el mode de memòria baixa per a generar el fitxer d'abocament (la compressió es fa a través d'una canonada en lloc d'entrar a la memòria PHP). Aquest mètode no permet comprovar que el fitxer estigui complet i no es pot informar del missatge d'error si falla. Utilitzeu-lo si no teniu prou errors de memòria.
ModuleWebhookName = Webhook ModuleWebhookName = Webhook
ModuleWebhookDesc = Interfície per a capturar activadors de dolibarr i enviar-lo a un URL ModuleWebhookDesc = Interfície per a capturar activadors de dolibarr i enviar dades de l'esdeveniment a un URL
WebhookSetup = Configuració del webhook WebhookSetup = Configuració del webhook
Settings = Configuració Settings = Configuració
WebhookSetupPage = Pàgina de configuració del webhook WebhookSetupPage = Pàgina de configuració del webhook
ShowQuickAddLink=Mostra un botó per a afegir ràpidament un element al menú superior dret ShowQuickAddLink=Mostra un botó per a afegir ràpidament un element al menú superior dret
HashForPing=Hash utilitzat per a fer ping HashForPing=Hash utilitzat per a fer ping
ReadOnlyMode=És una instància en mode "Només lectura". ReadOnlyMode=És una instància en mode «Només lectura».
DEBUGBAR_USE_LOG_FILE=Utilitzeu el fitxer <b> dolibarr.log </b> per a atrapar els registres DEBUGBAR_USE_LOG_FILE=Utilitzeu el fitxer <b> dolibarr.log </b> per a atrapar els registres
UsingLogFileShowAllRecordOfSubrequestButIsSlower=Utilitzeu el fitxer dolibarr.log per a atrapar els registres en lloc de capturar la memòria en directe. Permet capturar tots els registres en lloc de només el registre del procés actual (per tant, inclosa la de les pàgines de subsol·licituds ajax), però farà que la vostra instància sigui molt molt lenta. No es recomana. UsingLogFileShowAllRecordOfSubrequestButIsSlower=Utilitzeu el fitxer dolibarr.log per a atrapar els registres en lloc de capturar la memòria en directe. Permet capturar tots els registres en lloc de només el registre del procés actual (per tant, inclosa la de les pàgines de subsol·licituds ajax), però farà que la vostra instància sigui molt molt lenta. No es recomana.
FixedOrPercent=Fixat (utilitza la paraula clau "fixat") o per cent (utilitza la paraula clau "percentatge") FixedOrPercent=Fixat (utilitza la paraula clau "fixat") o per cent (utilitza la paraula clau "percentatge")
@ -2341,34 +2342,37 @@ UsePassword=Utilitzeu una contrasenya
UseOauth=Utilitzeu un testimoni OAUTH UseOauth=Utilitzeu un testimoni OAUTH
Images=Imatges Images=Imatges
MaxNumberOfImagesInGetPost=Nombre màxim d'imatges permeses en un camp HTML enviat en un formulari MaxNumberOfImagesInGetPost=Nombre màxim d'imatges permeses en un camp HTML enviat en un formulari
MaxNumberOfPostOnPublicPagesByIP=Max number of posts on public pages with the same IP address in a month MaxNumberOfPostOnPublicPagesByIP=Nombre màxim de publicacions a pàgines públiques amb la mateixa adreça IP en un mes
CIDLookupURL=El mòdul aporta un URL que pot utilitzar una eina externa per a obtenir el nom d'un tercer o contacte des del seu número de telèfon. L'URL a utilitzar és: CIDLookupURL=El mòdul aporta un URL que pot utilitzar una eina externa per a obtenir el nom d'un tercer o contacte des del seu número de telèfon. L'URL a utilitzar és:
ScriptIsEmpty=El guió és buit ScriptIsEmpty=El guió és buit
ShowHideTheNRequests=Mostra/amaga les sol·licituds SQL %s ShowHideTheNRequests=Mostra/amaga les sol·licituds SQL %s
DefinedAPathForAntivirusCommandIntoSetup=Definiu una ruta per a un programa antivirus a <b> %s </b> DefinedAPathForAntivirusCommandIntoSetup=Definiu un camí per a un programa antivirus a <b>%s</b>
TriggerCodes=Esdeveniments desencadenants TriggerCodes=Esdeveniments desencadenants
TriggerCodeInfo=Introduïu aquí els codis activadors que han de generar una publicació d'una sol·licitud web (només es permet l'URL extern). Podeu introduir diversos codis d'activació separats per una coma. TriggerCodeInfo=Introduïu aquí els codis activadors que han de generar una publicació d'una sol·licitud web (només es permet l'URL extern). Podeu introduir diversos codis d'activació separats per una coma.
EditableWhenDraftOnly=If unchecked, the value can only be modified when object has a draft status EditableWhenDraftOnly=Si no està marcat, el valor només es pot modificar quan l'objecte té un estat d'esborrany
CssOnEdit=Css a les pàgines d'edició CssOnEdit=Css a les pàgines d'edició
CssOnView=Css a les pàgines de visualització CssOnView=Css a les pàgines de visualització
CssOnList=Css a les pàgines de llistat CssOnList=Css a les pàgines de llistat
HelpCssOnEditDesc=The Css used when editing the field.<br>Example: "minwiwdth100 maxwidth500 widthcentpercentminusx" HelpCssOnEditDesc=El Css utilitzat en editar el camp.<br>Exemple: «minwiwdth100 maxwidth500 widthcentpercentminusx»
HelpCssOnViewDesc=The Css used when viewing the field. HelpCssOnViewDesc=El Css utilitzat en visualitzar el camp.
HelpCssOnListDesc=The Css used when field is inside a list table.<br>Example: "tdoverflowmax200" HelpCssOnListDesc=El Css utilitzat quan el camp es troba dins d'una taula de llista.<br>Exemple: «tdoverflowmax200»
RECEPTION_PDF_HIDE_ORDERED=Hide the quantity ordered on the generated documents for receptions RECEPTION_PDF_HIDE_ORDERED=Amaga la quantitat demanada als documents generats per a recepcions
MAIN_PDF_RECEPTION_DISPLAY_AMOUNT_HT=Show the price on the generated documents for receptions MAIN_PDF_RECEPTION_DISPLAY_AMOUNT_HT=Mostra el preu als documents generats per a recepcions
WarningDisabled=Avís desactivat WarningDisabled=Avís desactivat
LimitsAndMitigation=Límits d'accés i mitigació LimitsAndMitigation=Límits d'accés i mitigació
DesktopsOnly=Només escriptoris DesktopsOnly=Només escriptoris
DesktopsAndSmartphones=Escriptoris i telèfons intel·ligents DesktopsAndSmartphones=Escriptoris i telèfons intel·ligents
AllowOnlineSign=Permet la signatura en línia AllowOnlineSign=Permet la signatura en línia
AllowExternalDownload=Allow external download (without login, using a shared link) AllowExternalDownload=Permet la baixada externa (sense iniciar sessió, mitjançant un enllaç compartit)
DeadlineDayVATSubmission=Deadline day for vat submission on the next month DeadlineDayVATSubmission=Dia límit per a la presentació del IVA el mes següent
MaxNumberOfAttachementOnForms=Nombre màxim de fitxers units en un formulari MaxNumberOfAttachementOnForms=Nombre màxim de fitxers units en un formulari
IfDefinedUseAValueBeetween=If defined, use a value between %s and %s IfDefinedUseAValueBeetween=Si està definit, utilitzeu un valor entre %s i %s
Reload=Recarregar Reload=Recarregar
ConfirmReload=Confirmeu la recàrrega del mòdul ConfirmReload=Confirmeu la recàrrega del mòdul
WarningModuleHasChangedLastVersionCheckParameter=Warning: the module %s has set a parameter to check its version at each page access. This is a bad and not allowed practice that may make the page to administer modules instable. Please contact author of module to fix this. WarningModuleHasChangedLastVersionCheckParameter=Avís: el mòdul %s ha establert un paràmetre per a comprovar la seva versió a cada accés a la pàgina. Aquesta és una pràctica dolenta i no permesa que pot fer que la pàgina per a administrar mòduls sigui inestable. Poseu-vos en contacte amb l'autor del mòdul per solucionar-ho.
WarningModuleHasChangedSecurityCsrfParameter=Warning: the module %s has disabled the CSRF security of your instance. This action is suspect and your installation may no more be secured. Please contact the author of the module for explanation. WarningModuleHasChangedSecurityCsrfParameter=Avís: el mòdul %s ha desactivat la seguretat CSRF de la vostra instància. Aquesta acció és sospitosa i és possible que la vostra instal·lació ja no estigui segura. Poseu-vos en contacte amb l'autor del mòdul per a obtenir una explicació.
EMailsInGoingDesc=Incoming emails are managed by the module %s. You must enable and configure it if you need to support ingoing emails. EMailsInGoingDesc=Els correus electrònics entrants són gestionats pel mòdul %s. Heu d'activar-lo i configurar-lo si necessiteu donar suport als correus electrònics entrants.
MAIN_IMAP_USE_PHPIMAP=Use the PHP-IMAP library for IMAP instead of native PHP IMAP. This also allows the use of an OAuth2 connection for IMAP (module OAuth must also be activated). MAIN_IMAP_USE_PHPIMAP=Utilitzeu la biblioteca PHP-IMAP per a IMAP en comptes de l'IMAP PHP natiu. Això també permet l'ús d'una connexió OAuth2 per IMAP (també s'ha d'activar el mòdul OAuth).
MAIN_CHECKBOX_LEFT_COLUMN=Mostra la columna per a la selecció de camps i línies a l'esquerra (a la dreta per defecte)
CSSPage=Estil CSS

View File

@ -88,7 +88,7 @@ SupplierInvoiceSentByEMail=Factura de proveïdor %s enviada per e-mail
ShippingSentByEMail=Enviament %s enviat per email ShippingSentByEMail=Enviament %s enviat per email
ShippingValidated= Enviament %s validat ShippingValidated= Enviament %s validat
InterventionSentByEMail=Intervenció %s enviada per e-mail InterventionSentByEMail=Intervenció %s enviada per e-mail
ProjectSentByEMail=Project %s sent by email ProjectSentByEMail=Projecte %s enviat per correu electrònic
ProposalDeleted=Pressupost esborrat ProposalDeleted=Pressupost esborrat
OrderDeleted=Comanda esborrada OrderDeleted=Comanda esborrada
InvoiceDeleted=Factura esborrada InvoiceDeleted=Factura esborrada
@ -102,7 +102,7 @@ PRODUCT_DELETEInDolibarr=Producte %s eliminat
HOLIDAY_CREATEInDolibarr=S'ha creat la sol·licitud de permís %s HOLIDAY_CREATEInDolibarr=S'ha creat la sol·licitud de permís %s
HOLIDAY_MODIFYInDolibarr=S'ha modificat la sol·licitud de permís %s HOLIDAY_MODIFYInDolibarr=S'ha modificat la sol·licitud de permís %s
HOLIDAY_APPROVEInDolibarr=Sol·licitud de dies lliures %s aprovada HOLIDAY_APPROVEInDolibarr=Sol·licitud de dies lliures %s aprovada
HOLIDAY_VALIDATEInDolibarr=La sol·licitud d’excedència %s validada HOLIDAY_VALIDATEInDolibarr=Sol·licitud de dies lliures %s validada
HOLIDAY_DELETEInDolibarr=S'ha suprimit la sol·licitud de permís %s HOLIDAY_DELETEInDolibarr=S'ha suprimit la sol·licitud de permís %s
EXPENSE_REPORT_CREATEInDolibarr=Creat l'informe de despeses %s EXPENSE_REPORT_CREATEInDolibarr=Creat l'informe de despeses %s
EXPENSE_REPORT_VALIDATEInDolibarr=S'ha validat l'informe de despeses %s EXPENSE_REPORT_VALIDATEInDolibarr=S'ha validat l'informe de despeses %s
@ -152,7 +152,7 @@ ExtSitesEnableThisTool=Mostra calendaris externs (definit a la configuració glo
ExtSitesNbOfAgenda=Nombre de calendaris ExtSitesNbOfAgenda=Nombre de calendaris
AgendaExtNb=Calendari núm. %s AgendaExtNb=Calendari núm. %s
ExtSiteUrlAgenda=URL per a accedir al fitxer .ical ExtSiteUrlAgenda=URL per a accedir al fitxer .ical
ExtSiteNoLabel=Sense descripció ExtSiteNoLabel=Sense nom
VisibleTimeRange=Rang de temps visible VisibleTimeRange=Rang de temps visible
VisibleDaysRange=Rang de dies visible VisibleDaysRange=Rang de dies visible
AddEvent=Crear esdeveniment AddEvent=Crear esdeveniment

View File

@ -25,7 +25,7 @@ InitialBankBalance=Saldo inicial
EndBankBalance=Saldo final EndBankBalance=Saldo final
CurrentBalance=Saldo actual CurrentBalance=Saldo actual
FutureBalance=Saldo previst FutureBalance=Saldo previst
ShowAllTimeBalance=Mostar balanç des de principi ShowAllTimeBalance=Mostra el saldo des de l'inici
AllTime=Des del principi AllTime=Des del principi
Reconciliation=Conciliació Reconciliation=Conciliació
RIB=Compte bancari RIB=Compte bancari
@ -144,7 +144,7 @@ AllAccounts=Tots els comptes bancaris i en efectiu
BackToAccount=Tornar al compte BackToAccount=Tornar al compte
ShowAllAccounts=Mostra per a tots els comptes ShowAllAccounts=Mostra per a tots els comptes
FutureTransaction=Transacció futura. No és possible conciliar. FutureTransaction=Transacció futura. No és possible conciliar.
SelectChequeTransactionAndGenerate=Seleccioneu / filtreu els xecs que s’inclouran al rebut del dipòsit de xecs. A continuació, feu clic a "Crea". SelectChequeTransactionAndGenerate=Seleccioneu/filtreu els xecs que s'han d'incloure a la remesa de xecs. A continuació, feu clic a «Crea».
InputReceiptNumber=Selecciona l'estat del compte bancari relacionat amb la conciliació. Utilitza un valor numèric que es pugui ordenar: AAAAMM o AAAAMMDD InputReceiptNumber=Selecciona l'estat del compte bancari relacionat amb la conciliació. Utilitza un valor numèric que es pugui ordenar: AAAAMM o AAAAMMDD
EventualyAddCategory=Finalment, especifiqueu una categoria on classificar els registres EventualyAddCategory=Finalment, especifiqueu una categoria on classificar els registres
ToConciliate=A conciliar? ToConciliate=A conciliar?

View File

@ -13,7 +13,7 @@ BillsStatistics=Estadístiques factures a clients
BillsStatisticsSuppliers=Estadístiques de Factures de proveïdors BillsStatisticsSuppliers=Estadístiques de Factures de proveïdors
DisabledBecauseDispatchedInBookkeeping=Desactivat perquè la factura ja s'ha comptabilitzat DisabledBecauseDispatchedInBookkeeping=Desactivat perquè la factura ja s'ha comptabilitzat
DisabledBecauseNotLastInvoice=Desactivat perquè la factura no es pot esborrar. Algunes factures s'han registrat després d'aquesta i això crearia espais buits al comptador. DisabledBecauseNotLastInvoice=Desactivat perquè la factura no es pot esborrar. Algunes factures s'han registrat després d'aquesta i això crearia espais buits al comptador.
DisabledBecauseNotLastSituationInvoice=Disabled because invoice is not erasable. This invoice is not the last one in situation invoice cycle. DisabledBecauseNotLastSituationInvoice=S'ha desactivat perquè la factura no es pot esborrar. Aquesta factura no és l'última del cicle de facturació de situació.
DisabledBecauseNotErasable=S'ha desactivat perquè no es pot esborrar DisabledBecauseNotErasable=S'ha desactivat perquè no es pot esborrar
InvoiceStandard=Factura estàndard InvoiceStandard=Factura estàndard
InvoiceStandardAsk=Factura estàndard InvoiceStandardAsk=Factura estàndard
@ -99,12 +99,12 @@ PaymentAmount=Import pagament
PaymentHigherThanReminderToPay=Pagament superior a la resta a pagar PaymentHigherThanReminderToPay=Pagament superior a la resta a pagar
HelpPaymentHigherThanReminderToPay=Atenció, l'import del pagament d'una o més factures és superior a l'import pendent de pagar. <br> Editeu la vostra entrada; en cas contrari, confirmeu i considereu la possibilitat de crear un abonament per l'excés rebut per cada factura pagada de més. HelpPaymentHigherThanReminderToPay=Atenció, l'import del pagament d'una o més factures és superior a l'import pendent de pagar. <br> Editeu la vostra entrada; en cas contrari, confirmeu i considereu la possibilitat de crear un abonament per l'excés rebut per cada factura pagada de més.
HelpPaymentHigherThanReminderToPaySupplier=Atenció, l'import del pagament d'una o més factures és superior a l'import pendent de pagar.<br>Editeu l'entrada, en cas contrari, confirmeu i considereu la possibilitat de crear un abonament per l'excés pagat per cada factura pagada de més. HelpPaymentHigherThanReminderToPaySupplier=Atenció, l'import del pagament d'una o més factures és superior a l'import pendent de pagar.<br>Editeu l'entrada, en cas contrari, confirmeu i considereu la possibilitat de crear un abonament per l'excés pagat per cada factura pagada de més.
ClassifyPaid=Classifica "Pagat" ClassifyPaid=Marca «Pagat»
ClassifyUnPaid=Classifica &quot;sense pagar&quot; ClassifyUnPaid=Marca «No pagat»
ClassifyPaidPartially=Classifica "Pagat parcialment" ClassifyPaidPartially=Marca «Pagat parcialment»
ClassifyCanceled=Classifica "Abandonat" ClassifyCanceled=Marca «Abandonats»
ClassifyClosed=Classifica "Tancat" ClassifyClosed=Marca «Tancat»
ClassifyUnBilled=Classifiqueu 'facturar' ClassifyUnBilled=Marca «No facturat»
CreateBill=Crear factura CreateBill=Crear factura
CreateCreditNote=Crear abonament CreateCreditNote=Crear abonament
AddBill=Crear factura o abonament AddBill=Crear factura o abonament
@ -131,7 +131,7 @@ BillStatusPaidBackOrConverted=Nota de crèdit reembossada o marcada com a crèdi
BillStatusConverted=Pagada (llesta per a utilitzar-se en la factura final) BillStatusConverted=Pagada (llesta per a utilitzar-se en la factura final)
BillStatusCanceled=Abandonada BillStatusCanceled=Abandonada
BillStatusValidated=Validada (a pagar) BillStatusValidated=Validada (a pagar)
BillStatusStarted=Pagada parcialment BillStatusStarted=Començat
BillStatusNotPaid=Pendent BillStatusNotPaid=Pendent
BillStatusNotRefunded=No reemborsat BillStatusNotRefunded=No reemborsat
BillStatusClosedUnpaid=Tancada (Pendent) BillStatusClosedUnpaid=Tancada (Pendent)
@ -143,7 +143,7 @@ Refunded=Reemborsada
BillShortStatusConverted=Tractada BillShortStatusConverted=Tractada
BillShortStatusCanceled=Abandonada BillShortStatusCanceled=Abandonada
BillShortStatusValidated=Validada BillShortStatusValidated=Validada
BillShortStatusStarted=Començada BillShortStatusStarted=Començat
BillShortStatusNotPaid=Pendent BillShortStatusNotPaid=Pendent
BillShortStatusNotRefunded=No reemborsat BillShortStatusNotRefunded=No reemborsat
BillShortStatusClosedUnpaid=Tancada BillShortStatusClosedUnpaid=Tancada
@ -172,7 +172,7 @@ NewBill=Factura nova
LastBills=Últimes %s factures LastBills=Últimes %s factures
LatestTemplateInvoices=Últimes %s plantilles de factura LatestTemplateInvoices=Últimes %s plantilles de factura
LatestCustomerTemplateInvoices=Últimes %s plantilles de factures de client LatestCustomerTemplateInvoices=Últimes %s plantilles de factures de client
LatestSupplierTemplateInvoices=Darreres %s plantilles de factures de proveïdor LatestSupplierTemplateInvoices=Últimes %s plantilles de factures de proveïdor
LastCustomersBills=Últimes %s factures de client LastCustomersBills=Últimes %s factures de client
LastSuppliersBills=Últimes %s factures de proveïdor LastSuppliersBills=Últimes %s factures de proveïdor
AllBills=Totes les factures AllBills=Totes les factures
@ -188,7 +188,7 @@ ConfirmValidateBill=Està segur de voler validar aquesta factura amb la referèn
ConfirmUnvalidateBill=Està segur de voler tornar la factura <b>%s</b> a l'estat esborrany? ConfirmUnvalidateBill=Està segur de voler tornar la factura <b>%s</b> a l'estat esborrany?
ConfirmClassifyPaidBill=Està segur de voler classificar la factura <b>%s</b> com pagada? ConfirmClassifyPaidBill=Està segur de voler classificar la factura <b>%s</b> com pagada?
ConfirmCancelBill=Està segur de voler anul·lar la factura <b>%s</b>? ConfirmCancelBill=Està segur de voler anul·lar la factura <b>%s</b>?
ConfirmCancelBillQuestion=Per quina raó vols classificar aquesta factura com 'abandonada'? ConfirmCancelBillQuestion=Per què voleu marcar aquesta factura com a «abandonada»?
ConfirmClassifyPaidPartially=Està segur de voler classificar la factura <b>%s</b> com pagada? ConfirmClassifyPaidPartially=Està segur de voler classificar la factura <b>%s</b> com pagada?
ConfirmClassifyPaidPartiallyQuestion=Aquesta factura no s'ha pagat completament. Quin és el motiu de tancament d'aquesta factura? ConfirmClassifyPaidPartiallyQuestion=Aquesta factura no s'ha pagat completament. Quin és el motiu de tancament d'aquesta factura?
ConfirmClassifyPaidPartiallyReasonAvoir=La resta a pagar <b>(%s %s)</b> és un descompte atorgat perquè el pagament es va fer abans de temps. Regularitzaré l'IVA d'aquest descompte amb un abonament. ConfirmClassifyPaidPartiallyReasonAvoir=La resta a pagar <b>(%s %s)</b> és un descompte atorgat perquè el pagament es va fer abans de temps. Regularitzaré l'IVA d'aquest descompte amb un abonament.
@ -196,7 +196,7 @@ ConfirmClassifyPaidPartiallyReasonDiscount=La resta a pagar <b>(%s %s)</b> és u
ConfirmClassifyPaidPartiallyReasonDiscountNoVat=La resta a pagar <b>(%s %s)</b> és un descompte acordat després de la facturació. Accepto perdre l'IVA d'aquest descompte ConfirmClassifyPaidPartiallyReasonDiscountNoVat=La resta a pagar <b>(%s %s)</b> és un descompte acordat després de la facturació. Accepto perdre l'IVA d'aquest descompte
ConfirmClassifyPaidPartiallyReasonDiscountVat=La resta a pagar <b>(%s %s)</b> és un descompte atorgat perquè el pagament es va fer abans de temps. Recupero l'IVA d'aquest descompte, sense un abonament. ConfirmClassifyPaidPartiallyReasonDiscountVat=La resta a pagar <b>(%s %s)</b> és un descompte atorgat perquè el pagament es va fer abans de temps. Recupero l'IVA d'aquest descompte, sense un abonament.
ConfirmClassifyPaidPartiallyReasonBadCustomer=Client morós ConfirmClassifyPaidPartiallyReasonBadCustomer=Client morós
ConfirmClassifyPaidPartiallyReasonBankCharge=Deducció per banc (comissions bancàries intermediaris) ConfirmClassifyPaidPartiallyReasonBankCharge=Deducció per banc (comissions bancàries)
ConfirmClassifyPaidPartiallyReasonProductReturned=Productes retornats en part ConfirmClassifyPaidPartiallyReasonProductReturned=Productes retornats en part
ConfirmClassifyPaidPartiallyReasonOther=D'altra raó ConfirmClassifyPaidPartiallyReasonOther=D'altra raó
ConfirmClassifyPaidPartiallyReasonDiscountNoVatDesc=Aquesta opció és possible si la vostra factura ha rebut els comentaris adequats. (Exemple «Només l'impost corresponent al preu realment pagat dona dret a la deducció») ConfirmClassifyPaidPartiallyReasonDiscountNoVatDesc=Aquesta opció és possible si la vostra factura ha rebut els comentaris adequats. (Exemple «Només l'impost corresponent al preu realment pagat dona dret a la deducció»)
@ -204,7 +204,7 @@ ConfirmClassifyPaidPartiallyReasonDiscountVatDesc=En alguns països, aquesta opc
ConfirmClassifyPaidPartiallyReasonAvoirDesc=Aquesta elecció és l'elecció que s'ha de prendre si les altres no són aplicables ConfirmClassifyPaidPartiallyReasonAvoirDesc=Aquesta elecció és l'elecció que s'ha de prendre si les altres no són aplicables
ConfirmClassifyPaidPartiallyReasonBadCustomerDesc=Un <b> client morós </b> és un client que es nega a pagar el seu deute. ConfirmClassifyPaidPartiallyReasonBadCustomerDesc=Un <b> client morós </b> és un client que es nega a pagar el seu deute.
ConfirmClassifyPaidPartiallyReasonProductReturnedDesc=Aquesta elecció és possible si el cas de pagament incomplet és arran d'una devolució de part dels productes ConfirmClassifyPaidPartiallyReasonProductReturnedDesc=Aquesta elecció és possible si el cas de pagament incomplet és arran d'una devolució de part dels productes
ConfirmClassifyPaidPartiallyReasonBankChargeDesc=L'import no pagat és <b> comissions bancàries intermediaris </b> , deduïdes directament de l'import correcte <b> </b> pagat pel Client. ConfirmClassifyPaidPartiallyReasonBankChargeDesc=L'import no pagat son <b>comissions bancàries</b>, deduïdes directament de <b>l'import correcte</b> pagat pel Client.
ConfirmClassifyPaidPartiallyReasonOtherDesc=Utilitza aquesta opció si totes les altres no són adequades, per exemple, en la següent situació: <br>- el pagament no s'ha completat perquè alguns productes es van tornar a enviar<br>- la quantitat reclamada és massa important perquè s'ha oblidat un descompte <br>En tots els casos, s'ha de corregir l'import excessiu en el sistema de comptabilitat mitjançant la creació d’un abonament. ConfirmClassifyPaidPartiallyReasonOtherDesc=Utilitza aquesta opció si totes les altres no són adequades, per exemple, en la següent situació: <br>- el pagament no s'ha completat perquè alguns productes es van tornar a enviar<br>- la quantitat reclamada és massa important perquè s'ha oblidat un descompte <br>En tots els casos, s'ha de corregir l'import excessiu en el sistema de comptabilitat mitjançant la creació d’un abonament.
ConfirmClassifyAbandonReasonOther=Altres ConfirmClassifyAbandonReasonOther=Altres
ConfirmClassifyAbandonReasonOtherDesc=Aquesta elecció serà per a qualsevol altre cas. Per exemple arran de la intenció de crear una factura rectificativa. ConfirmClassifyAbandonReasonOtherDesc=Aquesta elecció serà per a qualsevol altre cas. Per exemple arran de la intenció de crear una factura rectificativa.
@ -275,7 +275,7 @@ DatePointOfTax=Punt d'impostos
NoInvoice=Cap factura NoInvoice=Cap factura
NoOpenInvoice=No hi ha factura oberta NoOpenInvoice=No hi ha factura oberta
NbOfOpenInvoices=Nombre de factures obertes NbOfOpenInvoices=Nombre de factures obertes
ClassifyBill=Classifica la factura ClassifyBill=Marca la factura
SupplierBillsToPay=Factures de proveïdors pendents de pagament SupplierBillsToPay=Factures de proveïdors pendents de pagament
CustomerBillsUnpaid=Factures de client pendents de cobrament CustomerBillsUnpaid=Factures de client pendents de cobrament
NonPercuRecuperable=No percebut recuperable NonPercuRecuperable=No percebut recuperable
@ -535,12 +535,12 @@ CantRemovePaymentSalaryPaid=No es pot eliminar el pagament perquè el salari est
ExpectedToPay=Esperant el pagament ExpectedToPay=Esperant el pagament
CantRemoveConciliatedPayment=No es pot eliminar el pagament reconciliat CantRemoveConciliatedPayment=No es pot eliminar el pagament reconciliat
PayedByThisPayment=Pagada per aquest pagament PayedByThisPayment=Pagada per aquest pagament
ClosePaidInvoicesAutomatically=Classifiqueu automàticament totes les factures estàndard, de pagament inicial o de reemplaçament com a "Pagades" quan el pagament es realitzi completament. ClosePaidInvoicesAutomatically=Marca automàticament totes les factures estàndard, de pagament inicial o de substitució com a «Pagades» quan el pagament s'hagi fet completament.
ClosePaidCreditNotesAutomatically=Classifiqueu automàticament totes les notes de crèdit com a "Pagades" quan es faci la devolució íntegra. ClosePaidCreditNotesAutomatically=Marca automàticament totes les notes de crèdit com a «Pagades» quan el reemborsament s'hagi fet completament.
ClosePaidContributionsAutomatically=Classifiqueu automàticament totes les contribucions socials o fiscals com a "Pagades" quan el pagament es realitzi íntegrament. ClosePaidContributionsAutomatically=Marca automàticament totes les cotitzacions socials o fiscals com a "Pagades" quan el pagament s'hagi fet íntegrament.
ClosePaidVATAutomatically=Classifica automàticament la declaració d'IVA com a "Pagada" quan el pagament es realitzi completament. ClosePaidVATAutomatically=Marca automàticament la declaració d'IVA com a «Pagada» quan el pagament s'hagi fet completament.
ClosePaidSalaryAutomatically=Classifiqueu automàticament el salari com a "Pagat" quan el pagament es faci completament. ClosePaidSalaryAutomatically=Marca automàticament el sou com a «Pagat» quan el pagament s'hagi fet completament.
AllCompletelyPayedInvoiceWillBeClosed=Totes les factures no pendents de pagament es tancaran automàticament amb l'estat "Pagat". AllCompletelyPayedInvoiceWillBeClosed=Totes les factures sense pagaments pendents es tancaran automàticament amb l'estat «Pagat».
ToMakePayment=Pagar ToMakePayment=Pagar
ToMakePaymentBack=Reemborsar ToMakePaymentBack=Reemborsar
ListOfYourUnpaidInvoices=Llistat de factures impagades ListOfYourUnpaidInvoices=Llistat de factures impagades
@ -555,7 +555,7 @@ PDFCrevetteDescription=Plantilla Crevette per factures PDF. Una plantilla de fac
TerreNumRefModelDesc1=Retorna el número en el format %syymm-nnnn per a les factures estàndard i %syymm-nnnn per a les notes de crèdit on aa és any, mm és mes i nnnn és un número d’increment automàtic seqüencial sense interrupció i sense retorn a 0 TerreNumRefModelDesc1=Retorna el número en el format %syymm-nnnn per a les factures estàndard i %syymm-nnnn per a les notes de crèdit on aa és any, mm és mes i nnnn és un número d’increment automàtic seqüencial sense interrupció i sense retorn a 0
MarsNumRefModelDesc1=Número de devolució en el format %syymm-nnnn per a factures estàndard, %syymm-nnnn per a factures de substitució, %syymm-nnnn per a factures d’avançament i %syymm notes i any sense descans i sense retorn a 0 MarsNumRefModelDesc1=Número de devolució en el format %syymm-nnnn per a factures estàndard, %syymm-nnnn per a factures de substitució, %syymm-nnnn per a factures d’avançament i %syymm notes i any sense descans i sense retorn a 0
TerreNumRefModelError=Ja existeix una factura que comença amb $syymm i no és compatible amb aquest model de seqüència. Elimineu-la o canvieu-li el nom per a activar aquest mòdul. TerreNumRefModelError=Ja existeix una factura que comença amb $syymm i no és compatible amb aquest model de seqüència. Elimineu-la o canvieu-li el nom per a activar aquest mòdul.
CactusNumRefModelDesc1=Número de devolució en el format %syymm-nnnn per a les factures estàndard, %syymm-nnnn per a les notes de crèdit i %syymm-nnnn per a les factures d’avançament en què yy és any, mm és mes i nnnn és un número que no ha de retorn automàtic 0 CactusNumRefModelDesc1=Retorna un número en el format %syymm-nnnn per a factures estàndard, %syymm-nnnn per a devolucions i %syymm-nnnn per a factures de bestreta on yy és l'any, mm és el mes i nnnn és un número seqüencial auto-incrementat sense ruptura ni retorn a 0
EarlyClosingReason=Motiu de tancament anticipat EarlyClosingReason=Motiu de tancament anticipat
EarlyClosingComment=Nota de tancament anticipat EarlyClosingComment=Nota de tancament anticipat
##### Types de contacts ##### ##### Types de contacts #####
@ -626,8 +626,8 @@ PaymentRegisteredAndInvoiceSetToPaid=Pagament registrat i factura %s configurada
SendEmailsRemindersOnInvoiceDueDate=Envieu un recordatori per correu electrònic per a les factures no pagades SendEmailsRemindersOnInvoiceDueDate=Envieu un recordatori per correu electrònic per a les factures no pagades
MakePaymentAndClassifyPayed=Registre de pagament MakePaymentAndClassifyPayed=Registre de pagament
BulkPaymentNotPossibleForInvoice=El pagament massiu no és possible per a la factura %s (tipus o estat incorrecte) BulkPaymentNotPossibleForInvoice=El pagament massiu no és possible per a la factura %s (tipus o estat incorrecte)
MentionVATDebitOptionIsOn=Option to pay tax based on debits MentionVATDebitOptionIsOn=Opció de pagar impostos en funció de dèbits
MentionCategoryOfOperations=Categoria d'operacions MentionCategoryOfOperations=Categoria d'operacions
MentionCategoryOfOperations0=Lliurament de mercaderies MentionCategoryOfOperations0=Lliurament de mercaderies
MentionCategoryOfOperations1=Prestació de serveis MentionCategoryOfOperations1=Prestació de serveis
MentionCategoryOfOperations2=Mixed - Delivery of goods & provision of services MentionCategoryOfOperations2=Mixt: lliurament de béns i prestació de serveis

View File

@ -18,13 +18,13 @@ BoxLastActions=Últimes accions
BoxLastContracts=Últims contractes BoxLastContracts=Últims contractes
BoxLastContacts=Últims contactes/adreces BoxLastContacts=Últims contactes/adreces
BoxLastMembers=Últims socis BoxLastMembers=Últims socis
BoxLastModifiedMembers=Darrers membres modificats BoxLastModifiedMembers=Últims socis modificats
BoxLastMembersSubscriptions=Últimes subscripcions de membres BoxLastMembersSubscriptions=Últimes subscripcions de socis
BoxFicheInter=Últimes intervencions BoxFicheInter=Últimes intervencions
BoxCurrentAccounts=Balanç de comptes oberts BoxCurrentAccounts=Balanç de comptes oberts
BoxTitleMemberNextBirthdays=Aniversaris d'aquest mes (membres) BoxTitleMemberNextBirthdays=Aniversaris d'aquest mes (membres)
BoxTitleMembersByType=Membres per tipus i estat BoxTitleMembersByType=Membres per tipus i estat
BoxTitleMembersByTags=Members by tags and status BoxTitleMembersByTags=Socis per etiquetes i estat
BoxTitleMembersSubscriptionsByYear=Subscripcions de membres per any BoxTitleMembersSubscriptionsByYear=Subscripcions de membres per any
BoxTitleLastRssInfos=Últimes %s notícies de %s BoxTitleLastRssInfos=Últimes %s notícies de %s
BoxTitleLastProducts=Productes / Serveis: últims %s modificats BoxTitleLastProducts=Productes / Serveis: últims %s modificats
@ -33,8 +33,8 @@ BoxTitleLastSuppliers=Últims %s proveïdors registrats
BoxTitleLastModifiedSuppliers=Proveïdors: últims %s modificats BoxTitleLastModifiedSuppliers=Proveïdors: últims %s modificats
BoxTitleLastModifiedCustomers=Clients: últims %s modificats BoxTitleLastModifiedCustomers=Clients: últims %s modificats
BoxTitleLastCustomersOrProspects=Últims %s clients o clients potencials BoxTitleLastCustomersOrProspects=Últims %s clients o clients potencials
BoxTitleLastCustomerBills=Darreres %s factures a client modificades BoxTitleLastCustomerBills=Últimes %s factures de client modificades
BoxTitleLastSupplierBills=Darreres %s factures de proveïdor modificades BoxTitleLastSupplierBills=Últimes %s factures de proveïdor modificades
BoxTitleLastModifiedProspects=Clients Potencials: últims %s modificats BoxTitleLastModifiedProspects=Clients Potencials: últims %s modificats
BoxTitleLastModifiedMembers=Últims %s socis BoxTitleLastModifiedMembers=Últims %s socis
BoxTitleLastFicheInter=Últimes %s intervencions modificades BoxTitleLastFicheInter=Últimes %s intervencions modificades
@ -48,12 +48,12 @@ BoxOldestExpiredServices=Serveis antics expirats
BoxOldestActions=Els esdeveniments més antics per a fer BoxOldestActions=Els esdeveniments més antics per a fer
BoxLastExpiredServices=Últims %s contactes amb serveis actius expirats BoxLastExpiredServices=Últims %s contactes amb serveis actius expirats
BoxTitleLastActionsToDo=Últimes %s accions a fer BoxTitleLastActionsToDo=Últimes %s accions a fer
BoxTitleOldestActionsToDo=Oldest %s events to do, not completed BoxTitleOldestActionsToDo=Els esdeveniments %s més antics per a fer, no s'han completat
BoxTitleLastContracts=Últims contractes %s que es van modificar BoxTitleLastContracts=Últims %s contractes que s'han modificat
BoxTitleLastModifiedDonations=Últimes donacions %s que es van modificar BoxTitleLastModifiedDonations=Últimes %s donacions que s'han modificat
BoxTitleLastModifiedExpenses=Últims informes de despeses %s que es van modificar BoxTitleLastModifiedExpenses=Últims %s informes de despeses que s'han modificat
BoxTitleLatestModifiedBoms=Últims BOMs %s que es van modificar BoxTitleLatestModifiedBoms=Últims %s BOMs que s'han modificat
BoxTitleLatestModifiedMos=Últimes comandes de fabricació %s que es van modificar BoxTitleLatestModifiedMos=Últimes %s ordres de fabricació modificades
BoxTitleLastOutstandingBillReached=Clients que han superat el màxim pendent BoxTitleLastOutstandingBillReached=Clients que han superat el màxim pendent
BoxGlobalActivity=Activitat global BoxGlobalActivity=Activitat global
BoxGoodCustomers=Bons clients BoxGoodCustomers=Bons clients
@ -61,7 +61,7 @@ BoxTitleGoodCustomers=% bons clients
BoxScheduledJobs=Tasques programades BoxScheduledJobs=Tasques programades
BoxTitleFunnelOfProspection=Oportunitat embut BoxTitleFunnelOfProspection=Oportunitat embut
FailedToRefreshDataInfoNotUpToDate=No s'ha pogut actualitzar el flux RSS. Última data d'actualització amb èxit: %s FailedToRefreshDataInfoNotUpToDate=No s'ha pogut actualitzar el flux RSS. Última data d'actualització amb èxit: %s
LastRefreshDate=Última data que es va refrescar LastRefreshDate=Última data d'actualització
NoRecordedBookmarks=No hi ha marcadors personals. NoRecordedBookmarks=No hi ha marcadors personals.
ClickToAdd=Feu clic aquí per a afegir. ClickToAdd=Feu clic aquí per a afegir.
NoRecordedCustomers=Cap client registrat NoRecordedCustomers=Cap client registrat
@ -94,8 +94,8 @@ BoxTitleLatestModifiedSupplierOrders=Comandes a Proveïdor: últimes %s modifica
BoxTitleLastModifiedCustomerBills=Factures del client: últimes %s modificades BoxTitleLastModifiedCustomerBills=Factures del client: últimes %s modificades
BoxTitleLastModifiedCustomerOrders=Comandes de venda: últimes %s modificades BoxTitleLastModifiedCustomerOrders=Comandes de venda: últimes %s modificades
BoxTitleLastModifiedPropals=Últims %s pressupostos modificats BoxTitleLastModifiedPropals=Últims %s pressupostos modificats
BoxTitleLatestModifiedJobPositions=Últims llocs de treball modificats %s BoxTitleLatestModifiedJobPositions=Últims %s llocs de treball modificats
BoxTitleLatestModifiedCandidatures=Últimes aplicacions de treball modificades %s BoxTitleLatestModifiedCandidatures=Últimes %s sol·licituds de feina modificades
ForCustomersInvoices=Factures a clients ForCustomersInvoices=Factures a clients
ForCustomersOrders=Comandes de clients ForCustomersOrders=Comandes de clients
ForProposals=Pressupostos ForProposals=Pressupostos
@ -103,7 +103,7 @@ LastXMonthRolling=Els últims %s mesos consecutius
ChooseBoxToAdd=Afegeix el panell a la teva taula de control ChooseBoxToAdd=Afegeix el panell a la teva taula de control
BoxAdded=S'ha afegit el panell a la teva taula de control BoxAdded=S'ha afegit el panell a la teva taula de control
BoxTitleUserBirthdaysOfMonth=Aniversaris d'aquest mes (usuaris) BoxTitleUserBirthdaysOfMonth=Aniversaris d'aquest mes (usuaris)
BoxLastManualEntries=Últim registre de comptabilitat introduït manualment o sense document d'origen BoxLastManualEntries=Últim registre en comptabilitat introduït manualment o sense document d'origen
BoxTitleLastManualEntries=%s últim registre introduït manualment o sense document d'origen BoxTitleLastManualEntries=%s últim registre introduït manualment o sense document d'origen
NoRecordedManualEntries=No hi ha registres d'entrades manuals en comptabilitat NoRecordedManualEntries=No hi ha registres d'entrades manuals en comptabilitat
BoxSuspenseAccount=Operació comptable de comptes amb compte de suspens BoxSuspenseAccount=Operació comptable de comptes amb compte de suspens
@ -118,6 +118,27 @@ BoxCustomersOutstandingBillReached=Clients que superen el límit pendent
UsersHome=Usuaris i grups domèstics UsersHome=Usuaris i grups domèstics
MembersHome=Membres a casa MembersHome=Membres a casa
ThirdpartiesHome=Inici Tercers ThirdpartiesHome=Inici Tercers
productindex=Inici de productes i serveis
mrpindex=Inici MRP
commercialindex=Inici de comercial
projectsindex=Inici de projectes
invoiceindex=Inici de factures
hrmindex=Inici de factures
TicketsHome=Entrades a casa TicketsHome=Entrades a casa
stockindex=Inici d'estocs
sendingindex=Inici d'enviaments
receptionindex=inici de recepcions
activityindex=Inici d'activitat
proposalindex=Inici de propostes
ordersindex=Inici de comandes
orderssuppliersindex=Inici de comandes a proveïdors
contractindex=Inici de contractes
interventionindex=Inici de intervencions
suppliersproposalsindex=Inici de propostes de proveïdors
donationindex=Inici de donacions
specialexpensesindex=Inici de despeses especials
expensereportindex=Inici de informe de despeses
mailingindex=Inici de correu massiu
opensurveyindex=Inici d'enquesta oberta
AccountancyHome=Inici Comptabilitat AccountancyHome=Inici Comptabilitat
ValidatedProjects=Projectes validats ValidatedProjects=Projectes validats

View File

@ -312,7 +312,7 @@ CustomerRelativeDiscountShort=Descompte relatiu
CustomerAbsoluteDiscountShort=Descompte fixe CustomerAbsoluteDiscountShort=Descompte fixe
CompanyHasRelativeDiscount=Aquest client té un descompte per defecte de <b>%s%%</b> CompanyHasRelativeDiscount=Aquest client té un descompte per defecte de <b>%s%%</b>
CompanyHasNoRelativeDiscount=Aquest client no té descomptes relatius per defecte CompanyHasNoRelativeDiscount=Aquest client no té descomptes relatius per defecte
HasRelativeDiscountFromSupplier=You have a default discount of <b>%s%%</b> with this vendor HasRelativeDiscountFromSupplier=Teniu un descompte predeterminat de <b>%s%%</b> amb aquest proveïdor
HasNoRelativeDiscountFromSupplier=No hi ha descompte relatiu predeterminat amb aquest venedor HasNoRelativeDiscountFromSupplier=No hi ha descompte relatiu predeterminat amb aquest venedor
CompanyHasAbsoluteDiscount=Aquest client té descomptes disponibles (notes de crèdit o bestretes) per <b>%s</b> %s CompanyHasAbsoluteDiscount=Aquest client té descomptes disponibles (notes de crèdit o bestretes) per <b>%s</b> %s
CompanyHasDownPaymentOrCommercialDiscount=Aquest client té un descompte disponible (comercial, de pagament) per a <b>%s</b>%s CompanyHasDownPaymentOrCommercialDiscount=Aquest client té un descompte disponible (comercial, de pagament) per a <b>%s</b>%s
@ -357,7 +357,7 @@ RequiredIfSupplier=Obligatori si un tercer és proveïdor
ValidityControledByModule=Validesa controlada pel mòdul ValidityControledByModule=Validesa controlada pel mòdul
ThisIsModuleRules=Regles per a aquest mòdul ThisIsModuleRules=Regles per a aquest mòdul
ProspectToContact=Client potencial a contactar ProspectToContact=Client potencial a contactar
CompanyDeleted=L'empresa "%s" ha estat eliminada CompanyDeleted=L'empresa «%s» s'ha suprimit de la base de dades.
ListOfContacts=Llistat de contactes ListOfContacts=Llistat de contactes
ListOfContactsAddresses=Llistat de contactes ListOfContactsAddresses=Llistat de contactes
ListOfThirdParties=Llista de tercers ListOfThirdParties=Llista de tercers
@ -386,7 +386,7 @@ VATIntraCheck=Verificar
VATIntraCheckDesc=El NIF Intracomunitari ha d'incloure el prefix del país. L'enllaç <b>%s</b> utilitza el servei europeu de verificació de NIF (VIES) que requereix accés a Internet des del servidor Dolibarr. VATIntraCheckDesc=El NIF Intracomunitari ha d'incloure el prefix del país. L'enllaç <b>%s</b> utilitza el servei europeu de verificació de NIF (VIES) que requereix accés a Internet des del servidor Dolibarr.
VATIntraCheckURL=http://ec.europa.eu/taxation_customs/vies/vieshome.do VATIntraCheckURL=http://ec.europa.eu/taxation_customs/vies/vieshome.do
VATIntraCheckableOnEUSite=Verifica el NIF Intracomunitari a la web de la Comissió Europea VATIntraCheckableOnEUSite=Verifica el NIF Intracomunitari a la web de la Comissió Europea
VATIntraManualCheck=També podeu comprovar manualment al lloc web de la Comissió Europea <a href="%s" target="_blank" rel="noopener noreferrer"> %s </a> VATIntraManualCheck=També podeu comprovar manualment al lloc web de la Comissió Europea <a href="%s" target="_blank" rel="noopener noreferrer">%s</a>
ErrorVATCheckMS_UNAVAILABLE=Comprovació impossible. El servei de comprovació no és prestat pel país membre (%s). ErrorVATCheckMS_UNAVAILABLE=Comprovació impossible. El servei de comprovació no és prestat pel país membre (%s).
NorProspectNorCustomer=Ni client, ni client potencial NorProspectNorCustomer=Ni client, ni client potencial
JuridicalStatus=Tipus d'entitat empresarial JuridicalStatus=Tipus d'entitat empresarial
@ -462,7 +462,7 @@ ListSuppliersShort=Llistat de proveïdors
ListProspectsShort=Llistat de clients potencials ListProspectsShort=Llistat de clients potencials
ListCustomersShort=Llistat de clients ListCustomersShort=Llistat de clients
ThirdPartiesArea=Àrea de tercers i contactes ThirdPartiesArea=Àrea de tercers i contactes
LastModifiedThirdParties=Últims tercers %s que van ser modificats LastModifiedThirdParties=Últims %s tercers que s'han modificat
UniqueThirdParties=Nombre total de tercers UniqueThirdParties=Nombre total de tercers
InActivity=Actiu InActivity=Actiu
ActivityCeased=Tancat ActivityCeased=Tancat
@ -499,7 +499,7 @@ OutOfEurope=Fora d’Europa (CEE)
CurrentOutstandingBillLate=Factura pendent actual en retard CurrentOutstandingBillLate=Factura pendent actual en retard
BecarefullChangeThirdpartyBeforeAddProductToInvoice=Ves amb compte, en funció de la configuració del preu del producte, has de canviar de tercer abans d’afegir el producte al TPV. BecarefullChangeThirdpartyBeforeAddProductToInvoice=Ves amb compte, en funció de la configuració del preu del producte, has de canviar de tercer abans d’afegir el producte al TPV.
EmailAlreadyExistsPleaseRewriteYourCompanyName=El correu electrònic ja existeix, si us plau, reescriu el nom de la teva empresa EmailAlreadyExistsPleaseRewriteYourCompanyName=El correu electrònic ja existeix, si us plau, reescriu el nom de la teva empresa
TwoRecordsOfCompanyName=more than one record exists for this company, please contact us to complete your partnership request TwoRecordsOfCompanyName=Hi ha més d'un registre per a aquesta empresa, poseu-vos en contacte amb nosaltres per a completar la vostra sol·licitud d'associació
CompanySection=Secció d'empresa CompanySection=Secció d'empresa
ShowSocialNetworks=Mostra les xarxes socials ShowSocialNetworks=Mostra les xarxes socials
HideSocialNetworks=Amaga les xarxes socials HideSocialNetworks=Amaga les xarxes socials

View File

@ -1,13 +1,13 @@
# Dolibarr language file - Source file is en_US - compta # Dolibarr language file - Source file is en_US - compta
MenuFinancial=Financera MenuFinancial=Financera
TaxModuleSetupToModifyRules=Aneu a <a href="%s"> Configuració del mòdul Impostos </a> per a modificar les regles de càlcul TaxModuleSetupToModifyRules=Aneu a <a href="%s"> Configuració del mòdul Impostos </a> per a modificar les regles de càlcul
TaxModuleSetupToModifyRulesLT=Aneu a <a href="%s"> Configuració de l'empresa </a> per a modificar les regles de càlcul TaxModuleSetupToModifyRulesLT=Aneu a <a href="%s">Configuració de l'empresa</a> per a modificar les regles de càlcul
OptionMode=Opció de gestió comptable OptionMode=Opció de gestió comptable
OptionModeTrue=Opció Ingressos-Despeses OptionModeTrue=Opció Ingressos-Despeses
OptionModeVirtual=Opció Crèdits-Deutes OptionModeVirtual=Opció Crèdits-Deutes
OptionModeTrueDesc=En aquest context, la facturació es calcula sobre els pagaments (data dels pagaments). La validesa de les xifres només està assegurada si la comptabilitat es controla mitjançant l'entrada/sortida dels comptes mitjançant factures. OptionModeTrueDesc=En aquest context, la facturació es calcula sobre els pagaments (data dels pagaments). La validesa de les xifres només està assegurada si la comptabilitat es controla mitjançant l'entrada/sortida dels comptes mitjançant factures.
OptionModeVirtualDesc=En aquest context, la facturació es calcula sobre les factures (data de validació). Quan es venguin aquestes factures, tant si s'han pagat com si no, s'enumeren a la sortida de la facturació. OptionModeVirtualDesc=En aquest context, la facturació es calcula sobre les factures (data de validació). Quan es venguin aquestes factures, tant si s'han pagat com si no, s'enumeren a la sortida de la facturació.
FeatureIsSupportedInInOutModeOnly=Funció disponible només en el mode comptes CREDITS-DEUTES (Veure la configuració del mòdul comptes) FeatureIsSupportedInInOutModeOnly=Funció només disponible en el mode de comptabilitat CRÈDITS-DEUTES (vegeu la configuració del mòdul de comptabilitat)
VATReportBuildWithOptionDefinedInModule=Els imports obtinguts es calculen segons la configuració del mòdul Impostos. VATReportBuildWithOptionDefinedInModule=Els imports obtinguts es calculen segons la configuració del mòdul Impostos.
LTReportBuildWithOptionDefinedInModule=Els imports obtinguts es calculen segons la configuració de l'Empresa LTReportBuildWithOptionDefinedInModule=Els imports obtinguts es calculen segons la configuració de l'Empresa
Param=Configuració Param=Configuració
@ -73,7 +73,7 @@ SocialContributions=Impostos varis
SocialContributionsDeductibles=Impostos varis deduïbles SocialContributionsDeductibles=Impostos varis deduïbles
SocialContributionsNondeductibles=Impostos varis no deduïbles SocialContributionsNondeductibles=Impostos varis no deduïbles
DateOfSocialContribution=Data de l’impost social o fiscal DateOfSocialContribution=Data de l’impost social o fiscal
LabelContrib=Aportació d'etiquetes LabelContrib=Nom d'aportació
TypeContrib=Tipus d'aportació TypeContrib=Tipus d'aportació
MenuSpecialExpenses=Pagaments especials MenuSpecialExpenses=Pagaments especials
MenuTaxAndDividends=Impostos i càrregues MenuTaxAndDividends=Impostos i càrregues
@ -132,7 +132,7 @@ ByThirdParties=Per tercer
ByUserAuthorOfInvoice=Per autor de la factura ByUserAuthorOfInvoice=Per autor de la factura
CheckReceipt=Ingrés de xec CheckReceipt=Ingrés de xec
CheckReceiptShort=Ingrés de xec CheckReceiptShort=Ingrés de xec
LastCheckReceiptShort=Últimes %s remeses de xec LastCheckReceiptShort=Últims %s rebuts de xec
NewCheckReceipt=Descompte nou NewCheckReceipt=Descompte nou
NewCheckDeposit=Ingrés nou NewCheckDeposit=Ingrés nou
NewCheckDepositOn=Crear el rebut per a l'ingrés al compte: %s NewCheckDepositOn=Crear el rebut per a l'ingrés al compte: %s
@ -142,9 +142,9 @@ NbOfCheques=Nombre de xecs
PaySocialContribution=Pagar un impost varis PaySocialContribution=Pagar un impost varis
PayVAT=Paga una declaració d’IVA PayVAT=Paga una declaració d’IVA
PaySalary=Pagar una targeta salarial PaySalary=Pagar una targeta salarial
ConfirmPaySocialContribution=Esteu segur que voleu classificar aquest impost varis com a pagat? ConfirmPaySocialContribution=Esteu segur que voleu marcar aquest impost varis com a pagat?
ConfirmPayVAT=Esteu segur que voleu classificar aquesta declaració d'IVA com a pagada? ConfirmPayVAT=Esteu segur que voleu marcar aquesta declaració d'IVA com a pagada?
ConfirmPaySalary=Esteu segur que voleu classificar aquesta targeta salarial com a pagada? ConfirmPaySalary=Esteu segur que voleu marcar aquesta fitxa salarial com a pagada?
DeleteSocialContribution=Elimina un pagament d'impost varis DeleteSocialContribution=Elimina un pagament d'impost varis
DeleteVAT=Suprimeix una declaració d’IVA DeleteVAT=Suprimeix una declaració d’IVA
DeleteSalary=Elimina una fitxa salarial DeleteSalary=Elimina una fitxa salarial
@ -236,7 +236,7 @@ Pcg_subtype=Subtipus de compte
InvoiceLinesToDispatch=Línies de factures a desglossar InvoiceLinesToDispatch=Línies de factures a desglossar
ByProductsAndServices=Per producte i servei ByProductsAndServices=Per producte i servei
RefExt=Ref. externa RefExt=Ref. externa
ToCreateAPredefinedInvoice=Per a crear una plantilla de factura, creeu una factura estàndard, després, sense validar-la, feu clic al botó "%s". ToCreateAPredefinedInvoice=Per a crear una plantilla de factura, creeu una factura estàndard, després, sense validar-la, feu clic al botó «%s».
LinkedOrder=Enllaçar a una comanda LinkedOrder=Enllaçar a una comanda
Mode1=Mètode 1 Mode1=Mètode 1
Mode2=Mètode 2 Mode2=Mètode 2
@ -252,7 +252,7 @@ ACCOUNTING_VAT_PAY_ACCOUNT=Compte (del pla comptable) que s'utilitzarà com a co
ACCOUNTING_ACCOUNT_CUSTOMER=Compte (del pla comptable) utilitzat per a tercers «clients». ACCOUNTING_ACCOUNT_CUSTOMER=Compte (del pla comptable) utilitzat per a tercers «clients».
ACCOUNTING_ACCOUNT_CUSTOMER_Desc=El compte comptable dedicat definit a la fitxa de tercer només s’utilitzarà per a la comptabilitat auxiliar. Aquest s'utilitzarà per al llibre major i com a valor per defecte de la comptabilitat auxiliar si no es defineix un compte comptable de client dedicat a tercers. ACCOUNTING_ACCOUNT_CUSTOMER_Desc=El compte comptable dedicat definit a la fitxa de tercer només s’utilitzarà per a la comptabilitat auxiliar. Aquest s'utilitzarà per al llibre major i com a valor per defecte de la comptabilitat auxiliar si no es defineix un compte comptable de client dedicat a tercers.
ACCOUNTING_ACCOUNT_SUPPLIER=Compte (del pla comptable) utilitzat per a tercers «proveïdors». ACCOUNTING_ACCOUNT_SUPPLIER=Compte (del pla comptable) utilitzat per a tercers «proveïdors».
ACCOUNTING_ACCOUNT_SUPPLIER_Desc=El compte comptable dedicat definit a la fitxa de tercers només s'utilitzarà per al Llibre Major. Aquest serà utilitzat pel Llibre Major i com a valor predeterminat del subcompte si no es defineix un compte comptable a la fitxa del tercer. ACCOUNTING_ACCOUNT_SUPPLIER_Desc=El compte comptable dedicat definit a la fitxa de tercers s'utilitzarà només per a la comptabilitat de subllibre. Aquest s'utilitzarà per al Llibre Major i com a valor predeterminat de la comptabilitat del subllibre si no es defineix un compte comptable de proveïdor dedicat a tercers.
ConfirmCloneTax=Confirma el clonat d'un impost social / fiscal ConfirmCloneTax=Confirma el clonat d'un impost social / fiscal
ConfirmCloneVAT=Confirma la còpia d’una declaració d’IVA ConfirmCloneVAT=Confirma la còpia d’una declaració d’IVA
ConfirmCloneSalary=Confirmeu el clon d'un salari ConfirmCloneSalary=Confirmeu el clon d'un salari

View File

@ -57,12 +57,12 @@ LastContracts=Últims %s contractes
LastModifiedServices=Últims %s serveis modificats LastModifiedServices=Últims %s serveis modificats
ContractStartDate=Data inici ContractStartDate=Data inici
ContractEndDate=Data finalització ContractEndDate=Data finalització
DateStartPlanned=Data prevista posada en servei DateStartPlanned=Data d'inici prevista
DateStartPlannedShort=Data inici prevista DateStartPlannedShort=Data d'inici prevista
DateEndPlanned=Data prevista finalització del servei DateEndPlanned=Data prevista finalització del servei
DateEndPlannedShort=Data final prevista DateEndPlannedShort=Data final prevista
DateStartReal=Data real posada en servei DateStartReal=Data d'inici real
DateStartRealShort=Data inici DateStartRealShort=Data d'inici real
DateEndReal=Data real finalització del servei DateEndReal=Data real finalització del servei
DateEndRealShort=Data real finalització DateEndRealShort=Data real finalització
CloseService=Finalitzar servei CloseService=Finalitzar servei
@ -89,7 +89,7 @@ ListOfServicesToExpire=Llistat de serveis actius a expirar
NoteListOfYourExpiredServices=Aquest llistat només conté els serveis de contractes de tercers que tens enllaçats com a agent comercial NoteListOfYourExpiredServices=Aquest llistat només conté els serveis de contractes de tercers que tens enllaçats com a agent comercial
StandardContractsTemplate=Plantilla de contracte Standard StandardContractsTemplate=Plantilla de contracte Standard
ContactNameAndSignature=Per %s, nom i signatura: ContactNameAndSignature=Per %s, nom i signatura:
OnlyLinesWithTypeServiceAreUsed=Només les línies amb tipus "Servei" seran clonades. OnlyLinesWithTypeServiceAreUsed=Només es clonaran les línies amb el tipus «Servei».
ConfirmCloneContract=Esteu segur que voleu clonar el contracte <b> %s </b>? ConfirmCloneContract=Esteu segur que voleu clonar el contracte <b> %s </b>?
LowerDateEndPlannedShort=Baixa data de finalització planificada dels serveis actius LowerDateEndPlannedShort=Baixa data de finalització planificada dels serveis actius
SendContractRef=Informació del contracte __REF__ SendContractRef=Informació del contracte __REF__

View File

@ -64,7 +64,7 @@ CronTaskInactive=Aquest treball està desactivat (no programat)
CronId=Id CronId=Id
CronClassFile=Filename with class CronClassFile=Filename with class
CronModuleHelp=Nom del directori del mòdul de Dolibarr (també funciona amb mòduls externs). <BR> Per exemple, per cridar al mètode "fetch" de l'objecte Producte de Dolibarr /htdocs/<u>product</u>/class/product.class.php, el valor pel mòdul és <br><i>product</i> CronModuleHelp=Nom del directori del mòdul de Dolibarr (també funciona amb mòduls externs). <BR> Per exemple, per cridar al mètode "fetch" de l'objecte Producte de Dolibarr /htdocs/<u>product</u>/class/product.class.php, el valor pel mòdul és <br><i>product</i>
CronClassFileHelp=La ruta relativa i el nom del fitxer a carregar (la ruta és relativa al directori arrel del servidor web). <BR> Per exemple, per cridar al mètode "fetch" de l'objecte Producte de Dolibarr /htdocs/product/class/<u>product.class.php</u>, el valor del nom del fitxer de classe és<br> <i>product/class/product.class.php</i> CronClassFileHelp=El camí relatiu i el nom del fitxer a carregar (el camí és relatiu al directori arrel del servidor web). <BR> Per exemple, per a cridar al mètode fetch de l'objecte Producte de Dolibarr htdocs/product/class/<u>product.class.php</u>, el valor del nom del fitxer de classe és <br><i>product/class/product.class.php</i>
CronObjectHelp=El nom de l'objecte a carregar. <BR> Per exemple, per cridar al mètode "fetch" de l'objecte Producte de Dolibarr /htdocs/product/class/product.class.php, el valor pel nom del fitxer de classe és<br> <i>Product</i> CronObjectHelp=El nom de l'objecte a carregar. <BR> Per exemple, per cridar al mètode "fetch" de l'objecte Producte de Dolibarr /htdocs/product/class/product.class.php, el valor pel nom del fitxer de classe és<br> <i>Product</i>
CronMethodHelp=El mètode d'objecte a cridar. <BR> Per exemple, per cridar al mètode "fetch" de l'objecte Producte de Dolibarr /htdocs/product/class/product.class.php, el valor pel mètode és<br> <i>fetch</i> CronMethodHelp=El mètode d'objecte a cridar. <BR> Per exemple, per cridar al mètode "fetch" de l'objecte Producte de Dolibarr /htdocs/product/class/product.class.php, el valor pel mètode és<br> <i>fetch</i>
CronArgsHelp=Els arguments del mètode. <BR> Per exemple, cridar al mètode "fetch" de l'objecte Producte de Dolibarr /htdocs/product/class/product.class.php, el valor dels paràmetres pot ser <br> <i>0, ProductRef</i> CronArgsHelp=Els arguments del mètode. <BR> Per exemple, cridar al mètode "fetch" de l'objecte Producte de Dolibarr /htdocs/product/class/product.class.php, el valor dels paràmetres pot ser <br> <i>0, ProductRef</i>

View File

@ -5,7 +5,7 @@ ECMSectionManual=Carpeta manual
ECMSectionAuto=Carpeta automàtica ECMSectionAuto=Carpeta automàtica
ECMSectionsManual=Arbre manual ECMSectionsManual=Arbre manual
ECMSectionsAuto=Arbre automàtic ECMSectionsAuto=Arbre automàtic
ECMSectionsMedias=Medias tree ECMSectionsMedias=Arbre dels multimèdia
ECMSections=Carpetes ECMSections=Carpetes
ECMRoot=Arrel del ECM ECMRoot=Arrel del ECM
ECMNewSection=Carpeta nova ECMNewSection=Carpeta nova
@ -17,9 +17,9 @@ ECMNbOfFilesInSubDir=Nombre d'arxius en les subcarpetes
ECMCreationUser=Creador ECMCreationUser=Creador
ECMArea=Àrea SGD/GCE ECMArea=Àrea SGD/GCE
ECMAreaDesc=L’àrea SGD/GED (Sistema de Gestió de Documents / Gestió de Continguts Electrònics) us permet desar, compartir i cercar ràpidament tota mena de documents a Dolibarr. ECMAreaDesc=L’àrea SGD/GED (Sistema de Gestió de Documents / Gestió de Continguts Electrònics) us permet desar, compartir i cercar ràpidament tota mena de documents a Dolibarr.
ECMAreaDesc2a=* Manual directories can be used to save documents not linked to a particular element. ECMAreaDesc2a=* Els directoris manuals es poden utilitzar per a desar documents no vinculats a un element concret.
ECMAreaDesc2b=* Automatic directories are filled automatically when adding documents from the page of an element. ECMAreaDesc2b=* Els directoris automàtics s'omplen automàticament quan s'afegeixen documents des de la pàgina d'un element.
ECMAreaDesc3=* Medias directories are files into the subdirectory <b>/medias</b> of documents directory, readable by everybody with no need to be logged and no need to have the file shared explicitely. It is used to store image files from emailing or website module. ECMAreaDesc3=* Els directoris de multimèdia són fitxers del subdirectori <b>/medias</b> del directori de documents, llegibles per a tothom sense necessitat de registrar-se i sense necessitat de compartir el fitxer de manera explícita. S'utilitza per a emmagatzemar fitxers d'imatge per al mòdul de correu electrònic o lloc web, per exemple.
ECMSectionWasRemoved=La carpeta <b>%s</b> ha estat eliminada ECMSectionWasRemoved=La carpeta <b>%s</b> ha estat eliminada
ECMSectionWasCreated=S'ha creat el directori <b>%s</b>. ECMSectionWasCreated=S'ha creat el directori <b>%s</b>.
ECMSearchByKeywords=Cercar per paraules clau ECMSearchByKeywords=Cercar per paraules clau

View File

@ -15,10 +15,10 @@ ErrorGroupAlreadyExists=El grup %s ja existeix.
ErrorEmailAlreadyExists=El correu electrònic %s ja existeix. ErrorEmailAlreadyExists=El correu electrònic %s ja existeix.
ErrorRecordNotFound=Registre no trobat ErrorRecordNotFound=Registre no trobat
ErrorRecordNotFoundShort=No trobat ErrorRecordNotFoundShort=No trobat
ErrorFailToCopyFile=No s'ha pogut copiar el fitxer "<b> %s </b>" a "<b> %s </b>". ErrorFailToCopyFile=No s'ha pogut copiar el fitxer «<b>%s</b>» a «<b>%s</b>».
ErrorFailToCopyDir=No s'ha pogut copiar el directori '<b> %s </b>' a '<b> %s </b>'. ErrorFailToCopyDir=No s'ha pogut copiar el directori '<b> %s </b>' a '<b> %s </b>'.
ErrorFailToRenameFile=Error al renomenar l'arxiu '<b>%s</b>' a '<b>%s</b>'. ErrorFailToRenameFile=Error al renomenar l'arxiu '<b>%s</b>' a '<b>%s</b>'.
ErrorFailToDeleteFile=No s'ha pogut eliminar el fitxer "<b> %s </b>". ErrorFailToDeleteFile=No s'ha pogut eliminar el fitxer «<b>%s</b>».
ErrorFailToCreateFile=Error al crear l'arxiu '<b>%s</b>' ErrorFailToCreateFile=Error al crear l'arxiu '<b>%s</b>'
ErrorFailToRenameDir=Error al renomenar la carpeta '<b>%s</b>' a '<b>%s</b>'. ErrorFailToRenameDir=Error al renomenar la carpeta '<b>%s</b>' a '<b>%s</b>'.
ErrorFailToCreateDir=Error al crear la carpeta '<b>%s</b>' ErrorFailToCreateDir=Error al crear la carpeta '<b>%s</b>'
@ -60,8 +60,8 @@ ErrorSetupOfEmailsNotComplete=La configuració dels correus electrònics no s'ha
ErrorFeatureNeedJavascript=Aquesta funcionalitat requereix javascript actiu per funcionar. Modifiqueu en configuració->entorn. ErrorFeatureNeedJavascript=Aquesta funcionalitat requereix javascript actiu per funcionar. Modifiqueu en configuració->entorn.
ErrorTopMenuMustHaveAParentWithId0=Un menú del tipus 'Superior' no pot tenir un menú pare. Poseu 0 al menú pare o trieu un menú del tipus 'Esquerra'. ErrorTopMenuMustHaveAParentWithId0=Un menú del tipus 'Superior' no pot tenir un menú pare. Poseu 0 al menú pare o trieu un menú del tipus 'Esquerra'.
ErrorLeftMenuMustHaveAParentId=Un menú del tipus 'Esquerra' ha de tenir un ID de pare ErrorLeftMenuMustHaveAParentId=Un menú del tipus 'Esquerra' ha de tenir un ID de pare
ErrorFileNotFound=Arxiu no trobat (ruta incorrecta, permisos incorrectes o accés prohibit pel paràmetre openbasedir) ErrorFileNotFound=No s'ha trobat el fitxer <b>%s</b> (camí incorrecte, permisos incorrectes o accés denegat pel paràmetre PHP openbasedir o safe_mode)
ErrorDirNotFound=Directori <b>%s</b> no trobat (Ruta incorrecta, permisos inadequats o accés prohibit pel paràmetre PHP openbasedir o safe_mode) ErrorDirNotFound=No s'ha trobat el directori <b>%s</b> (camí incorrecte, permisos incorrectes o accés denegat pel paràmetre PHP openbasedir o safe_mode)
ErrorFunctionNotAvailableInPHP=La funció <b>%s</b> és requerida per aquesta característica, però no es troba disponible en aquesta versió/instal·lació de PHP. ErrorFunctionNotAvailableInPHP=La funció <b>%s</b> és requerida per aquesta característica, però no es troba disponible en aquesta versió/instal·lació de PHP.
ErrorDirAlreadyExists=Ja existeix una carpeta amb aquest nom. ErrorDirAlreadyExists=Ja existeix una carpeta amb aquest nom.
ErrorFileAlreadyExists=Ja existeix un fitxer amb aquest nom. ErrorFileAlreadyExists=Ja existeix un fitxer amb aquest nom.
@ -84,7 +84,7 @@ ErrorNoAccountancyModuleLoaded=Mòdul de comptabilitat no activat
ErrorExportDuplicateProfil=El nom d'aquest perfil ja existeix per aquest conjunt d'exportació ErrorExportDuplicateProfil=El nom d'aquest perfil ja existeix per aquest conjunt d'exportació
ErrorLDAPSetupNotComplete=La configuració Dolibarr-LDAP és incompleta. ErrorLDAPSetupNotComplete=La configuració Dolibarr-LDAP és incompleta.
ErrorLDAPMakeManualTest=S'ha generat un fitxer .ldif al directori %s. Proveu de carregar-lo manualment des de la línia d'ordres per a obtenir més informació sobre els errors. ErrorLDAPMakeManualTest=S'ha generat un fitxer .ldif al directori %s. Proveu de carregar-lo manualment des de la línia d'ordres per a obtenir més informació sobre els errors.
ErrorCantSaveADoneUserWithZeroPercentage=No es pot desar una acció amb "estat no iniciat" si el camp "fet per" també s'omple. ErrorCantSaveADoneUserWithZeroPercentage=No es pot desar una acció amb «estat no iniciat» si també s'omple el camp «fet per».
ErrorRefAlreadyExists=La referència <b> %s </b> ja existeix. ErrorRefAlreadyExists=La referència <b> %s </b> ja existeix.
ErrorPleaseTypeBankTransactionReportName=Introduïu el nom de l’extracte bancari on s’ha d’informar de l’entrada (format AAAAAMM o AAAAAMMDD) ErrorPleaseTypeBankTransactionReportName=Introduïu el nom de l’extracte bancari on s’ha d’informar de l’entrada (format AAAAAMM o AAAAAMMDD)
ErrorRecordHasChildren=No s'ha pogut eliminar el registre, ja que té alguns registres fills. ErrorRecordHasChildren=No s'ha pogut eliminar el registre, ja que té alguns registres fills.
@ -97,7 +97,7 @@ ErrorWrongValueForField=Camp <b> %s </b>: '<b> %s </b>' no coincideix amb la reg
ErrorHtmlInjectionForField=Camp <b> %s </b> : el valor ' <b> %s </b> no conté dades malicioses ' ErrorHtmlInjectionForField=Camp <b> %s </b> : el valor ' <b> %s </b> no conté dades malicioses '
ErrorFieldValueNotIn=Camp <b> %s </b>: '<b> %s </b>' no és un valor trobat en el camp <b> %s </b> de <b> %s </b> ErrorFieldValueNotIn=Camp <b> %s </b>: '<b> %s </b>' no és un valor trobat en el camp <b> %s </b> de <b> %s </b>
ErrorFieldRefNotIn=Camp <b> %s </b>: '<b> %s </b>' no és un <b> %s </b> ref actual ErrorFieldRefNotIn=Camp <b> %s </b>: '<b> %s </b>' no és un <b> %s </b> ref actual
ErrorMultipleRecordFoundFromRef=Several record found when searching from ref <b>%s</b>. No way to know which ID to use. ErrorMultipleRecordFoundFromRef=S'han trobat diversos registres en cercar des de la referència<b>%s</b>. No hi ha manera de saber quina identificació utilitzar.
ErrorsOnXLines=S'han trobat %s errors ErrorsOnXLines=S'han trobat %s errors
ErrorFileIsInfectedWithAVirus=L'antivirus no ha pogut validar aquest arxiu (és probable que estigui infectat per un virus)! ErrorFileIsInfectedWithAVirus=L'antivirus no ha pogut validar aquest arxiu (és probable que estigui infectat per un virus)!
ErrorNumRefModel=Hi ha una referència a la base de dades (%s) i no és compatible amb aquesta regla de numeració. Elimineu el registre o canvieu el nom de referència per a activar aquest mòdul. ErrorNumRefModel=Hi ha una referència a la base de dades (%s) i no és compatible amb aquesta regla de numeració. Elimineu el registre o canvieu el nom de referència per a activar aquest mòdul.
@ -125,7 +125,7 @@ ErrorCantReadFile=Error de lectura del fitxer '%s'
ErrorCantReadDir=Error de lectura de la carpeta '%s' ErrorCantReadDir=Error de lectura de la carpeta '%s'
ErrorBadLoginPassword=Identificadors d'usuari o contrasenya incorrectes ErrorBadLoginPassword=Identificadors d'usuari o contrasenya incorrectes
ErrorLoginDisabled=El seu compte està desactivat ErrorLoginDisabled=El seu compte està desactivat
ErrorFailedToRunExternalCommand=No s'ha pogut executar l'ordre extern. Comproveu que estigui disponible i executable pel vostre usuari del servidor PHP. Comproveu que l'ordre no estigui protegida a nivell d'intèrpret d'ordres per una capa de seguretat com apparmor. ErrorFailedToRunExternalCommand=No s'ha pogut executar l'ordre extern. Comproveu que estigui disponible i que l'executi el vostre usuari del servidor PHP. Comproveu també que l'ordre no estigui protegida en l'àmbit d'intèrpret d'ordres per una capa de seguretat com apparmor.
ErrorFailedToChangePassword=Error en la modificació de la contrasenya ErrorFailedToChangePassword=Error en la modificació de la contrasenya
ErrorLoginDoesNotExists=El compte d'usuari de <b>%s</b> no s'ha trobat. ErrorLoginDoesNotExists=El compte d'usuari de <b>%s</b> no s'ha trobat.
ErrorLoginHasNoEmail=Aquest usuari no té e-mail. Impossible continuar. ErrorLoginHasNoEmail=Aquest usuari no té e-mail. Impossible continuar.
@ -136,7 +136,7 @@ ErrorLinesCantBeNegativeForOneVATRate=El total de línies (net d’impostos) no
ErrorLinesCantBeNegativeOnDeposits=Les línies no poden ser negatives en un dipòsit. Si ho feu, podreu tenir problemes quan necessiteu consumir el dipòsit a la factura final ErrorLinesCantBeNegativeOnDeposits=Les línies no poden ser negatives en un dipòsit. Si ho feu, podreu tenir problemes quan necessiteu consumir el dipòsit a la factura final
ErrorQtyForCustomerInvoiceCantBeNegative=La quantitat a les línies de factures a client no poden ser negatives ErrorQtyForCustomerInvoiceCantBeNegative=La quantitat a les línies de factures a client no poden ser negatives
ErrorWebServerUserHasNotPermission=El compte d'execució del servidor web <b>%s</b> no disposa dels permisos per això ErrorWebServerUserHasNotPermission=El compte d'execució del servidor web <b>%s</b> no disposa dels permisos per això
ErrorNoActivatedBarcode=No hi ha activat cap tipus de codi de barres ErrorNoActivatedBarcode=No s'ha activat cap mena de codi de barres
ErrUnzipFails=No s'ha pogut descomprimir el fitxer %s amb ZipArchive ErrUnzipFails=No s'ha pogut descomprimir el fitxer %s amb ZipArchive
ErrNoZipEngine=No engine to zip/unzip %s file in this PHP ErrNoZipEngine=No engine to zip/unzip %s file in this PHP
ErrorFileMustBeADolibarrPackage=El fitxer %s ha de ser un paquet Dolibarr en format zip ErrorFileMustBeADolibarrPackage=El fitxer %s ha de ser un paquet Dolibarr en format zip
@ -244,7 +244,7 @@ ErrorObjectMustHaveStatusActiveToBeDisabled=Per a desactivar els objectes, han d
ErrorObjectMustHaveStatusDraftOrDisabledToBeActivated=Per ser activats, els objectes han de tenir l'estat "Esborrany" o "Desactivat" ErrorObjectMustHaveStatusDraftOrDisabledToBeActivated=Per ser activats, els objectes han de tenir l'estat "Esborrany" o "Desactivat"
ErrorNoFieldWithAttributeShowoncombobox=Cap camp té la propietat "showoncombobox" en la definició de l'objecte "%s". No es pot mostrar el llistat desplegable. ErrorNoFieldWithAttributeShowoncombobox=Cap camp té la propietat "showoncombobox" en la definició de l'objecte "%s". No es pot mostrar el llistat desplegable.
ErrorFieldRequiredForProduct=El camp "%s" és obligatori per al producte %s ErrorFieldRequiredForProduct=El camp "%s" és obligatori per al producte %s
AlreadyTooMuchPostOnThisIPAdress=You have already posted too much on this IP address. AlreadyTooMuchPostOnThisIPAdress=Ja heu publicat massa en aquesta adreça IP.
ProblemIsInSetupOfTerminal=El problema està en la configuració del terminal %s. ProblemIsInSetupOfTerminal=El problema està en la configuració del terminal %s.
ErrorAddAtLeastOneLineFirst=Afegeix almenys una primera línia ErrorAddAtLeastOneLineFirst=Afegeix almenys una primera línia
ErrorRecordAlreadyInAccountingDeletionNotPossible=Error, el registre ja s’ha transferit a la comptabilitat, no es pot eliminar. ErrorRecordAlreadyInAccountingDeletionNotPossible=Error, el registre ja s’ha transferit a la comptabilitat, no es pot eliminar.
@ -262,6 +262,7 @@ ErrorParameterMustBeEnabledToAllwoThisFeature=Error, el paràmetre <b> %s </b> s
ErrorLoginDateValidity=Error, aquest inici de sessió està fora de l'interval de dates de validesa ErrorLoginDateValidity=Error, aquest inici de sessió està fora de l'interval de dates de validesa
ErrorValueLength=La longitud del camp '<b> %s </b>' ha de ser superior a '<b> %s </b>' ErrorValueLength=La longitud del camp '<b> %s </b>' ha de ser superior a '<b> %s </b>'
ErrorReservedKeyword=La paraula '<b> %s </b>' és una paraula clau reservada ErrorReservedKeyword=La paraula '<b> %s </b>' és una paraula clau reservada
ErrorFilenameReserved=El nom de fitxer <b>%s</b> no es pot utilitzar perquè és una ordre reservada i protegida.
ErrorNotAvailableWithThisDistribution=No disponible amb aquesta distribució ErrorNotAvailableWithThisDistribution=No disponible amb aquesta distribució
ErrorPublicInterfaceNotEnabled=La interfície pública no s'ha activat ErrorPublicInterfaceNotEnabled=La interfície pública no s'ha activat
ErrorLanguageRequiredIfPageIsTranslationOfAnother=Cal definir l'idioma de la pàgina nova si es defineix com a traducció d'una altra pàgina ErrorLanguageRequiredIfPageIsTranslationOfAnother=Cal definir l'idioma de la pàgina nova si es defineix com a traducció d'una altra pàgina
@ -280,8 +281,8 @@ ErrorWrongFileName=El nom del fitxer no pot contenir __COSA__
ErrorNotInDictionaryPaymentConditions=No es troba al Diccionari de condicions de pagament, modifiqueu-lo. ErrorNotInDictionaryPaymentConditions=No es troba al Diccionari de condicions de pagament, modifiqueu-lo.
ErrorIsNotADraft=%s no és un esborrany ErrorIsNotADraft=%s no és un esborrany
ErrorExecIdFailed=No es pot executar l'ordre "id" ErrorExecIdFailed=No es pot executar l'ordre "id"
ErrorBadCharIntoLoginName=Unauthorized character in the field %s ErrorBadCharIntoLoginName=Caràcter no autoritzat al camp %s
ErrorRequestTooLarge=Error, request too large or session expired ErrorRequestTooLarge=Error, sol·licitud massa gran o sessió caducada
ErrorNotApproverForHoliday=No sou l'autor de l'abandonament %s ErrorNotApproverForHoliday=No sou l'autor de l'abandonament %s
ErrorAttributeIsUsedIntoProduct=Aquest atribut s'utilitza en una o més variants de producte ErrorAttributeIsUsedIntoProduct=Aquest atribut s'utilitza en una o més variants de producte
ErrorAttributeValueIsUsedIntoProduct=Aquest valor d'atribut s'utilitza en una o més variants de producte ErrorAttributeValueIsUsedIntoProduct=Aquest valor d'atribut s'utilitza en una o més variants de producte
@ -298,17 +299,17 @@ ErrorFailedToLoadThirdParty=No s'ha pogut trobar/carregar un tercer des d'id=%s,
ErrorThisPaymentModeIsNotSepa=Aquest mode de pagament no és un compte bancari ErrorThisPaymentModeIsNotSepa=Aquest mode de pagament no és un compte bancari
ErrorStripeCustomerNotFoundCreateFirst=El client de Stripe no està configurat per a aquest tercer (o s'ha establert un valor suprimit al costat de Stripe). Creeu-lo (o torneu-lo a adjuntar) primer. ErrorStripeCustomerNotFoundCreateFirst=El client de Stripe no està configurat per a aquest tercer (o s'ha establert un valor suprimit al costat de Stripe). Creeu-lo (o torneu-lo a adjuntar) primer.
ErrorCharPlusNotSupportedByImapForSearch=La cerca IMAP no pot cercar al remitent o al destinatari una cadena que contingui el caràcter + ErrorCharPlusNotSupportedByImapForSearch=La cerca IMAP no pot cercar al remitent o al destinatari una cadena que contingui el caràcter +
ErrorTableNotFound=Table <b>%s</b> not found ErrorTableNotFound=No s'ha trobat la taula <b>%s</b>
ErrorValueForTooLow=Value for <b>%s</b> is too low ErrorValueForTooLow=El valor de <b>%s</b> és massa baix
ErrorValueCantBeNull=Value for <b>%s</b> can't be null ErrorValueCantBeNull=El valor de <b>%s</b> no pot ser nul
ErrorDateOfMovementLowerThanDateOfFileTransmission=The date of the bank transaction can't be lower than the date of the file transmission ErrorDateOfMovementLowerThanDateOfFileTransmission=La data de la transacció bancària no pot ser inferior a la data de transmissió del fitxer
ErrorTooMuchFileInForm=Too much files in form, the maximum number is %s file(s) ErrorTooMuchFileInForm=Hi ha massa fitxers en el formulari, el nombre màxim és de %s fitxers
ErrorSessionInvalidatedAfterPasswordChange=The session was been invalidated following a change of password, status or dates of validity. Please relogin. ErrorSessionInvalidatedAfterPasswordChange=La sessió s'ha invalidat després d'un canvi de contrasenya, estat o dates de validesa. Si us plau, torneu a iniciar sessió.
ErrorExistingPermission = Permission <b>%s</b> for object <b>%s</b> already exists ErrorExistingPermission = Ja existeix el permís <b>%s</b> per a l'objecte <b>%s</b>
ErrorFieldExist=The value for <b>%s</b> already exist ErrorFieldExist=El valor de <b>%s</b> ja existeix
ErrorEqualModule=Module invalid in <b>%s</b> ErrorEqualModule=El mòdul no és vàlid a <b>%s</b>
ErrorFieldValue=Value for <b>%s</b> is incorrect ErrorFieldValue=El valor de <b>%s</b> és incorrecte
ErrorCoherenceMenu=<b>%s</b> is required when <b>%</b> equal LEFT ErrorCoherenceMenu= <b>%s</b> és necessari quan <b>%s</b> és «left»
# Warnings # Warnings
WarningParamUploadMaxFileSizeHigherThanPostMaxSize=El paràmetre PHP upload_max_filesize (%s) és superior al paràmetre PHP post_max_size (%s). No es tracta d’una configuració consistent. WarningParamUploadMaxFileSizeHigherThanPostMaxSize=El paràmetre PHP upload_max_filesize (%s) és superior al paràmetre PHP post_max_size (%s). No es tracta d’una configuració consistent.
@ -346,8 +347,8 @@ WarningModuleXDisabledSoYouMayMissEventHere=El mòdul %s no s'ha habilitat. Per
WarningPaypalPaymentNotCompatibleWithStrict=El valor "Estricte" fa que les funcions de pagament en línia no funcionin correctament. Utilitzeu "Lax". WarningPaypalPaymentNotCompatibleWithStrict=El valor "Estricte" fa que les funcions de pagament en línia no funcionin correctament. Utilitzeu "Lax".
WarningThemeForcedTo=Avís, el tema s'ha forçat a <b> %s </b> per la constant oculta MAIN_FORCETHEME WarningThemeForcedTo=Avís, el tema s'ha forçat a <b> %s </b> per la constant oculta MAIN_FORCETHEME
WarningPagesWillBeDeleted=Advertència, això també suprimirà totes les pàgines/contenidors existents del lloc web. Hauríeu d'exportar el vostre lloc web abans, de manera que tingueu una còpia de seguretat per tornar-lo a importar més tard. WarningPagesWillBeDeleted=Advertència, això també suprimirà totes les pàgines/contenidors existents del lloc web. Hauríeu d'exportar el vostre lloc web abans, de manera que tingueu una còpia de seguretat per tornar-lo a importar més tard.
WarningAutoValNotPossibleWhenStockIsDecreasedOnInvoiceVal=Automatic validation is disabled when option to decrease stock is set on "Invoice validation". WarningAutoValNotPossibleWhenStockIsDecreasedOnInvoiceVal=La validació automàtica es desactiva quan l'opció de disminució d'estoc s'estableix a "Validació de la factura".
WarningModuleNeedRefrech = Module <b>%s</b> has been disabled. Don't forget to enable it WarningModuleNeedRefrech = El mòdul <b>%s</b> s'ha desactivat. No oblideu activar-lo
# Validate # Validate
RequireValidValue = El valor no és vàlid RequireValidValue = El valor no és vàlid

View File

@ -3,10 +3,10 @@ CommunitySupport=Assistència Forums i Wiki
EMailSupport=Assistència E-Mail EMailSupport=Assistència E-Mail
RemoteControlSupport=Suport en línia en temps real / remot RemoteControlSupport=Suport en línia en temps real / remot
OtherSupport=Altres tipus d'assistència OtherSupport=Altres tipus d'assistència
ToSeeListOfAvailableRessources=Per contactar/veure els recursos disponibles: ToSeeListOfAvailableRessources=Per a contactar/veure els recursos disponibles:
HelpCenter=Centre d'ajuda HelpCenter=Centre d'ajuda
DolibarrHelpCenter=Centre d'Ajuda i Suport de Dolibarr DolibarrHelpCenter=Centre d'Ajuda i Suport de Dolibarr
ToGoBackToDolibarr=En cas contrari, <a href="%s"> fes clic aquí per continuar utilitzant Dolibarr </a>. ToGoBackToDolibarr=En cas contrari, <a href="%s">feu clic aquí per a continuar utilitzant Dolibarr</a>.
TypeOfSupport=Tipus de suport TypeOfSupport=Tipus de suport
TypeSupportCommunauty=Comunitari (gratuït) TypeSupportCommunauty=Comunitari (gratuït)
TypeSupportCommercial=Comercial TypeSupportCommercial=Comercial
@ -20,4 +20,4 @@ BackToHelpCenter=En cas contrari, <a href="%s"> torna a la pàgina d'inici del C
LinkToGoldMember=Pots trucar a un dels formadors preseleccionats per Dolibarr pel teu idioma (%s) fent clic al seu Panell (l'estat i el preu màxim s'actualitzen automàticament): LinkToGoldMember=Pots trucar a un dels formadors preseleccionats per Dolibarr pel teu idioma (%s) fent clic al seu Panell (l'estat i el preu màxim s'actualitzen automàticament):
PossibleLanguages=Idiomes disponibles PossibleLanguages=Idiomes disponibles
SubscribeToFoundation=Ajuda al projecte Dolibarr, adhereix-te a l'associació SubscribeToFoundation=Ajuda al projecte Dolibarr, adhereix-te a l'associació
SeeOfficalSupport=Per a obtenir suport oficial de Dolibarr en el vostre idioma: <br> <b> <a href="%s" target="_blank" rel="noopener noreferrer"> %s </a> </b> SeeOfficalSupport=Per a obtenir suport oficial de Dolibarr en el vostre idioma: <br><b><a href="%s" target="_blank" rel="noopener noreferrer">%s</a></b>

View File

@ -8,7 +8,7 @@ MenuAddCP=Sol·licitud nova de dia lliure
MenuCollectiveAddCP=Nova sol·licitud de festiu col·lectiu MenuCollectiveAddCP=Nova sol·licitud de festiu col·lectiu
NotActiveModCP=Heu d'habilitar el mòdul Dies lliures per a veure aquesta pàgina. NotActiveModCP=Heu d'habilitar el mòdul Dies lliures per a veure aquesta pàgina.
AddCP=Feu una sol·licitud de dia lliure AddCP=Feu una sol·licitud de dia lliure
DateDebCP=Data inici DateDebCP=Data d'inici
DateFinCP=Data fi DateFinCP=Data fi
DraftCP=Esborrany DraftCP=Esborrany
ToReviewCP=A l'espera d'aprovació ToReviewCP=A l'espera d'aprovació
@ -85,7 +85,7 @@ AddEventToUserOkCP=S'ha completat la incorporació del dia lliure excepcional.
ErrorFieldRequiredUserOrGroup=Cal omplir el camp "grup" o el camp "usuari". ErrorFieldRequiredUserOrGroup=Cal omplir el camp "grup" o el camp "usuari".
fusionGroupsUsers=El camp de grups i el camp d'usuari es fusionaran fusionGroupsUsers=El camp de grups i el camp d'usuari es fusionaran
MenuLogCP=Veure registre de canvis MenuLogCP=Veure registre de canvis
LogCP=Registre de totes les actualitzacions fetes a "Saldo de dies lliures" LogCP=Registre de totes les actualitzacions fetes a «Saldo de dies lliures»
ActionByCP=Actualitzat per ActionByCP=Actualitzat per
UserUpdateCP=Actualitzat per a UserUpdateCP=Actualitzat per a
PrevSoldeCP=Saldo anterior PrevSoldeCP=Saldo anterior
@ -107,7 +107,7 @@ HolidaysCancelation=Cancel·lació de la sol·licitud de dies lliures
EmployeeLastname=Cognoms de l'empleat EmployeeLastname=Cognoms de l'empleat
EmployeeFirstname=Nom de l'empleat EmployeeFirstname=Nom de l'empleat
TypeWasDisabledOrRemoved=El tipus de dia lliure (id %s) ha sigut desactivat o eliminat TypeWasDisabledOrRemoved=El tipus de dia lliure (id %s) ha sigut desactivat o eliminat
LastHolidays=Les darreres %s sol·licituds de permís LastHolidays=Últimes %s sol·licituds de dies lliures
AllHolidays=Totes les sol·licituds de permís AllHolidays=Totes les sol·licituds de permís
HalfDay=Mig dia HalfDay=Mig dia
NotTheAssignedApprover=No sou l'aprovador assignat NotTheAssignedApprover=No sou l'aprovador assignat
@ -129,13 +129,13 @@ HolidaysToValidateBody=A continuació es mostra una sol·licitud de permís per
HolidaysToValidateDelay=Aquesta sol·licitud de dies lliures retribuïts tindrà lloc en un termini de menys de %s dies. HolidaysToValidateDelay=Aquesta sol·licitud de dies lliures retribuïts tindrà lloc en un termini de menys de %s dies.
HolidaysToValidateAlertSolde=L'usuari que ha realitzat la sol·licitud de dies lliures retribuïts no disposa de suficients dies disponibles HolidaysToValidateAlertSolde=L'usuari que ha realitzat la sol·licitud de dies lliures retribuïts no disposa de suficients dies disponibles
HolidaysValidated=Sol·licituds de permís validats HolidaysValidated=Sol·licituds de permís validats
HolidaysValidatedBody=La seva sol·licitud de dies lliures retribuïts des de el %s al %s ha sigut validada. HolidaysValidatedBody=La vostra sol·licitud de dies lliures de %s a %s s'ha validat.
HolidaysRefused=Dies lliures retribuïts denegats HolidaysRefused=Dies lliures retribuïts denegats
HolidaysRefusedBody=La seva sol·licitud de dies lliures retribuïts des de el %s al %s ha sigut denegada per el següent motiu: HolidaysRefusedBody=La seva sol·licitud de dies lliures retribuïts des de el %s al %s ha sigut denegada per el següent motiu:
HolidaysCanceled=Dies lliures retribuïts cancel·lats HolidaysCanceled=Dies lliures retribuïts cancel·lats
HolidaysCanceledBody=S'ha cancel·lat la vostra sol·licitud de permís del %s al %s. HolidaysCanceledBody=S'ha cancel·lat la vostra sol·licitud de permís del %s al %s.
FollowedByACounter=1: Aquest tipus de dia lliure necessita el seguiment d'un comptador. El comptador s'incrementa manualment o automàticament i quan hi ha una petició de dia lliure validada, el comptador es decrementa.<br>0: No seguit per un comptador. FollowedByACounter=1: Aquest tipus de dia lliure necessita el seguiment d'un comptador. El comptador s'incrementa manualment o automàticament i quan hi ha una petició de dia lliure validada, el comptador es decrementa.<br>0: No seguit per un comptador.
NoLeaveWithCounterDefined=No hi ha cap tipus de dia lliure definit que hagi de seguir un comptador NoLeaveWithCounterDefined=No hi ha cap mena de dia lliure definit que hagi de ser seguit per un comptador
GoIntoDictionaryHolidayTypes=Aneu a <strong> Inici - Configuració - Diccionaris - Tipus de dies lliures </strong> per a configurar els diferents tipus de dies lliures. GoIntoDictionaryHolidayTypes=Aneu a <strong> Inici - Configuració - Diccionaris - Tipus de dies lliures </strong> per a configurar els diferents tipus de dies lliures.
HolidaySetup=Configuració del mòdul Dies de permís HolidaySetup=Configuració del mòdul Dies de permís
HolidaysNumberingModules=Models de numeració de sol·licituds de dies de permís HolidaysNumberingModules=Models de numeració de sol·licituds de dies de permís
@ -149,10 +149,10 @@ XIsAUsualNonWorkingDay=%s sol ser un dia NO laborable
BlockHolidayIfNegative=Bloqueja si el saldo és negatiu BlockHolidayIfNegative=Bloqueja si el saldo és negatiu
LeaveRequestCreationBlockedBecauseBalanceIsNegative=La creació d'aquesta sol·licitud de vacances està bloquejada perquè el vostre saldo és negatiu LeaveRequestCreationBlockedBecauseBalanceIsNegative=La creació d'aquesta sol·licitud de vacances està bloquejada perquè el vostre saldo és negatiu
ErrorLeaveRequestMustBeDraftCanceledOrRefusedToBeDeleted=La sol·licitud d'abandonament %s ha de ser esborrany, cancel·lada o rebutjada per eliminar-la ErrorLeaveRequestMustBeDraftCanceledOrRefusedToBeDeleted=La sol·licitud d'abandonament %s ha de ser esborrany, cancel·lada o rebutjada per eliminar-la
IncreaseHolidays=Increase leave balance IncreaseHolidays=Augmentar el saldo de dies lliures
HolidayRecordsIncreased= %s leave balances increased HolidayRecordsIncreased= %s saldos de dies lliures augmentats
HolidayRecordIncreased=Leave balance increased HolidayRecordIncreased=Saldo de dies lliures augmentat
ConfirmMassIncreaseHoliday=Bulk leave balance increase ConfirmMassIncreaseHoliday=Augment massiu del saldo de dies lliures
NumberDayAddMass=Number of day to add to the selection NumberDayAddMass=Nombre de dia per a afegir a la selecció
ConfirmMassIncreaseHolidayQuestion=Are you sure you want to increase holiday of the %s selected record(s)? ConfirmMassIncreaseHolidayQuestion=Esteu segur que voleu augmentar les vacances dels registres seleccionats %s?
HolidayQtyNotModified=El saldo dels dies restants per a %s no s'ha canviat HolidayQtyNotModified=El saldo dels dies restants per a %s no s'ha canviat

View File

@ -8,7 +8,7 @@ ConfFileIsNotWritable=L'arxiu de configuració <b>%s</b> no és modificable. Com
ConfFileIsWritable=L'arxiu <b>%s</b> és modificable. ConfFileIsWritable=L'arxiu <b>%s</b> és modificable.
ConfFileMustBeAFileNotADir=El fitxer de configuració <b> %s</b> ha de ser un fitxer, no un directori. ConfFileMustBeAFileNotADir=El fitxer de configuració <b> %s</b> ha de ser un fitxer, no un directori.
ConfFileReload=Actualització dels paràmetres del fitxer de configuració. ConfFileReload=Actualització dels paràmetres del fitxer de configuració.
NoReadableConfFileSoStartInstall=El fitxer de configuració <b> conf/conf.php </b> no existeix o no es pot llegir. Executarem el procés d'instal·lació per intentar inicialitzar-lo. NoReadableConfFileSoStartInstall=El fitxer de configuració <b>conf/conf.php</b> no existeix o no es pot llegir. Executarem el procés d'instal·lació per a intentar inicialitzar-lo.
PHPSupportPOSTGETOk=Aquest PHP suporta bé les variables POST i GET. PHPSupportPOSTGETOk=Aquest PHP suporta bé les variables POST i GET.
PHPSupportPOSTGETKo=És possible que aquest PHP no suport les variables POST i/o GET. Comproveu el paràmetre <b>variables_order</b> del php.ini. PHPSupportPOSTGETKo=És possible que aquest PHP no suport les variables POST i/o GET. Comproveu el paràmetre <b>variables_order</b> del php.ini.
PHPSupportSessions=Aquest PHP suporta sessions PHPSupportSessions=Aquest PHP suporta sessions
@ -82,7 +82,7 @@ GoToDolibarr=Aneu a Dolibarr
GoToSetupArea=Aneu a Dolibarr (àrea de configuració) GoToSetupArea=Aneu a Dolibarr (àrea de configuració)
MigrationNotFinished=La versió de la base de dades no està completament actualitzada: torneu a executar el procés d'actualització. MigrationNotFinished=La versió de la base de dades no està completament actualitzada: torneu a executar el procés d'actualització.
GoToUpgradePage=Aneu de nou a la pàgina d'actualització GoToUpgradePage=Aneu de nou a la pàgina d'actualització
WithNoSlashAtTheEnd=Sense el signe "/" al final WithNoSlashAtTheEnd=Sense la barra inclinada «/» al final
DirectoryRecommendation= <span class="warning"> IMPORTANT </span>: Heu d'utilitzar un directori que es troba fora de les pàgines web (no utilitzeu un subdirector del paràmetre anterior). DirectoryRecommendation= <span class="warning"> IMPORTANT </span>: Heu d'utilitzar un directori que es troba fora de les pàgines web (no utilitzeu un subdirector del paràmetre anterior).
LoginAlreadyExists=Ja existeix LoginAlreadyExists=Ja existeix
DolibarrAdminLogin=Nom d'usuari d’administrador de Dolibarr DolibarrAdminLogin=Nom d'usuari d’administrador de Dolibarr
@ -94,7 +94,7 @@ ChoosedMigrateScript=Elecció de l'script de migració
DataMigration=Migració de la base de dades (dades) DataMigration=Migració de la base de dades (dades)
DatabaseMigration=Migració de la base de dades (estructura + algunes dades) DatabaseMigration=Migració de la base de dades (estructura + algunes dades)
ProcessMigrateScript=Execució del script ProcessMigrateScript=Execució del script
ChooseYourSetupMode=Trieu el mode de configuració i feu clic a "Comença"... ChooseYourSetupMode=Trieu el vostre mode de configuració i feu clic a «Inici»...
FreshInstall=Nova instal·lació FreshInstall=Nova instal·lació
FreshInstallDesc=Utilitzeu aquest mode si aquesta és la vostra primera instal·lació. Si no, aquest mode pot reparar una instal·lació prèvia incompleta. Si voleu actualitzar la vostra versió, seleccioneu "Actualitzar". FreshInstallDesc=Utilitzeu aquest mode si aquesta és la vostra primera instal·lació. Si no, aquest mode pot reparar una instal·lació prèvia incompleta. Si voleu actualitzar la vostra versió, seleccioneu "Actualitzar".
Upgrade=Actualització Upgrade=Actualització
@ -129,7 +129,7 @@ MigrationCustomerOrderShipping=Migració de dades d'enviament de comandes de ven
MigrationShippingDelivery=Actualització de les dades d'enviaments MigrationShippingDelivery=Actualització de les dades d'enviaments
MigrationShippingDelivery2=Actualització de les dades d'enviaments 2 MigrationShippingDelivery2=Actualització de les dades d'enviaments 2
MigrationFinished=S'ha acabat la migració MigrationFinished=S'ha acabat la migració
LastStepDesc=<strong> Darrer pas </strong>: definiu aquí l'inici de sessió i la contrasenya que voleu utilitzar per connectar-se a Dolibarr. <b> No perdis això, ja que és el compte mestre per administrar tots els altres / comptes d'usuari addicionals.</b> LastStepDesc=<strong>Últim pas</strong>: Definiu aquí l'inici de sessió i la contrasenya que voleu utilitzar per a connectar-vos a Dolibarr. <b>No la perdeu, ja que és el compte principal per a administrar tots els altres comptes d'usuari addicionals.</b>
ActivateModule=Activació del mòdul %s ActivateModule=Activació del mòdul %s
ShowEditTechnicalParameters=Feu clic aquí per a mostrar/editar els paràmetres avançats (mode expert) ShowEditTechnicalParameters=Feu clic aquí per a mostrar/editar els paràmetres avançats (mode expert)
WarningUpgrade=Avís:\nHas fet una còpia de seguretat de la base de dades primer?\nAixò és molt recomanable. La pèrdua de dades (a causa, per exemple, d'errors a la versió de mysql 5.5.40/41/42/43) és possible durant aquest procés, per la qual cosa és essencial fer un bolcat complet de la base de dades abans d'iniciar qualsevol migració.\n\nFeu clic a D'acord per a iniciar el procés de migració... WarningUpgrade=Avís:\nHas fet una còpia de seguretat de la base de dades primer?\nAixò és molt recomanable. La pèrdua de dades (a causa, per exemple, d'errors a la versió de mysql 5.5.40/41/42/43) és possible durant aquest procés, per la qual cosa és essencial fer un bolcat complet de la base de dades abans d'iniciar qualsevol migració.\n\nFeu clic a D'acord per a iniciar el procés de migració...
@ -157,7 +157,7 @@ MigrationPaymentsUpdate=Actualització dels pagaments (vincle nn pagaments-factu
MigrationPaymentsNumberToUpdate=%s pagament(s) a actualitzar MigrationPaymentsNumberToUpdate=%s pagament(s) a actualitzar
MigrationProcessPaymentUpdate=Actualització pagament(s) %s MigrationProcessPaymentUpdate=Actualització pagament(s) %s
MigrationPaymentsNothingToUpdate=No hi ha més pagaments orfes que hagin de corregir. MigrationPaymentsNothingToUpdate=No hi ha més pagaments orfes que hagin de corregir.
MigrationPaymentsNothingUpdatable=No hi ha més pagaments per corregir MigrationPaymentsNothingUpdatable=No hi ha més pagaments que es puguin corregir
MigrationContractsUpdate=Actualització dels contractes sense detalls (gestió del contracte + detall de contracte) MigrationContractsUpdate=Actualització dels contractes sense detalls (gestió del contracte + detall de contracte)
MigrationContractsNumberToUpdate=%s contracte(s) a actualitzar MigrationContractsNumberToUpdate=%s contracte(s) a actualitzar
MigrationContractsLineCreation=Crea una línia de contracte per referència del contracte %s MigrationContractsLineCreation=Crea una línia de contracte per referència del contracte %s
@ -165,8 +165,8 @@ MigrationContractsNothingToUpdate=No hi ha més contractes (vinculats a un produ
MigrationContractsFieldDontExist=El camp fk_facture ja no existeix. Res a fer. MigrationContractsFieldDontExist=El camp fk_facture ja no existeix. Res a fer.
MigrationContractsEmptyDatesUpdate=Correcció de la data buida de contracte MigrationContractsEmptyDatesUpdate=Correcció de la data buida de contracte
MigrationContractsEmptyDatesUpdateSuccess=La correcció de la data buida del contracte s'ha realitzat correctament MigrationContractsEmptyDatesUpdateSuccess=La correcció de la data buida del contracte s'ha realitzat correctament
MigrationContractsEmptyDatesNothingToUpdate=No hi ha data de contracte buida per corregir MigrationContractsEmptyDatesNothingToUpdate=Cap data de contracte buida a corregir
MigrationContractsEmptyCreationDatesNothingToUpdate=No hi ha data de creació del contracte per corregir MigrationContractsEmptyCreationDatesNothingToUpdate=Cap data de creació de contracte a corregir
MigrationContractsInvalidDatesUpdate=Correcció del valor incorrecte de la data de contracte MigrationContractsInvalidDatesUpdate=Correcció del valor incorrecte de la data de contracte
MigrationContractsInvalidDateFix=Corregir contracte %s (data contracte=%s, Data posada en servei min=%s) MigrationContractsInvalidDateFix=Corregir contracte %s (data contracte=%s, Data posada en servei min=%s)
MigrationContractsInvalidDatesNumber=%s contractes modificats MigrationContractsInvalidDatesNumber=%s contractes modificats
@ -205,13 +205,13 @@ MigrationResetBlockedLog=Restablir el mòdul BlockedLog per l'algoritme v7
MigrationImportOrExportProfiles=Migració de perfils d'importació o exportació (%s) MigrationImportOrExportProfiles=Migració de perfils d'importació o exportació (%s)
ShowNotAvailableOptions=Mostra les opcions no disponibles ShowNotAvailableOptions=Mostra les opcions no disponibles
HideNotAvailableOptions=Amaga les opcions no disponibles HideNotAvailableOptions=Amaga les opcions no disponibles
ErrorFoundDuringMigration=S'han reportat error(s) durant el procés de migració, de manera que el següent pas no està disponible. Per ignorar els errors, podeu <a href="%s"> fer clic aquí </a>, però l'aplicació o algunes funcions no funcionen correctament fins que es resolen els errors. ErrorFoundDuringMigration=S'han informat errors durant el procés de migració, de manera que el pas següent no està disponible. Per a ignorar els errors, podeu fer <a href="%s">clic aquí</a>, però és possible que l'aplicació o algunes funcions no funcionin correctament fins que es resolguin els errors.
YouTryInstallDisabledByDirLock=L'aplicació ha intentat actualitzar-se automàticament, però les pàgines d'instal·lació / actualització s'han desactivat per a la seguretat (el directori rep el nom amb el sufix .lock). <br> YouTryInstallDisabledByDirLock=L'aplicació ha intentat actualitzar-se automàticament, però les pàgines d'instal·lació / actualització s'han desactivat per a la seguretat (el directori rep el nom amb el sufix .lock). <br>
YouTryInstallDisabledByFileLock=L'aplicació s'ha intentat actualitzar automàticament, però les pàgines d'instal·lació / actualització s'han desactivat per a la seguretat (per l'existència d'un fitxer de bloqueig <strong> install.lock </strong> al directori de documents del dolibarr). <br> YouTryInstallDisabledByFileLock=L'aplicació s'ha intentat actualitzar automàticament, però les pàgines d'instal·lació / actualització s'han desactivat per a la seguretat (per l'existència d'un fitxer de bloqueig <strong> install.lock </strong> al directori de documents del dolibarr). <br>
YouTryUpgradeDisabledByMissingFileUnLock=The application tried to self-upgrade, but the upgrade process is currently not allowed.<br> YouTryUpgradeDisabledByMissingFileUnLock=L'aplicació ha intentat actualitzar-se, però el procés d'actualització no està permès actualment. <br>
ClickHereToGoToApp=Fes clic aquí per anar a la teva aplicació ClickHereToGoToApp=Fes clic aquí per anar a la teva aplicació
ClickOnLinkOrRemoveManualy=Si una actualització està en curs, espereu. Si no, feu clic al següent enllaç. Si sempre veieu aquesta mateixa pàgina, heu de suprimir / canviar el nom del fitxer install.lock del directori de documents. ClickOnLinkOrRemoveManualy=Si una actualització està en curs, espereu. Si no, feu clic al següent enllaç. Si sempre veieu aquesta mateixa pàgina, heu de suprimir / canviar el nom del fitxer install.lock del directori de documents.
ClickOnLinkOrCreateUnlockFileManualy=If an upgrade is in progress, please wait... If not, you must create a file upgrade.unlock into the Dolibarr documents directory. ClickOnLinkOrCreateUnlockFileManualy=Si hi ha una actualització en curs, espereu... Si no, heu de crear un fitxer upgrade.unlock al directori de documents de Dolibarr.
Loaded=Carregat Loaded=Carregat
FunctionTest=Prova de funció FunctionTest=Prova de funció
NodoUpgradeAfterDB=Cap acció sol·licitada pels mòduls externs després de l'actualització de la base de dades NodoUpgradeAfterDB=Cap acció sol·licitada pels mòduls externs després de l'actualització de la base de dades

View File

@ -24,9 +24,9 @@ NameAndSignatureOfInternalContact=Nom i signatura del participant:
NameAndSignatureOfExternalContact=Nom i signatura del client: NameAndSignatureOfExternalContact=Nom i signatura del client:
DocumentModelStandard=Document model estàndard per a intervencions DocumentModelStandard=Document model estàndard per a intervencions
InterventionCardsAndInterventionLines=Fitxes i línies d'intervenció InterventionCardsAndInterventionLines=Fitxes i línies d'intervenció
InterventionClassifyBilled=Classifica "Facturat" InterventionClassifyBilled=Marca «Facturat»
InterventionClassifyUnBilled=Classifica "No facturat" InterventionClassifyUnBilled=Marca «No facturat»
InterventionClassifyDone=Classifica com a "Fet" InterventionClassifyDone=Marca «Fet»
StatusInterInvoiced=Facturada StatusInterInvoiced=Facturada
SendInterventionRef=Presentar intervenció %s SendInterventionRef=Presentar intervenció %s
SendInterventionByMail=Envia la intervenció per e-mail SendInterventionByMail=Envia la intervenció per e-mail
@ -50,7 +50,7 @@ UseDateWithoutHourOnFichinter=Oculta hores i minuts del camp de dates dels regis
InterventionStatistics=Estadístiques de intervencions InterventionStatistics=Estadístiques de intervencions
NbOfinterventions=Nombre de fitxers d’intervenció NbOfinterventions=Nombre de fitxers d’intervenció
NumberOfInterventionsByMonth=Nombre de fitxes d'intervenció per mes (data de validació) NumberOfInterventionsByMonth=Nombre de fitxes d'intervenció per mes (data de validació)
AmountOfInteventionNotIncludedByDefault=La quantitat d'intervenció no s'inclou per defecte als beneficis (en la majoria dels casos, les fulles de temps s'utilitzen per a comptar el temps dedicat). Afegiu l'opció PROJECT_INCLUDE_INTERVENTION_AMOUNT_IN_PROFIT a 1 a Inici-Vonfiguració-Altres per a incloure'ls. AmountOfInteventionNotIncludedByDefault=La quantitat d'intervenció no s'inclou per defecte als beneficis (en la majoria dels casos, les fulles de temps s'utilitzen per a comptar el temps dedicat). Podeu utilitzar l'opció PROJECT_ELEMENTS_FOR_ADD_MARGIN i PROJECT_ELEMENTS_FOR_MINUS_MARGIN a la configuració d'Inici-Configuració-Altres per a completar la llista d'elements inclosos als beneficis.
InterId=Id. d'intervenció InterId=Id. d'intervenció
InterRef=Ref. d'intervenció InterRef=Ref. d'intervenció
InterDateCreation=Data de creació de la intervenció InterDateCreation=Data de creació de la intervenció

Some files were not shown because too many files have changed in this diff Show More