aisa/scripts/cron/load_leave_settings.pl
2025-11-26 11:31:54 +02:00

221 lines
8.6 KiB
Perl

#!/usr/bin/perl
BEGIN { use lib '/usr/home/cfg' ; require push_inc ; }
use CGI qw( :standard );
use CGI::Carp qw(fatalsToBrowser);
use Date::Calc qw(:all);
use DBI;
# require cfg ;
print header; # CGI.pm method
# run with https://www.ffwaybill.co.za/cgi-bin/scripts/admin/load_leave_settings.pl
exit;
#---------------------------------------------------------------------------------------------------------------------------------------------------------------------
&today;
#---------------------------------------------------------------------------------------------------------------------------------------------------------------------
# unless ($username eq 'rory') { print ">>>>>> RORY DOING MAINTENANCE <<<<<<"; exit; }
# @ARGV = split(/\\*\&/, $ENV{'QUERY_STRING'});
# our $debug = $ARGV[0] ;
our $debug = 1 ;
our $username = 'rory' ;
my $last_year = $now_year - 1 ;
#---------------------------------------------------------------------------------------------------------------------------------------------------------------------
&common_min_debug(">>> START <<< load_leave_settings.pl");
&read_leave_settings;
&read_leave_calendar;
&process;
&common_min_debug(">>> END <<< load_leave_settings.pl");
exit;
#------------------------------------------------------------------------------------------
sub read_leave_settings {
# &db_min_ro(leave_settings,'*',"`leave_year`='$i{leave_year}' AND `category`='$i{category}' AND `user_id`='$i{user_id}'",'','') ;
&db_min_ro('leave_settings','*',"`leave_year`='$now_year' OR `leave_year`='$last_year'",'','') ;
foreach my $id (keys %{$db{leave_settings}}) {
# if (($db{leave_settings}{$id}{leave_year} eq $i{leave_year}) and ($db{leave_settings}{$id}{category} eq $i{category}) and ($db{leave_settings}{$id}{user_id} eq $i{user_id})) {
$days_entitled{$db{leave_settings}{$id}{category}}{$db{leave_settings}{$id}{leave_year}}{$db{leave_settings}{$id}{user_id}} = $db{leave_settings}{$id}{days_entitled} ;
$days_carried_over{$db{leave_settings}{$id}{category}}{$db{leave_settings}{$id}{leave_year}}{$db{leave_settings}{$id}{user_id}} = $db{leave_settings}{$id}{days_carried_over} ;
}
} #------------------------------------------------------------------------------------------
sub read_leave_calendar {
my $last_year = $now_year - 1 ;
&db_min_ro('events','*',"(((`startdate` LIKE '$now_year%') OR (`enddate` LIKE '$now_year%')) OR ((`startdate` LIKE '$last_year%') OR (`enddate` LIKE '$last_year%'))) AND `category`='leave'",'`id` DESC','') ;
foreach my $id (keys %{$db{events}}) {
# if (($db{leave_settings}{$id}{leave_year} eq $i{leave_year}) and ($db{leave_settings}{$id}{category} eq $i{category}) and ($db{leave_settings}{$id}{user_id} eq $i{user_id})) {
# $days_taken{$db{leave_settings}{$id}{leave_year}}{$db{leave_settings}{$id}{category}} = $db{leave_settings}{$id}{days_entitled} ;
# $days_carried_over{$db{leave_settings}{$id}{leave_year}}{$db{leave_settings}{$id}{category}} = $db{leave_settings}{$id}{days_carried_over} ;
my ($sdate,$stime) = split(/ /,$db{events}{$id}{startdate}) ;
my $s_ccyymmdd = &common_min_convert_sql_date_time($sdate);
my ($edate,$etime) = split(/ /,$db{events}{$id}{enddate}) ;
my $e_ccyymmdd = &common_min_convert_sql_date_time($edate);
&dates_array($s_ccyymmdd,$e_ccyymmdd) ;
my $val = $db{events}{$id}{days} ;
# $days_taken{$db{events}{$id}{type}}+=$val;
# $cats{$db{events}{$id}{type}} = 1 ;
my $scalar = scalar @dates_array ; my $taken_per_day = 1 ;
if ($scalar>0) {
$taken_per_day = $val / $scalar ;
}
else
{
# $taken_per_day = $days_taken{$db{events}{$id}{type}} ;
$taken_per_day = $db{events}{$id}{days} ;
my $sccyymmdd = &common_min_convert_sql_date_time($db{events}{$id}{startdate});
push @dates_array, $sccyymmdd ; # create array when start and end date same
}
foreach my $date (@dates_array) {
my $ccyy = substr($date,0,4) ;
my $mm = substr($date,4,2) ; $mm = sprintf("%0.0f",$mm) ;
my $dd = substr($date,6,2) ; $dd = sprintf("%0.0f",$dd) ;
$days_taken_by_year{$db{events}{$id}{type}}{$ccyy}{$db{events}{$id}{user_id}}+=$taken_per_day;
# if (($day_of_week{$date} > 0) and (($day_of_week{$date} < 6))) { # mon - fri
# $days_txt{$mm}{$db{events}{$id}{type}} .= "$dd/" ;
# }
# &common_min_debug(">>> $db{events}{$id}{type} [$mm] [$days_taken_by_month{$mm}{$ccyy}{$db{events}{$id}{type}}] [$taken_per_day]");
}
}
} #------------------------------------------------------------------------------------------
sub process {
&db_min_ro('users','*','','','') ;
foreach my $id (keys %{$db{users}}) { $user{$id} = $db{users}{$id}{name} ; }
foreach my $year (keys %{$days_entitled{annual}}) {
foreach my $user_id (keys %{$days_entitled{annual}{$year}}) {
if ($done{$user_id}{$year}) { next ; }
# &common_min_debug(">>> 1. $year [$user{$user_id}] [days_entitled=$days_entitled{annual}{$year}{$user_id}] [days_carried_over=$days_carried_over{annual}{$year}{$user_id}] [days_taken in $year = $days_taken_by_year{annual}{$year}{$user_id}]");
$done{$user_id}{$year} = 1 ;
$leave_settings_for_current_year{$user_id}{$year} = 1 ;
&insert_leave_settings($user_id,$year) ;
}
}
foreach my $year (keys %{$days_taken_by_year{annual}}) {
foreach my $user_id (keys %{$days_taken_by_year{annual}{$year}}) {
if ($done{$user_id}{$year}) { next ; }
# &common_min_debug(">>> 2. $year [$user{$user_id}] [days_entitled=$days_entitled{annual}{$year}{$user_id}] [days_carried_over=$days_carried_over{annual}{$year}{$user_id}] [days_taken in $year = $days_taken_by_year{annual}{$year}{$user_id}]");
$done{$user_id}{$year} = 1 ;
&insert_leave_settings($user_id,$year) ;
}
}
foreach my $id (keys %{$db{users}}) {
unless ($done{$id}{$now_year}) {
&insert_leave_settings($id,$now_year) ;
}
}
} #------------------------------------------------------------------------------------------
sub insert_leave_settings {
my ($user_id,$year) = @_ ;
unless ($year eq $now_year) { return ; } # &common_min_debug("insert_leave_settings ERROR : $year ne $now_year");
if ($leave_settings_for_current_year{$user_id}{$now_year}) { &common_min_debug("insert_leave_settings ERROR : $year settings already EXIST [$user{$user_id}]"); return ; }
if (lc substr($user{$user_id},0,4) eq 'rory') { return ; }
if (lc substr($user{$user_id},0,4) eq 'test') { return ; }
# $i{lastupdate} = "$now_ccyy_mm_dd $now_hour:$now_min:$now_sec" ;
my $balance = $days_entitled{annual}{$last_year}{$user_id} + $days_carried_over{annual}{$last_year}{$user_id} - $days_taken_by_year{annual}{$last_year}{$user_id} ;
$i{user_id} = $user_id ;
$i{days_entitled} = 15 ;
$i{category} = 'annual' ;
$i{leave_year} = $now_year ;
$i{lastupdate} = "$now_ccyy_mm_dd $now_hour:$now_min:$now_sec" ;
$i{days_carried_over} = $balance ;
$i{leave_start_date} = "$year-01-01" ;
# &common_min_debug("insert_leave_settings INSERT >>> [$user{$user_id},$year] days_carried_over=$i{days_carried_over} [$balance = $days_entitled{annual}{$last_year}{$user_id} + $days_carried_over{annual}{$last_year}{$user_id} - $days_taken_by_year{annual}{$last_year}{$user_id}] ;");
&db_min_insert('leave_settings') ;
} #------------------------------------------------------------------------------------------
sub dates_array {
my ($start_date,$end_date) = @_ ;
my $array_date = $start_date ;
@dates_array=() ;
while ($array_date < $end_date) {
push @dates_array, $array_date ;
my $stay_date_dd = substr($array_date,6,2) ;
my $stay_date_mm = substr($array_date,4,2) ;
my $stay_date_ccyy = substr($array_date,0,4) ;
$day_of_week{$array_date} = Day_of_Week($stay_date_ccyy,$stay_date_mm,$stay_date_dd) ; # 1 is Monday
my ($ccyy,$month,$day) = Add_Delta_Days($stay_date_ccyy,$stay_date_mm,$stay_date_dd,1) ;
$month = sprintf("%02s", $month) ;
$day = sprintf("%02s", $day) ;
$array_date = "$ccyy$month$day" ;
}
} #-------------------------------------------------------------------------------
# sub validate {
# &db_min_ro(leave_settings,'*',"`leave_year`='$i{leave_year}' AND `category`='$i{category}' AND `user_id`='$i{user_id}'",'','') ;
# foreach my $id (keys %{$db{leave_settings}}) {
# if (($db{leave_settings}{$id}{leave_year} eq $i{leave_year}) and ($db{leave_settings}{$id}{category} eq $i{category}) and ($db{leave_settings}{$id}{user_id} eq $i{user_id})) {
# $exists = 1 ;
# }
# }
# } #------------------------------------------------------------------------------------------
use db ;
use db_min ;
use common ;
use common_min ;
use today ;
1;