#!/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~ $button $db{event_quotes}{$event_id}{ref} $date_updated $db{users}{$audit_data{user}{$event_id}{$date_updated}}{name} $blanks_excluded ~ ; &xlsxcreator_write_xlsx($ws,$xlsxrow,0,$event_id,$formatting) ; &xlsxcreator_write_xlsx($ws,$xlsxrow,1,$db{event_quotes}{$event_id}{ref},$formatting) ; &xlsxcreator_write_xlsx($ws,$xlsxrow,2,$date_updated,$formatting) ; &xlsxcreator_write_xlsx($ws,$xlsxrow,3,$db{users}{$audit_data{user}{$event_id}{$date_updated}}{name},$formatting) ; foreach (split("
",$blanks_excluded)) { &xlsxcreator_write_xlsx($ws,$xlsxrow,4,$_,$formatting) ; $xlsxrow++ ; } # $xlsxrow++ ; } # } &report_xlsx_export_footer('E',15,$xlsxdir) ; } #------------------------------------------------------------------------------------------ sub load_vars { &db_min_ro('event_quotes_categories','*','','','') if $event_quotes_categories ; &db_min_ro('countries','id,name','','','') if $countries ; &db_min_ro('users','id,name','','','') if $users ; &db_min_ro('sport_types','id,name','','','') if $sport_types ; &db_min_ro('customers','id,name','','','') if $customers ; &db_min_ro('organisations','id,name','','','') if $organisations ; &db_min_ro('cities','id,city','','','') if $cities ; &db_min_ro('event_types','id,name','','','') if $event_types ; &db_min_ro('event_type_details','id,name','','','') if $event_type_details ; &db_min_ro('event_cost_items','id,name','','','') if $event_cost_items ; &db_min_ro('clubs','id,name','','','') if $clubs ; &db_min_ro('event_systems','id,name,description','','','') if $event_systems ; &db_min_ro('event_quotes_poc','*','','','') if $poc_exists ; &db_min_ro('event_quotes_recipient','*','','','') if $recipient_exists ; &db_min_ro('regions','id,name','','','') if $region_id_exists ; &db_min_ro('event_quotes','id,ref,quote_completed,quote_accepted,quote_rejected,quote_cancelled,quote_created,quote_pending,event_system_id_multiple,fixed_system_overall_status',"",'','') ; # &db_min_ro('event_quotes','id',"ref LIKE '% test %' OR ref LIKE 'test %' OR ref LIKE '% test' OR ref LIKE '%testing%'",'','') ; } #------------------------------------------------------------------------------------------ sub sort_fields { &users_sort_fields ; } #------------------------------------------------------------------------------- sub add_db_fields { # &users_add_db_fields ; } #------------------------------------------------------------------------------------------ sub edit_db_fields { # &users_edit_db_fields ; } #------------------------------------------------------------------------------------------ sub add_screen { # called from common_add_screen # &users_add_screen ; } #------------------------------------------------------------------------------------------ sub edit_screen { # &users_edit_screen ; } #------------------------------------------------------------------------------------------ sub thead { $print_thead = qq~NrEventDate ChangedChanged ByChanged From~; } #------------------------------------------------------------------------------- sub page_opts { our $glyphicon = 'list' ; our $lcpage = 'audit-trail' ; $ucpage = uc $lcpage ; $ucfirstpage = ucfirst $lcpage ; # our $table = 'users' ; # our $user_type = 'casual' ; $page_title = "Audit Trail" ; # &common_min_add_extras ; } #------------------------------------------------------------------------------- sub screen2 { &thead; if ($isaved) { $alert = &common_min_alert('success',"$ucpage $isaved!",'ok') ; } else { &common_min_alert_type ; } my $page = "event-quotes" ; if ($s{no}) { $page = $lcpage ; } &common_min_table('id',$page,'list','',1) ; # &common_min_alert_type ; # &common_min_footer('id','') ; &common_min_dialog ; print < $print_top
$events_content

$boxtitle Changes

$print_box_content_rows
$dialog{'common'}{'js'} $print_footer_jscript $print_footer_forms ENDOFTEXT # exit ; } #------------------------------------------------------------------------------------------ sub screen3 { &thead; if ($isaved) { $alert = &common_min_alert('success',"$ucpage $isaved!",'ok') ; } else { &common_min_alert_type ; } my $page = "event-quotes" ; if ($s{no}) { $page = $lcpage ; } &common_min_table('id',$page,'list') ; # &common_min_extra_crumb("manage-$lcpage\s","Manage $ucfirstpage\s") ; require _blank ; exit ; } #------------------------------------------------------------------------------------------ use common ; use today ; use report ; use xlsxcreator ; # use users ; 1;