2018-03-10 04:23:59 +01:00
< ? php
2018-03-11 10:34:21 +01:00
/* Copyright ( C ) 2013 - 2018 Jean - François Ferry < hello @ librethic . io >
* Copyright ( C ) 2016 Christophe Battarel < christophe @ altairis . fr >
2020-10-30 20:37:23 +01:00
* Copyright ( C ) 2019 - 2020 Frédéric France < frederic . france @ netlogic . fr >
2020-09-08 01:53:37 +02:00
* Copyright ( C ) 2020 Laurent Destailleur < eldy @ users . sourceforge . net >
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-10 04:23:59 +01:00
*/
/**
2018-06-04 21:49:29 +02:00
* \file ticket / class / ticket . class . php
* \ingroup ticket
* \brief Class file for object ticket
2018-03-10 04:23:59 +01:00
*/
// Put here all includes required by your class file
2019-11-13 19:35:02 +01:00
require_once DOL_DOCUMENT_ROOT . " /core/class/commonobject.class.php " ;
require_once DOL_DOCUMENT_ROOT . '/fichinter/class/fichinter.class.php' ;
require_once DOL_DOCUMENT_ROOT . '/core/lib/ticket.lib.php' ;
2018-03-10 04:23:59 +01:00
2018-03-11 10:34:21 +01:00
2018-03-10 04:23:59 +01:00
/**
2018-03-11 11:33:24 +01:00
* Class to manage ticket
2018-03-10 04:23:59 +01:00
*/
2018-06-04 21:49:29 +02:00
class Ticket extends CommonObject
2018-03-10 04:23:59 +01:00
{
2020-04-16 00:42:57 +02:00
/**
* @ var string ID to identify managed object
*/
public $element = 'ticket' ;
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
/**
* @ var string Name of table without prefix where object is stored
*/
public $table_element = 'ticket' ;
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
/**
* @ var string Name of field for link to tickets
*/
public $fk_element = 'fk_ticket' ;
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
/**
* @ var int Does ticketcore support multicompany module ? 0 = No test on entity , 1 = Test with field entity , 2 = Test with link by societe
*/
public $ismultientitymanaged = 1 ;
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
/**
* @ var int Does ticketcore support extrafields ? 0 = No , 1 = Yes
*/
public $isextrafieldmanaged = 1 ;
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
/**
* @ var string String with name of icon for ticketcore . Must be the part after the 'object_' into object_ticketcore . png
*/
public $picto = 'ticket' ;
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
/**
* @ var string Hash to identify ticket publically
*/
public $track_id ;
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
/**
* @ var int Thirdparty ID
*/
public $fk_soc ;
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
/**
* @ var int Project ID
*/
public $fk_project ;
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
/**
* @ var string Person email who have create ticket
*/
public $origin_email ;
2018-03-12 12:54:48 +01:00
2020-04-16 00:42:57 +02:00
/**
* @ var int User id who have create ticket
*/
public $fk_user_create ;
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
/**
* @ var int User id who have ticket assigned
*/
public $fk_user_assign ;
/**
* var string Ticket subject
*/
public $subject ;
/**
* @ var string Ticket message
*/
public $message ;
/**
* @ var int Ticket statut
2020-10-30 20:37:23 +01:00
* @ deprecated
*/
public $fk_statut ;
/**
* @ var int Ticket status
2020-04-16 00:42:57 +02:00
*/
2020-06-26 19:35:09 +02:00
public $status ;
2020-04-16 00:42:57 +02:00
/**
* @ var string State resolution
*/
public $resolution ;
/**
* @ var int Progress in percent
*/
public $progress ;
/**
* @ var string Duration for ticket
*/
public $timing ;
/**
* @ var string Type code
*/
public $type_code ;
/**
* @ var string Category code
*/
public $category_code ;
/**
* @ var string Severity code
*/
public $severity_code ;
2020-10-31 14:32:18 +01:00
/**
* Type label
*/
public $type_label ;
/**
* Category label
*/
public $category_label ;
/**
* Severity label
*/
public $severity_label ;
/**
* Email from user
*/
public $email_from ;
2020-10-07 16:45:06 +02:00
2020-04-16 00:42:57 +02:00
/**
2020-10-27 19:29:42 +01:00
* @ var int Creation date
2020-04-16 00:42:57 +02:00
*/
public $datec = '' ;
/**
* @ var int Read date
*/
public $date_read = '' ;
2022-02-04 16:14:41 +01:00
/**
* @ var int Last message date
*/
public $date_last_msg_sent = '' ;
2020-04-16 00:42:57 +02:00
/**
* @ var int Close ticket date
*/
public $date_close = '' ;
/**
* @ var array cache_types_tickets
*/
public $cache_types_tickets ;
/**
* @ var array tickets categories
*/
public $cache_category_tickets ;
/**
2020-10-30 20:37:23 +01:00
* @ var int Notify thirdparty at create
2020-04-16 00:42:57 +02:00
*/
public $notify_tiers_at_create ;
2020-10-30 20:37:23 +01:00
/**
* @ var string msgid
*/
2020-08-21 01:11:22 +02:00
public $email_msgid ;
2020-04-16 00:42:57 +02:00
public $lines ;
/**
* @ var string Regex pour les images
*/
public $regeximgext = '\.jpg|\.jpeg|\.bmp|\.gif|\.png|\.tiff' ;
2020-08-20 19:00:43 +02:00
/**
* Status
*/
const STATUS_NOT_READ = 0 ;
const STATUS_READ = 1 ;
const STATUS_ASSIGNED = 2 ;
const STATUS_IN_PROGRESS = 3 ;
const STATUS_NEED_MORE_INFO = 5 ;
2020-12-17 11:57:12 +01:00
const STATUS_WAITING = 7 ; // on hold
2021-07-30 00:40:06 +02:00
const STATUS_CLOSED = 8 ; // Closed - Solved
const STATUS_CANCELED = 9 ; // Closed - Not solved
2020-08-20 19:00:43 +02:00
/**
2021-02-02 00:19:41 +01:00
* 'type' field format ( 'integer' , 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter]]' , 'sellist:TableName:LabelFieldName[:KeyFieldName[:KeyFieldParent[:Filter]]]' , 'varchar(x)' , 'double(24,8)' , 'real' , 'price' , 'text' , 'text:none' , 'html' , 'date' , 'datetime' , 'timestamp' , 'duration' , 'mail' , 'phone' , 'url' , 'password' )
2020-08-20 19:00:43 +02:00
* Note : Filter can be a string like " (t.ref:like:'SO-%') or (t.date_creation:<:'20160101') or (t.nature:is:NULL) "
* 'label' the translation key .
2021-02-02 00:19:41 +01:00
* 'picto' is code of a picto to show before value in forms
2020-08-20 19:00:43 +02:00
* 'enabled' is a condition when the field must be managed ( Example : 1 or ' $conf -> global -> MY_SETUP_PARAM )
* 'position' is the sort order of field .
* 'notnull' is set to 1 if not null in database . Set to - 1 if we must set data to null if empty ( '' or 0 ) .
* 'visible' says if field is visible in list ( Examples : 0 = Not visible , 1 = Visible on list and create / update / view forms , 2 = Visible on list only , 3 = Visible on create / update / view form only ( not list ), 4 = Visible on list and update / view form only ( not create ) . 5 = Visible on list and view only ( not create / not update ) . Using a negative value means field is not shown by default on list but can be selected for viewing )
* 'noteditable' says if field is not editable ( 1 or 0 )
* 'default' is a default value for creation ( can still be overwrote by the Setup of Default Values if field is editable in creation form ) . Note : If default is set to '(PROV)' and field is 'ref' , the default value will be set to '(PROVid)' where id is rowid when a new record is created .
* 'index' if we want an index in database .
* 'foreignkey' => 'tablename.field' if the field is a foreign key ( it is recommanded to name the field fk_ ... ) .
* 'searchall' is 1 if we want to search in this field when making a search from the quick search button .
* 'isameasure' must be set to 1 if you want to have a total on list for this field . Field type must be summable like integer or double ( 24 , 8 ) .
2021-02-02 00:19:41 +01:00
* 'css' and 'cssview' and 'csslist' is the CSS style to use on field . 'css' is used in creation and update . 'cssview' is used in view mode . 'csslist' is used for columns in lists . For example : 'maxwidth200' , 'wordbreak' , 'tdoverflowmax200'
* 'help' is a 'TranslationString' to use to show a tooltip on field . You can also use 'TranslationString:keyfortooltiponlick' for a tooltip on click .
2020-08-20 19:00:43 +02:00
* 'showoncombobox' if value of the field must be visible into the label of the combobox that list record
* 'disabled' is 1 if we want to have the field locked by a 'disabled' attribute . In most cases , this is never set into the definition of $fields into class , but is set dynamically by some part of code .
2021-04-29 12:10:55 +02:00
* 'arrayofkeyval' to set list of value if type is a list of predefined values . For example : array ( " 0 " => " Draft " , " 1 " => " Active " , " -1 " => " Cancel " )
2020-08-20 19:00:43 +02:00
* 'autofocusoncreate' to have field having the focus on a create form . Only 1 field should have this property set to 1.
* 'comment' is not used . You can store here any text of your choice . It is not used by application .
*
* Note : To have value dynamic , you can set value to 0 in definition and edit the value on the fly into the constructor .
*/
// BEGIN MODULEBUILDER PROPERTIES
2020-04-16 00:42:57 +02:00
public $fields = array (
'rowid' => array ( 'type' => 'integer' , 'label' => 'TechnicalID' , 'position' => 1 , 'visible' =>- 2 , 'enabled' => 1 , 'position' => 1 , 'notnull' => 1 , 'index' => 1 , 'comment' => " Id " ),
'entity' => array ( 'type' => 'integer' , 'label' => 'Entity' , 'visible' => 0 , 'enabled' => 1 , 'position' => 5 , 'notnull' => 1 , 'index' => 1 ),
2021-09-07 13:08:37 +02:00
'ref' => array ( 'type' => 'varchar(128)' , 'label' => 'Ref' , 'visible' => 1 , 'enabled' => 1 , 'position' => 10 , 'notnull' => 1 , 'index' => 1 , 'searchall' => 1 , 'comment' => " Reference of object " , 'css' => '' , 'showoncombobox' => 1 ),
2020-04-16 00:42:57 +02:00
'track_id' => array ( 'type' => 'varchar(255)' , 'label' => 'TicketTrackId' , 'visible' =>- 2 , 'enabled' => 1 , 'position' => 11 , 'notnull' =>- 1 , 'searchall' => 1 , 'help' => " Help text " ),
2021-03-01 19:50:35 +01:00
'fk_user_create' => array ( 'type' => 'integer:User:user/class/user.class.php' , 'label' => 'Author' , 'visible' => 1 , 'enabled' => 1 , 'position' => 15 , 'notnull' => 1 , 'css' => 'tdoverflowmax125 maxwidth150onsmartphone' ),
2020-04-16 00:42:57 +02:00
'origin_email' => array ( 'type' => 'mail' , 'label' => 'OriginEmail' , 'visible' =>- 2 , 'enabled' => 1 , 'position' => 16 , 'notnull' => 1 , 'index' => 1 , 'searchall' => 1 , 'comment' => " Reference of object " , 'css' => 'tdoverflowmax150' ),
2021-02-02 00:19:41 +01:00
'subject' => array ( 'type' => 'varchar(255)' , 'label' => 'Subject' , 'visible' => 1 , 'enabled' => 1 , 'position' => 18 , 'notnull' =>- 1 , 'searchall' => 1 , 'help' => " " , 'css' => 'maxwidth200 tdoverflowmax200' , 'autofocusoncreate' => 1 ),
'type_code' => array ( 'type' => 'varchar(32)' , 'label' => 'Type' , 'visible' => 1 , 'enabled' => 1 , 'position' => 20 , 'notnull' =>- 1 , 'help' => " " , 'css' => 'maxwidth125 tdoverflowmax50' ),
2022-01-02 18:22:18 +01:00
'category_code' => array ( 'type' => 'varchar(32)' , 'label' => 'TicketCategory' , 'visible' =>- 1 , 'enabled' => 1 , 'position' => 21 , 'notnull' =>- 1 , 'help' => " " , 'css' => 'maxwidth100 tdoverflowmax200' ),
2020-09-08 04:21:35 +02:00
'severity_code' => array ( 'type' => 'varchar(32)' , 'label' => 'Severity' , 'visible' => 1 , 'enabled' => 1 , 'position' => 22 , 'notnull' =>- 1 , 'help' => " " , 'css' => 'maxwidth100' ),
2021-02-02 00:19:41 +01:00
'fk_soc' => array ( 'type' => 'integer:Societe:societe/class/societe.class.php' , 'label' => 'ThirdParty' , 'visible' => 1 , 'enabled' => '$conf->societe->enabled' , 'position' => 50 , 'notnull' =>- 1 , 'index' => 1 , 'searchall' => 1 , 'help' => " LinkToThirparty " , 'css' => 'tdoverflowmax150 maxwidth150onsmartphone' ),
2020-04-16 00:42:57 +02:00
'notify_tiers_at_create' => array ( 'type' => 'integer' , 'label' => 'NotifyThirdparty' , 'visible' =>- 1 , 'enabled' => 0 , 'position' => 51 , 'notnull' => 1 , 'index' => 1 ),
'fk_project' => array ( 'type' => 'integer:Project:projet/class/project.class.php' , 'label' => 'Project' , 'visible' =>- 1 , 'enabled' => 1 , 'position' => 52 , 'notnull' =>- 1 , 'index' => 1 , 'help' => " LinkToProject " ),
2021-10-19 16:26:43 +02:00
//'timing' => array('type'=>'varchar(20)', 'label'=>'Timing', 'visible'=>-1, 'enabled'=>1, 'position'=>42, 'notnull'=>-1, 'help'=>""), // what is this ?
2020-04-16 00:42:57 +02:00
'datec' => array ( 'type' => 'datetime' , 'label' => 'DateCreation' , 'visible' => 1 , 'enabled' => 1 , 'position' => 500 , 'notnull' => 1 ),
2021-02-02 00:19:41 +01:00
'date_read' => array ( 'type' => 'datetime' , 'label' => 'TicketReadOn' , 'visible' =>- 1 , 'enabled' => 1 , 'position' => 501 , 'notnull' => 1 ),
2022-02-04 16:14:41 +01:00
'date_last_msg_sent' => array ( 'type' => 'datetime' , 'label' => 'TicketLastMessageDate' , 'visible' => 0 , 'enabled' => 1 , 'position' => 502 , 'notnull' =>- 1 ),
2021-03-01 19:50:35 +01:00
'fk_user_assign' => array ( 'type' => 'integer:User:user/class/user.class.php' , 'label' => 'AssignedTo' , 'visible' => 1 , 'enabled' => 1 , 'position' => 505 , 'notnull' => 1 , 'css' => 'tdoverflowmax125' ),
2020-04-16 00:42:57 +02:00
'date_close' => array ( 'type' => 'datetime' , 'label' => 'TicketCloseOn' , 'visible' =>- 1 , 'enabled' => 1 , 'position' => 510 , 'notnull' => 1 ),
'tms' => array ( 'type' => 'timestamp' , 'label' => 'DateModification' , 'visible' =>- 1 , 'enabled' => 1 , 'position' => 520 , 'notnull' => 1 ),
'message' => array ( 'type' => 'text' , 'label' => 'Message' , 'visible' =>- 2 , 'enabled' => 1 , 'position' => 540 , 'notnull' =>- 1 ,),
2020-08-21 01:11:22 +02:00
'email_msgid' => array ( 'type' => 'varchar(255)' , 'label' => 'EmailMsgID' , 'visible' =>- 2 , 'enabled' => 1 , 'position' => 540 , 'notnull' =>- 1 , 'help' => 'EmailMsgIDDesc' ),
2021-11-01 03:14:54 +01:00
'progress' => array ( 'type' => 'integer' , 'label' => 'Progression' , 'visible' =>- 1 , 'enabled' => 1 , 'position' => 540 , 'notnull' =>- 1 , 'css' => 'right' , 'help' => " " , 'isameasure' => 2 , 'csslist' => 'width50' ),
2021-07-30 01:10:15 +02:00
'resolution' => array ( 'type' => 'integer' , 'label' => 'Resolution' , 'visible' =>- 1 , 'enabled' => '$conf->global->TICKET_ENABLE_RESOLUTION' , 'position' => 550 , 'notnull' => 1 ),
2021-07-30 00:40:06 +02:00
'fk_statut' => array ( 'type' => 'integer' , 'label' => 'Status' , 'visible' => 1 , 'enabled' => 1 , 'position' => 600 , 'notnull' => 1 , 'index' => 1 , 'arrayofkeyval' => array ( 0 => 'Unread' , 1 => 'Read' , 3 => 'Answered' , 4 => 'Assigned' , 5 => 'InProgress' , 6 => 'Waiting' , 8 => 'SolvedClosed' , 9 => 'Deleted' )),
2020-04-16 00:42:57 +02:00
'import_key' => array ( 'type' => 'varchar(14)' , 'label' => 'ImportId' , 'enabled' => 1 , 'visible' =>- 2 , 'position' => 900 ),
);
2020-08-20 19:00:43 +02:00
// END MODULEBUILDER PROPERTIES
2020-04-16 00:42:57 +02:00
/**
* Constructor
*
* @ param DoliDb $db Database handler
*/
public function __construct ( $db )
{
2021-07-30 01:10:15 +02:00
global $conf ;
2020-04-16 00:42:57 +02:00
$this -> db = $db ;
2020-10-30 20:37:23 +01:00
$this -> statuts_short = array (
self :: STATUS_NOT_READ => 'Unread' ,
self :: STATUS_READ => 'Read' ,
self :: STATUS_ASSIGNED => 'Assigned' ,
self :: STATUS_IN_PROGRESS => 'InProgress' ,
2020-12-17 11:57:12 +01:00
self :: STATUS_WAITING => 'OnHold' ,
2021-06-26 16:10:56 +02:00
self :: STATUS_NEED_MORE_INFO => 'NeedMoreInformationShort' ,
2021-07-30 00:40:06 +02:00
self :: STATUS_CLOSED => 'SolvedClosed' ,
2020-10-30 20:37:23 +01:00
self :: STATUS_CANCELED => 'Canceled'
);
$this -> statuts = array (
self :: STATUS_NOT_READ => 'Unread' ,
self :: STATUS_READ => 'Read' ,
self :: STATUS_ASSIGNED => 'Assigned' ,
self :: STATUS_IN_PROGRESS => 'InProgress' ,
2020-12-17 11:57:12 +01:00
self :: STATUS_WAITING => 'OnHold' ,
2020-10-30 20:37:23 +01:00
self :: STATUS_NEED_MORE_INFO => 'NeedMoreInformation' ,
2021-07-30 00:40:06 +02:00
self :: STATUS_CLOSED => 'SolvedClosed' ,
2020-10-30 20:37:23 +01:00
self :: STATUS_CANCELED => 'Canceled'
);
2020-04-16 00:42:57 +02:00
}
/**
* Check properties of ticket are ok ( like ref , track_id , ... ) .
* All properties must be already loaded on object ( this -> ref , this -> track_id , ... ) .
*
* @ return int 0 if OK , < 0 if KO
*/
private function verify ()
{
$this -> errors = array ();
$result = 0 ;
// Clean parameters
if ( isset ( $this -> ref )) {
$this -> ref = trim ( $this -> ref );
}
if ( isset ( $this -> track_id )) {
$this -> track_id = trim ( $this -> track_id );
}
if ( isset ( $this -> fk_soc )) {
$this -> fk_soc = ( int ) $this -> fk_soc ;
}
if ( isset ( $this -> fk_project )) {
$this -> fk_project = ( int ) $this -> fk_project ;
}
if ( isset ( $this -> origin_email )) {
$this -> origin_email = trim ( $this -> origin_email );
}
if ( isset ( $this -> fk_user_create )) {
$this -> fk_user_create = ( int ) $this -> fk_user_create ;
}
if ( isset ( $this -> fk_user_assign )) {
$this -> fk_user_assign = ( int ) $this -> fk_user_assign ;
}
if ( isset ( $this -> subject )) {
$this -> subject = trim ( $this -> subject );
}
if ( isset ( $this -> message )) {
$this -> message = trim ( $this -> message );
}
if ( isset ( $this -> fk_statut )) {
$this -> fk_statut = ( int ) $this -> fk_statut ;
}
if ( isset ( $this -> resolution )) {
$this -> resolution = trim ( $this -> resolution );
}
if ( isset ( $this -> progress )) {
$this -> progress = trim ( $this -> progress );
}
if ( isset ( $this -> timing )) {
$this -> timing = trim ( $this -> timing );
}
if ( isset ( $this -> type_code )) {
$this -> type_code = trim ( $this -> type_code );
}
if ( isset ( $this -> category_code )) {
$this -> category_code = trim ( $this -> category_code );
}
if ( isset ( $this -> severity_code )) {
$this -> severity_code = trim ( $this -> severity_code );
}
if ( empty ( $this -> ref )) {
$this -> errors [] = 'ErrorTicketRefRequired' ;
dol_syslog ( get_class ( $this ) . " ::create error -1 ref null " , LOG_ERR );
$result = - 1 ;
}
return $result ;
}
/**
* Create object into database
*
* @ param User $user User that creates
* @ param int $notrigger 0 = launch triggers after , 1 = disable triggers
* @ return int < 0 if KO , Id of created object if OK
*/
public function create ( $user , $notrigger = 0 )
{
global $conf , $langs ;
$error = 0 ;
// Clean parameters
$this -> datec = dol_now ();
2021-02-26 13:27:00 +01:00
if ( empty ( $this -> track_id )) {
$this -> track_id = generate_random_id ( 16 );
}
2020-04-16 00:42:57 +02:00
// Check more parameters
// If error, this->errors[] is filled
$result = $this -> verify ();
if ( $result >= 0 ) {
// Insert request
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " ticket( " ;
$sql .= " ref, " ;
$sql .= " track_id, " ;
$sql .= " fk_soc, " ;
$sql .= " fk_project, " ;
$sql .= " origin_email, " ;
$sql .= " fk_user_create, " ;
$sql .= " fk_user_assign, " ;
2020-08-21 01:11:22 +02:00
$sql .= " email_msgid, " ;
2020-04-16 00:42:57 +02:00
$sql .= " subject, " ;
$sql .= " message, " ;
$sql .= " fk_statut, " ;
$sql .= " resolution, " ;
$sql .= " progress, " ;
$sql .= " timing, " ;
$sql .= " type_code, " ;
$sql .= " category_code, " ;
$sql .= " severity_code, " ;
$sql .= " datec, " ;
$sql .= " date_read, " ;
$sql .= " date_close, " ;
$sql .= " entity, " ;
$sql .= " notify_tiers_at_create " ;
$sql .= " ) VALUES ( " ;
$sql .= " " . ( ! isset ( $this -> ref ) ? '' : " ' " . $this -> db -> escape ( $this -> ref ) . " ' " ) . " , " ;
$sql .= " " . ( ! isset ( $this -> track_id ) ? 'NULL' : " ' " . $this -> db -> escape ( $this -> track_id ) . " ' " ) . " , " ;
$sql .= " " . ( $this -> fk_soc > 0 ? $this -> db -> escape ( $this -> fk_soc ) : " null " ) . " , " ;
$sql .= " " . ( $this -> fk_project > 0 ? $this -> db -> escape ( $this -> fk_project ) : " null " ) . " , " ;
$sql .= " " . ( ! isset ( $this -> origin_email ) ? 'NULL' : " ' " . $this -> db -> escape ( $this -> origin_email ) . " ' " ) . " , " ;
$sql .= " " . ( $this -> fk_user_create > 0 ? $this -> fk_user_create : ( $user -> id > 0 ? $user -> id : 'NULL' )) . " , " ;
$sql .= " " . ( $this -> fk_user_assign > 0 ? $this -> fk_user_assign : 'NULL' ) . " , " ;
2020-08-21 01:11:22 +02:00
$sql .= " " . ( empty ( $this -> email_msgid ) ? 'NULL' : " ' " . $this -> db -> escape ( $this -> email_msgid ) . " ' " ) . " , " ;
2020-04-16 00:42:57 +02:00
$sql .= " " . ( ! isset ( $this -> subject ) ? 'NULL' : " ' " . $this -> db -> escape ( $this -> subject ) . " ' " ) . " , " ;
$sql .= " " . ( ! isset ( $this -> message ) ? 'NULL' : " ' " . $this -> db -> escape ( $this -> message ) . " ' " ) . " , " ;
$sql .= " " . ( ! isset ( $this -> fk_statut ) ? '0' : " ' " . $this -> db -> escape ( $this -> fk_statut ) . " ' " ) . " , " ;
$sql .= " " . ( ! isset ( $this -> resolution ) ? 'NULL' : " ' " . $this -> db -> escape ( $this -> resolution ) . " ' " ) . " , " ;
$sql .= " " . ( ! isset ( $this -> progress ) ? '0' : " ' " . $this -> db -> escape ( $this -> progress ) . " ' " ) . " , " ;
$sql .= " " . ( ! isset ( $this -> timing ) ? 'NULL' : " ' " . $this -> db -> escape ( $this -> timing ) . " ' " ) . " , " ;
$sql .= " " . ( ! isset ( $this -> type_code ) ? 'NULL' : " ' " . $this -> db -> escape ( $this -> type_code ) . " ' " ) . " , " ;
2021-07-30 01:42:52 +02:00
$sql .= " " . ( empty ( $this -> category_code ) || $this -> category_code == '-1' ? 'NULL' : " ' " . $this -> db -> escape ( $this -> category_code ) . " ' " ) . " , " ;
2020-04-16 00:42:57 +02:00
$sql .= " " . ( ! isset ( $this -> severity_code ) ? 'NULL' : " ' " . $this -> db -> escape ( $this -> severity_code ) . " ' " ) . " , " ;
$sql .= " " . ( ! isset ( $this -> datec ) || dol_strlen ( $this -> datec ) == 0 ? 'NULL' : " ' " . $this -> db -> idate ( $this -> datec ) . " ' " ) . " , " ;
$sql .= " " . ( ! isset ( $this -> date_read ) || dol_strlen ( $this -> date_read ) == 0 ? 'NULL' : " ' " . $this -> db -> idate ( $this -> date_read ) . " ' " ) . " , " ;
$sql .= " " . ( ! isset ( $this -> date_close ) || dol_strlen ( $this -> date_close ) == 0 ? 'NULL' : " ' " . $this -> db -> idate ( $this -> date_close ) . " ' " ) . " " ;
2021-09-03 21:25:17 +02:00
$sql .= " , " . (( int ) $conf -> entity );
2020-04-16 00:42:57 +02:00
$sql .= " , " . ( ! isset ( $this -> notify_tiers_at_create ) ? '1' : " ' " . $this -> db -> escape ( $this -> notify_tiers_at_create ) . " ' " );
$sql .= " ) " ;
$this -> db -> begin ();
2021-08-27 22:42:04 +02:00
dol_syslog ( get_class ( $this ) . " ::create " , LOG_DEBUG );
2020-04-16 00:42:57 +02:00
$resql = $this -> db -> query ( $sql );
if ( ! $resql ) {
$error ++ ;
$this -> errors [] = " Error " . $this -> db -> lasterror ();
}
if ( ! $error ) {
$this -> id = $this -> db -> last_insert_id ( MAIN_DB_PREFIX . " ticket " );
if ( ! $notrigger ) {
// Call trigger
$result = $this -> call_trigger ( 'TICKET_CREATE' , $user );
if ( $result < 0 ) {
$error ++ ;
}
// End call triggers
}
}
2021-11-17 16:52:04 +01:00
if ( ! $error && ! empty ( $conf -> global -> TICKET_ADD_AUTHOR_AS_CONTACT )) {
// add creator as contributor
if ( $this -> add_contact ( $user -> id , 'CONTRIBUTOR' , 'internal' ) < 0 ) {
$error ++ ;
}
}
2020-04-16 00:42:57 +02:00
//Update extrafield
if ( ! $error ) {
2020-04-23 13:21:39 +02:00
$result = $this -> insertExtraFields ();
if ( $result < 0 ) {
$error ++ ;
2020-04-16 00:42:57 +02:00
}
}
// Commit or rollback
if ( $error ) {
foreach ( $this -> errors as $errmsg ) {
dol_syslog ( get_class ( $this ) . " ::create " . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
} else {
$this -> db -> commit ();
return $this -> id ;
}
} else {
$this -> db -> rollback ();
dol_syslog ( get_class ( $this ) . " ::Create fails verify " . join ( ',' , $this -> errors ), LOG_WARNING );
return - 3 ;
}
}
/**
* Load object in memory from the database
*
2020-08-23 18:04:52 +02:00
* @ param int $id Id object
* @ param string $ref Ref
* @ param string $track_id Track id , a hash like ref
* @ param string $email_msgid Email msgid
* @ return int < 0 if KO , > 0 if OK
2020-04-16 00:42:57 +02:00
*/
2020-08-23 18:04:52 +02:00
public function fetch ( $id = '' , $ref = '' , $track_id = '' , $email_msgid = '' )
2020-04-16 00:42:57 +02:00
{
global $langs ;
// Check parameters
2021-06-14 20:06:52 +02:00
if ( empty ( $id ) && empty ( $ref ) && empty ( $track_id ) && empty ( $email_msgid )) {
2020-04-16 00:42:57 +02:00
$this -> error = 'ErrorWrongParameters' ;
dol_print_error ( get_class ( $this ) . " ::fetch " . $this -> error );
return - 1 ;
}
$sql = " SELECT " ;
$sql .= " t.rowid, " ;
2020-08-21 01:11:22 +02:00
$sql .= " t.entity, " ;
2020-04-16 00:42:57 +02:00
$sql .= " t.ref, " ;
$sql .= " t.track_id, " ;
$sql .= " t.fk_soc, " ;
$sql .= " t.fk_project, " ;
$sql .= " t.origin_email, " ;
$sql .= " t.fk_user_create, " ;
$sql .= " t.fk_user_assign, " ;
2020-08-21 01:11:22 +02:00
$sql .= " t.email_msgid, " ;
2020-04-16 00:42:57 +02:00
$sql .= " t.subject, " ;
$sql .= " t.message, " ;
2020-06-26 19:35:09 +02:00
$sql .= " t.fk_statut as status, " ;
2020-04-16 00:42:57 +02:00
$sql .= " t.resolution, " ;
$sql .= " t.progress, " ;
$sql .= " t.timing, " ;
$sql .= " t.type_code, " ;
$sql .= " t.category_code, " ;
$sql .= " t.severity_code, " ;
$sql .= " t.datec, " ;
$sql .= " t.date_read, " ;
2022-02-04 16:14:41 +01:00
$sql .= " t.date_last_msg_sent, " ;
2020-04-16 00:42:57 +02:00
$sql .= " t.date_close, " ;
2022-01-02 18:22:18 +01:00
$sql .= " t.tms, " ;
$sql .= " type.label as type_label, category.label as category_label, severity.label as severity_label " ;
2020-04-16 00:42:57 +02:00
$sql .= " FROM " . MAIN_DB_PREFIX . " ticket as t " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " c_ticket_type as type ON type.code=t.type_code " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " c_ticket_category as category ON category.code=t.category_code " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " c_ticket_severity as severity ON severity.code=t.severity_code " ;
if ( $id ) {
2021-03-30 19:12:07 +02:00
$sql .= " WHERE t.rowid = " . (( int ) $id );
2020-04-16 00:42:57 +02:00
} else {
$sql .= " WHERE t.entity IN ( " . getEntity ( $this -> element , 1 ) . " ) " ;
2020-09-07 10:18:17 +02:00
if ( ! empty ( $ref )) {
2020-04-16 00:42:57 +02:00
$sql .= " AND t.ref = ' " . $this -> db -> escape ( $ref ) . " ' " ;
2020-08-23 18:04:52 +02:00
} elseif ( $track_id ) {
$sql .= " AND t.track_id = ' " . $this -> db -> escape ( $track_id ) . " ' " ;
} else {
$sql .= " AND t.email_msgid = ' " . $this -> db -> escape ( $email_msgid ) . " ' " ;
2020-04-16 00:42:57 +02:00
}
}
2021-08-27 22:42:04 +02:00
dol_syslog ( get_class ( $this ) . " ::fetch " , LOG_DEBUG );
2020-04-16 00:42:57 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
2021-02-26 13:27:00 +01:00
if ( $this -> db -> num_rows ( $resql )) {
2020-04-16 00:42:57 +02:00
$obj = $this -> db -> fetch_object ( $resql );
$this -> id = $obj -> rowid ;
2021-10-22 15:12:56 +02:00
$this -> entity = $obj -> entity ;
2020-04-16 00:42:57 +02:00
$this -> ref = $obj -> ref ;
$this -> track_id = $obj -> track_id ;
$this -> fk_soc = $obj -> fk_soc ;
$this -> socid = $obj -> fk_soc ; // for fetch_thirdparty() method
$this -> fk_project = $obj -> fk_project ;
$this -> origin_email = $obj -> origin_email ;
$this -> fk_user_create = $obj -> fk_user_create ;
$this -> fk_user_assign = $obj -> fk_user_assign ;
2020-08-21 01:11:22 +02:00
$this -> email_msgid = $obj -> email_msgid ;
2020-04-16 00:42:57 +02:00
$this -> subject = $obj -> subject ;
$this -> message = $obj -> message ;
2020-06-26 19:35:09 +02:00
$this -> status = $obj -> status ;
2020-09-07 10:18:17 +02:00
$this -> fk_statut = $this -> status ; // For backward compatibility
2020-06-26 19:35:09 +02:00
2020-04-16 00:42:57 +02:00
$this -> resolution = $obj -> resolution ;
$this -> progress = $obj -> progress ;
$this -> timing = $obj -> timing ;
$this -> type_code = $obj -> type_code ;
// Si traduction existe, on l'utilise, sinon on prend le libelle par defaut
$label_type = ( $langs -> trans ( " TicketTypeShort " . $obj -> type_code ) != ( " TicketTypeShort " . $obj -> type_code ) ? $langs -> trans ( " TicketTypeShort " . $obj -> type_code ) : ( $obj -> type_label != '-' ? $obj -> type_label : '' ));
$this -> type_label = $label_type ;
$this -> category_code = $obj -> category_code ;
// Si traduction existe, on l'utilise, sinon on prend le libelle par defaut
$label_category = ( $langs -> trans ( " TicketCategoryShort " . $obj -> category_code ) != ( " TicketCategoryShort " . $obj -> category_code ) ? $langs -> trans ( " TicketCategoryShort " . $obj -> category_code ) : ( $obj -> category_label != '-' ? $obj -> category_label : '' ));
$this -> category_label = $label_category ;
$this -> severity_code = $obj -> severity_code ;
// Si traduction existe, on l'utilise, sinon on prend le libelle par defaut
$label_severity = ( $langs -> trans ( " TicketSeverityShort " . $obj -> severity_code ) != ( " TicketSeverityShort " . $obj -> severity_code ) ? $langs -> trans ( " TicketSeverityShort " . $obj -> severity_code ) : ( $obj -> severity_label != '-' ? $obj -> severity_label : '' ));
$this -> severity_label = $label_severity ;
$this -> datec = $this -> db -> jdate ( $obj -> datec );
$this -> date_creation = $this -> db -> jdate ( $obj -> datec );
$this -> date_read = $this -> db -> jdate ( $obj -> date_read );
$this -> date_validation = $this -> db -> jdate ( $obj -> date_read );
2022-02-04 16:14:41 +01:00
$this -> date_last_msg_sent = $this -> db -> jdate ( $obj -> date_last_msg_sent );
2020-04-16 00:42:57 +02:00
$this -> date_close = $this -> db -> jdate ( $obj -> date_close );
$this -> tms = $this -> db -> jdate ( $obj -> tms );
$this -> date_modification = $this -> db -> jdate ( $obj -> tms );
$this -> fetch_optionals ();
$this -> db -> free ( $resql );
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2020-04-16 00:42:57 +02:00
return 0 ;
}
} else {
$this -> error = " Error " . $this -> db -> lasterror ();
dol_syslog ( get_class ( $this ) . " ::fetch " . $this -> error , LOG_ERR );
return - 1 ;
}
}
/**
* Load all objects in memory from database
*
* @ param User $user User for action
* @ param string $sortorder Sort order
* @ param string $sortfield Sort field
* @ param int $limit page number
* @ param int $offset Offset for query
* @ param int $arch archive or not ( not used )
* @ param array $filter Filter for query
* output
* @ return int < 0 if KO , > 0 if OK
*/
public function fetchAll ( $user , $sortorder = 'ASC' , $sortfield = 't.datec' , $limit = '' , $offset = 0 , $arch = '' , $filter = '' )
{
global $langs ;
$extrafields = new ExtraFields ( $this -> db );
// fetch optionals attributes and labels
$extrafields -> fetch_name_optionals_label ( $this -> table_element );
$sql = " SELECT " ;
$sql .= " t.rowid, " ;
$sql .= " t.ref, " ;
$sql .= " t.track_id, " ;
$sql .= " t.fk_soc, " ;
$sql .= " t.fk_project, " ;
$sql .= " t.origin_email, " ;
$sql .= " t.fk_user_create, uc.lastname as user_create_lastname, uc.firstname as user_create_firstname, " ;
$sql .= " t.fk_user_assign, ua.lastname as user_assign_lastname, ua.firstname as user_assign_firstname, " ;
$sql .= " t.subject, " ;
$sql .= " t.message, " ;
$sql .= " t.fk_statut, " ;
$sql .= " t.resolution, " ;
$sql .= " t.progress, " ;
$sql .= " t.timing, " ;
$sql .= " t.type_code, " ;
$sql .= " t.category_code, " ;
$sql .= " t.severity_code, " ;
$sql .= " t.datec, " ;
$sql .= " t.date_read, " ;
2022-02-04 16:14:41 +01:00
$sql .= " t.date_last_msg_sent, " ;
2020-04-16 00:42:57 +02:00
$sql .= " t.date_close, " ;
$sql .= " t.tms " ;
$sql .= " , type.label as type_label, category.label as category_label, severity.label as severity_label " ;
// Add fields for extrafields
foreach ( $extrafields -> attributes [ $this -> table_element ][ 'label' ] as $key => $val ) {
2021-08-27 22:42:04 +02:00
$sql .= ( $extrafields -> attributes [ $this -> table_element ][ 'type' ][ $key ] != 'separate' ? " ,ef. " . $key . " as options_ " . $key : '' );
2020-04-16 00:42:57 +02:00
}
$sql .= " FROM " . MAIN_DB_PREFIX . " ticket as t " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " c_ticket_type as type ON type.code=t.type_code " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " c_ticket_category as category ON category.code=t.category_code " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " c_ticket_severity as severity ON severity.code=t.severity_code " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " societe as s ON s.rowid=t.fk_soc " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " user as uc ON uc.rowid=t.fk_user_create " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " user as ua ON ua.rowid=t.fk_user_assign " ;
if ( is_array ( $extrafields -> attributes [ $this -> table_element ][ 'label' ]) && count ( $extrafields -> attributes [ $this -> table_element ][ 'label' ])) {
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " ticket_extrafields as ef on (t.rowid = ef.fk_object) " ;
}
2021-10-22 22:15:59 +02:00
if ( empty ( $user -> rights -> societe -> client -> voir ) && ! $user -> socid ) {
2020-04-16 00:42:57 +02:00
$sql .= " , " . MAIN_DB_PREFIX . " societe_commerciaux as sc " ;
}
$sql .= " WHERE t.entity IN ( " . getEntity ( 'ticket' ) . " ) " ;
// Manage filter
if ( ! empty ( $filter )) {
foreach ( $filter as $key => $value ) {
if ( strpos ( $key , 'date' )) { // To allow $filter['YEAR(s.dated)']=>$year
2021-08-28 01:45:53 +02:00
$sql .= " AND " . $key . " = ' " . $this -> db -> escape ( $value ) . " ' " ;
2020-04-16 00:42:57 +02:00
} elseif (( $key == 't.fk_user_assign' ) || ( $key == 't.type_code' ) || ( $key == 't.category_code' ) || ( $key == 't.severity_code' ) || ( $key == 't.fk_soc' )) {
$sql .= " AND " . $key . " = ' " . $this -> db -> escape ( $value ) . " ' " ;
} elseif ( $key == 't.fk_statut' ) {
if ( is_array ( $value ) && count ( $value ) > 0 ) {
2021-08-28 01:45:53 +02:00
$sql .= " AND " . $key . " IN ( " . $this -> db -> sanitize ( implode ( ',' , $value )) . " ) " ;
2020-04-16 00:42:57 +02:00
} else {
2021-08-28 01:45:53 +02:00
$sql .= " AND " . $key . ' = ' . (( int ) $value );
2020-04-16 00:42:57 +02:00
}
} else {
2021-08-28 01:45:53 +02:00
$sql .= " AND " . $key . " LIKE '% " . $this -> db -> escape ( $value ) . " %' " ;
2020-04-16 00:42:57 +02:00
}
}
}
2021-10-22 22:15:59 +02:00
if ( empty ( $user -> rights -> societe -> client -> voir ) && ! $user -> socid ) {
2021-08-23 17:41:11 +02:00
$sql .= " AND t.fk_soc = sc.fk_soc AND sc.fk_user = " . (( int ) $user -> id );
2020-04-16 00:42:57 +02:00
} elseif ( $user -> socid ) {
2021-08-23 17:41:11 +02:00
$sql .= " AND t.fk_soc = " . (( int ) $user -> socid );
2020-04-16 00:42:57 +02:00
}
2021-08-28 03:09:18 +02:00
$sql .= $this -> db -> order ( $sortfield , $sortorder );
2020-04-16 00:42:57 +02:00
if ( ! empty ( $limit )) {
2021-08-27 22:42:04 +02:00
$sql .= $this -> db -> plimit ( $limit + 1 , $offset );
2020-04-16 00:42:57 +02:00
}
2022-04-30 19:50:20 +02:00
dol_syslog ( get_class ( $this ) . " ::fetchAll " , LOG_DEBUG );
2020-04-16 00:42:57 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
$this -> lines = array ();
$num = $this -> db -> num_rows ( $resql );
$i = 0 ;
if ( $num ) {
while ( $i < $num ) {
$obj = $this -> db -> fetch_object ( $resql );
$line = new TicketsLine ();
$line -> id = $obj -> rowid ;
$line -> rowid = $obj -> rowid ;
$line -> ref = $obj -> ref ;
$line -> track_id = $obj -> track_id ;
$line -> fk_soc = $obj -> fk_soc ;
$line -> fk_project = $obj -> fk_project ;
$line -> origin_email = $obj -> origin_email ;
$line -> fk_user_create = $obj -> fk_user_create ;
$line -> user_create_lastname = $obj -> user_create_lastname ;
$line -> user_create_firstname = $obj -> user_create_firstname ;
$line -> fk_user_assign = $obj -> fk_user_assign ;
$line -> user_assign_lastname = $obj -> user_assign_lastname ;
$line -> user_assign_firstname = $obj -> user_assign_firstname ;
$line -> subject = $obj -> subject ;
$line -> message = $obj -> message ;
$line -> fk_statut = $obj -> fk_statut ;
$line -> resolution = $obj -> resolution ;
$line -> progress = $obj -> progress ;
$line -> timing = $obj -> timing ;
// Si traduction existe, on l'utilise, sinon on prend le libelle par defaut
$label_type = ( $langs -> trans ( " TicketTypeShort " . $obj -> type_code ) != ( " TicketTypeShort " . $obj -> type_code ) ? $langs -> trans ( " TicketTypeShort " . $obj -> type_code ) : ( $obj -> type_label != '-' ? $obj -> type_label : '' ));
$line -> type_label = $label_type ;
$this -> category_code = $obj -> category_code ;
// Si traduction existe, on l'utilise, sinon on prend le libelle par defaut
$label_category = ( $langs -> trans ( " TicketCategoryShort " . $obj -> category_code ) != ( " TicketCategoryShort " . $obj -> category_code ) ? $langs -> trans ( " TicketCategoryShort " . $obj -> category_code ) : ( $obj -> category_label != '-' ? $obj -> category_label : '' ));
$line -> category_label = $label_category ;
$this -> severity_code = $obj -> severity_code ;
// Si traduction existe, on l'utilise, sinon on prend le libelle par defaut
$label_severity = ( $langs -> trans ( " TicketSeverityShort " . $obj -> severity_code ) != ( " TicketSeverityShort " . $obj -> severity_code ) ? $langs -> trans ( " TicketSeverityShort " . $obj -> severity_code ) : ( $obj -> severity_label != '-' ? $obj -> severity_label : '' ));
$line -> severity_label = $label_severity ;
$line -> datec = $this -> db -> jdate ( $obj -> datec );
$line -> date_read = $this -> db -> jdate ( $obj -> date_read );
2022-02-04 16:14:41 +01:00
$line -> date_last_msg_sent = $this -> db -> jdate ( $obj -> date_last_msg_sent );
2020-04-16 00:42:57 +02:00
$line -> date_close = $this -> db -> jdate ( $obj -> date_close );
// Extra fields
if ( is_array ( $extrafields -> attributes [ $this -> table_element ][ 'label' ]) && count ( $extrafields -> attributes [ $this -> table_element ][ 'label' ])) {
foreach ( $extrafields -> attributes [ $this -> table_element ][ 'label' ] as $key => $val ) {
$tmpkey = 'options_' . $key ;
$line -> { $tmpkey } = $obj -> $tmpkey ;
}
}
$this -> lines [ $i ] = $line ;
$i ++ ;
}
}
$this -> db -> free ( $resql );
return $num ;
} else {
$this -> error = " Error " . $this -> db -> lasterror ();
2022-04-30 19:50:20 +02:00
dol_syslog ( get_class ( $this ) . " ::fetchAll " . $this -> error , LOG_ERR );
2020-04-16 00:42:57 +02:00
return - 1 ;
}
}
/**
* Update object into database
*
* @ param User $user User that modifies
* @ param int $notrigger 0 = launch triggers after , 1 = disable triggers
* @ return int < 0 if KO , > 0 if OK
*/
public function update ( $user = 0 , $notrigger = 0 )
{
global $conf , $langs , $hookmanager ;
$error = 0 ;
// Clean parameters
if ( isset ( $this -> ref )) {
$this -> ref = trim ( $this -> ref );
}
if ( isset ( $this -> track_id )) {
$this -> track_id = trim ( $this -> track_id );
}
if ( isset ( $this -> fk_soc )) {
$this -> fk_soc = ( int ) $this -> fk_soc ;
}
if ( isset ( $this -> fk_project )) {
$this -> fk_project = ( int ) $this -> fk_project ;
}
if ( isset ( $this -> origin_email )) {
$this -> origin_email = trim ( $this -> origin_email );
}
if ( isset ( $this -> fk_user_create )) {
$this -> fk_user_create = ( int ) $this -> fk_user_create ;
}
if ( isset ( $this -> fk_user_assign )) {
$this -> fk_user_assign = ( int ) $this -> fk_user_assign ;
}
if ( isset ( $this -> subject )) {
$this -> subject = trim ( $this -> subject );
}
if ( isset ( $this -> message )) {
$this -> message = trim ( $this -> message );
}
if ( isset ( $this -> fk_statut )) {
$this -> fk_statut = ( int ) $this -> fk_statut ;
}
if ( isset ( $this -> resolution )) {
$this -> resolution = trim ( $this -> resolution );
}
if ( isset ( $this -> progress )) {
$this -> progress = trim ( $this -> progress );
}
if ( isset ( $this -> timing )) {
$this -> timing = trim ( $this -> timing );
}
if ( isset ( $this -> type_code )) {
$this -> timing = trim ( $this -> type_code );
}
if ( isset ( $this -> category_code )) {
$this -> timing = trim ( $this -> category_code );
}
if ( isset ( $this -> severity_code )) {
$this -> timing = trim ( $this -> severity_code );
}
// Check parameters
// Put here code to add a control on parameters values
// Update request
$sql = " UPDATE " . MAIN_DB_PREFIX . " ticket SET " ;
$sql .= " ref= " . ( isset ( $this -> ref ) ? " ' " . $this -> db -> escape ( $this -> ref ) . " ' " : " " ) . " , " ;
$sql .= " track_id= " . ( isset ( $this -> track_id ) ? " ' " . $this -> db -> escape ( $this -> track_id ) . " ' " : " null " ) . " , " ;
$sql .= " fk_soc= " . ( isset ( $this -> fk_soc ) ? " ' " . $this -> db -> escape ( $this -> fk_soc ) . " ' " : " null " ) . " , " ;
$sql .= " fk_project= " . ( isset ( $this -> fk_project ) ? " ' " . $this -> db -> escape ( $this -> fk_project ) . " ' " : " null " ) . " , " ;
$sql .= " origin_email= " . ( isset ( $this -> origin_email ) ? " ' " . $this -> db -> escape ( $this -> origin_email ) . " ' " : " null " ) . " , " ;
$sql .= " fk_user_create= " . ( isset ( $this -> fk_user_create ) ? $this -> fk_user_create : " null " ) . " , " ;
$sql .= " fk_user_assign= " . ( isset ( $this -> fk_user_assign ) ? $this -> fk_user_assign : " null " ) . " , " ;
$sql .= " subject= " . ( isset ( $this -> subject ) ? " ' " . $this -> db -> escape ( $this -> subject ) . " ' " : " null " ) . " , " ;
$sql .= " message= " . ( isset ( $this -> message ) ? " ' " . $this -> db -> escape ( $this -> message ) . " ' " : " null " ) . " , " ;
$sql .= " fk_statut= " . ( isset ( $this -> fk_statut ) ? $this -> fk_statut : " null " ) . " , " ;
$sql .= " resolution= " . ( isset ( $this -> resolution ) ? $this -> resolution : " null " ) . " , " ;
$sql .= " progress= " . ( isset ( $this -> progress ) ? " ' " . $this -> db -> escape ( $this -> progress ) . " ' " : " null " ) . " , " ;
$sql .= " timing= " . ( isset ( $this -> timing ) ? " ' " . $this -> db -> escape ( $this -> timing ) . " ' " : " null " ) . " , " ;
$sql .= " type_code= " . ( isset ( $this -> type_code ) ? " ' " . $this -> db -> escape ( $this -> type_code ) . " ' " : " null " ) . " , " ;
$sql .= " category_code= " . ( isset ( $this -> category_code ) ? " ' " . $this -> db -> escape ( $this -> category_code ) . " ' " : " null " ) . " , " ;
$sql .= " severity_code= " . ( isset ( $this -> severity_code ) ? " ' " . $this -> db -> escape ( $this -> severity_code ) . " ' " : " null " ) . " , " ;
$sql .= " datec= " . ( dol_strlen ( $this -> datec ) != 0 ? " ' " . $this -> db -> idate ( $this -> datec ) . " ' " : 'null' ) . " , " ;
$sql .= " date_read= " . ( dol_strlen ( $this -> date_read ) != 0 ? " ' " . $this -> db -> idate ( $this -> date_read ) . " ' " : 'null' ) . " , " ;
2022-02-04 16:14:41 +01:00
$sql .= " date_last_msg_sent= " . ( dol_strlen ( $this -> date_last_msg_sent ) != 0 ? " ' " . $this -> db -> idate ( $this -> date_last_msg_sent ) . " ' " : 'null' ) . " , " ;
2020-04-16 00:42:57 +02:00
$sql .= " date_close= " . ( dol_strlen ( $this -> date_close ) != 0 ? " ' " . $this -> db -> idate ( $this -> date_close ) . " ' " : 'null' ) . " " ;
2021-03-14 12:20:23 +01:00
$sql .= " WHERE rowid= " . (( int ) $this -> id );
2020-04-16 00:42:57 +02:00
$this -> db -> begin ();
$resql = $this -> db -> query ( $sql );
if ( ! $resql ) {
$error ++ ;
$this -> errors [] = " Error " . $this -> db -> lasterror ();
}
if ( ! $error ) {
// Update extrafields
2020-04-23 13:21:39 +02:00
$result = $this -> insertExtraFields ();
if ( $result < 0 ) {
$error ++ ;
2020-04-16 00:42:57 +02:00
}
}
if ( ! $error && ! $notrigger ) {
// Call trigger
$result = $this -> call_trigger ( 'TICKET_MODIFY' , $user );
if ( $result < 0 ) {
$error ++ ;
}
// End call triggers
}
// Commit or rollback
if ( $error ) {
foreach ( $this -> errors as $errmsg ) {
dol_syslog ( get_class ( $this ) . " ::update " . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
} else {
$this -> db -> commit ();
return 1 ;
}
}
/**
* Delete object in database
*
* @ param User $user User that deletes
* @ param int $notrigger 0 = launch triggers after , 1 = disable triggers
* @ return int < 0 if KO , > 0 if OK
*/
public function delete ( $user , $notrigger = 0 )
{
global $conf , $langs ;
$error = 0 ;
$this -> db -> begin ();
if ( ! $error ) {
if ( ! $notrigger ) {
// Call trigger
$result = $this -> call_trigger ( 'TICKET_DELETE' , $user );
if ( $result < 0 ) {
$error ++ ;
}
// End call triggers
}
}
if ( ! $error ) {
// Delete linked contacts
$res = $this -> delete_linked_contact ();
if ( $res < 0 ) {
dol_syslog ( get_class ( $this ) . " ::delete error " , LOG_ERR );
$error ++ ;
}
}
if ( ! $error ) {
// Delete linked object
$res = $this -> deleteObjectLinked ();
2021-02-26 13:27:00 +01:00
if ( $res < 0 ) {
$error ++ ;
}
2020-04-16 00:42:57 +02:00
}
// Removed extrafields
if ( ! $error ) {
$result = $this -> deleteExtraFields ();
if ( $result < 0 ) {
$error ++ ;
dol_syslog ( get_class ( $this ) . " ::delete error -3 " . $this -> error , LOG_ERR );
}
}
if ( ! $error ) {
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " ticket " ;
2021-03-14 12:20:23 +01:00
$sql .= " WHERE rowid= " . (( int ) $this -> id );
2020-04-16 00:42:57 +02:00
dol_syslog ( get_class ( $this ) . " ::delete sql= " . $sql );
$resql = $this -> db -> query ( $sql );
if ( ! $resql ) {
$error ++ ;
$this -> errors [] = " Error " . $this -> db -> lasterror ();
}
}
// Commit or rollback
if ( $error ) {
foreach ( $this -> errors as $errmsg ) {
dol_syslog ( get_class ( $this ) . " ::delete " . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
} else {
$this -> db -> commit ();
return 1 ;
}
}
/**
* Load an object from its id and create a new one in database
*
* @ param User $user User that clone
* @ param int $fromid Id of object to clone
* @ return int New id of clone
*/
public function createFromClone ( User $user , $fromid )
{
$error = 0 ;
$object = new Ticket ( $this -> db );
$this -> db -> begin ();
// Load source object
$object -> fetch ( $fromid );
$object -> id = 0 ;
$object -> statut = 0 ;
// Clear fields
// ...
// Create clone
$object -> context [ 'createfromclone' ] = 'createfromclone' ;
$result = $object -> create ( $user );
// Other options
if ( $result < 0 ) {
$this -> error = $object -> error ;
$error ++ ;
}
if ( ! $error ) {
}
unset ( $object -> context [ 'createfromclone' ]);
// End
if ( ! $error ) {
$this -> db -> commit ();
return $object -> id ;
} else {
$this -> db -> rollback ();
return - 1 ;
}
}
/**
* Initialise object with example values
* Id must be 0 if object instance is a specimen
*
2020-10-30 20:37:23 +01:00
* @ return int
2020-04-16 00:42:57 +02:00
*/
public function initAsSpecimen ()
{
$this -> id = 0 ;
2020-10-30 20:37:23 +01:00
$this -> entity = 1 ;
2020-04-16 00:42:57 +02:00
$this -> ref = 'TI0501-001' ;
$this -> track_id = 'XXXXaaaa' ;
$this -> origin_email = 'email@email.com' ;
$this -> fk_project = 1 ;
$this -> fk_user_create = 1 ;
$this -> fk_user_assign = 1 ;
$this -> subject = 'Subject of ticket' ;
$this -> message = 'Message of ticket' ;
2020-10-30 20:37:23 +01:00
$this -> status = 0 ;
2020-04-16 00:42:57 +02:00
$this -> resolution = '1' ;
$this -> progress = '10' ;
2021-10-19 16:26:43 +02:00
//$this->timing = '30';
2020-04-16 00:42:57 +02:00
$this -> type_code = 'TYPECODE' ;
$this -> category_code = 'CATEGORYCODE' ;
$this -> severity_code = 'SEVERITYCODE' ;
$this -> datec = '' ;
$this -> date_read = '' ;
2022-02-04 16:14:41 +01:00
$this -> date_last_msg_sent = '' ;
2020-04-16 00:42:57 +02:00
$this -> date_close = '' ;
$this -> tms = '' ;
2020-10-30 20:37:23 +01:00
return 1 ;
2020-04-16 00:42:57 +02:00
}
/**
2021-05-28 14:12:22 +02:00
* Print selected status
2020-04-16 00:42:57 +02:00
*
2021-05-28 14:12:22 +02:00
* @ param string $selected Selected status
* @ return void
2020-04-16 00:42:57 +02:00
*/
public function printSelectStatus ( $selected = " " )
{
print Form :: selectarray ( 'search_fk_statut' , $this -> statuts_short , $selected , $show_empty = 1 , $key_in_label = 0 , $value_as_key = 0 , $option = '' , $translate = 1 , $maxlen = 0 , $disabled = 0 , $sort = '' , $morecss = '' );
}
/**
2021-05-28 14:12:22 +02:00
* Load into a cache the types of tickets ( setup done into dictionaries )
2020-04-16 00:42:57 +02:00
*
2021-05-28 14:12:22 +02:00
* @ return int Number of lines loaded , 0 if already loaded , < 0 if KO
2020-04-16 00:42:57 +02:00
*/
public function loadCacheTypesTickets ()
{
global $langs ;
if ( ! empty ( $this -> cache_types_tickets ) && count ( $this -> cache_types_tickets )) {
return 0 ;
}
// Cache deja charge
$sql = " SELECT rowid, code, label, use_default, pos, description " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " c_ticket_type " ;
$sql .= " WHERE active > 0 " ;
$sql .= " ORDER BY pos " ;
2021-08-27 22:42:04 +02:00
dol_syslog ( get_class ( $this ) . " ::load_cache_type_tickets " , LOG_DEBUG );
2020-04-16 00:42:57 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
$num = $this -> db -> num_rows ( $resql );
$i = 0 ;
while ( $i < $num ) {
$obj = $this -> db -> fetch_object ( $resql );
// Si traduction existe, on l'utilise, sinon on prend le libelle par defaut
$label = ( $langs -> trans ( " TicketTypeShort " . $obj -> code ) != ( " TicketTypeShort " . $obj -> code ) ? $langs -> trans ( " TicketTypeShort " . $obj -> code ) : ( $obj -> label != '-' ? $obj -> label : '' ));
$this -> cache_types_tickets [ $obj -> rowid ][ 'code' ] = $obj -> code ;
$this -> cache_types_tickets [ $obj -> rowid ][ 'label' ] = $label ;
$this -> cache_types_tickets [ $obj -> rowid ][ 'use_default' ] = $obj -> use_default ;
$this -> cache_types_tickets [ $obj -> rowid ][ 'pos' ] = $obj -> pos ;
$i ++ ;
}
return $num ;
} else {
dol_print_error ( $this -> db );
return - 1 ;
}
}
/**
2021-09-16 14:31:20 +02:00
* Load into a cache array , the list of ticket categories ( setup done into dictionary )
2020-04-16 00:42:57 +02:00
*
* @ return int Number of lines loaded , 0 if already loaded , < 0 if KO
*/
public function loadCacheCategoriesTickets ()
{
2021-09-16 14:31:20 +02:00
global $conf , $langs ;
2020-04-16 00:42:57 +02:00
if ( ! empty ( $this -> cache_category_ticket ) && count ( $this -> cache_category_tickets )) {
2021-09-16 14:31:20 +02:00
// Cache already loaded
2020-04-16 00:42:57 +02:00
return 0 ;
}
2021-07-10 20:09:51 +02:00
$sql = " SELECT rowid, code, label, use_default, pos, description, public, active, force_severity, fk_parent " ;
2020-04-16 00:42:57 +02:00
$sql .= " FROM " . MAIN_DB_PREFIX . " c_ticket_category " ;
2021-09-16 14:31:20 +02:00
$sql .= " WHERE active > 0 AND entity = " . (( int ) $conf -> entity );
2020-04-16 00:42:57 +02:00
$sql .= " ORDER BY pos " ;
2021-08-27 22:42:04 +02:00
dol_syslog ( get_class ( $this ) . " ::load_cache_categories_tickets " , LOG_DEBUG );
2020-04-16 00:42:57 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
$num = $this -> db -> num_rows ( $resql );
$i = 0 ;
while ( $i < $num ) {
$obj = $this -> db -> fetch_object ( $resql );
$this -> cache_category_tickets [ $obj -> rowid ][ 'code' ] = $obj -> code ;
$this -> cache_category_tickets [ $obj -> rowid ][ 'use_default' ] = $obj -> use_default ;
$this -> cache_category_tickets [ $obj -> rowid ][ 'pos' ] = $obj -> pos ;
2021-03-24 13:16:17 +01:00
$this -> cache_category_tickets [ $obj -> rowid ][ 'public' ] = $obj -> public ;
$this -> cache_category_tickets [ $obj -> rowid ][ 'active' ] = $obj -> active ;
2021-07-10 20:09:51 +02:00
$this -> cache_category_tickets [ $obj -> rowid ][ 'force_severity' ] = $obj -> force_severity ;
$this -> cache_category_tickets [ $obj -> rowid ][ 'fk_parent' ] = $obj -> fk_parent ;
2021-09-16 14:31:20 +02:00
// If translation exists, we use it to store already translated string.
// Warning: You should not use this and recompute the translated string into caller code to get the value into expected language
$label = ( $langs -> trans ( " TicketCategoryShort " . $obj -> code ) != ( " TicketCategoryShort " . $obj -> code ) ? $langs -> trans ( " TicketCategoryShort " . $obj -> code ) : ( $obj -> label != '-' ? $obj -> label : '' ));
$this -> cache_category_tickets [ $obj -> rowid ][ 'label' ] = $label ;
2020-04-16 00:42:57 +02:00
$i ++ ;
}
return $num ;
} else {
dol_print_error ( $this -> db );
return - 1 ;
}
}
/**
* Charge dans cache la liste des sévérité de tickets ( paramétrable dans dictionnaire )
*
* @ return int Number of lines loaded , 0 if already loaded , < 0 if KO
*/
public function loadCacheSeveritiesTickets ()
{
global $langs ;
if ( ! empty ( $this -> cache_severity_tickets ) && count ( $this -> cache_severity_tickets )) {
return 0 ;
}
// Cache deja charge
$sql = " SELECT rowid, code, label, use_default, pos, description " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " c_ticket_severity " ;
$sql .= " WHERE active > 0 " ;
$sql .= " ORDER BY pos " ;
2021-08-27 22:42:04 +02:00
dol_syslog ( get_class ( $this ) . " ::loadCacheSeveritiesTickets " , LOG_DEBUG );
2020-04-16 00:42:57 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
$num = $this -> db -> num_rows ( $resql );
$i = 0 ;
while ( $i < $num ) {
$obj = $this -> db -> fetch_object ( $resql );
$this -> cache_severity_tickets [ $obj -> rowid ][ 'code' ] = $obj -> code ;
// Si traduction existe, on l'utilise, sinon on prend le libelle par defaut
$label = ( $langs -> trans ( " TicketSeverityShort " . $obj -> code ) != ( " TicketSeverityShort " . $obj -> code ) ? $langs -> trans ( " TicketSeverityShort " . $obj -> code ) : ( $obj -> label != '-' ? $obj -> label : '' ));
$this -> cache_severity_tickets [ $obj -> rowid ][ 'label' ] = $label ;
$this -> cache_severity_tickets [ $obj -> rowid ][ 'use_default' ] = $obj -> use_default ;
$this -> cache_severity_tickets [ $obj -> rowid ][ 'pos' ] = $obj -> pos ;
$i ++ ;
}
return $num ;
} else {
dol_print_error ( $this -> db );
return - 1 ;
}
}
/**
* Return status label of object
*
2021-11-01 02:16:29 +01:00
* @ param int $mode 0 = long label , 1 = short label , 2 = Picto + short label , 3 = Picto , 4 = Picto + long label , 5 = Short label + Picto , 6 = Long label + Picto
* @ return string Label
2020-04-16 00:42:57 +02:00
*/
public function getLibStatut ( $mode = 0 )
{
2021-11-01 02:16:29 +01:00
return $this -> libStatut ( $this -> fk_statut , $mode , 0 , $this -> progress );
2020-04-16 00:42:57 +02:00
}
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Return status label of object
*
* @ param string $status Id status
* @ param int $mode 0 = long label , 1 = short label , 2 = Picto + short label , 3 = Picto , 4 = Picto + long label , 5 = Short label + Picto , 6 = Long label + Picto
2020-12-17 11:57:12 +01:00
* @ param int $notooltip 1 = No tooltip
2021-11-01 02:16:29 +01:00
* @ param int $progress Progression ( 0 to 100 )
2020-04-16 00:42:57 +02:00
* @ return string Label
*/
2021-11-01 02:16:29 +01:00
public function LibStatut ( $status , $mode = 0 , $notooltip = 0 , $progress = 0 )
2020-04-16 00:42:57 +02:00
{
// phpcs:enable
global $langs ;
2020-04-25 17:18:57 +02:00
$labelStatus = $this -> statuts [ $status ];
$labelStatusShort = $this -> statuts_short [ $status ];
if ( $status == self :: STATUS_NOT_READ ) {
$statusType = 'status0' ;
2020-05-21 15:05:19 +02:00
} elseif ( $status == self :: STATUS_READ ) {
2020-04-25 17:18:57 +02:00
$statusType = 'status1' ;
2020-05-21 15:05:19 +02:00
} elseif ( $status == self :: STATUS_ASSIGNED ) {
2020-12-17 11:57:12 +01:00
$statusType = 'status2' ;
2020-05-21 15:05:19 +02:00
} elseif ( $status == self :: STATUS_IN_PROGRESS ) {
2020-04-25 17:18:57 +02:00
$statusType = 'status4' ;
2020-05-21 15:05:19 +02:00
} elseif ( $status == self :: STATUS_WAITING ) {
2020-12-17 11:57:12 +01:00
$statusType = 'status7' ;
2020-05-21 15:05:19 +02:00
} elseif ( $status == self :: STATUS_NEED_MORE_INFO ) {
2020-12-17 11:57:12 +01:00
$statusType = 'status3' ;
2020-05-21 15:05:19 +02:00
} elseif ( $status == self :: STATUS_CANCELED ) {
2020-04-25 17:18:57 +02:00
$statusType = 'status9' ;
2020-05-21 15:05:19 +02:00
} elseif ( $status == self :: STATUS_CLOSED ) {
2020-04-25 17:18:57 +02:00
$statusType = 'status6' ;
2020-05-21 15:05:19 +02:00
} else {
2021-10-16 19:37:57 +02:00
$labelStatus = 'Unknown' ;
$labelStatusShort = 'Unknown' ;
2020-04-25 17:18:57 +02:00
$statusType = 'status0' ;
$mode = 0 ;
}
2020-12-17 11:57:12 +01:00
$params = array ();
if ( $notooltip ) {
$params = array ( 'tooltip' => 'no' );
}
2021-11-01 02:16:29 +01:00
$labelStatus = $langs -> transnoentitiesnoconv ( $labelStatus );
$labelStatusShort = $langs -> transnoentitiesnoconv ( $labelStatusShort );
if ( $status == self :: STATUS_IN_PROGRESS && $progress > 0 ) {
$labelStatus .= ' (' . round ( $progress ) . '%)' ;
$labelStatusShort .= ' (' . round ( $progress ) . '%)' ;
}
return dolGetStatus ( $labelStatus , $labelStatusShort , '' , $statusType , $mode , '' , $params );
2020-04-16 00:42:57 +02:00
}
/**
* Return a link to the object card ( with optionaly the picto )
*
* @ param int $withpicto Include picto in link ( 0 = No picto , 1 = Include picto into link , 2 = Only picto )
* @ param string $option On what the link point to ( 'nolink' , ... )
* @ param int $notooltip 1 = Disable tooltip
* @ param string $morecss Add more css on link
* @ param int $save_lastsearch_value - 1 = Auto , 0 = No save of lastsearch_values when clicking , 1 = Save lastsearch_values whenclicking
* @ return string String with URL
*/
public function getNomUrl ( $withpicto = 0 , $option = '' , $notooltip = 0 , $morecss = '' , $save_lastsearch_value = - 1 )
{
global $db , $conf , $langs ;
global $dolibarr_main_authentication , $dolibarr_main_demo ;
global $menumanager ;
2021-02-26 13:27:00 +01:00
if ( ! empty ( $conf -> dol_no_mouse_hover )) {
$notooltip = 1 ; // Force disable tooltips
}
2020-04-16 00:42:57 +02:00
$result = '' ;
2020-11-02 11:41:07 +01:00
$label = img_picto ( '' , $this -> picto ) . ' <u class="paddingrightonly">' . $langs -> trans ( " Ticket " ) . '</u>' ;
$label .= ' ' . $this -> getLibStatut ( 4 );
2020-04-16 00:42:57 +02:00
$label .= '<br>' ;
$label .= '<b>' . $langs -> trans ( 'Ref' ) . ':</b> ' . $this -> ref . '<br>' ;
$label .= '<b>' . $langs -> trans ( 'TicketTrackId' ) . ':</b> ' . $this -> track_id . '<br>' ;
$label .= '<b>' . $langs -> trans ( 'Subject' ) . ':</b> ' . $this -> subject ;
2021-09-18 19:34:46 +02:00
$url = DOL_URL_ROOT . '/ticket/card.php?id=' . $this -> id ;
2020-04-16 00:42:57 +02:00
2021-02-26 13:27:00 +01:00
if ( $option != 'nolink' ) {
2020-04-16 00:42:57 +02:00
// Add param to save lastsearch_values or not
$add_save_lastsearch_values = ( $save_lastsearch_value == 1 ? 1 : 0 );
2021-02-26 13:27:00 +01:00
if ( $save_lastsearch_value == - 1 && preg_match ( '/list\.php/' , $_SERVER [ " PHP_SELF " ])) {
$add_save_lastsearch_values = 1 ;
}
if ( $add_save_lastsearch_values ) {
$url .= '&save_lastsearch_values=1' ;
}
2020-04-16 00:42:57 +02:00
}
$linkclose = '' ;
2021-02-26 13:27:00 +01:00
if ( empty ( $notooltip )) {
if ( ! empty ( $conf -> global -> MAIN_OPTIMIZEFORTEXTBROWSER )) {
2020-04-16 00:42:57 +02:00
$label = $langs -> trans ( " ShowTicket " );
$linkclose .= ' alt="' . dol_escape_htmltag ( $label , 1 ) . '"' ;
}
$linkclose .= ' title="' . dol_escape_htmltag ( $label , 1 ) . '"' ;
$linkclose .= ' class="classfortooltip' . ( $morecss ? ' ' . $morecss : '' ) . '"' ;
2021-02-26 13:27:00 +01:00
} else {
$linkclose = ( $morecss ? ' class="' . $morecss . '"' : '' );
}
2020-04-16 00:42:57 +02:00
$linkstart = '<a href="' . $url . '"' ;
$linkstart .= $linkclose . '>' ;
$linkend = '</a>' ;
$result .= $linkstart ;
2021-02-26 13:27:00 +01:00
if ( $withpicto ) {
$result .= img_object (( $notooltip ? '' : $label ), ( $this -> picto ? $this -> picto : 'generic' ), ( $notooltip ? (( $withpicto != 2 ) ? 'class="paddingright"' : '' ) : 'class="' . (( $withpicto != 2 ) ? 'paddingright ' : '' ) . 'classfortooltip"' ), 0 , 0 , $notooltip ? 0 : 1 );
}
if ( $withpicto != 2 ) {
$result .= $this -> ref ;
}
2020-04-16 00:42:57 +02:00
$result .= $linkend ;
//if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
return $result ;
}
/**
* Mark a message as read
*
* @ param User $user Object user
* @ param int $notrigger No trigger
* @ return int < 0 if KO , > 0 if OK
*/
public function markAsRead ( $user , $notrigger = 0 )
{
global $conf , $langs ;
$error = 0 ;
if ( $this -> statut != self :: STATUS_CANCELED ) { // no closed
$this -> db -> begin ();
$sql = " UPDATE " . MAIN_DB_PREFIX . " ticket " ;
$sql .= " SET fk_statut = " . Ticket :: STATUS_READ . " , date_read=' " . $this -> db -> idate ( dol_now ()) . " ' " ;
2021-08-27 16:33:03 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2020-04-16 00:42:57 +02:00
dol_syslog ( get_class ( $this ) . " ::markAsRead " );
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
$this -> actionmsg = $langs -> trans ( 'TicketLogMesgReadBy' , $this -> ref , $user -> getFullName ( $langs ));
$this -> actionmsg2 = $langs -> trans ( 'TicketLogMesgReadBy' , $this -> ref , $user -> getFullName ( $langs ));
if ( ! $error && ! $notrigger ) {
// Call trigger
$result = $this -> call_trigger ( 'TICKET_MODIFY' , $user );
if ( $result < 0 ) {
$error ++ ;
}
// End call triggers
}
if ( ! $error ) {
$this -> db -> commit ();
return 1 ;
} else {
$this -> db -> rollback ();
$this -> error = join ( ',' , $this -> errors );
dol_syslog ( get_class ( $this ) . " ::markAsRead " . $this -> error , LOG_ERR );
return - 1 ;
}
} else {
$this -> db -> rollback ();
$this -> error = $this -> db -> lasterror ();
dol_syslog ( get_class ( $this ) . " ::markAsRead " . $this -> error , LOG_ERR );
return - 1 ;
}
}
}
/**
* Mark a message as read
*
* @ param User $user Object user
* @ param int $id_assign_user ID of user assigned
* @ param int $notrigger Disable trigger
* @ return int < 0 if KO , 0 = Nothing done , > 0 if OK
*/
public function assignUser ( $user , $id_assign_user , $notrigger = 0 )
{
global $conf , $langs ;
$error = 0 ;
$this -> db -> begin ();
$this -> oldcopy = dol_clone ( $this );
$sql = " UPDATE " . MAIN_DB_PREFIX . " ticket " ;
2021-02-26 13:27:00 +01:00
if ( $id_assign_user > 0 ) {
2021-04-25 15:55:36 +02:00
$sql .= " SET fk_user_assign= " . (( int ) $id_assign_user ) . " , fk_statut = " . Ticket :: STATUS_ASSIGNED ;
2020-05-21 15:05:19 +02:00
} else {
2020-04-16 00:42:57 +02:00
$sql .= " SET fk_user_assign=null, fk_statut = " . Ticket :: STATUS_READ ;
}
2021-08-27 16:33:03 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2020-04-16 00:42:57 +02:00
dol_syslog ( get_class ( $this ) . " ::assignUser sql= " . $sql );
$resql = $this -> db -> query ( $sql );
2021-02-26 13:27:00 +01:00
if ( $resql ) {
2020-04-16 00:42:57 +02:00
$this -> fk_user_assign = $id_assign_user ; // May be used by trigger
if ( ! $notrigger ) {
// Call trigger
$result = $this -> call_trigger ( 'TICKET_ASSIGNED' , $user );
if ( $result < 0 ) {
$error ++ ;
}
// End call triggers
}
if ( ! $error ) {
$this -> db -> commit ();
return 1 ;
} else {
$this -> db -> rollback ();
$this -> error = join ( ',' , $this -> errors );
dol_syslog ( get_class ( $this ) . " ::assignUser " . $this -> error , LOG_ERR );
return - 1 ;
}
} else {
$this -> db -> rollback ();
$this -> error = $this -> db -> lasterror ();
dol_syslog ( get_class ( $this ) . " ::assignUser " . $this -> error , LOG_ERR );
return - 1 ;
}
}
/**
* Send notification of changes by email
*
* @ param User $user User that create
* @ param string $message Log message
* @ return int < 0 if KO , > 0 if OK ( number of emails sent )
*/
private function sendLogByEmail ( $user , $message )
{
global $conf , $langs ;
$nb_sent = 0 ;
$langs -> load ( 'ticket' );
// Retrieve email of all contacts (internal and external)
$contacts = $this -> listeContact ( - 1 , 'internal' );
$contacts = array_merge ( $contacts , $this -> listeContact ( - 1 , 'external' ));
/* If origin_email and no socid, we add email to the list * */
if ( ! empty ( $this -> origin_email ) && empty ( $this -> fk_soc )) {
$array_ext = array ( array ( 'firstname' => '' , 'lastname' => '' , 'email' => $this -> origin_email , 'libelle' => $langs -> transnoentities ( 'TicketEmailOriginIssuer' ), 'socid' => " -1 " ));
$contacts = array_merge ( $contacts , $array_ext );
}
if ( ! empty ( $this -> fk_soc )) {
$this -> fetch_thirdparty ( $this -> fk_soc );
$array_company = array ( array ( 'firstname' => '' , 'lastname' => $this -> client -> name , 'email' => $this -> client -> email , 'libelle' => $langs -> transnoentities ( 'Customer' ), 'socid' => $this -> client -> id ));
$contacts = array_merge ( $contacts , $array_company );
}
// foreach contact send email with notification message
if ( count ( $contacts ) > 0 ) {
foreach ( $contacts as $key => $info_sendto ) {
$message = '' ;
$subject = '[' . $conf -> global -> MAIN_INFO_SOCIETE_NOM . '] ' . $langs -> transnoentities ( 'TicketNotificationEmailSubject' , $this -> track_id );
$message .= $langs -> transnoentities ( 'TicketNotificationEmailBody' , $this -> track_id ) . " \n \n " ;
$message .= $langs -> transnoentities ( 'Title' ) . ' : ' . $this -> subject . " \n " ;
$recipient_name = dolGetFirstLastname ( $info_sendto [ 'firstname' ], $info_sendto [ 'lastname' ], '-1' );
$recipient = ( ! empty ( $recipient_name ) ? $recipient_name : $info_sendto [ 'email' ]) . ' (' . strtolower ( $info_sendto [ 'libelle' ]) . ')' ;
$message .= $langs -> transnoentities ( 'TicketNotificationRecipient' ) . ' : ' . $recipient . " \n " ;
$message .= " \n " ;
$message .= '* ' . $langs -> transnoentities ( 'TicketNotificationLogMessage' ) . ' *' . " \n " ;
2020-10-31 14:32:18 +01:00
$message .= dol_html_entity_decode ( $log_message , ENT_QUOTES | ENT_HTML5 ) . " \n " ;
2020-04-16 00:42:57 +02:00
if ( $info_sendto [ 'source' ] == 'internal' ) {
$url_internal_ticket = dol_buildpath ( '/ticket/card.php' , 2 ) . '?track_id=' . $this -> track_id ;
2020-04-27 00:09:21 +02:00
$message .= " \n " . $langs -> transnoentities ( 'TicketNotificationEmailBodyInfosTrackUrlinternal' ) . ' : <a href="' . $url_internal_ticket . '">' . $this -> track_id . '</a>' . " \n " ;
2020-04-16 00:42:57 +02:00
} else {
$url_public_ticket = ( $conf -> global -> TICKET_URL_PUBLIC_INTERFACE ? $conf -> global -> TICKET_URL_PUBLIC_INTERFACE . '/' : dol_buildpath ( '/public/ticket/view.php' , 2 )) . '?track_id=' . $this -> track_id ;
2020-04-27 00:09:21 +02:00
$message .= " \n " . $langs -> transnoentities ( 'TicketNewEmailBodyInfosTrackUrlCustomer' ) . ' : <a href="' . $url_public_ticket . '">' . $this -> track_id . '</a>' . " \n " ;
2020-04-16 00:42:57 +02:00
}
$message .= " \n " ;
$message .= $langs -> transnoentities ( 'TicketEmailPleaseDoNotReplyToThisEmail' ) . " \n " ;
$from = $conf -> global -> MAIN_INFO_SOCIETE_NOM . '<' . $conf -> global -> TICKET_NOTIFICATION_EMAIL_FROM . '>' ;
$replyto = $from ;
// Init to avoid errors
$filepath = array ();
$filename = array ();
$mimetype = array ();
$message = dol_nl2br ( $message );
if ( ! empty ( $conf -> global -> TICKET_DISABLE_MAIL_AUTOCOPY_TO )) {
$old_MAIN_MAIL_AUTOCOPY_TO = $conf -> global -> MAIN_MAIL_AUTOCOPY_TO ;
$conf -> global -> MAIN_MAIL_AUTOCOPY_TO = '' ;
}
include_once DOL_DOCUMENT_ROOT . '/core/class/CMailFile.class.php' ;
2020-10-31 14:32:18 +01:00
$sendtocc = '' ;
$deliveryreceipt = 0 ;
2020-04-16 00:42:57 +02:00
$mailfile = new CMailFile ( $subject , $info_sendto [ 'email' ], $from , $message , $filepath , $mimetype , $filename , $sendtocc , '' , $deliveryreceipt , 0 );
if ( $mailfile -> error || $mailfile -> errors ) {
setEventMessages ( $mailfile -> error , $mailfile -> errors , 'errors' );
} else {
$result = $mailfile -> sendfile ();
if ( $result > 0 ) {
$nb_sent ++ ;
}
}
if ( ! empty ( $conf -> global -> TICKET_DISABLE_MAIL_AUTOCOPY_TO )) {
$conf -> global -> MAIN_MAIL_AUTOCOPY_TO = $old_MAIN_MAIL_AUTOCOPY_TO ;
}
}
setEventMessages ( $langs -> trans ( 'TicketNotificationNumberEmailSent' , $nb_sent ), null , 'mesgs' );
}
return $nb_sent ;
}
/**
* Charge la liste des actions sur le ticket
*
* @ return int Number of lines loaded , 0 if already loaded , < 0 if KO
*/
public function loadCacheLogsTicket ()
{
global $langs ;
if ( is_array ( $this -> cache_logs_ticket ) && count ( $this -> cache_logs_ticket )) {
return 0 ;
}
// Cache deja charge
// TODO Read the table llx_actioncomm
/*
2021-02-26 13:27:00 +01:00
$sql = " SELECT rowid, fk_user_create, datec, message " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " ticket_logs " ;
$sql .= " WHERE fk_track_id =' " . $this -> db -> escape ( $this -> track_id ) . " ' " ;
$sql .= " ORDER BY datec DESC " ;
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
$num = $this -> db -> num_rows ( $resql );
$i = 0 ;
while ( $i < $num ) {
$obj = $this -> db -> fetch_object ( $resql );
$this -> cache_logs_ticket [ $i ][ 'id' ] = $obj -> rowid ;
$this -> cache_logs_ticket [ $i ][ 'fk_user_create' ] = $obj -> fk_user_create ;
$this -> cache_logs_ticket [ $i ][ 'datec' ] = $this -> db -> jdate ( $obj -> datec );
$this -> cache_logs_ticket [ $i ][ 'message' ] = $obj -> message ;
$i ++ ;
}
return $num ;
} else {
$this -> error = " Error " . $this -> db -> lasterror ();
dol_syslog ( get_class ( $this ) . " ::loadCacheLogsTicket " . $this -> error , LOG_ERR );
return - 1 ;
} */
2020-04-16 00:42:57 +02:00
return 0 ;
}
/**
* Add message into database
*
* @ param User $user User that creates
* @ param int $notrigger 0 = launch triggers after , 1 = disable triggers
* @ param array $filename_list List of files to attach ( full path of filename on file system )
* @ param array $mimetype_list List of MIME type of attached files
* @ param array $mimefilename_list List of attached file name in message
* @ return int < 0 if KO , > 0 if OK
*/
public function createTicketMessage ( $user , $notrigger = 0 , $filename_list = array (), $mimetype_list = array (), $mimefilename_list = array ())
{
global $conf , $langs ;
$error = 0 ;
$now = dol_now ();
// Clean parameters
if ( isset ( $this -> fk_track_id )) {
$this -> fk_track_id = trim ( $this -> fk_track_id );
}
if ( isset ( $this -> message )) {
$this -> message = trim ( $this -> message );
}
$this -> db -> begin ();
// Insert entry into agenda with code 'TICKET_MSG'
include_once DOL_DOCUMENT_ROOT . '/comm/action/class/actioncomm.class.php' ;
$actioncomm = new ActionComm ( $this -> db );
2020-05-07 22:52:32 +02:00
$actioncomm -> type_code = 'AC_OTH' ;
2020-04-16 00:42:57 +02:00
$actioncomm -> code = 'TICKET_MSG' ;
if ( $this -> private ) {
$actioncomm -> code = 'TICKET_MSG_PRIVATE' ;
}
$actioncomm -> socid = $this -> socid ;
$actioncomm -> label = $this -> subject ;
$actioncomm -> note_private = $this -> message ;
$actioncomm -> userassigned = array ( $user -> id );
$actioncomm -> userownerid = $user -> id ;
$actioncomm -> datep = $now ;
2021-10-18 09:46:20 +02:00
$actioncomm -> percentage = - 1 ; // percentage is not relevant for punctual events
2020-04-16 00:42:57 +02:00
$actioncomm -> elementtype = 'ticket' ;
$actioncomm -> fk_element = $this -> id ;
$attachedfiles = array ();
$attachedfiles [ 'paths' ] = $filename_list ;
$attachedfiles [ 'names' ] = $mimefilename_list ;
$attachedfiles [ 'mimes' ] = $mimetype_list ;
if ( is_array ( $attachedfiles ) && count ( $attachedfiles ) > 0 ) {
$actioncomm -> attachedfiles = $attachedfiles ;
}
2021-02-26 13:27:00 +01:00
if ( ! empty ( $mimefilename_list ) && is_array ( $mimefilename_list )) {
2020-04-16 00:42:57 +02:00
$actioncomm -> note_private = dol_concatdesc ( $actioncomm -> note_private , " \n " . $langs -> transnoentities ( " AttachedFiles " ) . ': ' . join ( ';' , $mimefilename_list ));
}
$actionid = $actioncomm -> create ( $user );
2021-02-26 13:27:00 +01:00
if ( $actionid <= 0 ) {
2020-04-16 00:42:57 +02:00
$error ++ ;
$this -> error = $actioncomm -> error ;
$this -> errors = $actioncomm -> errors ;
}
// Commit or rollback
if ( $error ) {
$this -> db -> rollback ();
return - 1 * $error ;
} else {
$this -> db -> commit ();
return 1 ;
}
}
/**
* Load the list of event on ticket into -> cache_msgs_ticket
*
* @ return int Number of lines loaded , 0 if already loaded , < 0 if KO
*/
public function loadCacheMsgsTicket ()
{
if ( is_array ( $this -> cache_msgs_ticket ) && count ( $this -> cache_msgs_ticket )) {
return 0 ;
}
// Cache already loaded
$sql = " SELECT id as rowid, fk_user_author, datec, label, note as message, code " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " actioncomm " ;
$sql .= " WHERE fk_element = " . ( int ) $this -> id ;
$sql .= " AND elementtype = 'ticket' " ;
$sql .= " ORDER BY datec DESC " ;
2021-08-27 22:42:04 +02:00
dol_syslog ( get_class ( $this ) . " ::load_cache_actions_ticket " , LOG_DEBUG );
2020-04-16 00:42:57 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
$num = $this -> db -> num_rows ( $resql );
$i = 0 ;
while ( $i < $num ) {
$obj = $this -> db -> fetch_object ( $resql );
$this -> cache_msgs_ticket [ $i ][ 'id' ] = $obj -> rowid ;
$this -> cache_msgs_ticket [ $i ][ 'fk_user_author' ] = $obj -> fk_user_author ;
$this -> cache_msgs_ticket [ $i ][ 'datec' ] = $this -> db -> jdate ( $obj -> datec );
$this -> cache_msgs_ticket [ $i ][ 'subject' ] = $obj -> label ;
$this -> cache_msgs_ticket [ $i ][ 'message' ] = $obj -> message ;
$this -> cache_msgs_ticket [ $i ][ 'private' ] = ( $obj -> code == 'TICKET_MSG_PRIVATE' ? 1 : 0 );
$i ++ ;
}
return $num ;
} else {
$this -> error = " Error " . $this -> db -> lasterror ();
dol_syslog ( get_class ( $this ) . " ::load_cache_actions_ticket " . $this -> error , LOG_ERR );
return - 1 ;
}
}
/**
* Close a ticket
*
2021-07-30 00:40:06 +02:00
* @ param User $user User that close
* @ param int $mode 0 = Close solved , 1 = Close abandonned
* @ return int < 0 if KO , > 0 if OK
2020-04-16 00:42:57 +02:00
*/
2021-07-30 00:40:06 +02:00
public function close ( User $user , $mode = 0 )
2020-04-16 00:42:57 +02:00
{
global $conf , $langs ;
2021-07-30 00:40:06 +02:00
if ( $this -> fk_statut != Ticket :: STATUS_CLOSED && $this -> fk_statut != Ticket :: STATUS_CANCELED ) { // not closed
2020-04-16 00:42:57 +02:00
$this -> db -> begin ();
$sql = " UPDATE " . MAIN_DB_PREFIX . " ticket " ;
2021-07-30 00:40:06 +02:00
$sql .= " SET fk_statut= " . ( $mode ? Ticket :: STATUS_CANCELED : Ticket :: STATUS_CLOSED ) . " , progress=100, date_close=' " . $this -> db -> idate ( dol_now ()) . " ' " ;
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2020-04-16 00:42:57 +02:00
2021-07-30 00:40:06 +02:00
dol_syslog ( get_class ( $this ) . " ::close mode= " . $mode );
2020-04-16 00:42:57 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
$error = 0 ;
// Valid and close fichinter linked
2020-09-08 21:27:28 +02:00
if ( ! empty ( $conf -> ficheinter -> enabled ) && ! empty ( $conf -> global -> WORKFLOW_TICKET_CLOSE_INTERVENTION )) {
2020-08-28 19:07:17 +02:00
dol_syslog ( " We have closed the ticket, so we close all linked interventions " );
$this -> fetchObjectLinked ( $this -> id , $this -> element , null , 'fichinter' );
2021-02-26 13:27:00 +01:00
if ( $this -> linkedObjectsIds ) {
2020-08-28 19:07:17 +02:00
foreach ( $this -> linkedObjectsIds [ 'fichinter' ] as $fichinter_id ) {
$fichinter = new Fichinter ( $this -> db );
$fichinter -> fetch ( $fichinter_id );
if ( $fichinter -> statut == 0 ) {
$result = $fichinter -> setValid ( $user );
if ( ! $result ) {
$this -> errors [] = $fichinter -> error ;
$error ++ ;
}
2020-04-16 00:42:57 +02:00
}
2020-08-28 19:07:17 +02:00
if ( $fichinter -> statut < 3 ) {
$result = $fichinter -> setStatut ( 3 );
if ( ! $result ) {
$this -> errors [] = $fichinter -> error ;
$error ++ ;
}
2020-04-16 00:42:57 +02:00
}
}
}
}
// Call trigger
$result = $this -> call_trigger ( 'TICKET_CLOSE' , $user );
if ( $result < 0 ) {
$error ++ ;
}
// End call triggers
if ( ! $error ) {
$this -> db -> commit ();
return 1 ;
} else {
$this -> db -> rollback ();
$this -> error = join ( ',' , $this -> errors );
dol_syslog ( get_class ( $this ) . " ::close " . $this -> error , LOG_ERR );
return - 1 ;
}
} else {
$this -> db -> rollback ();
$this -> error = $this -> db -> lasterror ();
dol_syslog ( get_class ( $this ) . " ::close " . $this -> error , LOG_ERR );
return - 1 ;
}
}
}
/**
* Search and fetch thirparties by email
*
* @ param string $email Email
* @ param int $type Type of thirdparties ( 0 = any , 1 = customer , 2 = prospect , 3 = supplier )
* @ param array $filters Array of couple field name / value to filter the companies with the same name
* @ param string $clause Clause for filters
* @ return array Array of thirdparties object
*/
public function searchSocidByEmail ( $email , $type = '0' , $filters = array (), $clause = 'AND' )
{
$thirdparties = array ();
2021-06-09 15:36:47 +02:00
$exact = 0 ;
2020-04-16 00:42:57 +02:00
// Generation requete recherche
$sql = " SELECT rowid FROM " . MAIN_DB_PREFIX . " societe " ;
$sql .= " WHERE entity IN ( " . getEntity ( 'ticket' , 1 ) . " ) " ;
if ( ! empty ( $type )) {
if ( $type == 1 || $type == 2 ) {
2021-06-09 15:36:47 +02:00
$sql .= " AND client = " . (( int ) $type );
2020-04-16 00:42:57 +02:00
} elseif ( $type == 3 ) {
$sql .= " AND fournisseur = 1 " ;
}
}
if ( ! empty ( $email )) {
2021-06-14 13:51:09 +02:00
if ( empty ( $exact )) {
2021-06-09 15:36:47 +02:00
$regs = array ();
2020-04-16 00:42:57 +02:00
if ( preg_match ( '/^([\*])?[^*]+([\*])?$/' , $email , $regs ) && count ( $regs ) > 1 ) {
$email = str_replace ( '*' , '%' , $email );
} else {
$email = '%' . $email . '%' ;
}
}
$sql .= " AND " ;
if ( is_array ( $filters ) && ! empty ( $filters )) {
$sql .= " ( " ;
}
2021-06-14 13:51:09 +02:00
$sql .= " email LIKE ' " . $this -> db -> escape ( $email ) . " ' " ;
2020-04-16 00:42:57 +02:00
}
if ( is_array ( $filters ) && ! empty ( $filters )) {
foreach ( $filters as $field => $value ) {
2021-06-14 13:51:09 +02:00
$sql .= " " . $clause . " " . $field . " LIKE ' " . $this -> db -> escape ( $value ) . " ' " ;
2020-04-16 00:42:57 +02:00
}
if ( ! empty ( $email )) {
$sql .= " ) " ;
}
}
$res = $this -> db -> query ( $sql );
if ( $res ) {
while ( $rec = $this -> db -> fetch_array ( $res )) {
$soc = new Societe ( $this -> db );
$soc -> fetch ( $rec [ 'rowid' ]);
$thirdparties [] = $soc ;
}
return $thirdparties ;
} else {
$this -> error = $this -> db -> error () . ' sql=' . $sql ;
dol_syslog ( get_class ( $this ) . " ::searchSocidByEmail " . $this -> error , LOG_ERR );
return - 1 ;
}
}
/**
* Search and fetch contacts by email
*
* @ param string $email Email
* @ param array $socid Limit to a thirdparty
* @ param string $case Respect case
* @ return array Array of contacts object
*/
public function searchContactByEmail ( $email , $socid = '' , $case = '' )
{
$contacts = array ();
// Generation requete recherche
$sql = " SELECT rowid FROM " . MAIN_DB_PREFIX . " socpeople " ;
2022-03-18 12:05:59 +01:00
$sql .= " WHERE entity IN ( " . getEntity ( 'contact' ) . " ) " ;
2020-04-16 00:42:57 +02:00
if ( ! empty ( $socid )) {
$sql .= " AND fk_soc=' " . $this -> db -> escape ( $socid ) . " ' " ;
}
if ( ! empty ( $email )) {
$sql .= " AND " ;
if ( ! $case ) {
$sql .= " email LIKE ' " . $this -> db -> escape ( $email ) . " ' " ;
} else {
$sql .= " email LIKE BINARY ' " . $this -> db -> escape ( $email ) . " ' " ;
}
}
$res = $this -> db -> query ( $sql );
if ( $res ) {
while ( $rec = $this -> db -> fetch_array ( $res )) {
include_once DOL_DOCUMENT_ROOT . '/contact/class/contact.class.php' ;
$contactstatic = new Contact ( $this -> db );
$contactstatic -> fetch ( $rec [ 'rowid' ]);
$contacts [] = $contactstatic ;
}
return $contacts ;
} else {
$this -> error = $this -> db -> error () . ' sql=' . $sql ;
dol_syslog ( get_class ( $this ) . " ::searchContactByEmail " . $this -> error , LOG_ERR );
return - 1 ;
}
}
/**
* Define parent commany of current ticket
*
* @ param int $id Id of thirdparty to set or '' to remove
* @ return int < 0 if KO , > 0 if OK
*/
public function setCustomer ( $id )
{
if ( $this -> id ) {
$sql = " UPDATE " . MAIN_DB_PREFIX . " ticket " ;
$sql .= " SET fk_soc = " . ( $id > 0 ? $id : " null " );
2021-08-27 16:33:03 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2020-04-16 00:42:57 +02:00
dol_syslog ( get_class ( $this ) . '::setCustomer sql=' . $sql );
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
return 1 ;
} else {
return - 1 ;
}
} else {
return - 1 ;
}
}
/**
* Define progression of current ticket
*
* @ param int $percent Progression percent
* @ return int < 0 if KO , > 0 if OK
*/
public function setProgression ( $percent )
{
if ( $this -> id ) {
$sql = " UPDATE " . MAIN_DB_PREFIX . " ticket " ;
$sql .= " SET progress = " . ( $percent > 0 ? $percent : " null " );
2021-08-27 16:33:03 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2020-04-16 00:42:57 +02:00
dol_syslog ( get_class ( $this ) . '::set_progression sql=' . $sql );
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
return 1 ;
} else {
return - 1 ;
}
} else {
return - 1 ;
}
}
/**
* Link element with a project
* Override core function because of key name 'fk_project' used for this module
*
2021-03-29 23:24:52 +02:00
* @ param int $projectid Project id to link element to
* @ return int < 0 if KO , > 0 if OK
2020-04-16 00:42:57 +02:00
*/
public function setProject ( $projectid )
{
if ( ! $this -> table_element ) {
dol_syslog ( get_class ( $this ) . " ::setProject was called on objet with property table_element not defined " , LOG_ERR );
return - 1 ;
}
$sql = 'UPDATE ' . MAIN_DB_PREFIX . $this -> table_element ;
if ( $projectid ) {
2021-03-29 23:24:52 +02:00
$sql .= ' SET fk_project = ' . (( int ) $projectid );
2020-04-16 00:42:57 +02:00
} else {
$sql .= ' SET fk_project = NULL' ;
}
2021-03-29 23:24:52 +02:00
$sql .= ' WHERE rowid = ' . (( int ) $this -> id );
2020-04-16 00:42:57 +02:00
dol_syslog ( get_class ( $this ) . " ::setProject sql= " . $sql );
if ( $this -> db -> query ( $sql )) {
2021-03-29 23:24:52 +02:00
$this -> fk_project = (( int ) $projectid );
2020-04-16 00:42:57 +02:00
return 1 ;
} else {
dol_print_error ( $this -> db );
return - 1 ;
}
}
/**
* Link element with a contract
*
* @ param int $contractid Contract id to link element to
* @ return int < 0 if KO , > 0 if OK
*/
public function setContract ( $contractid )
{
if ( ! $this -> table_element ) {
dol_syslog ( get_class ( $this ) . " ::setContract was called on objet with property table_element not defined " , LOG_ERR );
return - 1 ;
}
$result = $this -> add_object_linked ( 'contrat' , $contractid );
if ( $result ) {
$this -> fk_contract = $contractid ;
return 1 ;
} else {
dol_print_error ( $this -> db );
return - 1 ;
}
}
/* gestion des contacts d'un ticket */
/**
* Return id des contacts interne de suivi
*
* @ return array Liste des id contacts suivi ticket
*/
public function getIdTicketInternalContact ()
{
return $this -> getIdContact ( 'internal' , 'SUPPORTTEC' );
}
/**
* Retrieve informations about internal contacts
*
* @ return array Array with datas : firstname , lastname , socid ( - 1 for internal users ), email , code , libelle , status
*/
public function getInfosTicketInternalContact ()
{
return $this -> listeContact ( - 1 , 'internal' );
}
/**
* Return id des contacts clients pour le suivi ticket
*
* @ return array Liste des id contacts suivi ticket
*/
public function getIdTicketCustomerContact ()
{
return $this -> getIdContact ( 'external' , 'SUPPORTCLI' );
}
/**
* Retrieve informations about external contacts
*
* @ return array Array with datas : firstname , lastname , socid ( - 1 for internal users ), email , code , libelle , status
*/
public function getInfosTicketExternalContact ()
{
return $this -> listeContact ( - 1 , 'external' );
}
/**
* Return id des contacts clients des intervenants
*
* @ return array Liste des id contacts intervenants
*/
public function getIdTicketInternalInvolvedContact ()
{
return $this -> getIdContact ( 'internal' , 'CONTRIBUTOR' );
}
/**
* Return id des contacts clients des intervenants
*
* @ return array Liste des id contacts intervenants
*/
public function getIdTicketCustomerInvolvedContact ()
{
return $this -> getIdContact ( 'external' , 'CONTRIBUTOR' );
}
/**
* Return id of all contacts for ticket
*
* @ return array Array of contacts for tickets
*/
public function getTicketAllContacts ()
{
$array_contact = array ();
$array_contact = $this -> getIdTicketInternalContact ( $exclude_self );
$array_contact = array_merge ( $array_contact , $this -> getIdTicketCustomerContact ( $exclude_self ));
$array_contact = array_merge ( $array_contact , $this -> getIdTicketInternalInvolvedContact ( $exclude_self ));
$array_contact = array_merge ( $array_contact , $this -> getIdTicketCustomerInvolvedContact ( $exclude_self ));
return $array_contact ;
}
/**
* Return id of all contacts for ticket
*
* @ return array Array of contacts
*/
public function getTicketAllCustomerContacts ()
{
$array_contact = array ();
$array_contact = array_merge ( $array_contact , $this -> getIdTicketCustomerContact ( $exclude_self ));
$array_contact = array_merge ( $array_contact , $this -> getIdTicketCustomerInvolvedContact ( $exclude_self ));
return $array_contact ;
}
/**
* Get array of all contacts for a ticket
* Override method of file commonobject . class . php to add phone number
*
* @ param int $status Status of lines to get ( - 1 = all )
* @ param string $source Source of contact : external or thirdparty ( llx_socpeople ) or internal ( llx_user )
* @ param int $list 0 : Return array contains all properties , 1 : Return array contains just id
* @ param string $code Filter on this code of contact type ( 'SHIPPING' , 'BILLING' , ... )
* @ return array Array of contacts
*/
public function listeContact ( $status = - 1 , $source = 'external' , $list = 0 , $code = '' )
{
global $langs ;
$tab = array ();
$sql = " SELECT ec.rowid, ec.statut as statuslink, ec.fk_socpeople as id, ec.fk_c_type_contact " ; // This field contains id of llx_socpeople or id of llx_user
if ( $source == 'internal' ) {
$sql .= " , '-1' as socid, t.statut as statuscontact " ;
}
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
if ( $source == 'external' || $source == 'thirdparty' ) {
$sql .= " , t.fk_soc as socid, t.statut as statuscontact " ;
}
2019-02-25 20:35:59 +01:00
2020-04-16 00:42:57 +02:00
$sql .= " , t.civility, t.lastname as lastname, t.firstname, t.email " ;
if ( $source == 'internal' ) {
$sql .= " , t.office_phone as phone, t.user_mobile as phone_mobile " ;
}
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
if ( $source == 'external' ) {
$sql .= " , t.phone as phone, t.phone_mobile as phone_mobile, t.phone_perso as phone_perso " ;
}
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
$sql .= " , tc.source, tc.element, tc.code, tc.libelle as type_contact_label " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " c_type_contact tc " ;
$sql .= " , " . MAIN_DB_PREFIX . " element_contact ec " ;
if ( $source == 'internal' ) {
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " user t on ec.fk_socpeople = t.rowid " ;
}
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
if ( $source == 'external' || $source == 'thirdparty' ) {
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " socpeople t on ec.fk_socpeople = t.rowid " ;
}
2018-03-10 04:23:59 +01:00
2021-08-27 18:18:50 +02:00
$sql .= " WHERE ec.element_id = " . (( int ) $this -> id );
2020-04-16 00:42:57 +02:00
$sql .= " AND ec.fk_c_type_contact=tc.rowid " ;
$sql .= " AND tc.element=' " . $this -> db -> escape ( $this -> element ) . " ' " ;
if ( $source == 'internal' ) {
$sql .= " AND tc.source = 'internal' " ;
}
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
if ( $source == 'external' || $source == 'thirdparty' ) {
$sql .= " AND tc.source = 'external' " ;
}
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
$sql .= " AND tc.active=1 " ;
if ( $status >= 0 ) {
2020-09-20 03:32:43 +02:00
$sql .= " AND ec.statut = " . (( int ) $status );
2020-04-16 00:42:57 +02:00
}
2019-01-21 16:42:34 +01:00
2020-04-16 00:42:57 +02:00
$sql .= " ORDER BY t.lastname ASC " ;
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
$num = $this -> db -> num_rows ( $resql );
$i = 0 ;
while ( $i < $num ) {
$obj = $this -> db -> fetch_object ( $resql );
if ( ! $list ) {
$transkey = " TypeContact_ " . $obj -> element . " _ " . $obj -> source . " _ " . $obj -> code ;
$libelle_type = ( $langs -> trans ( $transkey ) != $transkey ? $langs -> trans ( $transkey ) : $obj -> type_contact_label );
$tab [ $i ] = array (
'source' => $obj -> source ,
'socid' => $obj -> socid ,
'id' => $obj -> id ,
'nom' => $obj -> lastname , // For backward compatibility
'civility' => $obj -> civility ,
'lastname' => $obj -> lastname ,
'firstname' => $obj -> firstname ,
'email' => $obj -> email ,
'rowid' => $obj -> rowid ,
'code' => $obj -> code ,
'libelle' => $libelle_type ,
'status' => $obj -> statuslink ,
'statuscontact' => $obj -> statuscontact ,
'fk_c_type_contact' => $obj -> fk_c_type_contact ,
'phone' => $obj -> phone ,
'phone_mobile' => $obj -> phone_mobile );
} else {
$tab [ $i ] = $obj -> id ;
}
$i ++ ;
}
return $tab ;
} else {
$this -> error = $this -> db -> error ();
dol_print_error ( $this -> db );
return - 1 ;
}
}
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
/**
* Get a default reference .
*
* @ param Societe $thirdparty Thirdparty
* @ return string Reference
*/
public function getDefaultRef ( $thirdparty = '' )
{
global $conf ;
$defaultref = '' ;
$modele = empty ( $conf -> global -> TICKET_ADDON ) ? 'mod_ticket_simple' : $conf -> global -> TICKET_ADDON ;
// Search template files
$file = '' ;
$classname = '' ;
$filefound = 0 ;
$dirmodels = array_merge ( array ( '/' ), ( array ) $conf -> modules_parts [ 'models' ]);
foreach ( $dirmodels as $reldir ) {
$file = dol_buildpath ( $reldir . " core/modules/ticket/ " . $modele . '.php' , 0 );
if ( file_exists ( $file )) {
$filefound = 1 ;
$classname = $modele ;
break ;
}
2019-09-12 18:39:29 +02:00
}
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
if ( $filefound ) {
$result = dol_include_once ( $reldir . " core/modules/ticket/ " . $modele . '.php' );
$modTicket = new $classname ;
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
$defaultref = $modTicket -> getNextValue ( $thirdparty , $this );
}
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
if ( is_numeric ( $defaultref ) && $defaultref <= 0 ) {
$defaultref = '' ;
}
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
return $defaultref ;
}
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Return if at least one photo is available
*
* @ param string $sdir Directory to scan
* @ return boolean True if at least one photo is available , False if not
*/
public function is_photo_available ( $sdir )
{
// phpcs:enable
include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
global $conf ;
$dir = $sdir . '/' ;
$nbphoto = 0 ;
$dir_osencoded = dol_osencode ( $dir );
if ( file_exists ( $dir_osencoded )) {
$handle = opendir ( $dir_osencoded );
if ( is_resource ( $handle )) {
while (( $file = readdir ( $handle )) !== false ) {
if ( ! utf8_check ( $file )) {
$file = utf8_encode ( $file );
}
// To be sure data is stored in UTF8 in memory
if ( dol_is_file ( $dir . $file )) {
return true ;
}
}
}
}
return false ;
}
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
/**
* Copy files defined into $_SESSION array into the ticket directory of attached files .
* Used for files linked into messages .
* Files may be renamed during copy to avoid overwriting existing files .
*
* @ return array Array with final path / name / mime of files .
*/
public function copyFilesForTicket ()
{
global $conf ;
2018-03-11 11:54:30 +01:00
2020-04-16 00:42:57 +02:00
// Create form object
include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php' ;
include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
include_once DOL_DOCUMENT_ROOT . '/core/lib/images.lib.php' ;
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
$maxwidthsmall = 270 ;
$maxheightsmall = 150 ;
$maxwidthmini = 128 ;
$maxheightmini = 72 ;
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
$formmail = new FormMail ( $this -> db );
2018-03-10 04:23:59 +01:00
2020-04-16 00:42:57 +02:00
$attachedfiles = $formmail -> get_attached_files ();
$filepath = $attachedfiles [ 'paths' ];
$filename = $attachedfiles [ 'names' ];
$mimetype = $attachedfiles [ 'mimes' ];
2019-10-04 19:41:35 +02:00
2020-04-16 00:42:57 +02:00
// Copy files into ticket directory
$destdir = $conf -> ticket -> dir_output . '/' . $this -> ref ;
if ( ! dol_is_dir ( $destdir )) {
dol_mkdir ( $destdir );
}
2019-10-04 19:41:35 +02:00
2020-04-16 00:42:57 +02:00
$listofpaths = array ();
$listofnames = array ();
foreach ( $filename as $i => $val ) {
$destfile = $destdir . '/' . $filename [ $i ];
// If destination file already exists, we add a suffix to avoid to overwrite
2021-02-26 13:27:00 +01:00
if ( is_file ( $destfile )) {
2020-06-10 17:01:57 +02:00
$pathinfo = pathinfo ( $filename [ $i ]);
2020-04-16 00:42:57 +02:00
$now = dol_now ();
2020-06-10 17:01:57 +02:00
$destfile = $destdir . '/' . $pathinfo [ 'filename' ] . ' - ' . dol_print_date ( $now , 'dayhourlog' ) . '.' . $pathinfo [ 'extension' ];
2020-04-16 00:42:57 +02:00
}
$res = dol_move ( $filepath [ $i ], $destfile , 0 , 1 );
if ( image_format_supported ( $destfile ) == 1 ) {
// Create small thumbs for image (Ratio is near 16/9)
// Used on logon for example
$imgThumbSmall = vignette ( $destfile , $maxwidthsmall , $maxheightsmall , '_small' , 50 , " thumbs " );
// Create mini thumbs for image (Ratio is near 16/9)
// Used on menu or for setup page for example
$imgThumbMini = vignette ( $destfile , $maxwidthmini , $maxheightmini , '_mini' , 50 , " thumbs " );
}
$formmail -> remove_attached_files ( $i );
// Fill array with new names
$listofpaths [ $i ] = $destfile ;
$listofnames [ $i ] = basename ( $destfile );
}
2019-10-04 19:41:35 +02:00
2020-04-16 00:42:57 +02:00
return array ( 'listofpaths' => $listofpaths , 'listofnames' => $listofnames , 'listofmimes' => $mimetype );
}
2019-04-10 11:39:54 +02:00
2021-07-02 10:26:03 +02:00
/**
* Sets object to supplied categories .
*
* Deletes object from existing categories not supplied .
* Adds it to non existing supplied categories .
* Existing categories are left untouch .
*
* @ param int [] | int $categories Category or categories IDs
* @ return void
*/
public function setCategories ( $categories )
{
// Handle single category
if ( ! is_array ( $categories )) {
$categories = array ( $categories );
}
// Get current categories
include_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php' ;
$c = new Categorie ( $this -> db );
$existing = $c -> containing ( $this -> id , Categorie :: TYPE_TICKET , 'id' );
// Diff
if ( is_array ( $existing )) {
$to_del = array_diff ( $existing , $categories );
$to_add = array_diff ( $categories , $existing );
} else {
$to_del = array (); // Nothing to delete
$to_add = $categories ;
}
// Process
foreach ( $to_del as $del ) {
if ( $c -> fetch ( $del ) > 0 ) {
$c -> del_type ( $this , Categorie :: TYPE_TICKET );
}
}
foreach ( $to_add as $add ) {
if ( $c -> fetch ( $add ) > 0 ) {
$c -> add_type ( $this , Categorie :: TYPE_TICKET );
}
}
return ;
}
2019-04-10 11:39:54 +02:00
2020-04-16 00:42:57 +02:00
/**
2020-05-27 11:39:06 +02:00
* Add new message on a ticket ( private / public area ) . Can also send it be email if GETPOST ( 'send_email' , 'int' ) is set .
2020-04-16 00:42:57 +02:00
*
* @ param User $user User for action
* @ param string $action Action string
* @ param int $private 1 = Message is private . TODO Implement this . What does this means ?
2020-05-27 11:39:06 +02:00
* @ param int $public_area 1 = Is the public area
2020-04-16 00:42:57 +02:00
* @ return int
*/
2020-05-27 11:39:06 +02:00
public function newMessage ( $user , & $action , $private = 1 , $public_area = 0 )
2020-04-16 00:42:57 +02:00
{
global $mysoc , $conf , $langs ;
2019-04-10 11:39:54 +02:00
2020-04-16 00:42:57 +02:00
$error = 0 ;
2019-04-10 11:39:54 +02:00
2020-04-16 00:42:57 +02:00
$object = new Ticket ( $this -> db );
2019-04-10 11:39:54 +02:00
2020-04-16 00:42:57 +02:00
$ret = $object -> fetch ( '' , '' , GETPOST ( 'track_id' , 'alpha' ));
2019-05-01 20:41:03 +02:00
2020-04-16 00:42:57 +02:00
$object -> socid = $object -> fk_soc ;
$object -> fetch_thirdparty ();
2019-10-04 19:41:35 +02:00
2020-04-16 00:42:57 +02:00
if ( $ret < 0 ) {
$error ++ ;
array_push ( $this -> errors , $langs -> trans ( " ErrorTicketIsNotValid " ));
$action = '' ;
}
2019-04-10 11:39:54 +02:00
2020-04-16 00:42:57 +02:00
if ( ! GETPOST ( " message " )) {
$error ++ ;
array_push ( $this -> errors , $langs -> trans ( " ErrorFieldRequired " , $langs -> transnoentities ( " message " )));
$action = 'add_message' ;
}
2019-04-10 11:39:54 +02:00
2020-04-16 00:42:57 +02:00
if ( ! $error ) {
$object -> subject = GETPOST ( 'subject' , 'alphanohtml' );
2020-09-18 01:29:17 +02:00
$object -> message = GETPOST ( " message " , " restricthtml " );
2020-04-16 00:42:57 +02:00
$object -> private = GETPOST ( " private_message " , " alpha " );
2019-10-04 19:41:35 +02:00
2020-04-16 00:42:57 +02:00
$send_email = GETPOST ( 'send_email' , 'int' );
2019-04-10 11:39:54 +02:00
2020-04-16 00:42:57 +02:00
// Copy attached files (saved into $_SESSION) as linked files to ticket. Return array with final name used.
$resarray = $object -> copyFilesForTicket ();
2019-10-04 19:41:35 +02:00
2020-04-16 00:42:57 +02:00
$listofpaths = $resarray [ 'listofpaths' ];
$listofnames = $resarray [ 'listofnames' ];
$listofmimes = $resarray [ 'listofmimes' ];
2019-10-04 19:41:35 +02:00
2020-04-16 00:42:57 +02:00
$id = $object -> createTicketMessage ( $user , 0 , $listofpaths , $listofmimes , $listofnames );
if ( $id <= 0 ) {
$error ++ ;
2020-05-27 23:32:24 +02:00
$this -> error = $object -> error ;
2020-04-16 00:42:57 +02:00
$this -> errors = $object -> errors ;
$action = 'add_message' ;
}
2019-04-10 11:39:54 +02:00
2020-04-16 00:42:57 +02:00
if ( ! $error && $id > 0 ) {
setEventMessages ( $langs -> trans ( 'TicketMessageSuccessfullyAdded' ), null , 'mesgs' );
2019-04-10 11:39:54 +02:00
2020-04-16 00:42:57 +02:00
//var_dump($_SESSION); var_dump($listofpaths);exit;
2019-10-04 19:41:35 +02:00
2020-04-16 00:42:57 +02:00
/*
2020-05-27 11:39:06 +02:00
* Public area
*/
if ( ! empty ( $public_area )) {
/*
* Send emails to assigned users ( public area notification )
*/
if ( ! empty ( $conf -> global -> TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_ENABLED )) {
$assigned_user_dont_have_email = '' ;
$sendto = array ();
if ( $this -> fk_user_assign > 0 ) {
$assigned_user = new User ( $this -> db );
$assigned_user -> fetch ( $this -> fk_user_assign );
if ( ! empty ( $assigned_user -> email )) {
2020-09-07 10:18:17 +02:00
$sendto [] = $assigned_user -> getFullName ( $langs ) . " < " . $assigned_user -> email . " > " ;
2020-05-27 11:39:06 +02:00
} else {
$assigned_user_dont_have_email = $assigned_user -> getFullName ( $langs );
2020-04-16 00:42:57 +02:00
}
2020-05-27 11:39:06 +02:00
}
if ( empty ( $sendto )) {
if ( ! empty ( $conf -> global -> TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_DEFAULT_EMAIL )) {
$sendto [] = $conf -> global -> TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_DEFAULT_EMAIL ;
} elseif ( ! empty ( $conf -> global -> TICKET_NOTIFICATION_EMAIL_TO )) {
$sendto [] = $conf -> global -> TICKET_NOTIFICATION_EMAIL_TO ;
2020-04-16 00:42:57 +02:00
}
}
// Add global email address recipient
2020-05-27 11:39:06 +02:00
if ( ! empty ( $conf -> global -> TICKET_NOTIFICATION_ALSO_MAIN_ADDRESS ) &&
! empty ( $conf -> global -> TICKET_NOTIFICATION_EMAIL_TO ) && ! in_array ( $conf -> global -> TICKET_NOTIFICATION_EMAIL_TO , $sendto )
) {
$sendto [] = $conf -> global -> TICKET_NOTIFICATION_EMAIL_TO ;
2020-04-16 00:42:57 +02:00
}
if ( ! empty ( $sendto )) {
2020-05-27 11:39:06 +02:00
$label_title = empty ( $conf -> global -> MAIN_APPLICATION_TITLE ) ? $mysoc -> name : $conf -> global -> MAIN_APPLICATION_TITLE ;
2020-09-07 10:18:17 +02:00
$subject = '[' . $label_title . '- ticket #' . $object -> track_id . '] ' . $langs -> trans ( 'TicketNewMessage' );
2020-05-27 11:39:06 +02:00
// Message send
$message = $langs -> trans ( 'TicketMessageMailIntroText' );
2020-08-28 17:54:57 +02:00
$message .= '<br><br>' ;
2020-09-03 17:22:27 +02:00
$messagePost = GETPOST ( 'message' , 'restricthtml' );
if ( ! dol_textishtml ( $messagePost )) {
$messagePost = dol_nl2br ( $messagePost );
}
$message .= $messagePost ;
2020-05-27 11:39:06 +02:00
// Customer company infos
2020-08-28 17:54:57 +02:00
$message .= '<br><br>' ;
2020-05-27 11:39:06 +02:00
$message .= " ============================================== " ;
2020-09-08 21:27:28 +02:00
$message .= ! empty ( $object -> thirdparty -> name ) ? '<br>' . $langs -> trans ( 'Thirdparty' ) . " : " . $object -> thirdparty -> name : '' ;
$message .= ! empty ( $object -> thirdparty -> town ) ? '<br>' . $langs -> trans ( 'Town' ) . " : " . $object -> thirdparty -> town : '' ;
$message .= ! empty ( $object -> thirdparty -> phone ) ? '<br>' . $langs -> trans ( 'Phone' ) . " : " . $object -> thirdparty -> phone : '' ;
2020-05-27 11:39:06 +02:00
// Email send to
2020-08-28 17:54:57 +02:00
$message .= '<br><br>' ;
2020-05-27 11:39:06 +02:00
if ( ! empty ( $assigned_user_dont_have_email )) {
2020-09-08 21:27:28 +02:00
$message .= '<br>' . $langs -> trans ( 'NoEMail' ) . ' : ' . $assigned_user_dont_have_email ;
2020-05-27 11:39:06 +02:00
}
foreach ( $sendto as $val ) {
2020-09-08 21:27:28 +02:00
$message .= '<br>' . $langs -> trans ( 'TicketNotificationRecipient' ) . ' : ' . $val ;
2020-05-27 11:39:06 +02:00
}
// URL ticket
2020-09-08 21:27:28 +02:00
$url_internal_ticket = dol_buildpath ( '/ticket/card.php' , 2 ) . '?track_id=' . $object -> track_id ;
2020-08-28 17:54:57 +02:00
$message .= '<br><br>' ;
2020-09-08 21:27:28 +02:00
$message .= $langs -> trans ( 'TicketNotificationEmailBodyInfosTrackUrlinternal' ) . ' : <a href="' . $url_internal_ticket . '">' . $object -> track_id . '</a>' ;
2020-05-27 11:39:06 +02:00
2020-04-16 00:42:57 +02:00
$this -> sendTicketMessageByEmail ( $subject , $message , '' , $sendto , $listofpaths , $listofmimes , $listofnames );
}
}
2021-02-26 13:27:00 +01:00
} else {
/*
* Private area
*/
2020-04-16 00:42:57 +02:00
/*
2020-05-27 11:39:06 +02:00
* Send emails to internal users ( linked contacts )
*/
if ( $send_email > 0 ) {
// Retrieve internal contact datas
$internal_contacts = $object -> getInfosTicketInternalContact ();
2020-04-16 00:42:57 +02:00
$sendto = array ();
2020-05-27 11:39:06 +02:00
if ( is_array ( $internal_contacts ) && count ( $internal_contacts ) > 0 ) {
// altairis: set default subject
2020-04-16 00:42:57 +02:00
$label_title = empty ( $conf -> global -> MAIN_APPLICATION_TITLE ) ? $mysoc -> name : $conf -> global -> MAIN_APPLICATION_TITLE ;
2020-09-07 10:18:17 +02:00
$subject = GETPOST ( 'subject' , 'nohtml' ) ? GETPOST ( 'subject' , 'nohtml' ) : '[' . $label_title . '- ticket #' . $object -> track_id . '] ' . $langs -> trans ( 'TicketNewMessage' );
2020-04-16 00:42:57 +02:00
2020-09-07 10:18:17 +02:00
$message_intro = $langs -> trans ( 'TicketNotificationEmailBody' , " # " . $object -> id );
2020-04-16 00:42:57 +02:00
$message_signature = GETPOST ( 'mail_signature' ) ? GETPOST ( 'mail_signature' ) : $conf -> global -> TICKET_MESSAGE_MAIL_SIGNATURE ;
2020-05-27 11:39:06 +02:00
$message = $langs -> trans ( 'TicketMessageMailIntroText' );
2020-08-28 17:54:57 +02:00
$message .= '<br><br>' ;
2020-09-03 17:22:27 +02:00
$messagePost = GETPOST ( 'message' , 'restricthtml' );
if ( ! dol_textishtml ( $messagePost )) {
$messagePost = dol_nl2br ( $messagePost );
}
$message .= $messagePost ;
2020-04-16 00:42:57 +02:00
2020-05-27 11:39:06 +02:00
// Coordonnées client
2020-08-28 17:54:57 +02:00
$message .= '<br><br>' ;
$message .= " ==============================================<br> " ;
2020-09-08 21:27:28 +02:00
$message .= ! empty ( $object -> thirdparty -> name ) ? $langs -> trans ( 'Thirdparty' ) . " : " . $object -> thirdparty -> name : '' ;
$message .= ! empty ( $object -> thirdparty -> town ) ? '<br>' . $langs -> trans ( 'Town' ) . " : " . $object -> thirdparty -> town : '' ;
$message .= ! empty ( $object -> thirdparty -> phone ) ? '<br>' . $langs -> trans ( 'Phone' ) . " : " . $object -> thirdparty -> phone : '' ;
2020-05-27 11:39:06 +02:00
// Build array to display recipient list
foreach ( $internal_contacts as $key => $info_sendto ) {
// altairis: avoid duplicate notifications
if ( $info_sendto [ 'id' ] == $user -> id ) {
2020-04-16 00:42:57 +02:00
continue ;
}
2020-05-27 11:39:06 +02:00
if ( $info_sendto [ 'email' ] != '' ) {
2021-02-26 13:27:00 +01:00
if ( ! empty ( $info_sendto [ 'email' ])) {
$sendto [] = trim ( $info_sendto [ 'firstname' ] . " " . $info_sendto [ 'lastname' ]) . " < " . $info_sendto [ 'email' ] . " > " ;
}
2020-04-16 00:42:57 +02:00
2020-05-27 11:39:06 +02:00
//Contact type
2020-09-08 21:27:28 +02:00
$recipient = dolGetFirstLastname ( $info_sendto [ 'firstname' ], $info_sendto [ 'lastname' ], '-1' ) . ' (' . strtolower ( $info_sendto [ 'libelle' ]) . ')' ;
$message .= ( ! empty ( $recipient ) ? $langs -> trans ( 'TicketNotificationRecipient' ) . ' : ' . $recipient . '<br>' : '' );
2020-04-16 00:42:57 +02:00
}
}
2020-08-28 17:54:57 +02:00
$message .= '<br>' ;
2020-05-27 11:39:06 +02:00
// URL ticket
2020-09-08 21:27:28 +02:00
$url_internal_ticket = dol_buildpath ( '/ticket/card.php' , 2 ) . '?track_id=' . $object -> track_id ;
2020-04-16 00:42:57 +02:00
2020-05-27 11:39:06 +02:00
// altairis: make html link on url
2020-09-08 21:27:28 +02:00
$message .= '<br>' . $langs -> trans ( 'TicketNotificationEmailBodyInfosTrackUrlinternal' ) . ' : <a href="' . $url_internal_ticket . '">' . $object -> track_id . '</a><br>' ;
2020-04-16 00:42:57 +02:00
2020-05-27 11:39:06 +02:00
// Add global email address recipient
2020-04-16 00:42:57 +02:00
if ( $conf -> global -> TICKET_NOTIFICATION_ALSO_MAIN_ADDRESS && ! in_array ( $conf -> global -> TICKET_NOTIFICATION_EMAIL_TO , $sendto )) {
2021-02-26 13:27:00 +01:00
if ( ! empty ( $conf -> global -> TICKET_NOTIFICATION_EMAIL_TO )) {
$sendto [] = $conf -> global -> TICKET_NOTIFICATION_EMAIL_TO ;
}
2020-04-16 00:42:57 +02:00
}
2020-05-27 11:39:06 +02:00
// altairis: dont try to send email if no recipient
2020-04-16 00:42:57 +02:00
if ( ! empty ( $sendto )) {
$this -> sendTicketMessageByEmail ( $subject , $message , '' , $sendto , $listofpaths , $listofmimes , $listofnames );
}
}
2020-05-27 11:39:06 +02:00
/*
* Send emails for externals users if not private ( linked contacts )
*/
if ( empty ( $object -> private )) {
// Retrieve email of all contacts (external)
$external_contacts = $object -> getInfosTicketExternalContact ();
// If no contact, get email from thirdparty
if ( is_array ( $external_contacts ) && count ( $external_contacts ) === 0 ) {
if ( ! empty ( $object -> fk_soc )) {
$object -> fetch_thirdparty ( $object -> fk_soc );
$array_company = array ( array ( 'firstname' => '' , 'lastname' => $object -> thirdparty -> name , 'email' => $object -> thirdparty -> email , 'libelle' => $langs -> transnoentities ( 'Customer' ), 'socid' => $object -> thirdparty -> id ));
$external_contacts = array_merge ( $external_contacts , $array_company );
} elseif ( empty ( $object -> fk_soc ) && ! empty ( $object -> origin_email )) {
$array_external = array ( array ( 'firstname' => '' , 'lastname' => $object -> origin_email , 'email' => $object -> thirdparty -> email , 'libelle' => $langs -> transnoentities ( 'Customer' ), 'socid' => $object -> thirdparty -> id ));
$external_contacts = array_merge ( $external_contacts , $array_external );
}
}
$sendto = array ();
if ( is_array ( $external_contacts ) && count ( $external_contacts ) > 0 ) {
// altairis: get default subject for email to external contacts
$label_title = empty ( $conf -> global -> MAIN_APPLICATION_TITLE ) ? $mysoc -> name : $conf -> global -> MAIN_APPLICATION_TITLE ;
2020-09-07 10:18:17 +02:00
$subject = GETPOST ( 'subject' ) ? GETPOST ( 'subject' ) : '[' . $label_title . '- ticket #' . $object -> track_id . '] ' . $langs -> trans ( 'TicketNewMessage' );
2020-05-27 11:39:06 +02:00
2020-08-28 17:54:57 +02:00
$message_intro = GETPOST ( 'mail_intro' ) ? GETPOST ( 'mail_intro' , 'restricthtml' ) : $conf -> global -> TICKET_MESSAGE_MAIL_INTRO ;
$message_signature = GETPOST ( 'mail_signature' ) ? GETPOST ( 'mail_signature' , 'restricthtml' ) : $conf -> global -> TICKET_MESSAGE_MAIL_SIGNATURE ;
2020-09-03 17:22:27 +02:00
if ( ! dol_textishtml ( $message_intro )) {
$message_intro = dol_nl2br ( $message_intro );
}
if ( ! dol_textishtml ( $message_signature )) {
$message_signature = dol_nl2br ( $message_signature );
}
2020-05-27 11:39:06 +02:00
// We put intro after
2020-09-03 17:22:27 +02:00
$messagePost = GETPOST ( 'message' , 'restricthtml' );
if ( ! dol_textishtml ( $messagePost )) {
$messagePost = dol_nl2br ( $messagePost );
}
$message = $messagePost ;
2020-08-28 17:54:57 +02:00
$message .= '<br><br>' ;
2020-05-27 11:39:06 +02:00
foreach ( $external_contacts as $key => $info_sendto ) {
// altairis: avoid duplicate emails to external contacts
2020-06-25 12:17:47 +02:00
if ( $info_sendto [ 'id' ] == $user -> contact_id ) {
2020-05-27 11:39:06 +02:00
continue ;
}
if ( $info_sendto [ 'email' ] != '' && $info_sendto [ 'email' ] != $object -> origin_email ) {
2021-02-26 13:27:00 +01:00
if ( ! empty ( $info_sendto [ 'email' ])) {
$sendto [] = trim ( $info_sendto [ 'firstname' ] . " " . $info_sendto [ 'lastname' ]) . " < " . $info_sendto [ 'email' ] . " > " ;
}
2020-05-27 11:39:06 +02:00
2020-09-08 21:27:28 +02:00
$recipient = dolGetFirstLastname ( $info_sendto [ 'firstname' ], $info_sendto [ 'lastname' ], '-1' ) . ' (' . strtolower ( $info_sendto [ 'libelle' ]) . ')' ;
$message .= ( ! empty ( $recipient ) ? $langs -> trans ( 'TicketNotificationRecipient' ) . ' : ' . $recipient . '<br>' : '' );
2020-05-27 11:39:06 +02:00
}
}
// If public interface is not enable, use link to internal page into mail
$url_public_ticket = ( ! empty ( $conf -> global -> TICKET_ENABLE_PUBLIC_INTERFACE ) ?
2020-09-08 21:27:28 +02:00
( ! empty ( $conf -> global -> TICKET_URL_PUBLIC_INTERFACE ) ? $conf -> global -> TICKET_URL_PUBLIC_INTERFACE . '/view.php' : dol_buildpath ( '/public/ticket/view.php' , 2 )) : dol_buildpath ( '/ticket/card.php' , 2 )) . '?track_id=' . $object -> track_id ;
$message .= '<br>' . $langs -> trans ( 'TicketNewEmailBodyInfosTrackUrlCustomer' ) . ' : <a href="' . $url_public_ticket . '">' . $object -> track_id . '</a><br>' ;
2020-05-27 11:39:06 +02:00
// Build final message
2020-09-08 21:27:28 +02:00
$message = $message_intro . '<br><br>' . $message ;
2020-05-27 11:39:06 +02:00
// Add signature
2020-09-08 21:27:28 +02:00
$message .= '<br>' . $message_signature ;
2020-05-27 11:39:06 +02:00
if ( ! empty ( $object -> origin_email )) {
$sendto [] = $object -> origin_email ;
}
if ( $object -> fk_soc > 0 && ! in_array ( $object -> origin_email , $sendto )) {
$object -> socid = $object -> fk_soc ;
$object -> fetch_thirdparty ();
2021-02-26 13:27:00 +01:00
if ( ! empty ( $object -> thirdparty -> email )) {
$sendto [] = $object -> thirdparty -> email ;
}
2020-05-27 11:39:06 +02:00
}
// altairis: Add global email address reciepient
if ( $conf -> global -> TICKET_NOTIFICATION_ALSO_MAIN_ADDRESS && ! in_array ( $conf -> global -> TICKET_NOTIFICATION_EMAIL_TO , $sendto )) {
2021-02-26 13:27:00 +01:00
if ( ! empty ( $conf -> global -> TICKET_NOTIFICATION_EMAIL_TO )) {
$sendto [] = $conf -> global -> TICKET_NOTIFICATION_EMAIL_TO ;
}
2020-05-27 11:39:06 +02:00
}
// altairis: dont try to send email when no recipient
if ( ! empty ( $sendto )) {
2022-02-07 17:38:32 +01:00
$result = $this -> sendTicketMessageByEmail ( $subject , $message , '' , $sendto , $listofpaths , $listofmimes , $listofnames );
if ( $result ) {
// update last_msg_sent date
$object -> date_last_msg_sent = dol_now ();
$object -> update ( $user );
}
2020-05-27 11:39:06 +02:00
}
}
}
2020-04-16 00:42:57 +02:00
}
}
// Set status to "answered" if not set yet, but only if internal user
2021-02-26 13:27:00 +01:00
if ( $object -> fk_statut < 3 && ! $user -> socid ) {
2020-04-16 00:42:57 +02:00
$object -> setStatut ( 3 );
}
return 1 ;
} else {
setEventMessages ( $object -> error , $object -> errors , 'errors' );
return - 1 ;
}
} else {
setEventMessages ( $this -> error , $this -> errors , 'errors' );
return - 1 ;
}
}
2019-04-10 11:39:54 +02:00
2019-04-11 19:20:55 +02:00
2020-04-16 00:42:57 +02:00
/**
* Send ticket by email to linked contacts
*
* @ param string $subject Email subject
* @ param string $message Email message
* @ param int $send_internal_cc Receive a copy on internal email ( $conf -> global -> TICKET_NOTIFICATION_EMAIL_FROM )
* @ param array $array_receiver Array of receiver . exemple array ( 'name' => 'John Doe' , 'email' => 'john@doe.com' , etc ... )
2019-10-04 19:41:35 +02:00
* @ param array $filename_list List of files to attach ( full path of filename on file system )
* @ param array $mimetype_list List of MIME type of attached files
* @ param array $mimefilename_list List of attached file name in message
2022-02-07 17:38:32 +01:00
* @ return boolean True if mail sent to at least one receiver , false otherwise
2020-04-16 00:42:57 +02:00
*/
public function sendTicketMessageByEmail ( $subject , $message , $send_internal_cc = 0 , $array_receiver = array (), $filename_list = array (), $mimetype_list = array (), $mimefilename_list = array ())
{
global $conf , $langs ;
if ( $conf -> global -> TICKET_DISABLE_ALL_MAILS ) {
dol_syslog ( get_class ( $this ) . '::sendTicketMessageByEmail: Emails are disable into ticket setup by option TICKET_DISABLE_ALL_MAILS' , LOG_WARNING );
2022-02-07 17:38:32 +01:00
return false ;
2020-04-16 00:42:57 +02:00
}
$langs -> load ( " mails " );
include_once DOL_DOCUMENT_ROOT . '/contact/class/contact.class.php' ;
//$contactstatic = new Contact($this->db);
// If no receiver defined, load all ticket linked contacts
if ( ! is_array ( $array_receiver ) || ! count ( $array_receiver ) > 0 ) {
$array_receiver = $this -> getInfosTicketInternalContact ();
$array_receiver = array_merge ( $array_receiver , $this -> getInfosTicketExternalContact ());
}
if ( $send_internal_cc ) {
$sendtocc = $conf -> global -> TICKET_NOTIFICATION_EMAIL_FROM ;
}
$from = $conf -> global -> TICKET_NOTIFICATION_EMAIL_FROM ;
2022-02-07 17:38:32 +01:00
$is_sent = false ;
2020-04-16 00:42:57 +02:00
if ( is_array ( $array_receiver ) && count ( $array_receiver ) > 0 ) {
2021-02-26 13:27:00 +01:00
foreach ( $array_receiver as $key => $receiver ) {
2020-04-16 00:42:57 +02:00
$deliveryreceipt = 0 ;
$filepath = $filename_list ;
$filename = $mimefilename_list ;
$mimetype = $mimetype_list ;
// Envoi du mail
if ( ! empty ( $conf -> global -> TICKET_DISABLE_MAIL_AUTOCOPY_TO )) {
$old_MAIN_MAIL_AUTOCOPY_TO = $conf -> global -> MAIN_MAIL_AUTOCOPY_TO ;
$conf -> global -> MAIN_MAIL_AUTOCOPY_TO = '' ;
}
include_once DOL_DOCUMENT_ROOT . '/core/class/CMailFile.class.php' ;
2020-01-23 12:53:24 +01:00
$trackid = " tic " . $this -> id ;
2020-09-02 15:33:18 +02:00
$mailfile = new CMailFile ( $subject , $receiver , $from , $message , $filepath , $mimetype , $filename , $sendtocc , '' , $deliveryreceipt , - 1 , '' , '' , $trackid , '' , 'ticket' );
2020-04-16 00:42:57 +02:00
if ( $mailfile -> error ) {
setEventMessages ( $mailfile -> error , null , 'errors' );
} else {
$result = $mailfile -> sendfile ();
if ( $result ) {
setEventMessages ( $langs -> trans ( 'MailSuccessfulySent' , $mailfile -> getValidAddress ( $from , 2 ), $mailfile -> getValidAddress ( $receiver , 2 )), null , 'mesgs' );
2022-02-07 17:38:32 +01:00
$is_sent = true ;
2020-04-16 00:42:57 +02:00
} else {
$langs -> load ( " other " );
if ( $mailfile -> error ) {
setEventMessages ( $langs -> trans ( 'ErrorFailedToSendMail' , $from , $receiver ), null , 'errors' );
dol_syslog ( $langs -> trans ( 'ErrorFailedToSendMail' , $from , $receiver ) . ' : ' . $mailfile -> error );
} else {
setEventMessages ( 'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS' , null , 'errors' );
}
}
}
if ( ! empty ( $conf -> global -> TICKET_DISABLE_MAIL_AUTOCOPY_TO )) {
$conf -> global -> MAIN_MAIL_AUTOCOPY_TO = $old_MAIN_MAIL_AUTOCOPY_TO ;
}
}
} else {
$langs -> load ( " other " );
setEventMessages ( $langs -> trans ( 'ErrorMailRecipientIsEmptyForSendTicketMessage' ), null , 'warnings' );
}
2022-02-07 17:38:32 +01:00
return $is_sent ;
2020-04-16 00:42:57 +02:00
}
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Load indicators for dashboard ( this -> nbtodo and this -> nbtodolate )
*
* @ param User $user Object user
* @ param int $mode " opened " for askprice to close , " signed " for proposal to invoice
* @ return int < 0 if KO , > 0 if OK
*/
public function load_board ( $user , $mode )
{
// phpcs:enable
global $conf , $user , $langs ;
$now = dol_now ();
2021-03-14 09:14:43 +01:00
$delay_warning = 0 ;
2020-04-16 00:42:57 +02:00
$this -> nbtodo = $this -> nbtodolate = 0 ;
$clause = " WHERE " ;
$sql = " SELECT p.rowid, p.ref, p.datec as datec " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " ticket as p " ;
2021-10-22 22:15:59 +02:00
if ( $conf -> societe -> enabled && empty ( $user -> rights -> societe -> client -> voir ) && ! $user -> socid ) {
2020-04-16 00:42:57 +02:00
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " societe_commerciaux as sc ON p.fk_soc = sc.fk_soc " ;
2021-08-23 17:41:11 +02:00
$sql .= " WHERE sc.fk_user = " . (( int ) $user -> id );
2020-04-16 00:42:57 +02:00
$clause = " AND " ;
}
$sql .= $clause . " p.entity IN ( " . getEntity ( 'ticket' ) . " ) " ;
2021-02-26 13:27:00 +01:00
if ( $mode == 'opened' ) {
$sql .= " AND p.fk_statut NOT IN ( " . Ticket :: STATUS_CLOSED . " , " . Ticket :: STATUS_CANCELED . " ) " ;
}
if ( $user -> socid ) {
2021-08-23 17:41:11 +02:00
$sql .= " AND p.fk_soc = " . (( int ) $user -> socid );
2021-02-26 13:27:00 +01:00
}
2020-04-16 00:42:57 +02:00
$resql = $this -> db -> query ( $sql );
2021-02-26 13:27:00 +01:00
if ( $resql ) {
2020-04-16 00:42:57 +02:00
$label = $labelShort = '' ;
$status = '' ;
if ( $mode == 'opened' ) {
$status = 'openall' ;
//$delay_warning = $conf->ticket->warning_delay;
$delay_warning = 0 ;
$label = $langs -> trans ( " MenuListNonClosed " );
$labelShort = $langs -> trans ( " MenuListNonClosed " );
}
$response = new WorkboardResponse ();
//$response->warning_delay = $delay_warning / 60 / 60 / 24;
$response -> label = $label ;
$response -> labelShort = $labelShort ;
$response -> url = DOL_URL_ROOT . '/ticket/list.php?search_fk_statut[]=' . $status ;
$response -> img = img_object ( '' , " ticket " );
// This assignment in condition is not a bug. It allows walking the results.
2021-02-26 13:27:00 +01:00
while ( $obj = $this -> db -> fetch_object ( $resql )) {
2020-04-16 00:42:57 +02:00
$response -> nbtodo ++ ;
2021-02-26 13:27:00 +01:00
if ( $mode == 'opened' ) {
2021-03-14 09:14:43 +01:00
$datelimit = $this -> db -> jdate ( $obj -> datec ) + $delay_warning ;
if ( $datelimit < $now ) {
2020-04-16 00:42:57 +02:00
//$response->nbtodolate++;
}
}
}
return $response ;
2020-05-21 15:05:19 +02:00
} else {
2020-04-16 00:42:57 +02:00
$this -> error = $this -> db -> lasterror ();
return - 1 ;
}
}
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Load indicator this -> nb of global stats widget
*
* @ return int < 0 if ko , > 0 if ok
*/
public function load_state_board ()
{
// phpcs:enable
global $conf , $user ;
$this -> nb = array ();
$clause = " WHERE " ;
$sql = " SELECT count(p.rowid) as nb " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " ticket as p " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " societe as s ON p.fk_soc = s.rowid " ;
2021-10-22 22:15:59 +02:00
if ( empty ( $user -> rights -> societe -> client -> voir ) && ! $user -> socid ) {
2020-04-16 00:42:57 +02:00
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " societe_commerciaux as sc ON s.rowid = sc.fk_soc " ;
2021-08-23 17:41:11 +02:00
$sql .= " WHERE sc.fk_user = " . (( int ) $user -> id );
2020-04-16 00:42:57 +02:00
$clause = " AND " ;
}
$sql .= " " . $clause . " p.entity IN ( " . getEntity ( 'ticket' ) . " ) " ;
$resql = $this -> db -> query ( $sql );
2021-02-26 13:27:00 +01:00
if ( $resql ) {
2020-04-16 00:42:57 +02:00
// This assignment in condition is not a bug. It allows walking the results.
2021-02-26 13:27:00 +01:00
while ( $obj = $this -> db -> fetch_object ( $resql )) {
2020-04-16 00:42:57 +02:00
$this -> nb [ " ticket " ] = $obj -> nb ;
}
$this -> db -> free ( $resql );
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2020-04-16 00:42:57 +02:00
dol_print_error ( $this -> db );
$this -> error = $this -> db -> lasterror ();
return - 1 ;
}
}
2020-10-16 17:08:23 +02:00
/**
* Function used to replace a thirdparty id with another one .
*
* @ param DoliDB $db Database handler
* @ param int $origin_id Old thirdparty id
* @ param int $dest_id New thirdparty id
* @ return bool
*/
public static function replaceThirdparty ( $db , $origin_id , $dest_id )
{
$tables = array ( 'ticket' );
return CommonObject :: commonReplaceThirdparty ( $db , $origin_id , $dest_id , $tables );
}
2018-03-10 04:23:59 +01:00
}
2018-03-11 11:33:24 +01:00
2018-03-10 04:23:59 +01:00
/**
2018-03-11 11:33:24 +01:00
* Ticket line Class
2018-03-10 04:23:59 +01:00
*/
class TicketsLine
{
2019-11-12 10:11:30 +01:00
/**
* @ var int ID
* @ deprecated
*/
public $rowid ;
/**
2020-04-16 00:42:57 +02:00
* @ var int ID
*/
public $id ;
/**
* @ var string $ref Ticket reference
*/
public $ref ;
/**
* Hash to identify ticket
*/
public $track_id ;
/**
* @ var int Thirdparty ID
*/
public $fk_soc ;
/**
* Project ID
*/
public $fk_project ;
/**
* Person email who have create ticket
*/
public $origin_email ;
/**
* User id who have create ticket
*/
public $fk_user_create ;
/**
* User id who have ticket assigned
*/
public $fk_user_assign ;
/**
* Ticket subject
*/
public $subject ;
/**
* Ticket message
*/
public $message ;
/**
* Ticket statut
*/
public $fk_statut ;
/**
* State resolution
*/
public $resolution ;
/**
* Progress in percent
*/
public $progress ;
/**
* Duration for ticket
*/
public $timing ;
/**
* Type code
*/
public $type_code ;
/**
* Category code
*/
public $category_code ;
/**
* Severity code
*/
public $severity_code ;
/**
* Type label
*/
public $type_label ;
/**
* Category label
*/
public $category_label ;
/**
* Severity label
*/
public $severity_label ;
/**
* Creation date
*/
public $datec = '' ;
/**
* Read date
*/
public $date_read = '' ;
2022-02-04 16:14:41 +01:00
/**
* @ var int Last message date
*/
public $date_last_msg_sent = '' ;
2020-04-16 00:42:57 +02:00
/**
* Close ticket date
*/
public $date_close = '' ;
2018-03-10 04:23:59 +01:00
}