#!/usr/bin/perl
BEGIN { use lib '/usr/home/cfg' ; require push_inc ; }
require cfg ;
# unless ($username eq 'handre') { print "<<<<<<<<<<<< MAINTENANCE IN PROGRESS >>>>>>>>>" ; exit ; }
#---------------------------------------------------------------------------------------------------------------------------------------------------------------------
use CGI::Carp qw(fatalsToBrowser);
use CGI;
use Crypt::PasswdMD5;
use Date::Calc qw(:all);
use Excel::Writer::XLSX ;
&today;
#---------------------------------------------------------------------------------------------------------------------------------------------------------------------
@ARGV = split(/\\*\&/, $ENV{'QUERY_STRING'});
$action = $ARGV[0] ;
our ($q) = CGI -> new() ;
our $iaction = $q -> param('iaction') || $action ;
our $isaved = $q -> param('isaved') || '' ;
# our $debug = 1 ;
our $event_id = 0 ;
our $changed_by = 0 ;
our $open_new_tab = qq~target="_blank"~ ;
if ($action eq 'view') {
$event_id = $ARGV[1] ;
$changed_by = $ARGV[2] ;
}
#-------- page opts --------------------------------------------------------------------------------------------------------------------------------------------------
&page_opts ;
#---------------------------------------------------------------------------------------------------------------------------------------------------------------------
print "Content-type: text/html\n\n";
if ($iaction eq 'view') {
&list_screen;
&screen2 ;
} elsif ($iaction eq 'report') {
&common_min_load_params ;
&report_ifields;
&list_screen;
&screen3 ;
}
&common_min_action;
exit;
#------------------------------------------------------------------------------------------
sub validate {
# &users_validate;
} #------------------------------------------------------------------------------------------
sub insert {
# &users_insert ;
} #------------------------------------------------------------------------------------------
sub update {
# &users_update ;
} #------------------------------------------------------------------------------------------
sub process_multi_select {
# &users_process_multi_select ;
} #------------------------------------------------------------------------------------------
sub report_screen {
# &filter_screen if $ENV{QUERY_STRING} eq 'filter' ;
our $lcol = 2 ;
our $fcol = 5 ;
# my ($set_year,$set_month,$set_day) = Add_Delta_Days($now_year,$now_mm,$now_dd,-42) ; # 6 weeks back
# $set_month = sprintf("%02s", $set_month) ;
# $set_day = sprintf("%02s", $set_day) ;
# my $set_ccyy_dd_mm = $set_year . '-' . $set_month . '-' . $set_day ;
$print_box_content_rows .= &common_min_forms_start('report') ;
$allow_deselect{event} = 1 ;
$allow_deselect{changed_by} = 1 ;
$preferred_title{event_from} = 'Event Date From' ;
$print_box_content_rows .= &common_min_form_datetimepicker('event_from',"$now_year-$now_mm-$now_dd 00:00:00",720) ;
$preferred_title{event_to} = 'Event Date To' ;
$print_box_content_rows .= &common_min_form_datetimepicker('event_to',"$now_year-$now_mm-$now_dd 23:59:59",0) ;
&common_min_select_opts('changed_by','users','name','','','',"`user_type` <> 'casual_a' AND `user_type` <> 'casual_calibrator' AND `user_type` <> 'installation_partner' AND `username` NOT LIKE 'handre%' AND `username` NOT LIKE 'rory%'",'','','','name') ;
&common_min_select_opts('event','event_quotes','ref','','','id',"",'','','','ref') ;
# $preferred_title{region_id} = "Region" ;
# $print_box_content_rows .= &common_min_form_select('system_id','') ;
$print_box_content_rows .= &common_min_form_select('event','') ;
$print_box_content_rows .= &common_min_form_select('changed_by','') ;
$print_box_content_rows .= &common_min_forms_end('','','report') ;
local $all_select_ids_string = join(",",@all_select_ids) ;
$trigger_jquery_raw .= qq~\$("$all_select_ids_string").chosen({ allow_single_deselect:true });~ ;
&common_min_search_screen ;
} #-------------------------------------------------------------------------------
sub report_ifields {
} #-------------------------------------------------------------------------------
sub list_screen {
# my $file_path = "$cgipath/data/logs/events/changes.dat" ;
# open(my $fh, '<', $file_path) or die "Could not open file '$file_path' $!";
my $prev_line = qq~~ ; my $line_cnt = 0 ; my %audit_data = () ; my %leng = () ;
my $event_from_val = $i{event_from} ;
my $event_to_val = $i{event_to} ;
$event_from_val =~ s/[:\- ]//g;
$event_to_val =~ s/[:\- ]//g;
&db_min_ro('event_quotes_changes','id,changes','','','') ;
foreach my $id (sort {$b <=> $a} keys %{$db{event_quotes_changes}}) {
my $line = $db{event_quotes_changes}{$id}{changes} ;
# while (my $line = <$fh>) {
$event_quotes_categories = 1 if $line =~ /category_id_1=/ || $line =~ /category_id_2=/ ;
$countries = 1 if $line =~ /country_id=/ ;
$users = 1 if $line =~ /operator_ids=/ ;
$sport_types = 1 if $line =~ /sport_type_ids=/ ;
$customers = 1 if $line =~ /quote_to=/ ;
$organisations = 1 if $line =~ /organisation_ids=/ ;
$cities = 1 if $line =~ /city_id=/ ;
$event_types = 1 if $line =~ /type=/ ;
$event_type_details = 1 if $line =~ /type_details_id=/ ;
$event_cost_items = 1 if $line =~ /description_workings_event=/ || $line =~ /description_costing_event=/ || $line =~ /item_costing_event=/ ;
$clubs = 1 if $line =~ /club_ids=/ ;
$event_systems = 1 if $line =~ /event_system_id_multiple=/ ;
$poc_exists = 1 if $line =~ /poc_id=/ && $line !~ /poc_id='0'/ && $line !~ /poc_id=''/ ;
$recipient_exists = 1 if $line =~ /recipient_id=/ && $line !~ /recipient_id='0'/ && $line !~ /recipient_id=''/ ;
$region_id_exists = 1 if $line =~ /region_id=/ && $line !~ /region_id='0'/ && $line !~ /region_id=''/ ;
my @line_split = split(/\|/,$line) ;
$line_split[0] = substr($line_split[0],4) ;
# print "\n $line_split[3]" ;
next if $i{event_from} && $event_from_val > $line_split[0] ;
next if $i{event_to} && $event_to_val < $line_split[0] ;
next if $line_split[2] =~ /camera_system_id/ ;
my @user_s = split(/\=/,$line_split[3]) ;
my @event_id_s = split(/\=/,$line_split[2]) ;
my $user_changed = $user_s[1] ;
$user_changed =~ s/\'//g ;
my $event_id = $event_id_s[1] ;
$event_id =~ s/\'//g ;
next if $i{event} && $i{event} ne $event_id ;
next if $i{changed_by} && $i{changed_by} ne $user_changed ;
my $nr_of_splits = scalar @line_split ;
my $line_of_changes = qq~~ ;
if ($nr_of_splits == 6) {
$line_of_changes = $line_split[-1] ;
} elsif ($line_split[4] =~/changed_from/ || $line_split[4] =~ /action='Edit'/ || $line_split[4] =~ /action='Add'/) {
for (5 .. $nr_of_splits-1) {
$line_of_changes .= qq~$line_split[$_]|~ ;
}
chop $line_of_changes if $line_of_changes ;
} else {
for (4 .. $nr_of_splits-1) {
$line_of_changes .= qq~$line_split[$_]|~ ;
}
chop $line_of_changes if $line_of_changes ;
}
$audit_data{data}{$event_id}{$line_split[1]} = $line_of_changes ;
$audit_data{user}{$event_id}{$line_split[1]} = $user_changed;
if ($line_split[4] eq 'changed_from') {
$audit_data{changed_from}{$event_id}{$line_split[1]} = 1 ;
}
}
&db_open_ro;
$db_ignore_open_close=1;
&load_vars ;
$db_ignore_open_close=0 ;
&db_close_conn ;
close($fh) ;
foreach my $event_id (sort {$b <=> $a} keys %{$audit_data{data}}) {
# next if $db{event_quotes}{$event_id}{id} ;
foreach my $date_updated (sort {$b cmp $a} keys %{$audit_data{data}{$event_id}}) {
foreach my $changed_field (split(/,/,$audit_data{data}{$event_id}{$date_updated})) {
chomp $changed_field ;
my @field_split = split(/\=/,$changed_field) ;
# next if ((!$prev_field_val{$field_split[0]} || $prev_field_val{$field_split[0]} eq "''" || $prev_field_val{$field_split[0]} eq "'0'") && ($field_split[1] eq "''" || $field_split[1] eq "'0'")) || $field_split[0] eq 'last_update' || $field_split[0] eq 'id' || $field_split[0] eq 'quote_nr' ;
next if $field_split[1] eq "''" || ($field_split[1] eq "'0'" && $field_split[0] ne 'custom_set') || $field_split[0] eq 'last_update' || $field_split[0] eq 'id' || $field_split[0] eq 'quote_nr' ; # $field_split[0] eq 'sub_total' || $field_split[0] eq 'grand_total' || $field_split[0] eq 'vat_total' || $field_split[0] eq 'total_amount_workings_event' || $field_split[0] eq 'total_grand_amount_workings_event' || $field_split[0] eq 'total_vat_amount_workings_event' || $field_split[0] eq 'total_grand_amount_workings_event' ;
if ($changed_field =~ /=/ && ($seen_data_field{$event_id}{$field_split[0]} || $audit_data{changed_from}{$event_id}{$date_updated})) {
$field_split[1] =~ s/\'//g ;
# print "\n 1 field_split : $field_split[0] = $field_split[1]" if $field_split[0] eq 'ref' ;
if ($field_split[0] eq 'custom_set') {
$field_split[1] = ($field_split[1] eq "1") ? "Yes" : "No" ;
} elsif ($field_split[0] eq 'club_ids') {
$field_split[1] = join ";", map { "$db{clubs}{$_}{name}" } split ";" , $field_split[1] ;
} elsif ($field_split[0] eq 'event_system_id_multiple') {
$field_split[1] = join ";", map { "$db{event_systems}{$_}{name} [$db{event_systems}{$_}{description}]" } split ";" , $field_split[1] ;
$field_split[0] = 'event_systems'
} elsif ($field_split[0] eq 'operator_ids') {
while ($field_split[1] =~ /(\d+)/g) {
my $op_id = $1;
$field_split[1] =~ s/\d+/$db{users}{$op_id}{name}/g ;
last ;
}
} elsif ($field_split[0] eq 'sport_type_ids') {
while ($field_split[1] =~ /(\d+)/g) {
my $op_id = $1;
$field_split[1] =~ s/\d+/$db{sport_types}{$op_id}{name}/g ;
last ;
}
} elsif ($field_split[0] eq 'city_id') {
while ($field_split[1] =~ /(\d+)/g) {
my $op_id = $1;
$field_split[1] =~ s/\d+/$db{cities}{$op_id}{city}/g ;
last ;
}
} elsif ($field_split[0] eq 'organisation_ids') {
while ($field_split[1] =~ /(\d+)/g) {
my $op_id = $1;
$field_split[1] =~ s/\d+/$db{organisations}{$op_id}{name}/g ;
last ;
}
} elsif ($field_split[0] eq 'type_details_id') {
while ($field_split[1] =~ /(\d+)/g) {
my $op_id = $1;
$field_split[1] =~ s/\d+/$db{event_type_details}{$op_id}{name}/g ;
last ;
}
} elsif ($field_split[0] eq 'description_workings_event' || $field_split[0] eq 'description_costing_event') {
$field_split[1] = join ";", map { "$db{event_cost_items}{$_}{name}" } split ";" , $field_split[1] ;
} elsif ($field_split[0] eq 'daily_operator_ids') {
my $new_string = qq~~ ; my $system_cnt = 0 ;
foreach my $system_ops (split("|",$field_split[1])) {
$system_cnt++ ;
next if $system_ops !~ /(\d+)/g ;
my $sys_string = qq~~ ; my $day_cnt = 0 ;
$new_string .= qq~System $system_cnt : [~ ;
foreach my $system_op_id (split(";",$system_ops)) {
$day_cnt++ ;
$sys_string .= qq~Day $day_cnt : $db{users}{$system_op_id}{name};~ if $system_op_id ; ;
}
chop $sys_string if $sys_string;
$sys_string .= qq~];~ ;
}
chop $sys_string if $sys_string ;
$field_split[1] = qq~$sys_string~ ;
} elsif ($field_split[0] eq 'qty') {
$field_split[0] = "Actual Days" ;
} elsif ($field_split[0] eq 'type') {
$field_split[1] = $db{event_types}{$field_split[1]}{name} ;
} elsif ($field_split[0] eq 'operator_workings_event') {
$field_split[1] = join ";", map { "$db{users}{$_}{name}" } split ";" , $field_split[1] ;
} elsif ($field_split[0] eq 'days_active') {
my $days_active_str = qq~~ ; my $day_cnt = 0 ;
foreach my $days_active (split(";",$field_split[1])) {
$day_cnt++ ;
$days_active_str .= qq~Day $day_cnt;~ if $days_active ;
}
chop $days_active_str if $days_active_str ;
$field_split[1] = $days_active_str ;
} elsif ($field_split[0] eq 'event_length') {
$full_half_day{1} = "Full Day" ;
$full_half_day{2} = "Half Day" ;
my $day_cnt = 1 ;
$field_split[1] = join ";", map { "$full_half_day{$_}" } split ";" , $field_split[1] ;
} elsif ($field_split[0] eq 'quote_to') {
$field_split[1] = $db{customers}{$field_split[1]}{name} ;
} elsif ($field_split[0] eq 'country_id') {
$field_split[1] = $db{countries}{$field_split[1]}{name} ;
} elsif ($field_split[0] eq 'quote_completed' || $field_split[0] eq 'quote_accepted' || $field_split[0] eq 'quote_pending' || $field_split[0] eq 'quote_cancelled' || $field_split[0] eq 'quote_rejected') {
$field_split[1] =~ s/1/Yes/g ;
} elsif ($field_split[0] eq 'vat_workings_event' || $field_split[0] eq 'excl_workings_event' || $field_split[0] eq 'vat_costing_event' || $field_split[0] eq 'excl_costing_event') {
$field_split[1] =~ s/1/Yes/g ;
$field_split[1] =~ s/0/No/g ;
} elsif ($field_split[0] eq 'category_id_1' || $field_split[0] eq 'category_id_2') {
$field_split[1] = $db{event_quotes_categories}{$field_split[1]}{category} ;
} elsif ($field_split[0] eq 'ref') {
$field_split[0] = "Event Name" ;
} elsif ($field_split[0] eq 'poc_id') {
$field_split[1] = "$db{event_quotes_poc}{$field_split[1]}{name} [$db{event_quotes_poc}{$field_split[1]}{contact_nr}]" ;
} elsif ($field_split[0] eq 'recipient_id') {
$field_split[1] = "$db{event_quotes_recipient}{$field_split[1]}{name} [$db{event_quotes_recipient}{$field_split[1]}{contact_nr}]";
} elsif ($field_split[0] eq 'region_id') {
$field_split[1] = $db{regions}{$field_split[1]}{name};
} elsif ($field_split[0] eq 'item_costing_event') {
$field_split[1] = join ";", map { "$db{event_cost_items}{$_}{name}" } split ";" , $field_split[1] ;
} else {
next if $field_split[1] !~ /\b\d+\b/ ;
}
# '502;713;620;621;614;612
$field_split[0] =~ s/amount_usd_workings_event/Amount Expenses Tab/g ;
$field_split[0] =~ s/amount_workings_event/Tot Amount Expenses Tab/g ;
# $field_split[0] =~ s/_costing_event/Costings Tab/g ;
$field_split[0] =~ s/_workings_event/_expenses_tab/g ;
$field_split[0] =~ s/_id//g ;
$field_split[0] = join ' ', map { ucfirst $_ } split /_/ , $field_split[0] ;
$audit_data{refined_data}{$event_id}{$date_updated} .= qq~'
$field_split[0]='$field_split[1]~ ;
} elsif ((!$field_split[1] && $changed_field !~ /=/) && $seen_data_field{$event_id}{$prev_field}) {
$field_split[0] =~ s/\'//g ;
if ($prev_field eq 'Operators') {
$audit_data{refined_data}{$event_id}{$date_updated} .= qq~;$db{users}{$field_split[0]}{name}~ ;
} elsif ($prev_field eq 'Sport Types') {
$audit_data{refined_data}{$event_id}{$date_updated} .= qq~;$db{sport_types}{$field_split[0]}{name}~ ;
} elsif ($prev_field eq 'City') {
$audit_data{refined_data}{$event_id}{$date_updated} .= qq~;$db{cities}{$field_split[0]}{city}~ ;
} elsif ($prev_field eq 'Organisations') {
$audit_data{refined_data}{$event_id}{$date_updated} .= qq~;$db{organisations}{$field_split[0]}{name}~ ;
} elsif ($prev_field eq 'Type Details') {
$audit_data{refined_data}{$event_id}{$date_updated} .= qq~;$db{event_type_details}{$field_split[0]}{name}~ ;
} else {
$audit_data{refined_data}{$event_id}{$date_updated} .= qq~,$field_split[0]~ ;
}
}
$seen_data_field{$event_id}{$field_split[0]} = 1 if $changed_field =~ /=/ ;
$prev_field = $field_split[0] if $changed_field =~ /=/ ;
$prev_field_val{$field_split[0]} = $field_split[1] if $changed_field =~ /=/ ;
}
}
}
our $xlsx_title_heading = "Audit Trail Report" ;
our $xlsxdir = "audit_trail" ;
our $xlsxreportname = "Audit_Trail_Report" ;
our @sql_col_display = ("nr","event","date_changed","changed_by","changed_from") ;
&report_xlsx_export_header("$xlsxreportname",$xlsxdir,'',$xlsx_title_heading) ;
$xlsxrow-- ;
my $formatting = $format84 ;
foreach my $event_id (sort {$b <=> $a} keys %{$audit_data{refined_data}}) {
my $button = &common_min_get_event_quote_button($event_id) ;
foreach my $date_updated (sort {$b cmp $a} keys %{$audit_data{refined_data}{$event_id}}) {
# chop $audit_data{refined_data}{$event_id}{$date_updated} if $audit_data{refined_data}{$event_id}{$date_updated} ;
$audit_data{refined_data}{$event_id}{$date_updated} = substr($audit_data{refined_data}{$event_id}{$date_updated},5) . "'" ;
next unless $audit_data{refined_data}{$event_id}{$date_updated} ;
my $blanks_excluded = qq~~ ;
foreach (split("
",$audit_data{refined_data}{$event_id}{$date_updated})) {
my @split = split("=",$_) ;
$blanks_excluded .= qq~$_
~ if $split[1] =~ /\b\d+\b/ || $split[1] =~ /[a-zA-Z]/ ;
}
$blanks_excluded = substr($blanks_excluded,0,-4) ;
next unless $blanks_excluded ;
$print_tbody .= qq~