diff --git a/dev/tools/codespell/codespell-lines-ignore.txt b/dev/tools/codespell/codespell-lines-ignore.txt
index 2c0fb95a96f80..80e4f25e296dd 100644
--- a/dev/tools/codespell/codespell-lines-ignore.txt
+++ b/dev/tools/codespell/codespell-lines-ignore.txt
@@ -79,6 +79,7 @@
$object->periode = $dateperiod;
$return .= ' '.$langs->trans("Payement").' : '.$this->type_payment.'';
$sortfield = "datea";
+ $sql = "SELECT p.rowid as id, p.entity, p.title, p.ref, p.public, p.dateo as do, p.datee as de, p.fk_statut as status, p.fk_opp_status, p.opp_amount, p.opp_percent, p.tms as date_update, p.budget_amount";
$sql .= " '".$db->escape($conf->currency)."' as currency, 0 as fk_soc, t.date_ech as date, t.periode as date_due, 'SocialContributions' as item, '' as thirdparty_name, '' as thirdparty_code, '' as country_code, '' as vatnum, ".PAY_DEBIT." as sens";
$sql .= " , datee = ".(!empty($obj->datee) ? "'".$this->db->escape($obj->datee)."'" : "null");
$sql .= " AND (".$datefieldname." <= '".$this->db->idate($datee)."' OR ".$datefieldname." IS NULL)";
@@ -325,6 +326,7 @@ $usercanread = (($user->hasRight('stock', 'mouvement', 'lire')));
* The hook contaxt thirdpartycard has been renamed thirdpartycontact
* The private array ->status_short, ->statuts and ->status_long are now array ->labelStatusShort and ->labelStatus everywhere.
- New: Add proposals into referer page of thirdparty.
+NEW: ModuleBuilder: Checkin comments begin and end before each actions
for /F "tokens=2 delims=," %%i in ('tasklist /FI "IMAGENAME eq php.exe" /FO CSV /NH') do (
foreach ($TWeek as $week_number) {
function checkES($IentOfi, $InumCta)
diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php
index d8113ce135685..63f1e382fa79c 100644
--- a/htdocs/core/lib/company.lib.php
+++ b/htdocs/core/lib/company.lib.php
@@ -960,6 +960,104 @@ function show_projects($conf, $langs, $db, $object, $backtopage = '', $nocreatel
dol_print_error($db);
}
+ //projects linked to that thirdpart because of a people of that company is linked to a project
+ if (getDolGlobalString('PROJECT_DISPLAY_LINKED_BY_CONTACT')) {
+ print "\n";
+ print load_fiche_titre($langs->trans("ProjectsLinkedToThisThirdParty"), '', '');
+
+
+ print '
'."\n";
+ print '
';
+
+ $sql = "SELECT p.rowid as id, p.entity, p.title, p.ref, p.public, p.dateo as do, p.datee as de, p.fk_statut as status, p.fk_opp_status, p.opp_amount, p.opp_percent, p.tms as date_update, p.budget_amount";
+ $sql .= ", cls.code as opp_status_code";
+ $sql .= " FROM ".MAIN_DB_PREFIX."projet as p";
+ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_lead_status as cls on p.fk_opp_status = cls.rowid";
+ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."element_contact as ec on p.rowid = ec.element_id";
+ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople as sc on ec.fk_socpeople = sc.rowid";
+ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_type_contact as tc on ec.fk_c_type_contact = tc.rowid";
+ $sql .= " WHERE sc.fk_soc = ".((int) $object->id);
+ $sql .= " AND p.entity IN (".getEntity('project').")";
+ $sql .= " AND tc.element = 'project'";
+ $sql .= " ORDER BY p.dateo DESC";
+
+ $result = $db->query($sql);
+ if ($result) {
+ $num = $db->num_rows($result);
+
+ print '
';
+ print '
'.$langs->trans("Ref").'
';
+ print '
'.$langs->trans("Name").'
';
+ print '
'.$langs->trans("DateStart").'
';
+ print '
'.$langs->trans("DateEnd").'
';
+ print '
'.$langs->trans("OpportunityAmountShort").'
';
+ print '
'.$langs->trans("OpportunityStatusShort").'
';
+ print '
'.$langs->trans("OpportunityProbabilityShort").'
';
+ print '
'.$langs->trans("Status").'
';
+ print '
';
+
+ if ($num > 0) {
+ require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
+
+ $projecttmp = new Project($db);
+
+ $i = 0;
+
+ while ($i < $num) {
+ $obj = $db->fetch_object($result);
+ $projecttmp->fetch($obj->id);
+
+ // To verify role of users
+ $userAccess = $projecttmp->restrictedProjectArea($user);
+
+ if ($user->rights->projet->lire && $userAccess > 0) {
+ print '
';
+ }
+ $db->free($result);
+ } else {
+ dol_print_error($db);
+ }
+ }
+
$parameters = array('sql' => $sql, 'function' => 'show_projects');
$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
print $hookmanager->resPrint;
diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang
index 576180c63718d..f20f46f5c035d 100644
--- a/htdocs/langs/en_US/admin.lang
+++ b/htdocs/langs/en_US/admin.lang
@@ -88,6 +88,8 @@ SearchString=Search string
NotAvailableWhenAjaxDisabled=Not available when Ajax disabled
AllowToSelectProjectFromOtherCompany=On document of a third party, can choose a project linked to another third party
TimesheetPreventAfterFollowingMonths=Prevent recording time spent after the following number of months
+PROJECT_DISPLAY_LINKED_BY_CONTACT=Display project linked by a common contact
+PROJECT_DISPLAY_LINKED_BY_CONTACT_help=That option add a new list on Project tab with all projects linked to that thirdparty via a contact relationship
JavascriptDisabled=JavaScript disabled
UsePreviewTabs=Use preview tabs
ShowPreview=Show preview
diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang
index f0d303285d492..3b0ec6edb3d37 100644
--- a/htdocs/langs/en_US/projects.lang
+++ b/htdocs/langs/en_US/projects.lang
@@ -142,6 +142,7 @@ DoNotShowMyTasksOnly=See also tasks not assigned to me
ShowMyTasksOnly=View only tasks assigned to me
TaskRessourceLinks=Contacts of task
ProjectsDedicatedToThisThirdParty=Projects dedicated to this third party
+ProjectsLinkedToThisThirdParty=Projects having a contact that is a contact of the third party
NoTasks=No tasks for this project
LinkedToAnotherCompany=Linked to other third party
TaskIsNotAssignedToUser=Task not assigned to user. Use button '%s' to assign task now.
diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang
index 2857c585ba4ef..3750b9bab8a9c 100644
--- a/htdocs/langs/fr_FR/admin.lang
+++ b/htdocs/langs/fr_FR/admin.lang
@@ -88,6 +88,8 @@ SearchString=Chaîne de recherche
NotAvailableWhenAjaxDisabled=Non disponible quand Ajax est désactivé
AllowToSelectProjectFromOtherCompany=Sur les éléments d'un tiers, autorise la sélection d'un projet lié à un autre tiers
TimesheetPreventAfterFollowingMonths=Empêcher l'enregistrement du temps consacré après le nombre de mois suivant
+PROJECT_DISPLAY_LINKED_BY_CONTACT=Afficher les projets liés par un contact
+PROJECT_DISPLAY_LINKED_BY_CONTACT_help=Cette option permet d'ajouter la liste de tous les projets dans lesquels un des contact du tiers est rattaché
JavascriptDisabled=Javascript désactivé
UsePreviewTabs=Afficher les onglets "Aperçu"
ShowPreview=Afficher aperçu
diff --git a/htdocs/langs/fr_FR/projects.lang b/htdocs/langs/fr_FR/projects.lang
index 962372b874bbb..d5d1f2ce01c64 100644
--- a/htdocs/langs/fr_FR/projects.lang
+++ b/htdocs/langs/fr_FR/projects.lang
@@ -142,6 +142,7 @@ DoNotShowMyTasksOnly=Voir aussi les tâches qui ne me sont pas affectées
ShowMyTasksOnly=Ne voir que les tâches qui me sont affectées
TaskRessourceLinks=Contacts de la tâche
ProjectsDedicatedToThisThirdParty=Projets dédiés à ce tiers
+ProjectsLinkedToThisThirdParty=Projets liés à ce tiers par un contact commun
NoTasks=Aucune tâche pour ce projet
LinkedToAnotherCompany=Liés à autre société
TaskIsNotAssignedToUser=Tâche non assignée à l'utilisateur. Utilisez le bouton '%s' pour assigner la tâche maintenant.
diff --git a/htdocs/projet/admin/project.php b/htdocs/projet/admin/project.php
index 184f8ac6104b4..9dc673aa745f6 100644
--- a/htdocs/projet/admin/project.php
+++ b/htdocs/projet/admin/project.php
@@ -841,6 +841,18 @@
print '';
print '';
print '';
+
+$key = 'PROJECT_DISPLAY_LINKED_BY_CONTACT';
+echo '