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
* 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)
* 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;
$includeconstants=array();
$buildzip=0;
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";
@ -69,6 +70,9 @@ while ($i < $argc) {
if (!empty($result["includeconstant"])) {
$includeconstants[$i] = $result["includeconstant"];
}
if (!empty($result["buildzip"])) {
$buildzip=1;
}
if (preg_match('/includeconstant=/', strval($argv[$i]))) {
$tmp=explode(':', $result['includeconstant'], 3); // $includeconstant has been set with previous parse_str()
if (count($tmp) != 3) {

View File

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

@ -1016,7 +1016,7 @@ class AdherentType extends CommonObject
}
}
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

@ -194,6 +194,10 @@ if (!empty($triggers)) {
if ($trigger['code'] == 'FICHINTER_CLASSIFY_UNBILLED' && empty($conf->global->FICHINTER_CLASSIFY_BILLED)) {
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'])) {
print '<!-- '.$trigger['position'].' -->';

View File

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

View File

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

View File

@ -271,9 +271,19 @@ print '<input type="hidden" name="action" value="update">';
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
print load_fiche_titre($langs->trans("DictionaryPaperFormat"), '', '');
print '<div class="div-table-responsive-no-min">';
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>';

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 '<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 '<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 '<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 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 '<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 *.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 '<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");
}
$result = dol_move($destfiletmp, $destfile, 0, $overwriteifexists, 1);
$result = dol_move($destfiletmp, $destfile, 0, $overwriteifexists, 1, 1);
if (!$result) {
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>';
}
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>';

View File

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

View File

@ -1010,7 +1010,8 @@ while ($i < $imaxinloop) {
// User owner
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])) {
$userstatic = new User($db);
$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>';
}
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

@ -1844,10 +1844,10 @@ class Account extends CommonObject
}
if (method_exists($this, 'solde')) {
$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')) {
$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

@ -787,7 +787,7 @@ foreach ($accounts as $key => $type) {
if (!empty($arrayfields['balance']['checked'])) {
print '<td class="nowraponall right">';
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 '</td>';
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>';
}
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

@ -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_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');
$tva_npr = "";
// Define special_code for special lines
$special_code = 0;
@ -2157,8 +2158,7 @@ if (empty($reshook)) {
//$tva_tx = $datapriceofproduct['tva_tx'];
//$tva_npr = $datapriceofproduct['tva_npr'];
$tmpvat = price2num(preg_replace('/\s*\(.*\)/', '', $tva_tx));
$tmpvat = (float) price2num(preg_replace('/\s*\(.*\)/', '', $tva_tx));
$tmpprodvat = price2num(preg_replace('/\s*\(.*\)/', '', $prod->tva_tx));
// 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>';
}
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

@ -1,4 +1,6 @@
<?php
use Stripe\BankAccount;
/* Copyright (C) 2002-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004 Eric Seigne <eric.seigne@ryxeo.com>
* 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) {
$result = $object->makeStripeSepaRequest($user, GETPOST('did', 'int'), 'direct-debit', 'facture');
if ($result < 0) {
@ -153,7 +155,7 @@ if (empty($reshook)) {
}
}
// payments conditions
// Set payments conditions
if ($action == 'setconditions' && $usercancreate) {
$object->fetch($id);
$object->cond_reglement_code = 0; // To clean property
@ -404,7 +406,7 @@ if ($object->id > 0) {
print '<span class="badgeneutral">';
print $object->getLibType();
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>';
}
if ($object->type == $object::TYPE_REPLACEMENT) {
@ -915,7 +917,7 @@ if ($object->id > 0) {
// Past requests
$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 .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
$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 .= " ORDER BY pfd.date_demande DESC";
$result = $db->query($sql);
if ($result) {
$num = $db->num_rows($result);
$resql = $db->query($sql);
if ($resql) {
$num = $db->num_rows($resql);
$numclosed = $num;
$i = 0;
$tmpuser = new User($db);
while ($i < $num) {
$obj = $db->fetch_object($result);
$obj = $db->fetch_object($resql);
$tmpuser->id = $obj->user_id;
$tmpuser->login = $obj->login;
@ -975,9 +977,26 @@ if ($object->id > 0) {
$withdrawreceipt->date_creation = $db->jdate($obj->datec);
$withdrawreceipt->statut = $obj->status;
$withdrawreceipt->status = $obj->status;
$withdrawreceipt->fk_bank_account = $obj->fk_bank_account;
//$withdrawreceipt->credite = $db->jdate($obj->credite);
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";
@ -995,7 +1014,7 @@ if ($object->id > 0) {
print '<tr class="oddeven"><td colspan="7"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
}
$db->free($result);
$db->free($resql);
} else {
dol_print_error($db);
}

View File

@ -1050,7 +1050,7 @@ class RemiseCheque extends CommonObject
$return .= ' | <span class="info-box-label">'.$this->account_id.'</span>';
}
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')) {
$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') {
$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 {
$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
*/
@ -87,20 +98,13 @@ if ($reshook < 0) {
}
if (empty($reshook)) {
if ($action == 'confirm_delete') {
$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;
}
if ($action == 'setbankaccount' && $permissiontoadd) {
$object->oldcopy = dol_clone($object);
$object->fk_bank_account = GETPOST('fk_bank_account', 'int');
$object->update($user);
}
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';
$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
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'));
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');
}
}
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>';
// Status
/*
print '<tr><td>'.$langs->trans('Status').'</td>';
print '<td>'.$object->getLibStatut(1).'</td>';
print '</tr>';
*/
if (!empty($object->date_trans)) {
$muser = new User($db);
$muser->fetch($object->user_trans);
@ -210,23 +220,53 @@ if ($id > 0 || $ref) {
print '<div class="underbanner clearboth"></div>';
print '<table class="border centpercent tableforfield">';
// Get bank account for the payment
$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";
if ($object->type == 'bank-transfer') {
$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>';
if ($acc->id > 0) {
print $acc->getNomUrl(1);
}
print $form->editfieldval($langs->trans($labelofbankfield), 'fk_bank_account', $acc->id, $acc, $caneditbank, 'string', '', null, null, '', 1, 'getNomUrl');
print '</td>';
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">';
$labelfororderfield = 'WithdrawalFile';
if ($object->type == 'bank-transfer') {

View File

@ -70,13 +70,11 @@ class BonPrelevement extends CommonObject
public $emetteur_bic;
public $emetteur_ics;
public $date_trans;
public $user_trans;
public $method_trans;
public $user_credit;
public $total;
public $fetched;
public $statut; // 0-Wait, 1-Trans, 2-Done
public $labelStatus = array();
public $factures = array();
@ -84,14 +82,6 @@ class BonPrelevement extends CommonObject
public $invoice_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_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
/**
* '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
*
@ -290,8 +357,6 @@ class BonPrelevement extends CommonObject
*/
public function fetch($rowid, $ref = '')
{
global $conf;
$sql = "SELECT p.rowid, p.ref, p.amount, p.note";
$sql .= ", p.datec as dc";
$sql .= ", p.date_trans as date_trans";
@ -299,6 +364,7 @@ class BonPrelevement extends CommonObject
$sql .= ", p.date_credit as date_credit";
$sql .= ", p.fk_user_credit";
$sql .= ", p.type";
$sql .= ", p.fk_bank_account";
$sql .= ", p.statut as status";
$sql .= " FROM ".MAIN_DB_PREFIX."prelevement_bons as p";
$sql .= " WHERE p.entity IN (".getEntity('invoice').")";
@ -328,6 +394,7 @@ class BonPrelevement extends CommonObject
$this->user_credit = $obj->fk_user_credit;
$this->type = $obj->type;
$this->fk_bank_account = $obj->fk_bank_account;
$this->status = $obj->status;
$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
/**
* Set direct debit or credit transfer order to "paid" status.
@ -369,7 +448,7 @@ class BonPrelevement extends CommonObject
$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 .= ", statut = ".self::STATUS_CREDITED;
$sql .= ", date_credit = '".$this->db->idate($date)."'";
@ -383,8 +462,12 @@ class BonPrelevement extends CommonObject
$subject = $langs->trans("InfoCreditSubject", $this->ref);
$message = $langs->trans("InfoCreditMessage", $this->ref, dol_print_date($date, 'dayhour'));
//Add payment of withdrawal into bank
$bankaccount = ($this->type == 'bank-transfer' ? $conf->global->PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT : $conf->global->PRELEVEMENT_ID_BANKACCOUNT);
// Add payment of withdrawal into bank
$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();
$amounts = array();
$amountsperthirdparty = array();
@ -455,7 +538,7 @@ class BonPrelevement extends CommonObject
$modeforaddpayment = 'payment';
}
$result = $paiement->addPaymentToBank($user, $modeforaddpayment, '(WithdrawalPayment)', $bankaccount, '', '');
$result = $paiement->addPaymentToBank($user, $modeforaddpayment, '(WithdrawalPayment)', $fk_bank_account, '', '');
if ($result < 0) {
$error++;
$this->error = $paiement->error;
@ -742,17 +825,18 @@ class BonPrelevement extends CommonObject
* - Link the order with the prelevement_demande lines
* TODO delete params banque and agence when not necessary
*
* @param int $banque dolibarr mysoc bank
* @param int $agence dolibarr mysoc bank office (guichet)
* @param string $mode real=do action, simu=test only
* @param string $format FRST, RCUR or ALL
* @param string $executiondate Date to execute the transfer
* @param int $notrigger Disable triggers
* @param string $type 'direct-debit' or 'bank-transfer'
* @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 $banque dolibarr mysoc bank
* @param int $agence dolibarr mysoc bank office (guichet)
* @param string $mode real=do action, simu=test only
* @param string $format FRST, RCUR or ALL
* @param string $executiondate Date to execute the transfer
* @param int $notrigger Disable triggers
* @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 $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
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."/societe/class/societe.class.php";
// Check params
if ($type != 'bank-transfer') {
if (empty($format)) {
$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;
$datetimeprev = dol_now('gmt');
@ -969,12 +1059,13 @@ class BonPrelevement extends CommonObject
// Create withdraw order in database
$sql = "INSERT INTO ".MAIN_DB_PREFIX."prelevement_bons (";
$sql .= "ref, entity, datec, type";
$sql .= "ref, entity, datec, type, fk_bank_account";
$sql .= ") VALUES (";
$sql .= "'".$this->db->escape($ref)."'";
$sql .= ", ".((int) $conf->entity);
$sql .= ", '".$this->db->idate($now)."'";
$sql .= ", '".($type == 'bank-transfer' ? 'bank-transfer' : 'debit-order')."'";
$sql .= ", ".((int) $fk_bank_account);
$sql .= ")";
$resql = $this->db->query($sql);
@ -1055,12 +1146,8 @@ class BonPrelevement extends CommonObject
$this->date_echeance = $datetimeprev;
$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);
if ($account->fetch($id) > 0) {
if ($account->fetch($fk_bank_account) > 0) {
$this->emetteur_code_banque = $account->code_banque;
$this->emetteur_code_guichet = $account->code_guichet;
$this->emetteur_numero_compte = $account->number;
@ -1382,16 +1469,22 @@ class BonPrelevement extends CommonObject
* File is generated with name this->filename
*
* @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 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
*/
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;
//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;
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
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).
* Note: The tag PmtInf is opened here but closed into caller
*
* @param Conf $configuration conf
* @param int $ladate Date
* @param int $nombre 0 or 1
* @param float $total Total
* @param string $CrLf End of line character
* @param string $format FRST or RCUR or ALL
* @param string $type 'direct-debit' or 'bank-transfer'
* @return string String with SEPA Sender
* @param Conf $configuration conf
* @param int $ladate Date
* @param int $nombre 0 or 1
* @param float $total Total
* @param string $CrLf End of line character
* @param string $format FRST or RCUR or ALL
* @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 string String with SEPA Sender
* @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
// SEPA INITIALISATION
global $conf;
// Clean parameters
$dateTime_YMD = 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');
// 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
//$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);
if ($account->fetch($id) > 0) {
if ($account->fetch($fk_bank_account) > 0) {
$this->emetteur_code_banque = $account->code_banque;
$this->emetteur_code_guichet = $account->code_guichet;
$this->emetteur_numero_compte = $account->number;
@ -2081,8 +2179,7 @@ class BonPrelevement extends CommonObject
// Get pending payments
$sql = "SELECT rowid, ref";
$sql .= " FROM";
$sql .= " ".MAIN_DB_PREFIX."prelevement_bons as pb";
$sql .= " FROM ".MAIN_DB_PREFIX."prelevement_bons as pb";
$sql .= " WHERE pb.rowid = ".((int) $this->id);
$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
* @return string Label
* @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
*/
public function getLibStatut($mode = 0)
{
@ -2427,7 +2524,6 @@ class BonPrelevement extends CommonObject
{
global $langs;
$return = '<div class="box-flex-item box-flex-grow-zero">';
$return .= '<div class="info-box info-box-sm">';
$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>';
}
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>';

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>'.$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->fetch($object->user_trans);
@ -116,7 +116,7 @@ if ($id > 0 || $ref) {
print $object->methodes_trans[$object->method_trans];
print '</td></tr>';
}
if ($object->date_credit <> 0) {
if (!empty($object->date_credit)) {
print '<tr><td>'.$langs->trans('CreditDate').'</td><td>';
print dol_print_date($object->date_credit, 'day');
print '</td></tr>';
@ -129,15 +129,23 @@ if ($id > 0 || $ref) {
print '<div class="underbanner clearboth"></div>';
print '<table class="border centpercent tableforfield">';
// Get bank account for the payment
$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";
if ($object->type == 'bank-transfer') {
$labelofbankfield = 'BankToPayCreditTransfer';
}
print $langs->trans($labelofbankfield);
print '<tr><td class="titlefieldcreate">';
print $form->textwithpicto($langs->trans("BankAccount"), $langs->trans($labelofbankfield));
print '</td>';
print '<td>';
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>'.$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->fetch($object->user_trans);
@ -111,7 +111,7 @@ if ($id > 0 || $ref) {
print $object->methodes_trans[$object->method_trans];
print '</td></tr>';
}
if ($object->date_credit <> 0) {
if (!empty($object->date_credit)) {
print '<tr><td>'.$langs->trans('CreditDate').'</td><td>';
print dol_print_date($object->date_credit, 'day');
print '</td></tr>';
@ -124,15 +124,23 @@ if ($id > 0 || $ref) {
print '<div class="underbanner clearboth"></div>';
print '<table class="border centpercent tableforfield">';
// Get bank account for the payment
$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";
if ($object->type == 'bank-transfer') {
$labelofbankfield = 'BankToPayCreditTransfer';
}
print $langs->trans($labelofbankfield);
print '<tr><td class="titlefieldcreate">';
print $form->textwithpicto($langs->trans("BankAccount"), $langs->trans($labelofbankfield));
print '</td>';
print '<td>';
if ($acc->id > 0) {
@ -242,7 +250,7 @@ if ($resql) {
$i++;
}
} 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) {

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>'.$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->fetch($object->user_trans);
@ -105,7 +105,7 @@ if ($id > 0 || $ref) {
print $object->methodes_trans[$object->method_trans];
print '</td></tr>';
}
if ($object->date_credit <> 0) {
if (!empty($object->date_credit)) {
print '<tr><td>'.$langs->trans('CreditDate').'</td><td>';
print dol_print_date($object->date_credit, 'day');
print '</td></tr>';
@ -118,15 +118,23 @@ if ($id > 0 || $ref) {
print '<div class="underbanner clearboth"></div>';
print '<table class="border centpercent tableforfield">';
// Get bank account for the payment
$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";
if ($object->type == 'bank-transfer') {
$labelofbankfield = 'BankToPayCreditTransfer';
}
print $langs->trans($labelofbankfield);
print '<tr><td class="titlefieldcreate">';
print $form->textwithpicto($langs->trans("BankAccount"), $langs->trans($labelofbankfield));
print '</td>';
print '<td>';
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>';
}
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>';

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>';
}
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>';

View File

@ -2202,7 +2202,7 @@ class Contact extends CommonObject
$return .= '<span> : '.$this->LibPubPriv($this->priv).'</span>';
}*/
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

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

@ -45,9 +45,14 @@ error_reporting(E_ALL | E_STRICT);
$fk_element = GETPOST('fk_element', 'int');
$element = GETPOST('element', 'alpha');
$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 File

@ -59,6 +59,7 @@ $signature = GETPOST('signaturebase64');
$ref = GETPOST('ref', 'aZ09');
$mode = GETPOST('mode', 'aZ09'); // 'proposal', ...
$SECUREKEY = GETPOST("securekey"); // Secure key
$online_sign_name = GETPOST("onlinesignname") ? GETPOST("onlinesignname") : '';
$error = 0;
$response = "";
@ -90,7 +91,8 @@ if (empty($SECUREKEY) || !dol_verifyHash($securekeyseed.$type.$ref.(!isModEnable
top_httphead();
if ($action == "importSignature") {
if (!empty($signature) && $signature[0] == "image/png;base64") {
$issignatureok = (!empty($signature) && $signature[0] == "image/png;base64");
if ($issignatureok) {
$signature = $signature[1];
$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 .= '/'.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");
$filename = "signatures/".$date."_signature.png";
if (!is_dir($upload_dir."signatures/")) {
@ -143,7 +149,6 @@ if ($action == "importSignature") {
$pdf->SetCompression(false);
}
//$pdf->Open();
$pagecount = $pdf->setSourceFile($sourcefile); // original PDF
@ -155,7 +160,7 @@ if ($action == "importSignature") {
$pdf->AddPage($s['h'] > $s['w'] ? 'P' : 'L');
$pdf->useTemplate($tppl);
} 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();
$error++;
}
@ -167,7 +172,14 @@ if ($action == "importSignature") {
$yforimgstart = (empty($s['h']) ? 240 : $s['h'] - 60);
$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->Close();
$pdf->Output($newpdffilename, "F");
@ -187,7 +199,6 @@ if ($action == "importSignature") {
$db->begin();
$online_sign_ip = getUserRemoteIP();
$online_sign_name = ''; // TODO Ask name on form to sign
$sql = "UPDATE ".MAIN_DB_PREFIX."propal";
$sql .= " SET fk_statut = ".((int) $object::STATUS_SIGNED).", note_private = '".$db->escape($object->note_private)."',";
@ -207,9 +218,6 @@ if ($action == "importSignature") {
}
if (!$error) {
$db->commit();
$response = "success";
setEventMessages("PropalSigned", null, 'warnings');
if (method_exists($object, 'call_trigger')) {
//customer is not a user !?! so could we use same user as validation ?
$user = new User($db);
@ -218,17 +226,25 @@ if ($action == "importSignature") {
$result = $object->call_trigger('PROPAL_CLOSE_SIGNED', $user);
if ($result < 0) {
$error++;
$response = "error in trigger ".$object->error;
} else {
$response = "success";
}
$result = $object->call_trigger('PROPAL_CLOSE_SIGNED_WEB', $user);
if ($result < 0) {
$error++;
}
} else {
$response = "success";
}
} else {
$db->rollback();
$error++;
$response = "error sql";
}
if (!$error) {
$db->commit();
$response = "success";
setEventMessages("PropalSigned", null, 'warnings');
} else {
$db->rollback();
}
}
} elseif ($mode == 'contract') {
require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';

View File

@ -839,6 +839,10 @@ class CMailFile
$this->error .= ".<br>";
$this->error .= $langs->trans("ErrorPhpMailDelivery");
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 {
dol_syslog("CMailFile::sendfile: mail end success", LOG_DEBUG);
}
@ -903,6 +907,7 @@ class CMailFile
if (getDolGlobalString($keyforsmtpauthtype) === "XOAUTH2") {
require_once DOL_DOCUMENT_ROOT.'/core/lib/oauth.lib.php'; // define $supportedoauth2array
$keyforsupportedoauth2array = $conf->global->$keyforsmtpoauthservice;
if (preg_match('/^.*-/', $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);
$res = false;
if (!empty($conf->global->MAIN_MAIL_DEBUG)) {
$this->save_dump_mail_in_err();
}
}
}
} elseif ($this->sendmode == 'swiftmailer') {
@ -1031,6 +1040,7 @@ class CMailFile
}
if (getDolGlobalString($keyforsmtpauthtype) === "XOAUTH2") {
require_once DOL_DOCUMENT_ROOT.'/core/lib/oauth.lib.php'; // define $supportedoauth2array
$keyforsupportedoauth2array = getDolGlobalString($keyforsmtpoauthservice);
if (preg_match('/^.*-/', $keyforsupportedoauth2array)) {
$keyforprovider = preg_replace('/^.*-/', '', $keyforsupportedoauth2array);
@ -1131,6 +1141,10 @@ class CMailFile
}
dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
$res = false;
if (!empty($conf->global->MAIN_MAIL_DEBUG)) {
$this->save_dump_mail_in_err();
}
} else {
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
$outputfile = $dolibarr_main_data_root."/dolibarr_mail.log";
$fp = fopen($outputfile, "w");
$fp = fopen($outputfile, "w"); // overwrite
if ($this->sendmode == 'mail') {
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

View File

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

View File

@ -900,7 +900,7 @@ abstract class CommonInvoice extends CommonObject
dol_syslog(get_class($this)."::makeStripeSepaRequest start", LOG_DEBUG);
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';
$bac = new CompanyBankAccount($this->db); // table societe_rib
$result = $bac->fetch(0, $this->socid, 1, 'ban');
@ -974,295 +974,307 @@ abstract class CommonInvoice extends CommonObject
$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();
// Create a prelevement_bon
$bon = new BonPrelevement($this->db);
if (empty($obj->fk_prelevement_bons)) {
// This create record into llx_prelevment_bons and update link with llx_prelevement_demande
$nbinvoices = $bon->create(0, 0, 'real', 'ALL', '', 0, 'direct-debit', $did);
if ($nbinvoices <= 0) {
if (!$error) {
if (empty($obj->fk_prelevement_bons)) {
// This create record into llx_prelevment_bons and update link with llx_prelevement_demande
$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++;
$errorforinvoice++;
dol_syslog("Error on BonPrelevement creation", LOG_ERR);
$this->errors[] = "Error on BonPrelevement creation";
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) {
// 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) {
try {
//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);
if (!$error) {
if ($amountstripe > 0) {
try {
//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);
$resultthirdparty = $thirdparty->fetch($this->socid);
$thirdparty = new Societe($this->db);
$resultthirdparty = $thirdparty->fetch($this->socid);
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
$stripe = new Stripe($this->db);
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
$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];
\Stripe\Stripe::setApiKey($stripearrayofkeys['secret_key']);
$stripearrayofkeys = $stripearrayofkeysbyenv[$servicestatus];
\Stripe\Stripe::setApiKey($stripearrayofkeys['secret_key']);
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)
dol_syslog("makeStripeSepaRequest get stripe connect account return " . json_encode($stripeacc), 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)
dol_syslog("makeStripeSepaRequest get stripe connect account return " . json_encode($stripeacc), LOG_DEBUG);
$customer = $stripe->customerStripe($thirdparty, $stripeacc, $servicestatus, 0);
if (empty($customer) && !empty($stripe->error)) {
$this->errors[] = $stripe->error;
}
$customer = $stripe->customerStripe($thirdparty, $stripeacc, $servicestatus, 0);
if (empty($customer) && !empty($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)
// $nbdaysbeforeendoftries = (empty($conf->global->SELLYOURSAAS_NBDAYSBEFOREENDOFTRIES) ? 35 : $conf->global->SELLYOURSAAS_NBDAYSBEFOREENDOFTRIES);
$postactionmessages = [];
// $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);
$postactionmessages = [];
if ($resultthirdparty > 0 && !empty($customer)) {
if (!$error) { // Payment was not canceled
$sepaMode = false;
$stripecard = null;
if ($companypaymentmode->type == 'ban') {
$sepaMode = true;
// 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
// 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);
}
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;
if ($resultthirdparty > 0 && !empty($customer)) {
if (!$error) { // Payment was not canceled
$sepaMode = false;
$stripecard = null;
if ($companypaymentmode->type == 'ban') {
$sepaMode = true;
// 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
// 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);
}
//var_dump("stripefailurecode=".$stripefailurecode." stripefailuremessage=".$stripefailuremessage." stripefailuredeclinecode=".$stripefailuredeclinecode);
//exit;
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 = '';
// 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);
// Using new SCA method
dol_syslog("* Create payment on SEPA " . $stripecard->id . ", amounttopay=" . $amounttopay . ", amountstripe=" . $amountstripe . ", FULLTAG=" . $FULLTAG, LOG_DEBUG);
// Save a stripe payment was in error
$this->stripechargeerror++;
// 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);
$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;
}
}
$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 {
$errmsg .= ': ' . $stripefailurecode . ' - ' . $stripefailuremessage;
$errmsg .= ($stripefailuredeclinecode ? ' - ' . $stripefailuredeclinecode : '');
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;
}
$description = 'Stripe payment ERROR from makeStripeSepaRequest: ' . $FULLTAG;
$postactionmessages[] = $errmsg . ' (' . $stripearrayofkeys['publishable_key'] . ')';
$this->errors[] = $errmsg;
//var_dump("stripefailurecode=".$stripefailurecode." stripefailuremessage=".$stripefailuremessage." stripefailuredeclinecode=".$stripefailuredeclinecode);
//exit;
// 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 {
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
// even if in batch mode (method doTakePaymentStripe), we will always make all action in one transaction with a forced commit.
$this->stripechargedone++;
$object = $this;
// 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 {
$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;
$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'] . ')';
// If error because payment was canceled for a logical reason, we do nothing (no event added)
$description = '';
$stripefailurecode = '';
$stripefailuremessage = '';
$object = $this;
$actioncode = 'PAYMENT_STRIPE_KO';
$actioncode = '';
$extraparams = '';
}
} else {
// If error because payment was canceled for a logical reason, we do nothing (no event added)
$description = '';
$stripefailurecode = '';
$stripefailuremessage = '';
} else { // Else of the if ($resultthirdparty > 0 && ! empty($customer)) {
if ($resultthirdparty <= 0) {
dol_syslog('SellYourSaasUtils Failed to load customer for thirdparty_id = ' . $thirdparty->id, LOG_WARNING);
$this->errors[] = 'Failed to load customer for thirdparty_id = ' . $thirdparty->id;
} 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;
$actioncode = '';
$actioncode = 'PAYMENT_STRIPE_KO';
$extraparams = '';
}
} else { // Else of the if ($resultthirdparty > 0 && ! empty($customer)) {
if ($resultthirdparty <= 0) {
dol_syslog('SellYourSaasUtils Failed to load customer for thirdparty_id = ' . $thirdparty->id, LOG_WARNING);
$this->errors[] = 'Failed to load customer for thirdparty_id = ' . $thirdparty->id;
} 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'];
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++;
$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;
$actioncode = 'PAYMENT_STRIPE_KO';
$extraparams = '';
dol_syslog('Error ' . $e->getMessage(), LOG_ERR);
$this->errors[] = 'Error ' . $e->getMessage();
}
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) {
} else { // If remain to pay is null
$error++;
$errorforinvoice++;
dol_syslog('Error ' . $e->getMessage(), LOG_ERR);
$this->errors[] = 'Error ' . $e->getMessage();
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' ?";
}
} 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'

View File

@ -46,6 +46,12 @@ class FileUpload
global $db, $conf;
global $object;
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'));
$this->fk_element = $fk_element;
@ -238,6 +244,10 @@ class FileUpload
*/
protected function getFileObject($file_name)
{
if (!getDolGlobalInt('MAIN_USE_JQUERY_FILEUPLOAD')) {
return;
}
$file_path = $this->options['upload_dir'].$file_name;
if (is_file($file_path) && $file_name[0] !== '.') {
$file = new stdClass();
@ -278,6 +288,10 @@ class FileUpload
{
global $maxwidthmini, $maxheightmini;
if (!getDolGlobalInt('MAIN_USE_JQUERY_FILEUPLOAD')) {
return;
}
$file_path = $this->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)
{
if (!getDolGlobalInt('MAIN_USE_JQUERY_FILEUPLOAD')) {
return;
}
if ($error) {
$file->error = $error;
return false;
@ -399,8 +417,8 @@ class FileUpload
// Also remove control characters and spaces (\x00..\x20) around the filename:
$file_name = trim(basename(stripslashes($name)), ".\x00..\x20");
// Add missing file extension for known image types:
if (strpos($file_name, '.') === false &&
preg_match('/^image\/(gif|jpe?g|png)/', $type, $matches)) {
$matches = array();
if (strpos($file_name, '.') === false && preg_match('/^image\/(gif|jpe?g|png)/', $type, $matches)) {
$file_name .= '.'.$matches[1];
}
if ($this->options['discard_aborted_uploads']) {
@ -424,6 +442,10 @@ class FileUpload
*/
protected function handleFileUpload($uploaded_file, $name, $size, $type, $error, $index)
{
if (!getDolGlobalInt('MAIN_USE_JQUERY_FILEUPLOAD')) {
return;
}
$file = new stdClass();
$file->name = $this->trimFileName($name, $type, $index);
$file->mime = dol_mimetype($file->name, '', 2);
@ -470,6 +492,10 @@ class FileUpload
*/
public function get()
{
if (!getDolGlobalInt('MAIN_USE_JQUERY_FILEUPLOAD')) {
return;
}
$file_name = isset($_REQUEST['file']) ?
basename(stripslashes($_REQUEST['file'])) : null;
if ($file_name) {
@ -488,6 +514,10 @@ class FileUpload
*/
public function post()
{
if (!getDolGlobalInt('MAIN_USE_JQUERY_FILEUPLOAD')) {
return;
}
if (isset($_REQUEST['_method']) && $_REQUEST['_method'] === 'DELETE') {
return $this->delete();
}
@ -543,6 +573,10 @@ class FileUpload
*/
public function delete()
{
if (!getDolGlobalInt('MAIN_USE_JQUERY_FILEUPLOAD')) {
return;
}
$file_name = isset($_REQUEST['file']) ?
basename(stripslashes($_REQUEST['file'])) : null;
$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 $htmlname Name of select field ('edit' prefix will be added)
* @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 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.
@ -194,7 +194,7 @@ class Form
* @param string $text Text of label (not used in this function)
* @param string $htmlname Name of select field
* @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 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
@ -303,6 +303,8 @@ class Form
$arraylist[$tmpkey] = $tmp[1];
}
$ret .= $this->selectarray($htmlname, $arraylist, $value);
} elseif (preg_match('/^link/', $typeofdata)) {
// TODO Not yet implemented. See code for extrafields
} elseif (preg_match('/^ckeditor/', $typeofdata)) {
$tmp = explode(':', $typeofdata); // Example: ckeditor:dolibarr_zzz:width:height:savemethod:toolbarstartexpanded:rows:cols:uselocalbrowser
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
* @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;

View File

@ -908,7 +908,7 @@ class FormCompany extends Form
* @param string $morecss More css
* @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
global $conf, $langs, $hookmanager;

View File

@ -1431,7 +1431,7 @@ class FormTicket
$res = $ticketstat->fetch('', '', $this->track_id);
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 '<label for="send_msg_email">'.$langs->trans('SendMessageByEmail').'</label>';
$texttooltip = $langs->trans("TicketMessageSendEmailHelp", '{s1}');
@ -1463,7 +1463,7 @@ class FormTicket
// Subject
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>';
// Recipients / adressed-to
@ -1497,8 +1497,8 @@ class FormTicket
}
}
if ($conf->global->TICKET_NOTIFICATION_ALSO_MAIN_ADDRESS) {
$sendto[] = $conf->global->TICKET_NOTIFICATION_EMAIL_TO.' <small class="opacitymedium">(generic email)</small>';
if (getDolGlobalInt('TICKET_NOTIFICATION_ALSO_MAIN_ADDRESS')) {
$sendto[] = getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO').' <small class="opacitymedium">(generic email)</small>';
}
// Print recipient list

View File

@ -71,9 +71,7 @@ class Notify
'ORDER_VALIDATE',
'PROPAL_VALIDATE',
'PROPAL_CLOSE_SIGNED',
'PROPAL_CLOSE_SIGNED_WEB',
'PROPAL_CLOSE_REFUSED',
'PROPAL_CLOSE_REFUSED_WEB',
'FICHINTER_VALIDATE',
'FICHINTER_ADD_CONTACT',
'ORDER_SUPPLIER_VALIDATE',
@ -359,6 +357,7 @@ class Notify
global $dolibarr_main_url_root;
global $action;
// Complete the array Notify::$arrayofnotifsupported
if (!is_object($hookmanager)) {
include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
$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)) {
return 0;
}
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");
@ -407,7 +407,7 @@ class Notify
// Check notification per third party
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 .= " 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 .= " ".$this->db->prefix()."c_action_trigger as a,";
$sql .= " ".$this->db->prefix()."notify_def as n,";
@ -427,7 +427,7 @@ class Notify
// 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 .= " 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 .= " ".$this->db->prefix()."c_action_trigger as a,";
$sql .= " ".$this->db->prefix()."notify_def as n";
@ -439,6 +439,11 @@ class Notify
$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);
if ($result) {
$num = $this->db->num_rows($result);
@ -511,13 +516,9 @@ class Notify
$object_type = 'propal';
$labeltouse = $conf->global->PROPAL_CLOSE_REFUSED_TEMPLATE;
$mesg = $outputlangs->transnoentitiesnoconv("EMailTextProposalClosedRefused", $link);
break;
case 'PROPAL_CLOSE_REFUSED_WEB':
$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);
if (!empty($object->context['closedfromonlinesignature'])) {
$mesg .= ' - From online page';
}
break;
case 'PROPAL_CLOSE_SIGNED':
$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';
$labeltouse = $conf->global->PROPAL_CLOSE_SIGNED_TEMPLATE;
$mesg = $outputlangs->transnoentitiesnoconv("EMailTextProposalClosedSigned", $link);
break;
case 'PROPAL_CLOSE_SIGNED_WEB':
$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);
if (!empty($object->context['closedfromonlinesignature'])) {
$mesg .= ' - From online page';
}
break;
case 'FICHINTER_ADD_CONTACT':
$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 : '';
// 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);
if (!isset($action)) {
$action = '';
@ -721,6 +735,7 @@ class Notify
}
// 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) {
foreach ($conf->global as $key => $val) {
$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 $destdir Destination directory
* @param int $overwriteifexists Overwrite directory if exists (1 by default)
* @param int $indexdatabase Index new file into database.
* @param int $renamedircontent Rename contents inside srcdir.
* @param int $indexdatabase Index new name of files into database.
* @param int $renamedircontent Also rename contents inside srcdir after the move to match new destination name.
*
* @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") {
$res = dol_move_dir($filepath.'/'.$oldname, $filepath.'/'.$newname, $overwriteifexists, $indexdatabase, $renamedircontent);
} else {
$res = dol_move($filepath.'/'.$oldname, $filepath.'/'.$newname);
$res = dol_move($filepath.'/'.$oldname, $filepath.'/'.$newname, 0, $overwriteifexists, 0, $indexdatabase);
}
if (!$res) {
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)
*
* @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', ...)
* If no extension provided, we use '.png'. Image must be stored into theme/xxx/img directory.
* @param string $picto Name of image file to show ('filenew', ...).
* 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@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)
@ -4045,6 +4046,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $
} else {
$pictowithouttext = preg_replace('/(\.png|\.gif|\.svg)$/', '', $picto);
$pictowithouttext = str_replace('object_', '', $pictowithouttext);
$pictowithouttext = str_replace('_nocolor', '', $pictowithouttext);
if (strpos($pictowithouttext, 'fontawesome_') !== false || preg_match('/^fa-/', $pictowithouttext)) {
// 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',
'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',
'help', 'holiday',
'hands-helping', 'help', 'holiday',
'id-card', 'images', 'incoterm', 'info', 'intervention', 'inventory', 'intracommreport', 'jobprofile',
'knowledgemanagement',
'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',
'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];
}
@ -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',
'website'=>'#304', 'workstation'=>'#a69944'
);
if (isset($arrayconvpictotocolor[$pictowithouttext])) {
if (isset($arrayconvpictotocolor[$pictowithouttext]) && strpos($picto, '_nocolor') === false) {
$facolor = $arrayconvpictotocolor[$pictowithouttext];
}
@ -9091,11 +9093,9 @@ function dol_eval($s, $returnvalue = 0, $hideerrors = 1, $onlysimplestring = '1'
}
}
} catch (Error $e) {
$error = 'Caught error : ';
$error .= $e->getMessage() . ', ';
$error .= 'Trace : ';
$error .= json_encode($e->getTrace());
error_log($error, 1);
$error = 'dol_eval try/catch error : ';
$error .= $e->getMessage();
dol_syslog($error);
}
}

View File

@ -45,6 +45,11 @@ class pdf_strato extends ModelePDFContract
*/
public $db;
/**
* @var int The environment ID when using a multicompany module
*/
public $entity;
/**
* @var string model name
*/
@ -114,7 +119,7 @@ class pdf_strato extends ModelePDFContract
/**
* Issuer
* @var Societe
* @var Societe Object that emits
*/
public $emetteur;
@ -138,7 +143,7 @@ class pdf_strato extends ModelePDFContract
$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
// Page size for A4 format
// Dimension page
$this->type = 'pdf';
$formatarray = pdf_getFormat();
@ -160,7 +165,7 @@ class pdf_strato extends ModelePDFContract
// Get source company
$this->emetteur = $mysoc;
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
@ -182,7 +187,7 @@ class pdf_strato extends ModelePDFContract
public function write_file($object, $outputlangs, $srctemplatepath = '', $hidedetails = 0, $hidedesc = 0, $hideref = 0)
{
// phpcs:enable
global $user, $langs, $conf, $hookmanager, $mysoc;
global $user, $langs, $conf, $mysoc, $db, $hookmanager, $nblines;
if (!is_object($outputlangs)) {
$outputlangs = $langs;
@ -192,15 +197,30 @@ class pdf_strato extends ModelePDFContract
$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"));
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();
// Definition of $dir and $file
if ($object->specimen) {
$dir = $conf->contrat->dir_output;
$dir = $conf->contract->multidir_output[$conf->entity];
$file = $dir."/SPECIMEN.pdf";
} else {
$objectref = dol_sanitizeFileName($object->ref);
@ -210,7 +230,7 @@ class pdf_strato extends ModelePDFContract
if (!file_exists($dir)) {
if (dol_mkdir($dir) < 0) {
$this->error = $outputlangs->trans("ErrorCanNotCreateDir", $dir);
$this->error = $langs->trans("ErrorCanNotCreateDir", $dir);
return 0;
}
}
@ -226,15 +246,20 @@ class pdf_strato extends ModelePDFContract
global $action;
$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);
$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
$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)
if (!empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS)) {
$heightforfooter += 6;
}
$pdf->SetAutoPageBreak(1, 0);
if (class_exists('TCPDF')) {
$pdf->setPrintHeader(false);
@ -243,7 +268,11 @@ class pdf_strato extends ModelePDFContract
$pdf->SetFont(pdf_getPDFFont($outputlangs));
// Set path to the background PDF File
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);
}
@ -252,10 +281,10 @@ class pdf_strato extends ModelePDFContract
$pdf->SetDrawColor(128, 128, 128);
$pdf->SetTitle($outputlangs->convToOutputCharset($object->ref));
$pdf->SetSubject($outputlangs->transnoentities("ContractCard"));
$pdf->SetSubject($outputlangs->transnoentities("Contract"));
$pdf->SetCreator("Dolibarr ".DOL_VERSION);
$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')) {
$pdf->SetCompression(false);
}
@ -268,7 +297,7 @@ class pdf_strato extends ModelePDFContract
$pdf->useTemplate($tplidx);
}
$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->MultiCell(0, 3, ''); // Set interline to 3
$pdf->SetTextColor(0, 0, 0);
@ -408,6 +437,7 @@ class pdf_strato extends ModelePDFContract
{
$pdf->commitTransaction();
}
$posYAfterDescription = $pdf->GetY();
$nexY = $pdf->GetY() + 2;
$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.
// We suppose that a too long description is moved completely on next page
if ($pageposafter > $pageposbefore) {
if ($pageposafter > $pageposbefore && empty($showpricebeforepagebreak)) {
$pdf->setPage($pageposafter);
$curY = $tab_top_newpage;
}
@ -483,10 +513,6 @@ class pdf_strato extends ModelePDFContract
$pdf->Output($file, 'F');
// 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'));
$parameters = array('file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs);
global $action;
@ -500,13 +526,13 @@ class pdf_strato extends ModelePDFContract
$this->result = array('fullpath'=>$file);
return 1;
return 1; // No error
} else {
$this->error = $langs->trans("ErrorCanNotCreateDir", $dir);
$this->error = $langs->transnoentities("ErrorCanNotCreateDir", $dir);
return 0;
}
} else {
$this->error = $langs->trans("ErrorConstantNotDefined", "CONTRACT_OUTPUTDIR");
$this->error = $langs->transnoentities("ErrorConstantNotDefined", "CONTRACT_OUTPUTDIR");
return 0;
}
}
@ -534,7 +560,9 @@ class pdf_strato extends ModelePDFContract
$hidetop = -1;
}
$currency = !empty($currency) ? $currency : $conf->currency;
$default_font_size = pdf_getPDFFontSize($outputlangs);
/*
$pdf->SetXY($this->marge_gauche, $tab_top);
$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 int $showaddress 0=no, 1=yes
* @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
$outputlangs->loadLangs(array("main", "dict", "contract", "companies"));
$default_font_size = pdf_getPDFFontSize($outputlangs);
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->SetFont('', 'B', $default_font_size + 3);
$posx = $this->page_largeur - $this->marge_droite - 100;
$w = 100;
$posy = $this->marge_haute;
$posx = $this->page_largeur - $this->marge_droite - $w;
$pdf->SetXY($this->marge_gauche, $posy);
// Logo
$logo = $conf->mycompany->dir_output.'/logos/'.$this->emetteur->logo;
if ($this->emetteur->logo) {
if (is_readable($logo)) {
$height = pdf_getHeightForLogo($logo);
$pdf->Image($logo, $this->marge_gauche, $posy, 0, $height); // width=0 (auto)
if (empty($conf->global->PDF_DISABLE_MYCOMPANY_LOGO)) {
if ($this->emetteur->logo) {
$logodir = $conf->mycompany->dir_output;
if (!empty($conf->mycompany->multidir_output[$object->entity])) {
$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 {
$pdf->SetTextColor(200, 0, 0);
$pdf->SetFont('', 'B', $default_font_size - 2);
$pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorLogoFileNotFound", $logo), 0, 'L');
$pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorGoToGlobalSetup"), 0, 'L');
$text = $this->emetteur->name;
$pdf->MultiCell($w, 4, $outputlangs->convToOutputCharset($text), 0, $ltrdirection);
}
} else {
$text = $this->emetteur->name;
$pdf->MultiCell(100, 4, $outputlangs->convToOutputCharset($text), 0, 'L');
}
$pdf->SetFont('', 'B', $default_font_size + 3);
$pdf->SetXY($posx, $posy);
$pdf->SetTextColor(0, 0, 60);
$title = $outputlangs->transnoentities("ContractCard");
$pdf->MultiCell(100, 4, $title, '', 'R');
$title = $outputlangs->transnoentities($titlekey);
$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;
$pdf->SetXY($posx, $posy);
$pdf->SetTextColor(0, 0, 60);
$pdf->MultiCell(100, 4, $outputlangs->transnoentities("Ref")." : ".$outputlangs->convToOutputCharset($object->ref), '', 'R');
*/
$posy += 1;
$pdf->SetFont('', '', $default_font_size);
$posy += 3;
$pdf->SetFont('', '', $default_font_size - 1);
$posy += 4;
$pdf->SetXY($posx, $posy);
$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) {
$posy += 4;
$pdf->SetXY($posx, $posy);
$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) {
@ -700,6 +749,7 @@ class pdf_strato extends ModelePDFContract
$pdf->SetXY($posx, $posy);
$pdf->SetFillColor(230, 230, 230);
$pdf->MultiCell(82, $hautcadre, "", 0, 'R', 1);
$pdf->SetTextColor(0, 0, 60);
}
// Show sender name
@ -707,13 +757,13 @@ class pdf_strato extends ModelePDFContract
$pdf->SetXY($posx + 2, $posy + 3);
$pdf->SetTextColor(0, 0, 60);
$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();
}
// Show sender information
$pdf->SetFont('', '', $default_font_size - 1);
$pdf->SetXY($posx + 2, $posy);
$pdf->SetFont('', '', $default_font_size - 1);
$pdf->MultiCell(80, 4, $carac_emetteur, 0, 'L');
@ -736,14 +786,16 @@ class pdf_strato extends ModelePDFContract
$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
$widthrecbox = 100;
$widthrecbox = !empty($conf->global->MAIN_PDF_USE_ISO_LOCATION) ? 92 : 100;
if ($this->page_largeur < 210) {
$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;
if (!empty($conf->global->MAIN_INVERT_SENDER_RECIPIENT)) {
$posx = $this->marge_gauche;
@ -761,15 +813,18 @@ class pdf_strato extends ModelePDFContract
// Show recipient name
$pdf->SetXY($posx + 2, $posy + 3);
$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();
// Show recipient information
$pdf->SetFont('', '', $default_font_size - 1);
$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
@ -785,6 +840,6 @@ class pdf_strato extends ModelePDFContract
protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 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
$this->dictionaries=array(
'langs'=>'partnership@partnership',
'langs'=>'partnership',
// List of tables we want to see into dictonnary editor
'tabname'=>array("c_partnership_type"),
// Label of tables
@ -291,7 +291,7 @@ class modPartnership extends DolibarrModules
// 'leftmenu'=>'partnership',
// 'url'=>'/partnership/partnership_list.php',
// // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
// 'langs'=>'partnership@partnership',
// 'langs'=>'partnership',
// '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.
// 'enabled'=>'$conf->partnership->enabled',
@ -349,18 +349,18 @@ class modPartnership extends DolibarrModules
$r = 1;
/* BEGIN MODULEBUILDER EXPORT PARTNERSHIP */
/*
$langs->load("partnership@partnership");
$langs->load("partnership");
$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_icon[$r]='partnership@partnership';
$this->export_icon[$r]='partnership';
// 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';
//$this->export_fields_array[$r]['t.fieldtoadd']='FieldToAdd'; $this->export_TypeFields_array[$r]['t.fieldtoadd']='Text';
//unset($this->export_fields_array[$r]['t.fieldtoremove']);
//$keyforclass = 'PartnershipLine'; $keyforclassfile='/partnership/class/partnership.class.php'; $keyforelement='partnershipline@partnership'; $keyforalias='tl';
//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';
//$keyforselect='partnershipline'; $keyforaliasextra='extraline'; $keyforelement='partnershipline@partnership';
//include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php';
@ -380,13 +380,13 @@ class modPartnership extends DolibarrModules
$r = 1;
/* BEGIN MODULEBUILDER IMPORT PARTNERSHIP */
/*
$langs->load("partnership@partnership");
$langs->load("partnership");
$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_icon[$r]='partnership@partnership';
$keyforclass = 'Partnership'; $keyforclassfile='/partnership/class/partnership.class.php'; $keyforelement='partnership@partnership';
$this->export_icon[$r]='partnership';
$keyforclass = 'Partnership'; $keyforclassfile='/partnership/class/partnership.class.php'; $keyforelement='partnership';
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';
//$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 ';
@ -417,11 +417,11 @@ class modPartnership extends DolibarrModules
// Create extrafields during init
//include_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
//$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');
//$result2=$extrafields->addExtraField('partnership_myattr2', "New Attr 2 label", 'varchar', 1, 10, 'project', 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@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');
//$result5=$extrafields->addExtraField('partnership_myattr5', "New Attr 5 label", 'text', 1, 10, 'user', 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', '$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', '$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
$this->remove($options);

View File

@ -328,7 +328,7 @@ if ($action == 'presend') {
}
$contactarr = array();
$contactarr = $tmpobject->liste_contact(-1, 'external');
$contactarr = $tmpobject->liste_contact(-1, 'external', 0, '', 1);
if (is_array($contactarr) && count($contactarr) > 0) {
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)) {
$object->fetchObjectLinked();
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;
} else {
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;
} elseif (preg_match('/^MEMBER_/', $action)) {
$object->trackid = 'mem'.$object->id;
} elseif (preg_match('/^PARTNERSHIP_/', $action)) {
$object->trackid = 'pship'.$object->id;
} elseif (preg_match('/^PROJECT_/', $action)) {
$object->trackid = 'proj'.$object->id;
} elseif (preg_match('/^TASK_/', $action)) {
@ -1090,7 +1092,7 @@ class InterfaceActionsAuto extends DolibarrTriggers
$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.
if (!in_array($elementtype, array('societe', 'contact', 'project'))) {
$actioncomm->fk_element = $elementid;

View File

@ -45,7 +45,7 @@ class InterfaceNotification extends DolibarrTriggers
$this->name = preg_replace('/^Interface/i', '', get_class($this));
$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
$this->version = self::VERSION_DOLIBARR;
$this->picto = 'email';
@ -70,6 +70,7 @@ class InterfaceNotification extends DolibarrTriggers
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)) {
return 0;
}
@ -112,7 +113,7 @@ class InterfaceNotification extends DolibarrTriggers
$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 .= $this->db->order("rang, elementtype, code");
@ -153,7 +154,7 @@ class InterfaceNotification extends DolibarrTriggers
}
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++;

View File

@ -107,20 +107,58 @@ if (!defined('USEDOLIBARRSERVER') && !defined('USEDOLIBARREDITOR')) {
// 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.
// Content-Security-Policy
if (!defined('WEBSITE_MAIN_SECURITY_FORCECSP')) {
// The constant WEBSITE_MAIN_SECURITY_FORCECSP should never be defined by page, but the variable used just after may be
// Content-Security-Policy-Report-Only
if (!defined('WEBSITE_MAIN_SECURITY_FORCECSPRO')) {
// 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';";
$contentsecuritypolicy = getDolGlobalString('WEBSITE_MAIN_SECURITY_FORCECSP');
// 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_FORCECSPRO');
if (!is_object($hookmanager)) {
$hookmanager = new HookManager($db);
}
$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
if ($result > 0) {
$contentsecuritypolicy = $hookmanager->resPrint; // Replace CSP
@ -129,12 +167,6 @@ if (!defined('USEDOLIBARRSERVER') && !defined('USEDOLIBARREDITOR')) {
}
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);
}
}

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>';
}
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>';

View File

@ -5,6 +5,7 @@
* Copyright (C) 2016-2021 Ferran Marcet <fmarcet@2byte.es>
* Copyright (C) 2019 Nicolas ZABOURI <info@inovea-conseil.com>
* 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
* 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_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'));
$socid = GETPOST('socid', 'int');
$search_user = GETPOST('search_user', 'int');
$search_sale = GETPOST('search_sale', '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>';
}
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

@ -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>';
}
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

@ -1503,7 +1503,7 @@ class Fichinter extends CommonObject
$return .= '<br><span class="info-box-label ">'.$langs->trans("Duration").' : '.convertSecondToTime($this->duration, 'allhourmin').'</span>';
}
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

@ -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>';
}
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

@ -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>';
}
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

@ -2493,7 +2493,7 @@ class Holiday extends CommonObject
$return .= '<span class="info-box-label">'.dol_print_date($this->date_fin, 'day').'</span>';
}
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

@ -1084,7 +1084,7 @@ class Evaluation extends CommonObject
}
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 .= '</div>';

View File

@ -333,7 +333,7 @@ class TCPDI extends FPDF_TPL {
break;
}
}
} elseif ($tpl['x'] != 0 || $tpl['y'] != 0) {
} elseif (!empty($tpl['x']) || !empty($tpl['y'])) {
$tx = -$tpl['x'] * 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);
if ($result >= 0) {
if (dol_move($outputfiletmp, $outputfile, 0, 1)) {
if (dol_move($outputfiletmp, $outputfile, 0, 1, 0, 0)) {
$result = 1;
} else {
$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);
if ($result >= 0) {
if (dol_move($outputfiletmp, $outputfile, 0, 1)) {
if (dol_move($outputfiletmp, $outputfile, 0, 1, 0, 0)) {
$result = 1;
} else {
$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);
if ($result >= 0) {
if (dol_move($outputfiletmp, $outputfile, 0, 1)) {
if (dol_move($outputfiletmp, $outputfile, 0, 1, 0, 0)) {
$result = 1;
} else {
$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);
if ($result >= 0) {
if (dol_move($outputfiletmp, $outputfile, 0, 1)) {
if (dol_move($outputfiletmp, $outputfile, 0, 1, 0, 0)) {
$result = 1;
} else {
$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);
if ($result >= 0) {
if (dol_move($outputfiletmp, $outputfile, 0, 1)) {
if (dol_move($outputfiletmp, $outputfile, 0, 1, 0, 0)) {
$result = 1;
} else {
$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);
if ($result >= 0) {
if (dol_move($outputfiletmp, $outputfile, 0, 1)) $result = 1;
if (dol_move($outputfiletmp, $outputfile, 0, 1, 0, 0)) $result = 1;
else {
$error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile;
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_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_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_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_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);
@ -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_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);
-- 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_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);
@ -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_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);
-- 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';
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;
-- 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_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_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_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_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);

View File

@ -45,6 +45,12 @@ ALTER TABLE llx_facture_fourn_det MODIFY COLUMN ref varchar(128);
-- 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);
-- 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_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);

View File

@ -24,6 +24,7 @@ create table llx_c_action_trigger
rowid integer AUTO_INCREMENT PRIMARY KEY,
elementtype varchar(64) 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,
description varchar(255),
rang integer DEFAULT 0

View File

@ -27,5 +27,8 @@ create table llx_notify_def
fk_soc integer,
fk_contact 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', ...
)ENGINE=innodb;

View File

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

View File

@ -1145,7 +1145,7 @@ class KnowledgeRecord extends CommonObject
$return .= '<span class="info-box-label">'.dolGetFirstLineOfText($this->question).'</span>';
}
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

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

View File

@ -145,6 +145,7 @@ Box=بريمج
Boxes=بريمجات
MaxNbOfLinesForBoxes=الحد الأعلى لعدد أسطر البريمجات
AllWidgetsWereEnabled=جميع البريمجات المتاحة ممكنة
WidgetAvailable=Widget available
PositionByDefault=الطلبية الإفتراضية
Position=الوضع
MenusDesc=يقوم مديرو القائمة بتعيين محتوى شريطي القائمة (الأفقي والعمودي).
@ -374,7 +375,7 @@ DoTestSendHTML=اختبار ارسال هتمل
ErrorCantUseRazIfNoYearInMask=خطأ، لا يمكن استخدام الخيار @ لإعادة تعيين عداد سنويا إذا تسلسل {} أو {yyyy إنهاء س س س س} ليس في قناع.
ErrorCantUseRazInStartedYearIfNoYearMonthInMask=خطأ ، لا يمكن للمستخدم الخيار في حال تسلسل @ (ذ ذ م م)) ((سنة أو ملم)) (لا تخفي.
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 للحصول على قائمة بالمساهمين ومنظمتهم
UseACacheDelay= التخزين المؤقت للتأخير في الرد على الصادرات ثانية (0 فارغة أو لا مخبأ)
DisableLinkToHelpCenter=إخفاء الارتباط "<b> بحاجة إلى مساعدة أو دعم </b>" في صفحة تسجيل الدخول
@ -663,7 +664,7 @@ Module2900Desc=GeoIP التحويلات Maxmind القدرات
Module3200Name=المحفوظات غير القابلة للتغيير
Module3200Desc=تمكين سجل غير قابل للتغيير لأحداث العمل. يتم أرشفة الأحداث في الوقت الحقيقي. السجل هو جدول للقراءة فقط للأحداث المتسلسلة التي يمكن تصديرها. قد تكون هذه الوحدة إلزامية لبعض البلدان.
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=الشبكات الاجتماعية
Module3400Desc=قم بتمكين حقول الشبكات الاجتماعية في عناوين وعناوين الأطراف الثالثة (سكايب ، تويتر ، فيسبوك ، ...).
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.
ModuleWebhookName = الويب هوك
ModuleWebhookDesc = واجهة للقبض على مشغلات dolibarr وإرسالها إلى عنوان URL
ModuleWebhookDesc = Interface to catch dolibarr triggers and send data of the event to an URL
WebhookSetup = إعداد Webhook
Settings = الإعدادات
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.
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_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=إحصائيات التدخلات
NbOfinterventions=عدد بطاقات التدخل
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=تدخل معرف
InterRef=تدخل المرجع.
InterDateCreation=تدخل تاريخ الإنشاء

View File

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

View File

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

View File

@ -145,6 +145,7 @@ Box=Джаджа
Boxes=Джаджи
MaxNbOfLinesForBoxes=Максимален брой редове за джаджи
AllWidgetsWereEnabled=Всички налични джаджи са активирани
WidgetAvailable=Widget available
PositionByDefault=Позиция по подразбиране
Position=Позиция
MenusDesc=Меню мениджърите определят съдържанието на двете ленти с менюта (хоризонтална и вертикална).
@ -374,7 +375,7 @@ DoTestSendHTML=Тестово изпращане на HTML
ErrorCantUseRazIfNoYearInMask=Грешка, не може да се използва опция @, за да нулирате брояча всяка година, ако последователността {yy} или {yyyy} не е в маската.
ErrorCantUseRazInStartedYearIfNoYearMonthInMask=Грешка, не може да се използва опция @, ако последователността {yy}{mm} или {yyyy}{mm} не са в маската.
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 за списък на сътрудниците и тяхната организация
UseACacheDelay= Забавяне при кеширане на отговора за експорт в секунди (0 или празно, за да не се използва кеш)
DisableLinkToHelpCenter=Hide the link "<b>Need help or support</b>" on the login page
@ -663,7 +664,7 @@ Module2900Desc=GeoIP Maxmind възможности за преобразува
Module3200Name=Неизменими архиви
Module3200Desc=Непроменлив дневник на бизнес събития. Събитията се архивират в реално време. Дневникът е таблица, достъпна единствено за четене, която съдържа последователни събития, които могат да бъдат експортирани. Този модул може да е задължителен за някои страни.
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=Социални мрежи
Module3400Desc=Enable Social Networks fields into third parties and addresses (skype, twitter, facebook, ...).
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.
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
Settings = Настройки
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.
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_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=Статистика на интервенции
NbOfinterventions=Брой интервенции
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=Идентификатор на интервенция
InterRef=Съгласно интервенция №
InterDateCreation=Дата на създаване на интервенцията
@ -66,3 +66,7 @@ RepeatableIntervention=Шаблон на интервенция
ToCreateAPredefinedIntervention=За да създадете предварително определена или повтаряща се интервенция, създайте интервенция и я превърнете в шаблон за интервенция.
ConfirmReopenIntervention=Are you sure you want to open back the intervention <b>%s</b>?
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=Имейли от файл
MailingModuleDescEmailsFromUser=Имейли, въведени от потребител
MailingModuleDescDolibarrUsers=Потребители с имейли
MailingModuleDescThirdPartiesByCategories=Контрагенти (с категории)
MailingModuleDescThirdPartiesByCategories=Контрагенти
SendingFromWebInterfaceIsNotAllowed=Изпращането от уеб интерфейса не е позволено.
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
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.
NoMoreRecipientToSendTo=No more recipient to send the email to

View File

@ -91,7 +91,7 @@ MailingModuleDescContactsByFunction=Contacts by position
MailingModuleDescEmailsFromFile=Emails from file
MailingModuleDescEmailsFromUser=Emails input by user
MailingModuleDescDolibarrUsers=Users with Emails
MailingModuleDescThirdPartiesByCategories=Third parties (by categories)
MailingModuleDescThirdPartiesByCategories=Subjekti
SendingFromWebInterfaceIsNotAllowed=Sending from web interface is not allowed.
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
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.
NoMoreRecipientToSendTo=No more recipient to send the email to

View File

@ -95,13 +95,13 @@ ChangeAndLoad=Canviar i carregar
Addanaccount=Afegir un compte comptable
AccountAccounting=Compte comptable
AccountAccountingShort=Compte
SubledgerAccount=Subcompte comptable
SubledgerAccountLabel=Nom del compte del llibre major
SubledgerAccount=Compte de subllibre
SubledgerAccountLabel=Nom del compte de subllibre
ShowAccountingAccount=Mostrar diari de comptes
ShowAccountingJournal=Mostrar diari comptable
ShowAccountingAccountInLedger=Mostra el compte comptable al Llibre major
ShowAccountingAccountInJournals=Mostra el compte comptable als diaris
DataUsedToSuggestAccount=Data used to suggest account
DataUsedToSuggestAccount=Dades utilitzades per a suggerir un compte
AccountAccountingSuggest=Compte suggerit
MenuDefaultAccounts=Comptes per defecte
MenuBankAccounts=Comptes bancaris
@ -125,7 +125,7 @@ UpdateMvts=Modificació d'una transacció
ValidTransaction=Valida l'assentament
WriteBookKeeping=Registrar transaccions en comptabilitat
Bookkeeping=Llibre major
BookkeepingSubAccount=Subcompte
BookkeepingSubAccount=Subquadern
AccountBalance=Compte saldo
AccountBalanceSubAccount=Saldo de subcomptes
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 daquesta 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_SELL_JOURNAL=Diari de vendes (vendes i devolucions)
ACCOUNTING_PURCHASE_JOURNAL=Diari de compres (compres i devolucions)
ACCOUNTING_BANK_JOURNAL=Diari d'efectiu (entrades i desemborsaments)
ACCOUNTING_SELL_JOURNAL=Diari de vendes: vendes i devolucions
ACCOUNTING_PURCHASE_JOURNAL=Diari de compres: compres i devolucions
ACCOUNTING_BANK_JOURNAL=Diari d'efectiu: rebuts i desemborsaments
ACCOUNTING_EXPENSEREPORT_JOURNAL=Diari de l'informe de despeses
ACCOUNTING_MISCELLANEOUS_JOURNAL=Diari general
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"
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)
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)
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_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_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_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=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_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_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_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=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_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_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_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=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_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_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_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=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
Docdate=Data
@ -223,7 +223,7 @@ TransactionNumShort=Número de transacció
AccountingCategory=Grup de comptes personalitzat
AccountingCategories=Grups de comptes personalitzats
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.
ByAccounts=Per comptes
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ó)
FinanceJournal=Diari de finances
ExpenseReportsJournal=Informe-diari de despeses
InventoryJournal=Diari d'inventari
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.
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
UnknownAccountForThirdparty=Compte comptable de tercer desconeguda, utilitzarem %s
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.
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
PaymentsNotLinkedToProduct=Pagament no vinculat a cap producte / servei
OpeningBalance=Saldo d'obertura
@ -269,7 +270,7 @@ ShowSubtotalByGroup=Mostra el subtotal per nivell
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.
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
@ -299,7 +300,7 @@ DescValidateMovements=Queda prohibida qualsevol modificació o supressió de reg
ValidateHistory=Comptabilitza automàticament
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
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_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_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
## 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>
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?
@ -406,7 +407,7 @@ SaleLocal=Venda local
SaleExport=Venda dexportació
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 duna 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.
ForbiddenTransactionAlreadyValidated=Prohibit: la transacció s'ha validat.
## Dictionary
@ -430,7 +431,7 @@ AccountancyUnletteringModifiedSuccessfully=%s conciliació desfeta correctament
## Confirm box
ConfirmMassUnletteringAuto=Confirmació de desconciliació automàtica 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
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)
FECFormatGeneralAccountNumber=Número de compte general (CompteNum)
FECFormatGeneralAccountLabel=Nom de compte general (CompteLib)
FECFormatSubledgerAccountNumber=Número de compte de Subledger (CompAuxNum)
FECFormatSubledgerAccountLabel=Número de compte de Subledger (CompAuxLib)
FECFormatSubledgerAccountNumber=Número de compte auxiliar (CompAuxNum)
FECFormatSubledgerAccountLabel=Número de compte auxiliar (CompAuxLib)
FECFormatPieceRef=Peça ref. (PieceRef)
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)
FECFormatCredit=Crèdit (Crèdit)
FECFormatReconcilableCode=Codi reconciliable (EcritureLet)
@ -477,7 +478,7 @@ FECFormatMulticurrencyCode=Codi multidivisa (Idevise)
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.
ExpenseReportJournal=Diari d'informe de despeses
DocsAlreadyExportedAreExcluded=Docs already exported are excluded
ClickToHideAlreadyExportedLines=Click to hide already exported lines
DocsAlreadyExportedAreExcluded=S'exclouen els documents ja exportats
ClickToHideAlreadyExportedLines=Feu clic per a amagar les línies ja exportades
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
TimesheetPreventAfterFollowingMonths=Eviteu el temps de gravació passat el següent nombre de mesos
JavascriptDisabled=Javascript desactivat
UsePreviewTabs=Veure fitxes "vista prèvia"
UsePreviewTabs=Utilitzeu pestanyes de vista prèvia
ShowPreview=Veure previsualització
ShowHideDetails=Mostra-Amaga els detalls
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
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
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
UserSetup=Configuració de gestió d'usuaris
MultiCurrencySetup=Configuració multidivisa
@ -145,6 +145,7 @@ Box=Panell
Boxes=Panells
MaxNbOfLinesForBoxes=Màx. nombre de línies pels panells
AllWidgetsWereEnabled=Tots els widgets disponibles estan habilitats
WidgetAvailable=Giny disponible
PositionByDefault=Posició per defecte
Position=Lloc
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>.
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>
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 daquí:
CurrentVersion=Versió actual de Dolibarr
CallUpdatePage=Aneu a la pàgina que actualitza l'estructura i les dades de la base de dades: %s.
LastStableVersion=Última versió estable
LastActivationDate=Data de l'última activació
LastActivationAuthor=Últim autor d'activació
LastActivationDate=Última data d'activació
LastActivationAuthor=Autor de l'última activació
LastActivationIP=Última IP d'activació
LastActivationVersion=Última versió d'activació
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.
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.
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ó
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ó
DisableLinkToHelp=Amagueu l'enllaç a l'ajuda en línia "<b> %s </b>"
DisableLinkToHelpCenter=Amaga l'enllaç «<b>Necessites ajuda o assistència</b>» a la pàgina d'inici de sessió
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.
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
@ -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
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:
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
ThisForceAlsoTheme=Lús daquest gestor de menús també farà servir el seu propi tema sigui quina sigui lopció de lusuari. 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
ConnectionTimeout=Temps d'espera de connexió
ResponseTimeout=Timeout de resposta
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
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
@ -451,7 +452,7 @@ ExtrafieldCheckBox=Caselles de selecció
ExtrafieldCheckBoxFromList=Caselles de selecció des d'una taula
ExtrafieldLink=Enllaç a un objecte
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 lobjecte 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
ComputedpersistentDesc=Els camps addicionals calculats semmagatzemaran a la base de dades, però el valor només es recalcularà quan es canviï lobjecte daquest 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)
@ -512,8 +513,8 @@ DependsOn=Aquest mòdul necessita els mòduls
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 dun 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.
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>
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>
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 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 ...)
EnableDefaultValues=Activa la personalització dels valors predeterminats
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
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
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
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)
@ -663,7 +664,7 @@ Module2900Desc=Capacitats de conversió GeoIP Maxmind
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.
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
Module3400Desc=Activa els camps de les xarxes socials a tercers i adreces (skype, twitter, facebook...).
Module4000Name=RH
@ -704,8 +705,8 @@ Module62000Name=Incoterms
Module62000Desc=Afegeix funcions per a gestionar Incoterms
Module63000Name=Recursos
Module63000Desc=Gestiona els recursos (impressores, cotxes, habitacions...) que pots compartir en esdeveniments
Module66000Name=Enable OAuth2 authentication
Module66000Desc=Provide a tool to generate and manage OAuth2 tokens. The token can then be used by some other modules.
Module66000Name=Activa l'autenticació OAuth2
Module66000Desc=Proporcioneu una eina per a generar i gestionar fitxes OAuth2. El testimoni pot ser utilitzat per alguns altres mòduls.
Module94160Name=Recepcions
Permission11=Consulta les factures dels clients (i els cobraments)
Permission12=Crear/Modificar factures
@ -860,7 +861,7 @@ Permission331=Consultar bookmarks
Permission332=Crear/modificar bookmarks
Permission333=Eliminar bookmarks
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
Permission344=Modificar els seus propis permisos
Permission351=Consultar els grups
@ -980,9 +981,9 @@ Permission3301=Genera mòduls nous
Permission4001=Llegir habilitat/ocupació/posició
Permission4002=Crear/modificar habilitat/ocupació/posició
Permission4003=Esborra habilitat/ocupació/posició
Permission4021=Read evaluations (yours and your subordinates)
Permission4022=Create/modify evaluations
Permission4023=Validate evaluation
Permission4021=Consulta les avaluacions (teves i dels teus subordinats)
Permission4022=Crear/modificar avaluacions
Permission4023=Valida l'avaluació
Permission4025=Elimina l'avaluació
Permission4028=Veure menú comparatiu
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.
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.
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 #####
TypeOfSaleTaxes=Tipus dimpost sobre vendes
LTRate=Tarifa
@ -1208,7 +1209,7 @@ DoNotSuggestPaymentMode=No ho suggereixis
NoActiveBankAccountDefined=Cap compte bancari actiu definit
OwnerOfBankAccount=Titular del compte %s
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://...'
Alerts=Alertes
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.
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).
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 sauditen
NoSecurityEventsAreAduited=No saudita cap esdeveniment de seguretat. Podeu activar-les des del menú %s
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>.
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ó.
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".
AccountantDesc=Si teniu un comptable extern, podeu editar aquí la seva informació.
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
ToActivateModule=Per a activar mòduls, aneu a l'àrea de configuració (Inici->Configuració->Mòduls).
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 ladministrador del servidor que canviï la durada de la sessió.
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...).
@ -1310,7 +1311,7 @@ YouMustRunCommandFromCommandLineAfterLoginToUser=Heu d'executar aquesta ordre de
YourPHPDoesNotHaveSSLSupport=Funcions SSL no disponibles al vostre PHP
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
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
SimpleNumRefNoDateModelDesc=Retorna el número de referència en el format %s-nnnn on nnnn és un número dincrement automàtic seqüencial sense restablir
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>
YouMustEnableOneModule=Ha d'activar almenys 1 mòdul.
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
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
@ -1452,8 +1453,8 @@ SuppliersPayment=Pagaments a proveïdors
SupplierPaymentSetup=Configuració de pagaments a proveïdors
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.
InvoiceOptionCategoryOfOperations=Display the mention "category of operations" on the invoice.
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
InvoiceOptionCategoryOfOperations=Mostra la menció «categoria d'operacions» a la factura.
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
InvoiceOptionCategoryOfOperationsYes2=Sí, a la cantonada inferior esquerra
##### Proposals #####
@ -1700,7 +1701,7 @@ SyslogSetup=Configuració del mòdul Syslog
SyslogOutput=Sortida del log
SyslogFacility=Facilitat
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.
ErrorUnknownSyslogConstant=La constant %s no és una constant syslog coneguda
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
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...).
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
FCKeditorForUserSignature=Creació/edició WYSIWIG de la signatura de l'usuari
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.
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.
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 #####
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.
@ -1934,7 +1935,7 @@ SalariesSetup=Configuració del mòdul de salaris
SortOrder=Ordre de classificació
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
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
TemplatePDFExpenseReports=Plantilles de documents per a generar un document dinforme de despeses
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 darxiu de documents
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.
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ó.
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
@ -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>.
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
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
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)
@ -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_DIGITARIA_CLEAN_REGEX=Filtre Regex al valor net (COMPANY_DIGITARIA_CLEAN_REGEX)
COMPANY_DIGITARIA_UNIQUE_CODE=No es permet la duplicació
RemoveSpecialWords=Clean certain words when generating sub-accounts for customers or suppliers
RemoveSpecialWordsHelp=Specify the words to be cleaned before calculating the customer or supplier account. Use a ";" between each word
RemoveSpecialWords=Netegeu certes paraules en generar subcomptes per a clients o proveïdors
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)
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ó
@ -2139,7 +2140,7 @@ CodeLastResult=Últim codi retornat
NbOfEmailsInInbox=Nombre de correus electrònics en el directori font
LoadThirdPartyFromName=Carregueu la cerca de tercers al %s (només carrega)
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.
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
@ -2243,12 +2244,12 @@ MailToPartnership=Associació
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
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)
RecommendedValueIs=Recomanat: %s
Recommended=Recomanada
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
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ó
@ -2296,17 +2297,17 @@ LateWarningAfter=Avís "tard" després
TemplateforBusinessCards=Plantilla per a una targeta de visita de diferents mides
InventorySetup= Configuració de l'inventari
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
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
Settings = Configuració
WebhookSetupPage = Pàgina de configuració del webhook
ShowQuickAddLink=Mostra un botó per a afegir ràpidament un element al menú superior dret
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
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")
@ -2341,34 +2342,37 @@ UsePassword=Utilitzeu una contrasenya
UseOauth=Utilitzeu un testimoni OAUTH
Images=Imatges
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:
ScriptIsEmpty=El guió és buit
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
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ó
CssOnView=Css a les pàgines de visualització
CssOnList=Css a les pàgines de llistat
HelpCssOnEditDesc=The Css used when editing the field.<br>Example: "minwiwdth100 maxwidth500 widthcentpercentminusx"
HelpCssOnViewDesc=The Css used when viewing the field.
HelpCssOnListDesc=The Css used when field is inside a list table.<br>Example: "tdoverflowmax200"
RECEPTION_PDF_HIDE_ORDERED=Hide the quantity ordered on the generated documents for receptions
MAIN_PDF_RECEPTION_DISPLAY_AMOUNT_HT=Show the price on the generated documents for receptions
HelpCssOnEditDesc=El Css utilitzat en editar el camp.<br>Exemple: «minwiwdth100 maxwidth500 widthcentpercentminusx»
HelpCssOnViewDesc=El Css utilitzat en visualitzar el camp.
HelpCssOnListDesc=El Css utilitzat quan el camp es troba dins d'una taula de llista.<br>Exemple: «tdoverflowmax200»
RECEPTION_PDF_HIDE_ORDERED=Amaga la quantitat demanada als documents generats per a recepcions
MAIN_PDF_RECEPTION_DISPLAY_AMOUNT_HT=Mostra el preu als documents generats per a recepcions
WarningDisabled=Avís desactivat
LimitsAndMitigation=Límits d'accés i mitigació
DesktopsOnly=Només escriptoris
DesktopsAndSmartphones=Escriptoris i telèfons intel·ligents
AllowOnlineSign=Permet la signatura en línia
AllowExternalDownload=Allow external download (without login, using a shared link)
DeadlineDayVATSubmission=Deadline day for vat submission on the next month
AllowExternalDownload=Permet la baixada externa (sense iniciar sessió, mitjançant un enllaç compartit)
DeadlineDayVATSubmission=Dia límit per a la presentació del IVA el mes següent
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
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.
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.
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).
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=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=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=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
ShippingValidated= Enviament %s validat
InterventionSentByEMail=Intervenció %s enviada per e-mail
ProjectSentByEMail=Project %s sent by email
ProjectSentByEMail=Projecte %s enviat per correu electrònic
ProposalDeleted=Pressupost esborrat
OrderDeleted=Comanda 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_MODIFYInDolibarr=S'ha modificat la sol·licitud de permís %s
HOLIDAY_APPROVEInDolibarr=Sol·licitud de dies lliures %s aprovada
HOLIDAY_VALIDATEInDolibarr=La sol·licitud dexcedència %s validada
HOLIDAY_VALIDATEInDolibarr=Sol·licitud de dies lliures %s validada
HOLIDAY_DELETEInDolibarr=S'ha suprimit la sol·licitud de permís %s
EXPENSE_REPORT_CREATEInDolibarr=Creat 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
AgendaExtNb=Calendari núm. %s
ExtSiteUrlAgenda=URL per a accedir al fitxer .ical
ExtSiteNoLabel=Sense descripció
ExtSiteNoLabel=Sense nom
VisibleTimeRange=Rang de temps visible
VisibleDaysRange=Rang de dies visible
AddEvent=Crear esdeveniment

View File

@ -25,7 +25,7 @@ InitialBankBalance=Saldo inicial
EndBankBalance=Saldo final
CurrentBalance=Saldo actual
FutureBalance=Saldo previst
ShowAllTimeBalance=Mostar balanç des de principi
ShowAllTimeBalance=Mostra el saldo des de l'inici
AllTime=Des del principi
Reconciliation=Conciliació
RIB=Compte bancari
@ -144,7 +144,7 @@ AllAccounts=Tots els comptes bancaris i en efectiu
BackToAccount=Tornar al compte
ShowAllAccounts=Mostra per a tots els comptes
FutureTransaction=Transacció futura. No és possible conciliar.
SelectChequeTransactionAndGenerate=Seleccioneu / filtreu els xecs que sinclouran 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
EventualyAddCategory=Finalment, especifiqueu una categoria on classificar els registres
ToConciliate=A conciliar?

View File

@ -13,7 +13,7 @@ BillsStatistics=Estadístiques factures a clients
BillsStatisticsSuppliers=Estadístiques de Factures de proveïdors
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.
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
InvoiceStandard=Factura estàndard
InvoiceStandardAsk=Factura estàndard
@ -99,12 +99,12 @@ PaymentAmount=Import pagament
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.
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"
ClassifyUnPaid=Classifica &quot;sense pagar&quot;
ClassifyPaidPartially=Classifica "Pagat parcialment"
ClassifyCanceled=Classifica "Abandonat"
ClassifyClosed=Classifica "Tancat"
ClassifyUnBilled=Classifiqueu 'facturar'
ClassifyPaid=Marca «Pagat»
ClassifyUnPaid=Marca «No pagat»
ClassifyPaidPartially=Marca «Pagat parcialment»
ClassifyCanceled=Marca «Abandonats»
ClassifyClosed=Marca «Tancat»
ClassifyUnBilled=Marca «No facturat»
CreateBill=Crear factura
CreateCreditNote=Crear 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)
BillStatusCanceled=Abandonada
BillStatusValidated=Validada (a pagar)
BillStatusStarted=Pagada parcialment
BillStatusStarted=Començat
BillStatusNotPaid=Pendent
BillStatusNotRefunded=No reemborsat
BillStatusClosedUnpaid=Tancada (Pendent)
@ -143,7 +143,7 @@ Refunded=Reemborsada
BillShortStatusConverted=Tractada
BillShortStatusCanceled=Abandonada
BillShortStatusValidated=Validada
BillShortStatusStarted=Començada
BillShortStatusStarted=Començat
BillShortStatusNotPaid=Pendent
BillShortStatusNotRefunded=No reemborsat
BillShortStatusClosedUnpaid=Tancada
@ -172,7 +172,7 @@ NewBill=Factura nova
LastBills=Últimes %s factures
LatestTemplateInvoices=Últimes %s plantilles de factura
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
LastSuppliersBills=Últimes %s factures de proveïdor
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?
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>?
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?
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.
@ -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
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
ConfirmClassifyPaidPartiallyReasonBankCharge=Deducció per banc (comissions bancàries intermediaris)
ConfirmClassifyPaidPartiallyReasonBankCharge=Deducció per banc (comissions bancàries)
ConfirmClassifyPaidPartiallyReasonProductReturned=Productes retornats en part
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ó»)
@ -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
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
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ó dun abonament.
ConfirmClassifyAbandonReasonOther=Altres
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
NoOpenInvoice=No hi ha factura oberta
NbOfOpenInvoices=Nombre de factures obertes
ClassifyBill=Classifica la factura
ClassifyBill=Marca la factura
SupplierBillsToPay=Factures de proveïdors pendents de pagament
CustomerBillsUnpaid=Factures de client pendents de cobrament
NonPercuRecuperable=No percebut recuperable
@ -535,12 +535,12 @@ CantRemovePaymentSalaryPaid=No es pot eliminar el pagament perquè el salari est
ExpectedToPay=Esperant el pagament
CantRemoveConciliatedPayment=No es pot eliminar el pagament reconciliat
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.
ClosePaidCreditNotesAutomatically=Classifiqueu automàticament totes les notes de crèdit com a "Pagades" quan es faci la devolució íntegra.
ClosePaidContributionsAutomatically=Classifiqueu automàticament totes les contribucions socials o fiscals com a "Pagades" quan el pagament es realitzi íntegrament.
ClosePaidVATAutomatically=Classifica automàticament la declaració d'IVA com a "Pagada" quan el pagament es realitzi completament.
ClosePaidSalaryAutomatically=Classifiqueu automàticament el salari com a "Pagat" quan el pagament es faci completament.
AllCompletelyPayedInvoiceWillBeClosed=Totes les factures no pendents de pagament es tancaran automàticament amb l'estat "Pagat".
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=Marca automàticament totes les notes de crèdit com a «Pagades» quan el reemborsament s'hagi fet completament.
ClosePaidContributionsAutomatically=Marca automàticament totes les cotitzacions socials o fiscals com a "Pagades" quan el pagament s'hagi fet íntegrament.
ClosePaidVATAutomatically=Marca automàticament la declaració d'IVA com a «Pagada» quan el pagament s'hagi fet completament.
ClosePaidSalaryAutomatically=Marca automàticament el sou com a «Pagat» quan el pagament s'hagi fet completament.
AllCompletelyPayedInvoiceWillBeClosed=Totes les factures sense pagaments pendents es tancaran automàticament amb l'estat «Pagat».
ToMakePayment=Pagar
ToMakePaymentBack=Reemborsar
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 dincrement 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 davanç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.
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 davanç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
EarlyClosingComment=Nota de tancament anticipat
##### 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
MakePaymentAndClassifyPayed=Registre de pagament
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
MentionCategoryOfOperations0=Lliurament de mercaderies
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
BoxLastContacts=Últims contactes/adreces
BoxLastMembers=Últims socis
BoxLastModifiedMembers=Darrers membres modificats
BoxLastMembersSubscriptions=Últimes subscripcions de membres
BoxLastModifiedMembers=Últims socis modificats
BoxLastMembersSubscriptions=Últimes subscripcions de socis
BoxFicheInter=Últimes intervencions
BoxCurrentAccounts=Balanç de comptes oberts
BoxTitleMemberNextBirthdays=Aniversaris d'aquest mes (membres)
BoxTitleMembersByType=Membres per tipus i estat
BoxTitleMembersByTags=Members by tags and status
BoxTitleMembersByTags=Socis per etiquetes i estat
BoxTitleMembersSubscriptionsByYear=Subscripcions de membres per any
BoxTitleLastRssInfos=Últimes %s notícies de %s
BoxTitleLastProducts=Productes / Serveis: últims %s modificats
@ -33,8 +33,8 @@ BoxTitleLastSuppliers=Últims %s proveïdors registrats
BoxTitleLastModifiedSuppliers=Proveïdors: últims %s modificats
BoxTitleLastModifiedCustomers=Clients: últims %s modificats
BoxTitleLastCustomersOrProspects=Últims %s clients o clients potencials
BoxTitleLastCustomerBills=Darreres %s factures a client modificades
BoxTitleLastSupplierBills=Darreres %s factures de proveïdor modificades
BoxTitleLastCustomerBills=Últimes %s factures de client modificades
BoxTitleLastSupplierBills=Últimes %s factures de proveïdor modificades
BoxTitleLastModifiedProspects=Clients Potencials: últims %s modificats
BoxTitleLastModifiedMembers=Últims %s socis
BoxTitleLastFicheInter=Últimes %s intervencions modificades
@ -48,12 +48,12 @@ BoxOldestExpiredServices=Serveis antics expirats
BoxOldestActions=Els esdeveniments més antics per a fer
BoxLastExpiredServices=Últims %s contactes amb serveis actius expirats
BoxTitleLastActionsToDo=Últimes %s accions a fer
BoxTitleOldestActionsToDo=Oldest %s events to do, not completed
BoxTitleLastContracts=Últims contractes %s que es van modificar
BoxTitleLastModifiedDonations=Últimes donacions %s que es van modificar
BoxTitleLastModifiedExpenses=Últims informes de despeses %s que es van modificar
BoxTitleLatestModifiedBoms=Últims BOMs %s que es van modificar
BoxTitleLatestModifiedMos=Últimes comandes de fabricació %s que es van modificar
BoxTitleOldestActionsToDo=Els esdeveniments %s més antics per a fer, no s'han completat
BoxTitleLastContracts=Últims %s contractes que s'han modificat
BoxTitleLastModifiedDonations=Últimes %s donacions que s'han modificat
BoxTitleLastModifiedExpenses=Últims %s informes de despeses que s'han modificat
BoxTitleLatestModifiedBoms=Últims %s BOMs que s'han modificat
BoxTitleLatestModifiedMos=Últimes %s ordres de fabricació modificades
BoxTitleLastOutstandingBillReached=Clients que han superat el màxim pendent
BoxGlobalActivity=Activitat global
BoxGoodCustomers=Bons clients
@ -61,7 +61,7 @@ BoxTitleGoodCustomers=% bons clients
BoxScheduledJobs=Tasques programades
BoxTitleFunnelOfProspection=Oportunitat embut
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.
ClickToAdd=Feu clic aquí per a afegir.
NoRecordedCustomers=Cap client registrat
@ -94,8 +94,8 @@ BoxTitleLatestModifiedSupplierOrders=Comandes a Proveïdor: últimes %s modifica
BoxTitleLastModifiedCustomerBills=Factures del client: últimes %s modificades
BoxTitleLastModifiedCustomerOrders=Comandes de venda: últimes %s modificades
BoxTitleLastModifiedPropals=Últims %s pressupostos modificats
BoxTitleLatestModifiedJobPositions=Últims llocs de treball modificats %s
BoxTitleLatestModifiedCandidatures=Últimes aplicacions de treball modificades %s
BoxTitleLatestModifiedJobPositions=Últims %s llocs de treball modificats
BoxTitleLatestModifiedCandidatures=Últimes %s sol·licituds de feina modificades
ForCustomersInvoices=Factures a clients
ForCustomersOrders=Comandes de clients
ForProposals=Pressupostos
@ -103,7 +103,7 @@ LastXMonthRolling=Els últims %s mesos consecutius
ChooseBoxToAdd=Afegeix 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)
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
NoRecordedManualEntries=No hi ha registres d'entrades manuals en comptabilitat
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
MembersHome=Membres a casa
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
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
ValidatedProjects=Projectes validats

View File

@ -312,7 +312,7 @@ CustomerRelativeDiscountShort=Descompte relatiu
CustomerAbsoluteDiscountShort=Descompte fixe
CompanyHasRelativeDiscount=Aquest client té un descompte per defecte de <b>%s%%</b>
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
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
@ -357,7 +357,7 @@ RequiredIfSupplier=Obligatori si un tercer és proveïdor
ValidityControledByModule=Validesa controlada pel mòdul
ThisIsModuleRules=Regles per a aquest mòdul
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
ListOfContactsAddresses=Llistat de contactes
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.
VATIntraCheckURL=http://ec.europa.eu/taxation_customs/vies/vieshome.do
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).
NorProspectNorCustomer=Ni client, ni client potencial
JuridicalStatus=Tipus d'entitat empresarial
@ -462,7 +462,7 @@ ListSuppliersShort=Llistat de proveïdors
ListProspectsShort=Llistat de clients potencials
ListCustomersShort=Llistat de clients
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
InActivity=Actiu
ActivityCeased=Tancat
@ -499,7 +499,7 @@ OutOfEurope=Fora dEuropa (CEE)
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 dafegir el producte al TPV.
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
ShowSocialNetworks=Mostra les xarxes socials
HideSocialNetworks=Amaga les xarxes socials

View File

@ -1,13 +1,13 @@
# Dolibarr language file - Source file is en_US - compta
MenuFinancial=Financera
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
OptionModeTrue=Opció Ingressos-Despeses
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.
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.
LTReportBuildWithOptionDefinedInModule=Els imports obtinguts es calculen segons la configuració de l'Empresa
Param=Configuració
@ -73,7 +73,7 @@ SocialContributions=Impostos varis
SocialContributionsDeductibles=Impostos varis deduïbles
SocialContributionsNondeductibles=Impostos varis no deduïbles
DateOfSocialContribution=Data de limpost social o fiscal
LabelContrib=Aportació d'etiquetes
LabelContrib=Nom d'aportació
TypeContrib=Tipus d'aportació
MenuSpecialExpenses=Pagaments especials
MenuTaxAndDividends=Impostos i càrregues
@ -132,7 +132,7 @@ ByThirdParties=Per tercer
ByUserAuthorOfInvoice=Per autor de la factura
CheckReceipt=Ingrés de xec
CheckReceiptShort=Ingrés de xec
LastCheckReceiptShort=Últimes %s remeses de xec
LastCheckReceiptShort=Últims %s rebuts de xec
NewCheckReceipt=Descompte nou
NewCheckDeposit=Ingrés nou
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
PayVAT=Paga una declaració dIVA
PaySalary=Pagar una targeta salarial
ConfirmPaySocialContribution=Esteu segur que voleu classificar aquest impost varis com a pagat?
ConfirmPayVAT=Esteu segur que voleu classificar aquesta declaració d'IVA com a pagada?
ConfirmPaySalary=Esteu segur que voleu classificar aquesta targeta salarial com a pagada?
ConfirmPaySocialContribution=Esteu segur que voleu marcar aquest impost varis com a pagat?
ConfirmPayVAT=Esteu segur que voleu marcar aquesta declaració d'IVA com a pagada?
ConfirmPaySalary=Esteu segur que voleu marcar aquesta fitxa salarial com a pagada?
DeleteSocialContribution=Elimina un pagament d'impost varis
DeleteVAT=Suprimeix una declaració dIVA
DeleteSalary=Elimina una fitxa salarial
@ -236,7 +236,7 @@ Pcg_subtype=Subtipus de compte
InvoiceLinesToDispatch=Línies de factures a desglossar
ByProductsAndServices=Per producte i servei
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
Mode1=Mètode 1
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_Desc=El compte comptable dedicat definit a la fitxa de tercer només sutilitzarà 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_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
ConfirmCloneVAT=Confirma la còpia duna declaració dIVA
ConfirmCloneSalary=Confirmeu el clon d'un salari

View File

@ -57,12 +57,12 @@ LastContracts=Últims %s contractes
LastModifiedServices=Últims %s serveis modificats
ContractStartDate=Data inici
ContractEndDate=Data finalització
DateStartPlanned=Data prevista posada en servei
DateStartPlannedShort=Data inici prevista
DateStartPlanned=Data d'inici prevista
DateStartPlannedShort=Data d'inici prevista
DateEndPlanned=Data prevista finalització del servei
DateEndPlannedShort=Data final prevista
DateStartReal=Data real posada en servei
DateStartRealShort=Data inici
DateStartReal=Data d'inici real
DateStartRealShort=Data d'inici real
DateEndReal=Data real finalització del servei
DateEndRealShort=Data real finalització
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
StandardContractsTemplate=Plantilla de contracte Standard
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>?
LowerDateEndPlannedShort=Baixa data de finalització planificada dels serveis actius
SendContractRef=Informació del contracte __REF__

View File

@ -64,7 +64,7 @@ CronTaskInactive=Aquest treball està desactivat (no programat)
CronId=Id
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>
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>
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>

View File

@ -5,7 +5,7 @@ ECMSectionManual=Carpeta manual
ECMSectionAuto=Carpeta automàtica
ECMSectionsManual=Arbre manual
ECMSectionsAuto=Arbre automàtic
ECMSectionsMedias=Medias tree
ECMSectionsMedias=Arbre dels multimèdia
ECMSections=Carpetes
ECMRoot=Arrel del ECM
ECMNewSection=Carpeta nova
@ -17,9 +17,9 @@ ECMNbOfFilesInSubDir=Nombre d'arxius en les subcarpetes
ECMCreationUser=Creador
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.
ECMAreaDesc2a=* Manual directories can be used to save documents not linked to a particular element.
ECMAreaDesc2b=* Automatic directories are filled automatically when adding documents from the page of an 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.
ECMAreaDesc2a=* Els directoris manuals es poden utilitzar per a desar documents no vinculats a un element concret.
ECMAreaDesc2b=* Els directoris automàtics s'omplen automàticament quan s'afegeixen documents des de la pàgina d'un element.
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
ECMSectionWasCreated=S'ha creat el directori <b>%s</b>.
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.
ErrorRecordNotFound=Registre 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>'.
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>'
ErrorFailToRenameDir=Error al renomenar la carpeta '<b>%s</b>' a '<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.
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
ErrorFileNotFound=Arxiu no trobat (ruta incorrecta, permisos incorrectes o accés prohibit pel paràmetre openbasedir)
ErrorDirNotFound=Directori <b>%s</b> no trobat (Ruta incorrecta, permisos inadequats o accés prohibit pel paràmetre PHP openbasedir o safe_mode)
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=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.
ErrorDirAlreadyExists=Ja existeix una carpeta 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ó
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.
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.
ErrorPleaseTypeBankTransactionReportName=Introduïu el nom de lextracte bancari on sha dinformar de lentrada (format AAAAAMM o AAAAAMMDD)
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 '
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
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
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.
@ -125,7 +125,7 @@ ErrorCantReadFile=Error de lectura del fitxer '%s'
ErrorCantReadDir=Error de lectura de la carpeta '%s'
ErrorBadLoginPassword=Identificadors d'usuari o contrasenya incorrectes
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
ErrorLoginDoesNotExists=El compte d'usuari de <b>%s</b> no s'ha trobat.
ErrorLoginHasNoEmail=Aquest usuari no té e-mail. Impossible continuar.
@ -136,7 +136,7 @@ ErrorLinesCantBeNegativeForOneVATRate=El total de línies (net dimpostos) 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
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ò
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
ErrNoZipEngine=No engine to zip/unzip %s file in this PHP
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"
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
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.
ErrorAddAtLeastOneLineFirst=Afegeix almenys una primera línia
ErrorRecordAlreadyInAccountingDeletionNotPossible=Error, el registre ja sha 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
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
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ó
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
@ -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.
ErrorIsNotADraft=%s no és un esborrany
ErrorExecIdFailed=No es pot executar l'ordre "id"
ErrorBadCharIntoLoginName=Unauthorized character in the field %s
ErrorRequestTooLarge=Error, request too large or session expired
ErrorBadCharIntoLoginName=Caràcter no autoritzat al camp %s
ErrorRequestTooLarge=Error, sol·licitud massa gran o sessió caducada
ErrorNotApproverForHoliday=No sou l'autor de l'abandonament %s
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
@ -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
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 +
ErrorTableNotFound=Table <b>%s</b> not found
ErrorValueForTooLow=Value for <b>%s</b> is too low
ErrorValueCantBeNull=Value for <b>%s</b> can't be null
ErrorDateOfMovementLowerThanDateOfFileTransmission=The date of the bank transaction can't be lower than the date of the file transmission
ErrorTooMuchFileInForm=Too much files in form, the maximum number is %s file(s)
ErrorSessionInvalidatedAfterPasswordChange=The session was been invalidated following a change of password, status or dates of validity. Please relogin.
ErrorExistingPermission = Permission <b>%s</b> for object <b>%s</b> already exists
ErrorFieldExist=The value for <b>%s</b> already exist
ErrorEqualModule=Module invalid in <b>%s</b>
ErrorFieldValue=Value for <b>%s</b> is incorrect
ErrorCoherenceMenu=<b>%s</b> is required when <b>%</b> equal LEFT
ErrorTableNotFound=No s'ha trobat la taula <b>%s</b>
ErrorValueForTooLow=El valor de <b>%s</b> és massa baix
ErrorValueCantBeNull=El valor de <b>%s</b> no pot ser nul
ErrorDateOfMovementLowerThanDateOfFileTransmission=La data de la transacció bancària no pot ser inferior a la data de transmissió del fitxer
ErrorTooMuchFileInForm=Hi ha massa fitxers en el formulari, el nombre màxim és de %s fitxers
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 = Ja existeix el permís <b>%s</b> per a l'objecte <b>%s</b>
ErrorFieldExist=El valor de <b>%s</b> ja existeix
ErrorEqualModule=El mòdul no és vàlid a <b>%s</b>
ErrorFieldValue=El valor de <b>%s</b> és incorrecte
ErrorCoherenceMenu= <b>%s</b> és necessari quan <b>%s</b> és «left»
# Warnings
WarningParamUploadMaxFileSizeHigherThanPostMaxSize=El paràmetre PHP upload_max_filesize (%s) és superior al paràmetre PHP post_max_size (%s). No es tracta duna 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".
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.
WarningAutoValNotPossibleWhenStockIsDecreasedOnInvoiceVal=Automatic validation is disabled when option to decrease stock is set on "Invoice validation".
WarningModuleNeedRefrech = Module <b>%s</b> has been disabled. Don't forget to enable it
WarningAutoValNotPossibleWhenStockIsDecreasedOnInvoiceVal=La validació automàtica es desactiva quan l'opció de disminució d'estoc s'estableix a "Validació de la factura".
WarningModuleNeedRefrech = El mòdul <b>%s</b> s'ha desactivat. No oblideu activar-lo
# Validate
RequireValidValue = El valor no és vàlid

View File

@ -3,10 +3,10 @@ CommunitySupport=Assistència Forums i Wiki
EMailSupport=Assistència E-Mail
RemoteControlSupport=Suport en línia en temps real / remot
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
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
TypeSupportCommunauty=Comunitari (gratuït)
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):
PossibleLanguages=Idiomes disponibles
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
NotActiveModCP=Heu d'habilitar el mòdul Dies lliures per a veure aquesta pàgina.
AddCP=Feu una sol·licitud de dia lliure
DateDebCP=Data inici
DateDebCP=Data d'inici
DateFinCP=Data fi
DraftCP=Esborrany
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".
fusionGroupsUsers=El camp de grups i el camp d'usuari es fusionaran
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
UserUpdateCP=Actualitzat per a
PrevSoldeCP=Saldo anterior
@ -107,7 +107,7 @@ HolidaysCancelation=Cancel·lació de la sol·licitud de dies lliures
EmployeeLastname=Cognoms de l'empleat
EmployeeFirstname=Nom de l'empleat
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
HalfDay=Mig dia
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.
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
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
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
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.
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.
HolidaySetup=Configuració del mòdul 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
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
IncreaseHolidays=Increase leave balance
HolidayRecordsIncreased= %s leave balances increased
HolidayRecordIncreased=Leave balance increased
ConfirmMassIncreaseHoliday=Bulk leave balance increase
NumberDayAddMass=Number of day to add to the selection
ConfirmMassIncreaseHolidayQuestion=Are you sure you want to increase holiday of the %s selected record(s)?
IncreaseHolidays=Augmentar el saldo de dies lliures
HolidayRecordsIncreased= %s saldos de dies lliures augmentats
HolidayRecordIncreased=Saldo de dies lliures augmentat
ConfirmMassIncreaseHoliday=Augment massiu del saldo de dies lliures
NumberDayAddMass=Nombre de dia per a afegir a la selecció
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

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.
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ó.
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.
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
@ -82,7 +82,7 @@ GoToDolibarr=Aneu a Dolibarr
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ó.
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).
LoginAlreadyExists=Ja existeix
DolibarrAdminLogin=Nom d'usuari dadministrador de Dolibarr
@ -94,7 +94,7 @@ ChoosedMigrateScript=Elecció de l'script de migració
DataMigration=Migració de la base de dades (dades)
DatabaseMigration=Migració de la base de dades (estructura + algunes dades)
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ó
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ó
@ -129,7 +129,7 @@ MigrationCustomerOrderShipping=Migració de dades d'enviament de comandes de ven
MigrationShippingDelivery=Actualització de les dades d'enviaments
MigrationShippingDelivery2=Actualització de les dades d'enviaments 2
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
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ó...
@ -157,7 +157,7 @@ MigrationPaymentsUpdate=Actualització dels pagaments (vincle nn pagaments-factu
MigrationPaymentsNumberToUpdate=%s pagament(s) a actualitzar
MigrationProcessPaymentUpdate=Actualització pagament(s) %s
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)
MigrationContractsNumberToUpdate=%s contracte(s) a actualitzar
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.
MigrationContractsEmptyDatesUpdate=Correcció de la data buida de contracte
MigrationContractsEmptyDatesUpdateSuccess=La correcció de la data buida del contracte s'ha realitzat correctament
MigrationContractsEmptyDatesNothingToUpdate=No hi ha data de contracte buida per corregir
MigrationContractsEmptyCreationDatesNothingToUpdate=No hi ha data de creació del contracte per corregir
MigrationContractsEmptyDatesNothingToUpdate=Cap data de contracte buida a corregir
MigrationContractsEmptyCreationDatesNothingToUpdate=Cap data de creació de contracte a corregir
MigrationContractsInvalidDatesUpdate=Correcció del valor incorrecte de la data de contracte
MigrationContractsInvalidDateFix=Corregir contracte %s (data contracte=%s, Data posada en servei min=%s)
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)
ShowNotAvailableOptions=Mostra 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>
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ó
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
FunctionTest=Prova de funció
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:
DocumentModelStandard=Document model estàndard per a intervencions
InterventionCardsAndInterventionLines=Fitxes i línies d'intervenció
InterventionClassifyBilled=Classifica "Facturat"
InterventionClassifyUnBilled=Classifica "No facturat"
InterventionClassifyDone=Classifica com a "Fet"
InterventionClassifyBilled=Marca «Facturat»
InterventionClassifyUnBilled=Marca «No facturat»
InterventionClassifyDone=Marca «Fet»
StatusInterInvoiced=Facturada
SendInterventionRef=Presentar intervenció %s
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
NbOfinterventions=Nombre de fitxers dintervenció
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ó
InterRef=Ref. d'intervenció
InterDateCreation=Data de creació de la intervenció

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