Files
scripts/Perl OTRS/Kernel/System/Stats/Dynamic/ITSMConfigItem.pm
2024-10-14 00:08:40 +02:00

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;