321 lines
8.7 KiB
Perl
321 lines
8.7 KiB
Perl
# --
|
|
# 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::System::Stats::Dynamic::ITSMConfigItem;
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
our @ObjectDependencies = (
|
|
'Kernel::System::GeneralCatalog',
|
|
'Kernel::System::ITSMConfigItem',
|
|
'Kernel::System::DateTime',
|
|
);
|
|
|
|
sub new {
|
|
my ( $Type, %Param ) = @_;
|
|
|
|
# allocate new hash for object
|
|
my $Self = {};
|
|
bless( $Self, $Type );
|
|
|
|
return $Self;
|
|
}
|
|
|
|
sub GetObjectName {
|
|
my $Self = shift;
|
|
|
|
return 'ITSMConfigItem';
|
|
}
|
|
|
|
sub GetObjectBehaviours {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
my %Behaviours = (
|
|
ProvidesDashboardWidget => 1,
|
|
);
|
|
|
|
return %Behaviours;
|
|
}
|
|
|
|
sub GetObjectAttributes {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
# get class list
|
|
my $ClassList = $Kernel::OM->Get('Kernel::System::GeneralCatalog')->ItemList(
|
|
Class => 'ITSM::ConfigItem::Class',
|
|
);
|
|
|
|
# get deployment state list
|
|
my $DeplStateList = $Kernel::OM->Get('Kernel::System::GeneralCatalog')->ItemList(
|
|
Class => 'ITSM::ConfigItem::DeploymentState',
|
|
);
|
|
|
|
# get incident state list
|
|
my $InciStateList = $Kernel::OM->Get('Kernel::System::GeneralCatalog')->ItemList(
|
|
Class => 'ITSM::Core::IncidentState',
|
|
);
|
|
|
|
# get current time to fix bug#3830
|
|
my $TimeStamp = $Kernel::OM->Create('Kernel::System::DateTime')->ToString();
|
|
|
|
# create object attribute array
|
|
my @ObjectAttributes = (
|
|
{
|
|
Name => 'Class',
|
|
UseAsXvalue => 1,
|
|
UseAsValueSeries => 1,
|
|
UseAsRestriction => 1,
|
|
Element => 'ClassIDs',
|
|
Block => 'MultiSelectField',
|
|
LanguageTranslation => 0,
|
|
Values => $ClassList,
|
|
},
|
|
{
|
|
Name => 'Deployment State',
|
|
UseAsXvalue => 1,
|
|
UseAsValueSeries => 1,
|
|
UseAsRestriction => 1,
|
|
Element => 'DeplStateIDs',
|
|
Block => 'MultiSelectField',
|
|
Values => $DeplStateList,
|
|
},
|
|
{
|
|
Name => 'Incident State',
|
|
UseAsXvalue => 1,
|
|
UseAsValueSeries => 1,
|
|
UseAsRestriction => 1,
|
|
Element => 'InciStateIDs',
|
|
Block => 'MultiSelectField',
|
|
Values => $InciStateList,
|
|
},
|
|
{
|
|
Name => 'Number',
|
|
UseAsXvalue => 0,
|
|
UseAsValueSeries => 0,
|
|
UseAsRestriction => 1,
|
|
Element => 'Number',
|
|
Block => 'InputField',
|
|
},
|
|
{
|
|
Name => 'Name',
|
|
UseAsXvalue => 0,
|
|
UseAsValueSeries => 0,
|
|
UseAsRestriction => 1,
|
|
Element => 'Name',
|
|
Block => 'InputField',
|
|
},
|
|
{
|
|
Name => 'Create Time',
|
|
UseAsXvalue => 1,
|
|
UseAsValueSeries => 1,
|
|
UseAsRestriction => 1,
|
|
Element => 'CreateTime',
|
|
TimePeriodFormat => 'DateInputFormat',
|
|
Block => 'Time',
|
|
Values => {
|
|
TimeStart => 'ConfigItemCreateTimeNewerDate',
|
|
TimeStop => 'ConfigItemCreateTimeOlderDate',
|
|
},
|
|
},
|
|
{
|
|
Name => 'Change Time',
|
|
UseAsXvalue => 1,
|
|
UseAsValueSeries => 1,
|
|
UseAsRestriction => 1,
|
|
Element => 'ChangeTime',
|
|
TimePeriodFormat => 'DateInputFormat',
|
|
Block => 'Time',
|
|
TimeStop => $TimeStamp,
|
|
Values => {
|
|
TimeStart => 'ConfigItemChangeTimeNewerDate',
|
|
TimeStop => 'ConfigItemChangeTimeOlderDate',
|
|
},
|
|
},
|
|
);
|
|
|
|
# add the xml data
|
|
CLASSID:
|
|
for my $ClassID ( sort keys %{$ClassList} ) {
|
|
|
|
# get xml definition hash
|
|
my $XMLDefinition = $Kernel::OM->Get('Kernel::System::ITSMConfigItem')->DefinitionGet(
|
|
ClassID => $ClassID,
|
|
);
|
|
|
|
next CLASSID if !$XMLDefinition->{DefinitionID};
|
|
|
|
$Self->_XMLAttributeAdd(
|
|
ObjectAttributes => \@ObjectAttributes,
|
|
XMLDefinition => $XMLDefinition->{DefinitionRef},
|
|
Prefix => 'XML::' . $ClassID,
|
|
PrefixName => $ClassList->{$ClassID},
|
|
);
|
|
}
|
|
|
|
return @ObjectAttributes;
|
|
}
|
|
|
|
sub _XMLAttributeAdd {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
return if !$Param{ObjectAttributes};
|
|
return if !$Param{XMLDefinition};
|
|
return if ref $Param{XMLDefinition} ne 'ARRAY';
|
|
|
|
if ( $Param{Prefix} ) {
|
|
$Param{Prefix} .= '::';
|
|
}
|
|
if ( $Param{PrefixName} ) {
|
|
$Param{PrefixName} .= '::';
|
|
}
|
|
|
|
$Param{Level} ||= 0;
|
|
$Param{Prefix} ||= '';
|
|
$Param{PrefixName} ||= '';
|
|
|
|
ITEM:
|
|
for my $Item ( @{ $Param{XMLDefinition} } ) {
|
|
|
|
next ITEM if !$Item->{Searchable} && !$Item->{Sub};
|
|
|
|
# create key and name
|
|
my $Key = $Param{Prefix} . $Item->{Key};
|
|
my $Name = $Param{PrefixName} . $Item->{Name};
|
|
|
|
# add attribute
|
|
my $Attribute = $Kernel::OM->Get('Kernel::System::ITSMConfigItem')->XMLStatsAttributeCreate(
|
|
Key => $Key,
|
|
Item => $Item,
|
|
Name => $Name,
|
|
);
|
|
|
|
next ITEM if !$Attribute;
|
|
next ITEM if ref $Attribute ne 'ARRAY';
|
|
next ITEM if !scalar @{$Attribute};
|
|
|
|
# add attributes to object array
|
|
push @{ $Param{ObjectAttributes} }, @{$Attribute};
|
|
|
|
next ITEM if !$Item->{Sub};
|
|
|
|
# start recursion, if "Sub" was found
|
|
$Self->_XMLAttributeAdd(
|
|
ObjectAttributes => $Param{ObjectAttributes},
|
|
XMLDefinition => $Item->{Sub},
|
|
Level => $Param{Level} + 1,
|
|
Prefix => $Key,
|
|
PrefixName => $Name,
|
|
);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
sub GetStatElementPreview {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
return ( int rand 500 ) + 1;
|
|
}
|
|
|
|
sub GetStatElement {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
# set limit
|
|
$Param{Limit} = 1_000_000;
|
|
|
|
# extract all xml param keys from the param hash
|
|
my @XMLParams = grep { $_ =~ m{\A XML::}xms } sort keys %Param;
|
|
|
|
if (@XMLParams) {
|
|
return 'You must define a class in one axis.' if !$Param{ClassIDs};
|
|
return 'You must define a class in one axis.' if ref $Param{ClassIDs} ne 'ARRAY';
|
|
}
|
|
|
|
# to collect date fields separately
|
|
my %XMLParamsDateFields;
|
|
|
|
my %XMLClassIDs;
|
|
PARAMKEY:
|
|
for my $ParamKey (@XMLParams) {
|
|
|
|
# extract search values
|
|
my $SearchValues = $Param{$ParamKey};
|
|
|
|
# prepare param value
|
|
if ( !ref $SearchValues ) {
|
|
$SearchValues = [$SearchValues];
|
|
}
|
|
|
|
next PARAMKEY if !@{$SearchValues};
|
|
|
|
# split param key
|
|
my ( $ClassID, $SearchKey ) = $ParamKey =~ m{ \A XML:: ( \d+ ) :: (.+) \z }xms;
|
|
|
|
# prepare search key
|
|
$SearchKey =~ s[ :: ]['}[%]{']xmsg;
|
|
|
|
# Add class id to xml class id hash
|
|
$XMLClassIDs{$ClassID} = 1;
|
|
|
|
# collect date fields separately (e.g WarrantyExpirationDateNewerDate)
|
|
if ( $SearchKey =~ m{ (.+) ( NewerDate | OlderDate ) \z }xms ) {
|
|
$XMLParamsDateFields{$1}->{$2} = $SearchValues->[0];
|
|
|
|
next PARAMKEY;
|
|
}
|
|
|
|
# create search hash
|
|
my $SearchHash = {
|
|
'[1]{\'Version\'}[1]{\'' . $SearchKey . '\'}[%]{\'Content\'}' => $SearchValues,
|
|
};
|
|
|
|
push @{ $Param{What} }, $SearchHash;
|
|
}
|
|
|
|
# build search hash for date fields
|
|
for my $DateFieldName ( sort keys %XMLParamsDateFields ) {
|
|
|
|
my $SearchHash = {
|
|
'[1]{\'Version\'}[1]{\'' . $DateFieldName . '\'}[%]{\'Content\'}' => {
|
|
'-between' => [
|
|
$XMLParamsDateFields{$DateFieldName}->{NewerDate},
|
|
$XMLParamsDateFields{$DateFieldName}->{OlderDate},
|
|
],
|
|
},
|
|
};
|
|
|
|
push @{ $Param{What} }, $SearchHash;
|
|
}
|
|
|
|
if (%XMLClassIDs) {
|
|
my @Exists = grep { $XMLClassIDs{$_} } @{ $Param{ClassIDs} };
|
|
|
|
return 0 if !@Exists;
|
|
}
|
|
|
|
# start config item extended search
|
|
my $ConfigItemIDs = $Kernel::OM->Get('Kernel::System::ITSMConfigItem')->ConfigItemSearchExtended(%Param);
|
|
|
|
return scalar @{$ConfigItemIDs};
|
|
}
|
|
|
|
sub ExportWrapper {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
return \%Param;
|
|
}
|
|
|
|
sub ImportWrapper {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
return \%Param;
|
|
}
|
|
|
|
1;
|