Merge branch '16.0' into 16.0-issue-24414
@ -56,10 +56,6 @@ jobs:
|
||||
if: type = push AND branch = develop
|
||||
php: nightly
|
||||
env: DB=mysql
|
||||
- stage: PHP Dev
|
||||
if: type = push AND branch = 15.0
|
||||
php: nightly
|
||||
env: DB=mysql
|
||||
|
||||
notifications:
|
||||
email:
|
||||
|
||||
49
ChangeLog
@ -3,6 +3,55 @@ English Dolibarr ChangeLog
|
||||
--------------------------------------------------------------
|
||||
|
||||
|
||||
***** ChangeLog for 16.0.5 compared to 16.0.4 *****
|
||||
|
||||
FIX: 16.0 propalestats Unknown column 'p.fk_soc' in 'on clause'
|
||||
FIX: #23804
|
||||
FIX: #23860
|
||||
FIX: #23966 Error "Param dbt_keyfield is required but not defined"
|
||||
FIX: accountancy lettering: better error management
|
||||
FIX: accountancy lettering: correctly calculated number of lettering operations done
|
||||
FIX: accountancy lettering: error management and prevention
|
||||
FIX: accountancy lettering: prevent null results when fetching link with payments
|
||||
FIX: Add missing hook on LibStatut
|
||||
FIX: Add more context for selectForFormsListWhere Hook
|
||||
FIX: attach file and send by mail in ticket
|
||||
FIX: bad check on if in get_all_ways
|
||||
FIX: Cannot import find type_fees with cgenericdic.class because it has id and not rowid
|
||||
FIX: clicktodial backtopage
|
||||
FIX: discount wasn't taken into account when adding a line in BOM
|
||||
FIX: expense reports: error when selecting mileage fees expense type if MAIN_USE_EXPENSE_IK disabled
|
||||
FIX: expense reports: JS error when selecting mileage fees expense type if MAIN_USE_EXPENSE_IK disabled
|
||||
FIX: Extrafields in Notes to unify with orders or invoices.
|
||||
FIX: fatal error on clicktodial backtopage
|
||||
FIX: filter sql accounting account
|
||||
FIX: Get data back on product update
|
||||
FIX: Get data back when error on command create
|
||||
FIX: label dictionary is used by barcode and member module
|
||||
FIX: mandatory date for service didnt work for invoice
|
||||
FIX: missing "authorid" for getNomUrl link right access
|
||||
FIX: missing getEntity filter
|
||||
FIX: vulnerability: missing protection on ajax public ticket page for valid email.
|
||||
FIX: Missing right to edit service note when module product is disabled
|
||||
FIX: multicompany compatibility
|
||||
FIX: object $user is not defined
|
||||
FIX: Object of class LDAP\Connection could not be converted to string
|
||||
FIX: parse error and NAN
|
||||
FIX: product ref fourn same size in supplier order/invoice as in product price fourn
|
||||
FIX: Profit calculation on project preview tab.
|
||||
FIX: Remove orphelan $this->db->rollback() in the function insertExtrafields()
|
||||
FIX: request new password with "mc" and "twofactor" authentication
|
||||
FIX: Resolve error message due to missing arguments
|
||||
FIX: select for task in event card
|
||||
FIX: several email sent to the same recipient when adding message from ticket
|
||||
FIX: shipping list for external user
|
||||
FIX: SQL error "unknown column p.fk_soc" because ANSI-92 joins take precedence over ANSI-89 joins
|
||||
FIX: strato pdf
|
||||
FIX: typos in getAttchments() $arrayobject
|
||||
FIX: whitespaces
|
||||
FIX: wrong url param name action
|
||||
|
||||
|
||||
***** ChangeLog for 16.0.4 compared to 16.0.3 *****
|
||||
|
||||
FIX: Amount of localtax1 and 2 not correctly save on purchase order (the rate was saved instead)
|
||||
|
||||
@ -55,9 +55,10 @@ if (empty($argv[1])) {
|
||||
|
||||
|
||||
$i=0;
|
||||
$result = array();
|
||||
while ($i < $argc) {
|
||||
if (! empty($argv[$i])) {
|
||||
parse_str($argv[$i]); // set all params $release, $includecustom, $includeconstant, $buildzip ...
|
||||
if (!empty($argv[$i])) {
|
||||
parse_str($argv[$i], $result); // set all params $release, $includecustom, $includeconstant, $buildzip ...
|
||||
}
|
||||
if (preg_match('/includeconstant=/', $argv[$i])) {
|
||||
$tmp=explode(':', $includeconstant, 3); // $includeconstant has been set with previous parse_str()
|
||||
|
||||
@ -743,7 +743,7 @@ class AccountancyCategory // extends CommonObject
|
||||
}
|
||||
$listofaccount .= "'".$cptcursor."'";
|
||||
}
|
||||
$sql .= " AND t.numero_compte IN (".$this->db->sanitize($listofaccount).")";
|
||||
$sql .= " AND t.numero_compte IN (".$this->db->sanitize($listofaccount, 1).")";
|
||||
} else {
|
||||
$sql .= " AND t.numero_compte = '".$this->db->escape($cpt)."'";
|
||||
}
|
||||
@ -861,20 +861,29 @@ class AccountancyCategory // extends CommonObject
|
||||
exit();
|
||||
}
|
||||
|
||||
$pcgverid = $conf->global->CHARTOFACCOUNTS;
|
||||
$pcgvercode = dol_getIdFromCode($this->db, $pcgverid, 'accounting_system', 'rowid', 'pcg_version');
|
||||
if (empty($pcgvercode)) {
|
||||
$pcgvercode = $pcgverid;
|
||||
}
|
||||
|
||||
if (!empty($cat_id)) {
|
||||
$sql = "SELECT t.rowid, t.account_number, t.label as account_label";
|
||||
$sql .= " FROM ".MAIN_DB_PREFIX."accounting_account as t";
|
||||
$sql .= " WHERE t.fk_accounting_category = ".((int) $cat_id);
|
||||
$sql .= " AND t.entity = ".$conf->entity;
|
||||
$sql .= " AND t.active = 1";
|
||||
$sql .= " AND t.fk_pcg_version = '".$this->db->escape($pcgvercode)."'";
|
||||
$sql .= " ORDER BY t.account_number";
|
||||
} else {
|
||||
$sql = "SELECT t.rowid, t.account_number, t.label as account_label";
|
||||
$sql .= " FROM ".MAIN_DB_PREFIX."accounting_account as t";
|
||||
$sql .= " WHERE ".$predefinedgroupwhere;
|
||||
$sql .= " AND t.entity = ".$conf->entity;
|
||||
$sql .= ' AND t.active = 1';
|
||||
$sql .= " AND t.fk_pcg_version = '".$this->db->escape($pcgvercode)."'";
|
||||
$sql .= " ORDER BY t.account_number";
|
||||
}
|
||||
//echo $sql;
|
||||
|
||||
$resql = $this->db->query($sql);
|
||||
if ($resql) {
|
||||
|
||||
@ -297,6 +297,7 @@ class Lettering extends BookKeeping
|
||||
// Update request
|
||||
|
||||
$now = dol_now();
|
||||
$affected_rows = 0;
|
||||
|
||||
if (!$error) {
|
||||
$sql = "UPDATE ".MAIN_DB_PREFIX."accounting_bookkeeping SET";
|
||||
@ -309,6 +310,8 @@ class Lettering extends BookKeeping
|
||||
if (!$resql) {
|
||||
$error++;
|
||||
$this->errors[] = "Error ".$this->db->lasterror();
|
||||
} else {
|
||||
$affected_rows = $this->db->affected_rows($resql);
|
||||
}
|
||||
}
|
||||
|
||||
@ -320,7 +323,7 @@ class Lettering extends BookKeeping
|
||||
}
|
||||
return -1 * $error;
|
||||
} else {
|
||||
return 1;
|
||||
return $affected_rows;
|
||||
}
|
||||
}
|
||||
|
||||
@ -355,7 +358,7 @@ class Lettering extends BookKeeping
|
||||
}
|
||||
return -1 * $error;
|
||||
} else {
|
||||
return 1;
|
||||
return $this->db->affected_rows($resql);
|
||||
}
|
||||
}
|
||||
|
||||
@ -457,7 +460,7 @@ class Lettering extends BookKeeping
|
||||
else $result = $this->updateLettering($bookkeeping_lines);
|
||||
if ($result < 0) {
|
||||
$group_error++;
|
||||
} else {
|
||||
} elseif ($result > 0) {
|
||||
$nb_lettering++;
|
||||
}
|
||||
}
|
||||
@ -655,7 +658,7 @@ class Lettering extends BookKeeping
|
||||
// Get payment lines
|
||||
$sql = "SELECT DISTINCT pe2.$fk_payment_element, pe2.$fk_element";
|
||||
$sql .= " FROM " . MAIN_DB_PREFIX . "$payment_element AS pe";
|
||||
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "$payment_element AS pe2 ON pe2.$fk_element = pe.$fk_element";
|
||||
$sql .= " INNER JOIN " . MAIN_DB_PREFIX . "$payment_element AS pe2 ON pe2.$fk_element = pe.$fk_element";
|
||||
$sql .= " WHERE pe.$fk_payment_element IN (" . $this->db->sanitize(implode(',', $payment_ids)) . ")";
|
||||
|
||||
dol_syslog(__METHOD__ . " - Get payment lines", LOG_DEBUG);
|
||||
|
||||
@ -797,6 +797,12 @@ if (!$error && $action == 'writebookkeeping') {
|
||||
require_once DOL_DOCUMENT_ROOT . '/accountancy/class/lettering.class.php';
|
||||
$lettering_static = new Lettering($db);
|
||||
$nb_lettering = $lettering_static->bookkeepingLetteringAll(array($bookkeeping->id));
|
||||
|
||||
if ($nb_lettering < 0) {
|
||||
$error++;
|
||||
$errorforline++;
|
||||
setEventMessages($lettering_static->error, $lettering_static->errors, 'errors');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -380,6 +380,12 @@ if ($action == 'writebookkeeping') {
|
||||
require_once DOL_DOCUMENT_ROOT . '/accountancy/class/lettering.class.php';
|
||||
$lettering_static = new Lettering($db);
|
||||
$nb_lettering = $lettering_static->bookkeepingLettering(array($bookkeeping->id), 'supplier_invoice');
|
||||
|
||||
if ($nb_lettering < 0) {
|
||||
$error++;
|
||||
$errorforline++;
|
||||
setEventMessages($lettering_static->error, $lettering_static->errors, 'errors');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -157,7 +157,7 @@ if ($in_bookkeeping == 'notyet') {
|
||||
$sql .= " AND f.rowid NOT IN (SELECT fk_doc FROM ".MAIN_DB_PREFIX."accounting_bookkeeping as ab WHERE ab.doc_type='customer_invoice')";
|
||||
// $sql .= " AND fd.rowid NOT IN (SELECT fk_docdet FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping as ab WHERE ab.doc_type='customer_invoice')"; // Useless, we save one line for all products with same account
|
||||
}
|
||||
$sql .= " ORDER BY f.datef";
|
||||
$sql .= " ORDER BY f.datef, f.ref";
|
||||
//print $sql; exit;
|
||||
|
||||
dol_syslog('accountancy/journal/sellsjournal.php', LOG_DEBUG);
|
||||
@ -393,6 +393,13 @@ if ($action == 'writebookkeeping') {
|
||||
require_once DOL_DOCUMENT_ROOT . '/accountancy/class/lettering.class.php';
|
||||
$lettering_static = new Lettering($db);
|
||||
$nb_lettering = $lettering_static->bookkeepingLettering(array($bookkeeping->id), 'customer_invoice');
|
||||
|
||||
if ($nb_lettering < 0) {
|
||||
$error++;
|
||||
$errorforline++;
|
||||
$errorforinvoice[$key] = 'other';
|
||||
setEventMessages($lettering_static->error, $lettering_static->errors, 'errors');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -512,7 +512,7 @@ $tabcond[25] = !empty($conf->website->enabled);
|
||||
$tabcond[27] = !empty($conf->societe->enabled);
|
||||
$tabcond[28] = !empty($conf->holiday->enabled);
|
||||
$tabcond[29] = !empty($conf->project->enabled);
|
||||
$tabcond[30] = !empty($conf->label->enabled);
|
||||
$tabcond[30] = (isModEnabled('label') || isModEnabled('barcode') || isModEnabled('adherent')); // stickers format dictionary
|
||||
//$tabcond[31]= !empty($conf->accounting->enabled);
|
||||
$tabcond[32] = (!empty($conf->holiday->enabled) || !empty($conf->hrm->enabled));
|
||||
$tabcond[33] = !empty($conf->hrm->enabled);
|
||||
|
||||
@ -65,7 +65,13 @@ function printDropdownBookmarksList()
|
||||
if ((preg_match('/^search_/', $key) || in_array($key, $authorized_var))
|
||||
&& $val != ''
|
||||
&& !array_key_exists($key, $url_param)) {
|
||||
$url_param[$key] = http_build_query(array(dol_escape_htmltag($key) => dol_escape_htmltag($val)));
|
||||
if (is_array($val)) {
|
||||
foreach ($val as $tmpsubval) {
|
||||
$url_param[] = http_build_query(array(dol_escape_htmltag($key).'[]' => dol_escape_htmltag($tmpsubval)));
|
||||
}
|
||||
} elseif ($val != '') {
|
||||
$url_param[$key] = http_build_query(array(dol_escape_htmltag($key) => dol_escape_htmltag($val)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -865,10 +865,10 @@ class Categorie extends CommonObject
|
||||
if (($type == 'customer' || $type == 'supplier') && $user->socid > 0) {
|
||||
$sql .= " AND o.rowid = ".((int) $user->socid);
|
||||
}
|
||||
$sql .= $this->db->order($sortfield, $sortorder);
|
||||
if ($limit > 0 || $offset > 0) {
|
||||
$sql .= $this->db->plimit($limit + 1, $offset);
|
||||
}
|
||||
$sql .= $this->db->order($sortfield, $sortorder);
|
||||
|
||||
dol_syslog(get_class($this)."::getObjectsInCateg", LOG_DEBUG);
|
||||
$resql = $this->db->query($sql);
|
||||
|
||||
@ -90,8 +90,8 @@ if ($fulldayevent) {
|
||||
// Security check
|
||||
$socid = GETPOST('socid', 'int');
|
||||
$id = GETPOST('id', 'int');
|
||||
if ($user->socid) {
|
||||
$socid = $user->socid;
|
||||
if ($user->socid && ($socid != $user->socid)) {
|
||||
accessforbidden();
|
||||
}
|
||||
|
||||
$error = GETPOST("error");
|
||||
@ -142,9 +142,6 @@ if (!empty($conf->global->AGENDA_REMINDER_EMAIL)) {
|
||||
$TDurationTypes = array('y'=>$langs->trans('Years'), 'm'=>$langs->trans('Month'), 'w'=>$langs->trans('Weeks'), 'd'=>$langs->trans('Days'), 'h'=>$langs->trans('Hours'), 'i'=>$langs->trans('Minutes'));
|
||||
|
||||
$result = restrictedArea($user, 'agenda', $object->id, 'actioncomm&societe', 'myactions|allactions', 'fk_soc', 'id');
|
||||
if ($user->socid && $socid) {
|
||||
$result = restrictedArea($user, 'societe', $socid);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@ -1264,7 +1261,7 @@ if ($action == 'create') {
|
||||
print "\n".'<script type="text/javascript">';
|
||||
print '$(document).ready(function () {
|
||||
$("#projectid").change(function () {
|
||||
var url = "'.DOL_URL_ROOT.'/projet/ajax/projects.php?mode=gettasks&socid="+$("#projectid").val()+"&projectid="+$("#projectid").val();
|
||||
var url = "'.DOL_URL_ROOT.'/projet/ajax/projects.php?mode=gettasks&socid="+$("#search_socid").val()+"&projectid="+$("#projectid").val();
|
||||
console.log("Call url to get new list of tasks: "+url);
|
||||
$.get(url, function(data) {
|
||||
console.log(data);
|
||||
|
||||
@ -412,7 +412,7 @@ if ($usergroup > 0) {
|
||||
}
|
||||
$sql .= " s.nom as societe, s.rowid as socid, s.client, s.email as socemail,";
|
||||
$sql .= " a.id, a.code, a.label, a.note, a.datep as dp, a.datep2 as dp2, a.fulldayevent, a.location,";
|
||||
$sql .= ' a.fk_user_author,a.fk_user_action,';
|
||||
$sql .= " a.fk_user_author, a.fk_user_action,";
|
||||
$sql .= " a.fk_contact, a.note, a.percent as percent,";
|
||||
$sql .= " a.fk_element, a.elementtype, a.datec, a.tms as datem,";
|
||||
$sql .= " c.code as type_code, c.libelle as type_label, c.color as type_color, c.type as type_type, c.picto as type_picto,";
|
||||
@ -916,6 +916,7 @@ while ($i < $imaxinloop) {
|
||||
$actionstatic->note_private = dol_htmlentitiesbr($obj->note);
|
||||
$actionstatic->datep = $db->jdate($obj->dp);
|
||||
$actionstatic->percentage = $obj->percent;
|
||||
$actionstatic->authorid = $obj->fk_user_author;
|
||||
|
||||
// Initialize $this->userassigned && this->socpeopleassigned array && this->userownerid
|
||||
// but only if we need it
|
||||
|
||||
@ -1475,7 +1475,7 @@ if (empty($reshook)) {
|
||||
$error++;
|
||||
}
|
||||
if (!$error) {
|
||||
$result = $object->updateExtraField(GETPOST('attribute', 'restricthtml'), 'PROPAL_MODIFY', $user);
|
||||
$result = $object->insertExtraFields('PROPAL_MODIFY');
|
||||
if ($result < 0) {
|
||||
setEventMessages($object->error, $object->errors, 'errors');
|
||||
$error++;
|
||||
|
||||
@ -248,13 +248,14 @@ class PropaleStats extends Stats
|
||||
global $user;
|
||||
|
||||
$sql = "SELECT product.ref, COUNT(product.ref) as nb, SUM(tl.".$this->field_line.") as total, AVG(tl.".$this->field_line.") as avg";
|
||||
$sql .= " FROM ".$this->from.", ".$this->from_line.", ".MAIN_DB_PREFIX."product as product";
|
||||
$sql .= " FROM ".$this->from;
|
||||
$sql .= " INNER JOIN ".$this->from_line." ON p.rowid = tl.fk_propal";
|
||||
$sql .= " INNER JOIN ".MAIN_DB_PREFIX."product as product ON tl.fk_product = product.rowid";
|
||||
if (empty($user->rights->societe->client->voir) && !$user->socid) {
|
||||
$sql .= " INNER JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON p.fk_soc = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
|
||||
}
|
||||
$sql .= $this->join;
|
||||
$sql .= " WHERE ".$this->where;
|
||||
$sql .= " AND p.rowid = tl.fk_propal AND tl.fk_product = product.rowid";
|
||||
$sql .= " AND ".$this->field_date." BETWEEN '".$this->db->idate(dol_get_first_day($year, 1, false))."' AND '".$this->db->idate(dol_get_last_day($year, 12, false))."'";
|
||||
$sql .= " GROUP BY product.ref";
|
||||
$sql .= $this->db->order('nb', 'DESC');
|
||||
|
||||
@ -187,7 +187,7 @@ $search_array_options = $extrafields->getOptionalsFromPost($object->table_elemen
|
||||
// List of fields to search into when doing a "search in all"
|
||||
$fieldstosearchall = array(
|
||||
'p.ref'=>'Ref',
|
||||
'p.ref_client'=>'CustomerRef',
|
||||
'p.ref_client'=>'RefCustomer',
|
||||
'pd.description'=>'Description',
|
||||
's.nom'=>"ThirdParty",
|
||||
's.name_alias'=>"AliasNameShort",
|
||||
|
||||
@ -1082,6 +1082,8 @@ class Account extends CommonObject
|
||||
|
||||
$this->db->begin();
|
||||
|
||||
// @TODO Check there is no child into llx_payment_various, ... to allow deletion ?
|
||||
|
||||
// Delete link between tag and bank account
|
||||
if (!$error) {
|
||||
$sql = "DELETE FROM ".MAIN_DB_PREFIX."categorie_account";
|
||||
@ -1903,7 +1905,6 @@ class AccountLine extends CommonObject
|
||||
$sql .= " b.fk_user_author, b.fk_user_rappro,";
|
||||
$sql .= " b.fk_type, b.num_releve, b.num_chq, b.rappro, b.note,";
|
||||
$sql .= " b.fk_bordereau, b.banque, b.emetteur,";
|
||||
//$sql.= " b.author"; // Is this used ?
|
||||
$sql .= " ba.ref as bank_account_ref, ba.label as bank_account_label";
|
||||
$sql .= " FROM ".MAIN_DB_PREFIX."bank as b,";
|
||||
$sql .= " ".MAIN_DB_PREFIX."bank_account as ba";
|
||||
|
||||
@ -126,6 +126,22 @@ class PaymentVarious extends CommonObject
|
||||
public $fk_user_modif;
|
||||
|
||||
|
||||
/**
|
||||
* @var int Type of bank account if the payment is on a bank account
|
||||
*/
|
||||
public $fk_type;
|
||||
|
||||
/**
|
||||
* @var int 1 if the payment is on a bank account line that is conciliated
|
||||
*/
|
||||
public $rappro;
|
||||
|
||||
/**
|
||||
* @var string ID of bank receipt
|
||||
*/
|
||||
public $bank_num_releve;
|
||||
|
||||
|
||||
/**
|
||||
* 'type' if the field format ('integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter]]', 'varchar(x)', 'double(24,8)', 'real', 'price', 'text', 'html', 'date', 'datetime', 'timestamp', 'duration', 'mail', 'phone', 'url', 'password')
|
||||
* Note: Filter can be a string like "(t.ref:like:'SO-%') or (t.date_creation:<:'20160101') or (t.nature:is:NULL)"
|
||||
@ -251,7 +267,6 @@ class PaymentVarious extends CommonObject
|
||||
*/
|
||||
public function fetch($id, $user = null)
|
||||
{
|
||||
global $langs;
|
||||
$sql = "SELECT";
|
||||
$sql .= " v.rowid,";
|
||||
$sql .= " v.tms,";
|
||||
@ -262,7 +277,7 @@ class PaymentVarious extends CommonObject
|
||||
$sql .= " v.fk_typepayment,";
|
||||
$sql .= " v.num_payment,";
|
||||
$sql .= " v.label,";
|
||||
$sql .= " v.note,";
|
||||
$sql .= " v.note as note_private,";
|
||||
$sql .= " v.accountancy_code,";
|
||||
$sql .= " v.subledger_account,";
|
||||
$sql .= " v.fk_projet as fk_project,";
|
||||
@ -271,7 +286,8 @@ class PaymentVarious extends CommonObject
|
||||
$sql .= " v.fk_user_modif,";
|
||||
$sql .= " b.fk_account,";
|
||||
$sql .= " b.fk_type,";
|
||||
$sql .= " b.rappro";
|
||||
$sql .= " b.rappro,";
|
||||
$sql .= " b.num_releve as bank_num_releve";
|
||||
$sql .= " FROM ".MAIN_DB_PREFIX."payment_various as v";
|
||||
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."bank as b ON v.fk_bank = b.rowid";
|
||||
$sql .= " WHERE v.rowid = ".((int) $id);
|
||||
@ -292,7 +308,8 @@ class PaymentVarious extends CommonObject
|
||||
$this->type_payment = $obj->fk_typepayment;
|
||||
$this->num_payment = $obj->num_payment;
|
||||
$this->label = $obj->label;
|
||||
$this->note = $obj->note;
|
||||
$this->note = $obj->note_private; // For backward compatibility
|
||||
$this->note_private = $obj->note_private;
|
||||
$this->subledger_account = $obj->subledger_account;
|
||||
$this->accountancy_code = $obj->accountancy_code;
|
||||
$this->fk_project = $obj->fk_project;
|
||||
@ -302,6 +319,7 @@ class PaymentVarious extends CommonObject
|
||||
$this->fk_account = $obj->fk_account;
|
||||
$this->fk_type = $obj->fk_type;
|
||||
$this->rappro = $obj->rappro;
|
||||
$this->bank_num_releve = $obj->bank_num_releve;
|
||||
}
|
||||
$this->db->free($resql);
|
||||
|
||||
|
||||
@ -638,18 +638,28 @@ if ($id) {
|
||||
print $form->editfieldval('SubledgerAccount', 'subledger_account', $object->subledger_account, $object, (!$alreadyaccounted && $user->rights->banque->modifier), 'string', '', 0);
|
||||
print '</td></tr>';
|
||||
|
||||
if (isModEnabled('banque')) {
|
||||
if ($object->fk_account > 0) {
|
||||
$bankline = new AccountLine($db);
|
||||
$bankline->fetch($object->fk_bank);
|
||||
$bankaccountnotfound = 0;
|
||||
|
||||
print '<tr>';
|
||||
print '<td>'.$langs->trans('BankTransactionLine').'</td>';
|
||||
print '<td colspan="3">';
|
||||
print $bankline->getNomUrl(1, 0, 'showall');
|
||||
print '</td>';
|
||||
print '</tr>';
|
||||
if (isModEnabled('banque')) {
|
||||
print '<tr>';
|
||||
print '<td>'.$langs->trans('BankTransactionLine').'</td>';
|
||||
print '<td colspan="3">';
|
||||
if ($object->fk_bank > 0) {
|
||||
$bankline = new AccountLine($db);
|
||||
$result = $bankline->fetch($object->fk_bank);
|
||||
|
||||
if ($result <= 0) {
|
||||
$bankaccountnotfound = 1;
|
||||
} else {
|
||||
print $bankline->getNomUrl(1, 0, 'showall');
|
||||
}
|
||||
} else {
|
||||
$bankaccountnotfound = 1;
|
||||
|
||||
print '<span class="opacitymedium">'.$langs->trans("NoRecordfound").'</span>';
|
||||
}
|
||||
print '</td>';
|
||||
print '</tr>';
|
||||
}
|
||||
|
||||
// Other attributes
|
||||
@ -679,7 +689,7 @@ if ($id) {
|
||||
}
|
||||
|
||||
// Delete
|
||||
if (empty($object->rappro)) {
|
||||
if (empty($object->rappro) || $bankaccountnotfound) {
|
||||
if (!empty($user->rights->banque->modifier)) {
|
||||
if ($alreadyaccounted) {
|
||||
print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans("Accounted").'">'.$langs->trans("Delete").'</a></div>';
|
||||
|
||||
@ -3558,6 +3558,7 @@ class Facture extends CommonInvoice
|
||||
|
||||
/**
|
||||
* Add an invoice line into database (linked to product/service or not).
|
||||
* Note: ->thirdparty must be defined.
|
||||
* Les parametres sont deja cense etre juste et avec valeurs finales a l'appel
|
||||
* de cette methode. Aussi, pour le taux tva, il doit deja avoir ete defini
|
||||
* par l'appelant par la methode get_default_tva(societe_vendeuse,societe_acheteuse,produit)
|
||||
|
||||
@ -118,7 +118,13 @@ if ($action == 'confirm_rejet') {
|
||||
* View
|
||||
*/
|
||||
|
||||
$invoicestatic = new Facture($db);
|
||||
if ($type == 'bank-transfer') {
|
||||
require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
|
||||
$invoicestatic = new FactureFournisseur($db);
|
||||
} else {
|
||||
require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
|
||||
$invoicestatic = new Facture($db);
|
||||
}
|
||||
|
||||
$title = $langs->trans("WithdrawalsLine");
|
||||
if ($type == 'bank-transfer') {
|
||||
@ -317,7 +323,11 @@ if ($id) {
|
||||
print '<a href="'.DOL_URL_ROOT.'/compta/facture/card.php?facid='.$obj->facid.'">'.$obj->ref."</a></td>\n";
|
||||
}
|
||||
|
||||
print '<td><a href="'.DOL_URL_ROOT.'/comm/card.php?socid='.$obj->socid.'">';
|
||||
if ($type == 'bank-transfer') {
|
||||
print '<td><a href="'.DOL_URL_ROOT.'/fourn/card.php?socid='.$obj->socid.'">';
|
||||
} else {
|
||||
print '<td><a href="'.DOL_URL_ROOT.'/comm/card.php?socid='.$obj->socid.'">';
|
||||
}
|
||||
print img_object($langs->trans("ShowCompany"), "company").' '.$obj->name."</a></td>\n";
|
||||
|
||||
print '<td class="right"><span class="amount">'.price($obj->total_ttc)."</span></td>\n";
|
||||
|
||||
@ -376,7 +376,7 @@ if ($sql_select) {
|
||||
|
||||
$num = $db->num_rows($resql);
|
||||
|
||||
$param = "&socid=".urlencode($socid)."&type_element=".urlencode($type_element);
|
||||
$param = "&socid=".urlencode($socid)."&type_element=".urlencode($type_element)."&id=".urlencode($id);
|
||||
if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
|
||||
$param .= '&contextpage='.urlencode($contextpage);
|
||||
}
|
||||
|
||||
@ -143,6 +143,9 @@ class CMailFile
|
||||
{
|
||||
global $conf, $dolibarr_main_data_root, $user;
|
||||
|
||||
dol_syslog("CMailFile::CMailfile: charset=".$conf->file->character_set_client." from=$from, to=$to, addr_cc=$addr_cc, addr_bcc=$addr_bcc, errors_to=$errors_to, replyto=$replyto trackid=$trackid sendcontext=$sendcontext", LOG_DEBUG);
|
||||
dol_syslog("CMailFile::CMailfile: subject=".$subject.", deliveryreceipt=".$deliveryreceipt.", msgishtml=".$msgishtml, LOG_DEBUG);
|
||||
|
||||
// Clean values of $mimefilename_list
|
||||
if (is_array($mimefilename_list)) {
|
||||
foreach ($mimefilename_list as $key => $val) {
|
||||
@ -185,9 +188,6 @@ class CMailFile
|
||||
// On defini alternative_boundary
|
||||
$this->alternative_boundary = 'mul_'.dol_hash(uniqid("dolibarr3"), 3); // Force md5 hash (does not contains special chars)
|
||||
|
||||
dol_syslog("CMailFile::CMailfile: sendmode=".$this->sendmode." charset=".$conf->file->character_set_client." from=$from, to=$to, addr_cc=$addr_cc, addr_bcc=$addr_bcc, errors_to=$errors_to, replyto=$replyto trackid=$trackid sendcontext=$sendcontext", LOG_DEBUG);
|
||||
dol_syslog("CMailFile::CMailfile: subject=".$subject.", deliveryreceipt=".$deliveryreceipt.", msgishtml=".$msgishtml, LOG_DEBUG);
|
||||
|
||||
if (empty($subject)) {
|
||||
dol_syslog("CMailFile::CMailfile: Try to send an email with empty subject");
|
||||
$this->error = 'ErrorSubjectIsRequired';
|
||||
@ -315,6 +315,8 @@ class CMailFile
|
||||
}
|
||||
}
|
||||
|
||||
dol_syslog("CMailFile::CMailfile: sendmode=".$this->sendmode." addr_bcc=$addr_bcc, replyto=$replyto", LOG_DEBUG);
|
||||
|
||||
// We set all data according to choosed sending method.
|
||||
// We also set a value for ->msgid
|
||||
if ($this->sendmode == 'mail') {
|
||||
|
||||
@ -1084,10 +1084,8 @@ class ExtraFields
|
||||
continue;
|
||||
}
|
||||
|
||||
if (($pipepos = strpos($val, '|')) > 0) {
|
||||
// Select-Field depending on other field, remove extra data from value
|
||||
$val = substr($val, 0, $pipepos);
|
||||
}
|
||||
$valarray = explode('|', $val);
|
||||
$val = $valarray[0];
|
||||
|
||||
if ($langfile && $val) {
|
||||
$options[$okey] = $langs->trans($val);
|
||||
|
||||
@ -4054,7 +4054,7 @@ class Form
|
||||
public function select_conditions_paiements($selected = 0, $htmlname = 'condid', $filtertype = -1, $addempty = 0, $noinfoadmin = 0, $morecss = '', $deposit_percent = -1)
|
||||
{
|
||||
// phpcs:enable
|
||||
print $this->getSelectConditionsPaiements($selected, $htmlname, $filtertype, $addempty, $noinfoadmin, $morecss, $deposit_percent = -1);
|
||||
print $this->getSelectConditionsPaiements($selected, $htmlname, $filtertype, $addempty, $noinfoadmin, $morecss, $deposit_percent);
|
||||
}
|
||||
|
||||
|
||||
@ -6772,7 +6772,11 @@ class Form
|
||||
if (empty($labeladddateof)) {
|
||||
$labeladddateof = $langs->trans("DateInvoice");
|
||||
}
|
||||
$retstring .= ' - <button class="dpInvisibleButtons datenowlink" id="dateofinvoice" type="button" name="_dateofinvoice" value="now" onclick="console.log(\'Click on now link\'); jQuery(\'#re\').val(\''.dol_print_date($adddateof, 'dayinputnoreduce').'\');jQuery(\'#reday\').val(\''.$tmparray['mday'].'\');jQuery(\'#remonth\').val(\''.$tmparray['mon'].'\');jQuery(\'#reyear\').val(\''.$tmparray['year'].'\');">'.$labeladddateof.'</a>';
|
||||
$reset_scripts = 'jQuery(\'#'.$prefix.'\').val(\''.dol_print_date($adddateof, 'dayinputnoreduce').'\');';
|
||||
$reset_scripts .= 'jQuery(\'#'.$prefix.'day\').val(\''.$tmparray['mday'].'\');';
|
||||
$reset_scripts .= 'jQuery(\'#'.$prefix.'month\').val(\''.$tmparray['mon'].'\');';
|
||||
$reset_scripts .= 'jQuery(\'#'.$prefix.'year\').val(\''.$tmparray['year'].'\');';
|
||||
$retstring .= ' - <button class="dpInvisibleButtons datenowlink" id="dateofinvoice" type="button" name="_dateofinvoice" value="now" onclick="'.$reset_scripts.'">'.$labeladddateof.'</a>';
|
||||
}
|
||||
|
||||
return $retstring;
|
||||
@ -7731,7 +7735,13 @@ class Form
|
||||
}
|
||||
|
||||
// Add where from hooks
|
||||
$parameters = array();
|
||||
$parameters = array(
|
||||
'object' => $objecttmp,
|
||||
'htmlname' => $htmlname,
|
||||
'filter' => $filter,
|
||||
'searchkey' => $searchkey
|
||||
);
|
||||
|
||||
$reshook = $hookmanager->executeHooks('selectForFormsListWhere', $parameters); // Note that $action and $object may have been modified by hook
|
||||
if (!empty($hookmanager->resPrint)) {
|
||||
$sql .= $hookmanager->resPrint;
|
||||
|
||||
@ -989,15 +989,15 @@ class FormCompany extends Form
|
||||
// phpcs:enable
|
||||
$tax = get_localtax_by_third($local);
|
||||
|
||||
$num = $this->db->num_rows($tax);
|
||||
$i = 0;
|
||||
if ($num) {
|
||||
if ($tax) {
|
||||
$valors = explode(":", $tax);
|
||||
$nbvalues = count($valors);
|
||||
|
||||
if (count($valors) > 1) {
|
||||
if ($nbvalues > 1) {
|
||||
//montar select
|
||||
print '<select class="flat" name="'.$htmlname.'" id="'.$htmlname.'">';
|
||||
while ($i <= (count($valors)) - 1) {
|
||||
$i = 0;
|
||||
while ($i < $nbvalues) {
|
||||
if ($selected == $valors[$i]) {
|
||||
print '<option value="'.$valors[$i].'" selected>';
|
||||
} else {
|
||||
@ -1007,7 +1007,7 @@ class FormCompany extends Form
|
||||
print '</option>';
|
||||
$i++;
|
||||
}
|
||||
print'</select>';
|
||||
print '</select>';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -175,6 +175,7 @@ class FormTicket
|
||||
print '<form method="POST" '.($withdolfichehead ? '' : 'style="margin-bottom: 30px;" ').'name="ticket" id="form_create_ticket" enctype="multipart/form-data" action="'.(!empty($this->param["returnurl"]) ? $this->param["returnurl"] : "").'">';
|
||||
print '<input type="hidden" name="token" value="'.newToken().'">';
|
||||
print '<input type="hidden" name="action" value="'.$this->action.'">';
|
||||
print '<input type="hidden" name="trackid" value="'.$this->trackid.'">';
|
||||
foreach ($this->param as $key => $value) {
|
||||
print '<input type="hidden" name="'.$key.'" value="'.$value.'">';
|
||||
}
|
||||
|
||||
@ -2813,7 +2813,7 @@ function dol_check_secure_access_document($modulepart, $original_file, $entity,
|
||||
}
|
||||
$original_file = $conf->commande->multidir_output[$entity].'/'.$original_file;
|
||||
$sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."commande WHERE ref='".$db->escape($refname)."' AND entity IN (".getEntity('order').")";
|
||||
} elseif ($modulepart == 'project' && !empty($conf->project->dir_output)) {
|
||||
} elseif ($modulepart == 'project' && !empty($conf->project->multidir_output[$entity])) {
|
||||
// Wrapping pour les projets
|
||||
if ($fuser->rights->projet->{$lire} || preg_match('/^specimen/i', $original_file)) {
|
||||
$accessallowed = 1;
|
||||
@ -2825,9 +2825,9 @@ function dol_check_secure_access_document($modulepart, $original_file, $entity,
|
||||
$accessallowed = checkUserAccessToObject($user, array('projet'), $tmpproject->id, 'projet&project', '', '', 'rowid', '');
|
||||
}
|
||||
}
|
||||
$original_file = $conf->project->dir_output.'/'.$original_file;
|
||||
$original_file = $conf->project->multidir_output[$entity].'/'.$original_file;
|
||||
$sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."projet WHERE ref='".$db->escape($refname)."' AND entity IN (".getEntity('project').")";
|
||||
} elseif ($modulepart == 'project_task' && !empty($conf->project->dir_output)) {
|
||||
} elseif ($modulepart == 'project_task' && !empty($conf->project->multidir_output[$entity])) {
|
||||
if ($fuser->rights->projet->{$lire} || preg_match('/^specimen/i', $original_file)) {
|
||||
$accessallowed = 1;
|
||||
// If we known $id of project, call checkUserAccessToObject to check permission on properties and contact of project
|
||||
@ -2838,7 +2838,7 @@ function dol_check_secure_access_document($modulepart, $original_file, $entity,
|
||||
$accessallowed = checkUserAccessToObject($user, array('projet_task'), $tmptask->id, 'projet_task&project', '', '', 'rowid', '');
|
||||
}
|
||||
}
|
||||
$original_file = $conf->project->dir_output.'/'.$original_file;
|
||||
$original_file = $conf->project->multidir_output[$entity].'/'.$original_file;
|
||||
$sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."projet WHERE ref='".$db->escape($refname)."' AND entity IN (".getEntity('project').")";
|
||||
} elseif (($modulepart == 'commande_fournisseur' || $modulepart == 'order_supplier') && !empty($conf->fournisseur->commande->dir_output)) {
|
||||
// Wrapping pour les commandes fournisseurs
|
||||
|
||||
@ -5969,30 +5969,30 @@ function isOnlyOneLocalTax($local)
|
||||
/**
|
||||
* Get values of localtaxes (1 or 2) for company country for the common vat with the highest value
|
||||
*
|
||||
* @param int $local LocalTax to get
|
||||
* @return number Values of localtax
|
||||
* @param int $local LocalTax to get
|
||||
* @return string Values of localtax (Can be '20', '-19:-15:-9')
|
||||
*/
|
||||
function get_localtax_by_third($local)
|
||||
{
|
||||
global $db, $mysoc;
|
||||
$sql = "SELECT t.localtax1, t.localtax2 ";
|
||||
$sql .= " FROM ".MAIN_DB_PREFIX."c_tva as t inner join ".MAIN_DB_PREFIX."c_country as c ON c.rowid=t.fk_pays";
|
||||
$sql .= " WHERE c.code = '".$db->escape($mysoc->country_code)."' AND t.active = 1 AND t.taux=(";
|
||||
$sql .= " SELECT max(tt.taux) FROM ".MAIN_DB_PREFIX."c_tva as tt inner join ".MAIN_DB_PREFIX."c_country as c ON c.rowid=tt.fk_pays";
|
||||
$sql .= " WHERE c.code = '".$db->escape($mysoc->country_code)."' AND tt.active = 1";
|
||||
$sql .= " )";
|
||||
|
||||
$sql = " SELECT t.localtax".$local." as localtax";
|
||||
$sql .= " FROM ".MAIN_DB_PREFIX."c_tva as t INNER JOIN ".MAIN_DB_PREFIX."c_country as c ON c.rowid = t.fk_pays";
|
||||
$sql .= " WHERE c.code = '".$db->escape($mysoc->country_code)."' AND t.active = 1 AND t.taux = (";
|
||||
$sql .= "SELECT MAX(tt.taux) FROM ".MAIN_DB_PREFIX."c_tva as tt INNER JOIN ".MAIN_DB_PREFIX."c_country as c ON c.rowid = tt.fk_pays";
|
||||
$sql .= " WHERE c.code = '".$db->escape($mysoc->country_code)."' AND tt.active = 1)";
|
||||
$sql .= " AND t.localtax".$local."_type <> '0'";
|
||||
$sql .= " ORDER BY t.rowid DESC";
|
||||
|
||||
$resql = $db->query($sql);
|
||||
if ($resql) {
|
||||
$obj = $db->fetch_object($resql);
|
||||
if ($local == 1) {
|
||||
return $obj->localtax1;
|
||||
} elseif ($local == 2) {
|
||||
return $obj->localtax2;
|
||||
}
|
||||
return $obj->localtax;
|
||||
} else {
|
||||
return 'Error';
|
||||
}
|
||||
|
||||
return 0;
|
||||
return '0';
|
||||
}
|
||||
|
||||
|
||||
@ -6101,7 +6101,7 @@ function getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisi
|
||||
}
|
||||
|
||||
$sql .= ", ".MAIN_DB_PREFIX."c_country as c";
|
||||
if ($mysoc->country_code == 'ES') {
|
||||
if (!empty($mysoc) && $mysoc->country_code == 'ES') {
|
||||
$sql .= " WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($buyer->country_code)."'"; // local tax in spain use the buyer country ??
|
||||
} else {
|
||||
$sql .= " WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape(empty($seller->country_code) ? $mysoc->country_code : $seller->country_code)."'";
|
||||
@ -8634,6 +8634,10 @@ function dol_eval($s, $returnvalue = 0, $hideerrors = 1, $onlysimplestring = '1'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (is_array($s) || $s === 'Array') {
|
||||
return 'Bad string syntax to evaluate (value is Array) '.var_export($s, true);
|
||||
}
|
||||
if (strpos($s, '::') !== false) {
|
||||
if ($returnvalue) {
|
||||
return 'Bad string syntax to evaluate (double : char is forbidden): '.$s;
|
||||
@ -11176,7 +11180,7 @@ function dolForgeCriteriaCallback($matches)
|
||||
|
||||
$operand = preg_replace('/[^a-z0-9\._]/i', '', trim($tmp[0]));
|
||||
|
||||
$operator = strtoupper(preg_replace('/[^a-z<>=]/i', '', trim($tmp[1])));
|
||||
$operator = strtoupper(preg_replace('/[^a-z<>!=]/i', '', trim($tmp[1])));
|
||||
if ($operator == 'NOTLIKE') {
|
||||
$operator = 'NOT LIKE';
|
||||
}
|
||||
|
||||
@ -2436,10 +2436,12 @@ function pdf_getLinkedObjects(&$object, $outputlangs)
|
||||
$linkedobjects[$objecttype]['ref_title'] = $outputlangs->transnoentities("RefSending");
|
||||
if (! empty($linkedobjects[$objecttype]['ref_value'])) $linkedobjects[$objecttype]['ref_value'] .= ' / ';
|
||||
$linkedobjects[$objecttype]['ref_value'] .= $outputlangs->transnoentities($elementobject->ref);
|
||||
$linkedobjects[$objecttype]['date_value'] = dol_print_date(empty($elementobject->date_shipping) ? $elementobject->date_delivery : $elementobject->date_shipping, 'day', '', $outputlangs);
|
||||
} else {
|
||||
$linkedobjects[$objecttype]['ref_title'] = $outputlangs->transnoentities("RefOrder").' / '.$outputlangs->transnoentities("RefSending");
|
||||
if (empty($linkedobjects[$objecttype]['ref_value'])) $linkedobjects[$objecttype]['ref_value'] = $outputlangs->convToOutputCharset($order->ref).($order->ref_client ? ' ('.$order->ref_client.')' : '');
|
||||
$linkedobjects[$objecttype]['ref_value'] .= ' / '.$outputlangs->transnoentities($elementobject->ref);
|
||||
$linkedobjects[$objecttype]['date_value'] = dol_print_date(empty($elementobject->date_shipping) ? $elementobject->date_delivery : $elementobject->date_shipping, 'day', '', $outputlangs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -275,7 +275,7 @@ function project_prepare_head(Project $project, $moreparam = '')
|
||||
} else {
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/class/link.class.php';
|
||||
$upload_dir = $conf->project->dir_output."/".dol_sanitizeFileName($project->ref);
|
||||
$upload_dir = $conf->project->multidir_output[$project->entity]."/".dol_sanitizeFileName($project->ref);
|
||||
$nbFiles = count(dol_dir_list($upload_dir, 'files', 0, '', '(\.meta|_preview.*\.png)$'));
|
||||
$nbLinks = Link::count($db, $project->element, $project->id);
|
||||
$totalAttached = $nbFiles + $nbLinks;
|
||||
@ -401,7 +401,7 @@ function task_prepare_head($object)
|
||||
}
|
||||
|
||||
$head[$h][0] = DOL_URL_ROOT.'/projet/tasks/document.php?id='.$object->id.(GETPOST('withproject') ? '&withproject=1' : '');
|
||||
$filesdir = $conf->project->dir_output."/".dol_sanitizeFileName($object->project->ref).'/'.dol_sanitizeFileName($object->ref);
|
||||
$filesdir = $conf->project->multidir_output[$object->entity]."/".dol_sanitizeFileName($object->project->ref).'/'.dol_sanitizeFileName($object->ref);
|
||||
include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
|
||||
include_once DOL_DOCUMENT_ROOT.'/core/class/link.class.php';
|
||||
$nbFiles = count(dol_dir_list($filesdir, 'files', 0, '', '(\.meta|_preview.*\.png)$'));
|
||||
|
||||
@ -682,7 +682,7 @@ function checkUserAccessToObject($user, array $featuresarray, $object = 0, $tabl
|
||||
// Array to define rules of checks to do
|
||||
$check = array('adherent', 'banque', 'bom', 'don', 'mrp', 'user', 'usergroup', 'payment', 'payment_supplier', 'product', 'produit', 'service', 'produit|service', 'categorie', 'resource', 'expensereport', 'holiday', 'salaries', 'website', 'recruitment'); // Test on entity only (Objects with no link to company)
|
||||
$checksoc = array('societe'); // Test for societe object
|
||||
$checkother = array('contact', 'agenda'); // Test on entity + link to third party on field $dbt_keyfield. Allowed if link is empty (Ex: contacts...).
|
||||
$checkother = array('contact', 'agenda', 'contrat'); // Test on entity + link to third party on field $dbt_keyfield. Allowed if link is empty (Ex: contacts...).
|
||||
$checkproject = array('projet', 'project'); // Test for project object
|
||||
$checktask = array('projet_task'); // Test for task object
|
||||
$checkhierarchy = array('expensereport', 'holiday');
|
||||
|
||||
@ -35,8 +35,10 @@ function dolStripPhpCode($str, $replacewith = '')
|
||||
|
||||
$newstr = '';
|
||||
|
||||
//split on each opening tag
|
||||
$parts = explode('<?php', $str);
|
||||
// Split on each opening tag
|
||||
//$parts = explode('<?php', $str);
|
||||
$parts = preg_split('/'.preg_quote('<?php', '/').'/i', $str);
|
||||
|
||||
if (!empty($parts)) {
|
||||
$i = 0;
|
||||
foreach ($parts as $part) {
|
||||
@ -77,8 +79,10 @@ function dolKeepOnlyPhpCode($str)
|
||||
|
||||
$newstr = '';
|
||||
|
||||
//split on each opening tag
|
||||
$parts = explode('<?php', $str);
|
||||
// Split on each opening tag
|
||||
//$parts = explode('<?php', $str);
|
||||
$parts = preg_split('/'.preg_quote('<?php', '/').'/i', $str);
|
||||
|
||||
if (!empty($parts)) {
|
||||
$i = 0;
|
||||
foreach ($parts as $part) {
|
||||
|
||||
@ -368,11 +368,14 @@ class pdf_espadon extends ModelePdfExpedition
|
||||
|
||||
if (!empty($notetoshow) || !empty($object->tracking_number)) {
|
||||
$tab_top -= 2;
|
||||
$tab_topbeforetrackingnumber = $tab_top;
|
||||
|
||||
// Tracking number
|
||||
if (!empty($object->tracking_number)) {
|
||||
$height_trackingnumber = 4;
|
||||
|
||||
$pdf->SetFont('', 'B', $default_font_size - 2);
|
||||
$pdf->writeHTMLCell(60, 4, $this->posxdesc - 1, $tab_top - 1, $outputlangs->transnoentities("TrackingNumber") . " : " . $object->tracking_number, 0, 1, false, true, 'L');
|
||||
$pdf->writeHTMLCell(60, $height_trackingnumber, $this->posxdesc - 1, $tab_top - 1, $outputlangs->transnoentities("TrackingNumber") . " : " . $object->tracking_number, 0, 1, false, true, 'L');
|
||||
|
||||
$tab_top_alt = $pdf->GetY();
|
||||
$object->getUrlTrackingStatus($object->tracking_number);
|
||||
@ -390,19 +393,20 @@ class pdf_espadon extends ModelePdfExpedition
|
||||
$label .= " : ";
|
||||
$label .= $object->tracking_url;
|
||||
}
|
||||
$pdf->SetFont('', 'B', $default_font_size - 2);
|
||||
$pdf->writeHTMLCell(60, 4, $this->posxdesc - 1, $tab_top_alt, $label, 0, 1, false, true, 'L');
|
||||
|
||||
$tab_top = $pdf->GetY();
|
||||
$height_trackingnumber += 4;
|
||||
$pdf->SetFont('', 'B', $default_font_size - 2);
|
||||
$pdf->writeHTMLCell(60, $height_trackingnumber, $this->posxdesc - 1, $tab_top_alt, $label, 0, 1, false, true, 'L');
|
||||
}
|
||||
}
|
||||
$tab_top = $pdf->GetY();
|
||||
}
|
||||
|
||||
|
||||
// Notes
|
||||
$pagenb = $pdf->getPage();
|
||||
if (!empty($notetoshow)) {
|
||||
$tab_top -= 2;
|
||||
if (!empty($notetoshow) || !empty($object->tracking_number)) {
|
||||
$tab_top -= 1;
|
||||
|
||||
$tab_width = $this->page_largeur - $this->marge_gauche - $this->marge_droite;
|
||||
$pageposbeforenote = $pagenb;
|
||||
@ -465,11 +469,21 @@ class pdf_espadon extends ModelePdfExpedition
|
||||
$pdf->SetDrawColor(128, 128, 128);
|
||||
// Draw note frame
|
||||
if ($i > $pageposbeforenote) {
|
||||
$height_note = $this->page_hauteur - ($tab_top_newpage + $heightforfooter);
|
||||
$pdf->Rect($this->marge_gauche, $tab_top_newpage - 1, $tab_width, $height_note + 1);
|
||||
if (empty($height_trackingnumber)) {
|
||||
$height_note = $this->page_hauteur - ($tab_top_newpage + $heightforfooter);
|
||||
} else {
|
||||
$height_note = $this->page_hauteur - ($tab_top_newpage + $heightforfooter) + $height_trackingnumber + 1;
|
||||
$tab_top_newpage = $tab_topbeforetrackingnumber;
|
||||
}
|
||||
$pdf->Rect($this->marge_gauche, $tab_top_newpage - 1, $tab_width, $height_note + 2);
|
||||
} else {
|
||||
$height_note = $this->page_hauteur - ($tab_top + $heightforfooter);
|
||||
$pdf->Rect($this->marge_gauche, $tab_top - 1, $tab_width, $height_note + 1);
|
||||
if (empty($height_trackingnumber)) {
|
||||
$height_note = $this->page_hauteur - ($tab_top + $heightforfooter);
|
||||
} else {
|
||||
$height_note = $this->page_hauteur - ($tab_top + $heightforfooter)+ $height_trackingnumber + 1;
|
||||
$tab_top = $tab_topbeforetrackingnumber;
|
||||
}
|
||||
$pdf->Rect($this->marge_gauche, $tab_top - 1, $tab_width, $height_note + 2);
|
||||
}
|
||||
|
||||
// Add footer
|
||||
@ -489,8 +503,13 @@ class pdf_espadon extends ModelePdfExpedition
|
||||
{
|
||||
$pdf->commitTransaction();
|
||||
$posyafter = $pdf->GetY();
|
||||
$height_note = $posyafter - $tab_top;
|
||||
$pdf->Rect($this->marge_gauche, $tab_top - 1, $tab_width, $height_note + 1);
|
||||
if (empty($height_trackingnumber)) {
|
||||
$height_note = $posyafter - $tab_top + 1;
|
||||
} else {
|
||||
$height_note = $posyafter - $tab_top + $height_trackingnumber + 1;
|
||||
$tab_top = $tab_topbeforetrackingnumber;
|
||||
}
|
||||
$pdf->Rect($this->marge_gauche, $tab_top - 1, $tab_width, $height_note + 2);
|
||||
|
||||
|
||||
if ($posyafter > ($this->page_hauteur - ($heightforfooter + $heightforfreetext + 20))) {
|
||||
|
||||
@ -240,7 +240,7 @@ class modFacture extends DolibarrModules
|
||||
'f.ref' => 'InvoiceRef*',
|
||||
'f.ref_ext' => 'ExternalRef',
|
||||
'f.ref_int' => 'ExternalRef',
|
||||
'f.ref_client' => 'CustomerRef',
|
||||
'f.ref_client' => 'RefCustomer',
|
||||
'f.type' => 'Type*',
|
||||
'f.fk_soc' => 'Customer*',
|
||||
'f.datec' => 'InvoiceDateCreation',
|
||||
|
||||
@ -195,11 +195,11 @@ class pdf_baleine extends ModelePDFProjects
|
||||
// Load traductions files required by page
|
||||
$outputlangs->loadLangs(array("main", "dict", "companies", "projects"));
|
||||
|
||||
if ($conf->project->dir_output) {
|
||||
if ($conf->project->multidir_output[$object->entity]) {
|
||||
//$nblines = count($object->lines); // This is set later with array of tasks
|
||||
|
||||
$objectref = dol_sanitizeFileName($object->ref);
|
||||
$dir = $conf->project->dir_output;
|
||||
$dir = $conf->project->multidir_output[$object->entity];
|
||||
if (!preg_match('/specimen/i', $objectref)) {
|
||||
$dir .= "/".$objectref;
|
||||
}
|
||||
|
||||
@ -242,11 +242,11 @@ class pdf_beluga extends ModelePDFProjects
|
||||
// Load traductions files required by page
|
||||
$outputlangs->loadLangs(array("main", "dict", "companies", "projects"));
|
||||
|
||||
if ($conf->project->dir_output) {
|
||||
if ($conf->project->multidir_output[$object->entity]) {
|
||||
//$nblines = count($object->lines); // This is set later with array of tasks
|
||||
|
||||
$objectref = dol_sanitizeFileName($object->ref);
|
||||
$dir = $conf->project->dir_output;
|
||||
$dir = $conf->project->multidir_output[$object->entity];
|
||||
if (!preg_match('/specimen/i', $objectref)) {
|
||||
$dir .= "/".$objectref;
|
||||
}
|
||||
|
||||
@ -195,11 +195,11 @@ class pdf_timespent extends ModelePDFProjects
|
||||
// Load traductions files required by page
|
||||
$outputlangs->loadLangs(array("main", "dict", "companies", "projects"));
|
||||
|
||||
if ($conf->project->dir_output) {
|
||||
if ($conf->project->multidir_output[$object->entity]) {
|
||||
//$nblines = count($object->lines); // This is set later with array of tasks
|
||||
|
||||
$objectref = dol_sanitizeFileName($object->ref);
|
||||
$dir = $conf->project->dir_output;
|
||||
$dir = $conf->project->multidir_output[$object->entity];
|
||||
if (!preg_match('/specimen/i', $objectref)) {
|
||||
$dir .= "/".$objectref;
|
||||
}
|
||||
|
||||
@ -393,6 +393,13 @@ class pdf_aurore extends ModelePDFSupplierProposal
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Extrafields in note
|
||||
$extranote = $this->getExtrafieldsInHtml($object, $outputlangs);
|
||||
if (!empty($extranote)) {
|
||||
$notetoshow = dol_concatdesc($notetoshow, $extranote);
|
||||
}
|
||||
|
||||
if ($notetoshow) {
|
||||
$tab_top -= 2;
|
||||
|
||||
|
||||
@ -187,10 +187,11 @@ if (($line->info_bits & 2) == 2) {
|
||||
if ($line->date_start || $line->date_end) {
|
||||
print '<div class="clearboth nowraponall opacitymedium daterangeofline">'.get_date_range($line->date_start, $line->date_end, $format).'</div>';
|
||||
}
|
||||
|
||||
if (!$line->date_start || !$line->date_end) {
|
||||
// show warning under line
|
||||
// we need to fetch product associated to line for some test
|
||||
if ($object->element == 'propal' || $object->element == 'order' || $object->element == 'propal_supplier' || $object->element == 'supplier_proposal' || $object->element == 'commande') {
|
||||
if ($object->element == 'propal' || $object->element == 'order' || $object->element == 'facture' || $object->element == 'propal_supplier' || $object->element == 'supplier_proposal' || $object->element == 'commande') {
|
||||
$res = $line->fetch_product();
|
||||
if ($res > 0 ) {
|
||||
if ($line->product->isService() && $line->product->isMandatoryPeriod()) {
|
||||
|
||||
@ -595,6 +595,7 @@ if (empty($reshook)) {
|
||||
$num_prod = count($lines);
|
||||
for ($i = 0; $i < $num_prod; $i++) {
|
||||
if ($lines[$i]->id == $line_id) { // we have found line to update
|
||||
$update_done = false;
|
||||
$line = new ExpeditionLigne($db);
|
||||
$line->fk_expedition = $object->id;
|
||||
|
||||
@ -635,6 +636,8 @@ if (empty($reshook)) {
|
||||
if ($line->update($user) < 0) {
|
||||
setEventMessages($line->error, $line->errors, 'errors');
|
||||
$error++;
|
||||
} else {
|
||||
$update_done=true;
|
||||
}
|
||||
} else {
|
||||
setEventMessages($lotStock->error, $lotStock->errors, 'errors');
|
||||
@ -677,6 +680,8 @@ if (empty($reshook)) {
|
||||
if ($line->update($user) < 0) {
|
||||
setEventMessages($line->error, $line->errors, 'errors');
|
||||
$error++;
|
||||
} else {
|
||||
$update_done=true;
|
||||
}
|
||||
} else {
|
||||
setEventMessages($line->error, $line->errors, 'errors');
|
||||
@ -694,6 +699,8 @@ if (empty($reshook)) {
|
||||
if ($object->create_line_batch($line, $line->array_options) < 0) {
|
||||
setEventMessages($object->error, $object->errors, 'errors');
|
||||
$error++;
|
||||
} else {
|
||||
$update_done=true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@ -731,6 +738,8 @@ if (empty($reshook)) {
|
||||
if ($line->update($user) < 0) {
|
||||
setEventMessages($line->error, $line->errors, 'errors');
|
||||
$error++;
|
||||
} else {
|
||||
$update_done=true;
|
||||
}
|
||||
}
|
||||
unset($_POST[$stockLocation]);
|
||||
@ -745,6 +754,8 @@ if (empty($reshook)) {
|
||||
if ($line->update($user) < 0) {
|
||||
setEventMessages($line->error, $line->errors, 'errors');
|
||||
$error++;
|
||||
} else {
|
||||
$update_done=true;
|
||||
}
|
||||
unset($_POST[$qty]);
|
||||
}
|
||||
@ -757,10 +768,17 @@ if (empty($reshook)) {
|
||||
if ($line->update($user) < 0) {
|
||||
setEventMessages($line->error, $line->errors, 'errors');
|
||||
$error++;
|
||||
} else {
|
||||
$update_done=true;
|
||||
}
|
||||
unset($_POST[$qty]);
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($update_done)) {
|
||||
$line->id = $lines[$i]->id;
|
||||
$line->insertExtraFields();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
@ -71,7 +72,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');
|
||||
|
||||
@ -2594,8 +2594,8 @@ if ($action == 'create') {
|
||||
|
||||
print '</table>';
|
||||
print '</div>';
|
||||
//var_dump($object);
|
||||
print '<script javascript>
|
||||
|
||||
print '<script>
|
||||
|
||||
/* JQuery for product free or predefined select */
|
||||
jQuery(document).ready(function() {
|
||||
@ -2611,6 +2611,10 @@ if ($action == 'create') {
|
||||
jQuery("#value_unit_ht").val("");
|
||||
}
|
||||
});
|
||||
';
|
||||
|
||||
if (! empty($conf->global->MAIN_USE_EXPENSE_IK)) {
|
||||
print '
|
||||
|
||||
/* unit price coéf calculation */
|
||||
jQuery(".input_qty, #fk_c_type_fees, #select_fk_c_exp_tax_cat, #vatrate ").change(function(event) {
|
||||
@ -2656,6 +2660,10 @@ if ($action == 'create') {
|
||||
jQuery("#value_unit_ht").val("");
|
||||
}*/
|
||||
});
|
||||
';
|
||||
}
|
||||
|
||||
print '
|
||||
|
||||
});
|
||||
|
||||
|
||||
@ -198,9 +198,9 @@ class ExpenseReportIk extends CommonObject
|
||||
$default_range = (int) $userauthor->default_range; // if not defined, then 0
|
||||
$ranges = $this->getRangesByCategory($fk_c_exp_tax_cat);
|
||||
// prevent out of range -1 indice
|
||||
$indice = $default_range > 0 ? $default_range - 1 : 0;
|
||||
$indice = $default_range - 1;
|
||||
// substract 1 because array start from 0
|
||||
if (empty($ranges) || !isset($ranges[$indice])) {
|
||||
if (empty($ranges) || $indice < 0 || !isset($ranges[$indice])) {
|
||||
return false;
|
||||
} else {
|
||||
return $ranges[$indice];
|
||||
|
||||
@ -34,7 +34,7 @@ if (!defined('DOL_APPLICATION_TITLE')) {
|
||||
define('DOL_APPLICATION_TITLE', 'Dolibarr');
|
||||
}
|
||||
if (!defined('DOL_VERSION')) {
|
||||
define('DOL_VERSION', '16.0.4'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c
|
||||
define('DOL_VERSION', '16.0.5'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c
|
||||
}
|
||||
|
||||
if (!defined('EURO')) {
|
||||
|
||||
@ -884,8 +884,12 @@ if (empty($reshook)) {
|
||||
$totalcreditnotes = $facture_source->getSumCreditNotesUsed();
|
||||
$totaldeposits = $facture_source->getSumDepositsUsed();
|
||||
$remain_to_pay = abs($facture_source->total_ttc - $totalpaid - $totalcreditnotes - $totaldeposits);
|
||||
$desc = $langs->trans('invoiceAvoirLineWithPaymentRestAmount');
|
||||
$retAddLine = $object->addline($desc, $remain_to_pay, 0, 0, 0, 1, 0, 0, '', '', 0, '', 'TTC');
|
||||
|
||||
$object->addline($langs->trans('invoiceAvoirLineWithPaymentRestAmount'), $remain_to_pay, 0, 0, 0, 1, 0, 0, '', '', 'TTC');
|
||||
if ($retAddLine < 0) {
|
||||
$error++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1079,9 +1079,9 @@ if ($step == 4 && $datatoimport) {
|
||||
$valforsourcefieldnb[$lefti] = $key;
|
||||
$lefti++;
|
||||
|
||||
if ($lefti > count($fieldstarget)) {
|
||||
/*if ($lefti > count($fieldstarget)) {
|
||||
break; // Other fields are in the not imported area
|
||||
}
|
||||
}*/
|
||||
}
|
||||
//var_dump($valforsourcefieldnb);
|
||||
|
||||
@ -1134,9 +1134,9 @@ if ($step == 4 && $datatoimport) {
|
||||
|
||||
print '<table class="nobordernopadding centpercent tableimport">';
|
||||
foreach ($fieldssource as $code => $line) { // $fieldssource is an array code=column num, line=content on first line for column in source file.
|
||||
if ($i == $minpos) {
|
||||
/*if ($i == $minpos) {
|
||||
break;
|
||||
}
|
||||
}*/
|
||||
print '<tr style="height:'.$height.'" class="trimport oddevenimport">';
|
||||
$entity = (!empty($objimport->array_import_entities[0][$code]) ? $objimport->array_import_entities[0][$code] : $objimport->array_import_icon[0]);
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 1.0 MiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 1.0 MiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
@ -560,3 +560,6 @@ ALTER TABLE llx_bank ADD COLUMN amount_main_currency double(24,8) NULL;
|
||||
|
||||
ALTER TABLE llx_commande_fournisseurdet MODIFY COLUMN ref varchar(128);
|
||||
ALTER TABLE llx_facture_fourn_det MODIFY COLUMN ref varchar(128);
|
||||
|
||||
UPDATE llx_c_tva SET localtax2 = '-19:-15:-9' WHERE localtax2 = '-19' AND localtax2_type = '5' AND fk_pays = 4 AND taux = 21;
|
||||
|
||||
|
||||
@ -217,6 +217,10 @@ DELETE from llx_bank_url where type = 'company' and url_id not in (select rowid
|
||||
--SELECT * from llx_bank where rappro = 0 and label LIKE '(CustomerInvoicePayment%)' and rowid not in (select fk_bank from llx_bank_url where type = 'payment');
|
||||
--SELECT * from llx_bank where rappro = 0 and label LIKE '(SupplierInvoicePayment%)' and rowid not in (select fk_bank from llx_bank_url where type = 'payment_supplier');
|
||||
|
||||
-- Fix: delete orphelins in llx_bank
|
||||
DELETE FROM llx_bank WHERE fk_account NOT IN (select rowid from llx_bank_account);
|
||||
|
||||
|
||||
-- Fix link on parent that were removed
|
||||
DROP table tmp_user;
|
||||
CREATE TABLE tmp_user as (select * from llx_user);
|
||||
@ -565,14 +569,19 @@ UPDATE llx_facturedet SET situation_percent = 100 WHERE situation_percent IS NUL
|
||||
DELETE FROM llx_rights_def WHERE module = 'hrm' AND perms = 'employee';
|
||||
|
||||
|
||||
-- Sequence to fix the content of llx_bank.amount_main_currency
|
||||
-- Note: amount is amount in currency of bank account
|
||||
|
||||
-- Sequence to fix the content of llx_bank.amount_main_currency (value was empty and should not for payment on bank account with a different currency so when amount_main_currency is different than amount)
|
||||
-- Note: amount is amount in the currency of the bank account
|
||||
-- Note: pamount is always amount into the main currency
|
||||
-- Note: pmulticurrencyamount is in currency of invoice
|
||||
-- Note: amount_main_currency must be amount in main currency
|
||||
-- Note: pmulticurrencyamount is in the currency of invoice
|
||||
-- Note: amount_main_currency must be NULL or amount in main currency of company (we set it when the currency of the bank account differs from main currency)
|
||||
-- DROP TABLE tmp_bank;
|
||||
-- CREATE TABLE tmp_bank SELECT b.rowid, b.amount, p.rowid as pid, p.amount as pamount, p.multicurrency_amount as pmulticurrencyamount FROM llx_bank as b INNER JOIN llx_bank_url as bu ON bu.fk_bank=b.rowid AND bu.type = 'payment' INNER JOIN llx_paiement as p ON bu.url_id = p.rowid WHERE p.multicurrency_amount <> 0 AND p.multicurrency_amount <> p.amount;
|
||||
-- UPDATE llx_bank as b SET b.amount_main_currency = (SELECT tb.pamount FROM tmp_bank as tb WHERE tb.rowid = b.rowid) WHERE b.amount_main_currency IS NULL;
|
||||
-- CREATE TABLE tmp_bank SELECT b.rowid, b.amount, p.rowid as pid, p.amount as pamount, p.multicurrency_amount as pmulticurrencyamount, b.datec FROM llx_bank as b INNER JOIN llx_bank_url as bu ON bu.fk_bank=b.rowid AND bu.type = 'payment' INNER JOIN llx_paiement as p ON bu.url_id = p.rowid WHERE p.multicurrency_amount <> 0 AND p.multicurrency_amount <> p.amount;
|
||||
-- UPDATE llx_bank as b SET b.amount_main_currency = (SELECT tb.pamount FROM tmp_bank as tb WHERE tb.rowid = b.rowid) WHERE b.amount_main_currency IS NULL AND b.rowid IN (SELECT rowid FROM tmp_bank);
|
||||
-- DROP TABLE tmp_bank2;
|
||||
-- CREATE TABLE tmp_bank2 SELECT b.rowid, b.amount, p.rowid as pid, p.amount as pamount, p.multicurrency_amount as pmulticurrencyamount FROM llx_bank as b INNER JOIN llx_bank_url as bu ON bu.fk_bank=b.rowid AND bu.type = 'payment_supplier' INNER JOIN llx_paiementfourn as p ON bu.url_id = p.rowid WHERE p.multicurrency_amount <> 0 AND p.multicurrency_amount <> p.amount;
|
||||
-- UPDATE llx_bank as b SET b.amount_main_currency = (SELECT tb.pamount FROM tmp_bank2 as tb WHERE tb.rowid = b.rowid) WHERE b.amount_main_currency IS NULL;
|
||||
-- CREATE TABLE tmp_bank2 SELECT b.rowid, b.amount, p.rowid as pid, - p.amount as pamount, - p.multicurrency_amount as pmulticurrencyamount, b.datec FROM llx_bank as b INNER JOIN llx_bank_url as bu ON bu.fk_bank=b.rowid AND bu.type = 'payment_supplier' INNER JOIN llx_paiementfourn as p ON bu.url_id = p.rowid WHERE p.multicurrency_amount <> 0 AND p.multicurrency_amount <> p.amount;
|
||||
-- UPDATE llx_bank as b SET b.amount_main_currency = (SELECT tb.pamount FROM tmp_bank2 as tb WHERE tb.rowid = b.rowid) WHERE b.amount_main_currency IS NULL AND b.rowid IN (SELECT rowid FROM tmp_bank2);
|
||||
|
||||
-- Sequence to fix the content of llx_bank.amount_main_currency (sign was wrong with some version)
|
||||
-- UPDATE llx_bank as b SET b.amount_main_currency = -b.amount_main_currency WHERE b.amount IS NOT NULL AND b.amount_main_currency IS NOT NULL AND SIGN(b.amount_main_currency) <> SIGN(b.amount);
|
||||
|
||||
|
||||
@ -25,7 +25,7 @@ create table llx_bank
|
||||
datev date, -- date de valeur
|
||||
dateo date, -- date operation
|
||||
amount double(24,8) NOT NULL default 0, -- amount in the currency of the bank account
|
||||
amount_main_currency double(24,8) NULL, -- amount in the main currency of the company
|
||||
amount_main_currency double(24,8) NULL, -- amount in the main currency of the company when payment done in a bank account with a different currency
|
||||
label varchar(255),
|
||||
fk_account integer,
|
||||
fk_user_author integer,
|
||||
|
||||
@ -49,7 +49,7 @@ BoxTitleLastActionsToDo=Les %s derniers événements à réaliser
|
||||
BoxTitleLastContracts=Les %s derniers contrats modifiés
|
||||
BoxTitleLastModifiedDonations=Les %s derniers dons modifiés
|
||||
BoxTitleLastModifiedExpenses=Les %s dernières notes de frais modifiées
|
||||
BoxTitleLatestModifiedBoms=Les %s derières BOMS modifiées
|
||||
BoxTitleLatestModifiedBoms=Les %s dernières BOMS modifiées
|
||||
BoxTitleLatestModifiedMos=Les %s derniers ordres de fabrication modifiés
|
||||
BoxTitleLastOutstandingBillReached=Clients dont l'en-cours autorisé est dépassé
|
||||
BoxGlobalActivity=Activité globale (factures, propositions, commandes)
|
||||
|
||||
@ -390,7 +390,7 @@ if (empty($reshook)) {
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
|
||||
|
||||
$langs->load("other");
|
||||
$upload_dir = $conf->project->dir_output;
|
||||
$upload_dir = $conf->project->multidir_output[$object->entity];
|
||||
$file = $upload_dir.'/'.GETPOST('file');
|
||||
$ret = dol_delete_file($file, 0, 0, 0, $object);
|
||||
if ($ret) {
|
||||
@ -1402,12 +1402,12 @@ if ($action == 'create' && $user->rights->projet->creer) {
|
||||
* Generated documents
|
||||
*/
|
||||
$filename = dol_sanitizeFileName($object->ref);
|
||||
$filedir = $conf->project->dir_output."/".dol_sanitizeFileName($object->ref);
|
||||
$filedir = $conf->project->multidir_output[$object->entity]."/".dol_sanitizeFileName($object->ref);
|
||||
$urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
|
||||
$genallowed = ($user->rights->projet->lire && $userAccess > 0);
|
||||
$delallowed = ($user->rights->projet->creer && $userWrite > 0);
|
||||
|
||||
print $formfile->showdocuments('project', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf);
|
||||
print $formfile->showdocuments('project', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 0, 0, '', '', '', '', '', $object);
|
||||
|
||||
print '</div><div class="fichehalfright">';
|
||||
|
||||
@ -1426,7 +1426,7 @@ if ($action == 'create' && $user->rights->projet->creer) {
|
||||
// Presend form
|
||||
$modelmail = 'project';
|
||||
$defaulttopic = 'SendProjectRef';
|
||||
$diroutput = $conf->project->dir_output;
|
||||
$diroutput = $conf->project->multidir_output[$object->entity];
|
||||
$autocopy = 'MAIN_MAIL_AUTOCOPY_PROJECT_TO'; // used to know the automatic BCC to add
|
||||
$trackid = 'proj'.$object->id;
|
||||
|
||||
|
||||
@ -1347,6 +1347,7 @@ class Project extends CommonObject
|
||||
// Initialise parameters
|
||||
$this->id = 0;
|
||||
$this->ref = 'SPECIMEN';
|
||||
$this->entity = $conf->entity;
|
||||
$this->specimen = 1;
|
||||
$this->socid = 1;
|
||||
$this->date_c = $now;
|
||||
|
||||
@ -198,7 +198,7 @@ class Task extends CommonObjectLine
|
||||
$sql .= ", progress";
|
||||
$sql .= ", budget_amount";
|
||||
$sql .= ") VALUES (";
|
||||
$sql .= ((int) $conf->entity);
|
||||
$sql .= (!empty($this->entity) ? (int) $this->entity : (int) $conf->entity);
|
||||
$sql .= ", ".((int) $this->fk_project);
|
||||
$sql .= ", ".(!empty($this->ref) ? "'".$this->db->escape($this->ref)."'" : 'null');
|
||||
$sql .= ", ".((int) $this->fk_task_parent);
|
||||
@ -274,6 +274,7 @@ class Task extends CommonObjectLine
|
||||
$sql = "SELECT";
|
||||
$sql .= " t.rowid,";
|
||||
$sql .= " t.ref,";
|
||||
$sql .= " t.entity,";
|
||||
$sql .= " t.fk_projet as fk_project,";
|
||||
$sql .= " t.fk_task_parent,";
|
||||
$sql .= " t.label,";
|
||||
@ -318,6 +319,7 @@ class Task extends CommonObjectLine
|
||||
|
||||
$this->id = $obj->rowid;
|
||||
$this->ref = $obj->ref;
|
||||
$this->entity = $obj->entity;
|
||||
$this->fk_project = $obj->fk_project;
|
||||
$this->fk_task_parent = $obj->fk_task_parent;
|
||||
$this->label = $obj->label;
|
||||
@ -811,9 +813,11 @@ class Task extends CommonObjectLine
|
||||
* @param array $search_array_options Array of search
|
||||
* @param int $loadextras Fetch all Extrafields on each task
|
||||
* @param int $loadRoleMode 1= will test Roles on task; 0 used in delete project action
|
||||
* @param string $sortfield Sort field
|
||||
* @param string $sortorder Sort order
|
||||
* @return array Array of tasks
|
||||
*/
|
||||
public function getTasksArray($usert = null, $userp = null, $projectid = 0, $socid = 0, $mode = 0, $filteronproj = '', $filteronprojstatus = '-1', $morewherefilter = '', $filteronprojuser = 0, $filterontaskuser = 0, $extrafields = array(), $includebilltime = 0, $search_array_options = array(), $loadextras = 0, $loadRoleMode = 1)
|
||||
public function getTasksArray($usert = null, $userp = null, $projectid = 0, $socid = 0, $mode = 0, $filteronproj = '', $filteronprojstatus = '-1', $morewherefilter = '', $filteronprojuser = 0, $filterontaskuser = 0, $extrafields = array(), $includebilltime = 0, $search_array_options = array(), $loadextras = 0, $loadRoleMode = 1, $sortfield = '', $sortorder = '')
|
||||
{
|
||||
global $conf, $hookmanager;
|
||||
|
||||
@ -953,8 +957,11 @@ class Task extends CommonObjectLine
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$sql .= " ORDER BY p.ref, t.rang, t.dateo";
|
||||
if ($sortfield && $sortorder) {
|
||||
$sql .= $this->db->order($sortfield, $sortorder);
|
||||
} else {
|
||||
$sql .= " ORDER BY p.ref, t.rang, t.dateo";
|
||||
}
|
||||
|
||||
//print $sql;exit;
|
||||
dol_syslog(get_class($this)."::getTasksArray", LOG_DEBUG);
|
||||
|
||||
@ -49,7 +49,7 @@ if (!empty($conf->global->PROJECT_ALLOW_COMMENT_ON_PROJECT) && method_exists($ob
|
||||
}
|
||||
|
||||
if ($id > 0 || !empty($ref)) {
|
||||
$upload_dir = $conf->project->dir_output."/".dol_sanitizeFileName($object->ref);
|
||||
$upload_dir = $conf->project->multidir_output[$object->entity]."/".dol_sanitizeFileName($object->ref);
|
||||
}
|
||||
|
||||
// Get parameters
|
||||
@ -109,7 +109,7 @@ llxHeader('', $title, $help_url);
|
||||
$form = new Form($db);
|
||||
|
||||
if ($object->id > 0) {
|
||||
$upload_dir = $conf->project->dir_output.'/'.dol_sanitizeFileName($object->ref);
|
||||
$upload_dir = $conf->project->multidir_output[$object->entity].'/'.dol_sanitizeFileName($object->ref);
|
||||
|
||||
// To verify role of users
|
||||
//$userAccess = $object->restrictedProjectArea($user,'read');
|
||||
|
||||
@ -124,12 +124,12 @@ $search_array_options = $extrafields->getOptionalsFromPost($taskstatic->table_el
|
||||
|
||||
|
||||
// Default sort order (if not yet defined by previous GETPOST)
|
||||
if (!$sortfield) {
|
||||
/* if (!$sortfield) {
|
||||
reset($object->fields); $sortfield="t.".key($object->fields);
|
||||
} // Set here default search field. By default 1st field in definition. Reset is required to avoid key() to return null.
|
||||
if (!$sortorder) {
|
||||
$sortorder = "ASC";
|
||||
}
|
||||
} */
|
||||
|
||||
|
||||
// Security check
|
||||
@ -336,6 +336,7 @@ if ($action == 'createtask' && $user->rights->projet->creer) {
|
||||
$task = new Task($db);
|
||||
|
||||
$task->fk_project = $projectid;
|
||||
$task->entity = $object->entity; // Task have the same entity of project
|
||||
$task->ref = $taskref;
|
||||
$task->label = $label;
|
||||
$task->description = $description;
|
||||
@ -848,7 +849,7 @@ if ($action == 'create' && $user->rights->projet->creer && (empty($object->third
|
||||
// Get list of tasks in tasksarray and taskarrayfiltered
|
||||
// We need all tasks (even not limited to a user because a task to user can have a parent that is not affected to him).
|
||||
$filteronthirdpartyid = $socid;
|
||||
$tasksarray = $taskstatic->getTasksArray(0, 0, $object->id, $filteronthirdpartyid, 0, '', -1, $morewherefilter, 0, 0, $extrafields, 1, $search_array_options);
|
||||
$tasksarray = $taskstatic->getTasksArray(0, 0, $object->id, $filteronthirdpartyid, 0, '', -1, $morewherefilter, 0, 0, $extrafields, 1, $search_array_options, 0, 1, $sortfield, $sortorder);
|
||||
|
||||
// We load also tasks limited to a particular user
|
||||
$tmpuser = new User($db);
|
||||
@ -998,41 +999,41 @@ if ($action == 'create' && $user->rights->projet->creer && (empty($object->third
|
||||
print '<tr class="liste_titre nodrag nodrop">';
|
||||
// print '<td>'.$langs->trans("Project").'</td>';
|
||||
if (!empty($arrayfields['t.ref']['checked'])) {
|
||||
print_liste_field_titre($arrayfields['t.ref']['label'], $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, '');
|
||||
print_liste_field_titre($arrayfields['t.ref']['label'], $_SERVER["PHP_SELF"], 't.ref', '', $param, '', $sortfield, $sortorder, '');
|
||||
}
|
||||
if (!empty($arrayfields['t.label']['checked'])) {
|
||||
print_liste_field_titre($arrayfields['t.label']['label'], $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, '');
|
||||
print_liste_field_titre($arrayfields['t.label']['label'], $_SERVER["PHP_SELF"], "t.label", '', $param, '', $sortfield, $sortorder, '');
|
||||
}
|
||||
if (!empty($arrayfields['t.description']['checked'])) {
|
||||
print_liste_field_titre($arrayfields['t.description']['label'], $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, '');
|
||||
}
|
||||
if (!empty($arrayfields['t.dateo']['checked'])) {
|
||||
print_liste_field_titre($arrayfields['t.dateo']['label'], $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'center ');
|
||||
print_liste_field_titre($arrayfields['t.dateo']['label'], $_SERVER["PHP_SELF"], "t.dateo", '', $param, '', $sortfield, $sortorder, 'center ');
|
||||
}
|
||||
if (!empty($arrayfields['t.datee']['checked'])) {
|
||||
print_liste_field_titre($arrayfields['t.datee']['label'], $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'center ');
|
||||
print_liste_field_titre($arrayfields['t.datee']['label'], $_SERVER["PHP_SELF"], "t.datee", '', $param, '', $sortfield, $sortorder, 'center ');
|
||||
}
|
||||
if (!empty($arrayfields['t.planned_workload']['checked'])) {
|
||||
print_liste_field_titre($arrayfields['t.planned_workload']['label'], $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'right ', '', 1);
|
||||
print_liste_field_titre($arrayfields['t.planned_workload']['label'], $_SERVER["PHP_SELF"], "t.planned_workload", '', $param, '', $sortfield, $sortorder, 'right ', '', 1);
|
||||
}
|
||||
if (!empty($arrayfields['t.duration_effective']['checked'])) {
|
||||
print_liste_field_titre($arrayfields['t.duration_effective']['label'], $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'right ', '', 1);
|
||||
print_liste_field_titre($arrayfields['t.duration_effective']['label'], $_SERVER["PHP_SELF"], "t.duration_effective", '', $param, '', $sortfield, $sortorder, 'right ', '', 1);
|
||||
}
|
||||
if (!empty($arrayfields['t.progress_calculated']['checked'])) {
|
||||
print_liste_field_titre($arrayfields['t.progress_calculated']['label'], $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'right ', '', 1);
|
||||
}
|
||||
if (!empty($arrayfields['t.progress']['checked'])) {
|
||||
print_liste_field_titre($arrayfields['t.progress']['label'], $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'right ', '', 1);
|
||||
print_liste_field_titre($arrayfields['t.progress']['label'], $_SERVER["PHP_SELF"], "t.progress", '', $param, '', $sortfield, $sortorder, 'right ', '', 1);
|
||||
}
|
||||
if (!empty($arrayfields['t.progress_summary']['checked'])) {
|
||||
print_liste_field_titre($arrayfields['t.progress_summary']['label'], $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'center ', '', 1);
|
||||
}
|
||||
if ($object->usage_bill_time) {
|
||||
if (!empty($arrayfields['t.tobill']['checked'])) {
|
||||
print_liste_field_titre($arrayfields['t.tobill']['label'], $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'right ');
|
||||
print_liste_field_titre($arrayfields['t.tobill']['label'], $_SERVER["PHP_SELF"], "t.tobill", '', $param, '', $sortfield, $sortorder, 'right ');
|
||||
}
|
||||
if (!empty($arrayfields['t.billed']['checked'])) {
|
||||
print_liste_field_titre($arrayfields['t.billed']['label'], $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'right ');
|
||||
print_liste_field_titre($arrayfields['t.billed']['label'], $_SERVER["PHP_SELF"], "t.billed", '', $param, '', $sortfield, $sortorder, 'right ');
|
||||
}
|
||||
}
|
||||
// Contacts of task, disabled because available by default jsut after
|
||||
@ -1043,7 +1044,7 @@ if ($action == 'create' && $user->rights->projet->creer && (empty($object->third
|
||||
*/
|
||||
|
||||
if (!empty($arrayfields['t.budget_amount']['checked'])) {
|
||||
print_liste_field_titre($arrayfields['t.budget_amount']['label'], $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'center ');
|
||||
print_liste_field_titre($arrayfields['t.budget_amount']['label'], $_SERVER["PHP_SELF"], "t.budget_amount", "", $param, '', $sortfield, $sortorder, 'center ');
|
||||
}
|
||||
|
||||
if (!empty($arrayfields['c.assigned']['checked'])) {
|
||||
|
||||
@ -110,7 +110,7 @@ if ($id > 0 || !empty($ref)) {
|
||||
|
||||
$object->project = clone $projectstatic;
|
||||
|
||||
$upload_dir = $conf->project->dir_output.'/'.dol_sanitizeFileName($projectstatic->ref).'/'.dol_sanitizeFileName($object->ref);
|
||||
$upload_dir = $conf->project->multidir_output[$projectstatic->entity].'/'.dol_sanitizeFileName($projectstatic->ref).'/'.dol_sanitizeFileName($object->ref);
|
||||
}
|
||||
|
||||
include DOL_DOCUMENT_ROOT.'/core/actions_linkedfiles.inc.php';
|
||||
|
||||
@ -544,7 +544,6 @@ if (empty($conf->global->MEMBER_NEWFORM_FORCEMORPHY)) {
|
||||
print $form->selectarray("morphy", $morphys, GETPOST('morphy'), 1);
|
||||
print '</td></tr>'."\n";
|
||||
} else {
|
||||
print $morphys[$conf->global->MEMBER_NEWFORM_FORCEMORPHY];
|
||||
print '<input type="hidden" id="morphy" name="morphy" value="'.$conf->global->MEMBER_NEWFORM_FORCEMORPHY.'">';
|
||||
}
|
||||
|
||||
|
||||
@ -55,7 +55,16 @@ include_once '../../../main.inc.php'; // Load $user and permissions
|
||||
|
||||
$action = GETPOST('action', 'aZ09');
|
||||
$id = GETPOST('id', 'int');
|
||||
$email = GETPOST('email', 'alphanohtml');
|
||||
$email = GETPOST('email', 'custom', 0, FILTER_VALIDATE_EMAIL);
|
||||
|
||||
|
||||
if (!isModEnabled('ticket')) {
|
||||
accessforbidden('', 0, 0, 1);
|
||||
}
|
||||
|
||||
if (empty($conf->global->TICKET_CREATE_THIRD_PARTY_WITH_CONTACT_IF_NOT_EXIST)) {
|
||||
accessforbidden('', 0, 0, 1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@ -889,7 +889,7 @@ if ($action == 'create') {
|
||||
if ($objectsrc->fetch_optionals() > 0) {
|
||||
$recept->array_options = array_merge($recept->array_options, $objectsrc->array_options);
|
||||
}
|
||||
print $object->showOptionals($extrafields, 'create', $parameters);
|
||||
print $recept->showOptionals($extrafields, 'create', $parameters);
|
||||
}
|
||||
|
||||
// Incoterms
|
||||
|
||||
@ -260,7 +260,7 @@ if (empty($reshook)) {
|
||||
|
||||
if (!$error) {
|
||||
// File transfer
|
||||
$object->copyFilesForTicket();
|
||||
$object->copyFilesForTicket(''); // trackid is forced to '' because files were uploaded when no id for ticket exists yet and trackid was ''
|
||||
}
|
||||
|
||||
if (!$error) {
|
||||
@ -713,6 +713,7 @@ if ($action == 'create' || $action == 'presend') {
|
||||
|
||||
print load_fiche_titre($langs->trans('NewTicket'), '', 'ticket');
|
||||
|
||||
$formticket->trackid = ''; // TODO Use a unique key to avoid conflict in upload file feature
|
||||
$formticket->withfromsocid = $socid ? $socid : $user->socid;
|
||||
$formticket->withfromcontactid = $contactid ? $contactid : '';
|
||||
$formticket->withtitletopic = 1;
|
||||
|
||||
@ -1319,7 +1319,7 @@ class Ticket extends CommonObject
|
||||
public function LibStatut($status, $mode = 0, $notooltip = 0, $progress = 0)
|
||||
{
|
||||
// phpcs:enable
|
||||
global $langs;
|
||||
global $langs, $hookmanager;
|
||||
|
||||
$labelStatus = $this->statuts[$status];
|
||||
$labelStatusShort = $this->statuts_short[$status];
|
||||
@ -1347,6 +1347,18 @@ class Ticket extends CommonObject
|
||||
$mode = 0;
|
||||
}
|
||||
|
||||
$parameters = array(
|
||||
'status' => $status,
|
||||
'mode' => $mode,
|
||||
);
|
||||
|
||||
// Note that $action and $object may have been modified by hook
|
||||
$reshook = $hookmanager->executeHooks('LibStatut', $parameters, $this);
|
||||
|
||||
if ($reshook > 0) {
|
||||
return $hookmanager->resPrint;
|
||||
}
|
||||
|
||||
$params = array();
|
||||
if ($notooltip) {
|
||||
$params = array('tooltip' => 'no');
|
||||
@ -2349,9 +2361,10 @@ class Ticket extends CommonObject
|
||||
* Used for files linked into messages.
|
||||
* Files may be renamed during copy to avoid overwriting existing files.
|
||||
*
|
||||
* @return array Array with final path/name/mime of files.
|
||||
* @param string $forcetrackid Force trackid
|
||||
* @return array Array with final path/name/mime of files.
|
||||
*/
|
||||
public function copyFilesForTicket()
|
||||
public function copyFilesForTicket($forcetrackid = null)
|
||||
{
|
||||
global $conf;
|
||||
|
||||
@ -2366,7 +2379,7 @@ class Ticket extends CommonObject
|
||||
$maxheightmini = 72;
|
||||
|
||||
$formmail = new FormMail($this->db);
|
||||
$formmail->trackid = 'tic'.$this->id;
|
||||
$formmail->trackid = (is_null($forcetrackid) ? 'tic'.$this->id : '');
|
||||
$attachedfiles = $formmail->get_attached_files();
|
||||
|
||||
$filepath = $attachedfiles['paths'];
|
||||
|
||||
@ -344,6 +344,7 @@ $morehtmlright = "";
|
||||
// Build and execute select
|
||||
// --------------------------------------------------------------------
|
||||
$sql = "SELECT DISTINCT u.rowid, u.lastname, u.firstname, u.admin, u.fk_soc, u.login, u.office_phone, u.user_mobile, u.email, u.api_key, u.accountancy_code, u.gender, u.employee, u.photo,";
|
||||
$sql .= " u.fk_user,";
|
||||
$sql .= " u.salary, u.datelastlogin, u.datepreviouslogin,";
|
||||
$sql .= " u.ldap_sid, u.statut as status, u.entity,";
|
||||
$sql .= " u.tms as date_update, u.datec as date_creation,";
|
||||
|
||||
@ -219,6 +219,7 @@ class AllTests
|
||||
require_once dirname(__FILE__).'/AccountingAccountTest.php';
|
||||
$suite->addTestSuite('AccountingAccountTest');
|
||||
|
||||
// Rest
|
||||
require_once dirname(__FILE__).'/RestAPIUserTest.php';
|
||||
$suite->addTestSuite('RestAPIUserTest');
|
||||
require_once dirname(__FILE__).'/RestAPIDocumentTest.php';
|
||||
@ -270,6 +271,10 @@ class AllTests
|
||||
require_once dirname(__FILE__).'/EmailCollectorTest.php';
|
||||
$suite->addTestSuite('EmailCollectorTest');
|
||||
|
||||
// Website
|
||||
require_once dirname(__FILE__).'/WebsiteTest.php';
|
||||
$suite->addTestSuite('WebsiteTest');
|
||||
|
||||
return $suite;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1193,7 +1193,7 @@ class FunctionsLibTest extends PHPUnit\Framework\TestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* testGetDefaultTva
|
||||
* testGetDefaultLocalTax
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
@ -1280,6 +1280,27 @@ class FunctionsLibTest extends PHPUnit\Framework\TestCase
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* testGetLocalTaxByThird
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testGetLocalTaxByThird()
|
||||
{
|
||||
global $mysoc;
|
||||
|
||||
$mysoc->country_code = 'ES';
|
||||
|
||||
$result = get_localtax_by_third(1);
|
||||
print __METHOD__." result=".$result."\n";
|
||||
$this->assertEquals('5.2', $result);
|
||||
|
||||
$result = get_localtax_by_third(2);
|
||||
print __METHOD__." result=".$result."\n";
|
||||
$this->assertEquals('-19:-15:-9', $result);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* testDolExplodeIntoArray
|
||||
*
|
||||
|
||||
@ -152,6 +152,8 @@ class NumberingModulesTest extends PHPUnit\Framework\TestCase
|
||||
|
||||
$localobject=new Facture($this->savdb);
|
||||
$localobject->initAsSpecimen();
|
||||
$localobject->fetch_thirdparty();
|
||||
|
||||
$localobject->date=dol_mktime(12, 0, 0, 1, 1, 1915); // we use year 1915 to be sure to not have existing invoice for this year (usefull only if numbering is {0000@1}
|
||||
$numbering=new mod_facture_mercure();
|
||||
$result=$numbering->getNextValue($mysoc, $localobject);
|
||||
|
||||
@ -175,4 +175,22 @@ class WebsiteTest extends PHPUnit\Framework\TestCase
|
||||
// We must found no line (so code should be KO). If we found somethiing, it means there is a SQL injection of the 1=1
|
||||
$this->assertEquals($res['code'], 'KO');
|
||||
}
|
||||
|
||||
/**
|
||||
* testDolStripPhpCode
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testDolStripPhpCode()
|
||||
{
|
||||
global $db;
|
||||
|
||||
$s = "abc\n<?php echo 'def'\n// comment\n ?>ghi";
|
||||
$result = dolStripPhpCode($s);
|
||||
$this->assertEquals("abc\n<span phptag></span>ghi", $result);
|
||||
|
||||
$s = "abc\n<?PHP echo 'def'\n// comment\n ?>ghi";
|
||||
$result = dolStripPhpCode($s);
|
||||
$this->assertEquals("abc\n<span phptag></span>ghi", $result);
|
||||
}
|
||||
}
|
||||