Files
scripts/Perl OTRS/Kernel/Modules/AgentTimeAccountingSetting.pm
2024-10-14 00:08:40 +02:00

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;