#!/usr/bin/perl BEGIN { use lib '/usr/home/cfg' ; require push_inc ; } require cfg ; print "Content-type: text/html\n\n"; # unless ($useropts{it}{$username}) { print "<<<<<<<<<<<< MAINTENANCE IN PROGRESS >>>>>>>>>" ; exit ; } #--------------------------------------------------------------------------------------------------------------------------------------------------------------------- use CGI::Carp qw(fatalsToBrowser); use CGI; use Mail::Sendmail; use Fcntl qw(:flock); use File::Copy; use File::Basename; use Date::Calc qw(:all); use Excel::Writer::XLSX; use Time::Piece; use Time::Seconds; # my $start_time_str = "09:30:00" ; # my $end_time_str = "17:45:00" ; # Create Time::Piece objects for start and end times # my $start_time = Time::Piece->strptime($start_time_str, "%H:%M:%S"); # my $end_time = Time::Piece->strptime($end_time_str, "%H:%M:%S"); # Calculate the difference in seconds and convert to hours # my $time_diff_in_hours = (Time::Piece->strptime($end_time_str,"%H:%M:%S") - Time::Piece->strptime($start_time_str,"%H:%M:%S")) / ONE_HOUR; &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 $open_new_tab = qq~target="_blank"~ ; # our $debug = 1 ; our $testing = 1 ; #-------- page opts -------------------------------------------------------------------------------------------------------------------------------------------------- &page_opts ; #--------------------------------------------------------------------------------------------------------------------------------------------------------------------- our $srchscr = 1 ; &db_open_ro ; our $db_ignore_open_close = 1 ; # do one open and one close instead of repeating it &report_screen if $iaction eq '' ; $db_ignore_open_close = 0 ; # do one open and one close instead of repeating it &db_close_conn ; if ($iaction eq 'report') { &common_min_load_params ; &db_open_ro ; our $db_ignore_open_close = 1 ; # do one open and one close instead of repeating it &report_ifields ; &list_screen ; $db_ignore_open_close = 0 ; # do one open and one close instead of repeating it &db_close_conn ; &screen3 ; } if ($iaction eq 'save') { &common_min_load_params ; &db_open_upd ; our $db_ignore_open_close = 1 ; # do one open and one close instead of repeating it &update ; $db_ignore_open_close = 0 ; # do one open and one close instead of repeating it &db_close_conn ; exit if $username eq 'rory' && $testing ; &screen4 ; } # &common_min_action; exit; #------------------------------------------------------------------------------------------ sub update { &db_min_ro('logistics_costs','event_nr,file_name_ids,cost_type',"",'','') ; my %ii = %i ; my %cost_types = () ; foreach (keys %ii) { if ($_ =~ /costtype_/) { my ($NA,$event_id,$file_id,$amnt_cnt) = split(/\_/,$_) ; $cost_types{$event_id}{$file_id}{$amnt_cnt} = 1 ; next if $event_and_file_has_diff_cost_types{$event_id}{$file_id} ; if ($prev_cost_type{$event_id}{$file_id} && $prev_cost_type{$event_id}{$file_id} ne $ii{$_}) { $event_and_file_has_diff_cost_types{$event_id}{$file_id} = 1 ; } $prev_cost_type{$event_id}{$file_id} = $ii{$_} ; } } my %seen_event = () ; foreach (keys %ii) { if ($_ =~ /costtype_/) { my ($NA,$event_id,$file_id1,$amnt_cnt1) = split(/\_/,$_) ; next if $seen_event{$event_id} ; $seen_event{$event_id} = 1 ; %i = () ; my $saved_event_id = ($event_id =~ /\d+/) ? $event_id : -1 ; my @saved_files = split(/\:/,$db{logistics_costs}{$saved_event_id}{file_name_ids}) ; my $used_file = 0 ; foreach my $file_id (@saved_files) { my $used_amnt = 0 ; $used_file = 1 ; if ($event_and_file_has_diff_cost_types{$event_id}{$file_id}) { foreach my $amnt_cnt (sort {$a <=> $b} %{$cost_types{$event_id}{$file_id}}) { my $field_name = "costtype_$event_id\_$file_id\_$amnt_cnt" ; $i{cost_type} .= qq~$ii{$field_name};;~ ; $used_amnt = 1 ; } $i{cost_type} = substr($i{cost_type},0,-2) if $used_amnt ; $i{cost_type} .= qq~::~ ; } else { $i{cost_type} .= qq~$ii{$_}::~ ; } } $i{cost_type} = substr($i{cost_type},0,-2) if $used_file ; $ignore{cost_type} = 1 if $i{cost_type} eq $db{logistics_costs}{$event_id}{cost_type} ; &db_min_upd("logistics_costs","event_nr='$event_id'") ; } } %i = %ii ; # exit ; } #------------------------------------------------------------------------------------------ sub report_ifields { if ($i{event_id} && $i{event_id} ne 'all' && $i{event_id} ne 'na_event' && $i{event_id} ne 'N/A') { push @report_sql_2, "(id = '$i{event_id}')" ; &db_min_ro('event_quotes','1,ref',"`id`='$i{event_id}'",'','') ; } if ($db{event_quotes}{1}{ref}) { push @report_results, "(EVENT QUOTE = '$db{event_quotes}{1}{ref}')" ; push @report_sql, "(event_nr = '$i{event_id}')" ; } elsif ($i{event_id} eq 'N/A') { push @report_results, "EVENT NAME UNKNOWN" ; push @report_sql, "(event_nr = '-1')" ; push @report_sql_2, "(id = '-1')" ; } elsif ($i{event_id} && $i{event_id} eq 'all') { push @report_results, "ALL EVENTS" ; } else { push @report_sql, "(event_nr = '$i{event_id}')" ; push @report_results, "(EVENT NR = '$i{event_id}')" ; } if ($i{cost_type}) { push @report_results, "(COST TYPE LIKE '$i{cost_type}')" ; push @report_sql, "(cost_type LIKE '%$i{cost_type}%')" ; } $report_results_msg = uc join(', ',@report_results) ; if (not $report_results_msg) { # $error = qq(ENTER AT LEAST ONE SEARCH PARAMETER); # &report_screen ; } else { $isaved = qq(SELECT WHERE $report_results_msg) ; } } #------------------------------------------------------------------------------------------ sub list_screen { $print_box_content_rows .= &common_min_forms_start('logistics-costs') ; my $srch_where_sql = join(' AND ', @report_sql) ; my $srch_where_sql_2 = join(' AND ', @report_sql_2) ; &load_list_vars("$srch_where_sql","$srch_where_sql_2") ; our @sql_col_display = ("event_nr","cost_type","amounts","uploaded_from") ; foreach my $event_id (sort {$a <=> $b} keys %{$db{$table}}) { # my $event_id = $db{$table}{$id}{event_nr} ; # $db{$table}{na}{file_name_ids} = $db{$table}{$event_id}{file_name_ids} if $event_id < 0 ; next if $event_id eq 'breakdown' ; if ($db{$table}{$event_id}{file_name_ids}) { my @all_amounts_per_file_uploaded = split(/\:/,$db{$table}{$event_id}{amounts}) ; my @files_uploaded = split(/\:/,$db{$table}{$event_id}{file_name_ids}) ; my @all_cost_type = split(/\::/,$db{$table}{$event_id}{cost_type}) ; my $file_cnt = 0 ; $event_id = "na" if $event_id < 0 ; foreach my $file_id (@files_uploaded) { my @amounts_per_file_uploaded = split(/\;/,$all_amounts_per_file_uploaded[$file_cnt]) ; if ($all_amounts_per_file_uploaded[$file_cnt] =~ /;/ && $all_cost_type[$file_cnt] && $all_cost_type[$file_cnt] !~ /;/) { my $abc = $all_cost_type[$file_cnt] ; foreach (@amounts_per_file_uploaded) { $all_cost_type[$file_cnt] .= qq~;;$abc~ ; } } my @files_cost_type = split(/\;;/,$all_cost_type[$file_cnt]) ; my $amnt_cnt = 0 ; foreach my $sep_amnt (@amounts_per_file_uploaded) { $amnt_cnt++ ; $print_tbody .= qq~~ ; foreach my $col (@sql_col_display) { my $val = '' ; my $class = qq~class="dt-center"~ ; if ($col eq 'event_nr') { $val = ($event_id eq 'na') ? qq~NA~ . &common_min_get_event_quote_button("N/A") : qq~$event_id~ . &common_min_get_event_quote_button($event_id) ; } elsif ($col eq 'cost_type') { $val = $files_cost_type[$amnt_cnt-1] ; $val = ($val) ? &common_min_table_input("costtype_$event_id\_$file_id\_$amnt_cnt",$val) : "Logistics Costs" ; } elsif ($col eq 'amounts') { $val = &common_commify(sprintf("%.02f",$sep_amnt)) ; } elsif ($col eq 'uploaded_from') { $val = $db{logistics_costs_tables}{$file_id}{file_name} ; } $print_tbody .= qq~$val~ ; } $print_tbody .= qq~~ ; } $file_cnt++ ; } } if ($db{event_quotes_min}{$event_id}{cost_types}) { my $cost_cnt = 0 ; my @amounts_per_cost = split(/\;/,$db{event_quotes_min}{$event_id}{amounts}) ; my @qtys_per_cost = split(/\;/,$db{event_quotes_min}{$event_id}{qtys}) ; my @cost_type_ids = split(/\;/,$db{event_quotes_min}{$event_id}{cost_types}) ; foreach my $cost_type_id (@cost_type_ids) { $cost_cnt++ ; next if !$cost_type_id || !$db{event_cost_items}{$cost_type_id}{name} ; $print_tbody .= qq~~ ; foreach my $col (@sql_col_display) { my $val = '' ; my $class = qq~class="dt-center"~ ; if ($col eq 'event_nr') { $val = qq~$event_id~ . &common_min_get_event_quote_button($event_id) ; } elsif ($col eq 'cost_type') { $val = $db{event_cost_items}{$cost_type_id}{name} ; } elsif ($col eq 'amounts') { $amounts_per_cost[$cost_cnt-1] = 0 if $amounts_per_cost[$cost_cnt-1] !~ /\d+/ ; $val = &common_commify(sprintf("%.02f",$qtys_per_cost[$cost_cnt-1]*$amounts_per_cost[$cost_cnt-1])) ; } elsif ($col eq 'uploaded_from') { $val = "" ; } $print_tbody .= qq~$val~ ; } $print_tbody .= qq~~ ; } } } } #------------------------------------------------------------------------------------------ sub load_list_vars { my ($where,$where_2) = @_ ; &db_min_ro($table,"event_nr,file_name_ids,cost_type,amounts","$where",'','') ; our %totals = () ; foreach my $event_id (keys %{$db{$table}}) { # my $event_id = $db{$table}{$id}{event_nr} ; my @files_uploaded = split(/\;/,$db{$table}{$id}{file_name_ids}) ; my $files_cnt = 0 ; foreach my $part1 (split(/\:/,$db{$table}{$id}{amounts})) { foreach my $part2 (split(/\;/,$part1)) { $totals{$event_id}{$files_uploaded[$files_cnt]} += $part2 ; $totals{breakdown}{$event_id}{$files_uploaded[$files_cnt]} .= qq~$part2;~ ; } $files_cnt++ ; } } &db_min_ro('logistics_costs_tables',"id,file_name",'','','') ; &db_min_ro('event_quotes','id,quote_completed,quote_accepted,fixed_system_overall_status,event_system_id_multiple,quote_rejected,quote_cancelled,quote_created,quote_pending,sss_quote_nr',"",'','') ; &db_min_ro('event_systems',"*",'','','') ; &get_events_with_other_costs($where_2) ; } #------------------------------------------------------------------------------------------ sub get_events_with_other_costs { my ($where) = @_ ; &db_min_ro('event_quotes_min',"id,item_costing_event AS 'cost_types',qty_costing_event AS 'qtys',usd_amnt_costing_event AS 'amounts'","$where",'','') ; &db_min_ro('event_cost_items','id,name',"id != '14' AND name NOT LIKE '%Mobile%%System%' AND name NOT LIKE '%Fixed%%System%' AND name NOT LIKE '%Mobile%%Operation%' AND name NOT LIKE '%Fixed%%Operation%' AND name NOT LIKE '%Cricket%%Operation%'",'','') ; foreach my $event_id (keys %{$db{event_quotes_min}}) { foreach (split(/\;/,$db{event_quotes_min}{$event_id}{cost_types})) { next unless $_ ; if ($db{event_cost_items}{$_}{name} && !$db{logistics_costs}{$event_id}{event_nr}) { $db{logistics_costs}{$event_id}{event_nr} = $event_id ; } } } } #------------------------------------------------------------------------------------------ sub set_tick { my ($color,$tooltip) = @_ ; $tick{green} = qq~2~ ; $tick{orange} = qq~1~ ; $tick{red} = qq~0~ ; return ($tick{$color}) ; } #------------------------------------------------------------------------------------------ sub set_cross { my ($color,$tooltip) = @_ ; $tick{green} = qq~2~ ; $tick{orange} = qq~1~ ; $tick{red} = qq~0~ ; return ($tick{$color}) ; } #------------------------------------------------------------------------------------------ sub thead { &common_min_thead ; } #------------------------------------------------------------------------------- sub page_opts { our $glyphicon = 'list' ; our $lcpage = 'logistics-costs-report' ; &common_page_name ; our $table = 'logistics_costs' ; $page_title = 'Logistics Costs' ; $box_icon .= qq~
~ ; $trigger_jquery_raw .= qq~ function importDoc(t,b) { dlgMdl("$useropts{'scripts'}/dialog/import_logistics_costs.pl?"+t+"&"+b,"Import CSV",'','max-dialog') ; } ~; } #------------------------------------------------------------------------------- sub report_screen { our $lcol = 1 ; our $fcol = 3 ; $print_box_content_rows .= &common_min_forms_start('report') ; &db_min_ro("event_quotes","id,ref",'','','') ; &db_min_ro("logistics_costs","DISTINCT event_nr",'','','') ; # $db{logistics_costs}{"N/A"}{event_nr} = "N/A" ; my $event_na_exists = 0 ; my $events_exists = 0 ; my %selected = () ; &get_events_with_other_costs ; if ($i{event_id}) { $selected{$i{event_id}} = "SELECTED" ; } else { $selected{all} = "SELECTED" ; } # foreach (sort {$db{event_quotes}{$a}{ref} cmp $db{event_quotes}{$b}{ref}} keys %{$db{logistics_costs}}) { foreach (sort {$b <=> $a} keys %{$db{logistics_costs}}) { # $_ = "N/A" if $_ < 0 ; $_ = "N/A" if $_ < 0 ; $opts{event_id} .= qq~~ if $_ ; $event_na_exists = 1 unless $_ ; $events_exists++ ; } $opts{event_id} = qq~~ . $opts{event_id} if $events_exists > 1 ; $opts{event_id} = qq~~ . $opts{event_id} if $event_na_exists ; $print_box_content_rows .= &common_min_form_select('event_id','') ; $print_box_content_rows .= &common_min_form_input('cost_type') ; $print_box_content_rows .= &common_min_forms_end('','','report') ; &common_min_search_screen ; } #------------------------------------------------------------------------------- sub screen3 { &thead; if ($isaved) { $alert = &common_min_alert('success',"$ucpage $isaved!",'ok') ; } else { &common_min_alert_type ; } # my $page = "$lcpage\s" ; my $page = "event-quotes" ; if ($s{no}) { $page = $lcpage ; } &common_min_table('id',$page,'list') ; our $savjqy = 1 ; # &common_min_extra_crumb("manage-$lcpage\s","Manage $ucfirstpage\s") ; $extra_form_fields .= qq~ ~ ; $trigger_jquery_raw .= qq~ \$("#savebutt").click( function () { console.log("Hello World") ; \$("#logistics-costs-form").submit() ; }) ; ~ ; $print_box_content_rows .= &common_min_forms_end('','','save') ; require _blank ; exit ; } #------------------------------------------------------------------------------------------ sub screen4 { &common_min_alert_type ; print < $useropts{title}
ENDOFTEXT # exit ; } #------------------------------------------------------------------------------------------ use common ; use report ; use xlsxcreator ; use today ; 1;