Merge branch 'develop' into fix/translations_2025_02_11

This commit is contained in:
Frédéric FRANCE 2025-02-11 10:56:36 +01:00 committed by GitHub
commit d76a862500
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
35 changed files with 341 additions and 294 deletions

View File

@ -9,24 +9,24 @@
*/
return [
// # Issue statistics:
// PhanTypeMismatchArgument : 2000+ occurrences
// PhanTypeMismatchArgument : 1900+ occurrences
// PhanUndeclaredProperty : 520+ occurrences
// PhanTypeMismatchArgumentNullable : 400+ occurrences
// PhanUndeclaredGlobalVariable : 180+ occurrences
// PhanTypeMismatchArgumentNullable : 380+ occurrences
// PhanPluginUnknownArrayMethodReturnType : 170+ occurrences
// PhanUndeclaredGlobalVariable : 170+ occurrences
// PhanTypeMismatchProperty : 130+ occurrences
// PhanPluginUnknownArrayMethodParamType : 110+ occurrences
// PhanTypeMismatchArgumentProbablyReal : 110+ occurrences
// PhanPossiblyUndeclaredGlobalVariable : 100+ occurrences
// PhanTypeMismatchArgumentProbablyReal : 100+ occurrences
// PhanRedefineFunction : 40+ occurrences
// PhanTypeExpectedObjectPropAccess : 40+ occurrences
// PhanTypeInvalidDimOffset : 25+ occurrences
// PhanPluginUndeclaredVariableIsset : 20+ occurrences
// PhanTypeMismatchDimFetch : 20+ occurrences
// PhanPluginUndeclaredVariableIsset : 15+ occurrences
// PhanUndeclaredConstant : 15+ occurrences
// PhanTypeMismatchArgumentNullableInternal : 10+ occurrences
// PhanUndeclaredMethod : 10+ occurrences
// PhanTypeComparisonFromArray : 9 occurrences
// PhanTypeComparisonFromArray : 8 occurrences
// PhanPluginSuspiciousParamPosition : 7 occurrences
// PhanPluginDuplicateExpressionBinaryOp : 6 occurrences
// PhanPluginUnknownObjectMethodCall : 6 occurrences
@ -352,7 +352,6 @@ return [
'htdocs/core/class/html.formfile.class.php' => ['PhanTypeMismatchArgument'],
'htdocs/core/class/html.formmail.class.php' => ['PhanTypeMismatchArgument', 'PhanUndeclaredProperty'],
'htdocs/core/class/html.formother.class.php' => ['PhanTypeMismatchArgument'],
'htdocs/core/class/html.formprojet.class.php' => ['PhanTypeMismatchArgument'],
'htdocs/core/class/html.formsetup.class.php' => ['PhanTypeMismatchArgument', 'PhanTypeMismatchArgumentNullable'],
'htdocs/core/class/link.class.php' => ['PhanTypeMismatchArgumentNullable'],
'htdocs/core/class/menubase.class.php' => ['PhanTypeMismatchArgument'],
@ -417,7 +416,6 @@ return [
'htdocs/core/modules/hrm/mod_evaluation_advanced.php' => ['PhanUndeclaredProperty'],
'htdocs/core/modules/import/import_csv.modules.php' => ['PhanPossiblyUndeclaredVariable', 'PhanTypeMismatchArgumentNullable', 'PhanTypeMismatchProperty'],
'htdocs/core/modules/import/import_xlsx.modules.php' => ['PhanTypeMismatchProperty'],
'htdocs/core/modules/mailings/eventorganization.modules.php' => ['PhanTypeMismatchArgument'],
'htdocs/core/modules/member/doc/pdf_standard_member.class.php' => ['PhanTypeMismatchArgument'],
'htdocs/core/modules/member/modules_cards.php' => ['PhanTypeMismatchArgument'],
'htdocs/core/modules/modAdherent.class.php' => ['PhanTypeMismatchArgument'],
@ -612,25 +610,9 @@ return [
'htdocs/product/stock/stocktransfer/stocktransfer_card.php' => ['PhanUndeclaredGlobalVariable'],
'htdocs/product/stock/tpl/stockcorrection.tpl.php' => ['PhanUndeclaredProperty'],
'htdocs/product/stock/tpl/stocktransfer.tpl.php' => ['PhanUndeclaredProperty'],
'htdocs/projet/activity/perday.php' => ['PhanTypeMismatchArgument'],
'htdocs/projet/activity/permonth.php' => ['PhanTypeMismatchArgument'],
'htdocs/projet/activity/perweek.php' => ['PhanTypeMismatchArgument'],
'htdocs/projet/admin/project.php' => ['PhanTypeMismatchArgumentProbablyReal'],
'htdocs/projet/admin/website.php' => ['PhanTypeMismatchArgument'],
'htdocs/projet/ajax/projects.php' => ['PhanTypeMismatchArgument', 'PhanTypeMismatchArgumentProbablyReal'],
'htdocs/projet/card.php' => ['PhanTypeMismatchArgument', 'PhanTypeMismatchArgumentNullable', 'PhanUndeclaredGlobalVariable'],
'htdocs/projet/class/api_projects.class.php' => ['PhanTypeMismatchArgument'],
'htdocs/projet/card.php' => ['PhanTypeMismatchArgumentNullable', 'PhanUndeclaredGlobalVariable'],
'htdocs/projet/class/api_tasks.class.php' => ['PhanPluginUnknownArrayMethodParamType', 'PhanPluginUnknownArrayMethodReturnType', 'PhanTypeMismatchArgument'],
'htdocs/projet/class/project.class.php' => ['PhanTypeMismatchArgument'],
'htdocs/projet/class/projectstats.class.php' => ['PhanTypeMismatchArgument'],
'htdocs/projet/class/task.class.php' => ['PhanTypeMismatchArgument'],
'htdocs/projet/class/taskstats.class.php' => ['PhanTypeMismatchArgument'],
'htdocs/projet/contact.php' => ['PhanPossiblyUndeclaredGlobalVariable', 'PhanTypeComparisonFromArray', 'PhanTypeMismatchArgument', 'PhanTypeMismatchArgumentProbablyReal'],
'htdocs/projet/element.php' => ['PhanTypeMismatchArgument', 'PhanTypeMismatchArgumentNullable', 'PhanUndeclaredProperty'],
'htdocs/projet/ganttchart.inc.php' => ['PhanTypeMismatchArgumentProbablyReal', 'PhanUndeclaredGlobalVariable'],
'htdocs/projet/ganttview.php' => ['PhanPossiblyUndeclaredGlobalVariable', 'PhanTypeMismatchArgumentProbablyReal'],
'htdocs/projet/graph_opportunities.inc.php' => ['PhanPluginUndeclaredVariableIsset', 'PhanUndeclaredGlobalVariable'],
'htdocs/projet/list.php' => ['PhanTypeMismatchArgument', 'PhanTypeMismatchArgumentNullable'],
'htdocs/projet/stats/index.php' => ['PhanPossiblyUndeclaredGlobalVariable', 'PhanTypeMismatchArgument'],
'htdocs/projet/tasks.php' => ['PhanPossiblyUndeclaredGlobalVariable', 'PhanTypeMismatchArgument', 'PhanTypeMismatchArgumentProbablyReal'],
'htdocs/projet/tasks/comment.php' => ['PhanTypeMismatchArgumentProbablyReal'],
@ -778,7 +760,7 @@ return [
'htdocs/ticket/class/ticketstats.class.php' => ['PhanTypeMismatchArgument'],
'htdocs/ticket/contact.php' => ['PhanTypeMismatchArgument'],
'htdocs/ticket/document.php' => ['PhanTypeMismatchArgument'],
'htdocs/ticket/index.php' => ['PhanPossiblyUndeclaredGlobalVariable', 'PhanTypeMismatchArgumentNullableInternal'],
'htdocs/ticket/index.php' => ['PhanPossiblyUndeclaredGlobalVariable'],
'htdocs/ticket/list.php' => ['PhanTypeMismatchArgument'],
'htdocs/ticket/messaging.php' => ['PhanTypeMismatchArgument'],
'htdocs/ticket/stats/index.php' => ['PhanTypeMismatchArgument'],

View File

@ -9,7 +9,7 @@
* Copyright (C) 2015 Alexandre Spangaro <aspangaro@open-dsi.fr>
* Copyright (C) 2018-2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2019 Ferran Marcet <fmarcet@2byte.es>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
*
* 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
@ -1682,7 +1682,7 @@ if ($action == 'create') {
print '<tr><td class="titlefieldcreate">'.$langs->trans("Project").'</td><td id="project-input-container">';
print img_picto('', 'project', 'class="pictofixedwidth"');
print $formproject->select_projects(($object->socid > 0 ? $object->socid : -1), $projectid, 'projectid', 0, 0, 1, 1, 0, 0, 0, '', 1, 0, 'maxwidth500 widthcentpercentminusxx maxwidth500');
print $formproject->select_projects(($object->socid > 0 ? $object->socid : -1), (string) $projectid, 'projectid', 0, 0, 1, 1, 0, 0, 0, '', 1, 0, 'maxwidth500 widthcentpercentminusxx maxwidth500');
print '&nbsp;<a href="'.DOL_URL_ROOT.'/projet/card.php?socid='.(empty($societe->id) ? '' : $societe->id).'&action=create&backtopage='.urlencode($_SERVER["PHP_SELF"].'?action=create').'">';
print '<span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans("AddProject").'"></span></a>';
@ -1708,14 +1708,14 @@ if ($action == 'create') {
// Task
print '<tr><td class="titlefieldcreate">'.$langs->trans("Task").'</td><td id="project-task-input-container" >';
print img_picto('', 'projecttask', 'class="paddingrightonly"');
$projectsListId = false;
$projectsListId = '';
if (!empty($projectid)) {
$projectsListId = $projectid;
}
$tid = GETPOSTISSET("projecttaskid") ? GETPOSTINT("projecttaskid") : (GETPOSTISSET("taskid") ? GETPOSTINT("taskid") : '');
$formproject->selectTasks((!empty($societe->id) ? $societe->id : -1), $tid, 'taskid', 24, 0, '1', 1, 0, 0, 'maxwidth500 widthcentpercentminusxx', $projectsListId);
$formproject->selectTasks((!empty($societe->id) ? $societe->id : -1), $tid, 'taskid', 24, 0, '1', 1, 0, 0, 'maxwidth500 widthcentpercentminusxx', (string) $projectsListId);
print '</td></tr>';
}
@ -2144,8 +2144,8 @@ if ($id > 0) {
'type' => 'user',
//'transparency'=>$object->userassigned[$user->id]['transparency'],
'transparency' => $object->transparency, // Force transparency on ownerfrom event
'answer_status' => (isset($object->userassigned[$object->userownerid]['answer_status']) ? $object->userassigned[$object->userownerid]['answer_status']: null),
'mandatory' => (isset($object->userassigned[$object->userownerid]['mandatory']) ? $object->userassigned[$object->userownerid]['mandatory']:null)
'answer_status' => (isset($object->userassigned[$object->userownerid]['answer_status']) ? $object->userassigned[$object->userownerid]['answer_status'] : null),
'mandatory' => (isset($object->userassigned[$object->userownerid]['mandatory']) ? $object->userassigned[$object->userownerid]['mandatory'] : null)
);
}
if (!empty($object->userassigned)) { // Now concat assigned users
@ -2255,7 +2255,7 @@ if ($id > 0) {
print '<tr><td class="titlefieldcreate">'.$langs->trans("Project").'</td><td>';
print img_picto('', 'project', 'class="pictofixedwidth"');
$numprojet = $formproject->select_projects(($object->socid > 0 ? $object->socid : -1), $object->fk_project, 'projectid', 0, 0, 1, 0, 0, 0, 0, '', 0, 0, 'maxwidth500 widthcentpercentminusxx');
$numprojet = $formproject->select_projects(($object->socid > 0 ? $object->socid : -1), (string) $object->fk_project, 'projectid', 0, 0, 1, 0, 0, 0, 0, '', 0, 0, 'maxwidth500 widthcentpercentminusxx');
if ($numprojet == 0) {
print ' &nbsp; <a href="'.DOL_URL_ROOT.'/projet/card.php?socid='.$object->socid.'&action=create&token='.newToken().'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?id='.$object->id.'&action=edit').'"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans("AddProject").'"></span></a>';
}
@ -2294,7 +2294,7 @@ if ($id > 0) {
})';
print '</script>'."\n";
$formproject->selectTasks((!empty($societe->id) ? $societe->id : -1), $object->fk_element, 'fk_element', 24, 0, 0, 1, 0, 0, 'maxwidth500', $object->fk_project);
$formproject->selectTasks((!empty($societe->id) ? $societe->id : -1), $object->fk_element, 'fk_element', 24, 0, '', 1, 0, 0, 'maxwidth500', (string) $object->fk_project);
print '<input type="hidden" name="elementtype" value="'.$object->elementtype.'">';
print '</td>';

View File

@ -17,7 +17,7 @@
* Copyright (C) 2022 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
* Copyright (C) 2023 Lenin Rivas <lenin.rivas777@gmail.com>
* Copyright (C) 2023 William Mead <william.mead@manchenumerique.fr>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
*
* This program is free software; you can redistribute it and/or modify
@ -2164,7 +2164,7 @@ if ($action == 'create') {
$sday = date("d", $tmpdte);
print $form->selectDate($syear."-".$smonth."-".$sday, 'date_livraison', 0, 0, 0, "addprop");
} else {
$tmp_date_delivery = GETPOST('date_delivery') ? : -1;
$tmp_date_delivery = GETPOST('date_delivery') ?: -1;
print $form->selectDate($tmp_date_delivery, 'date_livraison', 0, 0, 0, "addprop", 1, 1);
}
print '</td></tr>';
@ -2174,7 +2174,7 @@ if ($action == 'create') {
$langs->load("projects");
print '<tr class="field_projectid">';
print '<td class="titlefieldcreate">'.$langs->trans("Project").'</td><td class="valuefieldcreate">';
print img_picto('', 'project', 'class="pictofixedwidth"').$formproject->select_projects(($soc->id > 0 ? $soc->id : -1), $projectid, 'projectid', 0, 0, 1, 1, 0, 0, 0, '', 1, 0, 'maxwidth500 widthcentpercentminusxx');
print img_picto('', 'project', 'class="pictofixedwidth"').$formproject->select_projects(($soc->id > 0 ? $soc->id : -1), (string) $projectid, 'projectid', 0, 0, 1, 1, 0, 0, 0, '', 1, 0, 'maxwidth500 widthcentpercentminusxx');
print ' <a href="'.DOL_URL_ROOT.'/projet/card.php?socid='.$soc->id.'&action=create&status=1&backtopage='.urlencode($_SERVER["PHP_SELF"].'?action=create&socid='.$soc->id).'"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans("AddProject").'"></span></a>';
print '</td>';
print '</tr>';

View File

@ -19,7 +19,7 @@
* Copyright (C) 2022 OpenDSI <support@open-dsi.fr>
* Copyright (C) 2022 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
* Copyright (C) 2023 William Mead <william.mead@manchenumerique.fr>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
*
* 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
@ -3771,7 +3771,7 @@ class Propal extends CommonObject
if (is_null($this->project) || (is_object($this->project) && $this->project->isEmpty())) {
$res = $this->fetchProject();
if ($res > 0 && $this->project instanceof Project) {
$datas['project'] = '<br><b>'.$langs->trans('Project').':</b> '.$this->project->getNomUrl(1, '', 0, 1);
$datas['project'] = '<br><b>'.$langs->trans('Project').':</b> '.$this->project->getNomUrl(1, '', 0, '1');
}
}
}

View File

@ -3728,7 +3728,7 @@ class Commande extends CommonOrder
if (is_null($this->project) || (is_object($this->project) && $this->project->isEmpty())) {
$res = $this->fetchProject();
if ($res > 0 && $this->project instanceof Project) {
$datas['project'] = '<br><b>'.$langs->trans('Project').':</b> '.$this->project->getNomUrl(1, '', 0, 1);
$datas['project'] = '<br><b>'.$langs->trans('Project').':</b> '.$this->project->getNomUrl(1, '', 0, '1');
}
}
}

View File

@ -5,7 +5,7 @@
* Copyright (C) 2020 Maxime DEMAREST <maxime@indelog.fr>
* Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
* Copyright (C) 2022-2025 Alexandre Spangaro <alexandre@inovea-conseil.com>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
@ -673,7 +673,7 @@ if (isModEnabled('project')) {
$formproject = new FormProjets($db);
$langs->load('projects');
print '<span class="marginrightonly">'.$langs->trans('Project').":</span>";
print img_picto('', 'project').$formproject->select_projects(($socid > 0 ? $socid : -1), $projectid, 'projectid', 0, 0, 1, 0, 0, 0, 0, '', 1, 0, '');
print img_picto('', 'project').$formproject->select_projects(($socid > 0 ? $socid : -1), (string) $projectid, 'projectid', 0, 0, 1, 0, 0, 0, 0, '', 1, 0, '');
print '<span class="classfortooltip" style="padding: 0px; padding: 0px; padding-right: 3px !important;" title="'.$langs->trans('ExportAccountingProjectHelp').'"><span class="fas fa-info-circle em088 opacityhigh" style=" vertical-align: middle; cursor: help"></span></span>';
print '<br>';
}

View File

@ -514,7 +514,7 @@ if ($action == 'create') {
print '<tr><td>'.$langs->trans("Project").'</td><td>';
print img_picto('', 'project', 'class="pictofixedwidth"');
print $formproject->select_projects(-1, $projectid, 'fk_project', 0, 0, 1, 1, 0, 0, 0, '', 1);
print $formproject->select_projects(-1, (string) $projectid, 'fk_project', 0, 0, 1, 1, 0, 0, 0, '', 1);
print '</td></tr>';
}
@ -626,7 +626,7 @@ if ($id) {
$morehtmlref .= '<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
$morehtmlref .= '<input type="hidden" name="action" value="classin">';
$morehtmlref .= '<input type="hidden" name="token" value="'.newToken().'">';
$morehtmlref .= $formproject->select_projects(-1, $object->fk_project, 'projectid', 0, 0, 1, 1, 0, 0, 0, '', 1, 0, 'maxwidth500 widthcentpercentminusxx');
$morehtmlref .= $formproject->select_projects(-1, (string) $object->fk_project, 'projectid', 0, 0, 1, 1, 0, 0, 0, '', 1, 0, 'maxwidth500 widthcentpercentminusxx');
$morehtmlref .= '<input type="submit" class="button valignmiddle" value="'.$langs->trans("Modify").'">';
$morehtmlref .= '</form>';
} else {

View File

@ -17,7 +17,7 @@
* Copyright (C) 2018-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2022 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
* Copyright (C) 2023 Nick Fragoulis
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
*
* This program is free software; you can redistribute it and/or modify
@ -892,27 +892,27 @@ if (empty($reshook)) {
$keyforvatrate = $line->tva_tx.($line->vat_src_code ? ' ('.$line->vat_src_code.')' : '');
if (!isset($amount_ht[$keyforvatrate])) {
$amount_ht[$keyforvatrate]=0;
$amount_ht[$keyforvatrate] = 0;
}
$amount_ht[$keyforvatrate] += $line->total_ht;
if (!isset($amount_tva[$keyforvatrate])) {
$amount_tva[$keyforvatrate]=0;
$amount_tva[$keyforvatrate] = 0;
}
$amount_tva[$keyforvatrate] += $line->total_tva;
if (!isset($amount_ttc[$keyforvatrate])) {
$amount_ttc[$keyforvatrate]=0;
$amount_ttc[$keyforvatrate] = 0;
}
$amount_ttc[$keyforvatrate] += $line->total_ttc;
if (!isset($multicurrency_amount_ht[$keyforvatrate])) {
$multicurrency_amount_ht[$keyforvatrate]=0;
$multicurrency_amount_ht[$keyforvatrate] = 0;
}
$multicurrency_amount_ht[$keyforvatrate] += $line->multicurrency_total_ht;
if (!isset($multicurrency_amount_tva[$keyforvatrate])) {
$multicurrency_amount_tva[$keyforvatrate]=0;
$multicurrency_amount_tva[$keyforvatrate] = 0;
}
$multicurrency_amount_tva[$keyforvatrate] += $line->multicurrency_total_tva;
if (!isset($multicurrency_amount_ttc[$keyforvatrate])) {
$multicurrency_amount_ttc[$keyforvatrate]=0;
$multicurrency_amount_ttc[$keyforvatrate] = 0;
}
$multicurrency_amount_ttc[$keyforvatrate] += $line->multicurrency_total_ttc;
$i++;
@ -4070,7 +4070,7 @@ if ($action == 'create') {
$langs->load('projects');
print '<tr><td>'.$langs->trans('Project').'</td><td colspan="2">';
print img_picto('', 'project', 'class="pictofixedwidth"');
print $formproject->select_projects(($socid > 0 ? $socid : -1), $projectid, 'projectid', 0, 0, 1, 1, 0, 0, 0, '', 1, 0, 'maxwidth500 widthcentpercentminusxx');
print $formproject->select_projects(($socid > 0 ? $socid : -1), (string) $projectid, 'projectid', 0, 0, 1, 1, 0, 0, 0, '', 1, 0, 'maxwidth500 widthcentpercentminusxx');
print ' <a href="'.DOL_URL_ROOT.'/projet/card.php?socid='.$soc->id.'&action=create&status=1&backtopage='.urlencode($_SERVER["PHP_SELF"].'?action=create&socid='.$soc->id.($fac_rec ? '&fac_rec='.$fac_rec : '')).'"><span class="fa fa-plus-circle valignmiddle" title="'.$langs->trans("AddProject").'"></span></a>';
print '</td></tr>';
}

View File

@ -4,7 +4,7 @@
* Copyright (C) 2016-2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2017-2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
* Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
*
* 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
@ -431,7 +431,7 @@ if ($action == 'create') {
print '<tr><td>'.$langs->trans("Project").'</td><td>';
print img_picto('', 'project', 'class="pictofixedwidth"').$formproject->select_projects(-1, $fk_project, 'fk_project', 0, 0, 1, 1, 0, 0, 0, '', 1);
print img_picto('', 'project', 'class="pictofixedwidth"').$formproject->select_projects(-1, (string) $fk_project, 'fk_project', 0, 0, 1, 1, 0, 0, 0, '', 1);
print '</td></tr>';
}

View File

@ -2068,7 +2068,7 @@ class Contrat extends CommonObject
if (is_null($this->project) || (is_object($this->project) && $this->project->isEmpty())) {
$res = $this->fetchProject();
if ($res > 0 && $this->project instanceof Project) {
$datas['project'] = '<br><b>'.$langs->trans('Project').':</b> '.$this->project->getNomUrl(1, '', 0, 1);
$datas['project'] = '<br><b>'.$langs->trans('Project').':</b> '.$this->project->getNomUrl(1, '', 0, '1');
}
}
}

View File

@ -3,7 +3,7 @@
* Copyright (C) 2015 Marcos García <marcosgdf@gmail.com>
* Copyright (C) 2018 Charlene Benke <charlie@patas-monkey.com>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Benjamin Falière <benjamin.faliere@altairis.fr>
*
* This program is free software; you can redistribute it and/or modify
@ -113,7 +113,7 @@ class FormProjets extends Form
}
$out .= '<input type="text" class="minwidth200' . ($morecss ? ' ' . $morecss : '') . '" name="search_' . $htmlname . '" id="search_' . $htmlname . '" value="' . $selected_input_value . '"' . $placeholder . ' />';
$out .= ajax_autocompleter($selected, $htmlname, DOL_URL_ROOT . '/projet/ajax/projects.php', $urloption, $conf->global->PROJECT_USE_SEARCH_TO_SELECT, 0, array());
$out .= ajax_autocompleter($selected, $htmlname, DOL_URL_ROOT . '/projet/ajax/projects.php', $urloption, getDolGlobalInt('PROJECT_USE_SEARCH_TO_SELECT'), 0, array());
} else {
$out .= $this->select_projects_list($socid, $selected, $htmlname, $maxlength, $option_only, $show_empty, abs($discard_closed), $forcefocus, $disabled, 0, $filterkey, 1, $forceaddid, $htmlid, $morecss, $morefilter);
}
@ -153,7 +153,6 @@ class FormProjets extends Form
* @param string $morecss More CSS
* @param string $morefilter More filters (Must be a sql sanitized string)
* @return int|string|array<array{key:int,value:string,ref:string,labelx:string,label:string,disabled:bool}> HTML string or array of option or <0 if KO
*/
public function select_projects_list($socid = -1, $selected = 0, $htmlname = 'projectid', $maxlength = 24, $option_only = 0, $show_empty = 1, $discard_closed = 0, $forcefocus = 0, $disabled = 0, $mode = 0, $filterkey = '', $nooutput = 0, $forceaddid = 0, $htmlid = '', $morecss = 'maxwidth500', $morefilter = '')
{
@ -333,16 +332,16 @@ class FormProjets extends Form
* @param int $selected Id task preselected
* @param string $htmlname Name of HTML select
* @param int $maxlength Maximum length of label
* @param int $option_only Return only html options lines without the select tag
* @param int<0,1> $option_only Return only html options lines without the select tag
* @param string $show_empty Add an empty line ('1' or string to show for empty line)
* @param int $discard_closed Discard closed projects (0=Keep, 1=hide completely, 2=Disable)
* @param int $forcefocus Force focus on field (works with javascript only)
* @param int $disabled Disabled
* @param int<0,2> $discard_closed Discard closed projects (0=Keep, 1=hide completely, 2=Disable)
* @param int<0,1> $forcefocus Force focus on field (works with javascript only)
* @param int<0,1> $disabled Disabled
* @param string $morecss More css added to the select component
* @param string $projectsListId ''=Automatic filter on project allowed. List of id=Filter on project ids.
* @param string $showmore 'all' = Show project info, 'progress' = Show task progression, ''=Show nothing more
* @param User $usertofilter User object to use for filtering
* @param int $nooutput 1=Return string, do not send to output
* @param 'all'|'progress'|'' $showmore 'all' = Show project info, 'progress' = Show task progression, ''=Show nothing more
* @param ?User $usertofilter User object to use for filtering
* @param int<0,1> $nooutput 1=Return string, do not send to output
*
* @return int|string Nbr of tasks if OK, <0 if KO. If nooutput=1: Return a HTML select string.
*/
@ -694,17 +693,17 @@ class FormProjets extends Form
* Build a HTML select list of element of same thirdparty to suggest to link them to project
*
* @param string $htmlname HTML name
* @param string $preselected Preselected (int or 'all' or 'none')
* @param int $showempty Add an empty line
* @param int $useshortlabel Use short label
* @param int $showallnone Add choice "All" and "None"
* @param int $showpercent Show default probability for status
* @param string $morecss Add more css
* @param int $noadmininfo 0=Add admin info, 1=Disable admin info
* @param int $addcombojs 1=Add a js combo
* @param int|'all'|'none'|'notopenedopp' $preselected Preselected (int or 'all' or 'none')
* @param int<0,1> $showempty Add an empty line
* @param int<0,1> $useshortlabel Use short label
* @param int<0,1> $showallnone Add choice "All" and "None"
* @param int<0,1> $showpercent Show default probability for status
* @param string $morecss Add more css
* @param int<0,1> $noadmininfo 0=Add admin info, 1=Disable admin info
* @param int<0,1> $addcombojs 1=Add a js combo
* @return int<-1,-1>|string The HTML select list of element or '' if nothing or -1 if KO
*/
public function selectOpportunityStatus($htmlname, $preselected = '-1', $showempty = 1, $useshortlabel = 0, $showallnone = 0, $showpercent = 0, $morecss = '', $noadmininfo = 0, $addcombojs = 0)
public function selectOpportunityStatus($htmlname, $preselected = -1, $showempty = 1, $useshortlabel = 0, $showallnone = 0, $showpercent = 0, $morecss = '', $noadmininfo = 0, $addcombojs = 0)
{
global $conf, $langs, $user;
@ -780,12 +779,12 @@ class FormProjets extends Form
/**
* Return combo list of different statuses of orders
*
* @param string $selected Preselected value
* @param int $short Use short labels
* @param string $hmlname Name of HTML select element
* @param string $selected Preselected value
* @param int<0,1> $short Use short labels
* @param string $htmlname Name of HTML select element
* @return void
*/
public function selectProjectsStatus($selected = '', $short = 0, $hmlname = 'order_status')
public function selectProjectsStatus($selected = '', $short = 0, $htmlname = 'order_status')
{
$options = array();
@ -813,7 +812,7 @@ class FormProjets extends Form
$selectedarray = explode(',', $selected);
}
print Form::multiselectarray($hmlname, $options, $selectedarray, 0, 0, 'minwidth100');
print Form::multiselectarray($htmlname, $options, $selectedarray, 0, 0, 'minwidth100');
}
/**
@ -947,11 +946,11 @@ class FormProjets extends Form
*
* @param string $page Page
* @param string $selected Id preselected
* @param int $percent_value percentage of the opportunity
* @param ''|int $percent_value percentage of the opportunity
* @param string $htmlname_status name of HTML element for status select
* @param string $htmlname_percent name of HTML element for percent input
* @param string $filter optional filters criteras
* @param int $nooutput No print output. Return it only.
* @param int<0,1> $nooutput No print output. Return it only.
* @return void|string
*/
public function formOpportunityStatus($page, $selected = '', $percent_value = 0, $htmlname_status = 'none', $htmlname_percent = 'none', $filter = '', $nooutput = 0)

View File

@ -3,7 +3,7 @@
* Copyright (C) 2005-2009 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2011 Juanjo Menent <jmenent@2byte.es>
* Copyright (C) 2022-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
*
* 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
@ -138,7 +138,7 @@ function print_actions_filter(
print '<div class="divsearchfield">';
print img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth inline-block"');
print $formproject->select_projects($socid ? $socid : -1, $pid, 'search_projectid', 0, 0, 1, 0, 0, 0, 0, '', 1, 0, 'minwidth100 maxwidth250 widthcentpercentminusx');
print $formproject->select_projects($socid ? $socid : -1, (string) $pid, 'search_projectid', 0, 0, 1, 0, 0, 0, 0, '', 1, 0, 'minwidth100 maxwidth250 widthcentpercentminusx');
print '</div>';
}

View File

@ -5,7 +5,7 @@
* Copyright (C) 2018-2025 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2022 Charlene Benke <charlene@patas-monkey.com>
* Copyright (C) 2023 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Vincent de Grandpré <vincent@de-grandpre.quebec>
*
* This program is free software; you can redistribute it and/or modify
@ -587,7 +587,7 @@ function project_admin_prepare_head()
* @param int $level Level (start to 0, then increased/decrease by recursive call), or -1 to show all level in order of $lines without the recursive groupment feature.
* @param string $var Not used
* @param int $showproject Show project columns
* @param int $taskrole Array of roles of user for each tasks
* @param array<int,string> $taskrole Array of roles of user for each tasks
* @param string $projectsListId List of id of projects allowed to user (string separated with comma)
* @param int $addordertick Add a tick to move task
* @param int $projectidfortotallink 0 or Id of project to use on total line (link to see all time consumed for project)
@ -1182,8 +1182,8 @@ function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$t
* @param ?User $fuser Restrict list to user if defined
* @param Task[] $lines Array of lines
* @param int $level Level (start to 0, then increased/decrease by recursive call)
* @param string $projectsrole Array of roles user has on project
* @param string $tasksrole Array of roles user has on task
* @param array<int,string> $projectsrole Array of roles user has on project
* @param array<int,string> $tasksrole Array of roles user has on task
* @param string $mine Show only task lines I am assigned to
* @param int<0,1> $restricteditformytask 0=No restriction, 1=Enable add time only if task is a task i am affected to
* @param int $preselectedday Preselected day
@ -1412,8 +1412,8 @@ function projectLinesPerAction(&$inc, $parent, $fuser, $lines, &$level, &$projec
* @param ?User $fuser Restrict list to user if defined
* @param Task[] $lines Array of lines
* @param int $level Level (start to 0, then increased/decrease by recursive call)
* @param string $projectsrole Array of roles user has on project
* @param string $tasksrole Array of roles user has on task
* @param array<int,string> $projectsrole Array of roles user has on project
* @param array<int,string> $tasksrole Array of roles user has on task
* @param int<0,1> $mine Show only task lines I am assigned to
* @param int<0,2> $restricteditformytask 0=No restriction, 1=Enable add time only if task is assigned to me, 2=Enable add time only if tasks is assigned to me and hide others
* @param int $preselectedday Preselected day
@ -1816,8 +1816,8 @@ function projectLinesPerDay(&$inc, $parent, $fuser, $lines, &$level, &$projectsr
* @param int $parent Id of parent task to show (0 to show all)
* @param Task[] $lines Array of lines (list of tasks but we will show only if we have a specific role on task)
* @param int $level Level (start to 0, then increased/decrease by recursive call)
* @param string $projectsrole Array of roles user has on project
* @param string $tasksrole Array of roles user has on task
* @param array<int,string> $projectsrole Array of roles user has on project
* @param array<int,string> $tasksrole Array of roles user has on task
* @param int<0,1> $mine Show only task lines I am assigned to
* @param int<0,2> $restricteditformytask 0=No restriction, 1=Enable add time only if task is assigned to me, 2=Enable add time only if tasks is assigned to me and hide others
* @param array<int,array{morning:int<0,1>,afternoon:int<0,1>}> $isavailable Array with data that say if user is available for several days for morning and afternoon
@ -2222,13 +2222,13 @@ function projectLinesPerWeek(&$inc, $firstdaytoshow, $fuser, $parent, $lines, &$
* @param int $parent Id of parent task to show (0 to show all)
* @param Task[] $lines Array of lines (list of tasks but we will show only if we have a specific role on task)
* @param int $level Level (start to 0, then increased/decrease by recursive call)
* @param string $projectsrole Array of roles user has on project
* @param string $tasksrole Array of roles user has on task
* @param array<int,string> $projectsrole Array of roles user has on project
* @param array<int,string> $tasksrole Array of roles user has on task
* @param int<0,1> $mine Show only task lines I am assigned to
* @param int<0,1> $restricteditformytask 0=No restriction, 1=Enable add time only if task is a task i am affected to
* @param array<int,array{morning:int<0,1>,afternoon:int<0,1>}> $isavailable Array with data that say if user is available for several days for morning and afternoon
* @param int $oldprojectforbreak Old project id of last project break
* @param string[] $TWeek Array of week numbers ('02', ...
* @param string[] $TWeek Array of week numbers ('02', ...
* @param array<string, array<string, int|string>> $arrayfields Array of additional column
* @param Extrafields $extrafields Object extrafields
* @return array<string,int> Array with time spent for $fuser for each day of week on tasks in $lines and subtasks (index is string, month is '01', ...)
@ -2525,7 +2525,7 @@ function projectLinesPerMonth(&$inc, $firstdaytoshow, $fuser, $parent, $lines, &
* @param int $inc Counter that count number of lines legitimate to show (for return)
* @param int $parent Id of parent task to start
* @param Task[] $lines Array of all tasks
* @param string $taskrole Array of task filtered on a particular user
* @param array<int,string> $taskrole Array of task filtered on a particular user
* @return int 1 if there is
*/
function searchTaskInChild(&$inc, $parent, &$lines, &$taskrole)

View File

@ -1113,10 +1113,10 @@ function checkUserAccessToObject($user, array $featuresarray, $object = 0, $tabl
}
$checkonentitydone = 1;
}
if (in_array($feature, $checktask) && $objectid > 0) {
if (in_array($feature, $checktask) && (int) $objectid > 0) {
if (isModEnabled('project') && !$user->hasRight('projet', 'all', 'lire')) {
$task = new Task($db);
$task->fetch($objectid);
$task->fetch((int) $objectid);
$projectid = $task->fk_project;
include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';

View File

@ -2,7 +2,7 @@
/* Copyright (C) 2018-2018 Andre Schild <a.schild@aarboard.ch>
* Copyright (C) 2005-2010 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2009 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
*
* This file is an example to follow to add your own email selector inside
@ -204,7 +204,7 @@ class mailing_eventorganization extends MailingTargets
$formproject = new FormProjets($this->db);
$s = img_picto($langs->trans("OrganizedEvent"), 'project', 'class="pictofixedwidth"');
$s .= $formproject->select_projects(-1, 0, "filter_eventorganization", 0, 0, $langs->trans("OrganizedEvent"), 1, 0, 0, 0, '', 1, 0, '', '', 'usage_organize_event=1');
$s .= $formproject->select_projects(-1, '0', "filter_eventorganization", 0, 0, $langs->trans("OrganizedEvent"), 1, 0, 0, 0, '', 1, 0, '', '', 'usage_organize_event=1');
return $s;
}

View File

@ -5,7 +5,7 @@
* Copyright (C) 2016-2023 Charlene Benke <charlene@patas-monkey.com>
* Copyright (C) 2018-2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2023 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
*
* 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
@ -183,7 +183,6 @@ class doc_generic_project_odt extends ModelePDFProjects
* @param Task $task Task Object
* @param Translate $outputlangs Lang object to use for output
* @return array{task_ref:string,task_fk_project:string,task_projectref:string,task_projectlabel:string,task_label:string,task_description:string,task_fk_parent:string,task_duration:string,task_duration_hour:string,task_planned_workload:string,task_planned_workload_hour:string,task_progress:string,task_public:string,task_date_start:string,task_date_end:string,task_note_private:string,task_note_public:string} Return a substitution array + extrafields
*/
public function get_substitutionarray_tasks(Task $task, $outputlangs)
{
@ -1053,7 +1052,7 @@ class doc_generic_project_odt extends ModelePDFProjects
$ref_array['type'] = (string) $langs->trans($classname);
$element = new $classname($this->db);
$element->fetch($elementarray[$i]);
$element->fetch((int) $elementarray[$i]);
$element->fetch_thirdparty();
//Ref object

View File

@ -467,7 +467,7 @@ class pdf_beluga extends ModelePDFProjects
//var_dump("$key, $tablename, $datefieldname, $dates, $datee");
$elementarray = $object->get_element_list($key, $tablename, $datefieldname, 0, 0, $projectField);
$num = count($elementarray);
$num = is_array($elementarray) ? count($elementarray) : $elementarray;
if ($num >= 0) {
$nexY = $pdf->GetY() + 5;

View File

@ -5,7 +5,7 @@
* Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro>
* Copyright (C) 2016 Juanjo Menent <jmenent@2byte.es>
* Copyright (C) 2018-2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
*
* 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
@ -887,7 +887,7 @@ class Holiday extends CommonObject
*
* @param User $user User that approve
* @param int<0,1> $notrigger 0=launch triggers after, 1=disable triggers
* @return int Return integer <0 if KO, >0 if OK
* @return int Return integer <0 if KO, >0 if OK
*/
public function approve($user = null, $notrigger = 0)
{
@ -1151,9 +1151,9 @@ class Holiday extends CommonObject
/**
* Delete object in database
*
* @param User $user User that delete
* @param int $notrigger 0=launch triggers after, 1=disable triggers
* @return int Return integer <0 if KO, >0 if OK
* @param User $user User that delete
* @param int<0,1> $notrigger 0=launch triggers after, 1=disable triggers
* @return int Return integer <0 if KO, >0 if OK
*/
public function delete($user, $notrigger = 0)
{
@ -1202,12 +1202,12 @@ class Holiday extends CommonObject
* This function can be used to avoid to have 2 leave requests on same period for example.
* Warning: It consumes a lot of memory because it load in ->holiday all holiday of a dedicated user at each call.
*
* @param int $fk_user Id user
* @param integer $dateStart Start date of period to check
* @param integer $dateEnd End date of period to check
* @param int $halfday Tag to define how start and end the period to check:
* @param int $fk_user Id user
* @param int $dateStart Start date of period to check
* @param int $dateEnd End date of period to check
* @param int<-1,2> $halfday Tag to define how start and end the period to check:
* 0:Full days, 2:Start afternoon end morning, -1:Start afternoon end afternoon, 1:Start morning end morning
* @return boolean False = New range overlap an existing holiday, True = no overlapping (is never on holiday during checked period).
* @return bool False = New range overlap an existing holiday, True = no overlapping (is never on holiday during checked period).
* @see verifDateHolidayForTimestamp()
*/
public function verifDateHolidayCP($fk_user, $dateStart, $dateEnd, $halfday = 0)
@ -1287,9 +1287,9 @@ class Holiday extends CommonObject
* Check that a user is not on holiday for a particular timestamp. Can check approved leave requests and not into public holidays of company.
*
* @param int $fk_user Id user
* @param integer $timestamp Time stamp date for a day (YYYY-MM-DD) without hours (= 12:00AM in english and not 12:00PM that is 12:00)
* @param int $timestamp Time stamp date for a day (YYYY-MM-DD) without hours (= 12:00AM in english and not 12:00PM that is 12:00)
* @param string $status Filter on holiday status. '-1' = no filter.
* @return array{morning_reason?:string,afternoon_reason?:string} array('morning'=> ,'afternoon'=> ), Boolean is true if user is available for day timestamp.
* @return array{morning:int<0,1>,afternoon:int<0,1>,morning_reason?:string,afternoon_reason?:string} array('morning'=> ,'afternoon'=> ), Boolean is true if user is available for day timestamp.
* @see verifDateHolidayCP()
*/
public function verifDateHolidayForTimestamp($fk_user, $timestamp, $status = '-1')
@ -1349,7 +1349,7 @@ class Holiday extends CommonObject
dol_print_error($this->db);
}
$result = array('morning' => $isavailablemorning, 'afternoon' => $isavailableafternoon);
$result = array('morning' => (int) $isavailablemorning, 'afternoon' => (int) $isavailableafternoon);
if (!$isavailablemorning) {
$result['morning_reason'] = 'leave_request';
}

View File

@ -4,7 +4,7 @@
* Copyright (C) 2005-2010 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2010 François Legastelois <flegastelois@teclib.com>
* Copyright (C) 2018-2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
*
* 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
@ -90,9 +90,9 @@ $search_declared_progress = GETPOST('search_declared_progress', 'alpha');
$sortfield = GETPOST('sortfield', 'aZ09comma');
$sortorder = GETPOST('sortorder', 'aZ09comma');
$monthofday = GETPOST('addtimemonth');
$dayofday = GETPOST('addtimeday');
$yearofday = GETPOST('addtimeyear');
$monthofday = GETPOSTINT('addtimemonth');
$dayofday = GETPOSTINT('addtimeday');
$yearofday = GETPOSTINT('addtimeyear');
//var_dump(GETPOST('remonth'));
//var_dump(GETPOST('button_search_x'));
@ -134,9 +134,9 @@ $extrafields->fetch_name_optionals_label($object->table_element);
// Definition of fields for list
$arrayfields = array();
$arrayfields['t.planned_workload'] = array('label' => 'PlannedWorkload', 'checked' => 1, 'enabled' => 1, 'position' => 0);
$arrayfields['t.progress'] = array('label' => 'ProgressDeclared', 'checked' => 1, 'enabled' => 1, 'position' => 0);
$arrayfields['timeconsumed'] = array('label' => 'TimeConsumed', 'checked' => 1, 'enabled' => 1, 'position' => 15);
$arrayfields['t.planned_workload'] = array('label' => 'PlannedWorkload', 'checked' => '1', 'enabled' => '1', 'position' => 0);
$arrayfields['t.progress'] = array('label' => 'ProgressDeclared', 'checked' => '1', 'enabled' => '1', 'position' => 0);
$arrayfields['timeconsumed'] = array('label' => 'TimeConsumed', 'checked' => '1', 'enabled' => '1', 'position' => 15);
/*$arrayfields=array(
// Project
'p.opp_amount'=>array('label'=>$langs->trans("OpportunityAmountShort"), 'checked'=>0, 'enabled'=>($conf->global->PROJECT_USE_OPPORTUNITIES?1:0), 'position'=>103),
@ -150,7 +150,7 @@ $arrayfields['timeconsumed'] = array('label' => 'TimeConsumed', 'checked' => 1,
if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label']) > 0) {
foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
if (!empty($extrafields->attributes[$object->table_element]['list'][$key])) {
$arrayfields["efpt.".$key] = array('label' => $extrafields->attributes[$object->table_element]['label'][$key], 'checked' => (($extrafields->attributes[$object->table_element]['list'][$key] < 0) ? 0 : 1), 'position' => $extrafields->attributes[$object->table_element]['pos'][$key], 'enabled' => (abs((int) $extrafields->attributes[$object->table_element]['list'][$key]) != 3 && $extrafields->attributes[$object->table_element]['perms'][$key]));
$arrayfields["efpt.".$key] = array('label' => $extrafields->attributes[$object->table_element]['label'][$key], 'checked' => (($extrafields->attributes[$object->table_element]['list'][$key] < 0) ? '0' : '1'), 'position' => $extrafields->attributes[$object->table_element]['pos'][$key], 'enabled' => (string) (int) (abs((int) $extrafields->attributes[$object->table_element]['list'][$key]) != 3 && $extrafields->attributes[$object->table_element]['perms'][$key]));
}
}
}
@ -407,14 +407,14 @@ $search_options_pattern = 'search_task_options_';
$extrafieldsobjectkey = 'projet_task';
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
$tasksarray = $taskstatic->getTasksArray(null, null, ($project->id ? $project->id : 0), $socid, 0, $search_project_ref, $onlyopenedproject, $morewherefilter, ($search_usertoprocessid ? $search_usertoprocessid : 0), 0, $extrafields); // We want to see all task of opened project i am allowed to see and that match filter, not only my tasks. Later only mine will be editable later.
$tasksarray = $taskstatic->getTasksArray(null, null, ($project->id ? $project->id : 0), $socid, 0, $search_project_ref, (string) $onlyopenedproject, $morewherefilter, ($search_usertoprocessid ? $search_usertoprocessid : 0), 0, $extrafields); // We want to see all task of opened project i am allowed to see and that match filter, not only my tasks. Later only mine will be editable later.
$tasksarraywithoutfilter = array();
if ($morewherefilter) { // Get all task without any filter, so we can show total of time spent for not visible tasks
$tasksarraywithoutfilter = $taskstatic->getTasksArray(null, null, ($project->id ? $project->id : 0), $socid, 0, '', $onlyopenedproject, '', ($search_usertoprocessid ? $search_usertoprocessid : 0)); // We want to see all task of opened project i am allowed to see and that match filter, not only my tasks. Later only mine will be editable later.
$tasksarraywithoutfilter = $taskstatic->getTasksArray(null, null, ($project->id ? $project->id : 0), $socid, 0, '', (string) $onlyopenedproject, '', ($search_usertoprocessid ? $search_usertoprocessid : 0)); // We want to see all task of opened project i am allowed to see and that match filter, not only my tasks. Later only mine will be editable later.
}
$projectsrole = $taskstatic->getUserRolesForProjectsOrTasks($usertoprocess, null, ($project->id ? $project->id : 0), 0, $onlyopenedproject);
$tasksrole = $taskstatic->getUserRolesForProjectsOrTasks(null, $usertoprocess, ($project->id ? $project->id : 0), 0, $onlyopenedproject);
$projectsrole = $taskstatic->getUserRolesForProjectsOrTasks($usertoprocess, null, ($project->id ? (string) $project->id : '0'), 0, $onlyopenedproject);
$tasksrole = $taskstatic->getUserRolesForProjectsOrTasks(null, $usertoprocess, ($project->id ? (string) $project->id : '0'), 0, $onlyopenedproject);
llxHeader('', $title, '', '', 0, 0, array('/core/js/timesheet.js'), '', '', 'mod-project project-activity page-activity_perday');
@ -521,7 +521,7 @@ if (!$user->hasRight('user', 'user', 'lire')) {
$includeonly = array($user->id);
}
$selecteduser = $search_usertoprocessid ? $search_usertoprocessid : $usertoprocess->id;
$moreforfiltertmp = $form->select_dolusers($selecteduser, 'search_usertoprocessid', 0, null, 0, $includeonly, '', 0, 0, 0, '', 0, '', 'maxwidth200');
$moreforfiltertmp = $form->select_dolusers($selecteduser, 'search_usertoprocessid', 0, null, 0, $includeonly, '', '0', 0, 0, '', 0, '', 'maxwidth200');
if ($form->num > 1 || empty($conf->dol_optimize_smallscreen)) {
$moreforfilter .= '<div class="divsearchfield">';
$moreforfilter .= '<div class="inline-block hideonsmartphone"></div>';
@ -656,7 +656,7 @@ if (getDolGlobalString('MAIN_DEFAULT_WORKING_DAYS')) {
}
$statusofholidaytocheck = Holiday::STATUS_APPROVED;
$isavailablefordayanduser = $holiday->verifDateHolidayForTimestamp($usertoprocess->id, $daytoparse, $statusofholidaytocheck); // $daytoparse is a date with hours = 0
$isavailablefordayanduser = $holiday->verifDateHolidayForTimestamp($usertoprocess->id, $daytoparse, (string) $statusofholidaytocheck); // $daytoparse is a date with hours = 0
$isavailable[$daytoparse] = $isavailablefordayanduser; // in projectLinesPerWeek later, we are using $firstdaytoshow and dol_time_plus_duree to loop on each day
$test = num_public_holiday($daytoparsegmt, $daytoparsegmt + 86400, $mysoc->country_code);

View File

@ -3,7 +3,7 @@
* Copyright (C) 2004-2015 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2010 Regis Houssin <regis.houssin@capnetworks.com>
* Copyright (C) 2010 François Legastelois <flegastelois@teclib.com>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2025 Alexandre Spangaro <alexandre@inovea-conseil.com>
*
@ -137,9 +137,9 @@ $arrayfields = array();
'p.budget_amount'=>array('label'=>$langs->trans("Budget"), 'checked'=>0, 'position'=>110),
'p.usage_bill_time'=>array('label'=>$langs->trans("BillTimeShort"), 'checked'=>0, 'position'=>115),
);*/
$arrayfields['t.planned_workload'] = array('label' => 'PlannedWorkload', 'checked' => 1, 'enabled' => 1, 'position' => 5);
$arrayfields['t.progress'] = array('label' => 'ProgressDeclared', 'checked' => 1, 'enabled' => 1, 'position' => 10);
$arrayfields['timeconsumed'] = array('label' => 'TimeConsumed', 'checked' => 1, 'enabled' => 1, 'position' => 15);
$arrayfields['t.planned_workload'] = array('label' => 'PlannedWorkload', 'checked' => '1', 'enabled' => '1', 'position' => 5);
$arrayfields['t.progress'] = array('label' => 'ProgressDeclared', 'checked' => '1', 'enabled' => '1', 'position' => 10);
$arrayfields['timeconsumed'] = array('label' => 'TimeConsumed', 'checked' => '1', 'enabled' => '1', 'position' => 15);
/*foreach($object->fields as $key => $val)
{
// If $val['visible']==0, then we never show the field
@ -150,7 +150,7 @@ $arrayfields['timeconsumed'] = array('label' => 'TimeConsumed', 'checked' => 1,
if (!empty($extrafields->attributes['projet_task']['label']) && is_array($extrafields->attributes['projet_task']['label']) && count($extrafields->attributes['projet_task']['label']) > 0) {
foreach ($extrafields->attributes['projet_task']['label'] as $key => $val) {
if (!empty($extrafields->attributes['projet_task']['list'][$key])) {
$arrayfields["efpt.".$key] = array('label' => $extrafields->attributes['projet_task']['label'][$key], 'checked' => (($extrafields->attributes['projet_task']['list'][$key] < 0) ? 0 : 1), 'position' => $extrafields->attributes['projet_task']['pos'][$key], 'enabled' => (abs((int) $extrafields->attributes['projet_task']['list'][$key]) != 3 && $extrafields->attributes['projet_task']['perms'][$key]));
$arrayfields["efpt.".$key] = array('label' => $extrafields->attributes['projet_task']['label'][$key], 'checked' => (($extrafields->attributes['projet_task']['list'][$key] < 0) ? '0' : '1'), 'position' => $extrafields->attributes['projet_task']['pos'][$key], 'enabled' => (string) (int) (abs((int) $extrafields->attributes['projet_task']['list'][$key]) != 3 && $extrafields->attributes['projet_task']['perms'][$key]));
}
}
}
@ -424,12 +424,12 @@ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
$tasksarraywithoutfilter = array(); // Default
$tasksarray = $taskstatic->getTasksArray(null, null, ($project->id ? $project->id : 0), $socid, 0, $search_project_ref, $onlyopenedproject, $morewherefilter, ($search_usertoprocessid ? $search_usertoprocessid : 0), 0, $extrafields); // We want to see all tasks of open project i am allowed to see and that match filter, not only my tasks. Later only mine will be editable later.
$tasksarray = $taskstatic->getTasksArray(null, null, ($project->id ? $project->id : 0), $socid, 0, $search_project_ref, (string) $onlyopenedproject, $morewherefilter, ($search_usertoprocessid ? $search_usertoprocessid : 0), 0, $extrafields); // We want to see all tasks of open project i am allowed to see and that match filter, not only my tasks. Later only mine will be editable later.
if ($morewherefilter) { // Get all task without any filter, so we can show total of time spent for not visible tasks
$tasksarraywithoutfilter = $taskstatic->getTasksArray(null, null, ($project->id ? $project->id : 0), $socid, 0, '', $onlyopenedproject, '', ($search_usertoprocessid ? $search_usertoprocessid : 0)); // We want to see all tasks of open project i am allowed to see and that match filter, not only my tasks. Later only mine will be editable later.
$tasksarraywithoutfilter = $taskstatic->getTasksArray(null, null, ($project->id ? $project->id : 0), $socid, 0, '', (string) $onlyopenedproject, '', ($search_usertoprocessid ? $search_usertoprocessid : 0)); // We want to see all tasks of open project i am allowed to see and that match filter, not only my tasks. Later only mine will be editable later.
}
$projectsrole = $taskstatic->getUserRolesForProjectsOrTasks($usertoprocess, null, ($project->id ? $project->id : 0), 0, $onlyopenedproject);
$tasksrole = $taskstatic->getUserRolesForProjectsOrTasks(null, $usertoprocess, ($project->id ? $project->id : 0), 0, $onlyopenedproject);
$projectsrole = $taskstatic->getUserRolesForProjectsOrTasks($usertoprocess, null, ($project->id ? (string) $project->id : '0'), 0, $onlyopenedproject);
$tasksrole = $taskstatic->getUserRolesForProjectsOrTasks(null, $usertoprocess, ($project->id ? (string) $project->id : '0'), 0, $onlyopenedproject);
//var_dump($tasksarray);
//var_dump($projectsrole);
//var_dump($taskrole);
@ -536,7 +536,7 @@ if (!$user->hasRight('user', 'user', 'lire')) {
$includeonly = array($user->id);
}
$selecteduser = $search_usertoprocessid ? $search_usertoprocessid : $usertoprocess->id;
$moreforfiltertmp = $form->select_dolusers($selecteduser, 'search_usertoprocessid', 0, null, 0, $includeonly, array(), 0, 0, 0, '', 0, '', 'maxwidth200');
$moreforfiltertmp = $form->select_dolusers($selecteduser, 'search_usertoprocessid', 0, null, 0, $includeonly, array(), '0', 0, 0, '', 0, '', 'maxwidth200');
if ($form->num > 1 || empty($conf->dol_optimize_smallscreen)) {
$moreforfilter .= '<div class="divsearchfield">';
$moreforfilter .= '<div class="inline-block hideonsmartphone"></div>';
@ -774,8 +774,8 @@ if (count($tasksarray) > 0) {
if (!empty($THolidays[$weekNb]["ids"]) && in_array($h->rowid, $THolidays[$weekNb]["ids"])) {
continue;
}
$startweekholiday =(int) (($h["date_debut"] <= $weekstart) ? $weekstart : $h["date_debut"] );
$endweekholiday =(int) (($h["date_fin"] >= $weekend) ? $weekend : $h["date_fin"]);
$startweekholiday = (int) (($h["date_debut"] <= $weekstart) ? $weekstart : $h["date_debut"]);
$endweekholiday = (int) (($h["date_fin"] >= $weekend) ? $weekend : $h["date_fin"]);
$halfdays = (int) $h["halfday"];
$nbdays = num_open_day($startweekholiday, $endweekholiday, 0, 1, $halfdays);

View File

@ -4,7 +4,7 @@
* Copyright (C) 2005-2010 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2010 François Legastelois <flegastelois@teclib.com>
* Copyright (C) 2018-2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
*
* 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
@ -139,9 +139,9 @@ $arrayfields = array();
'p.budget_amount'=>array('label'=>$langs->trans("Budget"), 'checked'=>0, 'position'=>110),
'p.usage_bill_time'=>array('label'=>$langs->trans("BillTimeShort"), 'checked'=>0, 'position'=>115),
);*/
$arrayfields['t.planned_workload'] = array('label' => 'PlannedWorkload', 'checked' => 1, 'enabled' => 1, 'position' => 5);
$arrayfields['t.progress'] = array('label' => 'ProgressDeclared', 'checked' => 1, 'enabled' => 1, 'position' => 10);
$arrayfields['timeconsumed'] = array('label' => 'TimeConsumed', 'checked' => 1, 'enabled' => 1, 'position' => 15);
$arrayfields['t.planned_workload'] = array('label' => 'PlannedWorkload', 'checked' => '1', 'enabled' => '1', 'position' => 5);
$arrayfields['t.progress'] = array('label' => 'ProgressDeclared', 'checked' => '1', 'enabled' => '1', 'position' => 10);
$arrayfields['timeconsumed'] = array('label' => 'TimeConsumed', 'checked' => '1', 'enabled' => '1', 'position' => 15);
/*foreach($object->fields as $key => $val)
{
// If $val['visible']==0, then we never show the field
@ -152,7 +152,7 @@ $arrayfields['timeconsumed'] = array('label' => 'TimeConsumed', 'checked' => 1,
if (!empty($extrafields->attributes['projet_task']['label']) && is_array($extrafields->attributes['projet_task']['label']) && count($extrafields->attributes['projet_task']['label']) > 0) {
foreach ($extrafields->attributes['projet_task']['label'] as $key => $val) {
if (!empty($extrafields->attributes['projet_task']['list'][$key])) {
$arrayfields["efpt.".$key] = array('label' => $extrafields->attributes['projet_task']['label'][$key], 'checked' => (($extrafields->attributes['projet_task']['list'][$key] < 0) ? 0 : 1), 'position' => $extrafields->attributes['projet_task']['pos'][$key], 'enabled' => (abs((int) $extrafields->attributes['projet_task']['list'][$key]) != 3 && $extrafields->attributes['projet_task']['perms'][$key]));
$arrayfields["efpt.".$key] = array('label' => $extrafields->attributes['projet_task']['label'][$key], 'checked' => (($extrafields->attributes['projet_task']['list'][$key] < 0) ? '0' : '1'), 'position' => $extrafields->attributes['projet_task']['pos'][$key], 'enabled' => (string) (int) (abs((int) $extrafields->attributes['projet_task']['list'][$key]) != 3 && $extrafields->attributes['projet_task']['perms'][$key]));
}
}
}
@ -422,13 +422,13 @@ $search_options_pattern = 'search_task_options_';
$extrafieldsobjectkey = 'projet_task';
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
$tasksarray = $taskstatic->getTasksArray(null, null, ($project->id ? $project->id : 0), $socid, 0, $search_project_ref, $onlyopenedproject, $morewherefilter, ($search_usertoprocessid ? $search_usertoprocessid : 0), 0, $extrafields); // We want to see all tasks of open project i am allowed to see and that match filter, not only my tasks. Later only mine will be editable later.
$tasksarray = $taskstatic->getTasksArray(null, null, ($project->id ? $project->id : 0), $socid, 0, $search_project_ref, (string) $onlyopenedproject, $morewherefilter, ($search_usertoprocessid ? $search_usertoprocessid : 0), 0, $extrafields); // We want to see all tasks of open project i am allowed to see and that match filter, not only my tasks. Later only mine will be editable later.
$tasksarraywithoutfilter = array();
if ($morewherefilter) { // Get all task without any filter, so we can show total of time spent for not visible tasks
$tasksarraywithoutfilter = $taskstatic->getTasksArray(null, null, ($project->id ? $project->id : 0), $socid, 0, '', $onlyopenedproject, '', ($search_usertoprocessid ? $search_usertoprocessid : 0)); // We want to see all tasks of open project i am allowed to see and that match filter, not only my tasks. Later only mine will be editable later.
$tasksarraywithoutfilter = $taskstatic->getTasksArray(null, null, ($project->id ? $project->id : 0), $socid, 0, '', (string) $onlyopenedproject, '', ($search_usertoprocessid ? $search_usertoprocessid : 0)); // We want to see all tasks of open project i am allowed to see and that match filter, not only my tasks. Later only mine will be editable later.
}
$projectsrole = $taskstatic->getUserRolesForProjectsOrTasks($usertoprocess, null, ($project->id ? $project->id : 0), 0, $onlyopenedproject);
$tasksrole = $taskstatic->getUserRolesForProjectsOrTasks(null, $usertoprocess, ($project->id ? $project->id : 0), 0, $onlyopenedproject);
$projectsrole = $taskstatic->getUserRolesForProjectsOrTasks($usertoprocess, null, ($project->id ? (string) $project->id : '0'), 0, (int) $onlyopenedproject);
$tasksrole = $taskstatic->getUserRolesForProjectsOrTasks(null, $usertoprocess, ($project->id ? (string) $project->id : '0'), 0, (int) $onlyopenedproject);
//var_dump($tasksarray);
//var_dump($projectsrole);
//var_dump($taskrole);
@ -542,7 +542,7 @@ for ($idw = 0; $idw < 7; $idw++) {
$statusofholidaytocheck = Holiday::STATUS_APPROVED;
$isavailablefordayanduser = $holiday->verifDateHolidayForTimestamp($usertoprocess->id, $dayinloopfromfirstdaytoshow, $statusofholidaytocheck);
$isavailablefordayanduser = $holiday->verifDateHolidayForTimestamp($usertoprocess->id, $dayinloopfromfirstdaytoshow, (string) $statusofholidaytocheck);
$isavailable[$dayinloopfromfirstdaytoshow] = $isavailablefordayanduser; // in projectLinesPerWeek later, we are using $firstdaytoshow and dol_time_plus_duree to loop on each day
$test = num_public_holiday($dayinloopfromfirstdaytoshowgmt, $dayinloopfromfirstdaytoshowgmt + 86400, $mysoc->country_code);
@ -571,7 +571,7 @@ if (!$user->hasRight('user', 'user', 'lire')) {
$includeonly = array($user->id);
}
$selecteduser = $search_usertoprocessid ? $search_usertoprocessid : $usertoprocess->id;
$moreforfiltertmp = $form->select_dolusers($selecteduser, 'search_usertoprocessid', 0, null, 0, $includeonly, '', 0, 0, 0, '', 0, '', 'maxwidth200');
$moreforfiltertmp = $form->select_dolusers($selecteduser, 'search_usertoprocessid', 0, null, 0, $includeonly, '', '0', 0, 0, '', 0, '', 'maxwidth200');
if ($form->num > 1 || empty($conf->dol_optimize_smallscreen)) {
$moreforfilter .= '<div class="divsearchfield">';
$moreforfilter .= '<div class="inline-block hideonsmartphone"></div>';

View File

@ -4,6 +4,7 @@
* Copyright (C) 2007-2020 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2014-2015 Marcos García <marcosgdf@gmail.com>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2025 MDW <mdeweerd@users.noreply.github.com>
*
* 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
@ -78,7 +79,7 @@ if (empty($mode) || $mode != 'gettasks') {
$searchkey = (GETPOSTISSET($htmlname) ? GETPOST($htmlname, 'aZ09') : '');
$formproject = new FormProjets($db);
$arrayresult = $formproject->select_projects_list($socid, '', '', 0, 0, 1, $discard_closed, 0, 0, 1, $searchkey);
$arrayresult = $formproject->select_projects_list($socid, 0, '', 0, 0, 1, $discard_closed, 0, 0, 1, $searchkey);
$db->close();
@ -93,7 +94,7 @@ if ($mode == 'gettasks') {
top_httphead();
$formproject = new FormProjets($db);
$formproject->selectTasks((!empty($socid) ? $socid : -1), 0, 'taskid', 24, 1, '1', 1, 0, 0, 'maxwidth500', GETPOSTINT('projectid'), '');
$formproject->selectTasks((!empty($socid) ? $socid : -1), 0, 'taskid', 24, 1, '1', 1, 0, 0, 'maxwidth500', (string) GETPOSTINT('projectid'), '');
$db->close();

View File

@ -4,7 +4,7 @@
* Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2023 Charlene Benke <charlene@patas_monkey.com>
* Copyright (C) 2023 Christian Foellmann <christian@foellmann.de>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
*
@ -313,7 +313,7 @@ if (empty($reshook)) {
}
$db->begin();
$old_start_date = null;
$old_start_date = 0;
if (!$error) {
$object->oldcopy = clone $object;
@ -1095,7 +1095,7 @@ if ($action == 'create' && $user->hasRight('projet', 'creer')) {
if (getDolGlobalInt('PROJECT_ENABLE_SUB_PROJECT')) {
print '<tr><td>'.$langs->trans("Parent").'</td><td class="maxwidthonsmartphone">';
print img_picto('', 'project', 'class="pictofixedwidth"');
$formproject->select_projects(-1, $object->fk_project, 'fk_project', 64, 0, 1, 1, 0, 0, 0, '', 0, 0, '', '', '');
$formproject->select_projects(-1, (string) $object->fk_project, 'fk_project', 64, 0, 1, 1, 0, 0, 0, '', 0, 0, '', '', '');
print '</td></tr>';
}
@ -1240,7 +1240,7 @@ if ($action == 'create' && $user->hasRight('projet', 'creer')) {
print '<tr class="classuseopportunity'.$classfortr.'"><td>'.$langs->trans("OpportunityStatus").'</td>';
print '<td>';
print '<div>';
print $formproject->selectOpportunityStatus('opp_status', $object->opp_status, 1, 0, 0, 0, 'minwidth150 inline-block valignmiddle', 1, 1);
print $formproject->selectOpportunityStatus('opp_status', (string) $object->opp_status, 1, 0, 0, 0, 'minwidth150 inline-block valignmiddle', 1, 1);
// Opportunity probability
print ' <input class="width50 right" type="text" id="opp_percent" name="opp_percent" title="'.dol_escape_htmltag($langs->trans("OpportunityProbability")).'" value="'.(GETPOSTISSET('opp_percent') ? GETPOST('opp_percent') : (strcmp($object->opp_percent, '') ? vatrate($object->opp_percent) : '')).'"> %';
@ -1442,8 +1442,8 @@ if ($action == 'create' && $user->hasRight('projet', 'creer')) {
print '</td><td>';
$html_name_status = ($action == 'edit_opp_status') ? 'opp_status' : 'none';
$html_name_percent = ($action == 'edit_opp_status') ? 'opp_percent' : 'none';
$percent_value = (GETPOSTISSET('opp_percent') ? GETPOST('opp_percent') : (strcmp($object->opp_percent, '') ? vatrate($object->opp_percent) : ''));
$formproject->formOpportunityStatus($_SERVER['PHP_SELF'].'?socid='.$object->id, $object->opp_status, $percent_value, $html_name_status, $html_name_percent);
$percent_value = (GETPOSTISSET('opp_percent') ? GETPOSTINT('opp_percent') : (strcmp($object->opp_percent, '') ? vatrate($object->opp_percent) : ''));
$formproject->formOpportunityStatus($_SERVER['PHP_SELF'].'?socid='.$object->id, (string) $object->opp_status, $percent_value, $html_name_status, $html_name_percent);
print '</td></tr>';
// Opportunity Amount
@ -1808,7 +1808,7 @@ if ($action == 'create' && $user->hasRight('projet', 'creer')) {
$genallowed = ($user->hasRight('projet', 'lire') && $userAccess > 0);
$delallowed = ($user->hasRight('projet', 'creer') && $userWrite > 0);
print $formfile->showdocuments('project', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 0, 0, '', '', '', '', '', $object);
print $formfile->showdocuments('project', $filename, $filedir, $urlsource, (int) $genallowed, (int) $delallowed, $object->model_pdf, 1, 0, 0, 0, 0, '', '', '', '', '', $object);
print '</div><div class="fichehalfright">';

View File

@ -1,7 +1,7 @@
<?php
/* Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
* Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
*
* 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
@ -31,7 +31,7 @@ require_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php';
class Projects extends DolibarrApi
{
/**
* @var string[] $FIELDS Mandatory fields, checked when create and update object
* @var string[] Mandatory fields, checked when create and update object
*/
public static $FIELDS = array(
'ref',
@ -39,12 +39,12 @@ class Projects extends DolibarrApi
);
/**
* @var Project $project {@type Project}
* @var Project {@type Project}
*/
public $project;
/**
* @var Task $task {@type Task}
* @var Task {@type Task}
*/
public $task;
@ -459,7 +459,7 @@ class Projects extends DolibarrApi
$userp = new User($this->db);
$userp->fetch($userid);
}
$this->project->roles = $taskstatic->getUserRolesForProjectsOrTasks($userp, null, $id, 0);
$this->project->roles = $taskstatic->getUserRolesForProjectsOrTasks($userp, null, (string) $id, 0);
$result = array();
foreach ($this->project->roles as $line) {
array_push($result, $this->_cleanObjectDatas($line));

View File

@ -861,13 +861,13 @@ class Project extends CommonObject
/**
* Return list of elements for type, linked to a project
*
* @param string $type 'propal','order','invoice','order_supplier','invoice_supplier',...
* @param string $tablename name of table associated of the type
* @param string $datefieldname name of date field for filter
* @param int $date_start Start date
* @param int $date_end End date
* @param string $projectkey Equivalent key to fk_projet for actual type
* @return mixed Array list of object ids linked to project, < 0 or string if error
* @param string $type 'propal','order','invoice','order_supplier','invoice_supplier',...
* @param string $tablename name of table associated of the type
* @param string $datefieldname name of date field for filter
* @param ?int $date_start Start date
* @param ?int $date_end End date
* @param string $projectkey Equivalent key to fk_projet for actual type
* @return array<int,string>|int<-1,-1>|string Array list of object ids linked to project, < 0 or string if error
*/
public function get_element_list($type, $tablename, $datefieldname = '', $date_start = null, $date_end = null, $projectkey = 'fk_projet')
{
@ -884,23 +884,23 @@ class Project extends CommonObject
$ids = $this->id;
if ($type == 'agenda') {
$sql = "SELECT id as rowid FROM ".MAIN_DB_PREFIX."actioncomm WHERE fk_project IN (".$this->db->sanitize($ids).") AND entity IN (".getEntity('agenda').")";
$sql = "SELECT id as rowid FROM ".MAIN_DB_PREFIX."actioncomm WHERE fk_project IN (".$this->db->sanitize((string) $ids).") AND entity IN (".getEntity('agenda').")";
} elseif ($type == 'expensereport') {
$sql = "SELECT ed.rowid FROM ".MAIN_DB_PREFIX."expensereport as e, ".MAIN_DB_PREFIX."expensereport_det as ed WHERE e.rowid = ed.fk_expensereport AND e.entity IN (".getEntity('expensereport').") AND ed.fk_projet IN (".$this->db->sanitize($ids).")";
$sql = "SELECT ed.rowid FROM ".MAIN_DB_PREFIX."expensereport as e, ".MAIN_DB_PREFIX."expensereport_det as ed WHERE e.rowid = ed.fk_expensereport AND e.entity IN (".getEntity('expensereport').") AND ed.fk_projet IN (".$this->db->sanitize((string) $ids).")";
} elseif ($type == 'project_task') {
$sql = "SELECT DISTINCT pt.rowid FROM ".MAIN_DB_PREFIX."projet_task as pt WHERE pt.fk_projet IN (".$this->db->sanitize($ids).")";
$sql = "SELECT DISTINCT pt.rowid FROM ".MAIN_DB_PREFIX."projet_task as pt WHERE pt.fk_projet IN (".$this->db->sanitize((string) $ids).")";
} elseif ($type == 'element_time') { // Case we want to duplicate line foreach user
$sql = "SELECT DISTINCT pt.rowid, ptt.fk_user FROM ".MAIN_DB_PREFIX."projet_task as pt, ".MAIN_DB_PREFIX."element_time as ptt WHERE pt.rowid = ptt.fk_element AND ptt.elementtype = 'task' AND pt.fk_projet IN (".$this->db->sanitize($ids).")";
$sql = "SELECT DISTINCT pt.rowid, ptt.fk_user FROM ".MAIN_DB_PREFIX."projet_task as pt, ".MAIN_DB_PREFIX."element_time as ptt WHERE pt.rowid = ptt.fk_element AND ptt.elementtype = 'task' AND pt.fk_projet IN (".$this->db->sanitize((string) $ids).")";
} elseif ($type == 'stocktransfer_stocktransfer') {
$sql = "SELECT ms.rowid, ms.fk_user_author as fk_user FROM ".MAIN_DB_PREFIX."stocktransfer_stocktransfer as ms, ".MAIN_DB_PREFIX."entrepot as e WHERE e.rowid = ms.fk_entrepot AND e.entity IN (".getEntity('stock').") AND ms.origintype = 'project' AND ms.fk_origin IN (".$this->db->sanitize($ids).") AND ms.type_mouvement = 1";
$sql = "SELECT ms.rowid, ms.fk_user_author as fk_user FROM ".MAIN_DB_PREFIX."stocktransfer_stocktransfer as ms, ".MAIN_DB_PREFIX."entrepot as e WHERE e.rowid = ms.fk_entrepot AND e.entity IN (".getEntity('stock').") AND ms.origintype = 'project' AND ms.fk_origin IN (".$this->db->sanitize((string) $ids).") AND ms.type_mouvement = 1";
} elseif ($type == 'loan') {
$sql = "SELECT l.rowid, l.fk_user_author as fk_user FROM ".MAIN_DB_PREFIX."loan as l WHERE l.entity IN (".getEntity('loan').") AND l.fk_projet IN (".$this->db->sanitize($ids).")";
$sql = "SELECT l.rowid, l.fk_user_author as fk_user FROM ".MAIN_DB_PREFIX."loan as l WHERE l.entity IN (".getEntity('loan').") AND l.fk_projet IN (".$this->db->sanitize((string) $ids).")";
} else {
$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX.$tablename." WHERE ".$projectkey." IN (".$this->db->sanitize($ids).") AND entity IN (".getEntity($type).")";
$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX.$tablename." WHERE ".$projectkey." IN (".$this->db->sanitize((string) $ids).") AND entity IN (".getEntity($type).")";
}
if (isDolTms($date_start) && $type == 'loan') {
$sql .= " AND (dateend > '".$this->db->idate($date_start)."' OR dateend IS NULL)";
$sql .= " AND (dateend > '".$this->db->idate((int) $date_start)."' OR dateend IS NULL)";
} elseif (isDolTms($date_start) && ($type != 'project_task')) { // For table project_taks, we want the filter on date apply on project_time_spent table
if (empty($datefieldname) && !empty($this->table_element_date)) {
$datefieldname = $this->table_element_date;
@ -908,11 +908,11 @@ class Project extends CommonObject
if (empty($datefieldname)) {
return 'Error this object has no date field defined';
}
$sql .= " AND (".$datefieldname." >= '".$this->db->idate($date_start)."' OR ".$datefieldname." IS NULL)";
$sql .= " AND (".$datefieldname." >= '".$this->db->idate((int) $date_start)."' OR ".$datefieldname." IS NULL)";
}
if (isDolTms($date_end) && $type == 'loan') {
$sql .= " AND (datestart < '".$this->db->idate($date_end)."' OR datestart IS NULL)";
$sql .= " AND (datestart < '".$this->db->idate((int) $date_end)."' OR datestart IS NULL)";
} elseif (isDolTms($date_end) && ($type != 'project_task')) { // For table project_taks, we want the filter on date apply on project_time_spent table
if (empty($datefieldname) && !empty($this->table_element_date)) {
$datefieldname = $this->table_element_date;
@ -920,7 +920,7 @@ class Project extends CommonObject
if (empty($datefieldname)) {
return 'Error this object has no date field defined';
}
$sql .= " AND (".$datefieldname." <= '".$this->db->idate($date_end)."' OR ".$datefieldname." IS NULL)";
$sql .= " AND (".$datefieldname." <= '".$this->db->idate((int) $date_end)."' OR ".$datefieldname." IS NULL)";
}
$parameters = array(
@ -1411,18 +1411,18 @@ class Project extends CommonObject
}
/**
* Return clickable name (with picto eventually)
* Return clickable name (with optional picto)
*
* @param int $withpicto 0=No picto, 1=Include picto into link, 2=Only picto
* @param string $option Variant where the link point to ('', 'nolink')
* @param int $addlabel 0=Default, 1=Add label into string, >1=Add first chars into string
* @param string $moreinpopup Text to add into popup
* @param string $sep Separator between ref and label if option addlabel is set
* @param int $notooltip 1=Disable tooltip
* @param int $save_lastsearch_value -1=Auto, 0=No save of lastsearch_values when clicking, 1=Save lastsearch_values whenclicking
* @param string $morecss More css on a link
* @param string $save_pageforbacktolist Back to this page 'context:url'
* @return string String with URL
* @param int<0,2> $withpicto 0=No picto, 1=Include picto into link, 2=Only picto
* @param string $option Variant where the link point to ('', 'nolink')
* @param int $addlabel 0=Default, 1=Add label into string, >1=Add first chars into string
* @param string $moreinpopup Text to add into popup
* @param string $sep Separator between ref and label if option addlabel is set
* @param int<0,1> $notooltip 1=Disable tooltip
* @param int<-1,1> $save_lastsearch_value -1=Auto, 0=No save of lastsearch_values when clicking, 1=Save lastsearch_values whenclicking
* @param string $morecss More css on a link
* @param string $save_pageforbacktolist Back to this page 'context:url'
* @return string String with URL
*/
public function getNomUrl($withpicto = 0, $option = '', $addlabel = 0, $moreinpopup = '', $sep = ' - ', $notooltip = 0, $save_lastsearch_value = -1, $morecss = '', $save_pageforbacktolist = '')
{
@ -1740,17 +1740,17 @@ class Project extends CommonObject
/**
* Load an object from its id and create a new one in database
*
* @param User $user User making the clone
* @param int $fromid Id of object to clone
* @param bool $clone_contact Clone contact of project
* @param bool $clone_task Clone task of project
* @param bool $clone_project_file Clone file of project
* @param bool $clone_task_file Clone file of task (if task are copied)
* @param bool $clone_note Clone note of project
* @param bool $move_date Move task date on clone
* @param int $notrigger No trigger flag
* @param int $newthirdpartyid New thirdparty id
* @return int New id of clone
* @param User $user User making the clone
* @param int $fromid Id of object to clone
* @param bool|int<0,1> $clone_contact Clone contact of project
* @param bool|int<0,1> $clone_task Clone task of project
* @param bool|int<0,1> $clone_project_file Clone file of project
* @param bool|int<0,1> $clone_task_file Clone file of task (if task are copied)
* @param bool|int<0,1> $clone_note Clone note of project
* @param bool|int<0,1> $move_date Move task date on clone
* @param int<0,1> $notrigger No trigger flag
* @param int $newthirdpartyid New thirdparty id
* @return int New id of clone
*/
public function createFromClone(User $user, $fromid, $clone_contact = false, $clone_task = true, $clone_project_file = false, $clone_task_file = false, $clone_note = true, $move_date = true, $notrigger = 0, $newthirdpartyid = 0)
{

View File

@ -1,7 +1,7 @@
<?php
/* Lead
* Copyright (C) 2014-2015 Florian HENRY <florian.henry@open-concept.pro>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
*
* 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
@ -224,7 +224,7 @@ class ProjectStats extends Stats
}
if (!empty($this->status)) {
$sqlwhere[] = " t.fk_statut IN (".$this->db->sanitize($this->status).")";
$sqlwhere[] = " t.fk_statut IN (".$this->db->sanitize((string) $this->status).")";
}
if (!empty($this->opp_status)) {

View File

@ -674,7 +674,7 @@ class Task extends CommonObjectLine
// Update request
$sql = "UPDATE ".MAIN_DB_PREFIX."projet_task SET";
$sql .= " fk_projet=".(isset($this->fk_project) ? $this->fk_project : "null").",";
$sql .= " ref=".(isset($this->ref) ? "'".$this->db->escape($this->ref)."'" : "'".$this->db->escape($this->id)."'").",";
$sql .= " ref=".(isset($this->ref) ? "'".$this->db->escape($this->ref)."'" : "'".$this->db->escape((string) $this->id)."'").",";
$sql .= " fk_task_parent=".(isset($this->fk_task_parent) ? $this->fk_task_parent : "null").",";
$sql .= " label=".(isset($this->label) ? "'".$this->db->escape($this->label)."'" : "null").",";
$sql .= " description=".(isset($this->description) ? "'".$this->db->escape($this->description)."'" : "null").",";
@ -1121,24 +1121,24 @@ class Task extends CommonObjectLine
* Return list of tasks for all projects or for one particular project
* Sort order is on project, then on position of task, and last on start date of first level task
*
* @param ?User $usert Object user to limit tasks affected to a particular user
* @param ?User $userp Object user to limit projects of a particular user and public projects
* @param int $projectid Project id
* @param int $socid Third party id
* @param int $mode 0=Return list of tasks and their projects, 1=Return projects and tasks if exists
* @param string $filteronproj Filter on project ref or label
* @param string $filteronprojstatus Filter on project status ('-1'=no filter, '0,1'=Draft+Validated only)
* @param string $morewherefilter Add more filter into where SQL request (must start with ' AND ...')
* @param int $filteronprojuser Filter on user that is a contact of project
* @param int $filterontaskuser Filter on user assigned to task
* @param ?Extrafields $extrafields Show additional column from project or task
* @param int $includebilltime Calculate also the time to bill and billed
* @param ?User $usert Object user to limit tasks affected to a particular user
* @param ?User $userp Object user to limit projects of a particular user and public projects
* @param int $projectid Project id
* @param int $socid Third party id
* @param int<0,1> $mode 0=Return list of tasks and their projects, 1=Return projects and tasks if exists
* @param string $filteronproj Filter on project ref or label
* @param string $filteronprojstatus Filter on project status ('-1'=no filter, '0,1'=Draft+Validated only)
* @param string $morewherefilter Add more filter into where SQL request (must start with ' AND ...')
* @param int<0,1> $filteronprojuser Filter on user that is a contact of project
* @param int<0,1> $filterontaskuser Filter on user assigned to task
* @param ?Extrafields $extrafields Show additional column from project or task
* @param int<0,1> $includebilltime Calculate also the time to bill and billed
* @param array<string,string> $search_array_options Array of search filters. Not Used yet.
* @param int $loadextras Fetch all Extrafields on each project and 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 Task[]|string Array of tasks
* @param int<0,1> $loadextras Fetch all Extrafields on each project and task
* @param int<0,1> $loadRoleMode 1= will test Roles on task; 0 used in delete project action
* @param string $sortfield Sort field
* @param string $sortorder Sort order
* @return Task[]|string 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 = null, $includebilltime = 0, $search_array_options = array(), $loadextras = 0, $loadRoleMode = 1, $sortfield = '', $sortorder = '')
{
@ -1244,7 +1244,7 @@ class Task extends CommonObjectLine
$sql .= " AND p.fk_soc = ".((int) $socid);
}
if ($projectid) {
$sql .= " AND p.rowid IN (".$this->db->sanitize($projectid).")";
$sql .= " AND p.rowid IN (".$this->db->sanitize((string) $projectid).")";
}
if ($filteronproj) {
$sql .= natural_search(array("p.ref", "p.title"), $filteronproj);
@ -1907,11 +1907,11 @@ class Task extends CommonObjectLine
}
if ($dates > 0) {
$datefieldname = "element_datehour";
$sql .= " AND (".$datefieldname." >= '".$this->db->idate($dates)."' OR ".$datefieldname." IS NULL)";
$sql .= " AND (".$datefieldname." >= '".$this->db->idate((int) $dates)."' OR ".$datefieldname." IS NULL)";
}
if ($datee > 0) {
$datefieldname = "element_datehour";
$sql .= " AND (".$datefieldname." <= '".$this->db->idate($datee)."' OR ".$datefieldname." IS NULL)";
$sql .= " AND (".$datefieldname." <= '".$this->db->idate((int) $datee)."' OR ".$datefieldname." IS NULL)";
}
//print $sql;
@ -2220,7 +2220,7 @@ class Task extends CommonObjectLine
if (!$error) {
$sql = "UPDATE ".MAIN_DB_PREFIX."projet_task";
$sql .= " SET duration_effective = duration_effective - ".$this->db->escape($this->timespent_duration ? $this->timespent_duration : 0);
$sql .= " SET duration_effective = duration_effective - ".$this->db->escape($this->timespent_duration ? (string) $this->timespent_duration : '0');
$sql .= " WHERE rowid = ".((int) $this->id);
dol_syslog(get_class($this)."::delTimeSpent", LOG_DEBUG);
@ -2291,7 +2291,7 @@ class Task extends CommonObjectLine
require_once DOL_DOCUMENT_ROOT."/core/modules/project/task/" . getDolGlobalString('PROJECT_TASK_ADDON').'.php';
$modTask = new $obj();
'@phan-var-force ModeleNumRefTask $modTask';
$defaultref = $modTask->getNextValue(0, $clone_task);
$defaultref = $modTask->getNextValue(null, $clone_task);
}
$ori_project_id = $clone_task->fk_project;

View File

@ -1,7 +1,7 @@
<?php
/* Copyright (C) 2014-2015 Florian HENRY <florian.henry@open-concept.pro>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
*
* 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
@ -162,7 +162,7 @@ class TaskStats extends Stats
$sqlwhere[] = " t.datec BETWEEN '".$this->db->idate(dol_get_first_day($this->year, $this->month))."' AND '".$this->db->idate(dol_get_last_day($this->year, $this->month))."'";
}
if (!empty($this->priority)) {
$sqlwhere[] = " t.priority IN (".$this->db->sanitize($this->priority, 1).")";
$sqlwhere[] = " t.priority IN (".$this->db->sanitize((string) $this->priority, 1).")";
}
if (count($sqlwhere) > 0) {

View File

@ -1,7 +1,7 @@
<?php
/* Copyright (C) 2010 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2012-2015 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
@ -88,16 +88,16 @@ if ($reshook < 0) {
setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
}
$formconfirmtoaddtasks = '';
if (empty($reshook)) {
// Test if we can add contact to the tasks at the same times, if not or not required, make a redirect
$formconfirmtoaddtasks = '';
if ($action == 'addcontact' && $permissiontoadd) {
$form = new Form($db);
$source = GETPOST("source", 'aZ09');
$taskstatic = new Task($db);
$task_array = $taskstatic->getTasksArray(0, 0, $object->id, 0, 0);
$task_array = $taskstatic->getTasksArray(null, null, $object->id, 0, 0);
$nbTasks = count($task_array);
//If no task available, redirec to to add confirm
@ -191,7 +191,7 @@ if (empty($reshook)) {
if ($result > 0) {
$excludefilter = 'statut = 1';
$tmpcontactarray = $usergroup->listUsersForGroup($excludefilter, 0);
if ($contactarray <= 0) {
if (!is_array($tmpcontactarray)) {
$error++;
} else {
foreach ($tmpcontactarray as $tmpuser) {
@ -245,7 +245,7 @@ if (empty($reshook)) {
foreach ($task_to_affect as $task_id) {
if (GETPOSTISSET('person_'.$task_id) && GETPOST('person_'.$task_id, 'san_alpha')) {
$tasksToAffect = new Task($db);
$result = $tasksToAffect->fetch($task_id);
$result = $tasksToAffect->fetch((int) $task_id);
if ($result < 0) {
setEventMessages($tasksToAffect->error, null, 'errors');
} else {

View File

@ -737,7 +737,7 @@ if (!empty($hookmanager->resArray)) {
if ($action == "addelement") {
$tablename = GETPOST("tablename");
$elementselectid = GETPOST("elementselect");
$elementselectid = GETPOSTINT("elementselect");
$result = $object->update_element($tablename, $elementselectid);
if ($result < 0) {
setEventMessages($object->error, $object->errors, 'errors');
@ -766,10 +766,10 @@ if (!$showdatefilter) {
print '<input type="hidden" name="tablename" value="'.(empty($tablename) ? '' : $tablename).'">';
print '<input type="hidden" name="action" value="view">';
print '<div class="inline-block">';
print $form->selectDate($dates, 'dates', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
print $form->selectDate((int) $dates, 'dates', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
print '</div>';
print '<div class="inline-block">';
print $form->selectDate($datee, 'datee', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
print $form->selectDate((int) $datee, 'datee', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
print '</div>';
print '<div class="inline-block">';
print '<input type="submit" name="refresh" value="'.$langs->trans("Refresh").'" class="button small">';
@ -866,8 +866,8 @@ foreach ($listofreferent as $key => $value) {
$num = count($elementarray);
for ($i = 0; $i < $num; $i++) {
$tmp = explode('_', $elementarray[$i]);
$idofelement = $tmp[0];
$idofelementuser = !empty($tmp[1]) ? $tmp[1] : "";
$idofelement = (int) $tmp[0];
$idofelementuser = !empty($tmp[1]) ? (int) $tmp[1] : 0;
$element->fetch($idofelement);
if ($idofelementuser) {
@ -896,15 +896,20 @@ foreach ($listofreferent as $key => $value) {
// Define $total_ht_by_line
if ($tablename == 'don' || $tablename == 'chargesociales' || $tablename == 'payment_various' || $tablename == 'salary') {
'@phan-var-force ChargeSociales|PaymentVarious|Salary $element';
$total_ht_by_line = $element->amount;
} elseif ($tablename == 'fichinter') {
'@phan-var-force Fichinter $element';
$total_ht_by_line = $element->getAmount();
} elseif ($tablename == 'stock_mouvement') {
'@phan-var-force MouvementStock $element';
$total_ht_by_line = $element->price * abs($element->qty);
} elseif ($tablename == 'projet_task') {
$tmp = $element->getSumOfAmount($idofelementuser ? $elementuser : '', $dates, $datee);
'@phan-var-force Task $element';
$tmp = $element->getSumOfAmount($idofelementuser ? $elementuser : '', (string) $dates, (string) $datee);
$total_ht_by_line = price2num($tmp['amount'], 'MT');
} elseif ($key == 'loan') {
'@phan-var-force Loan $element';
if ((empty($dates) && empty($datee)) || (intval($dates) <= $element->datestart && intval($datee) >= $element->dateend)) {
// Get total loan
$total_ht_by_line = -$element->capital;
@ -933,12 +938,16 @@ foreach ($listofreferent as $key => $value) {
// Define $total_ttc_by_line
if ($tablename == 'don' || $tablename == 'chargesociales' || $tablename == 'payment_various' || $tablename == 'salary') {
'@phan-var-force ChargeSociales|PaymentVarious|Salary $element';
$total_ttc_by_line = $element->amount;
} elseif ($tablename == 'fichinter') {
'@phan-var-force Fichinter $element';
$total_ttc_by_line = $element->getAmount();
} elseif ($tablename == 'stock_mouvement') {
'@phan-var-force MouvementStock $element';
$total_ttc_by_line = $element->price * abs($element->qty);
} elseif ($tablename == 'projet_task') {
'@phan-var-force Task $element';
$defaultvat = get_default_tva($mysoc, $mysoc);
$reg = array();
if (preg_replace('/^(\d+\.)\s\(.*\)/', $defaultvat, $reg)) {
@ -1101,7 +1110,7 @@ foreach ($listofreferent as $key => $value) {
$exclude_select_element[] = $value['exclude_select_element'];
}
if ($qualified) {
if ($qualified && $tablename !== null) {
// If we want the project task array to have details of users
//if ($key == 'project_task') $key = 'project_task_time';
@ -1268,8 +1277,8 @@ foreach ($listofreferent as $key => $value) {
$total_time = 0;
for ($i = 0; $i < $num; $i++) {
$tmp = explode('_', $elementarray[$i]);
$idofelement = $tmp[0];
$idofelementuser = isset($tmp[1]) ? $tmp[1] : "";
$idofelement = (int) $tmp[0];
$idofelementuser = isset($tmp[1]) ? (int) $tmp[1] : 0;
$element->fetch($idofelement);
if ($idofelementuser) {
@ -1390,6 +1399,7 @@ foreach ($listofreferent as $key => $value) {
print "</td>\n";
// Product and qty on stock movement
if ('MouvementStock' == $classname) {
'@phan-var-force MouvementStock $element';
$mvsProd = new Product($element->db);
$mvsProd->fetch($element->product_id);
print '<td>'.$mvsProd->getNomUrl(1).'</td>';
@ -1397,28 +1407,38 @@ foreach ($listofreferent as $key => $value) {
}
// Date or TimeSpent
$date = '';
$total_time_by_line = null;
$total_time_by_line = 0;
if ($tablename == 'expensereport_det') {
'@phan-var-force ExpenseReportLine $element';
$date = $element->date; // No draft status on lines
} elseif ($tablename == 'stock_mouvement') {
'@phan-var-force MouvementStock $element';
$date = $element->datem;
} elseif ($tablename == 'salary') {
'@phan-var-force Salary $element';
$date = $element->datesp;
} elseif ($tablename == 'payment_various') {
'@phan-var-force PaymentVarious $element';
$date = $element->datev;
} elseif ($tablename == 'chargesociales') {
'@phan-var-force ChargeSociales $element';
$date = $element->date_ech;
} elseif (!empty($element->status) || !empty($element->statut) || !empty($element->fk_status)) {
if ($tablename == 'don') {
$date = $element->datedon;
'@phan-var-force Don $element';
$date = $element->date;
}
if ($tablename == 'commande_fournisseur' || $tablename == 'supplier_order') {
'@phan-var-force CommandeFournisseur $element';
$date = ($element->date_commande ? $element->date_commande : $element->date_valid);
} elseif ($tablename == 'supplier_proposal') {
'@phan-var-force SupplierProposal $element';
$date = $element->date_validation; // There is no other date for this
} elseif ($tablename == 'fichinter') {
'@phan-var-force Fichinter $element';
$date = $element->datev; // There is no other date for this
} elseif ($tablename == 'projet_task') {
'@phan-var-force Task $element';
$date = ''; // We show no date. Showing date of beginning of task make user think it is date of time consumed
} else {
$date = $element->date; // invoice, ...
@ -1429,21 +1449,25 @@ foreach ($listofreferent as $key => $value) {
$date = $element->datev;
}
if (empty($date) && !empty($datefieldname)) {
// @phan-suppress-next-line PhanUndeclaredProperty
$date = $element->$datefieldname;
}
}
} elseif ($key == 'loan') {
'@phan-var-force Loan $element';
$date = $element->datestart;
}
print '<td class="center">';
if ($tablename == 'actioncomm') {
'@phan-var-force ActionComm $element';
print dol_print_date($element->datep, 'dayhour');
if ($element->datef && $element->datef > $element->datep) {
print " - ".dol_print_date($element->datef, 'dayhour');
}
} elseif (in_array($tablename, array('projet_task'))) {
$tmpprojtime = $element->getSumOfAmount($idofelementuser ? $elementuser : '', $dates, $datee); // $element is a task. $elementuser may be empty
'@phan-var-force Task $element';
$tmpprojtime = $element->getSumOfAmount($idofelementuser ? $elementuser : '', (string) $dates, (string) $datee); // $element is a task. $elementuser may be empty
print '<a href="'.DOL_URL_ROOT.'/projet/tasks/time.php?id='.$idofelement.'&withproject=1">';
print convertSecondToTime($tmpprojtime['nbseconds'], 'allhourmin');
print '</a>';
@ -1466,6 +1490,7 @@ foreach ($listofreferent as $key => $value) {
$tmpuser->fetch($element->fk_user);
print $tmpuser->getNomUrl(1, '', 48);
} elseif ($tablename == 'don' || $tablename == 'stock_mouvement') {
'@phan-var-force Don|MouvementStock $element';
if ($element->fk_user_author > 0) {
$tmpuser2 = new User($db);
$tmpuser2->fetch($element->fk_user_author);
@ -1474,12 +1499,14 @@ foreach ($listofreferent as $key => $value) {
} elseif ($tablename == 'projet_task' && $key == 'element_time') { // if $key == 'project_task', we don't want details per user
print $elementuser->getNomUrl(1);
} elseif ($tablename == 'payment_various') { // payment label
'@phan-var-force PaymentVarious $element';
print $element->label;
}
print '</td>';
// Add duration and store it in counter for fichinter
if ($tablename == 'fichinter') {
'@phan-var-force FichInter $element';
print '<td>';
print convertSecondToTime($element->duration, 'all', $conf->global->MAIN_DURATION_OF_WORKDAY);
$total_duration += $element->duration;
@ -1492,10 +1519,13 @@ foreach ($listofreferent as $key => $value) {
$total_ht_by_line = null;
$othermessage = '';
if ($tablename == 'don' || $tablename == 'chargesociales' || $tablename == 'payment_various' || $tablename == 'salary') {
'@phan-var-force Don|ChargeSociales|PaymentVarious|Salary $element';
$total_ht_by_line = $element->amount;
} elseif ($tablename == 'fichinter') {
'@phan-var-force FichInter $element';
$total_ht_by_line = $element->getAmount();
} elseif ($tablename == 'stock_mouvement') {
'@phan-var-force MouvementStock $element';
$total_ht_by_line = $element->price * abs($element->qty);
} elseif (in_array($tablename, array('projet_task'))) {
if (isModEnabled('salaries')) {
@ -1509,6 +1539,7 @@ foreach ($listofreferent as $key => $value) {
$othermessage = $form->textwithpicto($langs->trans("NotAvailable"), $langs->trans("ModuleSalaryToDefineHourlyRateMustBeEnabled"));
}
} elseif ($key == 'loan') {
'@phan-var-force Loan $element';
$total_ht_by_line = $element->capital;
} else {
$total_ht_by_line = $element->total_ht;
@ -1546,10 +1577,13 @@ foreach ($listofreferent as $key => $value) {
if (empty($value['disableamount'])) {
$total_ttc_by_line = null;
if ($tablename == 'don' || $tablename == 'chargesociales' || $tablename == 'payment_various' || $tablename == 'salary') {
'@phan-var-force Don|ChargeSociales|PaymentVarious $element';
$total_ttc_by_line = $element->amount;
} elseif ($tablename == 'fichinter') {
'@phan-var-force Fichinter $element';
$total_ttc_by_line = $element->getAmount();
} elseif ($tablename == 'stock_mouvement') {
'@phan-var-force MouvementStock $element';
$total_ttc_by_line = $element->price * abs($element->qty);
} elseif ($tablename == 'projet_task') {
if (isModEnabled('salaries')) {
@ -1560,6 +1594,7 @@ foreach ($listofreferent as $key => $value) {
$othermessage = $form->textwithpicto($langs->trans("NotAvailable"), $langs->trans("ModuleSalaryToDefineHourlyRateMustBeEnabled"));
}
} elseif ($key == 'loan') {
'@phan-var-force Loan $element';
$total_ttc_by_line = $element->capital - $element->getSumPayment();
} else {
$total_ttc_by_line = $element->total_ttc;
@ -1605,6 +1640,7 @@ foreach ($listofreferent as $key => $value) {
print $element->progress.' %';
}
} elseif ($tablename == 'stock_mouvement') {
'@phan-var-force MouvementStock $element';
print $element->getLibStatut(3);
} else {
print $element->getLibStatut(5);
@ -1662,7 +1698,7 @@ foreach ($listofreferent as $key => $value) {
print '<tr class="liste_total"><td colspan="'.$colspan.'">'.$langs->trans("Number").': '.$i.'</td>';
if (in_array($tablename, array('projet_task'))) {
print '<td class="center">';
print convertSecondToTime($total_time, 'allhourmin');
print convertSecondToTime((int) $total_time, 'allhourmin');
print '</td>';
print '<td>';
print '</td>';
@ -1746,8 +1782,8 @@ function canApplySubtotalOn($tablename)
/**
* sortElementsByClientName
*
* @param int[] $elementarray Element array
* @return int[] Element array sorted
* @param array<int,string> $elementarray Element array
* @return array<int,string> Element array sorted
*/
function sortElementsByClientName($elementarray)
{

View File

@ -1,7 +1,7 @@
<?php
/* Copyright (C) 2010-2017 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
*
* 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
@ -26,6 +26,13 @@
* @var DoliDB $db
* @var Translate $langs
*/
'
@phan-var-force string $dateformatinput
@phan-var-force string $dateformat
@phan-var-force string $datehourformat
@phan-var-force array<int,array{task_id:int,task_alternate_id:int,task_project_id:int,task_parent:int,task_is_group:int<0,1>,task_css:string,task_position:int,task_planned_workload:int,task_milestone:int,task_percent_complete:float,task_name:string,task_start_date:int,task_end_date:int,task_color:string,task_resources:string,note:string,task_parent_alternate_id:int}> $tasks
@phan-var-force array{} $task_dependencies
';
?>
<div id="principal_content" style="margin-left: 0;">
@ -129,14 +136,14 @@ if (g.getDivId() != null)
$projecttmp = new Project($db);
$projecttmp->fetch($t['task_project_id']);
$tmpt = array(
'task_id' => '-'.$t['task_project_id'],
'task_alternate_id' => '-'.$t['task_project_id'],
'task_id' => (int) -$t['task_project_id'],
'task_alternate_id' => (int) -$t['task_project_id'],
'task_name' => $projecttmp->ref.' '.$projecttmp->title,
'task_resources' => '',
'task_start_date' => '',
'task_end_date' => '',
'task_start_date' => 0,
'task_end_date' => 0,
'task_is_group' => 1, 'task_position' => 0, 'task_css' => 'ggroupblack', 'task_milestone' => 0, 'task_parent' => 0, 'task_parent_alternate_id' => 0,
'task_notes' => '',
'note' => '',
'task_planned_workload' => 0
);
constructGanttLine($tasks, $tmpt, array(), 0, $t['task_project_id']);
@ -166,10 +173,10 @@ else
<?php
/**
* Add a gant chart line
* Add a gantt chart line
*
* @param array<int,array{task_id:string,task_alternate_id:string,task_name:string,task_resources:string,task_start_date:string,task_end_date:string,task_is_group:int<0,1>,task_position:int,task_css:string,task_milestone:int,task_parent:int,task_parent_alternate_id:int}> $tarr Array of all tasks
* @param array{task_id:string,task_alternate_id:string,task_name:string,task_resources:string,task_start_date:string,task_end_date:string,task_is_group:int<0,1>,task_position:int,task_css:string,task_milestone:int,task_parent:int,task_parent_alternate_id:int} $task Array with properties of one task
* @param array<int,array{task_id:int,task_alternate_id:int,task_name:string,task_resources:string,task_start_date:int,task_end_date:int,task_is_group:int<0,1>,task_position:int,task_css:string,task_milestone:int,task_parent:int,task_parent_alternate_id:int}> $tarr Array of all tasks
* @param array{task_id:int,task_alternate_id:int,task_name:string,task_resources:string,task_start_date:int,task_end_date:int,task_is_group:int<0,1>,task_position:int,task_css:string,task_milestone:int,task_parent:int,task_parent_alternate_id:int} $task Array with properties of one task
* @param array<int[]> $task_dependencies Task dependencies (array(array(0=>idtask,1=>idtasktofinishfisrt))
* @param int $level Level
* @param int $project_id Id of project
@ -280,8 +287,8 @@ function constructGanttLine($tarr, $task, $task_dependencies, $level = 0, $proje
/**
* Find child Gantt line
*
* @param array<int,array{task_id:string,task_alternate_id:string,task_name:string,task_resources:string,task_start_date:string,task_end_date:string,task_is_group:int<0,1>,task_position:int,task_css:string,task_milestone:int,task_parent:int,task_parent_alternate_id:int}> $tarr tarr
* @param string $parent Parent
* @param array<int,array{task_id:int,task_alternate_id:int,task_name:string,task_resources:string,task_start_date:int,task_end_date:int,task_is_group:int<0,1>,task_position:int,task_css:string,task_milestone:int,task_parent:int,task_parent_alternate_id:int}> $tarr tarr
* @param int $parent Parent
* @param array<int[]> $task_dependencies Task dependencies
* @param int $level Level
* @return void
@ -298,12 +305,12 @@ function findChildGanttLine($tarr, $parent, $task_dependencies, $level)
{
$tmpt = array(
'task_id'=> -98, 'task_name'=>'Level '.$level, 'task_resources'=>'', 'task_start_date'=>'', 'task_end_date'=>'',
'task_is_group'=>1, 'task_css'=>'ggroupblack', 'task_milestone'=> 0, 'task_parent'=>$tarr[$x]["task_parent"], 'task_notes'=>'');
'task_is_group'=>1, 'task_css'=>'ggroupblack', 'task_milestone'=> 0, 'task_parent'=>$tarr[$x]["task_parent"], 'note'=>'');
constructGanttLine($tasks, $tmpt, array(), 0, $tarr[$x]['task_project_id']);
$old_parent_id = $tarr[$x]['task_project_id'];
}*/
constructGanttLine($tarr, $tarr[$x], $task_dependencies, $level, null);
constructGanttLine($tarr, $tarr[$x], $task_dependencies, $level, 0);
findChildGanttLine($tarr, $tarr[$x]["task_id"], $task_dependencies, $level + 1);
}
}

View File

@ -2,7 +2,7 @@
/* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2017 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
@ -101,6 +101,8 @@ $help_url = "EN:Module_Projects|FR:Module_Projets|ES:M&oacute;dulo_Proyectos";
llxHeader("", $title, $help_url, '', 0, 0, $arrayofjs, $arrayofcss, '', 'mod-project page-card_ganttview');
$userWrite = 0;
if (($id > 0 && is_numeric($id)) || !empty($ref)) {
// To verify role of users
//$userAccess = $object->restrictedProjectArea($user,'read');
@ -272,7 +274,7 @@ print load_fiche_titre($title, $linktotasks.' &nbsp; '.$linktocreatetask, 'proje
// 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).
$tasksarray = $task->getTasksArray(0, 0, ($object->id ? $object->id : $id), $socid, 0);
$tasksarray = $task->getTasksArray(null, null, ($object->id ? $object->id : $id), $socid, 0);
// We load also tasks limited to a particular user
//$tasksrole=($_REQUEST["mode"]=='mine' ? $task->getUserRolesForProjectsOrTasks(null, $user, $object->id, 0) : '');
//var_dump($tasksarray);
@ -313,7 +315,7 @@ if (count($tasksarray) > 0) {
$tasks[$taskcursor]['task_css'] = 'ggroupblack';
//$tasks[$taskcursor]['task_css'] = 'gtaskblue';
}
$tasks[$taskcursor]['task_milestone'] = '0';
$tasks[$taskcursor]['task_milestone'] = 0;
$tasks[$taskcursor]['task_percent_complete'] = $val->progress;
//$tasks[$taskcursor]['task_name']=$task->getNomUrl(1);
//print dol_print_date($val->date_start).dol_print_date($val->date_end).'<br>'."\n";

View File

@ -1,6 +1,6 @@
<?php
/* Copyright (C) 2013-2020 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
*
* This program is free software; you can redistribute it and/or modify
@ -29,6 +29,13 @@
* @var int $socid
* @var string[] $listofoppstatus
*/
'
@phan-var-force string $projectsListId
@phan-var-force int $socid
@phan-var-force string[] $listofoppstatus
@phan-var-force ?array<int,string> $listofopplabel
@phan-var-force array<string,string> $colorseries
';
if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
$sql = "SELECT p.fk_opp_status as opp_status, cls.code, COUNT(p.rowid) as nb, SUM(p.opp_amount) as opp_amount, SUM(p.opp_amount * p.opp_percent) as ponderated_opp_amount";

View File

@ -8,7 +8,7 @@
* Copyright (C) 2018 Ferran Marcet <fmarcet@2byte.es>
* Copyright (C) 2019 Juanjo Menent <jmenent@2byte.es>
* Copyright (C) 2020 Tobias Sean <tobias.sekan@startmail.com>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2024 Benjamin Falière <benjamin.faliere@altairis.fr>
* Copyright (C) 2024 William Mead <william.mead@manchenumerique.fr>
@ -246,8 +246,8 @@ foreach ($object->fields as $key => $val) {
$visible = (int) dol_eval((string) $val['visible'], 1, 1, '1');
$arrayfields['p.'.$key] = array(
'label' => $val['label'],
'checked' => (($visible < 0) ? 0 : 1),
'enabled' => (abs($visible) != 3 && (bool) dol_eval($val['enabled'], 1)),
'checked' => (($visible < 0) ? '0' : '1'),
'enabled' => (string) (int) (abs($visible) != 3 && (bool) dol_eval($val['enabled'], 1)),
'position' => $val['position'],
'help' => isset($val['help']) ? $val['help'] : ''
);
@ -257,38 +257,48 @@ foreach ($object->fields as $key => $val) {
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
// Add non object fields to fields for list
$arrayfields['s.nom'] = array('label' => "ThirdParty", 'checked' => 1, 'position' => 21, 'enabled' => (!isModEnabled('societe') ? 0 : 1));
$arrayfields['s.name_alias'] = array('label' => "AliasNameShort", 'checked' => 0, 'position' => 22);
$arrayfields['co.country_code'] = array('label' => "Country", 'checked' => -1, 'position' => 23);
$arrayfields['commercial'] = array('label' => "SaleRepresentativesOfThirdParty", 'checked' => 0, 'position' => 25);
$arrayfields['c.assigned'] = array('label' => "AssignedTo", 'checked' => 1, 'position' => 120);
$arrayfields['opp_weighted_amount'] = array('label' => 'OpportunityWeightedAmountShort', 'checked' => 0, 'enabled' => (!getDolGlobalString('PROJECT_USE_OPPORTUNITIES') ? 0 : 1), 'position' => 106);
$arrayfields['u.login'] = array('label' => "Author", 'checked' => -1, 'position' => 165);
$arrayfields['s.nom'] = array('label' => "ThirdParty", 'checked' => '1', 'position' => 21, 'enabled' => (!isModEnabled('societe') ? '0' : '1'));
$arrayfields['s.name_alias'] = array('label' => "AliasNameShort", 'checked' => '0', 'position' => 22);
$arrayfields['co.country_code'] = array('label' => "Country", 'checked' => '-1', 'position' => 23);
$arrayfields['commercial'] = array('label' => "SaleRepresentativesOfThirdParty", 'checked' => '0', 'position' => 25);
$arrayfields['c.assigned'] = array('label' => "AssignedTo", 'checked' => '1', 'position' => 120);
$arrayfields['opp_weighted_amount'] = array('label' => 'OpportunityWeightedAmountShort', 'checked' => '0', 'enabled' => (!getDolGlobalString('PROJECT_USE_OPPORTUNITIES') ? '0' : '1'), 'position' => 106);
$arrayfields['u.login'] = array('label' => "Author", 'checked' => '-1', 'position' => 165);
// Force some fields according to search_usage filter...
//if (GETPOST('search_usage_opportunity')) {
//$arrayfields['p.usage_opportunity']['visible'] = 1; // Not required, filter on search_opp_status is enough
//$arrayfields['p.usage_opportunity']['checked'] = 1; // Not required, filter on search_opp_status is enough
//}
if (GETPOST('search_usage_event_organization')) {
$arrayfields['p.fk_opp_status']['enabled'] = 0;
$arrayfields['p.opp_amount']['enabled'] = 0;
$arrayfields['p.opp_percent']['enabled'] = 0;
$arrayfields['opp_weighted_amount']['enabled'] = 0;
$arrayfields['p.usage_organize_event']['visible'] = 1;
$arrayfields['p.usage_organize_event']['checked'] = 1;
if (array_key_exists('p.fk_opp_status', $arrayfields)) {
$arrayfields['p.fk_opp_status']['enabled'] = '0';
}
if (array_key_exists('p.fk_opp_amount', $arrayfields)) {
$arrayfields['p.opp_amount']['enabled'] = '0';
}
if (array_key_exists('p.fk_opp_percent', $arrayfields)) {
$arrayfields['p.opp_percent']['enabled'] = '0';
}
$arrayfields['opp_weighted_amount']['enabled'] = '0';
if (array_key_exists('p.usage_organize_event', $arrayfields)) {
$arrayfields['p.usage_organize_event']['visible'] = '1';
$arrayfields['p.usage_organize_event']['checked'] = '1';
}
}
$arrayfields['p.fk_project']['enabled'] = 0;
$arrayfields['p.fk_project']['enabled'] = '0';
// Force this field to be visible
if ($contextpage == 'lead') {
$arrayfields['p.fk_opp_status']['enabled'] = 1;
$arrayfields['p.fk_opp_status']['visible'] = 1;
if (array_key_exists('p.fk_opp_status', $arrayfields)) {
$arrayfields['p.fk_opp_status']['enabled'] = '1';
$arrayfields['p.fk_opp_status']['visible'] = '1';
}
}
$object->fields = dol_sort_array($object->fields, 'position');
$arrayfields = dol_sort_array($arrayfields, 'position');
'@phan-var-force array<string,array{label:string,checked?:int<0,1>,position?:int,help?:string}> $arrayfields'; // dol_sort_array looses type for Phan
// '@phan-var-force array<string,array{label:string,checked?:string,enabled?:string,position?:int,help?:string}> $arrayfields'; // dol_sort_array looses type for Phan
// Add a groupby field. Set $groupby and $groupbyvalues.
// TODO Move this into a inc file
@ -1203,7 +1213,7 @@ $includeonly = '';
if (!$user->hasRight('user', 'user', 'lire')) {
$includeonly = array($user->id);
}
$moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$form->select_dolusers($search_project_user ? $search_project_user : '', 'search_project_user', $tmptitle, '', 0, $includeonly, '', 0, 0, 0, '', 0, '', 'maxwidth300 widthcentpercentminusx');
$moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$form->select_dolusers($search_project_user ? $search_project_user : '', 'search_project_user', $tmptitle, null, 0, $includeonly, '', '0', 0, 0, '', 0, '', 'maxwidth300 widthcentpercentminusx');
$moreforfilter .= '</div>';
$moreforfilter .= '<div class="divsearchfield">';
@ -1291,7 +1301,7 @@ if (!empty($arrayfields['s.nom']['checked'])) {
$tmpthirdparty->fetch($socid);
$search_societe = $tmpthirdparty->name;
}
print '<input type="text" class="flat" name="search_societe" size="8" value="'.dol_escape_htmltag($search_societe).'">';
print '<input type="text" class="flat" name="search_societe" size="8" value="'.dol_escape_htmltag((string) $search_societe).'">';
print '</td>';
}
@ -1527,14 +1537,17 @@ if (!empty($arrayfields['c.assigned']['checked'])) {
$totalarray['nbfield']++;
}
if (!empty($arrayfields['p.fk_opp_status']['checked'])) {
// @phan-suppress-next-line PhanTypeInvalidDimOffset
print_liste_field_titre($arrayfields['p.fk_opp_status']['label'], $_SERVER["PHP_SELF"], 'p.fk_opp_status', "", $param, '', $sortfield, $sortorder, 'center ');
$totalarray['nbfield']++;
}
if (!empty($arrayfields['p.opp_amount']['checked'])) {
// @phan-suppress-next-line PhanTypeInvalidDimOffset
print_liste_field_titre($arrayfields['p.opp_amount']['label'], $_SERVER["PHP_SELF"], 'p.opp_amount', "", $param, '', $sortfield, $sortorder, 'right ');
$totalarray['nbfield']++;
}
if (!empty($arrayfields['p.opp_percent']['checked'])) {
// @phan-suppress-next-line PhanTypeInvalidDimOffset
print_liste_field_titre($arrayfields['p.opp_percent']['label'], $_SERVER['PHP_SELF'], 'p.opp_percent', "", $param, '', $sortfield, $sortorder, 'right ');
$totalarray['nbfield']++;
}
@ -1559,6 +1572,7 @@ if (!empty($arrayfields['p.usage_bill_time']['checked'])) {
$totalarray['nbfield']++;
}
if (!empty($arrayfields['p.usage_organize_event']['checked'])) {
// @phan-suppress-next-line PhanTypeInvalidDimOffset
print_liste_field_titre($arrayfields['p.usage_organize_event']['label'], $_SERVER["PHP_SELF"], 'p.usage_organize_event', "", $param, '', $sortfield, $sortorder, '');
$totalarray['nbfield']++;
}

View File

@ -420,7 +420,7 @@ function getProject($authentication, $id = '', $ref = '')
foreach ($listofreferent as $key => $tablename) {
$elements[$key] = array();
$element_array = $project->get_element_list($key, $tablename);
if (count($element_array) > 0 && is_array($element_array)) {
if (is_array($element_array) && count($element_array) > 0) {
foreach ($element_array as $element) {
$tmp = explode('_', $element);
$idofelement = count($tmp) > 0 ? $tmp[0] : "";