diff --git a/htdocs/core/commonobject.class.php b/htdocs/core/commonobject.class.php index 5236ce1191f8a024a0be0cf8ac05357ab049412d..1f8ecf5bf00ec2e781de69fe1e6991ce387124b7 100644 --- a/htdocs/core/commonobject.class.php +++ b/htdocs/core/commonobject.class.php @@ -162,10 +162,10 @@ class CommonObject } /** - * \brief Recupere les lignes de contact de l'objet - * \param statut Statut des lignes detail a recuperer - * \param source Source du contact external (llx_socpeople) ou internal (llx_user) - * \return array Tableau des rowid des contacts + * \brief Get array of all contacts for an object + * \param statut Status of lines to get (-1=all) + * \param source Source of contact: external or thirdparty (llx_socpeople) or internal (llx_user) + * \return array Array of id of contacts */ function liste_contact($statut=-1,$source='external') { @@ -175,18 +175,18 @@ class CommonObject $sql = "SELECT ec.rowid, ec.statut, ec.fk_socpeople as id"; if ($source == 'internal') $sql.=", '-1' as socid"; - if ($source == 'external') $sql.=", t.fk_soc as socid"; + if ($source == 'external' || $source == 'thirdparty') $sql.=", t.fk_soc as socid"; $sql.= ", t.name as nom, t.firstname"; $sql.= ", tc.source, tc.element, tc.code, tc.libelle"; $sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact tc"; $sql.= ", ".MAIN_DB_PREFIX."element_contact ec"; if ($source == 'internal') $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."user t on ec.fk_socpeople = t.rowid"; - if ($source == 'external') $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."socpeople t on ec.fk_socpeople = t.rowid"; + if ($source == 'external'|| $source == 'thirdparty') $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."socpeople t on ec.fk_socpeople = t.rowid"; $sql.= " WHERE ec.element_id =".$this->id; $sql.= " AND ec.fk_c_type_contact=tc.rowid"; $sql.= " AND tc.element='".$this->element."'"; if ($source == 'internal') $sql.= " AND tc.source = 'internal'"; - if ($source == 'external') $sql.= " AND tc.source = 'external'"; + if ($source == 'external' || $source == 'thirdparty') $sql.= " AND tc.source = 'external'"; $sql.= " AND tc.active=1"; if ($statut >= 0) $sql.= " AND ec.statut = '".$statut."'"; $sql.=" ORDER BY t.name ASC"; @@ -413,7 +413,7 @@ class CommonObject function fetch_object() { $object = $this->origin; - + // TODO uniformise code if ($object == 'shipping') $object = 'expedition'; if ($object == 'delivery') $object = 'livraison'; @@ -492,9 +492,10 @@ class CommonObject /** - * \brief On recupere les id de liste_contact - * \param source Source du contact external (llx_socpeople) ou internal (llx_user) - * \return array + * \brief Return list of id of contacts of project + * \param source Source of contact: external (llx_socpeople) or internal (llx_user) or thirdparty (llx_societe) + * \return array Array of id of contacts (if source=external or internal) + * Array of id of third parties with at least one contact on project (if source=thirdparty) */ function getListContactId($source='external') { @@ -504,7 +505,8 @@ class CommonObject $i = 0; while ($i < $num) { - $contactAlreadySelected[$i] = $tab[$i]['id']; + if ($source == 'thirdparty') $contactAlreadySelected[$i] = $tab[$i]['socid']; + else $contactAlreadySelected[$i] = $tab[$i]['id']; $i++; } return $contactAlreadySelected; @@ -964,22 +966,22 @@ class CommonObject return 1; } - + /** * \brief Fetch field list */ function getFieldList() { global $conf, $langs; - + $this->field_list = array(); - + $sql = "SELECT rowid, name, alias, title, align, sort, search, enabled, rang"; $sql.= " FROM ".MAIN_DB_PREFIX."c_field_list"; $sql.= " WHERE element = '".$this->fieldListName."'"; $sql.= " AND entity = ".$conf->entity; $sql.= " ORDER BY rang ASC"; - + $resql = $this->db->query($sql); if ($resql) { @@ -989,9 +991,9 @@ class CommonObject while ($i < $num) { $fieldlist = array(); - + $obj = $this->db->fetch_object($resql); - + $fieldlist["id"] = $obj->rowid; $fieldlist["name"] = $obj->name; $fieldlist["alias"] = $obj->alias; @@ -1001,9 +1003,9 @@ class CommonObject $fieldlist["search"] = $obj->search; $fieldlist["enabled"] = verifCond($obj->enabled); $fieldlist["order"] = $obj->rang; - + array_push($this->field_list,$fieldlist); - + $i++; } $this->db->free($resql); @@ -1013,14 +1015,14 @@ class CommonObject print $sql; } } - + /** - * + * */ function showLinkedObjectBlock($object,$objectid,$somethingshown=0) { global $langs,$bc; - + $num = sizeof($objectid); if ($num) { @@ -1030,7 +1032,7 @@ class CommonObject if ($object == 'facture') $tplpath = $classpath = 'compta/'.$object; if ($object == 'propal') $tplpath = $classpath = 'comm/'.$object; if ($object == 'commande') $tplpath = $classpath = $object; - + $classname = ucfirst($object); if(!class_exists($classname)) require(DOL_DOCUMENT_ROOT."/".$classpath."/".$object.".class.php"); $linkedObjectBlock = new $classname($this->db); diff --git a/htdocs/html.form.class.php b/htdocs/html.form.class.php index d75162526cb3690bca4a7930cf9577bb0c3d7217..61d6ccf789ba11361772b16c9fd4971e20be49b6 100644 --- a/htdocs/html.form.class.php +++ b/htdocs/html.form.class.php @@ -708,9 +708,10 @@ class Form * \param htmlname Nom champ formulaire ('none' pour champ non editable) * \param show_empty 0=liste sans valeur nulle, 1=ajoute valeur inconnue * \param exclude Liste des id contacts a exclure + * \param limitto Disable answers that are not id in this array list * \return int <0 if KO, Nb of contact in list if OK */ - function select_contacts($socid,$selected='',$htmlname='contactid',$showempty=0,$exclude='') + function select_contacts($socid,$selected='',$htmlname='contactid',$showempty=0,$exclude='',$limitto='') { // Permettre l'exclusion de contacts if (is_array($exclude)) @@ -743,13 +744,19 @@ class Form $obj = $this->db->fetch_object($resql); if ($htmlname != 'none') { + $disabled=0; + if (is_array($limitto) && sizeof($limitto) && ! in_array($obj->rowid,$limitto)) $disabled=1; if ($selected && $selected == $obj->rowid) { - print '<option value="'.$obj->rowid.'" selected="true">'.$obj->name.' '.$obj->firstname.'</option>'; + print '<option value="'.$obj->rowid.'"'; + if ($disabled) print ' disabled="true"'; + print ' selected="true">'.$obj->name.' '.$obj->firstname.'</option>'; } else { - print '<option value="'.$obj->rowid.'">'.$obj->name.' '.$obj->firstname.'</option>'; + print '<option value="'.$obj->rowid.'"'; + if ($disabled) print ' disabled="true"'; + print '>'.$obj->name.' '.$obj->firstname.'</option>'; } } else @@ -778,11 +785,12 @@ class Form * \param selected Id user preselected * \param htmlname Field name in form * \param show_empty 0=liste sans valeur nulle, 1=ajoute valeur inconnue - * \param exclude List of users id to exclude + * \param exclude Array list of users id to exclude * \param disabled If select list must be disabled - * \param include List of users id to include + * \param include Array list of users id to include + * \param enableonly Array list of users id to be enabled. All other must be disabled */ - function select_users($selected='',$htmlname='userid',$show_empty=0,$exclude='',$disabled=0,$include='') + function select_users($selected='',$htmlname='userid',$show_empty=0,$exclude='',$disabled=0,$include='',$enableonly='') { global $conf; @@ -812,14 +820,20 @@ class Form while ($i < $num) { $obj = $this->db->fetch_object($resql); + $disableline=0; + if (is_array($enableonly) && sizeof($enableonly) && ! in_array($obj->rowid,$enableonly)) $disableline=1; if ((is_object($selected) && $selected->id == $obj->rowid) || (! is_object($selected) && $selected == $obj->rowid)) { - print '<option value="'.$obj->rowid.'" selected="true">'; + print '<option value="'.$obj->rowid.'"'; + if ($disableline) print ' disabled="true"'; + print ' selected="true">'; } else { - print '<option value="'.$obj->rowid.'">'; + print '<option value="'.$obj->rowid.'"'; + if ($disableline) print ' disabled="true"'; + print '>'; } print $obj->name.($obj->name && $obj->firstname?' ':'').$obj->firstname; if ($conf->global->MAIN_SHOW_LOGIN) print ' ('.$obj->login.')'; diff --git a/htdocs/html.formcompany.class.php b/htdocs/html.formcompany.class.php index 543fb94dcb04a6ab145881db3aad4653dbe2d242..267ffb3302b300c6c80008bfabfe37843e98a88a 100644 --- a/htdocs/html.formcompany.class.php +++ b/htdocs/html.formcompany.class.php @@ -444,22 +444,33 @@ class FormCompany /** - * \brief Return list of third parties - * \param object Object we try to find contacts - * \param var_id Name of id field - * \param selected Pre-selected third party - * \param htmlname Name of HTML form + * \brief Return list of third parties + * \param object Object we try to find contacts + * \param var_id Name of id field + * \param selected Pre-selected third party + * \param htmlname Name of HTML form + * \param limitto Disable answers that are not id in this array list */ - function selectCompaniesForNewContact($object, $var_id, $selected = '', $htmlname = 'newcompany') + function selectCompaniesForNewContact($object, $var_id, $selected='', $htmlname='newcompany', $limitto='') { global $conf, $langs; // On recherche les societes $sql = "SELECT s.rowid, s.nom FROM"; - $sql .= " ".MAIN_DB_PREFIX."societe as s"; + $sql.= " ".MAIN_DB_PREFIX."societe as s"; if ($selected && $conf->use_javascript_ajax && $conf->global->COMPANY_USE_SEARCH_TO_SELECT) $sql.= " WHERE rowid = ".$selected; + else + { + // For ajax search we limit here. For combo list, we limit later + if ($conf->use_javascript_ajax && $conf->global->COMPANY_USE_SEARCH_TO_SELECT + && is_array($limitto) && sizeof($limitto)) + { + $sql.= " WHERE rowid in (".join(',',$limitto).")"; + } + } $sql .= " ORDER BY nom ASC"; + //print $sql; $resql = $object->db->query($sql); if ($resql) { @@ -510,14 +521,20 @@ class FormCompany { $obj = $object->db->fetch_object($resql); if ($i == 0) $firstCompany = $obj->rowid; + $disabled=0; + if (is_array($limitto) && sizeof($limitto) && ! in_array($obj->rowid,$limitto)) $disabled=1; if ($selected > 0 && $selected == $obj->rowid) { - print '<option value="'.$obj->rowid.'" selected="true">'.dol_trunc($obj->nom,24).'</option>'; + print '<option value="'.$obj->rowid.'"'; + if ($disabled) print ' disabled="true"'; + print ' selected="true">'.dol_trunc($obj->nom,24).'</option>'; $firstCompany = $obj->rowid; } else { - print '<option value="'.$obj->rowid.'">'.dol_trunc($obj->nom,24).'</option>'; + print '<option value="'.$obj->rowid.'"'; + if ($disabled) print ' disabled="true"'; + print '>'.dol_trunc($obj->nom,24).'</option>'; } $i ++; } diff --git a/htdocs/projet/project.class.php b/htdocs/projet/project.class.php index b7d1837066e21764fb3be8e7a0ee55bdd42e5d2b..b293cb3eb0c80bdbb907f420d546b8b1e36e8afd 100644 --- a/htdocs/projet/project.class.php +++ b/htdocs/projet/project.class.php @@ -144,6 +144,8 @@ class Project extends CommonObject */ function update($user, $notrigger=0) { + global $langs,$conf; + // Clean parameters $this->title = trim($this->title); $this->description = trim($this->description); diff --git a/htdocs/projet/tasks/contact.php b/htdocs/projet/tasks/contact.php index 0525ab48b9787c9ae353f3703259ccbc354a6779..aa40c3bc6017050f7d5c7c689ff2fa0986e4f2af 100644 --- a/htdocs/projet/tasks/contact.php +++ b/htdocs/projet/tasks/contact.php @@ -158,7 +158,7 @@ llxHeader('', $langs->trans("Task")); $html = new Form($db); $formcompany = new FormCompany($db); $contactstatic = new Contact($db); -$projectstatic = new Project($db); +$project = new Project($db); /* *************************************************************************** */ @@ -176,11 +176,11 @@ if ($id > 0 || ! empty($ref)) if ( $task->fetch($id,$ref) > 0) { - $result=$projectstatic->fetch($task->fk_project); - if (! empty($projectstatic->socid)) $projectstatic->societe->fetch($projectstatic->socid); - + $result=$project->fetch($task->fk_project); + if (! empty($project->socid)) $project->societe->fetch($project->socid); + // To verify role of users - $userAccess = $projectstatic->restrictedProjectArea($user); + $userAccess = $project->restrictedProjectArea($user); $head = task_prepare_head($task); dol_fiche_head($head, 'contact', $langs->trans("Task"), 0, 'projecttask'); @@ -203,13 +203,13 @@ if ($id > 0 || ! empty($ref)) // Project print '<tr><td>'.$langs->trans("Project").'</td><td>'; - print $projectstatic->getNomUrl(1); + print $project->getNomUrl(1); print '</td></tr>'; // Customer print "<tr><td>".$langs->trans("Company")."</td>"; print '<td colspan="3">'; - if ($projectstatic->societe->id > 0) print $projectstatic->societe->getNomUrl(1); + if ($project->societe->id > 0) print $project->societe->getNomUrl(1); else print ' '; print '</td></tr>'; @@ -231,7 +231,7 @@ if ($id > 0 || ! empty($ref)) print '<tr class="liste_titre">'; print '<td>'.$langs->trans("Source").'</td>'; print '<td>'.$langs->trans("Company").'</td>'; - print '<td>'.$langs->trans("Contacts").'</td>'; + print '<td>'.$langs->trans("ProjectContact").'</td>'; print '<td>'.$langs->trans("ContactType").'</td>'; print '<td colspan="3"> </td>'; print "</tr>\n"; @@ -257,7 +257,8 @@ if ($id > 0 || ! empty($ref)) print '<td colspan="1">'; // On recupere les id des users deja selectionnes - $html->select_users($user->id,'contactid',0); + $contactsofproject=$project->getListContactId('internal'); + $html->select_users($user->id,'contactid',0,'',0,'',$contactsofproject); print '</td>'; print '<td>'; $formcompany->selectTypeContact($task, '', 'type','internal','rowid'); @@ -274,7 +275,7 @@ if ($id > 0 || ! empty($ref)) print '<input type="hidden" name="id" value="'.$id.'">'; // Line to add an external contact. Only if project linked to a third party. - if ($projectstatic->socid) + if ($project->socid) { $var=!$var; print "<tr $bc[$var]>"; @@ -284,12 +285,14 @@ if ($id > 0 || ! empty($ref)) print '</td>'; print '<td colspan="1">'; + $thirdpartyofproject=$project->getListContactId('thirdparty'); $selectedCompany = isset($_GET["newcompany"])?$_GET["newcompany"]:$projectstatic->societe->id; - $selectedCompany = $formcompany->selectCompaniesForNewContact($task, 'id', $selectedCompany, 'newcompany'); + $selectedCompany = $formcompany->selectCompaniesForNewContact($task, 'id', $selectedCompany, 'newcompany',$thirdpartyofproject); print '</td>'; print '<td colspan="1">'; - $nbofcontacts=$html->select_contacts($selectedCompany,'','contactid',0); + $contactofproject=$project->getListContactId('external'); + $nbofcontacts=$html->select_contacts($selectedCompany,'','contactid',0,'',$contactofproject); if ($nbofcontacts == 0) print $langs->trans("NoContactDefined"); print '</td>'; print '<td>'; @@ -310,7 +313,7 @@ if ($id > 0 || ! empty($ref)) print '<tr class="liste_titre">'; print '<td>'.$langs->trans("Source").'</td>'; print '<td>'.$langs->trans("Company").'</td>'; - print '<td>'.$langs->trans("Contacts").'</td>'; + print '<td>'.$langs->trans("ProjectContact").'</td>'; print '<td>'.$langs->trans("ContactType").'</td>'; print '<td align="center">'.$langs->trans("Status").'</td>'; print '<td colspan="2"> </td>'; diff --git a/htdocs/projet/tasks/document.php b/htdocs/projet/tasks/document.php index ae35bc06a72c1bb01874f1a71c4b832c27165cac..e51530b7ef00facf9ddbd7ecafd85b536f65407c 100644 --- a/htdocs/projet/tasks/document.php +++ b/htdocs/projet/tasks/document.php @@ -66,9 +66,9 @@ if ($task->fetch($id,$ref) > 0) { $projectstatic = new Project($db); $projectstatic->fetch($task->fk_project); - + if (! empty($projectstatic->socid)) $projectstatic->societe->fetch($projectstatic->socid); - + $upload_dir = $conf->projet->dir_output.'/'.dol_sanitizeFileName($projectstatic->ref).'/'.dol_sanitizeFileName($task->ref); } else @@ -122,12 +122,12 @@ if ($action=='delete') * View */ -llxHeader('',$langs->trans('Project'),'EN:Customers_Orders|FR:Commandes_Clients|ES:Pedidos de clientes'); +llxHeader('',$langs->trans('Project')); $form = new Form($db); if ($id > 0 || ! empty($ref)) -{ +{ // To verify role of users $userAccess = $projectstatic->restrictedProjectArea($user); @@ -143,7 +143,7 @@ if ($id > 0 || ! empty($ref)) } print '<table class="border" width="100%">'; - + // Ref print '<tr><td width="30%">'; print $langs->trans("Ref"); @@ -165,11 +165,11 @@ if ($id > 0 || ! empty($ref)) if ($projectstatic->societe->id) print $projectstatic->societe->getNomUrl(1); else print ' '; print '</td></tr>'; - + // Files infos print '<tr><td>'.$langs->trans("NbOfAttachedFiles").'</td><td colspan="3">'.sizeof($filearray).'</td></tr>'; print '<tr><td>'.$langs->trans("TotalSizeOfAttachedFiles").'</td><td colspan="3">'.$totalsize.' '.$langs->trans("bytes").'</td></tr>'; - + print "</table>\n"; print "</div>\n"; diff --git a/htdocs/projet/tasks/task.class.php b/htdocs/projet/tasks/task.class.php index c184c1a21b6cda3c001aefd8a961a955c4dca74a..92a1bdb94d42a82f6311657ab1bec3b518b3ce4d 100644 --- a/htdocs/projet/tasks/task.class.php +++ b/htdocs/projet/tasks/task.class.php @@ -592,6 +592,27 @@ class Task extends CommonObject return $projectsrole; } + + /** + * \brief Return list of id of contacts of task + * \return array Array of id of contacts + */ + function getListContactId() + { + $contactAlreadySelected = array(); + $tab = $this->liste_contact(-1,'internal'); + $num=sizeof($tab); + $i = 0; + while ($i < $num) + { + if ($source == 'thirdparty') $contactAlreadySelected[$i] = $tab[$i]['socid']; + else $contactAlreadySelected[$i] = $tab[$i]['id']; + $i++; + } + return $contactAlreadySelected; + } + + /** * \brief Add time spent * \param user user id diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index 437e116e8490264f14f47b3a9edac0941192bec1..df05e56fea973a07af951ccaf53d6f76c27ebd7c 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -226,8 +226,8 @@ if ($_GET["id"] > 0) // Contributor print '<td nowrap="nowrap">'; - // TODO We should use here a combo list with contacts affected to task only - print $html->select_users($_POST["userid"]?$_POST["userid"]:$user->id,'userid'); + $contactoftask=$task->getListContactId('thirdparty'); + print $html->select_users($_POST["userid"]?$_POST["userid"]:$user->id,'userid',0,'',0,'',$contactoftask); print '</td>'; // Note