card.php 91 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674
  1. <?php
  2. /* Copyright (C) 2002-2006 Rodolphe Quiedeville <rodolphe@quiedeville.org>
  3. * Copyright (C) 2002-2003 Jean-Louis Bergamo <jlb@j1b.org>
  4. * Copyright (C) 2004-2015 Laurent Destailleur <eldy@users.sourceforge.net>
  5. * Copyright (C) 2004 Eric Seigne <eric.seigne@ryxeo.com>
  6. * Copyright (C) 2005-2018 Regis Houssin <regis.houssin@inodbox.com>
  7. * Copyright (C) 2005 Lionel Cousteix <etm_ltd@tiscali.co.uk>
  8. * Copyright (C) 2011 Herve Prot <herve.prot@symeos.com>
  9. * Copyright (C) 2012-2018 Juanjo Menent <jmenent@2byte.es>
  10. * Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro>
  11. * Copyright (C) 2013-2016 Alexandre Spangaro <aspangaro.dolibarr@gmail.com>
  12. * Copyright (C) 2015-2017 Jean-François Ferry <jfefe@aternatik.fr>
  13. * Copyright (C) 2015 Ari Elbaz (elarifr) <github@accedinfo.com>
  14. * Copyright (C) 2015-2018 Charlene Benke <charlie@patas-monkey.com>
  15. * Copyright (C) 2016 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
  16. * Copyright (C) 2018 Frédéric France <frederic.france@netlogic.fr>
  17. * Copyright (C) 2018 David Beniamine <David.Beniamine@Tetras-Libre.fr>
  18. *
  19. * This program is free software; you can redistribute it and/or modify
  20. * it under the terms of the GNU General Public License as published by
  21. * the Free Software Foundation; either version 3 of the License, or
  22. * (at your option) any later version.
  23. *
  24. * This program is distributed in the hope that it will be useful,
  25. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  26. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  27. * GNU General Public License for more details.
  28. *
  29. * You should have received a copy of the GNU General Public License
  30. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  31. */
  32. /**
  33. * \file htdocs/user/card.php
  34. * \brief Tab of user card
  35. */
  36. require '../main.inc.php';
  37. require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
  38. require_once DOL_DOCUMENT_ROOT.'/user/class/usergroup.class.php';
  39. require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
  40. require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
  41. require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
  42. require_once DOL_DOCUMENT_ROOT.'/core/lib/usergroups.lib.php';
  43. require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
  44. require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
  45. require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
  46. if (! empty($conf->ldap->enabled)) require_once DOL_DOCUMENT_ROOT.'/core/class/ldap.class.php';
  47. if (! empty($conf->adherent->enabled)) require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
  48. if (! empty($conf->categorie->enabled)) require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
  49. $id = GETPOST('id','int');
  50. $action = GETPOST('action','aZ09');
  51. $mode = GETPOST('mode','alpha');
  52. $confirm = GETPOST('confirm','alpha');
  53. $subaction = GETPOST('subaction','alpha');
  54. $group = GETPOST("group","int",3);
  55. $cancel = GETPOST('cancel','alpha');
  56. $contextpage= GETPOST('contextpage','aZ')?GETPOST('contextpage','aZ'):'useracard'; // To manage different context of search
  57. // Define value to know what current user can do on users
  58. $canadduser=(! empty($user->admin) || $user->rights->user->user->creer);
  59. $canreaduser=(! empty($user->admin) || $user->rights->user->user->lire);
  60. $canedituser=(! empty($user->admin) || $user->rights->user->user->creer);
  61. $candisableuser=(! empty($user->admin) || $user->rights->user->user->supprimer);
  62. $canreadgroup=$canreaduser;
  63. $caneditgroup=$canedituser;
  64. if (! empty($conf->global->MAIN_USE_ADVANCED_PERMS))
  65. {
  66. $canreadgroup=(! empty($user->admin) || $user->rights->user->group_advance->read);
  67. $caneditgroup=(! empty($user->admin) || $user->rights->user->group_advance->write);
  68. }
  69. // Define value to know what current user can do on properties of edited user
  70. if ($id)
  71. {
  72. // $user est le user qui edite, $id est l'id de l'utilisateur edite
  73. $caneditfield=((($user->id == $id) && $user->rights->user->self->creer)
  74. || (($user->id != $id) && $user->rights->user->user->creer));
  75. $caneditpassword=((($user->id == $id) && $user->rights->user->self->password)
  76. || (($user->id != $id) && $user->rights->user->user->password));
  77. }
  78. // Security check
  79. $socid=0;
  80. if ($user->societe_id > 0) $socid = $user->societe_id;
  81. $feature2='user';
  82. if ($user->id == $id) { $feature2=''; $canreaduser=1; } // A user can always read its own card
  83. if (! $canreaduser) {
  84. $result = restrictedArea($user, 'user', $id, 'user&user', $feature2);
  85. }
  86. if ($user->id <> $id && ! $canreaduser) accessforbidden();
  87. // Load translation files required by page
  88. $langs->loadLangs(array('users', 'companies', 'ldap', 'admin', 'hrm'));
  89. $object = new User($db);
  90. $extrafields = new ExtraFields($db);
  91. // fetch optionals attributes and labels
  92. $extralabels=$extrafields->fetch_name_optionals_label($object->table_element);
  93. // Initialize technical object to manage hooks. Note that conf->hooks_modules contains array
  94. $hookmanager->initHooks(array('usercard','globalcard'));
  95. /**
  96. * Actions
  97. */
  98. $parameters=array('id' => $id, 'socid' => $socid, 'group' => $group, 'caneditgroup' => $caneditgroup);
  99. $reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks
  100. if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
  101. if (empty($reshook)) {
  102. if ($action == 'confirm_disable' && $confirm == "yes" && $candisableuser) {
  103. if ($id <> $user->id) {
  104. $object->fetch($id);
  105. $object->setstatus(0);
  106. header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id);
  107. exit;
  108. }
  109. }
  110. if ($action == 'confirm_enable' && $confirm == "yes" && $candisableuser) {
  111. $error = 0;
  112. if ($id <> $user->id) {
  113. $object->fetch($id);
  114. if (!empty($conf->file->main_limit_users)) {
  115. $nb = $object->getNbOfUsers("active");
  116. if ($nb >= $conf->file->main_limit_users) {
  117. $error ++;
  118. setEventMessages($langs->trans("YourQuotaOfUsersIsReached"), null, 'errors');
  119. }
  120. }
  121. if (!$error) {
  122. $object->setstatus(1);
  123. header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id);
  124. exit;
  125. }
  126. }
  127. }
  128. if ($action == 'confirm_delete' && $confirm == "yes" && $candisableuser) {
  129. if ($id <> $user->id) {
  130. $object = new User($db);
  131. $object->fetch($id);
  132. $result = $object->delete();
  133. if ($result < 0) {
  134. $langs->load("errors");
  135. setEventMessages($langs->trans("ErrorUserCannotBeDelete"), null, 'errors');
  136. } else {
  137. header("Location: ".DOL_URL_ROOT."/user/list.php?restore_lastsearch_values=1");
  138. exit;
  139. }
  140. }
  141. }
  142. // Action Add user
  143. if ($action == 'add' && $canadduser) {
  144. $error = 0;
  145. if (!$_POST["lastname"]) {
  146. $error ++;
  147. setEventMessages($langs->trans("NameNotDefined"), null, 'errors');
  148. $action = "create"; // Go back to create page
  149. }
  150. if (!$_POST["login"]) {
  151. $error ++;
  152. setEventMessages($langs->trans("LoginNotDefined"), null, 'errors');
  153. $action = "create"; // Go back to create page
  154. }
  155. if (!empty($conf->file->main_limit_users)) { // If option to limit users is set
  156. $nb = $object->getNbOfUsers("active");
  157. if ($nb >= $conf->file->main_limit_users) {
  158. $error ++;
  159. setEventMessages($langs->trans("YourQuotaOfUsersIsReached"), null, 'errors');
  160. $action = "create"; // Go back to create page
  161. }
  162. }
  163. if (!$error) {
  164. $object->lastname = GETPOST("lastname", 'alpha');
  165. $object->firstname = GETPOST("firstname", 'alpha');
  166. $object->login = GETPOST("login", 'alpha');
  167. $object->api_key = GETPOST("api_key", 'alpha');
  168. $object->gender = GETPOST("gender", 'alpha');
  169. $birth = dol_mktime(0, 0, 0, GETPOST('birthmonth'), GETPOST('birthday'), GETPOST('birthyear'));
  170. $object->birth = $birth;
  171. $object->admin = GETPOST("admin", 'alpha');
  172. $object->address = GETPOST('address', 'alphanohtml');
  173. $object->zip = GETPOST('zipcode', 'alphanohtml');
  174. $object->town = GETPOST('town', 'alphanohtml');
  175. $object->country_id = GETPOST('country_id', 'int');
  176. $object->state_id = GETPOST('state_id', 'int');
  177. $object->office_phone = GETPOST("office_phone", 'alphanohtml');
  178. $object->office_fax = GETPOST("office_fax", 'alphanohtml');
  179. $object->user_mobile = GETPOST("user_mobile", 'alphanohtml');
  180. $object->skype = GETPOST("skype", 'alphanohtml');
  181. $object->twitter = GETPOST("twitter", 'alphanohtml');
  182. $object->facebook = GETPOST("facebook", 'alphanohtml');
  183. $object->email = preg_replace('/\s+/', '', GETPOST("email", 'alpha'));
  184. $object->job = GETPOST("job", 'alpha');
  185. $object->signature = GETPOST("signature", 'none');
  186. $object->accountancy_code = GETPOST("accountancy_code", 'alphanohtml');
  187. $object->note = GETPOST("note", 'none');
  188. $object->ldap_sid = GETPOST("ldap_sid", 'alphanohtml');
  189. $object->fk_user = GETPOST("fk_user", 'int') > 0 ? GETPOST("fk_user", 'int') : 0;
  190. $object->employee = GETPOST('employee', 'alphanohtml');
  191. $object->thm = GETPOST("thm", 'alphanohtml') != '' ? GETPOST("thm", 'alphanohtml') : '';
  192. $object->tjm = GETPOST("tjm", 'alphanohtml') != '' ? GETPOST("tjm", 'alphanohtml') : '';
  193. $object->salary = GETPOST("salary", 'alphanohtml') != '' ? GETPOST("salary", 'alphanohtml') : '';
  194. $object->salaryextra = GETPOST("salaryextra", 'alphanohtml') != '' ? GETPOST("salaryextra", 'alphanohtml') : '';
  195. $object->weeklyhours = GETPOST("weeklyhours", 'alphanohtml') != '' ? GETPOST("weeklyhours", 'alphanohtml') : '';
  196. $object->color = GETPOST("color", 'alphanohtml') != '' ? GETPOST("color", 'alphanohtml') : '';
  197. $dateemployment = dol_mktime(0, 0, 0, GETPOST('dateemploymentmonth'), GETPOST('dateemploymentday'), GETPOST('dateemploymentyear'));
  198. $object->dateemployment = $dateemployment;
  199. $dateemploymentend = dol_mktime(0, 0, 0, GETPOST('dateemploymentendmonth'), GETPOST('dateemploymentendday'), GETPOST('dateemploymentendyear'));
  200. $object->dateemploymentend = $dateemploymentend;
  201. // Fill array 'array_options' with data from add form
  202. $ret = $extrafields->setOptionalsFromPost($extralabels, $object);
  203. if ($ret < 0) {
  204. $error ++;
  205. }
  206. // Set entity property
  207. $entity = GETPOST('entity', 'int');
  208. if (! empty($conf->multicompany->enabled)) {
  209. if (GETPOST('superadmin', 'int')) {
  210. $object->entity = 0;
  211. } else {
  212. if (! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
  213. $object->entity = 1; // all users are forced into master entity
  214. } else {
  215. $object->entity = ($entity == '' ? 1 : $entity);
  216. }
  217. }
  218. } else {
  219. $object->entity = ($entity == '' ? 1 : $entity);
  220. /*if ($user->admin && $user->entity == 0 && GETPOST("admin",'alpha'))
  221. {
  222. }*/
  223. }
  224. $db->begin();
  225. $id = $object->create($user);
  226. if ($id > 0) {
  227. if (GETPOST('password')) {
  228. $object->setPassword($user, GETPOST('password'));
  229. }
  230. if (! empty($conf->categorie->enabled)) {
  231. // Categories association
  232. $usercats = GETPOST('usercats', 'array');
  233. $object->setCategories($usercats);
  234. }
  235. $db->commit();
  236. header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id);
  237. exit;
  238. }
  239. else
  240. {
  241. $langs->load("errors");
  242. $db->rollback();
  243. setEventMessages($object->error, $object->errors, 'errors');
  244. $action = "create"; // Go back to create page
  245. }
  246. }
  247. }
  248. // Action add usergroup
  249. if (($action == 'addgroup' || $action == 'removegroup') && $caneditgroup)
  250. {
  251. if ($group)
  252. {
  253. $editgroup = new UserGroup($db);
  254. $editgroup->fetch($group);
  255. $editgroup->oldcopy=clone $editgroup;
  256. $object->fetch($id);
  257. if ($action == 'addgroup') {
  258. $result = $object->SetInGroup($group, $editgroup->entity);
  259. }
  260. if ($action == 'removegroup') {
  261. $result = $object->RemoveFromGroup($group, $editgroup->entity);
  262. }
  263. if ($result > 0) {
  264. header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id);
  265. exit;
  266. }
  267. else
  268. {
  269. setEventMessages($object->error, $object->errors, 'errors');
  270. }
  271. }
  272. }
  273. if ($action == 'update' && ! $cancel)
  274. {
  275. require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
  276. if ($caneditfield) // Case we can edit all field
  277. {
  278. $error = 0;
  279. if (!$_POST["lastname"]) {
  280. setEventMessages($langs->trans("NameNotDefined"), null, 'errors');
  281. $action = "edit"; // Go back to create page
  282. $error ++;
  283. }
  284. if (!$_POST["login"]) {
  285. setEventMessages($langs->trans("LoginNotDefined"), null, 'errors');
  286. $action = "edit"; // Go back to create page
  287. $error ++;
  288. }
  289. if (!$error)
  290. {
  291. $object->fetch($id);
  292. $object->oldcopy = clone $object;
  293. $db->begin();
  294. $object->lastname = GETPOST("lastname", 'alpha');
  295. $object->firstname = GETPOST("firstname", 'alpha');
  296. $object->login = GETPOST("login", 'alpha');
  297. $object->gender = GETPOST("gender", 'alpha');
  298. $birth = dol_mktime(0, 0, 0, GETPOST('birthmonth'), GETPOST('birthday'), GETPOST('birthyear'));
  299. $object->birth = $birth;
  300. $object->pass = GETPOST("password",'none');
  301. $object->api_key = (GETPOST("api_key", 'alpha')) ? GETPOST("api_key", 'alpha') : $object->api_key;
  302. if (! empty($user->admin)) $object->admin = GETPOST("admin"); // admin flag can only be set/unset by an admin user. A test is also done later when forging sql request
  303. $object->address = GETPOST('address', 'alphanohtml');
  304. $object->zip = GETPOST('zipcode', 'alphanohtml');
  305. $object->town = GETPOST('town', 'alphanohtml');
  306. $object->country_id = GETPOST('country_id', 'int');
  307. $object->state_id = GETPOST('state_id', 'int');
  308. $object->office_phone = GETPOST("office_phone", 'alphanohtml');
  309. $object->office_fax = GETPOST("office_fax", 'alphanohtml');
  310. $object->user_mobile = GETPOST("user_mobile", 'alphanohtml');
  311. $object->skype = GETPOST("skype", 'alpha');
  312. $object->twitter = GETPOST("twitter", 'alpha');
  313. $object->facebook = GETPOST("facebook", 'alpha');
  314. $object->email = preg_replace('/\s+/', '', GETPOST("email", 'alpha'));
  315. $object->job = GETPOST("job", 'alpha');
  316. $object->signature = GETPOST("signature",'none');
  317. $object->accountancy_code = GETPOST("accountancy_code",'alpha');
  318. $object->openid = GETPOST("openid",'alpha');
  319. $object->fk_user = GETPOST("fk_user",'int') > 0 ? GETPOST("fk_user",'int') : 0;
  320. $object->employee = GETPOST('employee','int');
  321. $object->thm = GETPOST("thm",'alphanohtml') != '' ? GETPOST("thm",'alphanohtml') : '';
  322. $object->tjm = GETPOST("tjm",'alphanohtml') != '' ? GETPOST("tjm",'alphanohtml') : '';
  323. $object->salary = GETPOST("salary",'alphanohtml') != '' ? GETPOST("salary",'alphanohtml') : '';
  324. $object->salaryextra = GETPOST("salaryextra",'alphanohtml') != '' ? GETPOST("salaryextra",'alphanohtml') : '';
  325. $object->weeklyhours = GETPOST("weeklyhours",'alphanohtml') != '' ? GETPOST("weeklyhours",'alphanohtml') : '';
  326. $object->color = GETPOST("color",'alpha') != '' ? GETPOST("color",'alpha') : '';
  327. $dateemployment = dol_mktime(0, 0, 0, GETPOST('dateemploymentmonth','int'), GETPOST('dateemploymentday','int'), GETPOST('dateemploymentyear','int'));
  328. $object->dateemployment = $dateemployment;
  329. $dateemploymentend = dol_mktime(0, 0, 0, GETPOST('dateemploymentendmonth','int'), GETPOST('dateemploymentendday','int'), GETPOST('dateemploymentendyear','int'));
  330. $object->dateemploymentend = $dateemploymentend;
  331. if (! empty($conf->multicompany->enabled))
  332. {
  333. if (! empty($_POST["superadmin"]))
  334. {
  335. $object->entity = 0;
  336. }
  337. else if (! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE))
  338. {
  339. $object->entity = 1; // all users in master entity
  340. }
  341. else
  342. {
  343. $object->entity = (! GETPOST('entity', 'int') ? 0 : GETPOST('entity', 'int'));
  344. }
  345. }
  346. else
  347. {
  348. $object->entity = (! GETPOST('entity', 'int') ? 0 : GETPOST('entity', 'int'));
  349. }
  350. // Fill array 'array_options' with data from add form
  351. $ret = $extrafields->setOptionalsFromPost($extralabels, $object);
  352. if ($ret < 0) {
  353. $error ++;
  354. }
  355. if (GETPOST('deletephoto')) {
  356. $object->photo = '';
  357. }
  358. if (!empty($_FILES['photo']['name'])) {
  359. $object->photo = dol_sanitizeFileName($_FILES['photo']['name']);
  360. }
  361. if (!$error) {
  362. $ret = $object->update($user);
  363. if ($ret < 0) {
  364. $error++;
  365. if ($db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') {
  366. $langs->load("errors");
  367. setEventMessages($langs->trans("ErrorLoginAlreadyExists", $object->login), null, 'errors');
  368. }
  369. else
  370. {
  371. setEventMessages($object->error, $object->errors, 'errors');
  372. }
  373. }
  374. }
  375. if (!$error && GETPOSTISSET('contactid')) {
  376. $contactid = GETPOST('contactid', 'int');
  377. if ($contactid > 0) {
  378. $contact = new Contact($db);
  379. $contact->fetch($contactid);
  380. $sql = "UPDATE ".MAIN_DB_PREFIX."user";
  381. $sql .= " SET fk_socpeople=".$db->escape($contactid);
  382. if (!empty($contact->socid)) {
  383. $sql .= ", fk_soc=".$db->escape($contact->socid);
  384. }
  385. $sql .= " WHERE rowid=".$object->id;
  386. } else {
  387. $sql = "UPDATE ".MAIN_DB_PREFIX."user";
  388. $sql .= " SET fk_socpeople=NULL, fk_soc=NULL";
  389. $sql .= " WHERE rowid=".$object->id;
  390. }
  391. dol_syslog("usercard::update", LOG_DEBUG);
  392. $resql = $db->query($sql);
  393. if (!$resql) {
  394. $error ++;
  395. setEventMessages($db->lasterror(), null, 'errors');
  396. }
  397. }
  398. if (!$error && !count($object->errors)) {
  399. if (GETPOST('deletephoto') && $object->photo) {
  400. $fileimg = $conf->user->dir_output.'/'.get_exdir(0, 0, 0, 0, $object, 'user').'/'.$object->id.'/logos/'.$object->photo;
  401. $dirthumbs = $conf->user->dir_output.'/'.get_exdir(0, 0, 0, 0, $object, 'user').'/'.$object->id.'/logos/thumbs';
  402. dol_delete_file($fileimg);
  403. dol_delete_dir_recursive($dirthumbs);
  404. }
  405. if (isset($_FILES['photo']['tmp_name']) && trim($_FILES['photo']['tmp_name'])) {
  406. $dir = $conf->user->dir_output.'/'.get_exdir(0, 0, 0, 0, $object, 'user').'/'.$object->id;
  407. dol_mkdir($dir);
  408. if (@is_dir($dir)) {
  409. $newfile = $dir.'/'.dol_sanitizeFileName($_FILES['photo']['name']);
  410. $result = dol_move_uploaded_file($_FILES['photo']['tmp_name'], $newfile, 1, 0, $_FILES['photo']['error']);
  411. if (!$result > 0) {
  412. setEventMessages($langs->trans("ErrorFailedToSaveFile"), null, 'errors');
  413. } else {
  414. // Create thumbs
  415. $object->addThumbs($newfile);
  416. }
  417. } else {
  418. $error ++;
  419. $langs->load("errors");
  420. setEventMessages($langs->trans("ErrorFailedToCreateDir", $dir), $mesgs, 'errors');
  421. }
  422. }
  423. }
  424. if (! $error && ! count($object->errors))
  425. {
  426. // Then we add the associated categories
  427. $categories = GETPOST('usercats', 'array');
  428. $object->setCategories($categories);
  429. }
  430. if (!$error && !count($object->errors)) {
  431. setEventMessages($langs->trans("UserModified"), null, 'mesgs');
  432. $db->commit();
  433. $login = $_SESSION["dol_login"];
  434. if ($login && $login == $object->oldcopy->login && $object->oldcopy->login != $object->login) // Current user has changed its login
  435. {
  436. $error++;
  437. $langs->load("errors");
  438. setEventMessages($langs->transnoentitiesnoconv("WarningYourLoginWasModifiedPleaseLogin"), null, 'warnings');
  439. }
  440. }
  441. else {
  442. $db->rollback();
  443. }
  444. }
  445. }
  446. else
  447. {
  448. if ($caneditpassword) // Case we can edit only password
  449. {
  450. dol_syslog("Not allowed to change fields, only password");
  451. $object->fetch($id);
  452. $object->oldcopy = clone $object;
  453. $ret = $object->setPassword($user, GETPOST("password"));
  454. if ($ret < 0)
  455. {
  456. setEventMessages($object->error, $object->errors, 'errors');
  457. }
  458. }
  459. }
  460. }
  461. // Change password with a new generated one
  462. if ((($action == 'confirm_password' && $confirm == 'yes')
  463. || ($action == 'confirm_passwordsend' && $confirm == 'yes')) && $caneditpassword
  464. ) {
  465. $object->fetch($id);
  466. $newpassword = $object->setPassword($user, '');
  467. if ($newpassword < 0) {
  468. // Echec
  469. setEventMessages($langs->trans("ErrorFailedToSetNewPassword"), null, 'errors');
  470. } else {
  471. // Succes
  472. if ($action == 'confirm_passwordsend' && $confirm == 'yes') {
  473. if ($object->send_password($user, $newpassword) > 0)
  474. {
  475. setEventMessages($langs->trans("PasswordChangedAndSentTo", $object->email), null, 'mesgs');
  476. }
  477. else
  478. {
  479. setEventMessages($object->error, $object->errors, 'errors');
  480. }
  481. }
  482. else
  483. {
  484. setEventMessages($langs->trans("PasswordChangedTo", $newpassword), null, 'warnings');
  485. }
  486. }
  487. }
  488. // Action initialisation donnees depuis record LDAP
  489. if ($action == 'adduserldap') {
  490. $selecteduser = $_POST['users'];
  491. $required_fields = array(
  492. $conf->global->LDAP_KEY_USERS,
  493. $conf->global->LDAP_FIELD_NAME,
  494. $conf->global->LDAP_FIELD_FIRSTNAME,
  495. $conf->global->LDAP_FIELD_LOGIN,
  496. $conf->global->LDAP_FIELD_LOGIN_SAMBA,
  497. $conf->global->LDAP_FIELD_PASSWORD,
  498. $conf->global->LDAP_FIELD_PASSWORD_CRYPTED,
  499. $conf->global->LDAP_FIELD_PHONE,
  500. $conf->global->LDAP_FIELD_FAX,
  501. $conf->global->LDAP_FIELD_MOBILE,
  502. $conf->global->LDAP_FIELD_SKYPE,
  503. $conf->global->LDAP_FIELD_MAIL,
  504. $conf->global->LDAP_FIELD_TITLE,
  505. $conf->global->LDAP_FIELD_DESCRIPTION,
  506. $conf->global->LDAP_FIELD_SID
  507. );
  508. $ldap = new Ldap();
  509. $result = $ldap->connect_bind();
  510. if ($result >= 0) {
  511. // Remove from required_fields all entries not configured in LDAP (empty) and duplicated
  512. $required_fields = array_unique(array_values(array_filter($required_fields, "dol_validElement")));
  513. $ldapusers = $ldap->getRecords($selecteduser, $conf->global->LDAP_USER_DN, $conf->global->LDAP_KEY_USERS, $required_fields);
  514. //print_r($ldapusers);
  515. if (is_array($ldapusers)) {
  516. foreach ($ldapusers as $key => $attribute) {
  517. $ldap_lastname = $attribute[$conf->global->LDAP_FIELD_NAME];
  518. $ldap_firstname = $attribute[$conf->global->LDAP_FIELD_FIRSTNAME];
  519. $ldap_login = $attribute[$conf->global->LDAP_FIELD_LOGIN];
  520. $ldap_loginsmb = $attribute[$conf->global->LDAP_FIELD_LOGIN_SAMBA];
  521. $ldap_pass = $attribute[$conf->global->LDAP_FIELD_PASSWORD];
  522. $ldap_pass_crypted = $attribute[$conf->global->LDAP_FIELD_PASSWORD_CRYPTED];
  523. $ldap_phone = $attribute[$conf->global->LDAP_FIELD_PHONE];
  524. $ldap_fax = $attribute[$conf->global->LDAP_FIELD_FAX];
  525. $ldap_mobile = $attribute[$conf->global->LDAP_FIELD_MOBILE];
  526. $ldap_skype = $attribute[$conf->global->LDAP_FIELD_SKYPE];
  527. $ldap_twitter = $attribute[$conf->global->LDAP_FIELD_TWITTER];
  528. $ldap_facebook = $attribute[$conf->global->LDAP_FIELD_FACEBOOK];
  529. $ldap_mail = $attribute[$conf->global->LDAP_FIELD_MAIL];
  530. $ldap_sid = $attribute[$conf->global->LDAP_FIELD_SID];
  531. }
  532. }
  533. }
  534. else
  535. {
  536. setEventMessages($ldap->error, $ldap->errors, 'errors');
  537. }
  538. }
  539. // Actions to send emails
  540. $trigger_name='USER_SENTBYMAIL';
  541. $paramname='id'; // Name of param key to open the card
  542. $mode='emailfromuser';
  543. $trackid='use'.$id;
  544. include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
  545. // Actions to build doc
  546. $upload_dir = $conf->user->dir_output;
  547. $permissioncreate=$user->rights->user->user->creer;
  548. include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
  549. }
  550. /*
  551. * View
  552. */
  553. $form = new Form($db);
  554. $formother=new FormOther($db);
  555. $formcompany = new FormCompany($db);
  556. $formfile = new FormFile($db);
  557. llxHeader('',$langs->trans("UserCard"));
  558. if ($action == 'create' || $action == 'adduserldap')
  559. {
  560. /* ************************************************************************** */
  561. /* */
  562. /* Affichage fiche en mode creation */
  563. /* */
  564. /* ************************************************************************** */
  565. print load_fiche_titre($langs->trans("NewUser"));
  566. print $langs->trans("CreateInternalUserDesc")."<br>\n";
  567. print "<br>";
  568. if (! empty($conf->ldap->enabled) && (isset($conf->global->LDAP_SYNCHRO_ACTIVE) && $conf->global->LDAP_SYNCHRO_ACTIVE == 'ldap2dolibarr'))
  569. {
  570. /*
  571. * Affiche formulaire d'ajout d'un compte depuis LDAP
  572. * si on est en synchro LDAP vers Dolibarr
  573. */
  574. $ldap = new Ldap();
  575. $result = $ldap->connect_bind();
  576. if ($result >= 0)
  577. {
  578. $required_fields=array(
  579. $conf->global->LDAP_KEY_USERS,
  580. $conf->global->LDAP_FIELD_FULLNAME,
  581. $conf->global->LDAP_FIELD_NAME,
  582. $conf->global->LDAP_FIELD_FIRSTNAME,
  583. $conf->global->LDAP_FIELD_LOGIN,
  584. $conf->global->LDAP_FIELD_LOGIN_SAMBA,
  585. $conf->global->LDAP_FIELD_PASSWORD,
  586. $conf->global->LDAP_FIELD_PASSWORD_CRYPTED,
  587. $conf->global->LDAP_FIELD_PHONE,
  588. $conf->global->LDAP_FIELD_FAX,
  589. $conf->global->LDAP_FIELD_MOBILE,
  590. $conf->global->LDAP_FIELD_SKYPE,
  591. $conf->global->LDAP_FIELD_MAIL,
  592. $conf->global->LDAP_FIELD_TITLE,
  593. $conf->global->LDAP_FIELD_DESCRIPTION,
  594. $conf->global->LDAP_FIELD_SID
  595. );
  596. // Remove from required_fields all entries not configured in LDAP (empty) and duplicated
  597. $required_fields=array_unique(array_values(array_filter($required_fields, "dol_validElement")));
  598. // Get from LDAP database an array of results
  599. $ldapusers = $ldap->getRecords('*', $conf->global->LDAP_USER_DN, $conf->global->LDAP_KEY_USERS, $required_fields, 1);
  600. if (is_array($ldapusers))
  601. {
  602. $liste=array();
  603. foreach ($ldapusers as $key => $ldapuser)
  604. {
  605. // Define the label string for this user
  606. $label='';
  607. foreach ($required_fields as $value)
  608. {
  609. if ($value)
  610. {
  611. $label.=$value."=".$ldapuser[$value]." ";
  612. }
  613. }
  614. $liste[$key] = $label;
  615. }
  616. }
  617. else
  618. {
  619. setEventMessages($ldap->error, $ldap->errors, 'errors');
  620. }
  621. }
  622. else
  623. {
  624. setEventMessages($ldap->error, $ldap->errors, 'errors');
  625. }
  626. // If user list is full, we show drop-down list
  627. print "\n\n<!-- Form liste LDAP debut -->\n";
  628. print '<form name="add_user_ldap" action="'.$_SERVER["PHP_SELF"].'" method="post">';
  629. print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
  630. print '<table width="100%" class="border"><tr>';
  631. print '<td width="160">';
  632. print $langs->trans("LDAPUsers");
  633. print '</td>';
  634. print '<td>';
  635. print '<input type="hidden" name="action" value="adduserldap">';
  636. if (is_array($liste) && count($liste))
  637. {
  638. print $form->selectarray('users', $liste, '', 1);
  639. print ajax_combobox('users');
  640. }
  641. print '</td><td align="center">';
  642. print '<input type="submit" class="button" value="'.dol_escape_htmltag($langs->trans('Get')).'"'.(count($liste)?'':' disabled').'>';
  643. print '</td></tr></table>';
  644. print '</form>';
  645. print "\n<!-- Form liste LDAP fin -->\n\n";
  646. print '<br>';
  647. }
  648. print '<form action="'.$_SERVER['PHP_SELF'].'" method="POST" name="createuser">';
  649. print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
  650. print '<input type="hidden" name="action" value="add">';
  651. if (! empty($ldap_sid)) print '<input type="hidden" name="ldap_sid" value="'.dol_escape_htmltag($ldap_sid).'">';
  652. print '<input type="hidden" name="entity" value="'.$conf->entity.'">';
  653. dol_fiche_head('', '', '', 0, '');
  654. print dol_set_focus('#lastname');
  655. print '<table class="border centpercent">';
  656. // Lastname
  657. print '<tr>';
  658. print '<td class="titlefieldcreate"><span class="fieldrequired">'.$langs->trans("Lastname").'</span></td>';
  659. print '<td>';
  660. if (! empty($ldap_lastname))
  661. {
  662. print '<input type="hidden" id="lastname" name="lastname" value="'.$ldap_lastname.'">';
  663. print $ldap_lastname;
  664. }
  665. else
  666. {
  667. print '<input class="minwidth100" type="text" id="lastname" name="lastname" value="'.GETPOST('lastname').'">';
  668. }
  669. print '</td></tr>';
  670. // Firstname
  671. print '<tr><td>'.$langs->trans("Firstname").'</td>';
  672. print '<td>';
  673. if (! empty($ldap_firstname))
  674. {
  675. print '<input type="hidden" name="firstname" value="'.$ldap_firstname.'">';
  676. print $ldap_firstname;
  677. }
  678. else
  679. {
  680. print '<input class="minwidth100" type="text" name="firstname" value="'.GETPOST('firstname').'">';
  681. }
  682. print '</td></tr>';
  683. // Login
  684. print '<tr><td><span class="fieldrequired">'.$langs->trans("Login").'</span></td>';
  685. print '<td>';
  686. if (! empty($ldap_login))
  687. {
  688. print '<input type="hidden" name="login" value="'.$ldap_login.'">';
  689. print $ldap_login;
  690. }
  691. elseif (! empty($ldap_loginsmb))
  692. {
  693. print '<input type="hidden" name="login" value="'.$ldap_loginsmb.'">';
  694. print $ldap_loginsmb;
  695. }
  696. else
  697. {
  698. print '<input class="maxwidth200" maxsize="24" type="text" name="login" value="'.dol_escape_htmltag(GETPOST('login','alpha')).'">';
  699. }
  700. print '</td></tr>';
  701. $generated_password='';
  702. if (empty($ldap_sid)) // ldap_sid is for activedirectory
  703. {
  704. require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
  705. $generated_password=getRandomPassword(false);
  706. }
  707. $password=$generated_password;
  708. // Password
  709. print '<tr><td class="fieldrequired">'.$langs->trans("Password").'</td>';
  710. print '<td>';
  711. $valuetoshow='';
  712. if (preg_match('/ldap/',$dolibarr_main_authentication))
  713. {
  714. $valuetoshow.=($valuetoshow?', ':'').$langs->trans("PasswordOfUserInLDAP");
  715. }
  716. if (preg_match('/http/',$dolibarr_main_authentication))
  717. {
  718. $valuetoshow.=($valuetoshow?', ':'').$langs->trans("HTTPBasicPassword");
  719. }
  720. if (preg_match('/dolibarr/',$dolibarr_main_authentication))
  721. {
  722. if (! empty($ldap_pass)) // For very old system comaptibilty. Now clear password can't be viewed from LDAP read
  723. {
  724. $valuetoshow.= ($valuetoshow?', ':'').'<input type="hidden" name="password" value="'.$ldap_pass.'">'; // Dolibarr password is preffiled with LDAP known password
  725. $valuetoshow.= preg_replace('/./i','*',$ldap_pass);
  726. }
  727. else
  728. {
  729. // We do not use a field password but a field text to show new password to use.
  730. $valuetoshow.= ($valuetoshow?', ':'').'<input size="30" maxsize="32" type="text" name="password" value="'.$password.'" autocomplete="new-password">';
  731. }
  732. }
  733. // Other form for user password
  734. $parameters=array('valuetoshow' => $valuetoshow, 'password' => $password);
  735. $reshook=$hookmanager->executeHooks('printUserPasswordField',$parameters,$object,$action); // Note that $action and $object may have been modified by hook
  736. if ($reshook > 0) $valuetoshow=$hookmanager->resPrint; // to replace
  737. else $valuetoshow.=$hookmanager->resPrint; // to add
  738. print $valuetoshow;
  739. print '</td></tr>';
  740. if (! empty($conf->api->enabled))
  741. {
  742. // API key
  743. $generated_api_key = '';
  744. require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
  745. $generated_password=getRandomPassword(false);
  746. print '<tr><td>'.$langs->trans("ApiKey").'</td>';
  747. print '<td>';
  748. print '<input size="30" maxsize="32" type="text" id="api_key" name="api_key" value="'.$api_key.'" autocomplete="off">';
  749. if (! empty($conf->use_javascript_ajax))
  750. print '&nbsp;'.img_picto($langs->trans('Generate'), 'refresh', 'id="generate_api_key" class="linkobject"');
  751. print '</td></tr>';
  752. }
  753. else
  754. {
  755. require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
  756. // PARTIAL WORKAROUND
  757. $generated_fake_api_key=getRandomPassword(false);
  758. print '<input type="hidden" name="api_key" value="'.$generated_fake_api_key.'">';
  759. }
  760. // Administrator
  761. if (! empty($user->admin))
  762. {
  763. print '<tr><td>'.$langs->trans("Administrator").'</td>';
  764. print '<td>';
  765. print $form->selectyesno('admin',GETPOST('admin'),1);
  766. if (! empty($conf->multicompany->enabled) && ! $user->entity && empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE))
  767. {
  768. if (! empty($conf->use_javascript_ajax))
  769. {
  770. print '<script type="text/javascript">
  771. $(function() {
  772. $("select[name=admin]").change(function() {
  773. if ( $(this).val() == 0 ) {
  774. $("input[name=superadmin]")
  775. .prop("disabled", true)
  776. .prop("checked", false);
  777. $("select[name=entity]")
  778. .prop("disabled", false);
  779. } else {
  780. $("input[name=superadmin]")
  781. .prop("disabled", false);
  782. }
  783. });
  784. $("input[name=superadmin]").change(function() {
  785. if ( $(this).is(":checked") ) {
  786. $("select[name=entity]")
  787. .prop("disabled", true);
  788. } else {
  789. $("select[name=entity]")
  790. .prop("disabled", false);
  791. }
  792. });
  793. });
  794. </script>';
  795. }
  796. $checked=(GETPOST('superadmin', 'int')?' checked':'');
  797. $disabled=(GETPOST('superadmin', 'int')?'':' disabled');
  798. print '<input type="checkbox" name="superadmin" value="1"'.$checked.$disabled.' /> '.$langs->trans("SuperAdministrator");
  799. }
  800. print "</td></tr>\n";
  801. }
  802. // Type
  803. print '<tr><td>'.$langs->trans("Type").'</td>';
  804. print '<td>';
  805. print $form->textwithpicto($langs->trans("Internal"),$langs->trans("InternalExternalDesc"), 1, 'help', '', 0, 2);
  806. print '</td></tr>';
  807. // Gender
  808. print '<tr><td>'.$langs->trans("Gender").'</td>';
  809. print '<td>';
  810. $arraygender=array('man'=>$langs->trans("Genderman"),'woman'=>$langs->trans("Genderwoman"));
  811. print $form->selectarray('gender', $arraygender, GETPOST('gender'), 1);
  812. print '</td></tr>';
  813. // Employee
  814. $defaultemployee=1;
  815. print '<tr>';
  816. print '<td>'.$langs->trans('Employee').'</td><td>';
  817. print $form->selectyesno("employee",(GETPOST('employee')!=''?GETPOST('employee'):$defaultemployee),1);
  818. print '</td></tr>';
  819. // Hierarchy
  820. print '<tr><td class="titlefieldcreate">'.$langs->trans("HierarchicalResponsible").'</td>';
  821. print '<td>';
  822. print $form->select_dolusers($object->fk_user, 'fk_user', 1, array($object->id), 0, '', 0, $conf->entity, 0, 0, '', 0, '', 'maxwidth300');
  823. print '</td>';
  824. print "</tr>\n";
  825. print '</table><hr><table class="border centpercent">';
  826. // Address
  827. print '<tr><td class="tdtop titlefieldcreate">'.fieldLabel('Address','address').'</td>';
  828. print '<td><textarea name="address" id="address" class="quatrevingtpercent" rows="3" wrap="soft">';
  829. print $object->address;
  830. print '</textarea></td></tr>';
  831. // Zip
  832. print '<tr><td>'.fieldLabel('Zip','zipcode').'</td><td>';
  833. print $formcompany->select_ziptown($object->zip,'zipcode',array('town','selectcountry_id','state_id'),6);
  834. print '</td></tr>';
  835. // Town
  836. print '<tr><td>'.fieldLabel('Town','town').'</td><td>';
  837. print $formcompany->select_ziptown($object->town,'town',array('zipcode','selectcountry_id','state_id'));
  838. print '</td></tr>';
  839. // Country
  840. print '<tr><td>'.fieldLabel('Country','selectcountry_id').'</td><td class="maxwidthonsmartphone">';
  841. print $form->select_country((GETPOST('country_id')!=''?GETPOST('country_id'):$object->country_id));
  842. if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1);
  843. print '</td></tr>';
  844. // State
  845. if (empty($conf->global->USER_DISABLE_STATE))
  846. {
  847. print '<tr><td>'.fieldLabel('State','state_id').'</td><td class="maxwidthonsmartphone">';
  848. print $formcompany->select_state($object->state_id,$object->country_code, 'state_id');
  849. print '</td></tr>';
  850. }
  851. // Tel
  852. print '<tr><td>'.$langs->trans("PhonePro").'</td>';
  853. print '<td>';
  854. if (! empty($ldap_phone))
  855. {
  856. print '<input type="hidden" name="office_phone" value="'.$ldap_phone.'">';
  857. print $ldap_phone;
  858. }
  859. else
  860. {
  861. print '<input size="20" type="text" name="office_phone" value="'.GETPOST('office_phone').'">';
  862. }
  863. print '</td></tr>';
  864. // Tel portable
  865. print '<tr><td>'.$langs->trans("PhoneMobile").'</td>';
  866. print '<td>';
  867. if (! empty($ldap_mobile))
  868. {
  869. print '<input type="hidden" name="user_mobile" value="'.$ldap_mobile.'">';
  870. print $ldap_mobile;
  871. }
  872. else
  873. {
  874. print '<input size="20" type="text" name="user_mobile" value="'.GETPOST('user_mobile').'">';
  875. }
  876. print '</td></tr>';
  877. // Fax
  878. print '<tr><td>'.$langs->trans("Fax").'</td>';
  879. print '<td>';
  880. if (! empty($ldap_fax))
  881. {
  882. print '<input type="hidden" name="office_fax" value="'.$ldap_fax.'">';
  883. print $ldap_fax;
  884. }
  885. else
  886. {
  887. print '<input size="20" type="text" name="office_fax" value="'.GETPOST('office_fax').'">';
  888. }
  889. print '</td></tr>';
  890. // Skype
  891. if (! empty($conf->socialnetworks->enabled))
  892. {
  893. print '<tr><td>'.$langs->trans("Skype").'</td>';
  894. print '<td>';
  895. if (! empty($ldap_skype))
  896. {
  897. print '<input type="hidden" name="skype" value="'.$ldap_skype.'">';
  898. print $ldap_skype;
  899. }
  900. else
  901. {
  902. print '<input class="maxwidth200" type="text" name="skype" value="'.GETPOST('skype','alpha').'">';
  903. }
  904. print '</td></tr>';
  905. }
  906. // Twitter
  907. if (! empty($conf->socialnetworks->enabled))
  908. {
  909. print '<tr><td>'.$langs->trans("Twitter").'</td>';
  910. print '<td>';
  911. if (! empty($ldap_twitter))
  912. {
  913. print '<input type="hidden" name="twitter" value="'.$ldap_twitter.'">';
  914. print $ldap_twitter;
  915. }
  916. else
  917. {
  918. print '<input class="maxwidth200" type="text" name="twitter" value="'.GETPOST('twitter','alpha').'">';
  919. }
  920. print '</td></tr>';
  921. }
  922. // Facebook
  923. if (! empty($conf->socialnetworks->enabled))
  924. {
  925. print '<tr><td>'.$langs->trans("Facebook").'</td>';
  926. print '<td>';
  927. if (! empty($ldap_facebook))
  928. {
  929. print '<input type="hidden" name="facebook" value="'.$ldap_facebook.'">';
  930. print $ldap_facebook;
  931. }
  932. else
  933. {
  934. print '<input class="maxwidth200" type="text" name="facebook" value="'.GETPOST('facebook','alpha').'">';
  935. }
  936. print '</td></tr>';
  937. }
  938. // EMail
  939. print '<tr><td'.(! empty($conf->global->USER_MAIL_REQUIRED)?' class="fieldrequired"':'').'>'.$langs->trans("EMail").'</td>';
  940. print '<td>';
  941. if (! empty($ldap_mail))
  942. {
  943. print '<input type="hidden" name="email" value="'.$ldap_mail.'">';
  944. print $ldap_mail;
  945. }
  946. else
  947. {
  948. print '<input size="40" type="text" name="email" value="'.GETPOST('email').'">';
  949. }
  950. print '</td></tr>';
  951. // Accountancy code
  952. if ($conf->accounting->enabled)
  953. {
  954. print '<tr><td>'.$langs->trans("AccountancyCode").'</td>';
  955. print '<td>';
  956. print '<input size="30" type="text" name="accountancy_code" value="'.GETPOST('accountancy_code').'">';
  957. print '</td></tr>';
  958. }
  959. // User color
  960. if (! empty($conf->agenda->enabled))
  961. {
  962. print '<tr><td>'.$langs->trans("ColorUser").'</td>';
  963. print '<td>';
  964. print $formother->selectColor(GETPOST('color')?GETPOST('color'):$object->color, 'color', null, 1, '', 'hideifnotset');
  965. print '</td></tr>';
  966. }
  967. // Categories
  968. if (! empty($conf->categorie->enabled) && ! empty($user->rights->categorie->lire))
  969. {
  970. print '<tr><td>' . fieldLabel('Categories', 'usercats') . '</td><td colspan="3">';
  971. $cate_arbo = $form->select_all_categories('user', null, 'parent', null, null, 1);
  972. print $form->multiselectarray('usercats', $cate_arbo, GETPOST('usercats', 'array'), null, null, null,
  973. null, '90%' );
  974. print "</td></tr>";
  975. }
  976. // Multicompany
  977. if (! empty($conf->multicompany->enabled) && is_object($mc))
  978. {
  979. // This is now done with hook formObjectOptions. Keep this code for backward compatibility with old multicompany module
  980. if (! method_exists($mc, 'formObjectOptions'))
  981. {
  982. if (empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE) && $conf->entity == 1 && $user->admin && ! $user->entity) // condition must be same for create and edit mode
  983. {
  984. print "<tr>".'<td>'.$langs->trans("Entity").'</td>';
  985. print "<td>".$mc->select_entities($conf->entity);
  986. print "</td></tr>\n";
  987. }
  988. else
  989. {
  990. print '<input type="hidden" name="entity" value="'.$conf->entity.'" />';
  991. }
  992. }
  993. }
  994. // Other attributes
  995. $parameters=array('objectsrc' => $objectsrc, 'colspan' => ' colspan="3"');
  996. $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$object,$action); // Note that $action and $object may have been modified by hook
  997. print $hookmanager->resPrint;
  998. if (empty($reshook))
  999. {
  1000. print $object->showOptionals($extrafields,'edit');
  1001. }
  1002. // Note
  1003. print '<tr><td class="tdtop">';
  1004. print $langs->trans("Note");
  1005. print '</td><td>';
  1006. require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
  1007. $doleditor=new DolEditor('note','','',120,'dolibarr_notes','',false,true,$conf->global->FCKEDITOR_ENABLE_SOCIETE,ROWS_3,'90%');
  1008. $doleditor->Create();
  1009. print "</td></tr>\n";
  1010. // Signature
  1011. print '<tr><td class="tdtop">'.$langs->trans("Signature").'</td>';
  1012. print '<td>';
  1013. require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
  1014. $doleditor=new DolEditor('signature',GETPOST('signature'),'',138,'dolibarr_notes','In',true,true,empty($conf->global->FCKEDITOR_ENABLE_USERSIGN)?0:1,ROWS_4,'90%');
  1015. print $doleditor->Create(1);
  1016. print '</td></tr>';
  1017. print '</table><hr><table class="border centpercent">';
  1018. // TODO Move this into tab RH (HierarchicalResponsible must be on both tab)
  1019. // Position/Job
  1020. print '<tr><td class="titlefieldcreate">'.$langs->trans("PostOrFunction").'</td>';
  1021. print '<td>';
  1022. print '<input class="maxwidth200" type="text" name="job" value="'.GETPOST('job').'">';
  1023. print '</td></tr>';
  1024. if ((! empty($conf->salaries->enabled) && ! empty($user->rights->salaries->read))
  1025. || (! empty($conf->hrm->enabled) && ! empty($user->rights->hrm->employee->read)))
  1026. {
  1027. $langs->load("salaries");
  1028. // THM
  1029. print '<tr><td>';
  1030. $text=$langs->trans("THM");
  1031. print $form->textwithpicto($text, $langs->trans("THMDescription"), 1, 'help', 'classthm');
  1032. print '</td>';
  1033. print '<td>';
  1034. print '<input size="8" type="text" name="thm" value="'.GETPOST('thm').'">';
  1035. print '</td>';
  1036. print "</tr>\n";
  1037. // TJM
  1038. print '<tr><td>';
  1039. $text=$langs->trans("TJM");
  1040. print $form->textwithpicto($text, $langs->trans("TJMDescription"), 1, 'help', 'classtjm');
  1041. print '</td>';
  1042. print '<td>';
  1043. print '<input size="8" type="text" name="tjm" value="'.GETPOST('tjm').'">';
  1044. print '</td>';
  1045. print "</tr>\n";
  1046. // Salary
  1047. print '<tr><td>'.$langs->trans("Salary").'</td>';
  1048. print '<td>';
  1049. print '<input size="8" type="text" name="salary" value="'.GETPOST('salary').'">';
  1050. print '</td>';
  1051. print "</tr>\n";
  1052. }
  1053. // Weeklyhours
  1054. print '<tr><td>'.$langs->trans("WeeklyHours").'</td>';
  1055. print '<td>';
  1056. print '<input size="8" type="text" name="weeklyhours" value="'.GETPOST('weeklyhours').'">';
  1057. print '</td>';
  1058. print "</tr>\n";
  1059. // Date employment
  1060. print '<tr><td>'.$langs->trans("DateEmployment").'</td>';
  1061. print '<td>';
  1062. print $form->selectDate(GETPOST('dateemployment'), 'dateemployment', 0, 0, 1, 'formdateemployment', 1, 0);
  1063. print '</td>';
  1064. print "</tr>\n";
  1065. // Date employment END
  1066. print '<tr><td>'.$langs->trans("DateEmploymentEnd").'</td>';
  1067. print '<td>';
  1068. print $form->selectDate(GETPOST('dateemploymentend'), 'dateemploymentend', 0, 0, 1, 'formdateemploymentend', 1, 0);
  1069. print '</td>';
  1070. print "</tr>\n";
  1071. // Date birth
  1072. print '<tr><td>'.$langs->trans("DateToBirth").'</td>';
  1073. print '<td>';
  1074. print $form->selectDate(GETPOST('birth'), 'birth', 0, 0, 1, 'createuser', 1, 0);
  1075. print '</td>';
  1076. print "</tr>\n";
  1077. print "</table>\n";
  1078. dol_fiche_end();
  1079. print '<div align="center">';
  1080. print '<input class="button" value="'.$langs->trans("CreateUser").'" name="create" type="submit">';
  1081. //print '&nbsp; &nbsp; &nbsp;';
  1082. //print '<input value="'.$langs->trans("Cancel").'" class="button" type="submit" name="cancel">';
  1083. print '</div>';
  1084. print "</form>";
  1085. }
  1086. else
  1087. {
  1088. /* ************************************************************************** */
  1089. /* */
  1090. /* View and edition */
  1091. /* */
  1092. /* ************************************************************************** */
  1093. if ($id > 0)
  1094. {
  1095. $object->fetch($id, '', '', 1);
  1096. if ($res < 0) { dol_print_error($db,$object->error); exit; }
  1097. $res=$object->fetch_optionals();
  1098. // Check if user has rights
  1099. if (empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE))
  1100. {
  1101. $object->getrights();
  1102. if (empty($object->nb_rights) && $object->statut != 0 && empty($object->admin)) setEventMessages($langs->trans('UserHasNoPermissions'), null, 'warnings');
  1103. }
  1104. // Connexion ldap
  1105. // pour recuperer passDoNotExpire et userChangePassNextLogon
  1106. if (! empty($conf->ldap->enabled) && ! empty($object->ldap_sid))
  1107. {
  1108. $ldap = new Ldap();
  1109. $result=$ldap->connect_bind();
  1110. if ($result > 0)
  1111. {
  1112. $userSearchFilter = '('.$conf->global->LDAP_FILTER_CONNECTION.'('.$ldap->getUserIdentifier().'='.$object->login.'))';
  1113. $entries = $ldap->fetch($object->login,$userSearchFilter);
  1114. if (! $entries)
  1115. {
  1116. setEventMessages($ldap->error, $ldap->errors, 'errors');
  1117. }
  1118. $passDoNotExpire = 0;
  1119. $userChangePassNextLogon = 0;
  1120. $userDisabled = 0;
  1121. $statutUACF = '';
  1122. // Check options of user account
  1123. if (count($ldap->uacf) > 0)
  1124. {
  1125. foreach ($ldap->uacf as $key => $statut)
  1126. {
  1127. if ($key == 65536)
  1128. {
  1129. $passDoNotExpire = 1;
  1130. $statutUACF = $statut;
  1131. }
  1132. }
  1133. }
  1134. else
  1135. {
  1136. $userDisabled = 1;
  1137. $statutUACF = "ACCOUNTDISABLE";
  1138. }
  1139. if ($ldap->pwdlastset == 0)
  1140. {
  1141. $userChangePassNextLogon = 1;
  1142. }
  1143. }
  1144. }
  1145. // Show tabs
  1146. if ($mode == 'employee') // For HRM module development
  1147. {
  1148. $title = $langs->trans("Employee");
  1149. $linkback = '<a href="'.DOL_URL_ROOT.'/hrm/employee/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
  1150. }
  1151. else
  1152. {
  1153. $title = $langs->trans("User");
  1154. $linkback = '';
  1155. if ($user->rights->user->user->lire || $user->admin) {
  1156. $linkback = '<a href="'.DOL_URL_ROOT.'/user/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
  1157. }
  1158. }
  1159. $head = user_prepare_head($object);
  1160. /*
  1161. * Confirmation reinitialisation mot de passe
  1162. */
  1163. if ($action == 'password')
  1164. {
  1165. print $form->formconfirm($_SERVER['PHP_SELF']."?id=$object->id",$langs->trans("ReinitPassword"),$langs->trans("ConfirmReinitPassword",$object->login),"confirm_password", '', 0, 1);
  1166. }
  1167. /*
  1168. * Confirmation envoi mot de passe
  1169. */
  1170. if ($action == 'passwordsend')
  1171. {
  1172. print $form->formconfirm($_SERVER['PHP_SELF']."?id=$object->id",$langs->trans("SendNewPassword"),$langs->trans("ConfirmSendNewPassword",$object->login),"confirm_passwordsend", '', 0, 1);
  1173. }
  1174. /*
  1175. * Confirm deactivation
  1176. */
  1177. if ($action == 'disable')
  1178. {
  1179. print $form->formconfirm($_SERVER['PHP_SELF']."?id=$object->id",$langs->trans("DisableAUser"),$langs->trans("ConfirmDisableUser",$object->login),"confirm_disable", '', 0, 1);
  1180. }
  1181. /*
  1182. * Confirm activation
  1183. */
  1184. if ($action == 'enable')
  1185. {
  1186. print $form->formconfirm($_SERVER['PHP_SELF']."?id=$object->id",$langs->trans("EnableAUser"),$langs->trans("ConfirmEnableUser",$object->login),"confirm_enable", '', 0, 1);
  1187. }
  1188. /*
  1189. * Confirmation suppression
  1190. */
  1191. if ($action == 'delete')
  1192. {
  1193. print $form->formconfirm($_SERVER['PHP_SELF']."?id=$object->id",$langs->trans("DeleteAUser"),$langs->trans("ConfirmDeleteUser",$object->login),"confirm_delete", '', 0, 1);
  1194. }
  1195. /*
  1196. * Fiche en mode visu
  1197. */
  1198. if ($action != 'edit')
  1199. {
  1200. dol_fiche_head($head, 'user', $title, -1, 'user');
  1201. dol_banner_tab($object,'id',$linkback,$user->rights->user->user->lire || $user->admin);
  1202. print '<div class="fichecenter">';
  1203. print '<div class="fichehalfleft">';
  1204. print '<div class="underbanner clearboth"></div>';
  1205. print '<table class="border tableforfield" width="100%">';
  1206. // Login
  1207. print '<tr><td class="titlefield">'.$langs->trans("Login").'</td>';
  1208. if (! empty($object->ldap_sid) && $object->statut==0)
  1209. {
  1210. print '<td class="error">'.$langs->trans("LoginAccountDisableInDolibarr").'</td>';
  1211. }
  1212. else
  1213. {
  1214. print '<td>'.$object->login.'</td>';
  1215. }
  1216. print '</tr>'."\n";
  1217. // Password
  1218. print '<tr><td>'.$langs->trans("Password").'</td>';
  1219. print '<td class="wordbreak">';
  1220. $valuetoshow='';
  1221. if (preg_match('/ldap/',$dolibarr_main_authentication))
  1222. {
  1223. if (! empty($object->ldap_sid))
  1224. {
  1225. if ($passDoNotExpire)
  1226. {
  1227. $valuetoshow.=($valuetoshow?(' '.$langs->trans("or").' '):'').$langs->trans("LdapUacf_".$statutUACF);
  1228. }
  1229. else if($userChangePassNextLogon)
  1230. {
  1231. $valuetoshow.=($valuetoshow?(' '.$langs->trans("or").' '):'').'<span class="warning">'.$langs->trans("UserMustChangePassNextLogon",$ldap->domainFQDN).'</span>';
  1232. }
  1233. else if($userDisabled)
  1234. {
  1235. $valuetoshow.=($valuetoshow?(' '.$langs->trans("or").' '):'').'<span class="warning">'.$langs->trans("LdapUacf_".$statutUACF,$ldap->domainFQDN).'</span>';
  1236. }
  1237. else
  1238. {
  1239. $valuetoshow.=($valuetoshow?(' '.$langs->trans("or").' '):'').$langs->trans("PasswordOfUserInLDAP");
  1240. }
  1241. }
  1242. else
  1243. {
  1244. $valuetoshow.=($valuetoshow?(' '.$langs->trans("or").' '):'').$langs->trans("PasswordOfUserInLDAP");
  1245. }
  1246. }
  1247. if (preg_match('/http/',$dolibarr_main_authentication))
  1248. {
  1249. $valuetoshow.=($valuetoshow?(' '.$langs->trans("or").' '):'').$langs->trans("HTTPBasicPassword");
  1250. }
  1251. if (preg_match('/dolibarr/',$dolibarr_main_authentication))
  1252. {
  1253. if ($object->pass) $valuetoshow.= ($valuetoshow?(' '.$langs->trans("or").' '):'').preg_replace('/./i','*',$object->pass);
  1254. else
  1255. {
  1256. if ($user->admin) $valuetoshow.= ($valuetoshow?(' '.$langs->trans("or").' '):'').$langs->trans("Crypted").': '.$object->pass_indatabase_crypted;
  1257. else $valuetoshow.= ($valuetoshow?(' '.$langs->trans("or").' '):'').$langs->trans("Hidden");
  1258. }
  1259. }
  1260. // Other form for user password
  1261. $parameters=array('valuetoshow' => $valuetoshow);
  1262. $reshook=$hookmanager->executeHooks('printUserPasswordField',$parameters,$object,$action); // Note that $action and $object may have been modified by hook
  1263. if ($reshook > 0) $valuetoshow=$hookmanager->resPrint; // to replace
  1264. else $valuetoshow.=$hookmanager->resPrint; // to add
  1265. print $valuetoshow;
  1266. print "</td>";
  1267. print '</tr>'."\n";
  1268. // API key
  1269. if (! empty($conf->api->enabled) && $user->admin) {
  1270. print '<tr><td>'.$langs->trans("ApiKey").'</td>';
  1271. print '<td>';
  1272. if (! empty($object->api_key)) print preg_replace('/./','*',$object->api_key);
  1273. print '</td></tr>';
  1274. }
  1275. // Administrator
  1276. print '<tr><td>'.$langs->trans("Administrator").'</td><td>';
  1277. if (! empty($conf->multicompany->enabled) && $object->admin && ! $object->entity)
  1278. {
  1279. print $form->textwithpicto(yn($object->admin),$langs->trans("SuperAdministratorDesc"),1,"superadmin");
  1280. }
  1281. else if ($object->admin)
  1282. {
  1283. print $form->textwithpicto(yn($object->admin),$langs->trans("AdministratorDesc"),1,"admin");
  1284. }
  1285. else
  1286. {
  1287. print yn($object->admin);
  1288. }
  1289. print '</td></tr>'."\n";
  1290. // Type
  1291. print '<tr><td>';
  1292. $text=$langs->trans("Type");
  1293. print $form->textwithpicto($text, $langs->trans("InternalExternalDesc"));
  1294. print '</td><td>';
  1295. $type=$langs->trans("Internal");
  1296. if ($object->societe_id > 0) $type=$langs->trans("External");
  1297. print $type;
  1298. if ($object->ldap_sid) print ' ('.$langs->trans("DomainUser").')';
  1299. print '</td></tr>'."\n";
  1300. // Ldap sid
  1301. if ($object->ldap_sid)
  1302. {
  1303. print '<tr><td>'.$langs->trans("Type").'</td><td>';
  1304. print $langs->trans("DomainUser",$ldap->domainFQDN);
  1305. print '</td></tr>'."\n";
  1306. }
  1307. // Gender
  1308. print '<tr><td>'.$langs->trans("Gender").'</td>';
  1309. print '<td>';
  1310. if ($object->gender) print $langs->trans("Gender".$object->gender);
  1311. print '</td></tr>';
  1312. // Employee
  1313. print '<tr><td>'.$langs->trans("Employee").'</td><td colspan="2">';
  1314. print yn($object->employee);
  1315. print '</td></tr>'."\n";
  1316. // TODO Move this into tab RH, visible when salarie or RH is visible (HierarchicalResponsible must be on both tab)
  1317. // Hierarchy
  1318. print '<tr><td>'.$langs->trans("HierarchicalResponsible").'</td>';
  1319. print '<td>';
  1320. if (empty($object->fk_user)) print $langs->trans("None");
  1321. else {
  1322. $huser=new User($db);
  1323. $huser->fetch($object->fk_user);
  1324. print $huser->getNomUrl(1);
  1325. }
  1326. print '</td>';
  1327. print "</tr>\n";
  1328. // Position/Job
  1329. print '<tr><td>'.$langs->trans("PostOrFunction").'</td>';
  1330. print '<td>'.$object->job.'</td>';
  1331. print '</tr>'."\n";
  1332. //$childids = $user->getAllChildIds(1);
  1333. if ((! empty($conf->salaries->enabled) && ! empty($user->rights->salaries->read))
  1334. || (! empty($conf->hrm->enabled) && ! empty($user->rights->hrm->employee->read)))
  1335. {
  1336. // Even a superior can't see this info of its subordinates wihtout $user->rights->salaries->read and $user->rights->hrm->employee->read (setting/viewing is reserverd to HR people).
  1337. // However, he can see the valuation of timesheet of its subordinates even without these permissions.
  1338. $langs->load("salaries");
  1339. // THM
  1340. print '<tr><td>';
  1341. $text=$langs->trans("THM");
  1342. print $form->textwithpicto($text, $langs->trans("THMDescription"), 1, 'help', 'classthm');
  1343. print '</td>';
  1344. print '<td>';
  1345. print ($object->thm!=''?price($object->thm,'',$langs,1,-1,-1,$conf->currency):'');
  1346. print '</td>';
  1347. print "</tr>\n";
  1348. // TJM
  1349. print '<tr><td>';
  1350. $text=$langs->trans("TJM");
  1351. print $form->textwithpicto($text, $langs->trans("TJMDescription"), 1, 'help', 'classtjm');
  1352. print '</td>';
  1353. print '<td>';
  1354. print ($object->tjm!=''?price($object->tjm,'',$langs,1,-1,-1,$conf->currency):'');
  1355. print '</td>';
  1356. print "</tr>\n";
  1357. // Salary
  1358. print '<tr><td>'.$langs->trans("Salary").'</td>';
  1359. print '<td>';
  1360. print ($object->salary!=''?price($object->salary,'',$langs,1,-1,-1,$conf->currency):'');
  1361. print '</td>';
  1362. print "</tr>\n";
  1363. }
  1364. // Weeklyhours
  1365. print '<tr><td>'.$langs->trans("WeeklyHours").'</td>';
  1366. print '<td>';
  1367. print price2num($object->weeklyhours);
  1368. print '</td>';
  1369. print "</tr>\n";
  1370. // Date employment
  1371. print '<tr><td>'.$langs->trans("DateEmployment").'</td>';
  1372. print '<td>';
  1373. print dol_print_date($object->dateemployment, 'day');
  1374. print '</td>';
  1375. print "</tr>\n";
  1376. // Date employment
  1377. print '<tr><td>'.$langs->trans("DateEmploymentEnd").'</td>';
  1378. print '<td>';
  1379. print dol_print_date($object->dateemploymentend);
  1380. print '</td>';
  1381. print "</tr>\n";
  1382. // Date of birth
  1383. print '<tr><td>'.$langs->trans("DateToBirth").'</td>';
  1384. print '<td>';
  1385. print dol_print_date($object->birth, 'day');
  1386. print '</td>';
  1387. print "</tr>\n";
  1388. // Accountancy code
  1389. if ($conf->accounting->enabled)
  1390. {
  1391. print '<tr><td>'.$langs->trans("AccountancyCode").'</td>';
  1392. print '<td>'.$object->accountancy_code.'</td></tr>';
  1393. }
  1394. print '</table>';
  1395. print '</div>';
  1396. print '<div class="fichehalfright"><div class="ficheaddleft">';
  1397. print '<div class="underbanner clearboth"></div>';
  1398. print '<table class="border tableforfield" width="100%">';
  1399. // Color user
  1400. if (! empty($conf->agenda->enabled))
  1401. {
  1402. print '<tr><td>'.$langs->trans("ColorUser").'</td>';
  1403. print '<td>';
  1404. print $formother->showColor($object->color, '');
  1405. print '</td>';
  1406. print "</tr>\n";
  1407. }
  1408. // Categories
  1409. if (! empty($conf->categorie->enabled) && ! empty($user->rights->categorie->lire))
  1410. {
  1411. print '<tr><td>' . $langs->trans( "Categories" ) . '</td>';
  1412. print '<td colspan="3">';
  1413. print $form->showCategories( $object->id, 'user', 1 );
  1414. print '</td></tr>';
  1415. }
  1416. if (isset($conf->file->main_authentication) && preg_match('/openid/',$conf->file->main_authentication) && ! empty($conf->global->MAIN_OPENIDURL_PERUSER))
  1417. {
  1418. print '<tr><td>'.$langs->trans("OpenIDURL").'</td>';
  1419. print '<td>'.$object->openid.'</td>';
  1420. print "</tr>\n";
  1421. }
  1422. print '<tr><td class="titlefield">'.$langs->trans("LastConnexion").'</td>';
  1423. print '<td>'.dol_print_date($object->datelastlogin,"dayhour").'</td>';
  1424. print "</tr>\n";
  1425. print '<tr><td>'.$langs->trans("PreviousConnexion").'</td>';
  1426. print '<td>'.dol_print_date($object->datepreviouslogin,"dayhour").'</td>';
  1427. print "</tr>\n";
  1428. // Multicompany
  1429. if (! empty($conf->multicompany->enabled) && is_object($mc))
  1430. {
  1431. // This is now done with hook formObjectOptions. Keep this code for backward compatibility with old multicompany module
  1432. if (! method_exists($mc, 'formObjectOptions'))
  1433. {
  1434. if (! empty($conf->multicompany->enabled) && empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE) && $conf->entity == 1 && $user->admin && ! $user->entity)
  1435. {
  1436. print '<tr><td>' . $langs->trans("Entity") . '</td><td>';
  1437. if (empty($object->entity)) {
  1438. print $langs->trans("AllEntities");
  1439. } else {
  1440. $mc->getInfo($object->entity);
  1441. print $mc->label;
  1442. }
  1443. print "</td></tr>\n";
  1444. }
  1445. }
  1446. }
  1447. // Other attributes
  1448. include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php';
  1449. // Company / Contact
  1450. if (! empty($conf->societe->enabled))
  1451. {
  1452. print '<tr><td>'.$langs->trans("LinkToCompanyContact").'</td>';
  1453. print '<td>';
  1454. if (isset($object->socid) && $object->socid > 0)
  1455. {
  1456. $societe = new Societe($db);
  1457. $societe->fetch($object->socid);
  1458. print $societe->getNomUrl(1,'');
  1459. }
  1460. else
  1461. {
  1462. print $langs->trans("ThisUserIsNot");
  1463. }
  1464. if (! empty($object->contactid))
  1465. {
  1466. $contact = new Contact($db);
  1467. $contact->fetch($object->contactid);
  1468. if ($object->socid > 0) print ' / ';
  1469. else print '<br>';
  1470. print '<a href="'.DOL_URL_ROOT.'/contact/card.php?id='.$object->contactid.'">'.img_object($langs->trans("ShowContact"),'contact').' '.dol_trunc($contact->getFullName($langs),32).'</a>';
  1471. }
  1472. print '</td>';
  1473. print '</tr>'."\n";
  1474. }
  1475. // Module Adherent
  1476. if (! empty($conf->adherent->enabled))
  1477. {
  1478. $langs->load("members");
  1479. print '<tr><td>'.$langs->trans("LinkedToDolibarrMember").'</td>';
  1480. print '<td>';
  1481. if ($object->fk_member)
  1482. {
  1483. $adh=new Adherent($db);
  1484. $adh->fetch($object->fk_member);
  1485. $adh->ref=$adh->getFullname($langs); // Force to show login instead of id
  1486. print $adh->getNomUrl(1);
  1487. }
  1488. else
  1489. {
  1490. print $langs->trans("UserNotLinkedToMember");
  1491. }
  1492. print '</td>';
  1493. print '</tr>'."\n";
  1494. }
  1495. // Signature
  1496. print '<tr><td class="tdtop">'.$langs->trans('Signature').'</td><td>';
  1497. print dol_htmlentitiesbr($object->signature);
  1498. print "</td></tr>\n";
  1499. print "</table>\n";
  1500. print '</div>';
  1501. print '</div></div>';
  1502. print '<div style="clear:both"></div>';
  1503. dol_fiche_end();
  1504. /*
  1505. * Buttons actions
  1506. */
  1507. print '<div class="tabsAction">';
  1508. $parameters=array();
  1509. $reshook=$hookmanager->executeHooks('addMoreActionsButtons',$parameters,$object,$action); // Note that $action and $object may have been modified by hook
  1510. if (empty($reshook))
  1511. {
  1512. if (! empty($object->email))
  1513. {
  1514. $langs->load("mails");
  1515. print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&amp;action=presend&amp;mode=init#presend">'.$langs->trans('SendMail').'</a></div>';
  1516. }
  1517. else
  1518. {
  1519. $langs->load("mails");
  1520. print '<div class="inline-block divButAction"><a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("NoEMail")).'">'.$langs->trans('SendMail').'</a></div>';
  1521. }
  1522. if ($caneditfield && (empty($conf->multicompany->enabled) || ! $user->entity || ($object->entity == $conf->entity) || ($conf->global->MULTICOMPANY_TRANSVERSE_MODE && $conf->entity == 1)))
  1523. {
  1524. if (! empty($conf->global->MAIN_ONLY_LOGIN_ALLOWED))
  1525. {
  1526. print '<div class="inline-block divButAction"><a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("DisabledInMonoUserMode")).'">'.$langs->trans("Modify").'</a></div>';
  1527. }
  1528. else
  1529. {
  1530. print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&amp;action=edit">'.$langs->trans("Modify").'</a></div>';
  1531. }
  1532. }
  1533. elseif ($caneditpassword && ! $object->ldap_sid &&
  1534. (empty($conf->multicompany->enabled) || ! $user->entity || ($object->entity == $conf->entity) || ($conf->global->MULTICOMPANY_TRANSVERSE_MODE && $conf->entity == 1)))
  1535. {
  1536. print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&amp;action=edit">'.$langs->trans("EditPassword").'</a></div>';
  1537. }
  1538. // Si on a un gestionnaire de generation de mot de passe actif
  1539. if ($conf->global->USER_PASSWORD_GENERATED != 'none')
  1540. {
  1541. if ($object->statut == 0)
  1542. {
  1543. print '<div class="inline-block divButAction"><a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("UserDisabled")).'">'.$langs->trans("ReinitPassword").'</a></div>';
  1544. }
  1545. elseif (($user->id != $id && $caneditpassword) && $object->login && !$object->ldap_sid &&
  1546. ((empty($conf->multicompany->enabled) && $object->entity == $user->entity) || ! $user->entity || ($object->entity == $conf->entity) || ($conf->global->MULTICOMPANY_TRANSVERSE_MODE && $conf->entity == 1)))
  1547. {
  1548. print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&amp;action=password">'.$langs->trans("ReinitPassword").'</a></div>';
  1549. }
  1550. if ($object->statut == 0)
  1551. {
  1552. print '<div class="inline-block divButAction"><a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("UserDisabled")).'">'.$langs->trans("SendNewPassword").'</a></div>';
  1553. }
  1554. else if (($user->id != $id && $caneditpassword) && $object->login && !$object->ldap_sid &&
  1555. ((empty($conf->multicompany->enabled) && $object->entity == $user->entity) || ! $user->entity || ($object->entity == $conf->entity) || ($conf->global->MULTICOMPANY_TRANSVERSE_MODE && $conf->entity == 1)))
  1556. {
  1557. if ($object->email) print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&amp;action=passwordsend">'.$langs->trans("SendNewPassword").'</a></div>';
  1558. else print '<div class="inline-block divButAction"><a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("NoEMail")).'">'.$langs->trans("SendNewPassword").'</a></div>';
  1559. }
  1560. }
  1561. // Activer
  1562. if ($user->id <> $id && $candisableuser && $object->statut == 0 &&
  1563. ((empty($conf->multicompany->enabled) && $object->entity == $user->entity) || ! $user->entity || ($object->entity == $conf->entity) || ($conf->global->MULTICOMPANY_TRANSVERSE_MODE && $conf->entity == 1)))
  1564. {
  1565. print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&amp;action=enable">'.$langs->trans("Reactivate").'</a></div>';
  1566. }
  1567. // Desactiver
  1568. if ($user->id <> $id && $candisableuser && $object->statut == 1 &&
  1569. ((empty($conf->multicompany->enabled) && $object->entity == $user->entity) || ! $user->entity || ($object->entity == $conf->entity) || ($conf->global->MULTICOMPANY_TRANSVERSE_MODE && $conf->entity == 1)))
  1570. {
  1571. print '<div class="inline-block divButAction"><a class="butActionDelete" href="'.$_SERVER['PHP_SELF'].'?action=disable&amp;id='.$object->id.'">'.$langs->trans("DisableUser").'</a></div>';
  1572. }
  1573. // Delete
  1574. if ($user->id <> $id && $candisableuser &&
  1575. ((empty($conf->multicompany->enabled) && $object->entity == $user->entity) || ! $user->entity || ($object->entity == $conf->entity) || ($conf->global->MULTICOMPANY_TRANSVERSE_MODE && $conf->entity == 1)))
  1576. {
  1577. if ($user->admin || ! $object->admin) // If user edited is admin, delete is possible on for an admin
  1578. {
  1579. print '<div class="inline-block divButAction"><a class="butActionDelete" href="'.$_SERVER['PHP_SELF'].'?action=delete&amp;id='.$object->id.'">'.$langs->trans("DeleteUser").'</a></div>';
  1580. }
  1581. else
  1582. {
  1583. print '<div class="inline-block divButAction"><a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("MustBeAdminToDeleteOtherAdmin")).'">'.$langs->trans("DeleteUser").'</a></div>';
  1584. }
  1585. }
  1586. }
  1587. print "</div>\n";
  1588. //Select mail models is same action as presend
  1589. if (GETPOST('modelselected')) $action = 'presend';
  1590. // Presend form
  1591. $modelmail='user';
  1592. $defaulttopic='Information';
  1593. $diroutput = $conf->user->dir_output;
  1594. $trackid = 'use'.$object->id;
  1595. include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
  1596. if ($action != 'presend' && $action != 'send')
  1597. {
  1598. /*
  1599. * List of groups of user
  1600. */
  1601. if ($canreadgroup)
  1602. {
  1603. print load_fiche_titre($langs->trans("ListOfGroupsForUser"),'','');
  1604. // On selectionne les groupes auquel fait parti le user
  1605. $exclude = array();
  1606. $usergroup=new UserGroup($db);
  1607. $groupslist = $usergroup->listGroupsForUser($object->id);
  1608. if (! empty($groupslist))
  1609. {
  1610. foreach($groupslist as $groupforuser)
  1611. {
  1612. $exclude[]=$groupforuser->id;
  1613. }
  1614. }
  1615. if ($caneditgroup)
  1616. {
  1617. print '<form action="'.$_SERVER['PHP_SELF'].'?id='.$id.'" method="POST">'."\n";
  1618. print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'" />';
  1619. print '<input type="hidden" name="action" value="addgroup" />';
  1620. }
  1621. print '<table class="noborder" width="100%">'."\n";
  1622. // Other form for add user to group
  1623. $parameters=array('caneditgroup' => $caneditgroup, 'groupslist' => $groupslist, 'exclude' => $exclude);
  1624. $reshook=$hookmanager->executeHooks('formAddUserToGroup',$parameters,$object,$action); // Note that $action and $object may have been modified by hook
  1625. print $hookmanager->resPrint;
  1626. if (empty($reshook))
  1627. {
  1628. print '<tr class="liste_titre"><th class="liste_titre">'.$langs->trans("Groups").'</th>'."\n";
  1629. print '<th class="liste_titre" align="right">';
  1630. if ($caneditgroup)
  1631. {
  1632. print $form->select_dolgroups('', 'group', 1, $exclude, 0, '', '', $object->entity);
  1633. print ' &nbsp; ';
  1634. print '<input type="hidden" name="entity" value="'.$conf->entity.'" />';
  1635. print '<input type="submit" class="button" value="'.$langs->trans("Add").'" />';
  1636. }
  1637. print '</th></tr>'."\n";
  1638. /*
  1639. * Groups assigned to user
  1640. */
  1641. if (! empty($groupslist))
  1642. {
  1643. foreach($groupslist as $group)
  1644. {
  1645. print '<tr class="oddeven">';
  1646. print '<td>';
  1647. if ($caneditgroup)
  1648. {
  1649. print '<a href="'.DOL_URL_ROOT.'/user/group/card.php?id='.$group->id.'">'.img_object($langs->trans("ShowGroup"),"group").' '.$group->name.'</a>';
  1650. }
  1651. else
  1652. {
  1653. print img_object($langs->trans("ShowGroup"),"group").' '.$group->name;
  1654. }
  1655. print '</td>';
  1656. print '<td align="right">';
  1657. if ($caneditgroup)
  1658. {
  1659. print '<a href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&amp;action=removegroup&amp;group='.$group->id.'">';
  1660. print img_picto($langs->trans("RemoveFromGroup"), 'unlink');
  1661. print '</a>';
  1662. }
  1663. else
  1664. {
  1665. print "&nbsp;";
  1666. }
  1667. print "</td></tr>\n";
  1668. }
  1669. }
  1670. else
  1671. {
  1672. print '<tr class="oddeven"><td colspan="3" class="opacitymedium">'.$langs->trans("None").'</td></tr>';
  1673. }
  1674. }
  1675. print "</table>";
  1676. if ($caneditgroup)
  1677. {
  1678. print '</form>';
  1679. }
  1680. print "<br>";
  1681. }
  1682. }
  1683. }
  1684. /*
  1685. * Fiche en mode edition
  1686. */
  1687. if ($action == 'edit' && ($canedituser || $caneditfield || $caneditpassword || ($user->id == $object->id)))
  1688. {
  1689. print '<form action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'" method="POST" name="updateuser" enctype="multipart/form-data">';
  1690. print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
  1691. print '<input type="hidden" name="action" value="update">';
  1692. print '<input type="hidden" name="entity" value="'.$object->entity.'">';
  1693. dol_fiche_head($head, 'user', $title, 0, 'user');
  1694. print '<table width="100%" class="border">';
  1695. // Ref/ID
  1696. if (! empty($conf->global->MAIN_SHOW_TECHNICAL_ID))
  1697. {
  1698. print '<tr><td class="titlefield">'.$langs->trans("Ref").'</td>';
  1699. print '<td>';
  1700. print $object->id;
  1701. print '</td>';
  1702. print '</tr>';
  1703. }
  1704. // Lastname
  1705. print "<tr>";
  1706. print '<td class="titlefield fieldrequired">'.$langs->trans("Lastname").'</td>';
  1707. print '<td>';
  1708. if ($caneditfield && !$object->ldap_sid)
  1709. {
  1710. print '<input class="minwidth100" type="text" class="flat" name="lastname" value="'.$object->lastname.'">';
  1711. }
  1712. else
  1713. {
  1714. print '<input type="hidden" name="lastname" value="'.$object->lastname.'">';
  1715. print $object->lastname;
  1716. }
  1717. print '</td>';
  1718. print '</tr>';
  1719. // Firstname
  1720. print "<tr>".'<td>'.$langs->trans("Firstname").'</td>';
  1721. print '<td>';
  1722. if ($caneditfield && !$object->ldap_sid)
  1723. {
  1724. print '<input class="minwidth100" type="text" class="flat" name="firstname" value="'.$object->firstname.'">';
  1725. }
  1726. else
  1727. {
  1728. print '<input type="hidden" name="firstname" value="'.$object->firstname.'">';
  1729. print $object->firstname;
  1730. }
  1731. print '</td></tr>';
  1732. // Login
  1733. print "<tr>".'<td><span class="fieldrequired">'.$langs->trans("Login").'</span></td>';
  1734. print '<td>';
  1735. if ($user->admin && !$object->ldap_sid)
  1736. {
  1737. print '<input size="12" maxlength="24" type="text" class="flat" name="login" value="'.$object->login.'">';
  1738. }
  1739. else
  1740. {
  1741. print '<input type="hidden" name="login" value="'.$object->login.'">';
  1742. print $object->login;
  1743. }
  1744. print '</td>';
  1745. print '</tr>';
  1746. // Pass
  1747. print '<tr><td>'.$langs->trans("Password").'</td>';
  1748. print '<td>';
  1749. $valuetoshow='';
  1750. if (preg_match('/ldap/',$dolibarr_main_authentication))
  1751. {
  1752. $valuetoshow.=($valuetoshow?(' '.$langs->trans("or").' '):'').$langs->trans("PasswordOfUserInLDAP");
  1753. }
  1754. if (preg_match('/http/',$dolibarr_main_authentication))
  1755. {
  1756. $valuetoshow.=($valuetoshow?(' '.$langs->trans("or").' '):'').$form->textwithpicto($text,$langs->trans("DolibarrInHttpAuthenticationSoPasswordUseless",$dolibarr_main_authentication),1,'warning');
  1757. }
  1758. if (preg_match('/dolibarr/',$dolibarr_main_authentication))
  1759. {
  1760. if ($caneditpassword)
  1761. {
  1762. $valuetoshow.=($valuetoshow?(' '.$langs->trans("or").' '):'').'<input size="12" maxlength="32" type="password" class="flat" name="password" value="'.$object->pass.'" autocomplete="new-password">';
  1763. }
  1764. else
  1765. {
  1766. $valuetoshow.=($valuetoshow?(' '.$langs->trans("or").' '):'').preg_replace('/./i','*',$object->pass);
  1767. }
  1768. }
  1769. // Other form for user password
  1770. $parameters=array('valuetoshow' => $valuetoshow, 'caneditpassword' => $caneditpassword);
  1771. $reshook=$hookmanager->executeHooks('printUserPasswordField',$parameters,$object,$action); // Note that $action and $object may have been modified by hook
  1772. if ($reshook > 0) $valuetoshow=$hookmanager->resPrint; // to replace
  1773. else $valuetoshow.=$hookmanager->resPrint; // to add
  1774. print $valuetoshow;
  1775. print "</td></tr>\n";
  1776. // API key
  1777. if(! empty($conf->api->enabled) && $user->admin)
  1778. {
  1779. print '<tr><td>'.$langs->trans("ApiKey").'</td>';
  1780. print '<td>';
  1781. print '<input class="minwidth300" maxsize="32" type="text" id="api_key" name="api_key" value="'.$object->api_key.'" autocomplete="off">';
  1782. if (! empty($conf->use_javascript_ajax))
  1783. print '&nbsp;'.img_picto($langs->trans('Generate'), 'refresh', 'id="generate_api_key" class="linkobject"');
  1784. print '</td></tr>';
  1785. }
  1786. // Administrator
  1787. print '<tr><td>'.$langs->trans("Administrator").'</td>';
  1788. if ($object->socid > 0)
  1789. {
  1790. $langs->load("admin");
  1791. print '<td>';
  1792. print '<input type="hidden" name="admin" value="'.$object->admin.'">'.yn($object->admin);
  1793. print ' ('.$langs->trans("ExternalUser").')';
  1794. print '</td></tr>';
  1795. }
  1796. else
  1797. {
  1798. print '<td>';
  1799. $nbAdmin = $user->getNbOfUsers('active','',1);
  1800. $nbSuperAdmin = $user->getNbOfUsers('active','superadmin',1);
  1801. //var_dump($nbAdmin);
  1802. //var_dump($nbSuperAdmin);
  1803. if ($user->admin // Need to be admin to allow downgrade of an admin
  1804. && ($user->id != $object->id) // Don't downgrade ourself
  1805. && (
  1806. (empty($conf->multicompany->enabled) && $nbAdmin >= 1)
  1807. || (! empty($conf->multicompany->enabled) && ($object->entity > 0 || $nbSuperAdmin > 1)) // Don't downgrade a superadmin if alone
  1808. )
  1809. )
  1810. {
  1811. print $form->selectyesno('admin',$object->admin,1);
  1812. if (! empty($conf->multicompany->enabled) && ! $user->entity && empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE))
  1813. {
  1814. if ($conf->use_javascript_ajax)
  1815. {
  1816. print '<script type="text/javascript">
  1817. $(function() {
  1818. var admin = $("select[name=admin]").val();
  1819. if (admin == 0) {
  1820. $("input[name=superadmin]")
  1821. .prop("disabled", true)
  1822. .prop("checked", false);
  1823. }
  1824. if ($("input[name=superadmin]").is(":checked")) {
  1825. $("select[name=entity]")
  1826. .prop("disabled", true);
  1827. }
  1828. $("select[name=admin]").change(function() {
  1829. if ( $(this).val() == 0 ) {
  1830. $("input[name=superadmin]")
  1831. .prop("disabled", true)
  1832. .prop("checked", false);
  1833. $("select[name=entity]")
  1834. .prop("disabled", false);
  1835. } else {
  1836. $("input[name=superadmin]")
  1837. .prop("disabled", false);
  1838. }
  1839. });
  1840. $("input[name=superadmin]").change(function() {
  1841. if ( $(this).is(":checked")) {
  1842. $("select[name=entity]")
  1843. .prop("disabled", true);
  1844. } else {
  1845. $("select[name=entity]")
  1846. .prop("disabled", false);
  1847. }
  1848. });
  1849. });
  1850. </script>';
  1851. }
  1852. $checked=(($object->admin && ! $object->entity) ? ' checked' : '');
  1853. print '<input type="checkbox" name="superadmin" value="1"'.$checked.' /> '.$langs->trans("SuperAdministrator");
  1854. }
  1855. }
  1856. else
  1857. {
  1858. $yn = yn($object->admin);
  1859. print '<input type="hidden" name="admin" value="'.$object->admin.'">';
  1860. print '<input type="hidden" name="superadmin" value="'.(empty($object->entity) ? 1 : 0).'">';
  1861. if (! empty($conf->multicompany->enabled) && empty($object->entity)) print $form->textwithpicto($yn,$langs->trans("DontDowngradeSuperAdmin"),1,'warning');
  1862. else print $yn;
  1863. }
  1864. print '</td></tr>';
  1865. }
  1866. // Type
  1867. print '<tr><td>'.$langs->trans("Type").'</td>';
  1868. print '<td>';
  1869. if ($user->id == $object->id || ! $user->admin)
  1870. {
  1871. $type=$langs->trans("Internal");
  1872. if ($object->socid) $type=$langs->trans("External");
  1873. print $form->textwithpicto($type,$langs->trans("InternalExternalDesc"));
  1874. if ($object->ldap_sid) print ' ('.$langs->trans("DomainUser").')';
  1875. }
  1876. else
  1877. {
  1878. $type=0;
  1879. if ($object->contactid) $type=$object->contactid;
  1880. print $form->selectcontacts(0,$type,'contactid',2,'','',1,'',false,1);
  1881. if ($object->ldap_sid) print ' ('.$langs->trans("DomainUser").')';
  1882. }
  1883. print '</td></tr>';
  1884. // Gender
  1885. print '<tr><td>'.$langs->trans("Gender").'</td>';
  1886. print '<td>';
  1887. $arraygender=array('man'=>$langs->trans("Genderman"),'woman'=>$langs->trans("Genderwoman"));
  1888. print $form->selectarray('gender', $arraygender, GETPOST('gender')?GETPOST('gender'):$object->gender, 1);
  1889. print '</td></tr>';
  1890. // Employee
  1891. print '<tr>';
  1892. print '<td>'.fieldLabel('Employee','employee',0).'</td><td>';
  1893. if ($caneditfield)
  1894. {
  1895. print $form->selectyesno("employee",$object->employee,1);
  1896. }else{
  1897. if ($object->employee){
  1898. print $langs->trans("Yes");
  1899. }else{
  1900. print $langs->trans("No");
  1901. }
  1902. }
  1903. print '</td></tr>';
  1904. // Hierarchy
  1905. print '<tr><td class="titlefield">'.$langs->trans("HierarchicalResponsible").'</td>';
  1906. print '<td>';
  1907. if ($caneditfield)
  1908. {
  1909. print $form->select_dolusers($object->fk_user, 'fk_user', 1, array($object->id), 0, '', 0, $object->entity, 0, 0, '', 0, '', 'maxwidth300');
  1910. }
  1911. else
  1912. {
  1913. print '<input type="hidden" name="fk_user" value="'.$object->fk_user.'">';
  1914. $huser=new User($db);
  1915. $huser->fetch($object->fk_user);
  1916. print $huser->getNomUrl(1);
  1917. }
  1918. print '</td>';
  1919. print "</tr>\n";
  1920. print '</table><hr><table class="border centpercent">';
  1921. // Address
  1922. print '<tr><td class="tdtop titlefield">'.fieldLabel('Address','address').'</td>';
  1923. print '<td><textarea name="address" id="address" class="quatrevingtpercent" rows="3" wrap="soft">';
  1924. print $object->address;
  1925. print '</textarea></td></tr>';
  1926. // Zip
  1927. print '<tr><td>'.fieldLabel('Zip','zipcode').'</td><td>';
  1928. print $formcompany->select_ziptown($object->zip, 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6);
  1929. print '</td></tr>';
  1930. // Town
  1931. print '<tr><td>'.fieldLabel('Town','town').'</td><td>';
  1932. print $formcompany->select_ziptown($object->town, 'town', array('zipcode', 'selectcountry_id', 'state_id'));
  1933. print '</td></tr>';
  1934. // Country
  1935. print '<tr><td>'.fieldLabel('Country','selectcounty_id').'</td><td>';
  1936. print $form->select_country((GETPOST('country_id')!=''?GETPOST('country_id'):$object->country_id),'country_id');
  1937. if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1);
  1938. print '</td></tr>';
  1939. // State
  1940. if (empty($conf->global->USER_DISABLE_STATE))
  1941. {
  1942. print '<tr><td class="tdoverflow">'.fieldLabel('State','state_id').'</td><td>';
  1943. print $formcompany->select_state($object->state_id,$object->country_code, 'state_id');
  1944. print '</td></tr>';
  1945. }
  1946. // Tel pro
  1947. print "<tr>".'<td>'.$langs->trans("PhonePro").'</td>';
  1948. print '<td>';
  1949. if ($caneditfield && empty($object->ldap_sid))
  1950. {
  1951. print '<input size="20" type="text" name="office_phone" class="flat" value="'.$object->office_phone.'">';
  1952. }
  1953. else
  1954. {
  1955. print '<input type="hidden" name="office_phone" value="'.$object->office_phone.'">';
  1956. print $object->office_phone;
  1957. }
  1958. print '</td></tr>';
  1959. // Tel mobile
  1960. print "<tr>".'<td>'.$langs->trans("PhoneMobile").'</td>';
  1961. print '<td>';
  1962. if ($caneditfield && empty($object->ldap_sid))
  1963. {
  1964. print '<input size="20" type="text" name="user_mobile" class="flat" value="'.$object->user_mobile.'">';
  1965. }
  1966. else
  1967. {
  1968. print '<input type="hidden" name="user_mobile" value="'.$object->user_mobile.'">';
  1969. print $object->user_mobile;
  1970. }
  1971. print '</td></tr>';
  1972. // Fax
  1973. print "<tr>".'<td>'.$langs->trans("Fax").'</td>';
  1974. print '<td>';
  1975. if ($caneditfield && empty($object->ldap_sid))
  1976. {
  1977. print '<input size="20" type="text" name="office_fax" class="flat" value="'.$object->office_fax.'">';
  1978. }
  1979. else
  1980. {
  1981. print '<input type="hidden" name="office_fax" value="'.$object->office_fax.'">';
  1982. print $object->office_fax;
  1983. }
  1984. print '</td></tr>';
  1985. // Skype
  1986. if (! empty($conf->socialnetworks->enabled))
  1987. {
  1988. print '<tr><td>'.$langs->trans("Skype").'</td>';
  1989. print '<td>';
  1990. if ($caneditfield && empty($object->ldap_sid))
  1991. {
  1992. print '<input size="40" type="text" name="skype" class="flat" value="'.$object->skype.'">';
  1993. }
  1994. else
  1995. {
  1996. print '<input type="hidden" name="skype" value="'.$object->skype.'">';
  1997. print $object->skype;
  1998. }
  1999. print '</td></tr>';
  2000. }
  2001. // Twitter
  2002. if (! empty($conf->socialnetworks->enabled))
  2003. {
  2004. print '<tr><td>'.$langs->trans("Twitter").'</td>';
  2005. print '<td>';
  2006. if ($caneditfield && empty($object->ldap_sid))
  2007. {
  2008. print '<input size="40" type="text" name="twitter" class="flat" value="'.$object->twitter.'">';
  2009. }
  2010. else
  2011. {
  2012. print '<input type="hidden" name="twitter" value="'.$object->twitter.'">';
  2013. print $object->twitter;
  2014. }
  2015. print '</td></tr>';
  2016. }
  2017. // Skype
  2018. if (! empty($conf->socialnetworks->enabled))
  2019. {
  2020. print '<tr><td>'.$langs->trans("Facebook").'</td>';
  2021. print '<td>';
  2022. if ($caneditfield && empty($object->ldap_sid))
  2023. {
  2024. print '<input size="40" type="text" name="facebook" class="flat" value="'.$object->facebook.'">';
  2025. }
  2026. else
  2027. {
  2028. print '<input type="hidden" name="facebook" value="'.$object->facebook.'">';
  2029. print $object->facebook;
  2030. }
  2031. print '</td></tr>';
  2032. }
  2033. // EMail
  2034. print "<tr>".'<td'.(! empty($conf->global->USER_MAIL_REQUIRED)?' class="fieldrequired"':'').'>'.$langs->trans("EMail").'</td>';
  2035. print '<td>';
  2036. if ($caneditfield && empty($object->ldap_sid))
  2037. {
  2038. print '<input class="minwidth100" type="text" name="email" class="flat" value="'.$object->email.'">';
  2039. }
  2040. else
  2041. {
  2042. print '<input type="hidden" name="email" value="'.$object->email.'">';
  2043. print $object->email;
  2044. }
  2045. print '</td></tr>';
  2046. // OpenID url
  2047. if (isset($conf->file->main_authentication) && preg_match('/openid/',$conf->file->main_authentication) && ! empty($conf->global->MAIN_OPENIDURL_PERUSER))
  2048. {
  2049. print "<tr>".'<td>'.$langs->trans("OpenIDURL").'</td>';
  2050. print '<td>';
  2051. if ($caneditfield)
  2052. {
  2053. print '<input class="minwidth100" type="url" name="openid" class="flat" value="'.$object->openid.'">';
  2054. }
  2055. else
  2056. {
  2057. print '<input type="hidden" name="openid" value="'.$object->openid.'">';
  2058. print $object->openid;
  2059. }
  2060. print '</td></tr>';
  2061. }
  2062. print '</table><hr><table class="border centpercent">';
  2063. // Accountancy code
  2064. if ($conf->accounting->enabled)
  2065. {
  2066. print "<tr>";
  2067. print '<td>'.$langs->trans("AccountancyCode").'</td>';
  2068. print '<td>';
  2069. if ($caneditfield)
  2070. {
  2071. print '<input size="30" type="text" class="flat" name="accountancy_code" value="'.$object->accountancy_code.'">';
  2072. }
  2073. else
  2074. {
  2075. print '<input type="hidden" name="accountancy_code" value="'.$object->accountancy_code.'">';
  2076. print $object->accountancy_code;
  2077. }
  2078. print '</td>';
  2079. print "</tr>";
  2080. }
  2081. // User color
  2082. if (! empty($conf->agenda->enabled))
  2083. {
  2084. print '<tr><td>'.$langs->trans("ColorUser").'</td>';
  2085. print '<td>';
  2086. if ($caneditfield)
  2087. {
  2088. print $formother->selectColor(GETPOST('color')?GETPOST('color'):$object->color, 'color', null, 1, '', 'hideifnotset');
  2089. }else{
  2090. print $formother->showColor($object->color, '');
  2091. }
  2092. print '</td></tr>';
  2093. }
  2094. // Photo
  2095. print '<tr>';
  2096. print '<td>'.$langs->trans("Photo").'</td>';
  2097. print '<td>';
  2098. print $form->showphoto('userphoto',$object,60,0,$caneditfield,'photowithmargin','small');
  2099. print '</td>';
  2100. print '</tr>';
  2101. // Categories
  2102. if (!empty( $conf->categorie->enabled ) && !empty( $user->rights->categorie->lire ))
  2103. {
  2104. print '<tr><td>' . fieldLabel( 'Categories', 'usercats' ) . '</td>';
  2105. print '<td>';
  2106. $cate_arbo = $form->select_all_categories( Categorie::TYPE_USER, null, null, null, null, 1 );
  2107. $c = new Categorie( $db );
  2108. $cats = $c->containing($object->id, Categorie::TYPE_USER);
  2109. foreach ($cats as $cat) {
  2110. $arrayselected[] = $cat->id;
  2111. }
  2112. if ($caneditfield)
  2113. {
  2114. print $form->multiselectarray( 'usercats', $cate_arbo, $arrayselected, '', 0, '', 0, '90%' );
  2115. }else{
  2116. print $form->showCategories( $object->id, 'user', 1 );
  2117. }
  2118. print "</td></tr>";
  2119. }
  2120. // Status
  2121. print '<tr><td>'.$langs->trans("Status").'</td>';
  2122. print '<td>';
  2123. print $object->getLibStatut(4);
  2124. print '</td></tr>';
  2125. // Company / Contact
  2126. if (! empty($conf->societe->enabled))
  2127. {
  2128. print '<tr><td width="25%">'.$langs->trans("LinkToCompanyContact").'</td>';
  2129. print '<td>';
  2130. if ($object->socid > 0)
  2131. {
  2132. $societe = new Societe($db);
  2133. $societe->fetch($object->socid);
  2134. print $societe->getNomUrl(1,'');
  2135. if ($object->contactid)
  2136. {
  2137. $contact = new Contact($db);
  2138. $contact->fetch($object->contactid);
  2139. print ' / <a href="'.DOL_URL_ROOT.'/contact/card.php?id='.$object->contactid.'">'.img_object($langs->trans("ShowContact"),'contact').' '.dol_trunc($contact->getFullName($langs),32).'</a>';
  2140. }
  2141. }
  2142. else
  2143. {
  2144. print $langs->trans("ThisUserIsNot");
  2145. }
  2146. print ' ('.$langs->trans("UseTypeFieldToChange").')';
  2147. print '</td>';
  2148. print "</tr>\n";
  2149. }
  2150. // Module Adherent
  2151. if (! empty($conf->adherent->enabled))
  2152. {
  2153. $langs->load("members");
  2154. print '<tr><td width="25%">'.$langs->trans("LinkedToDolibarrMember").'</td>';
  2155. print '<td>';
  2156. if ($object->fk_member)
  2157. {
  2158. $adh=new Adherent($db);
  2159. $adh->fetch($object->fk_member);
  2160. $adh->ref=$adh->login; // Force to show login instead of id
  2161. print $adh->getNomUrl(1);
  2162. }
  2163. else
  2164. {
  2165. print $langs->trans("UserNotLinkedToMember");
  2166. }
  2167. print '</td>';
  2168. print "</tr>\n";
  2169. }
  2170. // Multicompany
  2171. // TODO check if user not linked with the current entity before change entity (thirdparty, invoice, etc.) !!
  2172. if (! empty($conf->multicompany->enabled) && is_object($mc))
  2173. {
  2174. // This is now done with hook formObjectOptions. Keep this code for backward compatibility with old multicompany module
  2175. if (! method_exists($mc, 'formObjectOptions'))
  2176. {
  2177. if (empty($conf->multicompany->transverse_mode) && $conf->entity == 1 && $user->admin && ! $user->entity)
  2178. {
  2179. print "<tr>".'<td>'.$langs->trans("Entity").'</td>';
  2180. print "<td>".$mc->select_entities($object->entity, 'entity', '', 0, 1); // last parameter 1 means, show also a choice 0=>'all entities'
  2181. print "</td></tr>\n";
  2182. }
  2183. else
  2184. {
  2185. print '<input type="hidden" name="entity" value="'.$conf->entity.'" />';
  2186. }
  2187. }
  2188. }
  2189. // Other attributes
  2190. $parameters=array('colspan' => ' colspan="2"');
  2191. $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$object,$action); // Note that $action and $object may have been modified by hook
  2192. print $hookmanager->resPrint;
  2193. if (empty($reshook))
  2194. {
  2195. if ($caneditfield)
  2196. {
  2197. print $object->showOptionals($extrafields,'edit');
  2198. }else{
  2199. print $object->showOptionals($extrafields,'view');
  2200. }
  2201. }
  2202. // Signature
  2203. print "<tr>".'<td class="tdtop">'.$langs->trans("Signature").'</td>';
  2204. print '<td>';
  2205. if ($caneditfield)
  2206. {
  2207. require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
  2208. $doleditor=new DolEditor('signature',$object->signature,'',138,'dolibarr_notes','In',false,true,empty($conf->global->FCKEDITOR_ENABLE_USERSIGN)?0:1,ROWS_4,'90%');
  2209. print $doleditor->Create(1);
  2210. }
  2211. else
  2212. {
  2213. print dol_htmlentitiesbr($object->signature);
  2214. }
  2215. print '</td></tr>';
  2216. print '</table><hr><table class="border centpercent">';
  2217. // TODO Move this into tab RH (HierarchicalResponsible must be on both tab)
  2218. // Position/Job
  2219. print '<tr><td class="titlefield">'.$langs->trans("PostOrFunction").'</td>';
  2220. print '<td>';
  2221. if ($caneditfield)
  2222. {
  2223. print '<input size="30" type="text" name="job" value="'.$object->job.'">';
  2224. }
  2225. else
  2226. {
  2227. print '<input type="hidden" name="job" value="'.$object->job.'">';
  2228. print $object->job;
  2229. }
  2230. print '</td></tr>';
  2231. if ((! empty($conf->salaries->enabled) && ! empty($user->rights->salaries->read))
  2232. || (! empty($conf->hrm->enabled) && ! empty($user->rights->hrm->employee->read)))
  2233. {
  2234. $langs->load("salaries");
  2235. // THM
  2236. print '<tr><td>';
  2237. $text=$langs->trans("THM");
  2238. print $form->textwithpicto($text, $langs->trans("THMDescription"), 1, 'help', 'classthm');
  2239. print '</td>';
  2240. print '<td>';
  2241. if($caneditfield){
  2242. print '<input size="8" type="text" name="thm" value="'.price2num(GETPOST('thm')?GETPOST('thm'):$object->thm).'">';
  2243. }else{
  2244. print ($object->thm!=''?price($object->thm,'',$langs,1,-1,-1,$conf->currency):'');
  2245. }
  2246. print '</td>';
  2247. print "</tr>\n";
  2248. // TJM
  2249. print '<tr><td>';
  2250. $text=$langs->trans("TJM");
  2251. print $form->textwithpicto($text, $langs->trans("TJMDescription"), 1, 'help', 'classthm');
  2252. print '</td>';
  2253. print '<td>';
  2254. if($caneditfield)
  2255. {
  2256. print '<input size="8" type="text" name="tjm" value="'.price2num(GETPOST('tjm')?GETPOST('tjm'):$object->tjm).'">';
  2257. }else{
  2258. print ($object->tjm!=''?price($object->tjm,'',$langs,1,-1,-1,$conf->currency):'');
  2259. }
  2260. print '</td>';
  2261. print "</tr>\n";
  2262. // Salary
  2263. print '<tr><td>'.$langs->trans("Salary").'</td>';
  2264. print '<td>';
  2265. print '<input size="8" type="text" name="salary" value="'.price2num(GETPOST('salary')?GETPOST('salary'):$object->salary).'">';
  2266. print '</td>';
  2267. print "</tr>\n";
  2268. }
  2269. // Weeklyhours
  2270. print '<tr><td>'.$langs->trans("WeeklyHours").'</td>';
  2271. print '<td>';
  2272. if($caneditfield)
  2273. {
  2274. print '<input size="8" type="text" name="weeklyhours" value="'.price2num(GETPOST('weeklyhours')?GETPOST('weeklyhours'):$object->weeklyhours).'">';
  2275. }else{
  2276. print price2num($object->weeklyhours);
  2277. }
  2278. print '</td>';
  2279. print "</tr>\n";
  2280. // Date employment
  2281. print '<tr><td>'.$langs->trans("DateEmployment").'</td>';
  2282. print '<td>';
  2283. if($caneditfield)
  2284. {
  2285. print $form->selectDate(GETPOST('dateemployment')?GETPOST('dateemployment'):$object->dateemployment, 'dateemployment', 0, 0, 1, 'formdateemployment', 1, 0);
  2286. }else{
  2287. print dol_print_date($object->dateemployment, 'day');
  2288. }
  2289. print '</td>';
  2290. print "</tr>\n";
  2291. // Date employmentEnd
  2292. print '<tr><td>'.$langs->trans("DateEmploymentEnd").'</td>';
  2293. print '<td>';
  2294. if($caneditfield)
  2295. {
  2296. print $form->selectDate(GETPOST('dateemploymentend')?GETPOST('dateemploymentend'):$object->dateemploymentend, 'dateemploymentend', 0, 0, 1, 'formdateemploymentend', 1, 0);
  2297. }else{
  2298. print dol_print_date($object->dateemploymentend, 'day');
  2299. }
  2300. print '</td>';
  2301. print "</tr>\n";
  2302. // Date birth
  2303. print '<tr><td>'.$langs->trans("DateToBirth").'</td>';
  2304. print '<td>';
  2305. if($caneditfield)
  2306. {
  2307. echo $form->selectDate(GETPOST('birth')?GETPOST('birth'):$object->birth, 'birth', 0, 0, 1, 'updateuser', 1, 0);
  2308. }else{
  2309. print dol_print_date($object->birth, 'day');
  2310. }
  2311. print '</td>';
  2312. print "</tr>\n";
  2313. print '</table>';
  2314. dol_fiche_end();
  2315. print '<div align="center">';
  2316. print '<input value="'.$langs->trans("Save").'" class="button" type="submit" name="save">';
  2317. print '&nbsp; &nbsp; &nbsp;';
  2318. print '<input value="'.$langs->trans("Cancel").'" class="button" type="submit" name="cancel">';
  2319. print '</div>';
  2320. print '</form>';
  2321. }
  2322. if ($action != 'edit' && $action != 'presend')
  2323. {
  2324. print '<div class="fichecenter"><div class="fichehalfleft">';
  2325. /*
  2326. * Documents generes
  2327. */
  2328. $filename = dol_sanitizeFileName($object->ref);
  2329. $filedir = $conf->user->dir_output . "/" . dol_sanitizeFileName($object->ref);
  2330. $urlsource = $_SERVER["PHP_SELF"] . "?id=" . $object->id;
  2331. $genallowed = $user->rights->user->user->lire;
  2332. $delallowed = $user->rights->user->user->creer;
  2333. print $formfile->showdocuments('user', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 1, 0, 0, 28, 0, '', 0, '', $soc->default_lang);
  2334. $somethingshown = $formfile->numoffiles;
  2335. // Show links to link elements
  2336. $linktoelem = $form->showLinkToObjectBlock($object, null, null);
  2337. $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
  2338. print '</div><div class="fichehalfright"><div class="ficheaddleft">';
  2339. // List of actions on element
  2340. include_once DOL_DOCUMENT_ROOT . '/core/class/html.formactions.class.php';
  2341. $formactions = new FormActions($db);
  2342. $somethingshown = $formactions->showactions($object, 'user', $socid, 1);
  2343. print '</div></div></div>';
  2344. }
  2345. if (! empty($conf->ldap->enabled) && ! empty($object->ldap_sid)) $ldap->close();
  2346. }
  2347. }
  2348. if (! empty($conf->api->enabled) && ! empty($conf->use_javascript_ajax))
  2349. {
  2350. print "\n".'<script type="text/javascript">';
  2351. print '$(document).ready(function () {
  2352. $("#generate_api_key").click(function() {
  2353. $.get( "'.DOL_URL_ROOT.'/core/ajax/security.php", {
  2354. action: \'getrandompassword\',
  2355. generic: true
  2356. },
  2357. function(token) {
  2358. $("#api_key").val(token);
  2359. });
  2360. });
  2361. });';
  2362. print '</script>';
  2363. }
  2364. // End of page
  2365. llxFooter();
  2366. $db->close();