1322 lines
40 KiB
Perl
1322 lines
40 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::Modules::AgentTimeAccountingSetting;
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
use Kernel::Language qw(Translatable);
|
|
|
|
our $ObjectManagerDisabled = 1;
|
|
|
|
sub new {
|
|
my ( $Type, %Param ) = @_;
|
|
|
|
# allocate new hash for object
|
|
my $Self = {%Param};
|
|
bless( $Self, $Type );
|
|
|
|
return $Self;
|
|
}
|
|
|
|
sub Run {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
# get needed objects
|
|
my $ParamObject = $Kernel::OM->Get('Kernel::System::Web::Request');
|
|
my $TimeAccountingObject = $Kernel::OM->Get('Kernel::System::TimeAccounting');
|
|
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
|
|
my $LogObject = $Kernel::OM->Get('Kernel::System::Log');
|
|
my $UserObject = $Kernel::OM->Get('Kernel::System::User');
|
|
|
|
# expression add time period was pressed
|
|
if (
|
|
$ParamObject->GetParam( Param => 'AddPeriod' )
|
|
|| $ParamObject->GetParam( Param => 'SubmitUserData' )
|
|
)
|
|
{
|
|
|
|
my %GetParam = ();
|
|
|
|
$GetParam{UserID} = $ParamObject->GetParam( Param => 'UserID' );
|
|
my $Periods = $TimeAccountingObject->UserLastPeriodNumberGet(
|
|
UserID => $GetParam{UserID},
|
|
);
|
|
|
|
# check validity of periods
|
|
my %Errors = $Self->_CheckValidityUserPeriods(
|
|
Period => $Periods,
|
|
);
|
|
|
|
# if the period data is OK
|
|
if ( !%Errors ) {
|
|
|
|
# get all parameters
|
|
for my $Parameter (qw(Subaction Description Calendar)) {
|
|
$GetParam{$Parameter} = $ParamObject->GetParam( Param => $Parameter );
|
|
}
|
|
for my $Parameter (qw(ShowOvertime CreateProject AllowSkip)) {
|
|
$GetParam{$Parameter} = $ParamObject->GetParam( Param => $Parameter ) || 0;
|
|
}
|
|
|
|
my $Period = 1;
|
|
my %PeriodData;
|
|
|
|
my %UserData = $TimeAccountingObject->SingleUserSettingsGet(
|
|
UserID => $GetParam{UserID}
|
|
);
|
|
|
|
# get parameters for all registered periods
|
|
while ( $UserData{$Period} ) {
|
|
for my $Parameter (qw(WeeklyHours Overtime DateStart DateEnd LeaveDays)) {
|
|
$PeriodData{$Period}{$Parameter} = $ParamObject->GetParam( Param => $Parameter . "[$Period]" )
|
|
|| $UserData{$Period}{$Parameter};
|
|
}
|
|
$PeriodData{$Period}{UserStatus} = $ParamObject->GetParam( Param => "PeriodStatus[$Period]" ) || 0;
|
|
$Period++;
|
|
}
|
|
$GetParam{Period} = \%PeriodData;
|
|
|
|
# update periods
|
|
if ( !$TimeAccountingObject->UserSettingsUpdate(%GetParam) ) {
|
|
|
|
return $LayoutObject->ErrorScreen(
|
|
Message => Translatable('Unable to update user settings!'),
|
|
Comment => Translatable('Please contact the administrator.'),
|
|
);
|
|
}
|
|
if ( $ParamObject->GetParam( Param => 'AddPeriod' ) ) {
|
|
|
|
# show the edit time settings again, but now with a new empty time period line
|
|
return $LayoutObject->Redirect(
|
|
OP =>
|
|
"Action=AgentTimeAccountingSetting;Subaction=$GetParam{Subaction};UserID=$GetParam{UserID};"
|
|
. "NewTimePeriod=1",
|
|
);
|
|
}
|
|
else {
|
|
|
|
# show the overview of tasks and users
|
|
return $LayoutObject->Redirect(
|
|
OP => "Action=AgentTimeAccountingSetting;User=$Self->{Subaction}",
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
# ---------------------------------------------------------- #
|
|
# add project
|
|
# ---------------------------------------------------------- #
|
|
if ( $Self->{Subaction} eq 'AddProject' ) {
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
$Self->_ProjectSettingsEdit( Action => 'AddProject' );
|
|
$Output .= $LayoutObject->Output(
|
|
TemplateFile => 'AgentTimeAccountingSetting',
|
|
Data => \%Param,
|
|
);
|
|
$Output .= $LayoutObject->Footer();
|
|
return $Output;
|
|
}
|
|
|
|
# ---------------------------------------------------------- #
|
|
# add project action
|
|
# ---------------------------------------------------------- #
|
|
elsif ( $Self->{Subaction} eq 'AddProjectAction' ) {
|
|
|
|
# challenge token check for write action
|
|
$LayoutObject->ChallengeTokenCheck();
|
|
|
|
my $Note = '';
|
|
my $ProjectID;
|
|
my ( %GetParam, %Errors );
|
|
|
|
# get parameters
|
|
for my $Parameter (qw(Project ProjectDescription)) {
|
|
$GetParam{$Parameter} = $ParamObject->GetParam( Param => $Parameter ) || '';
|
|
}
|
|
$GetParam{ProjectStatus} = $ParamObject->GetParam( Param => 'ProjectStatus' )
|
|
|| '0';
|
|
|
|
# check for needed data
|
|
if ( !$GetParam{Project} ) {
|
|
$Errors{ProjectInvalid} = 'ServerError';
|
|
$Errors{ProjectErrorType} = 'ProjectMissingValue';
|
|
}
|
|
else {
|
|
|
|
# check that the name is unique
|
|
my %ExistingProject = $TimeAccountingObject->ProjectGet(
|
|
Project => $GetParam{Project},
|
|
);
|
|
if (%ExistingProject) {
|
|
$Errors{ProjectInvalid} = 'ServerError';
|
|
$Errors{ProjectErrorType} = 'ProjectDuplicateName';
|
|
}
|
|
}
|
|
|
|
# if no errors occurred
|
|
if ( !%Errors ) {
|
|
|
|
# add project
|
|
$ProjectID = $TimeAccountingObject->ProjectSettingsInsert(
|
|
%GetParam,
|
|
);
|
|
|
|
if ($ProjectID) {
|
|
|
|
# build the output
|
|
$Self->_SettingOverview();
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
$Output .= $LayoutObject->Notify(
|
|
Info => Translatable('Project added!'),
|
|
);
|
|
$Output .= $LayoutObject->Output(
|
|
TemplateFile => 'AgentTimeAccountingSetting',
|
|
Data => {%GetParam},
|
|
);
|
|
$Output .= $LayoutObject->Footer();
|
|
|
|
return $Output;
|
|
}
|
|
else {
|
|
$Note = $LogObject->GetLogEntry(
|
|
Type => 'Error',
|
|
What => 'Message',
|
|
);
|
|
}
|
|
}
|
|
|
|
# something went wrong
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
$Output .= $Note
|
|
? $LayoutObject->Notify(
|
|
Priority => 'Error',
|
|
Info => $Note,
|
|
)
|
|
: '';
|
|
$Self->_ProjectSettingsEdit(
|
|
Action => 'AddProject',
|
|
%GetParam,
|
|
%Errors,
|
|
);
|
|
$Output .= $LayoutObject->Output(
|
|
TemplateFile => 'AgentTimeAccountingSetting',
|
|
Data => \%Param,
|
|
);
|
|
$Output .= $LayoutObject->Footer();
|
|
|
|
return $Output;
|
|
}
|
|
|
|
# ---------------------------------------------------------- #
|
|
# edit project
|
|
# ---------------------------------------------------------- #
|
|
elsif ( $Self->{Subaction} eq 'EditProject' ) {
|
|
my $ID = $ParamObject->GetParam( Param => 'ID' );
|
|
|
|
# get project data
|
|
my %Project = $TimeAccountingObject->ProjectGet(
|
|
ID => $ID,
|
|
);
|
|
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
$Self->_ProjectSettingsEdit(
|
|
Action => 'EditProject',
|
|
%Project,
|
|
);
|
|
$Output .= $LayoutObject->Output(
|
|
TemplateFile => 'AgentTimeAccountingSetting',
|
|
Data => \%Param,
|
|
);
|
|
$Output .= $LayoutObject->Footer();
|
|
|
|
return $Output;
|
|
}
|
|
|
|
# ---------------------------------------------------------- #
|
|
# edit project action
|
|
# ---------------------------------------------------------- #
|
|
elsif ( $Self->{Subaction} eq 'EditProjectAction' ) {
|
|
|
|
# challenge token check for write action
|
|
$LayoutObject->ChallengeTokenCheck();
|
|
|
|
my $Note = '';
|
|
my ( %GetParam, %Errors );
|
|
|
|
# get parameters
|
|
$GetParam{ID} = $ParamObject->GetParam( Param => 'ID' ) || '';
|
|
$GetParam{ProjectStatus} = $ParamObject->GetParam( Param => 'ProjectStatus' )
|
|
|| '0';
|
|
for my $Parameter (qw(Project ProjectDescription)) {
|
|
$GetParam{$Parameter} = $ParamObject->GetParam( Param => $Parameter ) || '';
|
|
}
|
|
|
|
# check for needed data
|
|
if ( !$GetParam{Project} ) {
|
|
$Errors{ProjectInvalid} = 'ServerError';
|
|
}
|
|
else {
|
|
|
|
# check that the name is unique
|
|
my %ExistingProject = $TimeAccountingObject->ProjectGet(
|
|
Project => $GetParam{Project},
|
|
);
|
|
|
|
# if the project name is found, check that the ID is different
|
|
if ( %ExistingProject && $ExistingProject{ID} ne $GetParam{ID} ) {
|
|
$Errors{ProjectInvalid} = 'ServerError';
|
|
$Errors{ProjectErrorType} = 'ProjectDuplicateName';
|
|
}
|
|
}
|
|
|
|
# if no errors occurred
|
|
if ( !%Errors ) {
|
|
|
|
# edit project
|
|
if ( $TimeAccountingObject->ProjectSettingsUpdate(%GetParam) ) {
|
|
|
|
$Self->_SettingOverview();
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
$Output .= $LayoutObject->Notify(
|
|
Info => Translatable('Project updated!'),
|
|
);
|
|
$Output .= $LayoutObject->Output(
|
|
TemplateFile => 'AgentTimeAccountingSetting',
|
|
Data => \%Param,
|
|
);
|
|
$Output .= $LayoutObject->Footer();
|
|
|
|
return $Output;
|
|
}
|
|
else {
|
|
$Note = $LogObject->GetLogEntry(
|
|
Type => 'Error',
|
|
What => 'Message',
|
|
);
|
|
}
|
|
}
|
|
|
|
# something went wrong
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
$Output .= $Note
|
|
? $LayoutObject->Notify(
|
|
Priority => 'Error',
|
|
Info => $Note,
|
|
)
|
|
: '';
|
|
$Self->_ProjectSettingsEdit(
|
|
Action => 'EditProject',
|
|
%GetParam,
|
|
%Param,
|
|
%Errors,
|
|
);
|
|
$Output .= $LayoutObject->Output(
|
|
TemplateFile => 'AgentTimeAccountingSetting',
|
|
Data => \%Param,
|
|
);
|
|
$Output .= $LayoutObject->Footer();
|
|
|
|
return $Output;
|
|
}
|
|
|
|
# ---------------------------------------------------------- #
|
|
# add task
|
|
# ---------------------------------------------------------- #
|
|
elsif ( $Self->{Subaction} eq 'AddTask' ) {
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
$Self->_TaskSettingsEdit( Action => 'AddTask' );
|
|
$Output .= $LayoutObject->Output(
|
|
TemplateFile => 'AgentTimeAccountingSetting',
|
|
Data => \%Param,
|
|
);
|
|
$Output .= $LayoutObject->Footer();
|
|
|
|
return $Output;
|
|
}
|
|
|
|
# ---------------------------------------------------------- #
|
|
# add task action
|
|
# ---------------------------------------------------------- #
|
|
elsif ( $Self->{Subaction} eq 'AddTaskAction' ) {
|
|
|
|
# challenge token check for write action
|
|
$LayoutObject->ChallengeTokenCheck();
|
|
|
|
my $Note = '';
|
|
my $TaskID;
|
|
my ( %GetParam, %Errors );
|
|
|
|
# get parameters
|
|
$GetParam{Task} = $ParamObject->GetParam( Param => 'Task' ) || '';
|
|
$GetParam{TaskStatus} = $ParamObject->GetParam( Param => 'TaskStatus' )
|
|
|| '0';
|
|
|
|
# check for needed data
|
|
if ( !$GetParam{Task} ) {
|
|
$Errors{TaskInvalid} = 'ServerError';
|
|
$Errors{TaskErrorType} = 'TaskMissingValue';
|
|
}
|
|
else {
|
|
|
|
# check that the name is unique
|
|
my %ExistingTask = $TimeAccountingObject->ActionGet(
|
|
Action => $GetParam{Task},
|
|
);
|
|
if (%ExistingTask) {
|
|
$Errors{TaskInvalid} = 'ServerError';
|
|
$Errors{TaskErrorType} = 'TaskDuplicateName';
|
|
}
|
|
}
|
|
|
|
# if no errors occurred
|
|
if ( !%Errors ) {
|
|
|
|
# add task
|
|
$TaskID = $TimeAccountingObject->ActionSettingsInsert(
|
|
Action => $GetParam{Task},
|
|
ActionStatus => $GetParam{TaskStatus},
|
|
);
|
|
|
|
if ($TaskID) {
|
|
|
|
# build the output
|
|
$Self->_SettingOverview();
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
$Output .= $LayoutObject->Notify(
|
|
Info => Translatable('Task added!'),
|
|
);
|
|
$Output .= $LayoutObject->Output(
|
|
TemplateFile => 'AgentTimeAccountingSetting',
|
|
Data => {},
|
|
);
|
|
$Output .= $LayoutObject->Footer();
|
|
|
|
return $Output;
|
|
}
|
|
else {
|
|
$Note = $LogObject->GetLogEntry(
|
|
Type => 'Error',
|
|
What => 'Message',
|
|
);
|
|
}
|
|
}
|
|
|
|
# something went wrong
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
$Output .= $Note
|
|
? $LayoutObject->Notify(
|
|
Priority => 'Error',
|
|
Info => $Note,
|
|
)
|
|
: '';
|
|
$Self->_TaskSettingsEdit(
|
|
Action => 'AddTask',
|
|
%GetParam,
|
|
%Errors,
|
|
);
|
|
$Output .= $LayoutObject->Output(
|
|
TemplateFile => 'AgentTimeAccountingSetting',
|
|
Data => \%Param,
|
|
);
|
|
$Output .= $LayoutObject->Footer();
|
|
|
|
return $Output;
|
|
}
|
|
|
|
# ---------------------------------------------------------- #
|
|
# edit task
|
|
# ---------------------------------------------------------- #
|
|
elsif ( $Self->{Subaction} eq 'EditTask' ) {
|
|
my $ID = $ParamObject->GetParam( Param => 'ActionID' ) || '';
|
|
|
|
# get project data
|
|
my %Task = $TimeAccountingObject->ActionGet(
|
|
ID => $ID,
|
|
);
|
|
|
|
my %TaskData = (
|
|
Task => $Task{Action},
|
|
TaskStatus => $Task{ActionStatus},
|
|
);
|
|
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
$Self->_TaskSettingsEdit(
|
|
Action => 'EditTask',
|
|
ActionID => $ID,
|
|
%TaskData,
|
|
);
|
|
$Output .= $LayoutObject->Output(
|
|
TemplateFile => 'AgentTimeAccountingSetting',
|
|
Data => \%Param,
|
|
);
|
|
$Output .= $LayoutObject->Footer();
|
|
|
|
return $Output;
|
|
}
|
|
|
|
# ---------------------------------------------------------- #
|
|
# edit project action
|
|
# ---------------------------------------------------------- #
|
|
elsif ( $Self->{Subaction} eq 'EditTaskAction' ) {
|
|
|
|
# challenge token check for write action
|
|
$LayoutObject->ChallengeTokenCheck();
|
|
|
|
my $Note = '';
|
|
my ( %GetParam, %Errors );
|
|
|
|
# get parameters
|
|
$GetParam{ActionID} = $ParamObject->GetParam( Param => 'ActionID' ) || '';
|
|
$GetParam{TaskStatus} = $ParamObject->GetParam( Param => 'TaskStatus' ) || '0';
|
|
$GetParam{Task} = $ParamObject->GetParam( Param => 'Task' ) || '';
|
|
|
|
# check for needed data
|
|
if ( !$GetParam{Task} ) {
|
|
$Errors{TaskInvalid} = 'ServerError';
|
|
}
|
|
else {
|
|
|
|
# check that the name is unique
|
|
my %ExistingTask = $TimeAccountingObject->ActionGet(
|
|
Action => $GetParam{Task},
|
|
);
|
|
|
|
# if the task name is found, check that the ID is different
|
|
if ( %ExistingTask && $ExistingTask{ID} ne $GetParam{ActionID} ) {
|
|
$Errors{TaskInvalid} = 'ServerError';
|
|
$Errors{TaskErrorType} = 'TaskDuplicateName';
|
|
}
|
|
}
|
|
|
|
# if no errors occurred
|
|
if ( !%Errors ) {
|
|
|
|
# edit action (task)
|
|
my $ActionUpdate = $TimeAccountingObject->ActionSettingsUpdate(
|
|
ActionID => $GetParam{ActionID},
|
|
Action => $GetParam{Task},
|
|
ActionStatus => $GetParam{TaskStatus},
|
|
);
|
|
|
|
if ($ActionUpdate) {
|
|
$Self->_SettingOverview();
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
$Output .= $LayoutObject->Notify(
|
|
Info => Translatable('Task updated!'),
|
|
);
|
|
$Output .= $LayoutObject->Output(
|
|
TemplateFile => 'AgentTimeAccountingSetting',
|
|
Data => \%Param,
|
|
);
|
|
$Output .= $LayoutObject->Footer();
|
|
|
|
return $Output;
|
|
}
|
|
else {
|
|
$Note = $LogObject->GetLogEntry(
|
|
Type => 'Error',
|
|
What => 'Message',
|
|
);
|
|
}
|
|
}
|
|
|
|
# something went wrong
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
$Output .= $Note
|
|
? $LayoutObject->Notify(
|
|
Priority => 'Error',
|
|
Info => $Note,
|
|
)
|
|
: '';
|
|
$Self->_TaskSettingsEdit(
|
|
Action => 'EditTask',
|
|
%GetParam,
|
|
%Param,
|
|
%Errors,
|
|
);
|
|
$Output .= $LayoutObject->Output(
|
|
TemplateFile => 'AgentTimeAccountingSetting',
|
|
Data => \%Param,
|
|
);
|
|
$Output .= $LayoutObject->Footer();
|
|
|
|
return $Output;
|
|
}
|
|
|
|
# ---------------------------------------------------------- #
|
|
# add user
|
|
# ---------------------------------------------------------- #
|
|
elsif ( $Self->{Subaction} eq 'AddUser' ) {
|
|
|
|
# get parameters
|
|
my $NewUserID = $ParamObject->GetParam( Param => 'NewUserID' )
|
|
|| $ParamObject->GetParam( Param => 'UserID' )
|
|
|| '';
|
|
if ( !$NewUserID ) {
|
|
|
|
return $LayoutObject->ErrorScreen(
|
|
Message => Translatable('The UserID is not valid!'),
|
|
);
|
|
}
|
|
|
|
my $NewTimePeriod = $ParamObject->GetParam( Param => 'NewTimePeriod' );
|
|
|
|
my $LastPeriodNumber = $TimeAccountingObject->UserLastPeriodNumberGet(
|
|
UserID => $NewUserID,
|
|
);
|
|
|
|
my $Success = $TimeAccountingObject->UserSettingsInsert(
|
|
UserID => $NewUserID,
|
|
Period => $LastPeriodNumber + 1,
|
|
);
|
|
|
|
# if it is not an action about adding a new time period
|
|
if ( !$NewTimePeriod && !$Success ) {
|
|
return $LayoutObject->ErrorScreen(
|
|
Message => Translatable('Can\'t insert user data!'),
|
|
);
|
|
}
|
|
|
|
my %User = $UserObject->GetUserData(
|
|
UserID => $NewUserID,
|
|
);
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
$Self->_UserSettingsEdit(
|
|
Action => 'AddUser',
|
|
Subaction => 'AddUser',
|
|
%User,
|
|
);
|
|
$Output .= $LayoutObject->Output(
|
|
TemplateFile => 'AgentTimeAccountingSetting',
|
|
Data => \%Param,
|
|
);
|
|
$Output .= $LayoutObject->Footer();
|
|
|
|
return $Output;
|
|
}
|
|
|
|
# ---------------------------------------------------------- #
|
|
# edit user settings
|
|
# ---------------------------------------------------------- #
|
|
elsif ( $Self->{Subaction} eq 'EditUser' ) {
|
|
my $ID = $ParamObject->GetParam( Param => 'UserID' ) || '';
|
|
if ( !$ID ) {
|
|
|
|
return $LayoutObject->ErrorScreen(
|
|
Message => Translatable('The UserID is not valid!'),
|
|
);
|
|
}
|
|
|
|
my $NewTimePeriod = $ParamObject->GetParam( Param => 'NewTimePeriod' );
|
|
my $LastPeriodNumber = $TimeAccountingObject->UserLastPeriodNumberGet(
|
|
UserID => $ID,
|
|
);
|
|
|
|
# if it is an action about adding a new time period, insert it
|
|
if ($NewTimePeriod) {
|
|
my $Success = $TimeAccountingObject->UserSettingsInsert(
|
|
UserID => $ID,
|
|
Period => $LastPeriodNumber + 1,
|
|
);
|
|
if ( !$Success ) {
|
|
|
|
return $LayoutObject->ErrorScreen(
|
|
Message => Translatable('Unable to add time period!'),
|
|
Comment => Translatable('Please contact the administrator.'),
|
|
);
|
|
}
|
|
}
|
|
|
|
my %Errors = ();
|
|
|
|
if (
|
|
$ParamObject->GetParam( Param => 'AddPeriod' )
|
|
|| $ParamObject->GetParam( Param => 'SubmitUserData' )
|
|
)
|
|
{
|
|
|
|
# check validity of periods
|
|
%Errors = $Self->_CheckValidityUserPeriods(
|
|
Period => $LastPeriodNumber,
|
|
);
|
|
}
|
|
|
|
# get user data
|
|
my %User = $UserObject->GetUserData(
|
|
UserID => $ID,
|
|
);
|
|
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
$Self->_UserSettingsEdit(
|
|
Action => 'EditUser',
|
|
Subaction => 'EditUser',
|
|
UserID => $ID,
|
|
Errors => \%Errors,
|
|
Periods => $LastPeriodNumber,
|
|
%User,
|
|
);
|
|
$Output .= $LayoutObject->Output(
|
|
TemplateFile => 'AgentTimeAccountingSetting',
|
|
Data => \%Param,
|
|
);
|
|
$Output .= $LayoutObject->Footer();
|
|
|
|
return $Output;
|
|
}
|
|
|
|
# ---------------------------------------------------------- #
|
|
# settings for handling time accounting
|
|
# ---------------------------------------------------------- #
|
|
|
|
# get user data
|
|
my %UserData = $TimeAccountingObject->UserGet(
|
|
UserID => $Self->{UserID},
|
|
);
|
|
|
|
# permission check
|
|
if ( !$UserData{CreateProject} && !$Self->{AccessRw} ) {
|
|
|
|
# return no permission screen
|
|
return $LayoutObject->NoPermission(
|
|
WithHeader => 'yes',
|
|
);
|
|
}
|
|
|
|
# get the user action to show a message if an user was updated or added
|
|
my $Note = $ParamObject->GetParam( Param => 'User' );
|
|
|
|
# build output
|
|
$Self->_SettingOverview();
|
|
my $Output = $LayoutObject->Header(
|
|
Title => Translatable('Setting'),
|
|
);
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
|
|
# show a notification message if proper
|
|
if ($Note) {
|
|
$Output .= $Note eq 'EditUser'
|
|
? $LayoutObject->Notify(
|
|
Info => Translatable('User updated!'),
|
|
)
|
|
: $LayoutObject->Notify(
|
|
Info => Translatable('User added!'),
|
|
);
|
|
}
|
|
|
|
$Output .= $LayoutObject->Output(
|
|
Data => \%Param,
|
|
TemplateFile => 'AgentTimeAccountingSetting'
|
|
);
|
|
$Output .= $LayoutObject->Footer();
|
|
|
|
return $Output;
|
|
|
|
}
|
|
|
|
sub _CheckValidityUserPeriods {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
my %Errors = ();
|
|
my %GetParam;
|
|
|
|
my $TimeAccountingObject = $Kernel::OM->Get('Kernel::System::TimeAccounting');
|
|
|
|
for ( my $Period = 1; $Period <= $Param{Period}; $Period++ ) {
|
|
|
|
# check for needed data
|
|
for my $Parameter (qw(DateStart DateEnd LeaveDays)) {
|
|
$GetParam{$Parameter}
|
|
= $Kernel::OM->Get('Kernel::System::Web::Request')->GetParam( Param => $Parameter . "[$Period]" );
|
|
if ( !$GetParam{$Parameter} ) {
|
|
$Errors{ $Parameter . '-' . $Period . 'Invalid' } = 'ServerError';
|
|
$Errors{ $Parameter . '-' . $Period . 'ErrorType' } = 'MissingValue';
|
|
}
|
|
}
|
|
my ( $Year, $Month, $Day ) = split( '-', $GetParam{DateStart} );
|
|
my $StartDate = $TimeAccountingObject->Date2SystemTime(
|
|
Year => $Year,
|
|
Month => $Month,
|
|
Day => $Day,
|
|
Hour => 0,
|
|
Minute => 0,
|
|
Second => 0,
|
|
);
|
|
( $Year, $Month, $Day ) = split( '-', $GetParam{DateEnd} );
|
|
my $EndDate = $TimeAccountingObject->Date2SystemTime(
|
|
Year => $Year,
|
|
Month => $Month,
|
|
Day => $Day,
|
|
Hour => 0,
|
|
Minute => 0,
|
|
Second => 0,
|
|
);
|
|
if ( !$StartDate ) {
|
|
$Errors{ 'DateStart-' . $Period . 'Invalid' } = 'ServerError';
|
|
$Errors{ 'DateStart-' . $Period . 'ErrorType' } = 'Invalid';
|
|
}
|
|
if ( !$EndDate ) {
|
|
$Errors{ 'DateEnd-' . $Period . 'Invalid' } = 'ServerError';
|
|
$Errors{ 'DateEnd-' . $Period . 'ErrorType' } = 'Invalid';
|
|
}
|
|
if ( $StartDate && $EndDate && $StartDate >= $EndDate ) {
|
|
$Errors{ 'DateEnd-' . $Period . 'Invalid' } = 'ServerError';
|
|
$Errors{ 'DateEnd-' . $Period . 'ErrorType' } = 'BeforeDateStart';
|
|
}
|
|
}
|
|
|
|
return %Errors;
|
|
}
|
|
|
|
sub _ProjectSettingsEdit {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
# get layout object
|
|
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'OverviewProject',
|
|
Data => \%Param,
|
|
);
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'ActionListProject',
|
|
Data => {},
|
|
);
|
|
$LayoutObject->Block(
|
|
Name => 'ActionSettingOverview',
|
|
Data => {},
|
|
);
|
|
|
|
# define status list
|
|
my %StatusList = (
|
|
1 => Translatable('valid'),
|
|
0 => Translatable('invalid'),
|
|
);
|
|
|
|
my $ProjectStatus = 1;
|
|
if ( defined $Param{ProjectStatus} ) {
|
|
$ProjectStatus = $Param{ProjectStatus};
|
|
}
|
|
|
|
$Param{StatusOption} = $LayoutObject->BuildSelection(
|
|
Data => \%StatusList,
|
|
SelectedID => $ProjectStatus,
|
|
Name => 'ProjectStatus',
|
|
Class => 'Modernize',
|
|
);
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'OverviewUpdateProject',
|
|
Data => \%Param,
|
|
);
|
|
|
|
# shows header
|
|
if ( $Param{Action} eq 'EditProject' ) {
|
|
$LayoutObject->Block(
|
|
Name => 'HeaderEditProject',
|
|
Data => {},
|
|
);
|
|
}
|
|
else {
|
|
$LayoutObject->Block(
|
|
Name => 'HeaderAddProject',
|
|
Data => {},
|
|
);
|
|
}
|
|
|
|
# show server error message (if any) for the project name
|
|
if ( $Param{ProjectErrorType} ) {
|
|
$LayoutObject->Block(
|
|
Name => $Param{ProjectErrorType},
|
|
Data => {},
|
|
);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
sub _SettingOverview {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
my %Project = ();
|
|
my %Data = ();
|
|
|
|
# get layout object
|
|
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
|
|
|
|
# build output
|
|
$LayoutObject->Block(
|
|
Name => 'Setting',
|
|
Data => {},
|
|
);
|
|
$LayoutObject->Block(
|
|
Name => 'ActionListSetting',
|
|
Data => {},
|
|
);
|
|
$LayoutObject->Block(
|
|
Name => 'ActionAddProject',
|
|
Data => {},
|
|
);
|
|
|
|
# hash to save registered users
|
|
my %User;
|
|
|
|
# get needed objects
|
|
my $TimeAccountingObject = $Kernel::OM->Get('Kernel::System::TimeAccounting');
|
|
my $UserObject = $Kernel::OM->Get('Kernel::System::User');
|
|
|
|
if ( $Self->{AccessRw} ) {
|
|
$LayoutObject->Block(
|
|
Name => 'ActionAddTask',
|
|
Data => {},
|
|
);
|
|
|
|
# get user data
|
|
my %ShownUsers = $UserObject->UserList(
|
|
Type => 'Long',
|
|
Valid => 1,
|
|
);
|
|
|
|
# get list of registered users (if any)
|
|
%User = $TimeAccountingObject->UserList();
|
|
|
|
USERINFO:
|
|
for my $UserInfo ( sort { $ShownUsers{$a} cmp $ShownUsers{$b} } keys %ShownUsers ) {
|
|
next USERINFO if !$User{$UserInfo};
|
|
|
|
# delete already registered user from the 'new' list
|
|
delete $ShownUsers{$UserInfo};
|
|
}
|
|
|
|
$ShownUsers{'-'} = $LayoutObject->{LanguageObject}->Translate("Add a user to time accounting...");
|
|
|
|
if ( scalar keys %ShownUsers > 1 ) {
|
|
my $NewUserOption = $LayoutObject->BuildSelection(
|
|
Data => \%ShownUsers,
|
|
SelectedID => '',
|
|
Name => 'NewUserID',
|
|
Translation => 0,
|
|
PossibleNone => 0,
|
|
Title => $LayoutObject->{LanguageObject}->Translate("New User"),
|
|
Class => 'Modernize',
|
|
);
|
|
$LayoutObject->Block(
|
|
Name => 'ActionAddUser',
|
|
Data => {
|
|
NewUserOption => $NewUserOption,
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|
|
# Show project data
|
|
%Project = $TimeAccountingObject->ProjectSettingsGet();
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'OverviewResultProject',
|
|
Data => \%Param,
|
|
);
|
|
|
|
# define status list
|
|
my %StatusList = (
|
|
1 => Translatable('valid'),
|
|
0 => Translatable('invalid'),
|
|
);
|
|
|
|
# show list of available projects (if any)
|
|
if ( $Project{Project} ) {
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'OverviewResultProjectTable',
|
|
Data => {%Param},
|
|
);
|
|
|
|
for my $ProjectID (
|
|
sort { $Project{Project}{$a} cmp $Project{Project}{$b} }
|
|
keys %{ $Project{Project} }
|
|
)
|
|
{
|
|
$Param{Project} = $Project{Project}{$ProjectID};
|
|
$Param{ProjectDescription} = $Project{ProjectDescription}{$ProjectID};
|
|
$Param{ProjectID} = $ProjectID;
|
|
$Param{Status} = $StatusList{ $Project{ProjectStatus}{$ProjectID} };
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'OverviewResultProjectRow',
|
|
Data => {%Param},
|
|
);
|
|
}
|
|
}
|
|
|
|
# otherwise, show a no data found message
|
|
else {
|
|
$LayoutObject->Block(
|
|
Name => 'NoProjectDataFoundMsg',
|
|
);
|
|
}
|
|
|
|
if ( $Self->{AccessRw} ) {
|
|
|
|
# Show action data
|
|
my %Action = $TimeAccountingObject->ActionSettingsGet();
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'OverviewResultSetting',
|
|
Data => \%Param,
|
|
);
|
|
|
|
# show list of available tasks/actions (if any)
|
|
if (%Action) {
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'OverviewResultSettingTable',
|
|
Data => {%Param},
|
|
);
|
|
|
|
for my $ActionID ( sort { $Action{$a}{Action} cmp $Action{$b}{Action} } keys %Action ) {
|
|
$Param{Action} = $Action{$ActionID}{Action};
|
|
$Param{ActionID} = $ActionID;
|
|
$Param{Status} = $StatusList{ $Action{$ActionID}{ActionStatus} };
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'OverviewResultSettingRow',
|
|
Data => {%Param},
|
|
);
|
|
}
|
|
}
|
|
|
|
# otherwise, show a no data found message
|
|
else {
|
|
$LayoutObject->Block(
|
|
Name => 'NoSettingDataFoundMsg',
|
|
Data => {},
|
|
);
|
|
}
|
|
|
|
# show user data
|
|
$LayoutObject->Block(
|
|
Name => 'OverviewResultUser',
|
|
Data => \%Param,
|
|
);
|
|
|
|
# show list of registered users (if any)
|
|
if (%User) {
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'OverviewResultUserTable',
|
|
Data => {%Param},
|
|
);
|
|
|
|
for my $UserID ( sort { $User{$a} cmp $User{$b} } keys %User ) {
|
|
|
|
# get missing user data
|
|
my %UserData = $TimeAccountingObject->UserGet(
|
|
UserID => $UserID,
|
|
);
|
|
my %UserGeneralData = $UserObject->GetUserData(
|
|
UserID => $UserID,
|
|
);
|
|
|
|
$Param{User} = "$UserGeneralData{UserFullname} ($UserGeneralData{UserLogin})";
|
|
$Param{UserID} = $UserID;
|
|
$Param{Comment} = $UserData{Description};
|
|
$Param{CalendarNo} = $UserData{Calendar};
|
|
$Param{Calendar} = $Kernel::OM->Get('Kernel::Config')->Get(
|
|
"TimeZone::Calendar"
|
|
. ( $Param{CalendarNo} || '' ) . "Name"
|
|
) || 'Default';
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'OverviewResultUserRow',
|
|
Data => {%Param},
|
|
);
|
|
}
|
|
}
|
|
|
|
# otherwise, show a no data found message
|
|
else {
|
|
$LayoutObject->Block(
|
|
Name => 'NoUserDataFoundMsg',
|
|
Data => {},
|
|
);
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
sub _TaskSettingsEdit {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
# get layout object
|
|
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'Setting',
|
|
Data => \%Param,
|
|
);
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'ActionListSetting',
|
|
Data => {},
|
|
);
|
|
$LayoutObject->Block(
|
|
Name => 'ActionOverviewSetting',
|
|
Data => {},
|
|
);
|
|
|
|
# define status list
|
|
my %StatusList = (
|
|
1 => Translatable('valid'),
|
|
0 => Translatable('invalid'),
|
|
);
|
|
|
|
my $TaskStatus = 1;
|
|
if ( defined $Param{TaskStatus} ) {
|
|
$TaskStatus = $Param{TaskStatus};
|
|
}
|
|
|
|
$Param{StatusOption} = $LayoutObject->BuildSelection(
|
|
Data => \%StatusList,
|
|
SelectedID => $TaskStatus,
|
|
Name => 'TaskStatus',
|
|
Class => 'Modernize',
|
|
);
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'OverviewUpdateTask',
|
|
Data => \%Param,
|
|
);
|
|
|
|
# shows header
|
|
if ( $Param{Action} eq 'EditTask' ) {
|
|
$LayoutObject->Block(
|
|
Name => 'HeaderEditTask',
|
|
Data => {},
|
|
);
|
|
}
|
|
else {
|
|
$LayoutObject->Block(
|
|
Name => 'HeaderAddTask',
|
|
Data => {},
|
|
);
|
|
}
|
|
|
|
# show server error message (if any) for the task name
|
|
if ( $Param{TaskErrorType} ) {
|
|
$LayoutObject->Block(
|
|
Name => $Param{TaskErrorType},
|
|
Data => {},
|
|
);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
sub _UserSettingsEdit {
|
|
my ( $Self, %Param ) = @_;
|
|
my %GetParam = ();
|
|
|
|
# get param object
|
|
my $ParamObject = $Kernel::OM->Get('Kernel::System::Web::Request');
|
|
|
|
# get parameters
|
|
for my $Parameter (qw(Description ShowOvertime CreateProject AllowSkip Calendar)) {
|
|
$GetParam{$Parameter} = $ParamObject->GetParam( Param => $Parameter );
|
|
}
|
|
|
|
# get layout object
|
|
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'Setting',
|
|
Data => \%Param,
|
|
);
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'ActionListSetting',
|
|
Data => {},
|
|
);
|
|
$LayoutObject->Block(
|
|
Name => 'ActionOverviewSetting',
|
|
Data => {},
|
|
);
|
|
$LayoutObject->Block(
|
|
Name => 'Reference',
|
|
Data => {},
|
|
);
|
|
|
|
# define status list
|
|
my %StatusList = (
|
|
1 => Translatable('valid'),
|
|
0 => Translatable('invalid'),
|
|
);
|
|
|
|
# get config object
|
|
my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
|
|
|
|
# fill up the calendar list
|
|
my $CalendarListRef = { 0 => 'Default' };
|
|
my $CalendarIndex = 1;
|
|
while ( $ConfigObject->Get( "TimeZone::Calendar" . $CalendarIndex . "Name" ) ) {
|
|
$CalendarListRef->{$CalendarIndex} = $ConfigObject->Get( "TimeZone::Calendar" . $CalendarIndex . "Name" );
|
|
$CalendarIndex++;
|
|
}
|
|
|
|
# get time accounting object
|
|
my $TimeAccountingObject = $Kernel::OM->Get('Kernel::System::TimeAccounting');
|
|
|
|
# get user data
|
|
my %UserData = $TimeAccountingObject->UserGet(
|
|
UserID => $Param{UserID},
|
|
);
|
|
|
|
$Param{CalendarOption} = $LayoutObject->BuildSelection(
|
|
Data => $CalendarListRef,
|
|
Name => 'Calendar',
|
|
Translation => 1,
|
|
SelectedID => $GetParam{Calendar} || $UserData{Calendar} || 0,
|
|
Class => 'Modernize',
|
|
);
|
|
|
|
$Param{Description} = $GetParam{Description} || $UserData{Description} || '';
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'OverviewUpdateUser',
|
|
Data => {
|
|
%Param,
|
|
ShowOvertime => ( $GetParam{ShowOvertime} || $UserData{ShowOvertime} )
|
|
? 'checked="checked"'
|
|
: '',
|
|
CreateProject => ( $GetParam{CreateProject} || $UserData{CreateProject} )
|
|
? 'checked="checked"'
|
|
: '',
|
|
AllowSkip => ( $GetParam{AllowSkip} || $UserData{AllowSkip} )
|
|
? 'checked="checked"'
|
|
: '',
|
|
}
|
|
);
|
|
|
|
# if there are errors to show
|
|
if ( $Param{Errors} && %{ $Param{Errors} } ) {
|
|
|
|
# show all existing periods
|
|
for ( my $Period = 1; $Period <= $Param{Periods}; $Period++ ) {
|
|
|
|
for my $Parameter (qw(DateStart DateEnd LeaveDays WeeklyHours Overtime PeriodStatus )) {
|
|
$GetParam{$Parameter} = $ParamObject->GetParam( Param => "$Parameter\[$Period\]" );
|
|
}
|
|
|
|
$Param{$Period}{PeriodStatusOption} = $LayoutObject->BuildSelection(
|
|
Data => \%StatusList,
|
|
SelectedID => $GetParam{PeriodStatus} || $Param{$Period}{PeriodStatus},
|
|
Name => "PeriodStatus[$Period]",
|
|
ID => "PeriodStatus-$Period",
|
|
Title => $LayoutObject->{LanguageObject}->Translate("Period Status"),
|
|
Class => 'Modernize',
|
|
);
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'PeriodOverviewRow',
|
|
Data => {
|
|
Period => $Period,
|
|
DateStartInvalid => $Param{Errors}->{ 'DateStart-' . $Period . 'Invalid' }
|
|
|| '',
|
|
DateEndInvalid => $Param{Errors}->{ 'DateEnd-' . $Period . 'Invalid' } || '',
|
|
LeaveDaysInvalid => $Param{Errors}->{ 'LeaveDays-' . $Period . 'Invalid' }
|
|
|| '',
|
|
DateStart => $GetParam{DateStart},
|
|
DateEnd => $GetParam{DateEnd},
|
|
LeaveDays => $GetParam{LeaveDays},
|
|
WeeklyHours => $GetParam{WeeklyHours},
|
|
Overtime => $GetParam{Overtime},
|
|
PeriodStatusOption => $Param{$Period}{PeriodStatusOption},
|
|
},
|
|
);
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'DateStart'
|
|
. (
|
|
$Param{Errors}->{ 'DateStart-' . $Period . 'ErrorType' }
|
|
|| 'MissingValue'
|
|
),
|
|
Data => { Period => $Period },
|
|
);
|
|
$LayoutObject->Block(
|
|
Name => 'DateEnd'
|
|
. ( $Param{Errors}->{ 'DateEnd-' . $Period . 'ErrorType' } || 'MissingValue' ),
|
|
Data => { Period => $Period },
|
|
);
|
|
}
|
|
}
|
|
else {
|
|
my %User = $TimeAccountingObject->SingleUserSettingsGet(
|
|
UserID => $Param{UserID},
|
|
);
|
|
|
|
# show user data
|
|
if (%User) {
|
|
my $LastPeriodNumber = $TimeAccountingObject->UserLastPeriodNumberGet(
|
|
UserID => $Param{UserID}
|
|
);
|
|
|
|
for ( my $Period = 1; $Period <= $LastPeriodNumber; $Period++ ) {
|
|
my %PeriodParam = ();
|
|
|
|
# get all needed data to display
|
|
for my $Parameter (qw(DateStart DateEnd LeaveDays WeeklyHours Overtime)) {
|
|
$PeriodParam{$Parameter} = $User{$Period}{$Parameter};
|
|
}
|
|
$PeriodParam{Period} = $Period;
|
|
|
|
$PeriodParam{PeriodStatusOption} = $LayoutObject->BuildSelection(
|
|
Data => \%StatusList,
|
|
SelectedID => $User{$Period}{UserStatus},
|
|
Name => "PeriodStatus[$Period]",
|
|
ID => "PeriodStatus-$Period",
|
|
Title => $LayoutObject->{LanguageObject}->Translate("Period Status"),
|
|
Class => 'Modernize',
|
|
);
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'PeriodOverviewRow',
|
|
Data => \%PeriodParam,
|
|
);
|
|
}
|
|
}
|
|
|
|
# show a no data found message
|
|
else {
|
|
$LayoutObject->Block(
|
|
Name => 'PeriodOverviewRowNoData',
|
|
Data => {},
|
|
);
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
1;
|