viewcat.php 53 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334
  1. <?php
  2. /* Copyright (C) 2005 Matthieu Valleton <mv@seeschloss.org>
  3. * Copyright (C) 2006-2020 Laurent Destailleur <eldy@users.sourceforge.net>
  4. * Copyright (C) 2007 Patrick Raguin <patrick.raguin@gmail.com>
  5. * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
  6. * Copyright (C) 2015 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
  7. * Copyright (C) 2020 Tobias Sekan <tobias.sekan@startmail.com>
  8. * Copyright (C) 2020 Josep Lluís Amador <joseplluis@lliuretic.cat>
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 3 of the License, or
  13. * (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with this program. If not, see <https://www.gnu.org/licenses/>.
  22. */
  23. /**
  24. * \file htdocs/categories/viewcat.php
  25. * \ingroup category
  26. * \brief Page to show a category card
  27. */
  28. // Load Dolibarr environment
  29. require '../main.inc.php';
  30. require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
  31. require_once DOL_DOCUMENT_ROOT.'/core/lib/categories.lib.php';
  32. require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
  33. require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
  34. // Load translation files required by the page
  35. $langs->loadLangs(array("categories", "compta"));
  36. $id = GETPOST('id', 'int');
  37. $label = GETPOST('label', 'alpha');
  38. $removeelem = GETPOST('removeelem', 'int');
  39. $elemid = GETPOST('elemid', 'int');
  40. $action = GETPOST('action', 'aZ09') ? GETPOST('action', 'aZ09') : 'view'; // The action 'add', 'create', 'edit', 'update', 'view', ...
  41. $massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
  42. $show_files = GETPOST('show_files', 'int'); // Show files area generated by bulk actions ?
  43. $confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
  44. $cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
  45. $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
  46. $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'categorylist'; // To manage different context of search
  47. $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
  48. $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
  49. // Load variable for pagination
  50. $limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
  51. $sortfield = GETPOST('sortfield', 'aZ09comma');
  52. $sortorder = GETPOST('sortorder', 'aZ09comma');
  53. $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
  54. if (empty($page) || $page == -1 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha') || (empty($toselect) && $massaction === '0')) {
  55. $page = 0;
  56. } // If $page is not defined, or '' or -1 or if we click on clear filters or if we select empty mass action
  57. $offset = $limit * $page;
  58. $pageprev = $page - 1;
  59. $pagenext = $page + 1;
  60. if ($id == "" && $label == "") {
  61. dol_print_error('', 'Missing parameter id');
  62. exit();
  63. }
  64. // Security check
  65. $result = restrictedArea($user, 'categorie', $id, '&category');
  66. $object = new Categorie($db);
  67. $result = $object->fetch($id, $label);
  68. if ($result <= 0) {
  69. dol_print_error($db, $object->error);
  70. exit;
  71. }
  72. $type = $object->type;
  73. if (is_numeric($type)) {
  74. $type = Categorie::$MAP_ID_TO_CODE[$type]; // For backward compatibility
  75. }
  76. $extrafields = new ExtraFields($db);
  77. $extrafields->fetch_name_optionals_label($object->table_element);
  78. // Initialize technical object to manage hooks. Note that conf->hooks_modules contains array array
  79. $hookmanager->initHooks(array('categorycard', 'globalcard'));
  80. /*
  81. * Actions
  82. */
  83. if ($confirm == 'no') {
  84. if ($backtopage) {
  85. header("Location: ".$backtopage);
  86. exit;
  87. }
  88. }
  89. $parameters = array();
  90. $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
  91. // Remove element from category
  92. if ($id > 0 && $removeelem > 0 && $action == 'unlink') {
  93. if ($type == Categorie::TYPE_PRODUCT && ($user->hasRight('produit', 'creer') || $user->hasRight('service', 'creer'))) {
  94. require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
  95. $tmpobject = new Product($db);
  96. $result = $tmpobject->fetch($removeelem);
  97. $elementtype = 'product';
  98. } elseif ($type == Categorie::TYPE_SUPPLIER && $user->hasRight('societe', 'creer')) {
  99. $tmpobject = new Societe($db);
  100. $result = $tmpobject->fetch($removeelem);
  101. $elementtype = 'supplier';
  102. } elseif ($type == Categorie::TYPE_CUSTOMER && $user->hasRight('societe', 'creer')) {
  103. $tmpobject = new Societe($db);
  104. $result = $tmpobject->fetch($removeelem);
  105. $elementtype = 'customer';
  106. } elseif ($type == Categorie::TYPE_MEMBER && $user->hasRight('adherent', 'creer')) {
  107. require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
  108. $tmpobject = new Adherent($db);
  109. $result = $tmpobject->fetch($removeelem);
  110. $elementtype = 'member';
  111. } elseif ($type == Categorie::TYPE_CONTACT && $user->hasRight('societe', 'creer')) {
  112. require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
  113. $tmpobject = new Contact($db);
  114. $result = $tmpobject->fetch($removeelem);
  115. $elementtype = 'contact';
  116. } elseif ($type == Categorie::TYPE_ACCOUNT && $user->hasRight('banque', 'configurer')) {
  117. require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
  118. $tmpobject = new Account($db);
  119. $result = $tmpobject->fetch($removeelem);
  120. $elementtype = 'account';
  121. } elseif ($type == Categorie::TYPE_PROJECT && $user->hasRight('projet', 'creer')) {
  122. require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
  123. $tmpobject = new Project($db);
  124. $result = $tmpobject->fetch($removeelem);
  125. $elementtype = 'project';
  126. } elseif ($type == Categorie::TYPE_USER && $user->hasRight('user', 'user', 'creer')) {
  127. require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
  128. $tmpobject = new User($db);
  129. $result = $tmpobject->fetch($removeelem);
  130. $elementtype = 'user';
  131. } elseif ($type == Categorie::TYPE_TICKET && $user->hasRight('ticket', 'write')) {
  132. require_once DOL_DOCUMENT_ROOT.'/ticket/class/ticket.class.php';
  133. $tmpobject = new Ticket($db);
  134. $result = $tmpobject->fetch($removeelem);
  135. $elementtype = 'ticket';
  136. }
  137. $result = $object->del_type($tmpobject, $elementtype);
  138. if ($result < 0) {
  139. dol_print_error('', $object->error);
  140. }
  141. }
  142. if ($user->hasRight('categorie', 'supprimer') && $action == 'confirm_delete' && $confirm == 'yes') {
  143. if ($object->delete($user) >= 0) {
  144. if ($backtopage) {
  145. header("Location: ".$backtopage);
  146. exit;
  147. } else {
  148. header("Location: ".DOL_URL_ROOT.'/categories/index.php?type='.$type);
  149. exit;
  150. }
  151. } else {
  152. setEventMessages($object->error, $object->errors, 'errors');
  153. }
  154. }
  155. if ($elemid && $action == 'addintocategory' &&
  156. (
  157. ($type == Categorie::TYPE_PRODUCT && ($user->hasRight('produit', 'creer') || $user->hasRight('service', 'creer'))) ||
  158. ($type == Categorie::TYPE_CUSTOMER && $user->hasRight('societe', 'creer')) ||
  159. ($type == Categorie::TYPE_SUPPLIER && $user->hasRight('societe', 'creer')) ||
  160. ($type == Categorie::TYPE_TICKET && $user->hasRight('ticket', 'write')) ||
  161. ($type == Categorie::TYPE_PROJECT && $user->hasRight('projet', 'creer')) ||
  162. ($type == Categorie::TYPE_MEMBER && $user->hasRight('adherent', 'creer')) ||
  163. ($type == Categorie::TYPE_CONTACT && $user->hasRight('societe', 'creer')) ||
  164. ($type == Categorie::TYPE_USER && $user->hasRight('user', 'user', 'creer')) ||
  165. ($type == Categorie::TYPE_ACCOUNT && $user->hasRight('banque', 'configurer'))
  166. )) {
  167. if ($type == Categorie::TYPE_PRODUCT) {
  168. require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
  169. $newobject = new Product($db);
  170. $elementtype = 'product';
  171. } elseif ($type == Categorie::TYPE_CUSTOMER) {
  172. require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
  173. $newobject = new Societe($db);
  174. $elementtype = 'customer';
  175. } elseif ($type == Categorie::TYPE_SUPPLIER) {
  176. require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
  177. $newobject = new Societe($db);
  178. $elementtype = 'supplier';
  179. } elseif ($type == Categorie::TYPE_TICKET) {
  180. require_once DOL_DOCUMENT_ROOT.'/ticket/class/ticket.class.php';
  181. $newobject = new Ticket($db);
  182. $elementtype = 'ticket';
  183. } elseif ($type == Categorie::TYPE_PROJECT) {
  184. require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
  185. $newobject = new Project($db);
  186. $elementtype = 'project';
  187. } elseif ($type == Categorie::TYPE_MEMBER) {
  188. require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
  189. $newobject = new Adherent($db);
  190. $elementtype = 'member';
  191. } elseif ($type == Categorie::TYPE_CONTACT) {
  192. require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
  193. $newobject = new Contact($db);
  194. $elementtype = 'contact';
  195. } elseif ($type == Categorie::TYPE_USER) {
  196. require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
  197. $newobject = new User($db);
  198. $elementtype = 'user';
  199. } elseif ($type == Categorie::TYPE_ACCOUNT) {
  200. require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
  201. $newobject = new Account($db);
  202. $elementtype = 'bank_account';
  203. } else {
  204. dol_print_error("Not supported value of type = ".$type);
  205. }
  206. $result = $newobject->fetch($elemid);
  207. // Add into category
  208. $result = $object->add_type($newobject, $elementtype);
  209. if ($result >= 0) {
  210. setEventMessages($langs->trans("WasAddedSuccessfully", $newobject->ref), null, 'mesgs');
  211. } else {
  212. if ($object->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') {
  213. setEventMessages($langs->trans("ObjectAlreadyLinkedToCategory"), null, 'warnings');
  214. } else {
  215. setEventMessages($object->error, $object->errors, 'errors');
  216. }
  217. }
  218. }
  219. /*
  220. * View
  221. */
  222. $form = new Form($db);
  223. $formother = new FormOther($db);
  224. $arrayofjs = array('/includes/jquery/plugins/jquerytreeview/jquery.treeview.js', '/includes/jquery/plugins/jquerytreeview/lib/jquery.cookie.js');
  225. $arrayofcss = array('/includes/jquery/plugins/jquerytreeview/jquery.treeview.css');
  226. $help_url = '';
  227. llxHeader("", $langs->trans("Categories"), $help_url, '', 0, 0, $arrayofjs, $arrayofcss);
  228. $title = Categorie::$MAP_TYPE_TITLE_AREA[$type];
  229. $head = categories_prepare_head($object, $type);
  230. print dol_get_fiche_head($head, 'card', $langs->trans($title), -1, 'category');
  231. $backtolist = (GETPOST('backtolist') ? GETPOST('backtolist') : DOL_URL_ROOT.'/categories/index.php?leftmenu=cat&type='.urlencode($type));
  232. $linkback = '<a href="'.dol_sanitizeUrl($backtolist).'">'.$langs->trans("BackToList").'</a>';
  233. $object->next_prev_filter = 'type = '.((int) $object->type);
  234. $object->ref = $object->label;
  235. $morehtmlref = '<br><div class="refidno"><a href="'.DOL_URL_ROOT.'/categories/index.php?leftmenu=cat&type='.urlencode($type).'">'.$langs->trans("Root").'</a> >> ';
  236. $ways = $object->print_all_ways(" &gt;&gt; ", '', 1);
  237. foreach ($ways as $way) {
  238. $morehtmlref .= $way."<br>\n";
  239. }
  240. $morehtmlref .= '</div>';
  241. dol_banner_tab($object, 'label', $linkback, ($user->socid ? 0 : 1), 'label', 'label', $morehtmlref, '&type='.urlencode($type), 0, '', '', 1);
  242. /*
  243. * Confirmation suppression
  244. */
  245. if ($action == 'delete') {
  246. if ($backtopage) {
  247. print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&type='.$type.'&backtopage='.urlencode($backtopage), $langs->trans('DeleteCategory'), $langs->trans('ConfirmDeleteCategory'), 'confirm_delete', '', '', 2);
  248. } else {
  249. print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&type='.$type, $langs->trans('DeleteCategory'), $langs->trans('ConfirmDeleteCategory'), 'confirm_delete', '', '', 1);
  250. }
  251. }
  252. print '<br>';
  253. print '<div class="fichecenter">';
  254. print '<div class="underbanner clearboth"></div>';
  255. print '<table class="border centpercent tableforfield">';
  256. // Description
  257. print '<tr><td class="titlefield notopnoleft tdtop">';
  258. print $langs->trans("Description").'</td><td>';
  259. print dol_htmlentitiesbr($object->description);
  260. print '</td></tr>';
  261. // Color
  262. print '<tr><td class="notopnoleft">';
  263. print $langs->trans("Color").'</td><td>';
  264. print $formother->showColor($object->color);
  265. print '</td></tr>';
  266. // Other attributes
  267. include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
  268. print '</table>';
  269. print '</div>';
  270. print dol_get_fiche_end();
  271. /*
  272. * Boutons actions
  273. */
  274. print "<div class='tabsAction'>\n";
  275. $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
  276. if ($reshook < 0) {
  277. setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
  278. }
  279. if (empty($reshook)) {
  280. if ($user->hasRight('categorie', 'creer')) {
  281. $socid = ($object->socid ? "&socid=".$object->socid : "");
  282. print '<a class="butAction" href="edit.php?id='.$object->id.$socid.'&type='.$type.'">'.$langs->trans("Modify").'</a>';
  283. }
  284. if ($user->hasRight('categorie', 'supprimer')) {
  285. print '<a class="butActionDelete" href="'.$_SERVER["PHP_SELF"].'?action=delete&token='.newToken().'&id='.$object->id.'&type='.$type.'&backtolist='.urlencode($backtolist).'">'.$langs->trans("Delete").'</a>';
  286. }
  287. }
  288. print "</div>";
  289. $newcardbutton = '';
  290. if ($user->hasRight('categorie', 'creer')) {
  291. $link = DOL_URL_ROOT.'/categories/card.php';
  292. $link .= '?action=create';
  293. $link .= '&type='.$type;
  294. $link .= '&catorigin='.$object->id;
  295. $link .= '&backtopage='.urlencode($_SERVER["PHP_SELF"].'?type='.$type.'&id='.$id);
  296. $newcardbutton = '<div class="right">';
  297. $newcardbutton .= dolGetButtonTitle($langs->trans('NewCategory'), '', 'fa fa-plus-circle', $link);
  298. $newcardbutton .= '</div>';
  299. }
  300. /*
  301. * Sub-category tree view of this category
  302. */
  303. print '<div class="fichecenter">';
  304. print load_fiche_titre($langs->trans("SubCats"), $newcardbutton, 'object_category');
  305. print '<table class="liste nohover centpercent borderbottom">';
  306. print '<tr class="liste_titre">';
  307. print '<td>'.$langs->trans("SubCats").'</td>';
  308. print '<td></td>';
  309. print '<td class="right">';
  310. if (!empty($conf->use_javascript_ajax)) {
  311. print '<div id="iddivjstreecontrol">';
  312. print '<a class="notasortlink" href="#">'.img_picto('', 'folder').' '.$langs->trans("UndoExpandAll").'</a>';
  313. print " | ";
  314. print '<a class="notasortlink" href="#">'.img_picto('', 'folder-open').' '.$langs->trans("ExpandAll").'</a>';
  315. print '</div>';
  316. }
  317. print '</td>';
  318. print '</tr>';
  319. $cats = $object->get_filles();
  320. if ($cats < 0) {
  321. dol_print_error($db, $object->error, $object->errors);
  322. } elseif (count($cats) < 1) {
  323. print '<tr class="oddeven nobottom">';
  324. print '<td colspan="3"><span class="opacitymedium">'.$langs->trans("NoSubCat").'</span></td>';
  325. print '</tr>';
  326. } else {
  327. $categstatic = new Categorie($db);
  328. $fulltree = $categstatic->get_full_arbo($type, $object->id, 1);
  329. // Load possible missing includes
  330. if (getDolGlobalString('CATEGORY_SHOW_COUNTS')) {
  331. if ($type == Categorie::TYPE_MEMBER) {
  332. require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
  333. }
  334. if ($type == Categorie::TYPE_ACCOUNT) {
  335. require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
  336. }
  337. if ($type == Categorie::TYPE_PROJECT) {
  338. require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
  339. }
  340. if ($type == Categorie::TYPE_USER) {
  341. require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
  342. }
  343. }
  344. // Define data (format for treeview)
  345. $data = array();
  346. $data[] = array('rowid'=>0, 'fk_menu'=>-1, 'title'=>"racine", 'mainmenu'=>'', 'leftmenu'=>'', 'fk_mainmenu'=>'', 'fk_leftmenu'=>'');
  347. foreach ($fulltree as $key => $val) {
  348. $categstatic->id = $val['id'];
  349. $categstatic->ref = $val['label'];
  350. $categstatic->color = $val['color'];
  351. $categstatic->type = $type;
  352. $desc = dol_htmlcleanlastbr($val['description']);
  353. $counter = '';
  354. if (getDolGlobalString('CATEGORY_SHOW_COUNTS')) {
  355. // we need only a count of the elements, so it is enough to consume only the id's from the database
  356. $elements = $categstatic->getObjectsInCateg($type, 1);
  357. $counter = "<td class='left' width='40px;'>".(is_array($elements) ? count($elements) : '0')."</td>";
  358. }
  359. $color = $categstatic->color ? ' style="background: #'.sprintf("%06s", $categstatic->color).';"' : ' style="background: #bbb"';
  360. $li = $categstatic->getNomUrl(1, '', 60, '&backtolist='.urlencode($_SERVER["PHP_SELF"].'?id='.$id.'&type='.$type));
  361. $entry = '<table class="nobordernopadding centpercent">';
  362. $entry .= '<tr>';
  363. $entry .= '<td>';
  364. $entry .= '<span class="noborderoncategories" '.$color.'>'.$li.'</span>';
  365. $entry .= '</td>';
  366. $entry .= $counter;
  367. $entry .= '<td class="right" width="20px;">';
  368. $entry .= '<a href="'.DOL_URL_ROOT.'/categories/viewcat.php?id='.$val['id'].'&type='.$type.'&backtolist='.urlencode($_SERVER["PHP_SELF"].'?id='.$id.'&type='.$type).'">'.img_view().'</a>';
  369. $entry .= '</td>';
  370. $entry .= '<td class="right" width="20px;">';
  371. $entry .= '<a class="editfielda" href="'.DOL_URL_ROOT.'/categories/edit.php?id='.$val['id'].'&type='.$type.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?id='.$id.'&type='.$type).'">'.img_edit().'</a>';
  372. $entry .= '</td>';
  373. $entry .= '<td class="right" width="20px;">';
  374. $entry .= '<a class="deletefilelink" href="'.DOL_URL_ROOT.'/categories/viewcat.php?action=delete&token='.newToken().'&id='.$val['id'].'&type='.$type.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?id='.$id.'&type='.$type).'&backtolist='.urlencode($_SERVER["PHP_SELF"].'?id='.$id.'&type='.$type).'">'.img_delete().'</a>';
  375. $entry .= '</td>';
  376. $entry .= '</tr>';
  377. $entry .= '</table>';
  378. $data[] = array('rowid' => $val['rowid'], 'fk_menu' => $val['fk_parent'], 'entry' => $entry);
  379. }
  380. $nbofentries = (count($data) - 1);
  381. if ($nbofentries > 0) {
  382. require_once DOL_DOCUMENT_ROOT.'/core/lib/treeview.lib.php';
  383. print '<tr class="pair">';
  384. print '<td colspan="3">';
  385. // $data[0] is the current shown category, to don'T show the current category use $data[1] instead
  386. tree_recur($data, $data[1], 0);
  387. print '</td>';
  388. print '</tr>';
  389. } else {
  390. print '<tr class="pair">';
  391. print '<td colspan="3">';
  392. print '<table class="nobordernopadding">';
  393. print '<tr class="nobordernopadding">';
  394. print '<td>'.img_picto_common('', 'treemenu/branchbottom.gif').'</td>';
  395. print '<td class="valignmiddle"><span class="opacitymedium">'.$langs->trans("NoCategoryYet").'</span></td>';
  396. print '<td>&nbsp;</td>';
  397. print '</tr>';
  398. print '</table>';
  399. print '</td>';
  400. print '</tr>';
  401. }
  402. }
  403. print "</table>";
  404. print "</div>";
  405. // List of mass actions available
  406. $arrayofmassactions = array(
  407. //'validate'=>$langs->trans("Validate"),
  408. //'generate_doc'=>$langs->trans("ReGeneratePDF"),
  409. //'builddoc'=>$langs->trans("PDFMerge"),
  410. //'presend'=>$langs->trans("SendByMail"),
  411. );
  412. $massactionbutton = $form->selectMassAction('', $arrayofmassactions);
  413. $typeid = $type;
  414. // List of products or services (type is type of category)
  415. if ($type == Categorie::TYPE_PRODUCT) {
  416. if ($user->hasRight("product", "read") || $user->hasRight("service", "read")) {
  417. $permission = ($user->hasRight('produit', 'creer') || $user->hasRight('service', 'creer'));
  418. $prods = $object->getObjectsInCateg($type, 0, $limit, $offset);
  419. if ($prods < 0) {
  420. dol_print_error($db, $object->error, $object->errors);
  421. } else {
  422. // Form to add record into the category
  423. $showclassifyform = 1;
  424. if ($showclassifyform) {
  425. print '<br>';
  426. print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
  427. print '<input type="hidden" name="token" value="'.newToken().'">';
  428. print '<input type="hidden" name="typeid" value="'.$typeid.'">';
  429. print '<input type="hidden" name="type" value="'.$typeid.'">';
  430. print '<input type="hidden" name="id" value="'.$object->id.'">';
  431. print '<input type="hidden" name="action" value="addintocategory">';
  432. print '<table class="noborder centpercent">';
  433. print '<tr class="liste_titre"><td>';
  434. print $langs->trans("AddProductServiceIntoCategory").' &nbsp;';
  435. $form->select_produits('', 'elemid', '', 0, 0, -1, 2, '', 1, array(), 0, 1, 0, '', 0, '', null);
  436. print '<input type="submit" class="button buttongen" value="'.$langs->trans("ClassifyInCategory").'"></td>';
  437. print '</tr>';
  438. print '</table>';
  439. print '</form>';
  440. }
  441. print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
  442. print '<input type="hidden" name="token" value="'.newToken().'">';
  443. print '<input type="hidden" name="typeid" value="'.$typeid.'">';
  444. print '<input type="hidden" name="type" value="'.$typeid.'">';
  445. print '<input type="hidden" name="id" value="'.$object->id.'">';
  446. print '<input type="hidden" name="action" value="list">';
  447. print '<br>';
  448. $param = '&limit='.$limit.'&id='.$id.'&type='.$type;
  449. $num = count($prods);
  450. $nbtotalofrecords = '';
  451. $newcardbutton = dolGetButtonTitle($langs->trans("AddProduct"), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/product/card.php?action=create&categories[]='.$object->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?id='.$object->id), '', $user->rights->societe->creer);
  452. print_barre_liste($langs->trans("ProductsAndServices"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'products', 0, $newcardbutton, '', $limit);
  453. print '<table class="noborder centpercent">'."\n";
  454. print '<tr class="liste_titre"><td colspan="3">'.$langs->trans("Ref").'</td></tr>'."\n";
  455. if (count($prods) > 0) {
  456. $i = 0;
  457. foreach ($prods as $prod) {
  458. $i++;
  459. if ($i > $limit) {
  460. break;
  461. }
  462. print "\t".'<tr class="oddeven">'."\n";
  463. print '<td class="nowrap" valign="top">';
  464. print $prod->getNomUrl(1);
  465. print "</td>\n";
  466. print '<td class="tdtop">'.$prod->label."</td>\n";
  467. // Link to delete from category
  468. print '<td class="right">';
  469. if ($permission) {
  470. print "<a href= '".$_SERVER['PHP_SELF']."?".(empty($socid) ? 'id' : 'socid')."=".$object->id."&type=".$typeid."&action=unlink&token=".newToken()."&removeelem=".$prod->id."'>";
  471. print $langs->trans("DeleteFromCat");
  472. print img_picto($langs->trans("DeleteFromCat"), 'unlink', '', false, 0, 0, '', 'paddingleft');
  473. print "</a>";
  474. }
  475. print '</td>';
  476. print "</tr>\n";
  477. }
  478. } else {
  479. print '<tr class="oddeven"><td colspan="2"><span class="opacitymedium">'.$langs->trans("ThisCategoryHasNoItems").'</span></td></tr>';
  480. }
  481. print "</table>\n";
  482. print '</form>'."\n";
  483. }
  484. } else {
  485. print_barre_liste($langs->trans("ProductsAndServices"), null, $_SERVER["PHP_SELF"], '', '', '', '', '', '', 'products');
  486. accessforbidden("NotEnoughPermissions", 0, 0);
  487. }
  488. }
  489. // List of customers
  490. if ($type == Categorie::TYPE_CUSTOMER) {
  491. if ($user->hasRight("societe", "read")) {
  492. $permission = $user->hasRight('societe', 'creer');
  493. $socs = $object->getObjectsInCateg($type, 0, $limit, $offset);
  494. if ($socs < 0) {
  495. dol_print_error($db, $object->error, $object->errors);
  496. } else {
  497. // Form to add record into a category
  498. $showclassifyform = 1;
  499. if ($showclassifyform) {
  500. print '<br>';
  501. print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
  502. print '<input type="hidden" name="token" value="'.newToken().'">';
  503. print '<input type="hidden" name="typeid" value="'.$typeid.'">';
  504. print '<input type="hidden" name="type" value="'.$typeid.'">';
  505. print '<input type="hidden" name="id" value="'.$object->id.'">';
  506. print '<input type="hidden" name="action" value="addintocategory">';
  507. print '<table class="noborder centpercent">';
  508. print '<tr class="liste_titre"><td>';
  509. print $langs->trans("AddCustomerIntoCategory").' &nbsp;';
  510. $filter = '(s.client:IN:1,3)';
  511. print $form->select_company('', 'elemid', $filter);
  512. print '<input type="submit" class="button buttongen" value="'.$langs->trans("ClassifyInCategory").'"></td>';
  513. print '</tr>';
  514. print '</table>';
  515. print '</form>';
  516. }
  517. print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
  518. print '<input type="hidden" name="token" value="'.newToken().'">';
  519. print '<input type="hidden" name="typeid" value="'.$typeid.'">';
  520. print '<input type="hidden" name="type" value="'.$typeid.'">';
  521. print '<input type="hidden" name="id" value="'.$object->id.'">';
  522. print '<input type="hidden" name="action" value="list">';
  523. print '<br>';
  524. $param = '&limit='.$limit.'&id='.$id.'&type='.$type;
  525. $num = count($socs);
  526. $nbtotalofrecords = '';
  527. $newcardbutton = dolGetButtonTitle($langs->trans("AddThirdParty"), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/societe/card.php?action=create&client=3&custcats[]='.$object->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?id='.$object->id), '', $user->rights->societe->creer);
  528. print_barre_liste($langs->trans("Customers"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'companies', 0, $newcardbutton, '', $limit);
  529. print '<table class="noborder centpercent">'."\n";
  530. print '<tr class="liste_titre"><td colspan="2">'.$langs->trans("Name").'</td></tr>'."\n";
  531. if (count($socs) > 0) {
  532. $i = 0;
  533. foreach ($socs as $key => $soc) {
  534. $i++;
  535. if ($i > $limit) {
  536. break;
  537. }
  538. print "\t".'<tr class="oddeven">'."\n";
  539. print '<td class="nowrap tdtop">';
  540. print $soc->getNomUrl(1);
  541. print "</td>\n";
  542. // Link to delete from category
  543. print '<td class="right">';
  544. if ($permission) {
  545. print "<a href= '".$_SERVER['PHP_SELF']."?".(empty($socid) ? 'id' : 'socid')."=".$object->id."&type=".$typeid."&action=unlink&token=".newToken()."&removeelem=".$soc->id."'>";
  546. print $langs->trans("DeleteFromCat");
  547. print img_picto($langs->trans("DeleteFromCat"), 'unlink', '', false, 0, 0, '', 'paddingleft');
  548. print "</a>";
  549. }
  550. print '</td>';
  551. print "</tr>\n";
  552. }
  553. } else {
  554. print '<tr class="oddeven"><td colspan="2"><span class="opacitymedium">'.$langs->trans("ThisCategoryHasNoItems").'</span></td></tr>';
  555. }
  556. print "</table>\n";
  557. print '</form>'."\n";
  558. }
  559. } else {
  560. print_barre_liste($langs->trans("Customers"), null, $_SERVER["PHP_SELF"], '', '', '', '', '', '', 'companies');
  561. accessforbidden("NotEnoughPermissions", 0, 0);
  562. }
  563. }
  564. // List of suppliers
  565. if ($type == Categorie::TYPE_SUPPLIER) {
  566. if ($user->hasRight("fournisseur", "read")) {
  567. $permission = $user->hasRight('societe', 'creer');
  568. $socs = $object->getObjectsInCateg($type, 0, $limit, $offset);
  569. if ($socs < 0) {
  570. dol_print_error($db, $object->error, $object->errors);
  571. } else {
  572. // Form to add record into a category
  573. $showclassifyform = 1;
  574. if ($showclassifyform) {
  575. print '<br>';
  576. print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
  577. print '<input type="hidden" name="token" value="'.newToken().'">';
  578. print '<input type="hidden" name="typeid" value="'.$typeid.'">';
  579. print '<input type="hidden" name="type" value="'.$typeid.'">';
  580. print '<input type="hidden" name="id" value="'.$object->id.'">';
  581. print '<input type="hidden" name="action" value="addintocategory">';
  582. print '<table class="noborder centpercent">';
  583. print '<tr class="liste_titre"><td>';
  584. print $langs->trans("AddSupplierIntoCategory").' &nbsp;';
  585. $filter ='(s.fournisseur:=:1)';
  586. print $form->select_company('', 'elemid', $filter);
  587. print '<input type="submit" class="button buttongen" value="'.$langs->trans("ClassifyInCategory").'"></td>';
  588. print '</tr>';
  589. print '</table>';
  590. print '</form>';
  591. }
  592. print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
  593. print '<input type="hidden" name="token" value="'.newToken().'">';
  594. print '<input type="hidden" name="typeid" value="'.$typeid.'">';
  595. print '<input type="hidden" name="type" value="'.$typeid.'">';
  596. print '<input type="hidden" name="id" value="'.$object->id.'">';
  597. print '<input type="hidden" name="action" value="list">';
  598. print '<br>';
  599. $param = '&limit='.$limit.'&id='.$id.'&type='.$type;
  600. $num = count($socs);
  601. $nbtotalofrecords = '';
  602. $newcardbutton = dolGetButtonTitle($langs->trans("AddSupplier"), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/societe/card.php?action=create&fournisseur=1&suppcats[]='.$object->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?id='.$object->id), '', $user->rights->societe->creer);
  603. print_barre_liste($langs->trans("Suppliers"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'companies', 0, $newcardbutton, '', $limit);
  604. print '<table class="noborder centpercent">'."\n";
  605. print '<tr class="liste_titre"><td colspan="2">'.$langs->trans("Name")."</td></tr>\n";
  606. if (count($socs) > 0) {
  607. $i = 0;
  608. foreach ($socs as $soc) {
  609. $i++;
  610. if ($i > $limit) {
  611. break;
  612. }
  613. print "\t".'<tr class="oddeven">'."\n";
  614. print '<td class="nowrap tdtop">';
  615. print $soc->getNomUrl(1);
  616. print "</td>\n";
  617. // Link to delete from category
  618. print '<td class="right">';
  619. if ($permission) {
  620. print "<a href= '".$_SERVER['PHP_SELF']."?".(empty($socid) ? 'id' : 'socid')."=".$object->id."&type=".$typeid."&action=unlink&token=".newToken()."&removeelem=".$soc->id."'>";
  621. print $langs->trans("DeleteFromCat");
  622. print img_picto($langs->trans("DeleteFromCat"), 'unlink', '', false, 0, 0, '', 'paddingleft');
  623. print "</a>";
  624. }
  625. print '</td>';
  626. print "</tr>\n";
  627. }
  628. } else {
  629. print '<tr class="oddeven"><td colspan="2"><span class="opacitymedium">'.$langs->trans("ThisCategoryHasNoItems").'</span></td></tr>';
  630. }
  631. print "</table>\n";
  632. print '</form>'."\n";
  633. }
  634. } else {
  635. print_barre_liste($langs->trans("Suppliers"), null, $_SERVER["PHP_SELF"], '', '', '', '', '', '', 'companies');
  636. accessforbidden("NotEnoughPermissions", 0, 0);
  637. }
  638. }
  639. // List of members
  640. if ($type == Categorie::TYPE_MEMBER) {
  641. if ($user->hasRight("adherent", "read")) {
  642. require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
  643. $permission = $user->hasRight('adherent', 'creer');
  644. $prods = $object->getObjectsInCateg($type, 0, $limit, $offset);
  645. if ($prods < 0) {
  646. dol_print_error($db, $object->error, $object->errors);
  647. } else {
  648. // Form to add record into a category
  649. $showclassifyform = 1;
  650. if ($showclassifyform) {
  651. print '<br>';
  652. print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
  653. print '<input type="hidden" name="token" value="'.newToken().'">';
  654. print '<input type="hidden" name="typeid" value="'.$typeid.'">';
  655. print '<input type="hidden" name="type" value="'.$typeid.'">';
  656. print '<input type="hidden" name="id" value="'.$object->id.'">';
  657. print '<input type="hidden" name="action" value="addintocategory">';
  658. print '<table class="noborder centpercent">';
  659. print '<tr class="liste_titre"><td>';
  660. print $langs->trans("AssignCategoryTo").' &nbsp;';
  661. print $form->selectMembers('', 'elemid');
  662. print '<input type="submit" class="button buttongen" value="'.$langs->trans("Save").'"></td>';
  663. print '</tr>';
  664. print '</table>';
  665. print '</form>';
  666. }
  667. print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
  668. print '<input type="hidden" name="token" value="'.newToken().'">';
  669. print '<input type="hidden" name="typeid" value="'.$typeid.'">';
  670. print '<input type="hidden" name="type" value="'.$typeid.'">';
  671. print '<input type="hidden" name="id" value="'.$object->id.'">';
  672. print '<input type="hidden" name="action" value="list">';
  673. print '<br>';
  674. $param = '&limit='.$limit.'&id='.$id.'&type='.$type;
  675. $num = count($prods);
  676. $nbtotalofrecords = '';
  677. $newcardbutton = dolGetButtonTitle($langs->trans("AddMember"), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/adherents/card.php?action=create&memcats[]='.$object->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?id='.$object->id), '', $user->hasRight('adherent', 'creer'));
  678. print_barre_liste($langs->trans("Member"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'members', 0, $newcardbutton, '', $limit);
  679. print '<table class="noborder centpecent">'."\n";
  680. print '<tr class="liste_titre"><td colspan="4">'.$langs->trans("Name").'</td></tr>'."\n";
  681. if (count($prods) > 0) {
  682. $i = 0;
  683. foreach ($prods as $key => $member) {
  684. $i++;
  685. if ($i > $limit) {
  686. break;
  687. }
  688. print "\t".'<tr class="oddeven">'."\n";
  689. print '<td class="nowrap tdtop">';
  690. $member->ref = $member->login;
  691. print $member->getNomUrl(1, 0);
  692. print "</td>\n";
  693. print '<td class="tdtop">'.$member->lastname."</td>\n";
  694. print '<td class="tdtop">'.$member->firstname."</td>\n";
  695. // Link to delete from category
  696. print '<td class="right">';
  697. if ($permission) {
  698. print "<a href= '".$_SERVER['PHP_SELF']."?".(empty($socid) ? 'id' : 'socid')."=".$object->id."&type=".$typeid."&action=unlink&token=".newToken()."&removeelem=".$member->id."'>";
  699. print $langs->trans("DeleteFromCat");
  700. print img_picto($langs->trans("DeleteFromCat"), 'unlink', '', false, 0, 0, '', 'paddingleft');
  701. print "</a>";
  702. }
  703. print '</td>';
  704. print "</tr>\n";
  705. }
  706. } else {
  707. print '<tr class="oddeven"><td colspan="4"><span class="opacitymedium">'.$langs->trans("ThisCategoryHasNoItems").'</span></td></tr>';
  708. }
  709. print "</table>\n";
  710. print '</form>'."\n";
  711. }
  712. } else {
  713. print_barre_liste($langs->trans("Member"), null, $_SERVER["PHP_SELF"], '', '', '', '', '', '', 'members');
  714. accessforbidden("NotEnoughPermissions", 0, 0);
  715. }
  716. }
  717. // List of contacts
  718. if ($type == Categorie::TYPE_CONTACT) {
  719. if ($user->hasRight("societe", "read")) {
  720. $permission = $user->hasRight('societe', 'creer');
  721. $contacts = $object->getObjectsInCateg($type, 0, $limit, $offset);
  722. if (is_numeric($contacts) && $contacts < 0) {
  723. dol_print_error($db, $object->error, $object->errors);
  724. } else {
  725. // Form to add record into a category
  726. $showclassifyform = 1;
  727. if ($showclassifyform) {
  728. print '<br>';
  729. print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
  730. print '<input type="hidden" name="token" value="'.newToken().'">';
  731. print '<input type="hidden" name="typeid" value="'.$typeid.'">';
  732. print '<input type="hidden" name="type" value="'.$typeid.'">';
  733. print '<input type="hidden" name="id" value="'.$object->id.'">';
  734. print '<input type="hidden" name="action" value="addintocategory">';
  735. print '<table class="noborder centpercent">';
  736. print '<tr class="liste_titre"><td>';
  737. print $langs->trans("AssignCategoryTo").' &nbsp;';
  738. print $form->selectContacts('', '', 'elemid');
  739. print '<input type="submit" class="button buttongen" value="'.$langs->trans("ClassifyInCategory").'"></td>';
  740. print '</tr>';
  741. print '</table>';
  742. print '</form>';
  743. }
  744. print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
  745. print '<input type="hidden" name="token" value="'.newToken().'">';
  746. print '<input type="hidden" name="typeid" value="'.$typeid.'">';
  747. print '<input type="hidden" name="type" value="'.$typeid.'">';
  748. print '<input type="hidden" name="id" value="'.$object->id.'">';
  749. print '<input type="hidden" name="action" value="list">';
  750. print '<br>';
  751. $param = '&limit='.$limit.'&id='.$id.'&type='.$type;
  752. $num = count($contacts);
  753. $nbtotalofrecords = '';
  754. $newcardbutton = dolGetButtonTitle($langs->trans("AddContact"), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/contact/card.php?action=create&contcats[]='.$object->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?id='.$object->id), '', $user->rights->societe->creer);
  755. print_barre_liste($langs->trans("Contact"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'contact', 0, $newcardbutton, '', $limit);
  756. $objsoc = new Societe($db);
  757. print '<table class="noborder centpercent">'."\n";
  758. print '<tr class="liste_titre"><td colspan="2">'.$langs->trans("Ref").'</td></tr>'."\n";
  759. if (is_array($contacts) && count($contacts) > 0) {
  760. $i = 0;
  761. foreach ($contacts as $key => $contact) {
  762. $i++;
  763. if ($i > $limit) {
  764. break;
  765. }
  766. print "\t".'<tr class="oddeven">'."\n";
  767. print '<td class="nowrap tdtop">';
  768. print $contact->getNomUrl(1, 'category');
  769. if ($contact->socid > 0) {
  770. $objsoc->fetch($contact->socid);
  771. print ' - ';
  772. print $objsoc->getNomUrl(1, 'contact');
  773. }
  774. print "</td>\n";
  775. // Link to delete from category
  776. print '<td class="right">';
  777. if ($permission) {
  778. print "<a href= '".$_SERVER['PHP_SELF']."?".(empty($socid) ? 'id' : 'socid')."=".$object->id."&type=".$typeid."&action=unlink&token=".newToken()."&removeelem=".$contact->id."'>";
  779. print $langs->trans("DeleteFromCat");
  780. print img_picto($langs->trans("DeleteFromCat"), 'unlink', '', false, 0, 0, '', 'paddingleft');
  781. print "</a>";
  782. }
  783. print '</td>';
  784. print "</tr>\n";
  785. }
  786. } else {
  787. print '<tr class="oddeven"><td colspan="2"><span class="opacitymedium">'.$langs->trans("ThisCategoryHasNoItems").'</span></td></tr>';
  788. }
  789. print "</table>\n";
  790. print '</form>'."\n";
  791. }
  792. } else {
  793. print_barre_liste($langs->trans("Contact"), null, $_SERVER["PHP_SELF"], '', '', '', '', '', '', 'contact');
  794. accessforbidden("NotEnoughPermissions", 0, 0);
  795. }
  796. }
  797. // List of bank accounts
  798. if ($type == Categorie::TYPE_ACCOUNT) {
  799. if ($user->hasRight("banque", "read")) {
  800. require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
  801. $permission = $user->hasRight('banque', 'creer');
  802. $accounts = $object->getObjectsInCateg($type, 0, $limit, $offset);
  803. if ($accounts < 0) {
  804. dol_print_error($db, $object->error, $object->errors);
  805. } else {
  806. // Form to add record into a category
  807. $showclassifyform = 1;
  808. if ($showclassifyform) {
  809. print '<br>';
  810. print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
  811. print '<input type="hidden" name="token" value="'.newToken().'">';
  812. print '<input type="hidden" name="typeid" value="'.$typeid.'">';
  813. print '<input type="hidden" name="type" value="'.$typeid.'">';
  814. print '<input type="hidden" name="id" value="'.$object->id.'">';
  815. print '<input type="hidden" name="action" value="addintocategory">';
  816. print '<table class="noborder centpercent">';
  817. print '<tr class="liste_titre"><td>';
  818. print $langs->trans("AddObjectIntoCategory").' &nbsp;';
  819. print $form->select_comptes('', 'elemid', 0, '', 0, '', 0, '', 1);
  820. print '<input type="submit" class="button buttongen" value="'.$langs->trans("ClassifyInCategory").'"></td>';
  821. print '</tr>';
  822. print '</table>';
  823. print '</form>';
  824. }
  825. print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
  826. print '<input type="hidden" name="token" value="'.newToken().'">';
  827. print '<input type="hidden" name="typeid" value="'.$typeid.'">';
  828. print '<input type="hidden" name="type" value="'.$typeid.'">';
  829. print '<input type="hidden" name="id" value="'.$object->id.'">';
  830. print '<input type="hidden" name="action" value="list">';
  831. print '<br>';
  832. $param = '&limit='.$limit.'&id='.$id.'&type='.$type;
  833. $num = count($accounts);
  834. $nbtotalofrecords = '';
  835. $newcardbutton = '';
  836. print_barre_liste($langs->trans("Account"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'bank_account', 0, $newcardbutton, '', $limit);
  837. print '<table class="noborder centpecent">'."\n";
  838. print '<tr class="liste_titre"><td colspan="4">'.$langs->trans("Ref").'</td></tr>'."\n";
  839. if (count($accounts) > 0) {
  840. $i = 0;
  841. foreach ($accounts as $key => $account) {
  842. $i++;
  843. if ($i > $limit) {
  844. break;
  845. }
  846. print "\t".'<tr class="oddeven">'."\n";
  847. print '<td class="nowrap tdtop">';
  848. print $account->getNomUrl(1, 0);
  849. print "</td>\n";
  850. print '<td class="tdtop">'.$account->bank."</td>\n";
  851. print '<td class="tdtop">'.$account->number."</td>\n";
  852. // Link to delete from category
  853. print '<td class="right">';
  854. if ($permission) {
  855. print "<a href= '".$_SERVER['PHP_SELF']."?".(empty($socid) ? 'id' : 'socid')."=".$object->id."&type=".$typeid."&action=unlink&token=".newToken()."&removeelem=".$account->id."'>";
  856. print $langs->trans("DeleteFromCat");
  857. print img_picto($langs->trans("DeleteFromCat"), 'unlink', '', false, 0, 0, '', 'paddingleft');
  858. print "</a>";
  859. }
  860. print '</td>';
  861. print "</tr>\n";
  862. }
  863. } else {
  864. print '<tr class="oddeven"><td colspan="4"><span class="opacitymedium">'.$langs->trans("ThisCategoryHasNoItems").'</span></td></tr>';
  865. }
  866. print "</table>\n";
  867. print '</form>'."\n";
  868. }
  869. } else {
  870. print_barre_liste($langs->trans("Banque"), null, $_SERVER["PHP_SELF"], '', '', '', '', '', '', 'bank');
  871. accessforbidden("NotEnoughPermissions", 0, 0);
  872. }
  873. }
  874. // List of Project
  875. if ($type == Categorie::TYPE_PROJECT) {
  876. if ($user->hasRight("project", "read")) {
  877. require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
  878. $permission = $user->rights->projet->creer;
  879. $objects = $object->getObjectsInCateg($type, 0, $limit, $offset);
  880. if ($objects < 0) {
  881. dol_print_error($db, $object->error, $object->errors);
  882. } else {
  883. // Form to add record into a category
  884. $showclassifyform = 1;
  885. if ($showclassifyform) {
  886. print '<br>';
  887. print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
  888. print '<input type="hidden" name="token" value="'.newToken().'">';
  889. print '<input type="hidden" name="typeid" value="'.$typeid.'">';
  890. print '<input type="hidden" name="type" value="'.$typeid.'">';
  891. print '<input type="hidden" name="id" value="'.$object->id.'">';
  892. print '<input type="hidden" name="action" value="addintocategory">';
  893. print '<table class="noborder centpercent">';
  894. print '<tr class="liste_titre"><td>';
  895. print $langs->trans("AddObjectIntoCategory").' &nbsp;';
  896. $form->selectProjects('', 'elemid');
  897. print '<input type="submit" class="button buttongen" value="'.$langs->trans("ClassifyInCategory").'"></td>';
  898. print '</tr>';
  899. print '</table>';
  900. print '</form>';
  901. }
  902. print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
  903. print '<input type="hidden" name="token" value="'.newToken().'">';
  904. print '<input type="hidden" name="typeid" value="'.$typeid.'">';
  905. print '<input type="hidden" name="type" value="'.$typeid.'">';
  906. print '<input type="hidden" name="id" value="'.$object->id.'">';
  907. print '<input type="hidden" name="action" value="list">';
  908. print '<br>';
  909. $param = '&limit='.$limit.'&id='.$id.'&type='.$type;
  910. $num = count($objects);
  911. $nbtotalofrecords = '';
  912. $newcardbutton = '';
  913. print_barre_liste($langs->trans("Project"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'project', 0, $newcardbutton, '', $limit);
  914. print '<table class="noborder centpecent">'."\n";
  915. print '<tr class="liste_titre"><td colspan="4">'.$langs->trans("Ref").'</td></tr>'."\n";
  916. if (count($objects) > 0) {
  917. $i = 0;
  918. foreach ($objects as $key => $project) {
  919. $i++;
  920. if ($i > $limit) {
  921. break;
  922. }
  923. print "\t".'<tr class="oddeven">'."\n";
  924. print '<td class="nowrap tdtop">';
  925. print $project->getNomUrl(1);
  926. print "</td>\n";
  927. print '<td class="tdtop">'.$project->ref."</td>\n";
  928. print '<td class="tdtop">'.$project->title."</td>\n";
  929. // Link to delete from category
  930. print '<td class="right">';
  931. if ($permission) {
  932. print "<a href= '".$_SERVER['PHP_SELF']."?".(empty($socid) ? 'id' : 'socid')."=".$object->id."&type=".$typeid."&action=unlink&token=".newToken()."&removeelem=".$project->id."'>";
  933. print $langs->trans("DeleteFromCat");
  934. print img_picto($langs->trans("DeleteFromCat"), 'unlink', '', false, 0, 0, '', 'paddingleft');
  935. print "</a>";
  936. }
  937. print '</td>';
  938. print "</tr>\n";
  939. }
  940. } else {
  941. print '<tr class="oddeven"><td colspan="4"><span class="opacitymedium">'.$langs->trans("ThisCategoryHasNoItems").'</span></td></tr>';
  942. }
  943. print "</table>\n";
  944. print '</form>'."\n";
  945. }
  946. } else {
  947. print_barre_liste($langs->trans("Project"), null, $_SERVER["PHP_SELF"], '', '', '', '', '', '', 'project');
  948. accessforbidden("NotEnoughPermissions", 0, 0);
  949. }
  950. }
  951. // List of users
  952. if ($type == Categorie::TYPE_USER) {
  953. if ($user->hasRight("user", "user", "read")) {
  954. require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
  955. $users = $object->getObjectsInCateg($type);
  956. if ($users < 0) {
  957. dol_print_error($db, $object->error, $object->errors);
  958. } else {
  959. // Form to add record into a category
  960. $showclassifyform = 1;
  961. if ($showclassifyform) {
  962. print '<br>';
  963. print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
  964. print '<input type="hidden" name="token" value="'.newToken().'">';
  965. print '<input type="hidden" name="typeid" value="'.$typeid.'">';
  966. print '<input type="hidden" name="type" value="'.$typeid.'">';
  967. print '<input type="hidden" name="id" value="'.$object->id.'">';
  968. print '<input type="hidden" name="action" value="addintocategory">';
  969. print '<table class="noborder centpercent">';
  970. print '<tr class="liste_titre"><td>';
  971. $force_entity = getEntity($object->element); // So we will get same filter than the getObjectsInCateg()
  972. print img_picto('', $type, 'class="pictofixedwidth"');
  973. print $form->select_dolusers('', 'elemid', 1, null, 0, '', '', $force_entity);
  974. print '<input type="submit" class="button buttongen" value="'.$langs->trans("ClassifyInCategory").'"></td>';
  975. print '</tr>';
  976. print '</table>';
  977. print '</form>';
  978. }
  979. print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
  980. print '<input type="hidden" name="token" value="'.newToken().'">';
  981. print '<input type="hidden" name="typeid" value="'.$typeid.'">';
  982. print '<input type="hidden" name="type" value="'.$typeid.'">';
  983. print '<input type="hidden" name="id" value="'.$object->id.'">';
  984. print '<input type="hidden" name="action" value="list">';
  985. print '<br>';
  986. $param = '&limit='.$limit.'&id='.$id.'&type='.$type;
  987. $num = count($users);
  988. $nbtotalofrecords = '';
  989. $newcardbutton = '';
  990. print_barre_liste($langs->trans("Users"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'user', 0, '', '', $limit);
  991. print '<table class="noborder centpecent">'."\n";
  992. print '<tr class="liste_titre"><td colspan="3">'.$langs->trans("Users").' <span class="badge">'.$num.'</span></td></tr>'."\n";
  993. if (count($users) > 0) {
  994. // Use "$userentry" here, because "$user" is the current user
  995. foreach ($users as $key => $userentry) {
  996. print "\t".'<tr class="oddeven">'."\n";
  997. print '<td class="nowrap tdtop">';
  998. print $userentry->getNomUrl(-1);
  999. print "</td>\n";
  1000. print '<td class="tdtop">'.$userentry->job."</td>\n";
  1001. // Link to delete from category
  1002. print '<td class="right">';
  1003. if ($user->hasRight('user', 'user', 'creer')) {
  1004. print "<a href= '".$_SERVER['PHP_SELF']."?".(empty($socid) ? 'id' : 'socid')."=".$object->id."&type=".$typeid."&action=unlink&token=".newToken()."&removeelem=".$userentry->id."'>";
  1005. print $langs->trans("DeleteFromCat");
  1006. print img_picto($langs->trans("DeleteFromCat"), 'unlink', '', false, 0, 0, '', 'paddingleft');
  1007. print "</a>";
  1008. }
  1009. print '</td>';
  1010. print "</tr>\n";
  1011. }
  1012. } else {
  1013. print '<tr class="oddeven"><td colspan="3"><span class="opacitymedium">'.$langs->trans("ThisCategoryHasNoItems").'</span></td></tr>';
  1014. }
  1015. print "</table>\n";
  1016. print '</form>'."\n";
  1017. }
  1018. } else {
  1019. print_barre_liste($langs->trans("Users"), null, $_SERVER["PHP_SELF"], '', '', '', '', '', '', 'user');
  1020. accessforbidden("NotEnoughPermissions", 0, 0);
  1021. }
  1022. }
  1023. // List of warehouses
  1024. if ($type == Categorie::TYPE_WAREHOUSE) {
  1025. if ($user->hasRight("stock", "read")) {
  1026. $permission = $user->rights->stock->creer;
  1027. require_once DOL_DOCUMENT_ROOT.'/product/stock/class/entrepot.class.php';
  1028. $objects = $object->getObjectsInCateg($type, 0, $limit, $offset);
  1029. if ($objects < 0) {
  1030. dol_print_error($db, $object->error, $object->errors);
  1031. } else {
  1032. print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
  1033. print '<input type="hidden" name="token" value="'.newToken().'">';
  1034. print '<input type="hidden" name="typeid" value="'.$typeid.'">';
  1035. print '<input type="hidden" name="type" value="'.$typeid.'">';
  1036. print '<input type="hidden" name="id" value="'.$object->id.'">';
  1037. print '<input type="hidden" name="action" value="list">';
  1038. print '<br>';
  1039. $param = '&limit='.$limit.'&id='.$id.'&type='.$type;
  1040. $num = count($objects);
  1041. $nbtotalofrecords = '';
  1042. $newcardbutton = '';
  1043. print_barre_liste($langs->trans("Warehouses"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'stock', 0, $newcardbutton, '', $limit);
  1044. print '<table class="noborder centpecent">'."\n";
  1045. print '<tr class="liste_titre"><td colspan="4">'.$langs->trans("Ref").'</td></tr>'."\n";
  1046. if (count($objects) > 0) {
  1047. $i = 0;
  1048. foreach ($objects as $key => $project) {
  1049. $i++;
  1050. if ($i > $limit) {
  1051. break;
  1052. }
  1053. print "\t".'<tr class="oddeven">'."\n";
  1054. print '<td class="nowrap tdtop">';
  1055. print $project->getNomUrl(1);
  1056. print "</td>\n";
  1057. print '<td class="tdtop">'.$project->ref."</td>\n";
  1058. print '<td class="tdtop">'.$project->title."</td>\n";
  1059. // Link to delete from category
  1060. print '<td class="right">';
  1061. if ($permission) {
  1062. print "<a href= '".$_SERVER['PHP_SELF']."?".(empty($socid) ? 'id' : 'socid')."=".$object->id."&type=".$typeid."&action=unlink&token=".newToken()."&removeelem=".$project->id."'>";
  1063. print $langs->trans("DeleteFromCat");
  1064. print img_picto($langs->trans("DeleteFromCat"), 'unlink', '', false, 0, 0, '', 'paddingleft');
  1065. print "</a>";
  1066. }
  1067. print '</td>';
  1068. print "</tr>\n";
  1069. }
  1070. } else {
  1071. print '<tr class="oddeven"><td colspan="4"><span class="opacitymedium">'.$langs->trans("ThisCategoryHasNoItems").'</span></td></tr>';
  1072. }
  1073. print "</table>\n";
  1074. print '</form>'."\n";
  1075. }
  1076. } else {
  1077. print_barre_liste($langs->trans("Warehouse"), null, $_SERVER["PHP_SELF"], '', '', '', '', '', '', 'stock');
  1078. accessforbidden("NotEnoughPermissions", 0, 0);
  1079. }
  1080. }
  1081. // List of tickets
  1082. if ($type == Categorie::TYPE_TICKET) {
  1083. if ($user->hasRight("ticket", "read")) {
  1084. $permission = ($user->rights->categorie->creer || $user->rights->categorie->creer);
  1085. $tickets = $object->getObjectsInCateg($type, 0, $limit, $offset);
  1086. if ($tickets < 0) {
  1087. dol_print_error($db, $object->error, $object->errors);
  1088. } else {
  1089. // Form to add record into a category
  1090. $showclassifyform = 1;
  1091. if ($showclassifyform) {
  1092. print '<br>';
  1093. print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
  1094. print '<input type="hidden" name="token" value="'.newToken().'">';
  1095. print '<input type="hidden" name="typeid" value="'.$typeid.'">';
  1096. print '<input type="hidden" name="type" value="'.$typeid.'">';
  1097. print '<input type="hidden" name="id" value="'.$object->id.'">';
  1098. print '<input type="hidden" name="action" value="addintocategory">';
  1099. print '<table class="noborder centpercent">';
  1100. print '<tr class="liste_titre"><td>';
  1101. print $langs->trans("AddTicketIntoCategory").' &nbsp;';
  1102. $form->selectTickets('', 'elemid');
  1103. print '<input type="submit" class="button buttongen" value="'.$langs->trans("ClassifyInCategory").'"></td>';
  1104. print '</tr>';
  1105. print '</table>';
  1106. print '</form>';
  1107. }
  1108. print '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
  1109. print '<input type="hidden" name="token" value="'.newToken().'">';
  1110. print '<input type="hidden" name="typeid" value="'.$typeid.'">';
  1111. print '<input type="hidden" name="type" value="'.$typeid.'">';
  1112. print '<input type="hidden" name="id" value="'.$object->id.'">';
  1113. print '<input type="hidden" name="action" value="list">';
  1114. print '<br>';
  1115. $param = '&limit='.$limit.'&id='.$id.'&type='.$type;
  1116. $num = count($tickets);
  1117. $nbtotalofrecords = '';
  1118. $newcardbutton = '';
  1119. print_barre_liste($langs->trans("Ticket"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'ticket', 0, $newcardbutton, '', $limit);
  1120. print '<table class="noborder centpercent">'."\n";
  1121. print '<tr class="liste_titre"><td colspan="3">'.$langs->trans("Ref").'</td></tr>'."\n";
  1122. if (count($tickets) > 0) {
  1123. $i = 0;
  1124. foreach ($tickets as $ticket) {
  1125. $i++;
  1126. if ($i > $limit) {
  1127. break;
  1128. }
  1129. print "\t".'<tr class="oddeven">'."\n";
  1130. print '<td class="nowrap tdtop">';
  1131. print $ticket->getNomUrl(1);
  1132. print "</td>\n";
  1133. print '<td class="tdtop">'.$ticket->label."</td>\n";
  1134. // Link to delete from category
  1135. print '<td class="right">';
  1136. if ($permission) {
  1137. print "<a href= '".$_SERVER['PHP_SELF']."?".(empty($socid) ? 'id' : 'socid')."=".$object->id."&type=".$typeid."&action=unlink&token=".newToken()."&removeelem=".$ticket->id."'>";
  1138. print $langs->trans("DeleteFromCat");
  1139. print img_picto($langs->trans("DeleteFromCat"), 'unlink', '', false, 0, 0, '', 'paddingleft');
  1140. print "</a>";
  1141. }
  1142. print '</td>';
  1143. print "</tr>\n";
  1144. }
  1145. } else {
  1146. print '<tr class="oddeven"><td colspan="2"><span class="opacitymedium">'.$langs->trans("ThisCategoryHasNoItems").'</span></td></tr>';
  1147. }
  1148. print "</table>\n";
  1149. print '</form>'."\n";
  1150. }
  1151. } else {
  1152. print_barre_liste($langs->trans("Ticket"), null, $_SERVER["PHP_SELF"], '', '', '', '', '', '', 'ticket');
  1153. accessforbidden("NotEnoughPermissions", 0, 0);
  1154. }
  1155. }
  1156. // End of page
  1157. llxFooter();
  1158. $db->close();