# --
# Copyright (C) 2001-2019 OTRS AG, https://otrs.com/
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (GPL). If you
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
# --
package Kernel::GenericInterface::Operation::Ticket::Common;
use strict;
use warnings;
use MIME::Base64();
use Mail::Address;
use Kernel::System::VariableCheck qw(:all);
our $ObjectManagerDisabled = 1;
=head1 NAME
Kernel::GenericInterface::Operation::Ticket::Common - Base class for all Ticket Operations
=head1 PUBLIC INTERFACE
=head2 Init()
initialize the operation by checking the web service configuration and gather of the dynamic fields
my $Return = $CommonObject->Init(
WebserviceID => 1,
);
$Return = {
Success => 1, # or 0 in case of failure,
ErrorMessage => 'Error Message',
}
=cut
sub Init {
my ( $Self, %Param ) = @_;
# check needed
if ( !$Param{WebserviceID} ) {
return {
Success => 0,
ErrorMessage => "Got no WebserviceID!",
};
}
# get web service configuration
my $Webservice = $Kernel::OM->Get('Kernel::System::GenericInterface::Webservice')->WebserviceGet(
ID => $Param{WebserviceID},
);
if ( !IsHashRefWithData($Webservice) ) {
return {
Success => 0,
ErrorMessage =>
'Could not determine Web service configuration'
. ' in Kernel::GenericInterface::Operation::Ticket::Common::new()',
};
}
# get the dynamic fields
my $DynamicField = $Kernel::OM->Get('Kernel::System::DynamicField')->DynamicFieldListGet(
Valid => 1,
ObjectType => [ 'Ticket', 'Article' ],
);
# create a Dynamic Fields lookup table (by name)
DYNAMICFIELD:
for my $DynamicField ( @{$DynamicField} ) {
next DYNAMICFIELD if !$DynamicField;
next DYNAMICFIELD if !IsHashRefWithData($DynamicField);
next DYNAMICFIELD if !$DynamicField->{Name};
$Self->{DynamicFieldLookup}->{ $DynamicField->{Name} } = $DynamicField;
}
return {
Success => 1,
};
}
=head2 ValidateQueue()
checks if the given queue or queue ID is valid.
my $Success = $CommonObject->ValidateQueue(
QueueID => 123,
);
my $Success = $CommonObject->ValidateQueue(
Queue => 'some queue',
);
returns
$Success = 1 # or 0
=cut
sub ValidateQueue {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !$Param{QueueID} && !$Param{Queue};
my %QueueData;
# check for Queue name sent
if (
$Param{Queue}
&& $Param{Queue} ne ''
&& !$Param{QueueID}
)
{
%QueueData = $Kernel::OM->Get('Kernel::System::Queue')->QueueGet(
Name => $Param{Queue},
);
}
# otherwise use QueueID
elsif ( $Param{QueueID} ) {
%QueueData = $Kernel::OM->Get('Kernel::System::Queue')->QueueGet(
ID => $Param{QueueID},
);
}
else {
return;
}
# return false if queue data is empty
return if !IsHashRefWithData( \%QueueData );
# return false if queue is not valid
if (
$Kernel::OM->Get('Kernel::System::Valid')->ValidLookup( ValidID => $QueueData{ValidID} ) ne
'valid'
)
{
return;
}
return 1;
}
=head2 ValidateLock()
checks if the given lock or lock ID is valid.
my $Success = $CommonObject->ValidateLock(
LockID => 123,
);
my $Success = $CommonObject->ValidateLock(
Lock => 'some lock',
);
returns
$Success = 1 # or 0
=cut
sub ValidateLock {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !$Param{LockID} && !$Param{Lock};
# check for Lock name sent
if (
$Param{Lock}
&& $Param{Lock} ne ''
&& !$Param{LockID}
)
{
my $LockID = $Kernel::OM->Get('Kernel::System::Lock')->LockLookup(
Lock => $Param{Lock},
);
return if !$LockID;
}
# otherwise use LockID
elsif ( $Param{LockID} ) {
my $Lock = $Kernel::OM->Get('Kernel::System::Lock')->LockLookup(
LockID => $Param{LockID},
);
return if !$Lock;
}
else {
return;
}
return 1;
}
=head2 ValidateType()
checks if the given type or type ID is valid.
my $Success = $CommonObject->ValidateType(
TypeID => 123,
);
my $Success = $CommonObject->ValidateType(
Type => 'some type',
);
returns
$Success = 1 # or 0
=cut
sub ValidateType {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !$Param{TypeID} && !$Param{Type};
my %TypeData;
# check for Type name sent
if (
$Param{Type}
&& $Param{Type} ne ''
&& !$Param{TypeID}
)
{
%TypeData = $Kernel::OM->Get('Kernel::System::Type')->TypeGet(
Name => $Param{Type},
);
}
# otherwise use TypeID
elsif ( $Param{TypeID} ) {
%TypeData = $Kernel::OM->Get('Kernel::System::Type')->TypeGet(
ID => $Param{TypeID},
);
}
else {
return;
}
# return false if type data is empty
return if !IsHashRefWithData( \%TypeData );
# return false if type is not valid
if (
$Kernel::OM->Get('Kernel::System::Valid')->ValidLookup( ValidID => $TypeData{ValidID} ) ne
'valid'
)
{
return;
}
return 1;
}
=head2 ValidateCustomer()
checks if the given customer user or customer ID is valid.
my $Success = $CommonObject->ValidateCustomer(
CustomerID => 123,
);
my $Success = $CommonObject->ValidateCustomer(
CustomerUser => 'some type',
);
returns
$Success = 1 # or 0
=cut
sub ValidateCustomer {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !$Param{CustomerUser};
my %CustomerData;
# check for customer user sent
if (
$Param{CustomerUser}
&& $Param{CustomerUser} ne ''
)
{
%CustomerData = $Kernel::OM->Get('Kernel::System::CustomerUser')->CustomerUserDataGet(
User => $Param{CustomerUser},
);
}
else {
return;
}
# if customer is not registered in the database, check if email is valid
if ( !IsHashRefWithData( \%CustomerData ) ) {
return $Self->ValidateFrom( From => $Param{CustomerUser} );
}
# if ValidID is present, check if it is valid!
if ( defined $CustomerData{ValidID} ) {
# return false if customer is not valid
if (
$Kernel::OM->Get('Kernel::System::Valid')->ValidLookup( ValidID => $CustomerData{ValidID} ) ne 'valid'
)
{
return;
}
}
return 1;
}
=head2 ValidateService()
checks if the given service or service ID is valid.
my $Success = $CommonObject->ValidateService(
ServiceID => 123,
CustomerUser => 'Test',
);
my $Success = $CommonObject->ValidateService(
Service => 'some service',
CustomerUser => 'Test',
);
returns
$Success = 1 # or 0
=cut
sub ValidateService {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !$Param{ServiceID} && !$Param{Service};
return if !$Param{CustomerUser};
my %ServiceData;
# get service object
my $ServiceObject = $Kernel::OM->Get('Kernel::System::Service');
# check for Service name sent
if (
$Param{Service}
&& $Param{Service} ne ''
&& !$Param{ServiceID}
)
{
%ServiceData = $ServiceObject->ServiceGet(
Name => $Param{Service},
UserID => 1,
);
}
# otherwise use ServiceID
elsif ( $Param{ServiceID} ) {
%ServiceData = $ServiceObject->ServiceGet(
ServiceID => $Param{ServiceID},
UserID => 1,
);
}
else {
return;
}
# return false if service data is empty
return if !IsHashRefWithData( \%ServiceData );
# return false if service is not valid
if (
$Kernel::OM->Get('Kernel::System::Valid')->ValidLookup( ValidID => $ServiceData{ValidID} )
ne 'valid'
)
{
return;
}
# get customer services
my %CustomerServices = $ServiceObject->CustomerUserServiceMemberList(
CustomerUserLogin => $Param{CustomerUser},
Result => 'HASH',
DefaultServices => 1,
);
# return if user does not have permission to use the service
return if !$CustomerServices{ $ServiceData{ServiceID} };
return 1;
}
=head2 ValidateSLA()
checks if the given service or service ID is valid.
my $Success = $CommonObject->ValidateSLA(
SLAID => 12,
ServiceID => 123, # || Service => 'some service'
);
my $Success = $CommonObject->ValidateService(
SLA => 'some SLA',
ServiceID => 123, # || Service => 'some service'
);
returns
$Success = 1 # or 0
=cut
sub ValidateSLA {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !$Param{SLAID} && !$Param{SLA};
return if !$Param{ServiceID} && !$Param{Service};
my %SLAData;
# get SLA object
my $SLAObject = $Kernel::OM->Get('Kernel::System::SLA');
# check for SLA name sent
if (
$Param{SLA}
&& $Param{SLA} ne ''
&& !$Param{SLAID}
)
{
my $SLAID = $SLAObject->SLALookup(
Name => $Param{SLA},
);
%SLAData = $SLAObject->SLAGet(
SLAID => $SLAID,
UserID => 1,
);
}
# otherwise use SLAID
elsif ( $Param{SLAID} ) {
%SLAData = $SLAObject->SLAGet(
SLAID => $Param{SLAID},
UserID => 1,
);
}
else {
return;
}
# return false if SLA data is empty
return if !IsHashRefWithData( \%SLAData );
# return false if SLA is not valid
if (
$Kernel::OM->Get('Kernel::System::Valid')->ValidLookup( ValidID => $SLAData{ValidID} )
ne 'valid'
)
{
return;
}
# get service ID
my $ServiceID;
if (
$Param{Service}
&& $Param{Service} ne ''
&& !$Param{ServiceID}
)
{
$ServiceID = $Kernel::OM->Get('Kernel::System::Service')->ServiceLookup( Name => $Param{Service} )
|| 0;
}
else {
$ServiceID = $Param{ServiceID} || 0;
}
return if !$ServiceID;
# check if SLA belongs to service
my $SLABelongsToService;
SERVICEID:
for my $SLAServiceID ( @{ $SLAData{ServiceIDs} } ) {
next SERVICEID if !$SLAServiceID;
if ( $SLAServiceID eq $ServiceID ) {
$SLABelongsToService = 1;
last SERVICEID;
}
}
# return if SLA does not belong to the service
return if !$SLABelongsToService;
return 1;
}
=head2 ValidateState()
checks if the given state or state ID is valid.
my $Success = $CommonObject->ValidateState(
StateID => 123,
);
my $Success = $CommonObject->ValidateState(
State => 'some state',
);
returns
$Success = 1 # or 0
=cut
sub ValidateState {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !$Param{StateID} && !$Param{State};
my %StateData;
# check for State name sent
if (
$Param{State}
&& $Param{State} ne ''
&& !$Param{StateID}
)
{
%StateData = $Kernel::OM->Get('Kernel::System::State')->StateGet(
Name => $Param{State},
);
}
# otherwise use StateID
elsif ( $Param{StateID} ) {
%StateData = $Kernel::OM->Get('Kernel::System::State')->StateGet(
ID => $Param{StateID},
);
}
else {
return;
}
# return false if state data is empty
return if !IsHashRefWithData( \%StateData );
# return false if queue is not valid
if (
$Kernel::OM->Get('Kernel::System::Valid')->ValidLookup( ValidID => $StateData{ValidID} )
ne 'valid'
)
{
return;
}
return 1;
}
=head2 ValidatePriority()
checks if the given priority or priority ID is valid.
my $Success = $CommonObject->ValidatePriority(
PriorityID => 123,
);
my $Success = $CommonObject->ValidatePriority(
Priority => 'some priority',
);
returns
$Success = 1 # or 0
=cut
sub ValidatePriority {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !$Param{PriorityID} && !$Param{Priority};
my %PriorityData;
# get priority object
my $PriorityObject = $Kernel::OM->Get('Kernel::System::Priority');
# check for Priority name sent
if (
$Param{Priority}
&& $Param{Priority} ne ''
&& !$Param{PriorityID}
)
{
my $PriorityID = $PriorityObject->PriorityLookup(
Priority => $Param{Priority},
);
%PriorityData = $PriorityObject->PriorityGet(
PriorityID => $PriorityID,
UserID => 1,
);
}
# otherwise use PriorityID
elsif ( $Param{PriorityID} ) {
%PriorityData = $PriorityObject->PriorityGet(
PriorityID => $Param{PriorityID},
UserID => 1,
);
}
else {
return;
}
# return false if priority data is empty
return if !IsHashRefWithData( \%PriorityData );
# return false if priority is not valid
if (
$Kernel::OM->Get('Kernel::System::Valid')->ValidLookup( ValidID => $PriorityData{ValidID} )
ne 'valid'
)
{
return;
}
return 1;
}
=head2 ValidateOwner()
checks if the given owner or owner ID is valid.
my $Success = $CommonObject->ValidateOwner(
OwnerID => 123,
);
my $Success = $CommonObject->ValidateOwner(
Owner => 'some user',
);
returns
$Success = 1 # or 0
=cut
sub ValidateOwner {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !$Param{OwnerID} && !$Param{Owner};
return $Self->_ValidateUser(
UserID => $Param{OwnerID} || '',
User => $Param{Owner} || '',
);
}
=head2 ValidateResponsible()
checks if the given responsible or responsible ID is valid.
my $Success = $CommonObject->ValidateResponsible(
ResponsibleID => 123,
);
my $Success = $CommonObject->ValidateResponsible(
Responsible => 'some user',
);
returns
$Success = 1 # or 0
=cut
sub ValidateResponsible {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !$Param{ResponsibleID} && !$Param{Responsible};
return $Self->_ValidateUser(
UserID => $Param{ResponsibleID} || '',
User => $Param{Responsible} || '',
);
}
=head2 ValidatePendingTime()
checks if the given pending time is valid.
my $Success = $CommonObject->ValidatePendingTime(
PendingTime => {
Year => 2011,
Month => 12,
Day => 23,
Hour => 15,
Minute => 0,
},
);
my $Success = $CommonObject->ValidatePendingTime(
PendingTime => {
Diff => 10080,
},
);
returns
$Success = 1 # or 0
=cut
sub ValidatePendingTime {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !$Param{PendingTime};
return if !IsHashRefWithData( $Param{PendingTime} );
# if only the Diff attribute is present, check if it's a valid number and return.
# Nothing else needs to be checked in that case.
if ( keys %{ $Param{PendingTime} } == 1 && defined $Param{PendingTime}->{Diff} ) {
return if $Param{PendingTime}->{Diff} !~ m{\A \d+ \z}msx;
return 1;
}
elsif ( defined $Param{PendingTime}->{Diff} ) {
# the use of Diff along with any other option is forbidden
return;
}
# check that no time attribute is empty or negative
for my $TimeAttribute ( sort keys %{ $Param{PendingTime} } ) {
return if $Param{PendingTime}->{$TimeAttribute} eq '';
return if int $Param{PendingTime}->{$TimeAttribute} < 0;
}
# try to convert pending time to a DateTime object
my $PendingTime = $Kernel::OM->Create(
'Kernel::System::DateTime',
ObjectParams => {
%{ $Param{PendingTime} },
Second => 0,
}
);
return if !$PendingTime;
return 1;
}
=head2 ValidateAutoResponseType()
checks if the given AutoResponseType is valid.
my $Success = $CommonObject->ValidateAutoResponseType(
AutoResponseType => 'Some AutoRespobse',
);
returns
$Success = 1 # or 0
=cut
sub ValidateAutoResponseType {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !$Param{AutoResponseType};
# get all AutoResponse Types
my %AutoResponseType = $Kernel::OM->Get('Kernel::System::AutoResponse')->AutoResponseTypeList();
return if !%AutoResponseType;
for my $AutoResponseType ( values %AutoResponseType ) {
return 1 if $AutoResponseType eq $Param{AutoResponseType};
}
return;
}
=head2 ValidateFrom()
checks if the given from is valid.
my $Success = $CommonObject->ValidateFrom(
From => 'user@domain.com',
);
returns
$Success = 1 # or 0
=cut
sub ValidateFrom {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !$Param{From};
# check email address
for my $Email ( Mail::Address->parse( $Param{From} ) ) {
if (
!$Kernel::OM->Get('Kernel::System::CheckItem')->CheckEmail( Address => $Email->address() )
)
{
return;
}
}
return 1;
}
=head2 ValidateArticleCommunicationChannel()
checks if provided Communication Channel is valid.
my $Success = $CommonObject->ValidateArticleCommunicationChannel(
CommunicationChannel => 'Internal', # optional
# or
CommunicationChannelID => 1, # optional
);
returns
$Success = 1 # or 0
=cut
sub ValidateArticleCommunicationChannel {
my ( $Self, %Param ) = @_;
# check needed stuff
if ( !$Param{CommunicationChannel} && !$Param{CommunicationChannelID} ) {
return;
}
my %CommunicationChannel = $Kernel::OM->Get('Kernel::System::CommunicationChannel')->ChannelGet(
ChannelID => $Param{CommunicationChannelID},
ChannelName => $Param{CommunicationChannel},
);
return if !%CommunicationChannel;
# TicketCreate and TicketUpdate operations should only work with MIME based communication channels
return if $CommunicationChannel{ChannelName} !~ m{\AEmail|Internal|Phone\z}msxi;
return 1;
}
=head2 ValidateSenderType()
checks if the given SenderType or SenderType ID is valid.
my $Success = $CommonObject->ValidateSenderType(
SenderTypeID => 123,
);
my $Success = $CommonObject->ValidateenderType(
SenderType => 'some SenderType',
);
returns
$Success = 1 # or 0
=cut
sub ValidateSenderType {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !$Param{SenderTypeID} && !$Param{SenderType};
my $ArticleObject = $Kernel::OM->Get('Kernel::System::Ticket::Article');
my %SenderTypeList = $ArticleObject->ArticleSenderTypeList();
# check for SenderType name sent
if (
$Param{SenderType}
&& $Param{SenderType} ne ''
&& !$Param{SenderTypeID}
)
{
my $SenderTypeID = $ArticleObject->ArticleSenderTypeLookup(
SenderType => $Param{SenderType},
);
return if !$SenderTypeID;
# check if $SenderType is valid
return if !$SenderTypeList{$SenderTypeID};
}
# otherwise use SenderTypeID
elsif ( $Param{SenderTypeID} ) {
my $SenderType = $ArticleObject->ArticleSenderTypeLookup(
SenderTypeID => $Param{SenderTypeID},
);
return if !$SenderType;
# check if $SenderType is valid
return if !$SenderTypeList{ $Param{SenderTypeID} };
}
else {
return;
}
return 1;
}
=head2 ValidateMimeType()
checks if the given MimeType is valid.
my $Success = $CommonObject->ValidateMimeType(
MimeTypeID => 'some MimeType',
);
returns
$Success = 1 # or 0
=cut
sub ValidateMimeType {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !$Param{MimeType};
return if $Param{MimeType} !~ m{\A\w+\/\w+\z};
return 1;
}
=head2 ValidateCharset()
checks if the given Charset is valid.
my $Success = $CommonObject->ValidateCharset(
Charset => 'some charset',
);
returns
$Success = 1 # or 0
=cut
sub ValidateCharset {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !$Param{Charset};
use Encode;
return if !Encode::resolve_alias( $Param{Charset} );
return 1;
}
=head2 ValidateHistoryType()
checks if the given HistoryType is valid.
my $Success = $CommonObject->ValidateHistoryType(
HistoryType => 'some HostoryType',
);
returns
$Success = 1 # or 0
=cut
sub ValidateHistoryType {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !$Param{HistoryType};
# check for HistoryType name sent
if (
$Param{HistoryType}
&& $Param{HistoryType} ne ''
)
{
my $HistoryTypeID = $Kernel::OM->Get('Kernel::System::Ticket')->HistoryTypeLookup(
Type => $Param{HistoryType},
);
return if !$HistoryTypeID;
}
else {
return;
}
return 1;
}
=head2 ValidateTimeUnit()
checks if the given TimeUnit is valid.
my $Success = $CommonObject->ValidateTimeUnit(
TimeUnit => 1,
);
returns
$Success = 1 # or 0
=cut
sub ValidateTimeUnit {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !$Param{TimeUnit};
# TimeUnit must be positive
return if $Param{TimeUnit} !~ m{\A \d+([.,]\d+)? \z}xms;
return 1;
}
=head2 ValidateUserID()
checks if the given user ID is valid.
my $Success = $CommonObject->ValidateUserID(
UserID => 123,
);
returns
$Success = 1 # or 0
=cut
sub ValidateUserID {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !$Param{UserID};
return $Self->_ValidateUser(
UserID => $Param{UserID} || '',
);
}
=head2 ValidateDynamicFieldName()
checks if the given dynamic field name is valid.
my $Success = $CommonObject->ValidateDynamicFieldName(
Name => 'some name',
);
returns
$Success = 1 # or 0
=cut
sub ValidateDynamicFieldName {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !IsHashRefWithData( $Self->{DynamicFieldLookup} );
return if !$Param{Name};
return if !$Self->{DynamicFieldLookup}->{ $Param{Name} };
return if !IsHashRefWithData( $Self->{DynamicFieldLookup}->{ $Param{Name} } );
return 1;
}
=head2 ValidateDynamicFieldValue()
checks if the given dynamic field value is valid.
my $Success = $CommonObject->ValidateDynamicFieldValue(
Name => 'some name',
Value => 'some value', # String or Integer or DateTime format
);
my $Success = $CommonObject->ValidateDynamicFieldValue(
Value => [ # Only for fields that can handle multiple values like
'some value', # Multiselect
'some other value',
],
);
returns
$Success = 1 # or 0
=cut
sub ValidateDynamicFieldValue {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !IsHashRefWithData( $Self->{DynamicFieldLookup} );
# possible structures are string and array, no data inside is needed
if ( !IsString( $Param{Value} ) && ref $Param{Value} ne 'ARRAY' ) {
return;
}
# get dynamic field config
my $DynamicFieldConfig = $Self->{DynamicFieldLookup}->{ $Param{Name} };
# Validate value.
my $ValidateValue = $Kernel::OM->Get('Kernel::System::DynamicField::Backend')->FieldValueValidate(
DynamicFieldConfig => $DynamicFieldConfig,
Value => $Param{Value},
UserID => 1,
);
return $ValidateValue;
}
=head2 ValidateDynamicFieldObjectType()
checks if the given dynamic field name is valid.
my $Success = $CommonObject->ValidateDynamicFieldObjectType(
Name => 'some name',
Article => 1, # if article exists
);
returns
$Success = 1 # or 0
=cut
sub ValidateDynamicFieldObjectType {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !IsHashRefWithData( $Self->{DynamicFieldLookup} );
return if !$Param{Name};
return if !$Self->{DynamicFieldLookup}->{ $Param{Name} };
return if !IsHashRefWithData( $Self->{DynamicFieldLookup}->{ $Param{Name} } );
my $DynamicFieldConfg = $Self->{DynamicFieldLookup}->{ $Param{Name} };
return if $DynamicFieldConfg->{ObjectType} eq 'Article' && !$Param{Article};
return 1;
}
=head2 SetDynamicFieldValue()
sets the value of a dynamic field.
my $Result = $CommonObject->SetDynamicFieldValue(
Name => 'some name', # the name of the dynamic field
Value => 'some value', # String or Integer or DateTime format
TicketID => 123
ArticleID => 123
UserID => 123,
);
my $Result = $CommonObject->SetDynamicFieldValue(
Name => 'some name', # the name of the dynamic field
Value => [
'some value',
'some other value',
],
UserID => 123,
);
returns
$Result = {
Success => 1, # if everything is ok
}
$Result = {
Success => 0,
ErrorMessage => 'Error description'
}
=cut
sub SetDynamicFieldValue {
my ( $Self, %Param ) = @_;
# check needed stuff
for my $Needed (qw(Name UserID)) {
if ( !IsString( $Param{$Needed} ) ) {
return {
Success => 0,
ErrorMessage => "SetDynamicFieldValue() Invalid value for $Needed, just string is allowed!"
};
}
}
# check value structure
if ( !IsString( $Param{Value} ) && ref $Param{Value} ne 'ARRAY' ) {
return {
Success => 0,
ErrorMessage => "SetDynamicFieldValue() Invalid value for Value, just string and array are allowed!"
};
}
return if !IsHashRefWithData( $Self->{DynamicFieldLookup} );
# get dynamic field config
my $DynamicFieldConfig = $Self->{DynamicFieldLookup}->{ $Param{Name} };
my $ObjectID;
if ( $DynamicFieldConfig->{ObjectType} eq 'Ticket' ) {
$ObjectID = $Param{TicketID} || '';
}
else {
$ObjectID = $Param{ArticleID} || '';
}
if ( !$ObjectID ) {
return {
Success => 0,
ErrorMessage => "SetDynamicFieldValue() Could not set $ObjectID!",
};
}
my $Success = $Kernel::OM->Get('Kernel::System::DynamicField::Backend')->ValueSet(
DynamicFieldConfig => $DynamicFieldConfig,
ObjectID => $ObjectID,
Value => $Param{Value},
UserID => $Param{UserID},
);
return {
Success => $Success,
};
}
=head2 CreateAttachment()
creates a new attachment for the given article.
my $Result = $CommonObject->CreateAttachment(
TicketID => 123,
Attachment => $Data, # file content (Base64 encoded)
ArticleID => 456,
UserID => 123,
);
returns
$Result = {
Success => 1, # if everything is ok
}
$Result = {
Success => 0,
ErrorMessage => 'Error description'
}
=cut
sub CreateAttachment {
my ( $Self, %Param ) = @_;
# check needed stuff
for my $Needed (qw(TicketID Attachment ArticleID UserID)) {
if ( !$Param{$Needed} ) {
return {
Success => 0,
ErrorMessage => "CreateAttachment() Got no $Needed!"
};
}
}
my $ArticleBackendObject = $Kernel::OM->Get('Kernel::System::Ticket::Article')->BackendForArticle(
TicketID => $Param{TicketID},
ArticleID => $Param{ArticleID},
);
# write attachment
my $Success = $ArticleBackendObject->ArticleWriteAttachment(
%{ $Param{Attachment} },
Content => MIME::Base64::decode_base64( $Param{Attachment}->{Content} ),
ArticleID => $Param{ArticleID},
UserID => $Param{UserID},
);
return {
Success => $Success,
};
}
=head2 CheckCreatePermissions ()
Tests if the user have the permissions to create a ticket on a determined queue
my $Result = $CommonObject->CheckCreatePermissions(
Ticket => $TicketHashReference,
UserID => 123, # or 'CustomerLogin'
UserType => 'Agent', # or 'Customer'
);
returns:
$Success = 1 # if everything is OK
=cut
sub CheckCreatePermissions {
my ( $Self, %Param ) = @_;
# check needed stuff
for my $Needed (qw(Ticket UserID UserType)) {
if ( !$Param{$Needed} ) {
return;
}
}
# get create permission groups
my %UserGroups;
if ( $Param{UserType} ne 'Customer' ) {
%UserGroups = $Kernel::OM->Get('Kernel::System::Group')->PermissionUserGet(
UserID => $Param{UserID},
Type => 'create',
);
}
else {
%UserGroups = $Kernel::OM->Get('Kernel::System::CustomerGroup')->GroupMemberList(
UserID => $Param{UserID},
Type => 'create',
Result => 'HASH',
);
}
my %QueueData;
if ( defined $Param{Ticket}->{Queue} && $Param{Ticket}->{Queue} ne '' ) {
%QueueData = $Kernel::OM->Get('Kernel::System::Queue')->QueueGet( Name => $Param{Ticket}->{Queue} );
}
else {
%QueueData = $Kernel::OM->Get('Kernel::System::Queue')->QueueGet( ID => $Param{Ticket}->{QueueID} );
}
# permission check, can we create new tickets in queue
return if !$UserGroups{ $QueueData{GroupID} };
return 1;
}
=head2 CheckAccessPermissions()
Tests if the user have access permissions over a ticket
my $Result = $CommonObject->CheckAccessPermissions(
TicketID => 123,
UserID => 123, # or 'CustomerLogin'
UserType => 'Agent', # or 'Customer'
);
returns:
$Success = 1 # if everything is OK
=cut
sub CheckAccessPermissions {
my ( $Self, %Param ) = @_;
# check needed stuff
for my $Needed (qw(TicketID UserID UserType)) {
if ( !$Param{$Needed} ) {
return;
}
}
my $TicketPermissionFunction = 'TicketPermission';
if ( $Param{UserType} eq 'Customer' ) {
$TicketPermissionFunction = 'TicketCustomerPermission';
}
my $Access = $Kernel::OM->Get('Kernel::System::Ticket')->$TicketPermissionFunction(
Type => 'ro',
TicketID => $Param{TicketID},
UserID => $Param{UserID},
);
return $Access;
}
=begin Internal:
=head2 _ValidateUser()
checks if the given user or user ID is valid.
my $Success = $CommonObject->_ValidateUser(
UserID => 123,
);
my $Success = $CommonObject->_ValidateUser(
User => 'some user',
);
returns
$Success = 1 # or 0
=cut
sub _ValidateUser {
my ( $Self, %Param ) = @_;
# check needed stuff
return if !$Param{UserID} && !$Param{User};
my %UserData;
# check for User name sent
if (
$Param{User}
&& $Param{User} ne ''
&& !$Param{UserID}
)
{
%UserData = $Kernel::OM->Get('Kernel::System::User')->GetUserData(
User => $Param{User},
Valid => 1,
);
}
# otherwise use UserID
elsif ( $Param{UserID} ) {
%UserData = $Kernel::OM->Get('Kernel::System::User')->GetUserData(
UserID => $Param{UserID},
Valid => 1,
);
}
else {
return;
}
# return false if priority data is empty
return if !IsHashRefWithData( \%UserData );
return 1;
}
1;
=end Internal:
=head1 TERMS AND CONDITIONS
This software is part of the OTRS project (L).
This software comes with ABSOLUTELY NO WARRANTY. For details, see
the enclosed file COPYING for license information (GPL). If you
did not receive this file, see L.
=cut