2018-03-10 04:23:59 +01:00
< ? php
2024-10-29 23:06:25 +01:00
/* Copyright ( C ) 2013 - 2018 Jean - François FERRY < hello @ librethic . io >
* Copyright ( C ) 2024 MDW < mdeweerd @ users . noreply . github . com >
* Copyright ( C ) 2024 Frédéric France < frederic . france @ free . fr >
2018-03-10 04:23:59 +01:00
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2019-09-23 21:55:30 +02:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
2018-03-11 18:28:27 +01:00
*
* Module descriptor for ticket system
2018-03-10 04:23:59 +01:00
*/
/**
2019-02-03 18:47:55 +01:00
* \defgroup ticket Module Ticket
2019-09-04 15:11:06 +02:00
* \brief Module for ticket and request management .
2018-06-04 21:49:29 +02:00
* \file core / modules / modTicket . class . php
* \ingroup ticket
2021-03-20 13:55:43 +01:00
* \brief Description and activation file for the module Ticket
2018-03-10 04:23:59 +01:00
*/
2020-04-10 10:59:32 +02:00
require_once DOL_DOCUMENT_ROOT . " /core/modules/DolibarrModules.class.php " ;
2018-03-10 04:23:59 +01:00
2018-03-11 18:28:27 +01:00
2018-03-10 04:23:59 +01:00
/**
2018-06-04 21:49:29 +02:00
* Description and activation class for module Ticket
2018-03-10 04:23:59 +01:00
*/
2018-06-04 21:49:29 +02:00
class modTicket extends DolibarrModules
2018-03-10 04:23:59 +01:00
{
2020-10-31 14:32:18 +01:00
/**
* Constructor . Define names , constants , directories , boxes , permissions
*
* @ param DoliDB $db Database handler
*/
public function __construct ( $db )
{
global $langs , $conf ;
2022-04-17 03:56:36 +02:00
$langs -> load ( " ticket " );
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
$this -> db = $db ;
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
// Id for module (must be unique).
// Use a free id here
// (See in Home -> System information -> Dolibarr for list of used modules id).
$this -> numero = 56000 ;
// Key text used to identify module (for permissions, menus, etc...)
$this -> rights_class = 'ticket' ;
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
// Family can be 'crm','financial','hr','projects','products','ecm','technic','other'
// It is used to group modules in module setup page
$this -> family = " crm " ;
// Module position in the family
$this -> module_position = '60' ;
// Module label (no space allowed)
// used if translation string 'ModuleXXXName' not found
// (where XXX is value of numeric property 'numero' of module)
$this -> name = preg_replace ( '/^mod/i' , '' , get_class ( $this ));
// Module description
// used if translation string 'ModuleXXXDesc' not found
// (where XXX is value of numeric property 'numero' of module)
$this -> description = " Incident/support ticket management " ;
// Possible values for version are: 'development', 'experimental' or version
$this -> version = 'dolibarr' ;
// Key used in llx_const table to save module status enabled/disabled
// (where MYMODULE is value of property name of module in uppercase)
$this -> const_name = 'MAIN_MODULE_' . strtoupper ( $this -> name );
// Name of image file used for this module.
// If file is in theme/yourtheme/img directory under name object_pictovalue.png
// use this->picto='pictovalue'
// If file is in module/img directory under name object_pictovalue.png
// use this->picto='pictovalue@module'
$this -> picto = 'ticket' ; // mypicto@ticket
// Defined all module parts (triggers, login, substitutions, menus, css, etc...)
// for default path (eg: /ticket/core/xxxxx) (0=disable, 1=enable)
// for specific path of parts (eg: /ticket/core/modules/barcode)
// for specific css file (eg: /ticket/css/ticket.css.php)
$this -> module_parts = array (
// Set this to 1 if module has its own trigger directory
'triggers' => 1 ,
);
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
// Data directories to create when module is enabled.
// Example: this->dirs = array("/ticket/temp");
$this -> dirs = array ();
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
// Config pages. Put here list of php pages
// stored into ticket/admin directory, used to setup module.
$this -> config_page_url = array ( " ticket.php " );
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
// Dependencies
$this -> hidden = false ; // A condition to hide module
2020-04-10 10:59:32 +02:00
$this -> depends = array ( 'modAgenda' ); // List of module class names as string that must be enabled if this module is enabled
$this -> requiredby = array (); // List of module ids to disable if this one is disabled
$this -> conflictwith = array (); // List of module class names as string this module is in conflict with
2022-09-27 20:48:47 +02:00
$this -> phpmin = array ( 7 , 0 ); // Minimum version of PHP required by module
2020-10-31 14:32:18 +01:00
$this -> langfiles = array ( " ticket " );
2019-06-19 12:53:28 +02:00
2020-10-31 14:32:18 +01:00
// Constants
// List of particular constants to add when module is enabled
// (key, 'chaine', value, desc, visible, 'current' or 'allentities', deleteonunactive)
// Example:
2022-09-30 12:31:29 +02:00
$default_footer = $langs -> trans ( 'TicketMessageMailFooterText' , getDolGlobalString ( 'MAIN_INFO_SOCIETE_NOM' ));
2020-10-31 14:32:18 +01:00
$this -> const = array (
1 => array ( 'TICKET_ENABLE_PUBLIC_INTERFACE' , 'chaine' , '0' , 'Enable ticket public interface' , 0 ),
2020-12-16 19:01:26 +01:00
2 => array ( 'TICKET_ADDON' , 'chaine' , 'mod_ticket_simple' , 'Ticket ref module' , 0 ),
2022-02-10 17:57:28 +01:00
3 => array ( 'TICKET_ADDON_PDF_ODT_PATH' , 'chaine' , 'DOL_DATA_ROOT/doctemplates/tickets' , 'Ticket templates ODT/ODS directory for templates' , 0 ),
2022-01-28 14:31:11 +01:00
4 => array ( 'TICKET_AUTO_READ_WHEN_CREATED_FROM_BACKEND' , 'chaine' , 0 , 'Automatically mark ticket as read when created from backend' , 0 ),
5 => array ( 'TICKET_DELAY_BEFORE_FIRST_RESPONSE' , 'chaine' , '0' , 'Maximum wanted elapsed time before a first answer to a ticket (in hours). Display a warning in tickets list if not respected.' , 0 ),
2022-02-08 16:32:02 +01:00
6 => array ( 'TICKET_DELAY_SINCE_LAST_RESPONSE' , 'chaine' , '0' , 'Maximum wanted elapsed time between two answers on the same ticket (in hours). Display a warning in tickets list if not respected.' , 0 ),
7 => array ( 'TICKET_NOTIFY_AT_CLOSING' , 'chaine' , '0' , 'Default notify contacts when closing a module' , 0 ),
2024-09-19 22:51:33 +02:00
8 => array ( 'TICKET_PRODUCT_CATEGORY' , 'chaine' , 0 , 'The category of product that is being used to find contract to link to created ticket' , 0 ),
2022-05-01 21:04:16 +02:00
9 => array ( 'TICKET_NOTIFICATION_EMAIL_FROM' , 'chaine' , getDolGlobalString ( 'MAIN_MAIL_EMAIL_FROM' ), 'Email to use by default as sender for messages sent from Dolibarr' , 0 ),
2022-04-17 03:56:36 +02:00
10 => array ( 'TICKET_MESSAGE_MAIL_INTRO' , 'chaine' , $langs -> trans ( 'TicketMessageMailIntroText' ), 'Introduction text of ticket replies sent from Dolibarr' , 0 ),
2022-09-30 12:31:29 +02:00
11 => array ( 'TICKET_MESSAGE_MAIL_SIGNATURE' , 'chaine' , $default_footer , 'Signature to use by default for messages sent from Dolibarr' , 0 ),
2022-09-27 17:08:08 +02:00
12 => array ( 'MAIN_EMAILCOLLECTOR_MAIL_WITHOUT_HEADER' , 'chaine' , " 1 " , 'Disable the rendering of headers in tickets' , 0 ),
2022-11-26 17:22:12 +01:00
13 => array ( 'MAIN_SECURITY_ENABLECAPTCHA_TICKET' , 'chaine' , getDolGlobalInt ( 'MAIN_SECURITY_ENABLECAPTCHA_TICKET' ), 'Enable captcha code by default' , 0 ),
2024-06-27 00:49:50 +02:00
14 => array ( 'TICKET_SHOW_COMPANY_LOGO' , 'chaine' , getDolGlobalInt ( 'TICKET_SHOW_COMPANY_LOGO' , 1 ), 'Enable logo header on ticket public page' , 0 ),
15 => array ( 'TICKET_SHOW_COMPANY_FOOTER' , 'chaine' , getDolGlobalInt ( 'TICKET_SHOW_COMPANY_FOOTER' , 1 ), 'Enable footer on ticket public page' , 0 )
2020-10-31 14:32:18 +01:00
);
2018-03-10 04:23:59 +01:00
2024-06-15 18:55:17 +02:00
/*
2020-10-31 14:32:18 +01:00
$this -> tabs = array (
2024-05-23 13:43:03 +02:00
'thirdparty:+ticket:Tickets:ticket:$user->hasRight("ticket","read"):/ticket/list.php?socid=__ID__' ,
2020-10-31 14:32:18 +01:00
);
2024-06-15 18:55:17 +02:00
*/
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
// Dictionaries
if ( ! isset ( $conf -> ticket -> enabled )) {
$conf -> ticket = new stdClass ();
$conf -> ticket -> enabled = 0 ;
}
2024-05-03 19:03:00 +02:00
// Dictionary of ticket types
$this -> declareNewDictionary (
array (
'name' => 'c_ticket_type' ,
'lib' => 'TicketDictType' ,
2024-05-04 18:28:34 +02:00
'sql' => 'SELECT f.rowid as rowid, f.code, f.pos, f.label, f.active, f.use_default, f.entity FROM ' . $this -> db -> prefix () . 'c_ticket_type as f WHERE f.entity IN (' . getEntity ( 'c_ticket_type' ) . ')' ,
2024-05-03 19:03:00 +02:00
'sqlsort' => 'pos ASC' ,
'field' => 'code,label,pos,use_default' ,
'fieldvalue' => 'code,label,pos,use_default' ,
'fieldinsert' => 'code,label,pos,use_default,entity' ,
'rowid' => 'rowid' ,
'cond' => isModEnabled ( 'ticket' ),
2024-07-28 14:54:06 +02:00
'help' => array ( 'code' => $langs -> trans ( 'EnterAnyCode' ), 'use_default' => $langs -> trans ( 'EnterYesOrNo' ))
2024-05-03 19:03:00 +02:00
)
);
// Dictionary of ticket severities
$this -> declareNewDictionary (
array (
'name' => 'c_ticket_severity' ,
'lib' => 'TicketDictSeverity' ,
2024-05-04 18:28:34 +02:00
'sql' => 'SELECT f.rowid as rowid, f.code, f.pos, f.label, f.active, f.use_default, f.entity FROM ' . $this -> db -> prefix () . 'c_ticket_severity as f WHERE f.entity IN (' . getEntity ( 'c_ticket_severity' ) . ')' ,
2024-05-03 19:03:00 +02:00
'sqlsort' => 'pos ASC' ,
'field' => 'code,label,pos,use_default' ,
'fieldvalue' => 'code,label,pos,use_default' ,
'fieldinsert' => 'code,label,pos,use_default,entity' ,
'rowid' => 'rowid' ,
'cond' => isModEnabled ( 'ticket' ),
2024-07-28 14:54:06 +02:00
'help' => array ( 'code' => $langs -> trans ( 'EnterAnyCode' ), 'use_default' => $langs -> trans ( 'EnterYesOrNo' ))
2024-05-03 19:03:00 +02:00
)
);
// Dictionary of ticket categories
$this -> declareNewDictionary (
array (
'name' => 'c_ticket_category' ,
'lib' => 'TicketDictCategory' ,
2024-05-04 18:56:26 +02:00
'sql' => 'SELECT f.rowid as rowid, f.code, f.pos, f.label, f.active, f.use_default, f.public, f.fk_parent, f.entity FROM ' . $this -> db -> prefix () . 'c_ticket_category as f WHERE f.entity IN (' . getEntity ( 'c_ticket_category' ) . ')' ,
2024-05-03 19:03:00 +02:00
'sqlsort' => 'pos ASC' ,
'field' => 'code,label,pos,use_default,public,fk_parent' ,
'fieldvalue' => 'code,label,pos,use_default,public,fk_parent' ,
'fieldinsert' => 'code,label,pos,use_default,public,fk_parent,entity' ,
'rowid' => 'rowid' ,
'cond' => isModEnabled ( 'ticket' ),
'help' => array (
'code' => $langs -> trans ( 'EnterAnyCode' ),
2024-07-28 14:54:06 +02:00
'use_default' => $langs -> trans ( 'EnterYesOrNo' ),
2024-05-03 19:03:00 +02:00
'public' => $langs -> trans ( 'Enter0or1' ) . '<br>' . $langs -> trans ( 'TicketGroupIsPublicDesc' ),
'fk_parent' => $langs -> trans ( 'IfThisCategoryIsChildOfAnother' )
)
)
);
2024-07-28 14:54:06 +02:00
// Dictionary of ticket resolutions (apparently unused except if TICKET_ENABLE_RESOLUTION is on)
2024-05-03 19:03:00 +02:00
$this -> declareNewDictionary (
array (
'name' => 'c_ticket_resolution' ,
'lib' => 'TicketDictResolution' ,
2024-05-04 18:56:26 +02:00
'sql' => 'SELECT f.rowid as rowid, f.code, f.pos, f.label, f.active, f.use_default, f.entity FROM ' . $this -> db -> prefix () . 'c_ticket_resolution as f WHERE f.entity IN (' . getEntity ( 'c_ticket_resolution' ) . ')' ,
2024-05-03 19:03:00 +02:00
'sqlsort' => 'pos ASC' ,
'field' => 'code,label,pos,use_default' ,
'fieldvalue' => 'code,label,pos,use_default' ,
'fieldinsert' => 'code,label,pos,use_default,entity' ,
'rowid' => 'rowid' ,
'cond' => isModEnabled ( 'ticket' ) && getDolGlobalString ( 'TICKET_ENABLE_RESOLUTION' ),
'help' => array ( 'code' => $langs -> trans ( 'EnterAnyCode' ), 'use_default' => $langs -> trans ( 'Enter0or1' ))
)
2020-10-31 14:32:18 +01:00
);
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
// Boxes
// Add here list of php file(s) stored in core/boxes that contains class to show a box.
2020-12-07 11:42:35 +01:00
$this -> boxes = array (
2024-03-13 00:32:02 +01:00
0 => array ( 'file' => 'box_last_ticket.php' , 'enabledbydefaulton' => 'Home' ),
1 => array ( 'file' => 'box_last_modified_ticket.php' , 'enabledbydefaulton' => 'Home' ),
2 => array ( 'file' => 'box_ticket_by_severity.php' , 'enabledbydefaulton' => 'ticketindex' ),
3 => array ( 'file' => 'box_graph_nb_ticket_last_x_days.php' , 'enabledbydefaulton' => 'ticketindex' ),
4 => array ( 'file' => 'box_graph_nb_tickets_type.php' , 'enabledbydefaulton' => 'ticketindex' ),
5 => array ( 'file' => 'box_new_vs_close_ticket.php' , 'enabledbydefaulton' => 'ticketindex' )
2020-12-07 11:42:35 +01:00
); // Boxes list
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
// Permissions
$this -> rights = array (); // Permission array used by this module
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
$r = 0 ;
$this -> rights [ $r ][ 0 ] = 56001 ; // id de la permission
$this -> rights [ $r ][ 1 ] = " Read ticket " ; // libelle de la permission
2024-01-13 19:48:20 +01:00
$this -> rights [ $r ][ 2 ] = 'r' ; // type de la permission (deprecated)
$this -> rights [ $r ][ 3 ] = 0 ; // La permission est-elle une permission par default
2020-10-31 14:32:18 +01:00
$this -> rights [ $r ][ 4 ] = 'read' ;
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
$r ++ ;
$this -> rights [ $r ][ 0 ] = 56002 ; // id de la permission
$this -> rights [ $r ][ 1 ] = " Create les tickets " ; // libelle de la permission
2024-01-13 19:48:20 +01:00
$this -> rights [ $r ][ 2 ] = 'w' ; // type de la permission (deprecated)
$this -> rights [ $r ][ 3 ] = 0 ; // La permission est-elle une permission par default
2020-10-31 14:32:18 +01:00
$this -> rights [ $r ][ 4 ] = 'write' ;
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
$r ++ ;
$this -> rights [ $r ][ 0 ] = 56003 ; // id de la permission
$this -> rights [ $r ][ 1 ] = " Delete les tickets " ; // libelle de la permission
2024-01-13 19:48:20 +01:00
$this -> rights [ $r ][ 2 ] = 'd' ; // type de la permission (deprecated)
$this -> rights [ $r ][ 3 ] = 0 ; // La permission est-elle une permission par default
2020-10-31 14:32:18 +01:00
$this -> rights [ $r ][ 4 ] = 'delete' ;
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
$r ++ ;
$this -> rights [ $r ][ 0 ] = 56004 ; // id de la permission
$this -> rights [ $r ][ 1 ] = " Manage tickets " ; // libelle de la permission
2024-01-13 19:48:20 +01:00
//$this->rights[$r][2] = 'd'; // type de la permission (deprecated)
$this -> rights [ $r ][ 3 ] = 0 ; // La permission est-elle une permission par default
2020-10-31 14:32:18 +01:00
$this -> rights [ $r ][ 4 ] = 'manage' ;
2018-03-10 04:23:59 +01:00
2023-01-25 16:56:27 +01:00
$r ++ ;
$this -> rights [ $r ][ 0 ] = 56006 ; // id de la permission
$this -> rights [ $r ][ 1 ] = " Export ticket " ; // libelle de la permission
2024-01-13 19:48:20 +01:00
//$this->rights[$r][2] = 'd'; // type de la permission (deprecated)
$this -> rights [ $r ][ 3 ] = 0 ; // La permission est-elle une permission par default
2023-01-25 16:56:27 +01:00
$this -> rights [ $r ][ 4 ] = 'export' ;
2021-02-02 00:19:41 +01:00
/* Seems not used and in conflict with societe -> client -> voir ( see all thirdparties )
2020-10-31 14:32:18 +01:00
$r ++ ;
$this -> rights [ $r ][ 0 ] = 56005 ; // id de la permission
$this -> rights [ $r ][ 1 ] = 'See all tickets, even if not assigned to (not effective for external users, always restricted to the thirdpardy they depends on)' ; // libelle de la permission
2024-01-13 19:48:20 +01:00
$this -> rights [ $r ][ 2 ] = 'r' ; // type de la permission (deprecated)
$this -> rights [ $r ][ 3 ] = 0 ; // La permission est-elle une permission par default
2020-10-31 14:32:18 +01:00
$this -> rights [ $r ][ 4 ] = 'view' ;
$this -> rights [ $r ][ 5 ] = 'all' ;
2021-02-02 00:19:41 +01:00
*/
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
// Main menu entries
2023-06-26 15:34:09 +02:00
$this -> menu = array (); // List of menus to add
2020-10-31 14:32:18 +01:00
$r = 0 ;
2018-03-10 04:23:59 +01:00
2021-06-26 15:39:52 +02:00
/* $this -> menu [ $r ] = array ( 'fk_menu' => 0 , // Put 0 if this is a top menu
2020-10-31 14:32:18 +01:00
'type' => 'top' , // This is a Top menu entry
'titre' => 'Ticket' ,
2021-03-13 18:56:02 +01:00
'prefix' => img_picto ( '' , $this -> picto , 'class="paddingright pictofixedwidth em092"' ),
2020-10-31 14:32:18 +01:00
'mainmenu' => 'ticket' ,
'leftmenu' => '1' , // Use 1 if you also want to add left menu entries using this descriptor.
'url' => '/ticket/index.php' ,
'langs' => 'ticket' , // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
'position' => 88 ,
2023-04-18 20:23:34 +02:00
'enabled' => 'isModEnabled("ticket")' ,
2024-05-23 13:43:03 +02:00
'perms' => '$user->hasRight("ticket","read")' ,
2020-10-31 14:32:18 +01:00
'target' => '' ,
'user' => 2 ); // 0=Menu for internal users, 1=external users, 2=both
2021-06-26 15:39:52 +02:00
$r ++ ; */
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
$this -> menu [ $r ] = array ( 'fk_menu' => 'fk_mainmenu=ticket' ,
'type' => 'left' ,
'titre' => 'Ticket' ,
2021-02-15 20:13:38 +01:00
'prefix' => img_picto ( '' , $this -> picto , 'class="paddingright pictofixedwidth em092"' ),
2020-10-31 14:32:18 +01:00
'mainmenu' => 'ticket' ,
'leftmenu' => 'ticket' ,
'url' => '/ticket/index.php' ,
'langs' => 'ticket' ,
'position' => 101 ,
2023-04-18 20:23:34 +02:00
'enabled' => 'isModEnabled("ticket")' ,
2024-05-23 13:43:03 +02:00
'perms' => '$user->hasRight("ticket","read")' ,
2020-10-31 14:32:18 +01:00
'target' => '' ,
'user' => 2 );
$r ++ ;
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
$this -> menu [ $r ] = array ( 'fk_menu' => 'fk_mainmenu=ticket,fk_leftmenu=ticket' ,
'type' => 'left' ,
'titre' => 'NewTicket' ,
'mainmenu' => 'ticket' ,
2024-09-01 15:13:53 +02:00
'url' => '/ticket/card.php?action=create&mode=init' ,
2020-10-31 14:32:18 +01:00
'langs' => 'ticket' ,
'position' => 102 ,
2023-04-18 20:23:34 +02:00
'enabled' => 'isModEnabled("ticket")' ,
2020-10-31 14:32:18 +01:00
'perms' => '$user->rights->ticket->write' ,
'target' => '' ,
'user' => 2 );
$r ++ ;
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
$this -> menu [ $r ] = array ( 'fk_menu' => 'fk_mainmenu=ticket,fk_leftmenu=ticket' ,
'type' => 'left' ,
'titre' => 'List' ,
'mainmenu' => 'ticket' ,
'leftmenu' => 'ticketlist' ,
'url' => '/ticket/list.php?search_fk_status=non_closed' ,
'langs' => 'ticket' ,
'position' => 103 ,
2023-04-18 20:23:34 +02:00
'enabled' => 'isModEnabled("ticket")' ,
2024-05-23 13:43:03 +02:00
'perms' => '$user->hasRight("ticket","read")' ,
2020-10-31 14:32:18 +01:00
'target' => '' ,
'user' => 2 );
$r ++ ;
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
$this -> menu [ $r ] = array ( 'fk_menu' => 'fk_mainmenu=ticket,fk_leftmenu=ticket' ,
'type' => 'left' ,
'titre' => 'MenuTicketMyAssign' ,
'mainmenu' => 'ticket' ,
'leftmenu' => 'ticketmy' ,
'url' => '/ticket/list.php?mode=mine&search_fk_status=non_closed' ,
'langs' => 'ticket' ,
'position' => 105 ,
2023-04-18 20:23:34 +02:00
'enabled' => 'isModEnabled("ticket")' ,
2024-05-23 13:43:03 +02:00
'perms' => '$user->hasRight("ticket","read")' ,
2020-10-31 14:32:18 +01:00
'target' => '' ,
'user' => 0 );
$r ++ ;
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
$this -> menu [ $r ] = array ( 'fk_menu' => 'fk_mainmenu=ticket,fk_leftmenu=ticket' ,
'type' => 'left' ,
'titre' => 'Statistics' ,
'mainmenu' => 'ticket' ,
'url' => '/ticket/stats/index.php' ,
'langs' => 'ticket' ,
'position' => 107 ,
2023-04-18 20:23:34 +02:00
'enabled' => 'isModEnabled("ticket")' ,
2024-05-23 13:43:03 +02:00
'perms' => '$user->hasRight("ticket","read")' ,
2020-10-31 14:32:18 +01:00
'target' => '' ,
'user' => 0 );
$r ++ ;
2021-07-02 10:26:03 +02:00
$this -> menu [ $r ] = array ( 'fk_menu' => 'fk_mainmenu=ticket,fk_leftmenu=ticket' ,
'type' => 'left' ,
'titre' => 'Categories' ,
'mainmenu' => 'ticket' ,
'url' => '/categories/index.php?type=12' ,
'langs' => 'ticket' ,
'position' => 107 ,
2024-05-23 13:43:03 +02:00
'enabled' => 'isModEnabled("ticket") && isModEnabled("categorie")' ,
'perms' => '$user->hasRight("ticket","read")' ,
2021-07-02 10:26:03 +02:00
'target' => '' ,
'user' => 0 );
$r ++ ;
2023-01-25 16:56:27 +01:00
// Exports
//--------
$r = 1 ;
// Export list of tickets and attributes
$langs -> load ( " ticket " );
2024-03-13 00:32:02 +01:00
$this -> export_code [ $r ] = $this -> rights_class . '_' . $r ;
$this -> export_label [ $r ] = 'ExportDataset_ticket_1' ; // Translation key (used only if key ExportDataset_xxx_z not found)
2023-01-25 16:56:27 +01:00
$this -> export_permission [ $r ] = array ( array ( " ticket " , " export " ));
2024-03-13 00:32:02 +01:00
$this -> export_icon [ $r ] = 'ticket' ;
2023-12-04 12:07:31 +01:00
$keyforclass = 'Ticket' ;
2024-03-13 00:32:02 +01:00
$keyforclassfile = '/ticket/class/ticket.class.php' ;
$keyforelement = 'ticket' ;
2023-01-25 16:56:27 +01:00
include DOL_DOCUMENT_ROOT . '/core/commonfieldsinexport.inc.php' ;
2024-03-13 00:32:02 +01:00
$keyforselect = 'ticket' ;
$keyforaliasextra = 'extra' ;
2024-05-30 13:37:17 +02:00
$keyforelement = 'ticket' ;
2023-01-25 16:56:27 +01:00
include DOL_DOCUMENT_ROOT . '/core/extrafieldsinexport.inc.php' ;
2024-03-13 00:32:02 +01:00
$this -> export_sql_start [ $r ] = 'SELECT DISTINCT ' ;
$this -> export_sql_end [ $r ] = ' FROM ' . MAIN_DB_PREFIX . 'ticket as t' ;
2023-01-25 16:56:27 +01:00
$this -> export_sql_end [ $r ] .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'ticket_extrafields as extra on (t.rowid = extra.fk_object)' ;
2024-03-13 00:32:02 +01:00
$this -> export_sql_end [ $r ] .= ' WHERE 1 = 1' ;
$this -> export_sql_end [ $r ] .= ' AND t.entity IN (' . getEntity ( 'ticket' ) . ')' ;
2023-01-25 16:56:27 +01:00
$r ++ ;
2020-10-31 14:32:18 +01:00
}
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
/**
* Function called when module is enabled .
* The init function add constants , boxes , permissions and menus ( defined in constructor ) into Dolibarr database .
* It also creates data directories
*
* @ param string $options Options when enabling module ( '' , 'noboxes' )
* @ return int 1 if OK , 0 if KO
*/
public function init ( $options = '' )
{
2020-12-16 19:01:26 +01:00
global $conf , $langs ;
2022-05-08 15:18:34 +02:00
$result = $this -> _load_tables ( '/install/mysql/' , 'ticket' );
2022-02-17 19:30:18 +01:00
if ( $result < 0 ) {
return - 1 ; // Do not activate module if error 'not allowed' returned when loading module SQL queries (the _load_table run sql with run_sql with the error allowed parameter set to 'default')
}
2020-12-16 19:01:26 +01:00
// Permissions
$this -> remove ( $options );
//ODT template
$src = DOL_DOCUMENT_ROOT . '/install/doctemplates/tickets/template_ticket.odt' ;
$dirodt = DOL_DATA_ROOT . '/doctemplates/tickets' ;
2024-02-07 19:36:23 +01:00
$dest = $dirodt . '/template_ticket.odt' ;
2020-12-16 19:01:26 +01:00
2021-02-23 22:03:23 +01:00
if ( file_exists ( $src ) && ! file_exists ( $dest )) {
2020-12-16 19:01:26 +01:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
dol_mkdir ( $dirodt );
2024-09-23 01:59:14 +02:00
$result = dol_copy ( $src , $dest , '0' , 0 );
2021-02-23 22:03:23 +01:00
if ( $result < 0 ) {
2020-12-16 19:01:26 +01:00
$langs -> load ( " errors " );
$this -> error = $langs -> trans ( 'ErrorFailToCopyFile' , $src , $dest );
return 0 ;
}
}
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
$sql = array (
2024-05-03 19:03:00 +02:00
array ( " sql " => " insert into " . $this -> db -> prefix () . " c_type_contact(rowid, element, source, code, libelle, active ) values (110120, 'ticket', 'internal', 'SUPPORTTEC', 'Utilisateur assigné au ticket', 1); " , " ignoreerror " => 1 ),
array ( " sql " => " insert into " . $this -> db -> prefix () . " c_type_contact(rowid, element, source, code, libelle, active ) values (110121, 'ticket', 'internal', 'CONTRIBUTOR', 'Intervenant', 1); " , " ignoreerror " => 1 ),
array ( " sql " => " insert into " . $this -> db -> prefix () . " c_type_contact(rowid, element, source, code, libelle, active ) values (110122, 'ticket', 'external', 'SUPPORTCLI', 'Contact client suivi incident', 1); " , " ignoreerror " => 1 ),
array ( " sql " => " insert into " . $this -> db -> prefix () . " c_type_contact(rowid, element, source, code, libelle, active ) values (110123, 'ticket', 'external', 'CONTRIBUTOR', 'Intervenant', 1); " , " ignoreerror " => 1 ),
2024-02-07 19:36:23 +01:00
// remove old settings
2024-05-03 19:03:00 +02:00
" DELETE FROM " . $this -> db -> prefix () . " document_model WHERE nom = 'TICKET_ADDON_PDF_ODT_PATH' AND type = 'ticket' AND entity = " . (( int ) $conf -> entity ),
2024-02-07 19:36:23 +01:00
// activate default odt templates
2024-05-03 19:03:00 +02:00
array ( " sql " => " INSERT INTO " . $this -> db -> prefix () . " document_model (nom, type, libelle, entity, description) VALUES('generic_ticket_odt','ticket','ODT templates', " . (( int ) $conf -> entity ) . " ,'TICKET_ADDON_PDF_ODT_PATH'); " , " ignoreerror " => 1 ),
2020-10-31 14:32:18 +01:00
);
2018-03-10 04:23:59 +01:00
2020-10-31 14:32:18 +01:00
return $this -> _init ( $sql , $options );
}
2018-03-10 04:23:59 +01:00
}