# --
# 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::Console::Command::Admin::FAQ::Import;
use strict;
use warnings;
use parent qw(Kernel::System::Console::BaseCommand);
our @ObjectDependencies = (
'Kernel::Config',
'Kernel::System::CSV',
'Kernel::System::DB',
'Kernel::System::FAQ',
'Kernel::System::Group',
'Kernel::System::Main',
);
sub Configure {
my ( $Self, %Param ) = @_;
$Self->Description('FAQ import tool.');
$Self->AddOption(
Name => 'separator',
Description => "Defines the separator for data in CSV file (default ';').",
Required => 0,
HasValue => 1,
ValueRegex => qr/.*/smx,
);
$Self->AddOption(
Name => 'quote',
Description => "Defines the quote for data in CSV file (default '\"').",
Required => 0,
HasValue => 1,
ValueRegex => qr/.*/smx,
);
$Self->AddArgument(
Name => 'source-path',
Description => "Specify the path to the file which containing FAQ items for importing.",
Required => 1,
ValueRegex => qr/.*/smx,
);
$Self->AdditionalHelp(
"Format of the CSV file:\n
title;category;language;statetype;field1;field2;field3;field4;field5;field6;keywords
\n"
);
return;
}
sub PreRun {
my ( $Self, %Param ) = @_;
my $SourcePath = $Self->GetArgument('source-path');
if ( $SourcePath && !-r $SourcePath ) {
die "File $SourcePath does not exist, can not be read.\n";
}
return;
}
sub Run {
my ( $Self, %Param ) = @_;
$Self->Print("Importing FAQ items...\n");
$Self->Print( "" . ( '=' x 69 ) . "\n" );
my $SourcePath = $Self->GetArgument('source-path');
$Self->Print("Read File $SourcePath \n\n");
# read source file
my $CSVStringRef = $Kernel::OM->Get('Kernel::System::Main')->FileRead(
Location => $SourcePath,
Result => 'SCALAR',
Mode => 'binmode',
);
if ( !$CSVStringRef ) {
$Self->PrintError("Can't read file $SourcePath.\nImport aborted.\n");
return $Self->ExitCodeError();
}
my $Separator = $Self->GetOption('separator') || ';';
my $Quote = $Self->GetOption('quote') || '"';
# read CSV data
my $DataRef = $Kernel::OM->Get('Kernel::System::CSV')->CSV2Array(
String => $$CSVStringRef,
Separator => $Separator,
Quote => $Quote,
);
if ( !$DataRef ) {
$Self->PrintError("Error occurred. Import impossible! See Syslog for details.\n");
return $Self->ExitCodeError();
}
my $FAQObject = $Kernel::OM->Get('Kernel::System::FAQ');
my %LanguageID = reverse $FAQObject->LanguageList(
UserID => 1,
);
my %StateTypeID = reverse %{ $FAQObject->StateTypeList( UserID => 1 ) };
# get group id for FAQ group
my $FAQGroupID = $Kernel::OM->Get('Kernel::System::Group')->GroupLookup(
Group => 'faq',
);
my $LineCounter;
my $SuccessCount = 0;
my $UnScuccessCount = 0;
ROWREF:
for my $RowRef ( @{$DataRef} ) {
$LineCounter++;
my (
$Title, $CategoryString, $Language, $StateType,
$Field1, $Field2, $Field3, $Field4, $Field5, $Field6, $Keywords
) = @{$RowRef};
# check language
if ( !$LanguageID{$Language} ) {
$Self->PrintError("Error: Could not import line $LineCounter. Language '$Language' does not exist.\n");
next ROWREF;
}
# check state type
if ( !$StateTypeID{$StateType} ) {
$Self->PrintError("Error: Could not import line $LineCounter. State '$StateType' does not exist.\n");
next ROWREF;
}
# get subcategories
my @CategoryArray = split /::/, $CategoryString;
# check each subcategory if it exists
my $CategoryID;
my $ParentID = 0;
my $DBObject = $Kernel::OM->Get('Kernel::System::DB');
for my $Category (@CategoryArray) {
# get the category id
$DBObject->Prepare(
SQL => 'SELECT id FROM faq_category '
. 'WHERE valid_id = 1 AND name = ? AND parent_id = ?',
Bind => [ \$Category, \$ParentID ],
Limit => 1,
);
my @Result;
while ( my @Row = $DBObject->FetchrowArray() ) {
push( @Result, $Row[0] );
}
$CategoryID = $Result[0];
# create category if it does not exist
if ( !$CategoryID ) {
$CategoryID = $FAQObject->CategoryAdd(
Name => $Category,
ParentID => $ParentID,
ValidID => 1,
UserID => 1,
);
# add new category to FAQ group
$FAQObject->SetCategoryGroup(
CategoryID => $CategoryID,
GroupIDs => [$FAQGroupID],
UserID => 1,
);
}
# set new parent id
$ParentID = $CategoryID;
}
# check category
if ( !$CategoryID ) {
$Self->PrintError(
"Error: Could not import line $LineCounter. Category '$CategoryString' could not be created.\n"
);
next ROW;
}
# convert StateType to State
my %StateLookup = reverse $FAQObject->StateList( UserID => 1 );
my $StateID;
STATENAME:
for my $StateName ( sort keys %StateLookup ) {
if ( $StateName =~ m{\A $StateType }msxi ) {
$StateID = $StateLookup{$StateName};
last STATENAME;
}
}
my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
# set content type
my $ContentType = 'text/plain';
if ( $ConfigObject->Get('Frontend::RichText') && $ConfigObject->Get('FAQ::Item::HTML') ) {
$ContentType = 'text/html';
}
# add FAQ article
my $ItemID = $FAQObject->FAQAdd(
Title => $Title,
CategoryID => $CategoryID,
StateID => $StateID,
LanguageID => $LanguageID{$Language},
Field1 => $Field1,
Field2 => $Field2,
Field3 => $Field3,
Field4 => $Field4,
Field5 => $Field5,
Field6 => $Field6,
Keywords => $Keywords || '',
Approved => 1,
UserID => 1,
ContentType => $ContentType,
);
# check success
if ($ItemID) {
$SuccessCount++;
}
else {
$UnScuccessCount++;
$Self->PrintError("Could not import line $LineCounter.\n");
}
}
if ($SuccessCount) {
$Self->Print("Successfully imported $SuccessCount FAQ item(s).\n");
}
if ($UnScuccessCount) {
$Self->Print("\nUnsuccessfully imported $UnScuccessCount FAQ items(s).\n\n");
$Self->Print("Import complete with errors.\n");
$Self->Print( "" . ( '=' x 69 ) . "\n" );
$Self->Print("Fail\n");
return $Self->ExitCodeError();
}
$Self->Print("\n");
$Self->Print("Import complete.\n");
$Self->Print( "" . ( '=' x 69 ) . "\n" );
$Self->Print("Done.\n");
return $Self->ExitCodeOk();
}
1;
=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