#!/usr/bin/perl BEGIN { use lib '/usr/home/cfg' ; require push_inc ; } use CGI qw( :standard ); use CGI::Carp qw(fatalsToBrowser); require cfg ; print header; # CGI.pm method # unless ($username eq 'handre'or $username eq 'rory') { print "<<<<<<<<<<<< MAINTENANCE IN PROGRESS >>>>>>>>>" ; exit ; } #--------------------------------------------------------------------------------------------------------------------------------------------------------------------- use Fcntl qw(:flock); use File::Copy; use File::Basename; use Date::Calc qw(:all); use Excel::Writer::XLSX; use LWP::Simple qw($ua get); use JSON ; &today; #--------------------------------------------------------------------------------------------------------------------------------------------------------------------- # INSERT INTO demos # (`location_id`,`brief_description`,`id`,`additional_requirements_from_events_dept`,`events_operator_allocated`,`tenant_id`,`pre_demo_testing_requirements`,`demo_type_id`,`events_operator_required`,`calibrator_required`,`additional_requirements_from_support_dept`) VALUES # ("1","test","1009","test","132","1","test","1","1","1","test") ; # INSERT INTO event_quotes # (`days_active`,`date_from`,`ref`,`roe`,`office_notes`,`user_id`,`slip`,`demo_id`,`address`,`event_system_id_multiple`,`organisation_ids`,`total_vat_amount_workings_event`,`total_grand_amount_workings_event`,`times_from`,`quote_to`,`operator_ids`,`total_amount_workings_event`,`country_id`,`email`,`last_update`,`contact_name`,`notes`,`club_ids`,`datetime`,`id`,`currency`,`quote_nr`,`date_to`,`tel`) VALUES ( # "1;;;;;;;;;;;;;;;;;;;","2025-07-12 08:00:00","test","1","test","25","","1009","113 Cinsaut St, Steynsrust, Somerset West","277;278;;;;;;;;;;;;;","532","237.60","1821.60",";;;;;;;;;;;;;;;;;;","1:Rory Mathew:rory@kre8it.co.za:0621336752:113 Cinsaut St, Steynsrust, Somerset West","291;189;","1584.00","242","rory@kre8it.co.za","2025-07-07 09:46:34","Rory Mathew","test","727;727;;;;;;;;;;;;;","2025-07-07 09:46:34","10943","ZAR","1009","2025-07-12 17:00:00","0621336752") ; @ARGV = split(/\\*\&/, $ENV{'QUERY_STRING'}); $action = $ARGV[0] ; our ($q) = CGI -> new() ; our $iaction = $q -> param('iaction') || $action ; our $isaved = $q -> param('isaved') || '' ; # our $testing = 1 ; # our $debug = 1 ; #--------------------------------------------------------------------------------------------------------------------------------------------------------------------- if ($is_operator && $glod_user_level == 2) { $glod_user_level = 3 ; } # upgrade operators level 2&3 to 3&4 our $nr_of_system_names_and_clubs = 15 ; our @all_select_ids = () ; our $minify_jquery = 1 ; &db_open_ro ; $db_ignore_open_close = 1 ; &page_opts ; if ($iaction eq 'filter' || $iaction eq 'search' || $iaction eq 'report') { our $srchscr = 1 ; our $savjqy = 0 ; } #------------------------------------------------------------------------------------------------------------------------------------------------------------------ our $table = 'demos'; if ($iaction eq 'add') { &add_screen ; &common_min_screen1 ; } elsif ($iaction eq 'edit') { &common_min_load_params ; # $i{id} = 1009 ; &edit_screen ; &common_min_screen1 ; } elsif ($iaction eq 'save') { &common_min_load_params ; &insert ; # &log_changes ; &edit_or_list ; } elsif ($iaction eq 'update') { &common_min_load_params ; &update ; # &log_changes ; &edit_or_list ; } elsif ($iaction eq 'copy') { &common_min_load_params ; &duplicate ; &edit_screen ; &common_min_screen1 ; } elsif ($iaction eq 'delete') { &common_min_load_params ; &delete ; &common_min_screen2 ; } &common_min_action ; $db_ignore_open_close = 0 ; &db_close_conn ; exit ; #------------------------------------------------------------------------------------------ sub edit_or_list { exit if $testing && substr($username,0,4) eq 'rory' ; $isaved = $i{id} ; &edit_screen ; &common_min_screen1; } #------------------------------------------------------------------------------------------ sub insert { &build_system_details_table_fields($quote_accepted,$quote_rejected,$quote_cancelled) ; &process_multi_select($quote_accepted,$quote_rejected,$quote_cancelled) ; &add_db_fields ; &default_values ; $i{id} = &db_min_get_max($table,'id') ; our %i2 = () ; &build_demos_min_fields_1 ; &process_daily_details_from_the_events_datails_tab ; &db_min_insert($table) ; our %ii = %i ; %i = () ; $i{id} = &db_min_get_max('event_quotes','id') ; $i{id} = 1000 if $i{id} < 1000 ; $i{quote_nr} = $i{id} ; my $i_demo_id = $i{demo_id} ; my $i_event_id = $i{id} ; $i{datetime} = "$now_ccyy_mm_dd $now_hour:$now_min:$now_sec" ; $i{quote_date} = "$now_ccyy_mm_dd" ; &build_event_quotes_fields ; &build_demos_min_fields_2 ; if ($ii{iattachslip}) { my $attachmentdir = $htmlpath . "/uploads/slips/$i_event_id" ; mkdir $attachmentdir if not -d $attachmentdir ; &common_upload_files("slips/$i_event_id") ; } $i{quote_created} = 1 if $glod_user_level < 3 ; $i{quote_pending} = 1 unless $i{quote_accepted} || $i{quote_cancelled} || $i{quote_completed} || $i{quote_rejected} ; $ignore{quote_created} = '' ; $i{quote_created} = 0 unless $i{quote_created} ; $ignore{country_id} = 1 ; &db_min_insert('event_quotes') ; $ignore{quote_created} = 1 ; my %iii = %i ; %i = () ; $i{id} = $iii{id} ; $i{quote_nr} = $iii{id} ; if ($ii{custom_set}) { &build_demos_min_fields_3 ; } else { foreach (keys %i2) { $i{$_} = $i2{$_} ; } } &db_min_insert('event_quotes_min') ; %i = %ii ; my $to = $email_events{1} ; my $cc = "$email_events{2};$email_events{3};$email_events{6}" ; my $bcc = '' ; if ($useropts{it}{$username}) { $to = $email_it_2 ; $cc = $email_it_1 ; $bcc = '' ; } &common_send_smtp_mail('',$to,$cc,$bcc,"Demo Created","Please note Demo $i_demo_id has been created as Event Quote $i_event_id",'','html','','','','',0,0) if $to || $cc || $bcc ; } #------------------------------------------------------------------------------------------ sub update { unless ($i{id}) { $error = qq(NO ID) ; return ; } &db_min_ro($table,"*","`id`='$i{id}'",'','') ; &db_min_ro('event_quotes','*',"demo_id='$i{id}'","",'') ; our $event_quote_id = 0 ; foreach (keys %{$db{event_quotes}}) { $event_quote_id = $_ ; } my %iiii = %i ; our %i2 = () ; &build_system_details_table_fields($quote_accepted,$quote_rejected,$quote_cancelled) ; &process_multi_select($quote_accepted,$quote_rejected,$quote_cancelled) ; &add_db_fields ; &default_values ; &build_demos_min_fields_1 ; &process_daily_details_from_the_events_datails_tab ; our $line = qq~~ ; $ignore{country_id} = 1 ; &common_shared_log_update_changes("demos","demo_changes","changes_demos") ; our %ii = %i ; %i = () ; $i{id} = $event_quote_id ; &build_event_quotes_fields ; &build_demos_min_fields_2 ; if ($ii{iattachslip}) { my $attachmentdir = $htmlpath . "/uploads/slips/$i{id}" ; mkdir $attachmentdir if not -d $attachmentdir ; &common_upload_files("slips/$i{id}") ; } $line = qq~~ ; &common_shared_log_update_changes("event_quotes") ; %i = () ; if ($iiii{custom_set}) { &build_demos_min_fields_3 ; } else { foreach (keys %i2) { $i{$_} = $i2{$_} ; } } $i{id} = $event_quote_id ; $i{quote_nr} = $event_quote_id ; foreach (keys %i) { $i{$_} =~ s/;+$//; } &common_shared_log_update_changes("event_quotes_min","event_quotes_changes","changes") ; %i = %iiii ; } #------------------------------------------------------------------------------------------ sub build_event_quotes_fields { $i{last_update} = "$now_ccyy_mm_dd $now_hour:$now_min:$now_sec" ; $i{demo_id} = $ii{id} ; $i{user_id} = $userid ; $i{date_from} = $ii{date_from} ; $i{date_to} = $ii{date_to} ; $i{ref} = $ii{name} ; $i{event_system_id_multiple} = $ii{event_system_id_multiple} ; $i{club_ids} = $ii{club_ids} ; $i{operator_ids} = $ii{operator_ids} ; $i{organisation_ids} = $ii{venue_ids} ; $i{qty} = $ii{qty} ; $i{slip} = $ii{slip} ; $i{notes} = $ii{notes} ; $i{office_notes} = $ii{office_notes} ; $i{email} = $ii{email} ; $i{tel} = $ii{tel} ; $i{address} = $ii{address} ; $i{contact_name} = $ii{contact_name} ; $i{currency} = $ii{currency} ; $i{roe} = $ii{roe} ; $i{region_id} = $ii{region_id} ; $i{quote_to} = $ii{quote_to} ; $i{quote_accepted} = $ii{quote_accepted} ; $i{quote_pending} = $ii{quote_pending} ; $i{quote_cancelled} = $ii{quote_cancelled} ; $i{quote_completed} = $ii{quote_completed} ; # $i{quote_created} = $ii{quote_created} ; $i{quote_rejected} = $ii{quote_rejected} ; $i{times_from} = $ii{times_from} ; $i{times_to} = $ii{times_to} ; $i{days_active} = $ii{days_active} ; $i{event_length} = $ii{event_length} ; $i{custom_set} = $ii{custom_set} ; $i{total_amount_workings_event} = $ii{total_amount_workings_event} ; $i{total_vat_amount_workings_event} = $ii{total_vat_amount_workings_event} ; $i{total_grand_amount_workings_event} = $ii{total_grand_amount_workings_event} ; $i{sport_type_ids} = $ii{sport_type_ids} ; $i{slip} = ($ii{iattachslip}) ? "slip-$ii{iattachslip}" : "" ; my @quote_to_splt = split(/\:/,$i{quote_to}) ; $i{quote_to} = $quote_to_splt[0] ; $ignore{date_from} = '' ; $ignore{date_to} = '' ; $ignore{event_system_id_multiple} = '' ; $ignore{club_ids} = '' ; $ignore{operator_ids} = '' ; $ignore{slip} = '' ; $ignore{notes} = '' ; $ignore{office_notes} = '' ; $ignore{email} = '' ; $ignore{tel} = '' ; $ignore{address} = '' ; $ignore{contact_name} = '' ; $ignore{currency} = '' ; $ignore{quote_nr} = '' ; $ignore{roe} = '' ; $ignore{quote_to} = '' ; $ignore{qty} = '' ; $ignore{organisation_ids} = '' ; $ignore{ref} = '' ; $ignore{demo_id} = '' ; $ignore{user_id} = '' ; $ignore{quote_date} = '' ; $ignore{quote_accepted} = '' ; $ignore{quote_pending} = '' ; $ignore{quote_cancelled} = '' ; $ignore{quote_completed} = '' ; # $ignore{quote_created} = '' ; $ignore{quote_rejected} = '' ; $ignore{times_from} = '' ; $ignore{times_to} = '' ; $ignore{days_active} = '' ; $ignore{event_length} = '' ; $ignore{custom_set} = '' ; $ignore{total_amount_workings_event} = '' ; $ignore{total_vat_amount_workings_event} = '' ; $ignore{total_grand_amount_workings_event} = '' ; $ignore{sport_type_ids} = '' ; $ignore{region_id} = '' ; } #------------------------------------------------------------------------------------------ sub process_daily_details_from_the_events_datails_tab { my ($id) = @_ ; use Time::Piece; my $final_day = &common_min_calc_day_diff($i{date_to},$i{date_from}) ; # for (1 .. 20) { # $final_day = $_ if $i{"day_$_"} ; # } for my $event_day (1 .. 20) { $ignore{"time_from_$event_day"} = 1 ; $ignore{"time_to_$event_day"} = 1 ; $ignore{"day_$event_day"} = 1 ; $ignore{"event_length_$event_day"} = 1 ; $ignore{"selected_$event_day\_event_length"} = 1 ; $i{times_from} .= qq~$i{"time_from_$event_day"};~ if $event_day > 1 && $i{"day_$event_day"} ; $i{times_from} .= qq~;~ if $event_day > 1 && !$i{"day_$event_day"} ; $i{times_to} .= qq~$i{"time_to_$event_day"};~ if $event_day < $final_day && $i{"day_$event_day"} ; $i{times_to} .= qq~;~ if $event_day < $final_day && !$i{"day_$event_day"} ; $i{days_active} .= qq~$i{"day_$event_day"};~ ; $i{event_length} .= ($i{"day_$event_day"}) ? qq~$i{"event_length_$event_day"};~ : qq~;~ ; } # chop $i{times_from} if $i{times_from} ; # chop $i{times_to} if $i{times_to} ; # chop $i{days_active} if $i{days_active} ; # chop $i{event_length} if $i{event_length} ; $i{times_from} =~ s/([^;])(;+)\z/$1/; $i{times_to} =~ s/([^;])(;+)\z/$1/; $i{days_active} =~ s/([^;])(;+)\z/$1/; $i{event_length} =~ s/([^;])(;+)\z/$1/; # $i{times_from} =~ s/;+$//; # $i{times_to} =~ s/;+$//; # $i{days_active} =~ s/;+$//; # $i{event_length} =~ s/;+$//; $ignore{times_from} = 1 ; $ignore{times_to} = 1 ; $ignore{days_active} = 1 ; $ignore{event_length} = 1 ; } #------------------------------------------------------------------------------------------ sub default_values { $i{events_operator_required} = 0 unless $i{events_operator_required} ; $i{calibrator_required} = 0 unless $i{calibrator_required} ; $i{demo_type_id} = 0 unless $i{demo_type_id} ; $i{calibrator_required} = 0 unless $i{calibrator_required} ; $i{events_operator_allocated} = 0 unless $i{events_operator_allocated} ; $i{location_id} = 0 unless $i{location_id} ; $i{quote_accepted} = 0 unless $i{quote_accepted} ; $i{quote_pending} = 0 unless $i{quote_pending} ; $i{quote_cancelled} = 0 unless $i{quote_cancelled} ; $i{quote_completed} = 0 unless $i{quote_completed} ; $i{quote_created} = 0 unless $i{quote_created} ; $i{quote_rejected} = 0 unless $i{quote_rejected} ; $i{custom_set} = 0 unless $i{custom_set} ; } #------------------------------------------------------------------------------------------ sub send_email_to_manager { my ($event_id,$status,$msg) = @_ ; return if $username eq 'marizen' ; # don't send to marizen if she did the change. my $usernametemp = (substr($username,0,4) eq 'rory') ? 'rory' : $username ; my $attachpath = "$pdfpath/event_details" ; $attachfile = "Event_Details-$event_id.pdf" ; my $subj = 'Event [' . $event_id . ']' ; $subj .= " $status" if $status ; $subj .= " by $username" if $username ; $subj .= " : $i{ref}" if $i{ref} ; my $event_details_pdf = get("$useropts{domain}$useropts{'scripts'}/pdf/event_details_pdf.pl?$event_id&&") ; my $to = ($useropts{it}{$usernametemp}) ? "$usernametemp\@kre8it.co.za" : $email_events{1} ; $got_mail_add{$to} = 1 ; my $cc = ($is_schools_manager) ? "$useremail" : (!$got_mail_add{$useremail}) ? "$useremail" : '' ; # my $bcc = ($useropts{it}{$usernametemp}) ? '' : 'rory@kre8it.co.za' ; my $bcc = '' ; &common_send_smtp_mail('',$to,$cc,$bcc,"$subj","Click here to view event details

$msg",'','html','',$attachpath,$attachfile,'',0,0) ; } #------------------------------------------------------------------------------------------ sub build_system_details_table_fields { my ($quote_accepted,$quote_rejected,$quote_cancelled) = @_ ; # $i{operator_ids} .= qq~;\~;~ ; my $cnt_last_row = 0 ; for (1 .. $nr_of_system_names_and_clubs) { my $system_name = "system_name_$_" ; my $club_name = "club_name_$_" ; my $op_name = "operator_id_calibration_$_" ; $cnt_last_row = $_ if $i{$system_name} || $i{$club_name} ; $ignore{$system_name} = 1 ; $ignore{$club_name} = 1 ; $ignore{$op_name} = 1 ; } return if ($quote_accepted || $quote_rejected || $quote_cancelled) && $glod_user_level < 3 ; unless ($cnt_last_row) { $i{club_ids} = qq~~ ; $i{event_system_id_multiple} = qq~~ ; return ; } # return if $is_schools_manager ; # return if $glod_user_level < 4 ; # return if $glod_user_level < 3 ; $i{operator_ids} = '' ; my $table_row_cnt = 0 ; for (1 .. $nr_of_system_names_and_clubs) { my $system_name = "system_name_$_" ; my $club_name = "club_name_$_" ; my $op_name = "operator_id_calibration_$_" ; $i{club_ids} .= qq~$i{$club_name};~ ; $i{event_system_id_multiple} .= qq~$i{$system_name};~ ; $i{operator_ids} .= qq~$i{$op_name},~ if $_ <= $cnt_last_row ; $table_row_cnt++ if $i{$club_name} || $i{$system_name} ; } my @saved_operator_ids = split(/\,/,$db{event_quotes}{$event_quote_id}{operator_ids}) ; $i{operator_ids} .= join(',', @saved_operator_ids[$table_row_cnt .. $#saved_operator_ids]); $ignore{club_name} = 1 ; # chop $i{club_ids} if $i{club_ids} ; chop $i{event_system_id_multiple} if $i{event_system_id_multiple} ; # chop $i{operator_ids} if $i{operator_ids} ; $i{club_ids} =~ s/;+$//; $i{event_system_id_multiple} =~ s/;+$//; $i{operator_ids} =~ s/,+$//; } #------------------------------------------------------------------------------------------ sub build_demos_min_fields_1 { my ($id) = @_ ; for (1 .. 50) { $y{7}{$_} = "excl_workings_event_$_" ; $y{8}{$_} = "description_workings_event_$_" ; $y{9}{$_} = "operator_workings_event_$_" ; $y{10}{$_} = "remarks_workings_event_$_" ; $y{11}{$_} = "supplier_workings_event_$_" ; $y{12}{$_} = "ref_nr_workings_event_$_" ; $y{13}{$_} = "qty_workings_event_$_" ; $y{14}{$_} = "amount_usd_workings_event_$_" ; $y{15}{$_} = "amount_ttl_workings_event_$_" ; $y{16}{$_} = "vat_workings_event_$_" ; foreach my $a (keys %y) { foreach my $b (keys %{$y{$a}}) { $ignore{$y{$a}{$b}} = 1 ; $x{$a}{$b} = $i{$y{$a}{$b}} ; } } } $ignore{sub_total_workings_event} = 1 ; $ignore{vat_total_workings_event} = 1 ; $ignore{grand_total_workings_event} = 1 ; $ignore{total_amount_workings_event} = 1 ; $ignore{total_vat_amount_workings_event} = 1 ; $ignore{total_grand_amount_workings_event} = 1 ; if ($i{custom_set}) { $i{total_amount_workings_event} = $i{sub_total_workings_event} ; $i{total_vat_amount_workings_event} = $i{vat_total_workings_event} ; $i{total_grand_amount_workings_event} = $i{grand_total_workings_event} ; return ; } $i{sub_total_workings_event} = 0 ; $i{vat_total_workings_event} = 0 ; $i{grand_total_workings_event} = 0 ; for my $system_name_row_nr (1 .. 15) { my $field = "operator_id_calibration_$system_name_row_nr" ; next unless $i{$field} ; for my $days (1 .. 20) { my $day_field = "day_$days" ; next unless $i{$day_field} ; $operator_day_count{full_day}{$i{$field}}++ if $i{"event_length_$days"} eq '1' ; $operator_day_count{half_day}{$i{$field}}++ if $i{"event_length_$days"} eq '2' ; } } my %iii = %i ; for (1 .. 50) { if ($i{"description_workings_event_$_"} eq '14' && $i{"operator_workings_event_$_"}) { my $op = $i{"operator_workings_event_$_"} ; my $day_len = ($i{"amount_usd_workings_event_$_"} eq '1000.00') ? "full_day" : ($i{"amount_usd_workings_event_$_"} eq '750.00') ? "half_day" : "" ; if ($day_len && ($operator_day_count{full_day}{$op} || $operator_day_count{half_day}{$op})) { $saved_values{$day_len}{$op}{saved_values} = 1 ; $saved_values{$day_len}{$op}{supplier_workings_event} = $i{"supplier_workings_event_$_"} ; $saved_values{$day_len}{$op}{ref_nr_workings_event} = $i{"ref_nr_workings_event_$_"} ; $saved_values{$day_len}{$op}{remarks_workings_event} = $i{"remarks_workings_event_$_"} ; $saved_values{$day_len}{$op}{vat_workings_event} = $i{"vat_workings_event_$_"} ; $saved_values{$day_len}{$op}{excl_workings_event} = $i{"excl_workings_event_$_"} ; # $saved_values{$day_len}{$op}{amount_usd_workings_event} = $i{"amount_usd_workings_event_$_"} if $day_len eq "other" ; } } $i{"description_workings_event_$_"} = "" ; $i{"operator_workings_event_$_"} = "" ; $i{"qty_workings_event_$_"} = "" ; $i{"amount_usd_workings_event_$_"} = "" ; $i{"amount_ttl_workings_event_$_"} = "" ; $i{"excl_workings_event_$_"} = "1"; $i{"vat_workings_event_$_"} = "" ; $i{"supplier_workings_event_$_"} = "" ; $i{"ref_nr_workings_event_$_"} = "" ; $i{"remarks_workings_event_$_"} = "" ; } my $row_cnt = 0 ; foreach my $len (sort keys %operator_day_count) { foreach $op_id (sort keys %{$operator_day_count{$len}}) { $row_cnt++ ; $i2{description_workings_event} .= '14;' ; $i2{operator_workings_event} .= "$op_id;" ; $i2{qty_workings_event} .= "$operator_day_count{$len}{$op_id};" ; # my $custom_saved_amnt = $saved_values{"other"}{$op_id}{amount_usd_workings_event} ; $i2{amount_usd_workings_event} .= ($len eq "full_day") ? '1000.00' : ($len eq "half_day") ? '750.00' : '0.00' ; $i2{amount_usd_workings_event} .= qq~;~ ; my $amnt = ($len eq "full_day") ? 1000 * $operator_day_count{$len}{$op_id} * $i{roe} : ($len eq "half_day") ? 750 * $operator_day_count{$len}{$op_id} * $i{roe} : 0 ; $amnt = sprintf ("%0.2f",$amnt) ; $i2{amount_workings_event} .= "$amnt;" ; $i{sub_total_workings_event} += $amnt if !$saved_values{$len}{$op_id}{excl_workings_event} ; if ($saved_values{$len}{$op_id}{saved_values}) { foreach (keys %{$saved_values{$len}{$op_id}}) { $i2{$_} .= qq~$saved_values{$len}{$op_id}{$_};~ if $_ ne "saved_values" ; $i{vat_total_workings_event} += $amnt*0.15 if !$saved_values{$len}{$op_id}{excl_workings_event} && $saved_values{$len}{$op_id}{vat_workings_event} && $_ eq "vat_workings_event" ; } } else { $i2{supplier_workings_event} .= ";" ; $i2{ref_nr_workings_event} .= ";" ; $i2{remarks_workings_event} .= ";" ; $i2{vat_workings_event} .= "1;" ; $i2{excl_workings_event} .= "0;" ; $i{vat_total_workings_event} += $amnt*0.15 ; } } } for (1 .. 50) { if ($iii{"description_workings_event_$_"} && $iii{"description_workings_event_$_"} ne '14') { $row_cnt++ ; $i2{"excl_workings_event"} .= qq~$iii{"excl_workings_event_$_"};~ ; $i2{"description_workings_event"} .= qq~$iii{"description_workings_event_$_"};~ ; $i2{"operator_workings_event"} .= qq~$iii{"operator_workings_event_$_"};~ ; $i2{"remarks_workings_event"} .= qq~$iii{"remarks_workings_event_$_"};~ ; $i2{"supplier_workings_event"} .= qq~$iii{"supplier_workings_event_$_"};~ ; $i2{"ref_nr_workings_event"} .= qq~$iii{"ref_nr_workings_event_$_"};~ ; $i2{"qty_workings_event"} .= qq~$iii{"qty_workings_event_$_"};~ ; $i2{"amount_usd_workings_event"} .= qq~$iii{"amount_usd_workings_event_$_"};~ ; $i2{"amount_workings_event"} .= qq~$iii{"amount_ttl_workings_event_$_"};~ ; $i2{"vat_workings_event"} .= qq~$iii{"vat_workings_event_$_"};~ ; $iii{"amount_ttl_workings_event_$_"} =~ s/\,//g ; $i{sub_total_workings_event} += $iii{"amount_ttl_workings_event_$_"} if !$iii{"excl_workings_event_$_"} ; $i{vat_total_workings_event} += $iii{"amount_ttl_workings_event_$_"} * 0.15 if !$iii{"excl_workings_event_$_"} && $iii{"vat_workings_event_$_"} ; } } unless ($row_cnt) { $i2{excl_workings_event} = qq~~ ; $i2{description_workings_event} = qq~~ ; $i2{operator_workings_event} = qq~~ ; $i2{remarks_workings_event} = qq~~ ; $i2{supplier_workings_event} = qq~~ ; $i2{ref_nr_workings_event} = qq~~ ; $i2{qty_workings_event} = qq~~ ; $i2{amount_usd_workings_event} = qq~~ ; $i2{amount_workings_event} = qq~~ ; $i2{vat_workings_event} = qq~~ ; } } #------------------------------------------------------------------------------------------ sub build_demos_min_fields_2 { $i{total_amount_workings_event} = sprintf("%0.2f",$ii{sub_total_workings_event}) ; $i{total_vat_amount_workings_event} = sprintf("%0.2f",$ii{vat_total_workings_event}) ; $i{total_grand_amount_workings_event} = sprintf("%0.2f",$ii{sub_total_workings_event}+$ii{vat_total_workings_event}) ; } #------------------------------------------------------------------------------------------ sub build_demos_min_fields_3 { for (1 .. 50) { next unless $x{8}{$_} ; $i{excl_workings_event} .= "$x{7}{$_};"; $i{description_workings_event} .= "$x{8}{$_};"; $i{operator_workings_event} .= "$x{9}{$_};"; $i{remarks_workings_event} .= "$x{10}{$_};"; $i{supplier_workings_event} .= "$x{11}{$_};"; $i{ref_nr_workings_event} .= "$x{12}{$_};"; $i{qty_workings_event} .= "$x{13}{$_};"; $i{amount_usd_workings_event} .= "$x{14}{$_};"; $i{amount_workings_event} .= "$x{15}{$_};"; $i{vat_workings_event} .= "$x{16}{$_};"; } $i{excl_workings_event} = "" unless $i{excl_workings_event} ; $i{description_workings_event} = "" unless $i{description_workings_event} ; $i{operator_workings_event} = "" unless $i{operator_workings_event} ; $i{remarks_workings_event} = "" unless $i{remarks_workings_event} ; $i{supplier_workings_event} = "" unless $i{supplier_workings_event} ; $i{ref_nr_workings_event} = "" unless $i{ref_nr_workings_event} ; $i{qty_workings_event} = "" unless $i{qty_workings_event} ; $i{amount_usd_workings_event} = "" unless $i{amount_usd_workings_event} ; $i{amount_workings_event} = "" unless $i{amount_workings_event} ; $i{vat_workings_event} = "" unless $i{vat_workings_event} ; } #------------------------------------------------------------------------------------------ sub process_multi_select { my ($quote_accepted,$quote_rejected,$quote_cancelled) = @_ ; local @venueids = split(/\,/,$i{venueids}) ; my $venueids = join(",",@venueids) ; $venueids =~ s/\s//g; # remove white space $ignore{venueids} = 1 ; $i{venue_ids} = $venueids ; $i{venue_ids} = 0 unless $i{venue_ids} ; $ignore{eventsoperatorallocated} = 1 ; $i{events_operator_allocated} = $i{eventsoperatorallocated} ; $i{events_operator_allocated} =~ s/\,/\;/g ; $i{events_operator_allocated} =~ s/\s//g; # remove white space $i{sport_type_ids} = $i{sporttypeids} ; $ignore{sporttypeids} = 1 ; $i{sport_type_ids} =~ s/\s//g; # remove white space } #------------------------------------------------------------------------------------------ sub duplicate { unless ($i{id}) { $error = qq~NO ID~ ; return ; } my $demo_orig_id = $i{id} ; &db_min_copy($table,$i{id}) ; my $demo_copy_id = $i{id} ; &db_min_ro('event_quotes','1,id',"demo_id='$demo_orig_id'","",1) ; my $orig_event_id = $db{event_quotes}{1}{id} ; $i{id} = $orig_event_id ; &db_min_copy('event_quotes',$db{event_quotes}{1}{id}) ; my $event_copy_id = $i{id} ; $i{id} = $orig_event_id ; &db_min_copy('event_quotes_min',$orig_event_id) ; my %ii = %i ; %i = () ; $i{demo_id} = $demo_copy_id ; &db_min_upd('event_quotes',"id='$event_copy_id'") ; %i = () ; $i{quote_nr} = $event_copy_id ; &db_min_upd('event_quotes_min',"id='$event_copy_id'") ; %i = %ii ; $i{id} = $demo_orig_id ; } #------------------------------------------------------------------------------------------ sub delete { unless ($i{id}) { $error = uc "NO ID" ; return ; } &db_min_ro('event_quotes','1,id',"demo_id = '$i{id}'",'','1') ; my $event_delete_id = $db{event_quotes}{1}{id} ; &db_min_delete('demos',"`id`='$i{id}'") ; &db_min_delete('event_quotes',"`id`='$event_delete_id'") ; &db_min_delete('event_quotes_min',"`id`='$event_delete_id'") ; } #------------------------------------------------------------------------------------------ sub process_upload_ifields { foreach (keys %uploads_file) { $i{$_} = $uploads_file{$_} ; $ignore{$_} = '' ; } } #------------------------------------------------------------------------------------------ sub set_default_i_vals { } #---------------------------------------------------------------------------------------- sub list_screen { &db_min_ro('event_type_details','id,name','','','') ; &db_min_ro('event_quotes_categories','id,category','','','') ; &db_min_ro('event_systems','id,name,description,system_type','','','') ; &db_min_ro('clubs','id,name','','','') ; &db_min_ro('cities','id,city,province','','','') ; &db_min_ro('users','id,username,name,email','','','') ; foreach my $_id (keys %{$db{users}}) { $username{$_id} = $db{users}{$_id}{username} ; $name{$_id} = $db{users}{$_id}{name} ; $email{$_id} = $db{users}{$_id}{email} ; } &db_min_ro('sport_types','*','','','') ; &db_min_ro('organisations','id,name','','','') ; foreach my $_id (keys %{$db{organisations}}) { $organisation{$_id} = $db{organisations}{$_id}{name} ; } if ($iaction eq 'completed' or $i{options} eq 'completed') { push @report_sql, "q.quote_completed='1'" ; } if ($iaction eq 'accepted' or $i{options} eq 'accepted') { push @report_sql, "q.quote_accepted='1'" ; } if ($iaction eq 'rejected' or $i{options} eq 'rejected') { push @report_sql, "q.quote_rejected='1'" ; } if ($iaction eq 'closed' or $i{options} eq 'closed') { push @report_sql, "(q.quote_cancelled='1' OR (q.quote_expiry<'$now_year-$now_mm-$now_dd' AND q.quote_accepted<>'1'))" ; } if ($iaction eq 'pending' or $i{options} eq 'pending') { push @report_sql, "q.quote_pending='1'" ; } if ($iaction eq 'list' or $i{options} eq 'list') { push @report_sql, "q.quote_cancelled<>'1'" ; } my $t1 = 'event_quotes'; my $t2 = 'cities' ; my $t3 = 'customers' ; my $t4 = 'regions' ; my $t5 = 'demos' ; my $t6 = 'event_types' ; my $t7 = 'demo_tenants' ; our $tables = "$t1,$t2,$t3,$t4,$t5,$t6,$t7" ; if ($is_schools_manager || $is_operator) { @report_sql_or = () ; foreach $_reg_id (keys %{$glob_regids{$userid}}) { push @report_sql_or, "q.region_id = '$_reg_id'" } my $sql_or = join(' OR ',@report_sql_or) ; push @report_sql, "($sql_or)" if $sql_or ; push @report_sql, "(q.quote_created='1')" if $is_schools_manager ; # push @report_sql, "(q.user_id='$userid')" if $is_schools_manager ; push @report_sql, "(q.quote_accepted='1')" if $is_operator && !$i{options} ; } push @report_sql, "(q.quote_completed <> '1')" if $iaction eq 'list' ; push @report_sql, "(q.demo_id <> '0')" if $iaction eq 'list' ; my $srch_where_sql = join(' AND ', @report_sql) ; my $sql_where = ($srch_where_sql) ? "WHERE $srch_where_sql" : '' ; &db_min_raw(" SELECT q.id AS 'quote_id', q.quote_nr, q.sport_type_ids, q.organisation_ids, q.date_from, q.date_to, q.ref, q.qty, q.quote_date, q.activetab, q.user_id, q.operator_ids, q.event_system_id_multiple, q.club_ids, q.demo_id, q.quote_accepted, q.quote_pending, q.quote_cancelled, q.quote_completed, q.quote_created, q.quote_rejected, et.name AS 'event_type', t.name AS 'customer', y.city, y.province, r.code AS 'reg_code', r.name AS 'region', dt.name AS 'tenant', demo.location_id AS 'location_id', demo.events_operator_allocated FROM $t1 q LEFT JOIN $t2 y ON q.city_id = y.id LEFT JOIN $t3 t ON q.quote_to = t.id LEFT JOIN $t4 r ON q.region_id = r.id LEFT JOIN $t5 demo ON q.demo_id = demo.id LEFT JOIN $t6 et ON q.type = et.id LEFT JOIN $t7 dt ON demo.tenant_id = dt.id $sql_where ; "); foreach $row (@$rows_array_ref) { for (0 .. $col_cnt){ # &common_debug("[$_] $col_name{$_} -> @$row[$_]") ; $db{$tables}{@$row[0]}{$col_name{$_}} = @$row[$_] ; } } # &tab_hash ; # load for PDF links "e_list ; # load for PDF links if ($iaction eq 'update' or $iaction eq 'save'){ &common_min_extra_crumb("list-$lcpage\s","List $ucfirstpage\s") ; } our $open_new_tab = qq~target="_blank"~ ; # opens booking page in a new tab } #------------------------------------------------------------------------------------------ sub quote_list { # our @sql_col_display = ("nr","date","customer","user","event","venue","location","sports_type","date_from","date_to","days","type") ; # our @sql_col_display = ("nr","event_start","event_end","date_added","customer","user","event","venue","location","sports_type","days","type") ; our @col_display_excel = () ; our @sql_col_display = () ; if ($usertype eq 'support') { @sql_col_display = ("nr","event_start","days","event","location","sport","system_name","club_names","operators") ; # @col_display_excel = @sql_col_display ; } else { @sql_col_display = ("nr","event_start","event_end","days","date_added","customer","event","venue","location","sport","tenant","operators") ; if ($userid eq '24') { # if ($glod_user_level > 3) { push @sql_col_display, "amount" ; push @sql_col_display, "invoice_nr" ; } # @col_display_excel = ("nr","event","event_start","event_end","days","type_of_system","system_details","system_name","sport_type","cities","region","venue","club_names","operators","client","poc_name","poc_contact_nr","category_1","category_1_details","category_2","category_2_details","format_of_title") ; } @col_display_excel = @sql_col_display ; push @sql_col_display, "" ; &report_xlsx_export_header("Demos",'demos') ; my @month_fullname = ("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December") ; # if ($i{export_to_excel}) { &report_xls_export_header("Event Quotes",'event_quotes') ; } my @day_of_week_text = ("", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday") ; our @months = ("","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec") ; foreach my $id (sort {$b <=> $a} keys %{$db{$tables}}) { next unless $id ; my $quote_expiry = $db{$tables}{$id}{quote_expiry} ; $quote_expiry =~ s/\-//iog ; my $invoice_nr = $db{$tables}{$id}{invoice_nr} ; our $quote_accepted = $db{$tables}{$id}{quote_accepted} ; our $quote_pending = $db{$tables}{$id}{quote_pending} ; our $quote_cancelled = $db{$tables}{$id}{quote_cancelled} ; our $quote_completed = $db{$tables}{$id}{quote_completed} ; our $quote_created = $db{$tables}{$id}{quote_created} ; our $quote_rejected = $db{$tables}{$id}{quote_rejected} ; my $demo_completed = $db{$tables}{$id}{demo_completed} ; my @cat_details = split('\|;\|',$db{$tables}{$id}{category_details}) ; if ($usertype eq 'support') { next unless $quote_accepted && !$quote_completed ; } $print_tbody .= qq~~ ; $xlsxcol=0; my $quote_nr = $db{$tables}{$id}{quote_nr} ; # ("nr","event_start","event_end","days","date_added","customer","event","venue","location","sport","type","operators") foreach (@sql_col_display) { unless ($_) { next ; } # blank for the buttons column my $val = $db{$tables}{$id}{$_} ; my $align = qq~ class="dt-center"~ ; my $nowrap = '' ; my $val_xlsx = '' ; my $formating = $format_event_data_2 ; if ($_ eq 'event_end') { my $sort_val = $db{$tables}{$id}{date_to} =~ s/[\-:\s]//gr; $val_xlsx = &common_min_date_as_string(substr($db{$tables}{$id}{date_to},0,16)) ; $val = qq~$sort_val~ . $val_xlsx ; $align = qq~ class="dt-center"~ ; $nowrap = 'nowrap' ; } elsif ($_ eq 'event_start') { my $sort_val = $db{$tables}{$id}{date_from} =~ s/[\-:\s]//gr; $val_xlsx = &common_min_date_as_string(substr($db{$tables}{$id}{date_from},0,16)) ; $val = qq~$sort_val~ . $val_xlsx ; # my ($dy,$dm,$dd,$th,$tm,$ts) = &common_min_split_sql_date_time($db{$tables}{$id}{date_from}) ; my $sccyymmddhrmnsc = $dy . $dm . $dd . $th . $tm . $ts ; $val = "$sortprefix$sccyymmddhrmnsc" . substr($db{$tables}{$id}{date_from},0,16) ; $nowrap = 'nowrap' ; } elsif ($_ eq 'event') { $val = $db{$tables}{$id}{ref} ; # $val_xlsx = $val ; $nowrap = '' ; } elsif ($_ eq 'customer') { $nowrap = 'nowrap' ; $val = "***PLEASE SELECT A CUSTOMER!!!***" unless $val ; # $val_xlsx = $val ; } elsif ($_ eq 'date_added') { my $sort_val = $db{$tables}{$id}{quote_date} =~ s/[\-:\s]//gr; $val_xlsx = &common_min_date_as_string($db{$tables}{$id}{quote_date}) ; $val = qq~$sort_val~ . $val_xlsx ; $val = qq~$val~ ; $nowrap = 'nowrap' ; } elsif ($_ eq 'curr') { $val = $db{$tables}{$id}{currency} ; } elsif ($_ eq 'location') { # $val = ($db{$tables}{$id}{city} & $db{$tables}{$id}{reg_code}) ? "$db{$tables}{$id}{city}, $db{$tables}{$id}{reg_code}" : ($db{$tables}{$id}{city}) ? $db{$tables}{$id}{city} : $db{$tables}{$id}{reg_code} ; $nowrap = 'nowrap' ; $val = ($db{$tables}{$id}{location_id} eq '1') ? "In Country" : ($db{$tables}{$id}{location_id} eq '2') ? "Out of Country" : "" ; } elsif ($_ eq 'country_id') { $val = $db{$tables}{$id}{country} ; } elsif ($_ eq 'days') { $val = $db{$tables}{$id}{qty} ; # $val_xlsx = $val ; } elsif ($_ eq 'type') { my $txt = uc substr($db{$tables}{$id}{event_type},0,1) ; $val_xlsx = $db{$tables}{$id}{event_type} ; $val = qq~$txt~ if $val_xlsx ; $nowrap = 'nowrap' ; } elsif ($_ eq 'tenant') { $val = $db{$tables}{$id}{tenant} ; $nowrap = 'nowrap' ; } elsif ($_ eq 'amount') { my $ttl = sprintf("%0.2f",($db{$tables}{$id}{grand_total})) ; $val = &common_commify($ttl) ; } elsif ($_ eq 'system_name') { $val = join("
", map { "$db{event_systems}{$_}{name} [$db{event_systems}{$_}{description}]" } split(/\;/,$db{$tables}{$id}{event_system_id_multiple})) ; } elsif ($_ eq 'club_names') { $val = join("
", map { "$db{clubs}{$_}{name}" } split(/\;/,$db{$tables}{$id}{club_ids})) ; } elsif ($_ eq 'operators') { $val = '' ; my $op_cnt = 0 ; my $op_cnt_2 = 0 ; my %seen_op_id = () ; # my $ops_orig = $db{$tables}{$id}{operator_ids} ; $db{$tables}{$id}{operator_ids} =~ s/\,/\;/g ; my @op_ids = split(/\;/,$db{$tables}{$id}{events_operator_allocated} . ';' . $db{$tables}{$id}{operator_ids}) ; my @system_ids = split(/\;/,';'.$db{$tables}{$id}{event_system_id_multiple}) ; my @club_ids = split(/\,/,';'.$db{$tables}{$id}{club_ids}) ; $valxlsx = '' ; for my $op_id (@op_ids) { $op_cnt_2++ ; next if $seen_op_id{$op_id} || !$op_id ; $seen_op_id{$op_id} = 1 ; if (($system_ids[$op_cnt_2-1] || $club_ids[$op_cnt_2-1] && $op_cnt_2 > 1) || $op_cnt_2 == 1) { $op_cnt++; $valxlsx .= qq~$name{$op_id};~ ; } } chop $valxlsx if $valxlsx ; if ($valxlsx) { $valxlsx =~ s/\;/\
/g ; # $val = qq~~ if $val ; $glyph_icon = ($op_cnt > 1) ? qq~~ : qq~~ ; $val = qq~$glyph_icon~ ; } $db{$tables}{$id}{operator_ids} = $ops_orig ; } elsif ($_ eq 'venue') { $nowrap = '' ; $val = join("
", map { $organisation{$_} } split(/\,/,$db{$tables}{$id}{organisation_ids})) ; } elsif ($_ eq 'sport') { $val = join("
", map { $db{sport_types}{$_}{name} } split(/\,/,$db{$tables}{$id}{sport_type_ids})) ; } elsif ($_ eq 'nr') { $sort_val = sprintf("%06d",$db{$tables}{$id}{demo_id}) ; $sort_val = ($demo_completed) ? qq~4~ : ($quote_accepted) ? qq~5~ . $sort_val : ($quote_completed) ? qq~4~ . $sort_val : ($quote_pending) ? qq~3~ . $sort_val : ($quote_rejected) ? qq~2~ . $sort_val : ($quote_cancelled) ? qq~1~ . $sort_val : qq~0~ . $sort_val ; if ($quote_completed) { $formating = $format80 ; } elsif ($quote_accepted) { $formating = $format77 ; } elsif ($quote_rejected) { $formating = $format102 ; } elsif ($quote_cancelled) { $formating = $format81 ; } elsif ($quote_pending) { $formating = $format79 ; } my $tt = qq~data-toggle="tooltip" data-placement="right" data-title="$tt_txt"~; $val_xlsx = $db{$tables}{$id}{demo_id} ; $val = qq~$sort_val~ ; # $val .= qq~$db{$tables}{$id}{demo_id}~ ; # my $demo_id = $db{$tables}{$id}{id} ; # $db{$tables}{$val_xlsx}{id} = $db{$tables}{$id}{demo_id} ; $val .= &common_min_get_event_quote_button($val_xlsx,$tables,'demos') ; $val .= qq~~ ; # $db{$tables}{$val_xlsx}{id} = $demo_id ; } $val_xlsx = $val if $val && !$val_xlsx ; &xlsxcreator_write_xlsx($ws,$xlsxrow,$xlsxcol,$val_xlsx,$formating) ; $xlsxcol++ ; $print_tbody .= qq~$val~ ; } $xlsxrow++ ; my $start_date = substr($db{$tables}{$id}{date_from},0,10); my $end_date = substr($db{$tables}{$id}{date_to},0,10); # my @event_dates = () ; my $year = substr($db{$tables}{$id}{date_from}, 0, 4) ; my $month = substr($db{$tables}{$id}{date_from}, 5, 2) ; my $day = substr($db{$tables}{$id}{date_from}, 8, 2) ; my $year_end = substr($db{$tables}{$id}{date_to}, 0, 4 ) ; my $month_end = substr($db{$tables}{$id}{date_to}, 5, 2 ) ; my $day_end = substr($db{$tables}{$id}{date_to}, 8, 2 ) ; my $row_count = 0; # for my $event_date (sort @event_dates) { $xlsxcol = 0 ; $row_count++ ; my $quote_nr = $quote_nr ; $quote_nr =~ s/'//iog; unless ($quote_nr) { $quote_nr = $id ; } my $edit_butt = qq~~ ; my $delete_butt = qq~~ ; my $copy_butt = qq~~ ; my %emailed_op_ids = () ; my $all_op_ids = 1 ; my $cnt_op_ids = 0 ; foreach my $op_id (split(/\;/,$db{$tables}{$id}{emailed_op_ids})) { $emailed_op_ids{$op_id} = 1 ; } foreach my $op_id2 (split(/\,/,$db{$tables}{$id}{operator_ids})) { $all_op_ids = 0 if $op_id2 and not $emailed_op_ids{$op_id2} ; $cnt_op_ids++ if $op_id2 ; } if ($all_op_ids and $cnt_op_ids) { $trigger_jquery_raw .= qq~ \$("#email_$id").css({ "background-color": "lightgrey", "border-color": "lightgrey" }); ~ ; } if ($glod_user_level < 3) { $delete_butt = '' ; if ($quote_completed || $quote_cancelled || $quote_rejected) { $edit_butt = '' ; } } $edit_butt = qq~$edit_butt ~ if $edit_butt ; $copy_butt = qq~$copy_butt ~ if $copy_butt ; $delete_butt = qq~$delete_butt ~ if $delete_butt ; $pdf_butt = qq~$pdf_butt ~ if $pdf_butt ; $email_butt = qq~$email_butt ~ if $email_butt ; if ($quote_created and not $quote_completed and not $quote_accepted) { $pdf_butt = qq~~ ; $email_butt = qq~~ ; } $print_tbody .= qq~ $edit_butt$copy_butt$delete_butt$pdf_butt$email_butt~ ; } $worksheet{$ws}->set_column(0,0,10) ; $worksheet{$ws}->set_column(1,1,50) ; $worksheet{$ws}->set_column(2,3,20) ; $worksheet{$ws}->set_column(4,4,10) ; $worksheet{$ws}->set_column(5,10,30) ; $worksheet{$ws}->set_column(11,11,75) ; $worksheet{$ws}->set_column(12,21,30) ; &report_xlsx_export_footer('L',15,'demos') ; if ($usertype eq 'support') { $fnsortcol = 1 ; # start date $fnsortorder = 'asc' ; } &common_min_extra_crumb("filter-$lcpage\s","Search Screen") if $glod_user_level > 3 ; } #------------------------------------------------------------------------------- sub thead { &common_min_thead ; } #------------------------------------------------------------------------------- sub add_db_fields { &hidden_fields ; $hidden{id} = 2 ; } #------------------------------------------------------------------------------------------ sub edit_db_fields { &hidden_fields ; $hidden{id} = 1 ; # $readonly{ref} = 'READONLY' ; } #------------------------------------------------------------------------------------------ sub view_db_fields { &hidden_fields ; $hidden{id} = 1 ; $label{ref} = 1 ; $label{qty} = 1 ; $label{date_from} = 1 ; $label{date_to} = 1 ; $label{sport_type_ids} = 1 ; $label{region_id} = 1 ; $label{city_id} = 1 ; $label{organisation_ids} = 1 ; } #------------------------------------------------------------------------------------------ sub hidden_fields { $ignore{custom_selected_region} = 1 ; $ignore{custom_selected_country} = 1 ; $ignore{region_id} = 1 ; $ignore{iaction} = 1 ; $ignore{name} = 1 ; $ignore{date_from} = 1 ; $ignore{date_to} = 1 ; $ignore{event_system_id_multiple} = 1 ; $ignore{club_ids} = 1 ; $ignore{operator_ids} = 1 ; $ignore{venue_ids} = 1 ; $ignore{sport_type_ids} = 1 ; $ignore{qty} = 1 ; $ignore{slip} = 1 ; $ignore{iattachslip} = 1 ; $ignore{notes} = 1 ; $ignore{office_notes} = 1 ; $ignore{email} = 1 ; $ignore{tel} = 1 ; $ignore{address} = 1 ; $ignore{contact_name} = 1 ; $ignore{demo_completed} = 1 ; $ignore{demo_accepted} = 1 ; $ignore{demo_rejected} = 1 ; $ignore{demo_cancelled} = 1 ; $ignore{demo_pending} = 1 ; $ignore{currency} = 1 ; $ignore{roe} = 1 ; $ignore{country_id} = 1 ; $ignore{quote_to} = 1 ; $ignore{quote_nr} = 1 ; $ignore{quote_date} = 1 ; $ignore{custom_set} = 1 ; # $ignore{quote_to} = 1 ; # $ignore{datetime} = 1 ; # $ignore{ref} = 1 ; # $ignore{times_from} = 1 ; # $ignore{last_update} = 1 ; $ignore{quote_accepted} = 1 ; $ignore{quote_pending} = 1 ; $ignore{quote_cancelled} = 1 ; $ignore{quote_completed} = 1 ; $ignore{quote_created} = 1 ; $ignore{quote_rejected} = 1 ; $required{quote_nr} = 1 ; $readonly{quote_nr} = 'READONLY' ; $required{quote_to} = 1 ; $required{region_id} = 1 ; $required{country_id} = '' ; $required{currency} = 1 ; $required{roe} = 1 ; for my $event_day (1 .. 20) { $ignore{"time_from_$event_day"} = 1 ; $ignore{"time_to_$event_day"} = 1 ; $ignore{"day_$event_day"} = 1 ; } $required{currency} = 1 ; $required{roe} = 1 ; } #------------------------------------------------------------------------------------------ sub add_screen { our ($lcol,$fcol) = &common_min_columns($label_col,$field_col) ; &select_opts('') ; $db{$table}{''}{quote_nr} = &db_min_get_max($table,'id') ; $db{$table}{''}{qty} = 1 ; our $savjqy = 1 ; # incorporate jquery into the save event to accommodate the multiple chosen options &add_db_fields ; &build_boxes_edit ; } #------------------------------------------------------------------------------------------ sub build_boxes_edit { my ($id) = @_ ; &edit_db_fields ; # $allow_deselect{"demo_type_id"} = 1 ; # $allow_deselect{"part_number"} = 1 ; # $allow_deselect{"customer_id"} = 1 ; # $allow_deselect{"rma_status_id"} = 1 ; our %cntxt = () ; $cntxt{1} = 'one' ; $cntxt{2} = 'two' ; $cntxt{3} = 'three' ; my %tabnames = () ; $tabnames{1} = 'Admin' ; $tabnames{2} = 'Demo Details' ; $tabnames{3} = 'Expenses' ; foreach our $col (keys %required) { &common_min_forms_required ; } $print_box_content_rows .= &common_min_forms_start($table) ; $print_box_content_rows .= qq~
~ ; &build_boxes_top($id); $print_box_content_rows .= qq~
~ ; $print_box_content_rows .= qq~
~ ; $print_box_content_rows .= qq(
); foreach (sort {$a<=>$b} keys %cntxt) { my $active = ($_==1) ? 'active' : '' ; my $colsleft = 12 ; my $showright = '' ; if ($cntxt{$_} eq 'one') { $colsleft = 6 ; $showright = 1 ; } $print_box_content_rows .= qq~
~; $print_box_content_rows .= qq~
~ ; $print_box_content_rows .= qq~
~ ; &build_boxes_left($id,$_,1); $print_box_content_rows .= qq~
~ ; if ($showright) { $print_box_content_rows .= qq~
~ ; &build_boxes_right($id,$_); $print_box_content_rows .= qq~
~ ; } $print_box_content_rows .= qq~
~ ; $print_box_content_rows .= qq~
~ ; } $print_box_content_rows .= qq~
~ ; # &build_boxes_right($id); $print_box_content_rows .= qq~
~ ; $print_box_content_rows .= qq~~ ; $print_box_content_rows .= ($id) ? &common_min_forms_end($id,$table,'update',$skip) : &common_min_forms_end($id,$table,'save',$skip) ; my $all_select_ids_str = join(",",@all_select_ids) ; $trigger_jquery_raw .= qq~\$("#demos-form select[id^='select']:not(#selectCurrency,#selectQuote_to,#selectCountry_id,#selectTenant_id)").chosen({ allow_single_deselect: true });~ ; } #---------------------------------------------------------------------------------------- sub build_boxes_left { my ($id,$tab,$demo_page) = @_ ; if ($tab == 1) { # Cusotmer Details &event_tabs_build_qt_left($id,$tab,'',$demo_page) } elsif ($tab == 2) { our ($lcol,$fcol) = &common_min_columns(2,4) ; my $sec = '_demo_details' ; my ($sec_name,$sec_cnt,$sec_col) = &tab_sec_det($sec) ; $add_form_fields = '' ; $preferred_title{quote_to} = "Client" ; $add_form_fields .= &common_min_form_select('quote_to',$db{$table}{$id}{quote_to},'') ; $add_form_fields .= qq~~ ; $add_form_fields .= qq~~ ; # $dlg{quote_to} = qq~ #
# # # # #
# ~ ; $trigger_jquery_raw .= qq~ let map_region_to_country = {} ; const \$clientSelect = \$("#selectQuote_to") ; const \$countrySelect = \$("#selectCountry_id") ; const \$regionSelect = \$("#selectRegion_id") ; const \$venuesSelect = \$("#selectVenue_ids") ; let prev_region = \$regionSelect.val() ; let prev_country = \$countrySelect.val() ; const updateChosen = \$el => \$el.trigger("chosen:updated"); const getClientId = () => { const val = \$clientSelect.val(); return val ? val.toString().split(":")[0] : null; } ; const fetchJSON = async url => { try { const res = await fetch(url); if (!res.ok) throw new Error(`Request failed: \${res.status}`); return await res.json(); } catch (err) { console.error("Fetch error:", err); return []; } }; const populateSelect = (\$field,json_list,getLabel,defaultSelected = () => "") => { let isSelected ; if (typeof defaultSelected === "function") { isSelected = defaultSelected; } else if (Array.isArray(defaultSelected)) { isSelected = data => defaultSelected.includes(data.id) ? "selected" : ""; } else { isSelected = data => data.id == defaultSelected ? "selected" : ""; } json_list.forEach(data => { \$field.append(``); }); updateChosen(\$field); return json_list.length; }; const getInputValue = name => \$(`input[name='\${name}']`).val(); const getMultiSelectSplitNumbers = (\$field) => { let field_ = \$field.chosen().val() ; field_ = String(field_); return field_.split(',') ; } ; const clearSelect = (\$el) => { \$el.empty(); \$el.append(``).trigger("chosen:updated"); }; async function update_region_drop_down_from_country (countryId) { clearSelect(\$regionSelect) ; const regionUrl = `$useropts{scripts}/get/get_regions_from_country.pl?country_id=\${countryId}` ; const regions = await fetchJSON(regionUrl); for (const data of regions) { map_region_to_country[data.id] = countryId ; } const regionCount = populateSelect(\$regionSelect, regions, r => r.code ? `\${r.name} [\${r.code}]` : r.name , "") ; // let selectedRegionId = 0 ; if (regionCount === 1) { \$regionSelect.val(regions[0].id) } else if (regionCount === 0 && \$countrySelect.val()) { // selectedRegionId = 13 ; \$regionSelect.append(``) ; } updateChosen(\$regionSelect) ; const regionId = \$regionSelect.val() ; if (regionId != prev_region) { await update_cities_from_region_and_country(regionId,countryId) ; await update_venues_from_region_and_country(regionId,countryId) ; } prev_region = regionId ; } async function update_cities_from_region_and_country (regionId,countryId="") { } async function update_venues_from_region_and_country (regionId,countryId="") { let splittedNumbers2 = getMultiSelectSplitNumbers(\$venuesSelect) ; clearSelect(\$venuesSelect) ; url = `$useropts{scripts}/get/get_venues_from_region.pl?region_id=\${regionId}&country_id=\${countryId}` ; const venues = await fetchJSON(url); const venuesCount = populateSelect(\$venuesSelect, venues, r => r.venue_name , r => splittedNumbers2.includes(r.id) ? "selected" : "" ) ; // if (venuesCount == 1) \$venuesSelect.val(venues[0].id).trigger("chosen:updated") ; } \$clientSelect.change( async function() { dispCustomer() ; let clientId = getClientId() ; // __________________________________________________________________ update_country_region_from_client const hasCustomRegion = !!getInputValue('custom_selected_region'); const hasCustomCountry = !!getInputValue('custom_selected_country'); if (clientId) { let url1 = `$useropts{scripts}/get/get_region_country_from_client.pl?client_id=\${clientId}` ; console.log("1 clientId : "+clientId) ; if (!hasCustomRegion || !hasCustomCountry) { const data = await fetchJSON(url1); data.forEach(async ({region_id,country_id}) => { if (!hasCustomCountry && country_id && country_id != '0') { \$countrySelect.val(country_id).trigger("chosen:updated") ; if (!hasCustomRegion) await update_region_drop_down_from_country(country_id) ; if (!region_id || region_id == '0') { await update_cities_from_region_and_country(0,country_id) ; await update_venues_from_region_and_country(0,country_id) ; } } if (!hasCustomRegion && region_id && region_id != '0') { \$regionSelect.val(region_id).trigger("chosen:updated") ; await update_cities_from_region_and_country(region_id) ; await update_venues_from_region_and_country(region_id) ; } // if (!hasCustomCountry && country_id && country_id != '0') // if (!hasCustomRegion && region_id && region_id != '0') \$regionSelect.val(region_id).trigger("chosen:updated") ; }); } } else { if (!hasCustomCountry) \$countrySelect.val("").trigger("chosen:updated") ; if (!hasCustomRegion) { \$regionSelect.val("").trigger("chosen:updated") ; let region_option_count = \$regionSelect.find("option").length ; if (region_option_count <= 2) { await update_region_drop_down_from_country(clientId) ; } } } // __________________________________________________________________ update_country_region_from_client }) ; \$countrySelect.change( async function() { \$("input[name='custom_selected_country']").val("1") ; await update_region_drop_down_from_country(\$countrySelect.val()) ; }) ; \$regionSelect.change( async function() { \$("input[name='custom_selected_region']").val("1") ; \$("input[name='custom_selected_country']").val("1") ; const regionId = \$regionSelect.val() ; await update_country_from_region(regionId,1) ; await update_cities_from_region_and_country(regionId) ; await update_venues_from_region_and_country(regionId) ; }); async function update_country_from_region (regionId,update_country=0) { if (map_region_to_country[regionId] || regionId == '13') { \$countrySelect.val(map_region_to_country[regionId]).trigger("chosen:updated") ; } else if (!\$("input[name='custom_selected_country']").val() || update_country) { const lookupUrl = `$useropts{scripts}/get/get_country_from_region.pl?country_id=®ion_id=\${regionId}`; console.log("update_country_from_region lookupUrl : "+lookupUrl) ; const regionMeta = await fetchJSON(lookupUrl); const { country_id } = regionMeta[0] ?? {} ; if (country_id) { map_region_to_country[regionId] = country_id; \$countrySelect.val(country_id).trigger("chosen:updated"); } } } ~ ; $preferred_title{name} = "Demo Name" ; $add_form_fields .= &common_min_form_input('name',$db{$table}{$id}{name}) ; $opts{demo_type_id} = qq~~ ; if ($db{$table}{$id}{demo_type_id}) { $opts{demo_type_id} =~ s/value="$db{$table}{$id}{demo_type_id}"/value="$db{$table}{$id}{demo_type_id}" SELECTED/g ; } # $allow_deselect{demo_type_id} = 1 ; # $allow_deselect{location_id} = 1 ; # $allow_deselect{events_operator_required} = 1 ; # $allow_deselect{events_operator_allocated} = 1 ; # $allow_deselect{calibrator_required} = 1 ; $add_form_fields .= &common_min_form_select('demo_type_id',$db{$table}{$id}{demo_type_id}) ; $add_form_fields .= &common_min_form_textarea('brief_description',$db{$table}{$id}{brief_description}) ; $preferred_title{date_from} = "Demo Date/Time From" ; $preferred_title{date_to} = "Demo Date/Time To" ; my $current_day_of_week = Day_of_Week($now_year,$now_mm,$now_dd) ; my $delta_days = 6 - $current_day_of_week ; $delta_days = 7 unless $delta_days ; $delta_days = 6 if $delta_days < 0 ; my ($def_year,$def_mon,$def_day) = Add_Delta_Days($now_year,$now_mm,$now_dd,$delta_days) ; $def_mon = sprintf("%02d",$def_mon) ; $def_day = sprintf("%02d",$def_day) ; $db{$table}{$id}{date_from} = "$def_year-$def_mon-$def_day 08:00:00" unless $db{$table}{$id}{date_from} ; $db{$table}{$id}{date_to} = "$def_year-$def_mon-$def_day 17:00:00" unless $db{$table}{$id}{date_to} ; $add_form_fields .= &common_min_form_datetimepicker('date_from',$db{$table}{$id}{date_from}) ; $add_form_fields .= &common_min_form_datetimepicker('date_to',$db{$table}{$id}{date_to}) ; $preferred_title{qty} = 'Actual Days' ; $dont_end_row{qty} = 1 ; if ((($quote_accepted || $quote_rejected || $quote_cancelled) && $glod_user_level < 3) || ($quote_completed && $glod_user_level <= 3)) { $readonly{qty} = "READONLY" ; } my @times_from = split(/\;/,";$db{$table}{$id}{times_from}") ; my @times_to = split(/\;/,$db{$table}{$id}{times_to}) ; my @default = () ; my $saved_time_from = qq~~ ; my $saved_time_to = qq~~ ; my $year = ($db{$table}{$id}{date_from}) ? substr($db{$table}{$id}{date_from},0,4) : $now_year ; my $month = ($db{$table}{$id}{date_from}) ? substr($db{$table}{$id}{date_from},5,2) : $now_mm ; my $day = ($db{$table}{$id}{date_from}) ? substr($db{$table}{$id}{date_from},8,2) : $now_dd ; $fcol = 1 ; $radio_opts{event_length} = "Full Day+Half Day" ; my @timepicker_ids = () ; my @day_ids = () ; my %default_days_selected = () ; our %default_active_event_dates = () ; my ($year1,$month1,$day1) = split(/\-/,substr($db{$table}{$id}{date_from},0,10)); my ($year2,$month2,$day2) = split(/\-/,substr($db{$table}{$id}{date_to},0,10)); our $final_day = Delta_Days($year1,$month1,$day1,$year2,$month2,$day2) + 1 ; our @defaut_days_active = split(/\;/,$db{$table}{$id}{days_active}) ; my $event_without_saved_defaults = 0 ; if (!$db{$table}{$id}{days_active}) { $event_without_saved_defaults = 1 ; for (1 .. $final_day) { $db{$table}{$id}{days_active} .= "1;" ; } } my @default_event_length = split(/\;/,$db{$table}{$id}{event_length}) ; my %calc_default_event_length = () ; my @days_active = split(/\;/,$db{$table}{$id}{days_active}) ; my $cnt = 0 ; # my $final_day = 0 ; my $no_event_days_cnt = 0 ; my $hide_rows_1 = (substr($db{$table}{$id}{date_from},0,10) eq substr($db{$table}{$id}{date_to},0,10)) ? "style='display:none;'" : "" ; my $hide_rows_2 = ($final_day <= 10) ? "style='display:none;'" : "" ; my %time_label_header_row = () ; $time_label_header_row{1} = qq~
~ ; $time_label_header_row{2} = qq~
~ ; my $nr_of_active_days = 0 ; for (1 .. 20) { my $cnt_row = ($_ <= 10) ? 1 : 2 ; $default_days_selected{blank}{$_} = "SELECTED" unless $days_active[$_ - 1] ; $default_days_selected{1}{$_} = "SELECTED" if $days_active[$_ - 1] ; $nr_of_active_days++ if $days_active[$_ - 1] ; push @timepicker_ids,"#timepickerTime_from_$_" ; push @timepicker_ids,"#timepickerTime_to_$_" ; push @day_ids,"#day_$_" ; my ($new_year,$new_month,$new_day) = ($_ > 1) ? Add_Delta_Days($year,$month,$day,$_-1) : ($year,$month,$day) ; $new_day = sprintf("%02s",$new_day) ; $new_month = sprintf("%02s",$new_month) ; # $default_active_event_dates{$_} = "$new_year-$new_month-$new_day" if $days_active[$_ - 1] ; $default_active_event_dates{$_} = "$new_year-$new_month-$new_day" if $_ <= $final_day ; my $field = "time_from_$_" ; $default[$_ - 1] = $times_from[$_ - 1] ; $default[$_ - 1] = substr($db{$table}{$id}{date_from},11) if $db{$table}{$id}{date_from} && (!$times_from[$_ - 1] || $_ == 1) ; my $default1 = $default[$_ - 1] ; $custom_style{$field} = ((!$event_without_saved_defaults && !$defaut_days_active[$_ - 1]) || $_ == 1 || ($_ > $final_day)) ? qq~display:none;~ : '' ; # $days_time_row .= ($glod_user_level > 2) ? &common_min_form_timepicker_col($field,$default[$_ - 1],'',1) : ($readonly{qty} ne "READONLY" || ($final_day >= $_ && !$custom_style{$field})) ? qq~
~ : qq~
~ ; $days_time_row{$cnt_row} .= ($readonly{qty} ne "READONLY") ? &common_min_form_timepicker_col($field,$default[$_ - 1],'',1) : ($readonly{qty} eq "READONLY" && ($final_day >= $_ && !$custom_style{$field})) ? qq~
~ : qq~
~; $trigger_jquery_raw .= qq~\$("#timepickerTime_from_1").css("display","none");~ ; # $default_time_from .= qq~"$_":"$default[$_ - 1]",~ ; $saved_time_from .= qq~"$_":"$times_from[$_ - 1]",~ if $times_from[$_ - 1] ; # $final_day = $_ if $times_from[$_ - 1] ; $field = "time_to_$_" ; $custom_style{$field} = ((!$event_without_saved_defaults && !$defaut_days_active[$_ - 1]) || $_ >= $final_day) ? qq~display:none;~ : '' ; $default[$_ - 1] = $times_to[$_ - 1] ; $default[$_ - 1] = substr($db{$table}{$id}{date_to},11) if $db{$table}{$id}{date_to} && (!$times_to[$_ - 1] || $_ == 6) ; #___ # $days_time_row_2 .= ($readonly{qty} ne "READONLY") ? &common_min_form_timepicker_col($field,$default[$_ - 1],'',1) : ($final_day >= $_ && !$custom_style{$field}) ? &common_min_form_input_col($field,$default[$_ - 1],'',0) : qq~
~ ; # $days_time_row_2 .= ($glod_user_level > 2) ? &common_min_form_timepicker_col($field,$default[$_ - 1],'',1) : ($readonly{qty} ne "READONLY" || ($final_day >= $_ && !$custom_style{$field})) ? qq~
~ : qq~
~; $days_time_row_2{$cnt_row} .= ($readonly{qty} ne "READONLY") ? &common_min_form_timepicker_col($field,$default[$_ - 1],'',1) : ($readonly{qty} eq "READONLY" && ($final_day >= $_ && !$custom_style{$field})) ? qq~
~ : qq~
~ ; #___ # if ($default_event_length[$_ - 1] eq '1' && $days_active[$_ - 1]) { # $def_nr_of_full_days++ ; # } elsif ($default_event_length[$_ - 1] eq '2' && $days_active[$_ - 1]) { # $def_nr_of_half_days++ ; # } if (!$db{$table}{$id}{event_length}) { my ($h1,$m1,$s1) = ($_ == 1 || !$times_from[$_ - 1]) ? split(/\:/,substr($db{$table}{$id}{date_from},11)) : split(/\:/,$times_from[$_ - 1]) ; my ($h2,$m2,$s2) = split(/\:/,substr($db{$table}{$id}{date_to},11)) ; my $time_diff = 3600*($h2-$h1) + 60*($m2-$m1) + ($s2-$s1) ; if ($time_diff >= 18000) { $calc_default_event_length{$_} = 1 ; $trigger_jquery .= qq~ \$("#radio_$_\_1").prop('checked',true) ; ~ if $readonly{qty} ne "READONLY" ; # $def_nr_of_full_days++ if $default_event_length[$_ - 1] ; } elsif ($time_diff >= 0 && $time_diff < 18000) { $calc_default_event_length{$_} = 2 ; $trigger_jquery .= qq~ \$("#radio_$_\_2").prop('checked',true) ; ~ if $readonly{qty} ne "READONLY" ; # $def_nr_of_half_days++ if $default_event_length[$_ - 1] ; } $trigger_jquery .= qq~ \$("#day_$_").val("1") ; \$("#day_$_").trigger("chosen:updated") ; ~ if $_ <= $final_day && $readonly{qty} ne "READONLY" ; } elsif ($_ <= $final_day) { # $days_active[$_ - 1 # my ($h1,$m1,$s1) = split(/\:/,$times_from[$_ - 1]) ; # my ($h2,$m2,$s2) = split(/\:/,$times_to[$_ - 1]) ; # my $time_diff = 3600*($h2-$h1) + 3600*($m2-$m1) + ($s2-$s1) ; if ($default_event_length[$_ - 1]) { if ($default_event_length[$_-1] eq "1") { $trigger_jquery .= qq~ // \$("input[name='selected_$_\_event_length']").val("1") ; \$("#radio_$_\_1").prop('checked',true) ; ~ ; # $def_nr_of_full_days++ ; } elsif ($default_event_length[$_-1] eq "2") { $trigger_jquery .= qq~ // \$("input[name='selected_$_\_event_length']").val("2") ; \$("#radio_$_\_2").prop('checked',true) ; ~ ; # $def_nr_of_half_days++ ; } } else { my ($h1,$m1,$s1) = split(/\:/,substr($db{$table}{$id}{date_from},11)) ; my ($h2,$m2,$s2) = split(/\:/,substr($db{$table}{$id}{date_to},11)) ; my $time_diff = 3600*($h2-$h1) + 60*($m2-$m1) + ($s2-$s1) ; if ($time_diff >= 18000) { $calc_default_event_length{$_} = 1 ; $trigger_jquery .= qq~ \$("#radio_$_\_1").prop('checked',true) ; ~ if $readonly{qty} ne "READONLY" ; # $def_nr_of_full_days++ ; } elsif ($time_diff >= 0 && $time_diff < 18000) { $calc_default_event_length{$_} = 2 ; $trigger_jquery .= qq~ \$("#radio_$_\_2").prop('checked',true) ; ~ if $readonly{qty} ne "READONLY" ; # $def_nr_of_half_days++ ; } } } if ((!$days_active[$_ - 1] && $_ > $final_day) || ($db{$table}{$id}{days_active} == ";;;;;") || (!$days_active[$_ - 1] && $_ <= $final_day)) { $trigger_jquery .= qq~\$("#radio_$_\_1").css("display","none") ; ~ ; $trigger_jquery .= qq~\$("#radio_$_\_2").css("display","none") ; ~ ; } $saved_time_to .= qq~"$_":"$times_to[$_ - 1]",~ if $times_to[$_ - 1] ; $field = "day_$_" ; $custom_style{$field} = ($final_day < $_ || $final_day == 1) ? qq~display:none;~ : '' ; if ($readonly{qty} ne "READONLY") { $trigger_jquery .= qq~\$("#day_$_\_chosen").css("display","none");~ if $_ > $final_day || $final_day == 1 ; $time_label_header_row{$cnt_row} .= qq~
~ ; } else { $time_label_header_row{$cnt_row} .= (!$default_days_selected{1}{$_}) ? qq~
~ : qq~
~ ; } } $event_length_rows{1} .= &common_min_form_radio_col('event_length',$db{$table}{$id}{event_length},'',10,$final_day,"",1) ; my $final_day_second = $final_day - 10 ; $final_day_second = -1 if $final_day_second <= 0 ; $event_length_rows{2} .= &common_min_form_radio_col('event_length',$db{$table}{$id}{event_length},'',10,$final_day_second,"radio_row_id_2",2) ; $add_form_fields .= qq~$time_label_header_row{1}
~ ; $add_form_fields .= qq~
$days_time_row{1}
~ ; $add_form_fields .= qq~
$days_time_row_2{1}
~ ; $add_form_fields .= qq~$event_length_rows{1}~ ; $add_form_fields .= qq~$time_label_header_row{2}
~ ; $add_form_fields .= qq~
$days_time_row{2}
~ ; $add_form_fields .= qq~
$days_time_row_2{2}
~ ; $add_form_fields .= qq~$event_length_rows{2}~ ; $db{$table}{$id}{qty} = 1 if $iaction eq 'add' ; # $trigger_jquery .= qq~~ ; # $add_form_fields .= &common_min_form_input('qty',$db{$table}{$id}{qty},'',1) ; # $add_form_fields .= qq~~ ; $add_form_fields .= qq~~ ; $trigger_jquery_raw .= qq~\$("#timepickerTime_to_$final_day").css("display","none");~ if $final_day ; my $day_ids_string = join(",",@day_ids) ; my $day_ids_chosen_string = join(",", map { "#day_$_\_chosen" } (1 .. $nr_of_active_days) ) ; $trigger_jquery .= qq~ // \$("$day_ids_chosen_string").css("width","100%") ; \$("#two [id^='day_']").css("width","100%") ; ~ ; $trigger_jquery_raw .= qq~ let saved_time_from = {$saved_time_from} ; let saved_time_to = {$saved_time_to} ; // \$("$day_ids_string").change( function (e) { \$("#two [id^='day_']").change( function (e) { const id = this.id ; let col_nr = get_row_nr(id) ; let nr_days = \$("input[name='qty']").val() ; let nr_of_active_days = calc_nr_of_active_days() ; let datesBetween ; let date_counter = 0 ; let dates_map = {} ; datesBetween = getDatesBetween(\$("input[name='date_from']").val(),\$("input[name='date_to']").val(),0) ; for (const date of datesBetween) { date_counter++ ; dates_map[date_counter] = date ; } let def_val = 0 ; let hide_this_1 = '' ; let hide_this_2 = '' ; if (!\$\(this).val()) { \$("#timepickerTime_from_"+col_nr+"").css("display","none") ; \$("#timepickerTime_to_"+col_nr+"").css("display","none") ; \$("#radio_"+col_nr+"_1").css("display","none") ; \$("#radio_"+col_nr+"_2").css("display","none") ; nr_days = nr_days - 1 ; } else { if (col_nr != "1") { \$("#timepickerTime_from_"+col_nr).css("display","") ; } \$("#radio_"+col_nr+"_1").css("display","") ; \$("#radio_"+col_nr+"_2").css("display","") ; if (col_nr < date_counter ) { \$("#timepickerTime_to_"+col_nr).css("display","") ; } nr_days = parseInt(nr_days) + 1 ; } \$("input[name='qty']").val(nr_days) ; }) ; ~ if $readonly{qty} ne "READONLY" ; my $timepicker_ids_string = join(",",@timepicker_ids) ; # $trigger_jquery_raw .= qq~ \$("$timepicker_ids_string").datetimepicker({language:'pt-BR',pickDate:false});~ ; if ($readonly{qty} ne "READONLY") { $trigger_jquery_raw .= qq~ function set_full_half_day (beforeUnderscore,afterUnderscore) { let start_time = \$("input[name='time_from_"+afterUnderscore+"']").val() ; let end_time = \$("input[name='time_to_"+afterUnderscore+"']").val() ; let seconds1 = timeStringToSeconds(start_time) ; let seconds2 = timeStringToSeconds(end_time) ; let diffSeconds = seconds2 - seconds1 ; let changed_a_full_half_day_toggle = 0 ; if (diffSeconds >= 18000) { if (\$("#radio_"+afterUnderscore+"_2").is(":checked")) { // nr_days["half"]-- ; } if (!\$("#radio_"+afterUnderscore+"_1").is(":checked")) { \$("#radio_"+afterUnderscore+"_1").prop('checked',true) ; changed_a_full_half_day_toggle = 1 ; // nr_days["full"]++ ; } } else if (diffSeconds >= 0 && diffSeconds < 18000) { if (\$("#radio_"+afterUnderscore+"_1").is(":checked")) { // nr_days["full"]-- ; } if (!\$("#radio_"+afterUnderscore+"_2").is(":checked")) { \$("#radio_"+afterUnderscore+"_2").prop('checked',true) ; changed_a_full_half_day_toggle = 1 ; // nr_days["half"]++ ; } } else { if (\$("#radio_"+afterUnderscore+"_1").is(":checked")) { \$("#radio_"+afterUnderscore+"_1").prop('checked',false) ; changed_a_full_half_day_toggle = 1 ; // nr_days["full"]-- ; } if (\$("#radio_"+afterUnderscore+"_2").is(":checked")) { \$("#radio_"+afterUnderscore+"_2").prop('checked',false) ; changed_a_full_half_day_toggle = 1 ; // nr_days["half"]-- ; } if (beforeUnderscore == 'timepickerTime_from') { \$("input[name='time_from_"+afterUnderscore+"']").val(end_time) ; } else if (beforeUnderscore == 'timepickerTime_to') { \$("input[name='time_to_"+afterUnderscore+"']").val(start_time) ; } } if (changed_a_full_half_day_toggle == 1) { // changed_radio_cnt++ ; } } // \$("$timepicker_ids_string").datetimepicker({language:'pt-BR',pickDate:false}); \$("#two [id^='timepickerTime_']").datetimepicker({language:'pt-BR',pickDate:false}); // \$("#timepickerTime_from_1").on('changeDate', function() { // let dateString1 = \$("input[name='time_from").val() ; // }) ; // \$("$timepicker_ids_string").on('changeDate', function() { \$("#two [id^='timepickerTime_']").on('changeDate', function() { // const id = this.id ; // const lastIndex = id.lastIndexOf('_'); // const beforeUnderscore = id.substring(0,lastIndex); // let afterUnderscore = id.substring(lastIndex+1); // afterUnderscore = parseInt(afterUnderscore) ; // if (id.includes("timepickerTime_from_")) { // saved_time_from[afterUnderscore] = \$("input[name='time_from_"+afterUnderscore+"']").val() ; // } else if (id.includes("timepickerTime_to_")) { // saved_time_to[afterUnderscore] = \$("input[name='time_to_"+afterUnderscore+"']").val() ; // } // changed_radio_cnt = 0 ; // set_full_half_day(beforeUnderscore,afterUnderscore) ; const id = this.id ; const lastIndex = id.lastIndexOf('_'); const beforeUnderscore = id.substring(0,lastIndex); let afterUnderscore = id.substring(lastIndex+1); afterUnderscore = parseInt(afterUnderscore) ; if (beforeUnderscore == 'from' && afterUnderscore == 1) { let dateString = \$("input[name='time_from").val() ; let timePart = dateString.split(' ')[1]; \$("input[name='time_from_1']").val(timePart) ; return ; } if (beforeUnderscore == 'to') { let dateString1 = \$("input[name='time_from").val() ; let dateString2 = \$("input[name='time_to").val() ; const count_dates = getDatesBetween(dateFromInput,dateToInput,1) ; if (afterUnderscore == count_dates) { let timePart = dateString.split(' ')[1]; \$("input[name='time_to_"+count_dates+"']").val(timePart) ; return ; } } set_full_half_day(beforeUnderscore,afterUnderscore) ; }) ; ~ ; } # $trigger_jquery_raw .= qq~ # \$("$timepicker_ids_string").datetimepicker({language:'pt-BR',pickDate:false}); # ~ ; # } $trigger_jquery_raw .= qq~ let prev_date_part_from = \$("input[name='date_from']").val() ; prev_date_part_from = prev_date_part_from.split(' ')[0] ; let prev_date_part_to = \$("input[name='date_to']").val() ; prev_date_part_to = prev_date_part_to.split(' ')[0] ; \$('#datetimepickerDate_from,#datetimepickerDate_to').on('changeDate', function(e) { let from_to = get_row_nr(this.id) ; if (this.id == "datetimepickerDate_from") { let date_new = \$("input[name='date_from']").val() ; let time_part = date_new.split(' ')[1]; \$("input[name='time_from_1']").val(time_part) ; } calc_date_diff_in_days(this.id) ; }) ; function calc_date_diff_in_days (from_to) { let dateFromInput = \$("input[name='date_from']").val(); let dateToInput = \$("input[name='date_to']").val() ; let date_part_from = dateFromInput.split(' ')[0]; let date_part_to = dateToInput.split(' ')[0]; let time_part_from = dateFromInput.split(' ')[1]; let time_part_to = dateToInput.split(' ')[1]; if (prev_date_part_from == date_part_from && date_part_to == prev_date_part_to) { changed_radio_cnt = 0 ; const datesBetween = getDatesBetween(dateFromInput,dateToInput,0) ; let date_counter = 0 ; for (const date of datesBetween) { date_counter++ ; if (date_counter > 20) { date_counter = 20 ; break ; } if (((!saved_time_to[date_counter] || datesBetween.length == date_counter) && from_to.includes("Date_to")) || (date_counter > 1 && !saved_time_from[date_counter] && from_to.includes("Date_from"))) { if (from_to.includes("Date_from")) { \$("input[name='time_from_"+date_counter+"']").val(time_part_from) ; } else { \$("input[name='time_to_"+date_counter+"']").val(time_part_to) ; } set_full_half_day('',date_counter) ; } } if (from_to.includes("Date_to")) { saved_time_to[date_counter] = time_part_to ; } else { saved_time_from["1"] = time_part_from ; } return ; } prev_date_part_from = date_part_from ; prev_date_part_to = date_part_to ; const date1 = new Date(dateFromInput); const date2 = new Date(dateToInput); let hide_date_names = "#1" ; let glod_user_level = parseInt("$glod_user_level") ; let y1 = date1.getFullYear() ; let m1 = date1.getMonth() ; let d1 = date1.getDate() ; let y2 = date2.getFullYear() ; let m2 = date2.getMonth() ; let d2 = date2.getDate() ; m1 = m1 + 1 ; if (m1 < 10) { m1 = "0"+m1.toString() ; } m2 = m2 + 1 ; if (m2 < 10) { m2 = "0"+m2.toString() ; } if ((y1 == y2 && m1 == m2 && d1 == d2) || date1 > date2) { if (date1 > date2 && from_to == "datetimepickerDate_from") { let date_part_from = dateFromInput.split(' ')[0] ; \$("#datetimepickerDate_to").datetimepicker("setDate",date_part_from+" "+time_part_to) ; \$("#day_1_name label.control-label").text(date_part_from) ; } else if (date1 > date2 && from_to == "datetimepickerDate_to") { let date_part_to = dateToInput.split(' ')[0] ; \$("#datetimepickerDate_from").datetimepicker("setDate",date_part_to+" "+time_part_from) ; \$("#day_1_name label.control-label").text(date_part_to) ; } \$("input[name='time_from_1']").val(time_part_from) ; \$("input[name='time_to_1']").val(time_part_to) ; // changed_radio_cnt = 0 ; set_full_half_day('',1) ; \$("#radio_1_1").css("display",""); \$("#radio_1_2").css("display",""); \$("#radio_row_id_2_1").hide() ; \$("#radio_row_id_2_2").hide() if (!\$("#days_drop_downs_1").is(":hidden")) { \$("#start_times_row_1").hide() ; \$("#end_times_row_1").hide() ; \$("#days_drop_downs_1").hide() ; } if (!\$("#days_drop_downs_2").is(":hidden")) { \$("#start_times_row_2").hide() ; \$("#end_times_row_2").hide() ; \$("#days_drop_downs_2").hide() ; } let reduced_nr_of_days = 0 ; for (let i=2; i<=20; i++) { \$("#day_"+i+"_chosen").css("display","none") ; if (\$("#day_"+i).val()) { \$("#day_"+i).val("") ; \$("#day_"+i).trigger("chosen:updated") ; \$("#radio_"+i+"_1").css("display","none") ; \$("#radio_"+i+"_2").css("display","none") ; } } if (!\$("#day_1").val()) { \$("#day_1").val("1") ; \$("#day_1").trigger("chosen:updated") ; } \$("#inputQty").val("1") ; if (!\$("#days_drop_downs_1").is(":hidden")) { \$("#days_drop_downs_1").hide() ; } if (!\$("#start_times_row_1").is(":hidden")) { \$("#start_times_row_1").hide() ; } if (!\$("#end_times_row_1").is(":hidden")) { \$("#end_times_row_1").hide() ; } if (!\$("#days_drop_downs_2").is(":hidden")) { \$("#days_drop_downs_2").hide() ; } if (!\$("#start_times_row_2").is(":hidden")) { \$("#start_times_row_2").hide() ; } if (!\$("#end_times_row_2").is(":hidden")) { \$("#end_times_row_2").hide() ; } return ; } if (\$("#days_drop_downs_1").is(":hidden")) { \$("#days_drop_downs_1").css("display","") ; \$("#start_times_row_1").css("display","") ; \$("#end_times_row_1").css("display","") ; } \$("input[name='time_from_1']").val(time_part_from) ; const datesBetween = getDatesBetween(dateFromInput,dateToInput,0) ; let date_counter = 0 ; let dates_count = 0 ; let count_days = 0 ; let count_days_after = 0 ; let nr_of_active_days = 0 ; let dates_map = {} ; for (const date of datesBetween) { date_counter++ ; dates_map[date_counter] = date ; if (date_counter > 20) { date_counter = 20 ; break ; } if (date_counter > 1 && !saved_time_from[date_counter]) { \$("input[name='time_from_"+date_counter+"']").val(time_part_from) ; } if (!saved_time_to[date_counter]) { \$("input[name='time_to_"+date_counter+"']").val(time_part_to) ; } set_full_half_day('',date_counter) ; if (\$("#day_"+date_counter+"_chosen").is(":hidden")) { \$("#radio_"+date_counter+"_1").css("display",""); \$("#radio_"+date_counter+"_2").css("display",""); \$("#day_"+date_counter).val("1") ; \$("#day_"+date_counter).trigger("chosen:updated") ; \$("#day_"+date_counter+"_chosen").css("display","") ; \$("#day_"+date_counter+"_chosen").css("width","100%") ; \$("#day_"+date_counter).val('1') ; \$("#day_"+date_counter).trigger("chosen:updated") ; if (date_counter > 1) { // console.log("1 . display timepickerTime_from_"+date_counter) ; \$("#timepickerTime_from_"+date_counter).css("display","") ; } } if (\$("#day_"+date_counter).val()) { \$("#timepickerTime_to_"+date_counter).css("display","") ; nr_of_active_days++ ; } \$("#day_"+date_counter+" option[value='1']").text(date) ; \$("#day_"+date_counter+" option[value='1']").trigger("chosen:updated") ; if (\$("#day_"+date_counter).val()) { count_days++ ; } } // \$("input[name='time_to_"+date_counter+"']").val(time_part_to) ; if (\$("#days_drop_downs_2").is(":hidden") && date_counter > 10) { // if (glod_user_level > 3) { \$("#days_drop_downs_2").css("display","") ; \$("#start_times_row_2").css("display","") ; \$("#end_times_row_2").css("display","") ; \$("#radio_row_id_2_1").css("display","") ; \$("#radio_row_id_2_2").css("display","") ; } else if (!\$("#days_drop_downs_2").is(":hidden") && date_counter <= 10) { \$("#days_drop_downs_2").css("display","none") ; \$("#start_times_row_2").css("display","none") ; \$("#end_times_row_2").css("display","none") ; \$("#radio_row_id_2_1").css("display","none") ; \$("#radio_row_id_2_2").css("display","none") ; } if (count_days_after) { date2.setDate(date2.getDate() - count_days_after); \$("#datetimepickerDate_to").datetimepicker("setDate",date2) ; } let select_raw ; let select_chosen_ids_1 = '#1' ; let select_chosen_ids_2 = '#2' ; let names_to_display = '#3' ; let def_val = 0 ; \$("#inputQty").val(count_days) ; \$("#timepickerTime_to_"+date_counter).css("display","none") ; if (date_counter <= 20) { for (let j=date_counter+1;j<=20;j++) { if (\$("#day_"+j).val()) { \$("#day_"+j).val("") ; \$("#day_"+j).trigger("chosen:updated") ; } if (!\$("#day_"+j+"_chosen").is(":hidden")) { \$("#day_"+j+"_name label.control-label").text('') ; \$("#day_"+j+"_name").css("display","none") ; \$("#radio_"+j+"_1").css("display","none") ; \$("#radio_"+j+"_2").css("display","none") ; \$("#day_"+j+"_chosen").css("display","none") ; } if (!\$("#timepickerTime_from_"+j).is(":hidden")) { \$("#timepickerTime_from_"+j).css("display","none") ; } if (!\$("#timepickerTime_to_"+j).is(":hidden")) { \$("#timepickerTime_to_"+j).css("display","none") ; } } } } function timeStringToSeconds(timeString) { const [hours, minutes, seconds] = timeString.split(':').map(Number); return hours * 3600 + minutes * 60 + seconds; } function getDatesBetween(startDateStr,endDateStr,count_dates) { if (!startDateStr || !endDateStr) { return ; } const dates = []; let currentDate = new Date(startDateStr); let endDate = new Date(endDateStr) ; currentDate.setHours(+2); currentDate.setMinutes(0); currentDate.setSeconds(0); endDate.setHours(+2); endDate.setMinutes(59); endDate.setSeconds(59); // console.log("2 . currentDate : "+currentDate.toISOString().split('T')[0]) ; while (currentDate < endDate) { // console.log("3 . currentDate : "+currentDate.toISOString().split('T')[0]) ; dates.push(currentDate.toISOString().split('T')[0]); currentDate.setDate(currentDate.getDate() + 1); if (count_dates) { count_dates++ ; } } if (count_dates) { count_dates-- ; return count_dates; } else { return dates; } } ~ ; $preferred_title{location_id} = "Demo Location" ; $selected{events_operator_required}{$db{$table}{$id}{location_id}} = 'SELECTED' ; $opts{location_id} = qq~~ ; # $fcol = 3 ; $fcol = 4 ; $add_form_fields .= &common_min_form_select('location_id') ; $preferred_title{venue_ids} = "Demo Venue" ; $multiple{venue_ids} = 1 ; if ($db{$table}{$id}{venue_ids}) { foreach (split(/\,/,$db{$table}{$id}{venue_ids})) { $opts{venue_ids} =~ s/value="$_"/value="$_" SELECTED/g ; } } $dlg{venue_ids} .= qq~
~ ; $add_form_fields .= qq~~ . &common_min_form_select('venue_ids') ; $opts{tenant_id} =~ s/value="$db{$table}{$id}{tenant_id}"/value="$db{$table}{$id}{tenant_id}" SELECTED/g ; # $allow_deselect{tenant_id} = 1 ; $dlg{tenant_id} = qq~
~ ; $add_form_fields .= &common_min_form_select('tenant_id') ; $selected{events_operator_required}{$db{$table}{$id}{events_operator_required}} = 'SELECTED' ; $opts{events_operator_required} = qq~~ ; $add_form_fields .= &common_min_form_select('events_operator_required') ; $fcol = 3 ; $dlg{events_operator_allocated} = qq~~ ; $dlg{events_operator_allocated} .= qq~
~ ; if ($db{$table}{$id}{events_operator_allocated} && $db{$table}{$id}{events_operator_allocated} =~ /;/) { foreach (split(";",$db{$table}{$id}{events_operator_allocated})) { ## split(";", OR split(/\;/, $opts{events_operator_allocated} =~ s/value="$_"/value="$_" SELECTED/g ; } } elsif ($db{$table}{$id}{events_operator_allocated}) { $opts{events_operator_allocated} =~ s/value="$db{$table}{$id}{events_operator_allocated}"/value="$db{$table}{$id}{events_operator_allocated}" SELECTED/g ; } $multiple{events_operator_allocated} = 1 ; my $events_operator_allocated_def = $db{$table}{$id}{events_operator_allocated} ; $events_operator_allocated_def =~ s/\;/\,/g ; $add_form_fields .= qq~~ . &common_min_form_select('events_operator_allocated',$db{$table}{$id}{events_operator_allocated}) ; $trigger_jquery_raw .= qq~ \$("#selectEvents_operator_allocated").on("change", function () { let sel_val = \$(this).chosen().val() ; \$("input[name='eventsoperatorallocated']").val(sel_val) ; }) ; ~ ; $fcol = 4 ; $add_form_fields .= &common_min_form_textarea('additional_requirements_from_events_dept',$db{$table}{$id}{additional_requirements_from_events_dept}) ; $selected{calibrator_required}{$db{$table}{$id}{calibrator_required}} = 'SELECTED' ; $opts{calibrator_required} = qq~~ ; $fcol = 3 ; $add_form_fields .= &common_min_form_select('calibrator_required',$db{$table}{$id}{calibrator_required}) ; $fcol = 4 ; $add_form_fields .= &build_system_name_form($db{$table}{$id}{event_system_id_multiple},$db{$table}{$id}{club_ids},$db{$table}{$id}{operator_ids},$quote_accepted,$quote_rejected,$quote_cancelled,$db{$table}{$id}{quote_completed}) ; # $fcol = 6 ; $lcol = 2 ; $fcol = 4 ; $dlg{sport_type_ids} .= qq~
~ ; $multiple{sport_type_ids} = 1 ; $preferred_title{sport_type_ids} = "Sport Type(s)" ; $trigger_jquery_raw .= qq~ \$("#selectSport_type_ids").change( function () { let sel_vals = \$(this).chosen().val() ; \$("input[name='sporttypeids']").val(sel_vals) ; }) ; ~ ; $add_form_fields .= qq~~ . &common_min_form_select('sport_type_ids','') ; $add_form_fields .= &common_min_form_textarea('additional_requirements_from_support_dept',$db{$table}{$id}{additional_requirements_from_support_dept}) ; $add_form_fields .= &common_min_form_textarea('pre_demo_testing_requirements',$db{$table}{$id}{pre_demo_testing_requirements}) ; # $print_box_content_rows .= &common_min_box_top('',' Demo Details',$box_right_bg); #film # $print_box_content_rows .= $add_form_fields ; # $print_box_content_rows .= &common_min_box_foot; &event_tabs_content_box($sec_name,$sec_col); $print_box_content_rows .= qq~
~ ; # fixes row highlighting issue $print_box_content_rows .= qq~
~ ; # fixes row highlighting issue $trigger_jquery .= qq~ // \$("#two [id^='select']").css("width","100%") ; \$("#two [id^='select']").filter( function() { return this.id.endsWith("_chosen"); }).css("width", "100%"); ~ ; } elsif ($tab == 3) { # Workings # --------------- START Working ---------------------------------------------------------------------------------------------------------------- $add_form_fields = '' ; $lcol = 1 ; $fcol = 2 ; my @docs = ('Slip') ; $add_form_fields .= qq~
~ ; foreach (@docs) { my $doc = lc $_ ; $doc =~ s/ /\_/ ; $doc =~ s/&/\_/ ; $event_uploads = &common_get_field_uploads($id,"$doc",'id','delete-attached-slip') ; if ($event_uploads) { $add_form_fields .= qq~
$event_uploads
~; } else { $add_form_fields .= qq~

Upload file from PC.

~ ; } } $trigger_jquery_raw .= qq~ \$('#delete-attached-slip').click(function (e) { BootstrapDialog.confirm({ title: 'Confirm Delete', message: 'Are you sure you want to delete $doc?', type: BootstrapDialog.TYPE_DANGER, // <-- Default value is BootstrapDialog.TYPE_PRIMARY <-- Default value is BootstrapDialog.TYPE_WARNING callback: function(result) { if (result) { var url = "$useropts{scripts}/get/get_delete_attach.pl?slips/$db{event_quotes}{$id}{id}&$db{event_quotes}{$id}{slip}&event_quotes&$db{event_quotes}{$id}{id}&slip" ; \$.get(url) ; \$('#attach-$id-1').hide() ; // CHECK THAT THE FILE CNT IS ALWAYS ONE \$('#delete-attached-slip').hide() ; } else { // alert('Nope.'); } } }); }); ~ ; $event_uploads = '' ; # $add_form_fields .= &common_min_form_label_col("Custom Set") ; my $custom_set_checked = ($db{$table}{$id}{custom_set}) ? "CHECKED" : "" ; $add_form_fields .= qq~
~ ; # class="control-label" # $add_form_fields .= &common_min_form_checkbox_col('custom_set','') ; $add_form_fields .= qq~
~ ; our %sec_cnt = ('a_event' => "50-List Expenses") ; my $sec = 'workings' ; my ($sec_name,$sec_cnt_workings,$sec_col) = &tab_sec_det($sec) ; $sec_name = "Demo Expenses" if $demo_page ; ; $ret_pdf_link_sec .= $sec . '+' . $sec_cnt_workings . '|' ; return if $ret ; &db_min_ro('event_cost_items','id,name,rates,full_half_day',"excl_from_expenses < 1 AND name NOT LIKE 'Mobile %' AND name NOT LIKE 'Fixed %' AND name NOT LIKE 'Cricket %'") ; our %event_list_name_array_expenses = () ; foreach my $iid (keys %{$db{event_cost_items}}) { $event_list_name_array_expenses{$iid} = $db{event_cost_items}{$iid}{name} ; } # &tab_load_vars ; if ($demo_page) { $lcol = 1; $fcol = 2; if ($db{$table}{$id}{currency}) { $selected{currency}{$db{$table}{$id}{currency}} = 'SELECTED' ; } else { $selected{currency}{ZAR} = 'SELECTED' ; } $opts{currency} = qq~ ~ ; $preferred_title{currency} = 'Currency' ; $allow_deselect{currency} = "" ; # $required{currency} = 1 ; # $required{roe} = 1 ; $req_glyph{currency} = qq~~ ; $req_glyph{roe} = qq~~ ; $add_form_fields .= &common_min_form_select('currency',$db{$table}{$id}{currency},1) ; # don't end row $trigger_jquery .= qq~\$("#selectCurrency_chosen").css( "width", "96%" );~ ; $preferred_title{roe} = ' ROE ' ; $fcol=1; # $fcol=2 ; $add_form_fields .= &common_min_form_label_col('roe') ; $db{$table}{$id}{roe} = 1 unless $db{$table}{$id}{roe} ; $add_form_fields .= &common_min_form_input_col('roe',$db{$table}{$id}{roe},1) ; $add_form_fields .= qq~~ ; } &event_tabs_build_sec($sec,$tab) ; foreach (sort keys %sec_cnt) { $_k = substr($_, 1) ; my @parts = split(/\-/, $sec_cnt{$_}) ; $add_form_fields .= qq~

$parts[1] :

~ if $parts[1] ne 'Operators'; $add_form_fields .= qq~

$parts[1] :

$icon_casuals
~ if $parts[1] eq 'Operators' ; &tab_build_qt_col_headers_workings("$sec$_k") ; # # # &db_min_ro('event_quotes_min', 'id, remarks_workings_event, supplier_workings_event, ref_nr_workings_event, qty_workings_event, amount_usd_workings_event, amount_workings_event, vat_workings_event, description_workings_event', "id = $id", '', '') if $id ; &event_tabs_build_costs_forms($db{event_quotes}{$id}{id},$tab,$parts[0],"$sec$_k") ; } $add_form_fields .= qq~
 
~ ; $add_form_fields .= qq~
 
~ ; my @ttlarr = ("sub_total", "vat_total", "grand_total") ; $lcol = 1; $fcol = 1; foreach (@ttlarr) { $lcol = 1; $add_form_fields .= &common_min_form_label_col($_) ; } $add_form_fields .= qq~
~ ; $trigger_jquery_raw .= qq~ \$("#textareaAdditional_notes").change(function () { if (\$(this).val()) { \$('label[for="additional_notes_expenses"]').text('Additional Notes : ') ; \$("#textareaAdditional_notes_expenses_input").html(\$(this).val()) ; } else if (!\$(this).val() && \$('label[for="additional_notes_expenses"]').text()) { \$('label[for="additional_notes_expenses"]').text('') ; \$("#textareaAdditional_notes_expenses_input").html('') ; } }) ; ~ ; my $add1 = ($db{$table}{$id}{additional_notes}) ? "Additional Notes : " : "" ; my $add2 = ($db{$table}{$id}{additional_notes}) ? "$db{$table}{$id}{additional_notes}" : "" ; $add_form_fields .= qq~

$add2

~ ; $lcol = 2; $add_form_fields .= &common_min_form_label_col('Total') ; $lcol = 1; if ($demo_page) { my @ttlarr = ("sub_total","vat_total","grand_total"); foreach (@ttlarr) { my $field_name = "$_\_workings_event" ; $readonly{$field_name} = "READONLY"; my $val = ($db{$table}{$id}{$field_name}) ? $db{$table}{$id}{$field_name} : '0.00' ; $add_form_fields .= &common_min_form_input_col($field_name,$val) ; } } else { my @ttlarr = ("total_amount_workings_event","total_vat_amount_workings_event","total_grand_amount_workings_event"); $lcol = 1 ; $fcol = 1 ; my %renamed_totals = ("total_amount_workings_event" => "sub_total_workings_event", "total_vat_amount_workings_event" => "vat_total_workings_event" , "total_grand_amount_workings_event" => "grand_total_workings_event") ; foreach (@ttlarr) { $readonly{$renamed_totals{$_}} = "READONLY"; $input_style{$renamed_totals{$_}} = qq~style="text-align:right;"~ ; my $val = $db{$table}{$id}{$_} ? $db{$table}{$id}{$_} : '0.00' ; $add_form_fields .= &common_min_form_input_col($renamed_totals{$_},$val) ; } } $add_form_fields .= qq~
~ ; $add_form_fields .= qq~
 
~ ; &event_tabs_content_box($sec_name,$sec_col) ; &event_tabs_build_forms_jquery(1) ; # --------------- END WORKING ---------------------------------------------------------------------------------------------------------------- } } #---------------------------------------------------------------------------------------- sub event_tabs_build_forms_jquery { my ($demo_page) = @_ ; my $description_options_costing = $opts{"description_costing_event_1"} ; $description_options_costing =~ s/\SELECTED//g ; $description_options_costing =~ s/\"/\'/g ; my $tab_name_part = "workings_event" ; my $description_options_workings = $opts{"description_$tab_name_part\_1"} ; $description_options_workings =~ s/\SELECTED//g ; $description_options_workings =~ s/\"/\'/g ; our $operator_options = $opts{"operator_$tab_name_part\_1"} ; $operator_options =~ s/\SELECTED//g ; $operator_options =~ s/\"/\'/g ; my $btn_ids_string = join(",",@btn_ids) ; my $excl_field_ids_string = join(",",@excl_field_ids) ; my $description_field_ids_string = join(",",@description_field_ids) ; my $operator_field_ids_string = join(",",@operator_field_ids) ; my $vat_field_ids_string = join(",",@vat_field_ids) ; my $qty_field_ids_string = join(",",@qty_field_ids) ; my $amount_usd_field_ids_string = join(",",@amount_usd_field_ids) ; $trigger_jquery_raw .= qq~ function get_tab (id) { let tab = "" ; if (id.includes("_workings_event")) { tab = "workings_event" ; } else if (id.includes("_costing_event")) { tab = "costing_event" ; } return tab ; } function changed_vat (id) { let tab = get_tab (id) ; let row_nr = get_row_nr(id) ; calc_totals(row_nr,tab) ; } function changed_others (id) { let row_nr = get_row_nr(id) ; let firstIndex = id.indexOf('_'); let col = id.substring(0,firstIndex); let tab = get_tab (id) ; if (col == "inputAmount") { let inp = parseFloat(\$("#"+id).val()) ; inp = parseFloat(inp) ; \$("#"+id).val(inp.toFixed(2)) ; } else if (\$("#selectDescription_"+tab+"_"+row_nr).val() && \$("#selectDescription_"+tab+"_"+row_nr).val() != 14 && \$("#selectOperator_"+tab+"_"+row_nr).val()) { // \$("#selectOperator_"+tab+"_"+row_nr).val("") ; // \$("#selectOperator_"+tab+"_"+row_nr).trigger("chosen:updated") ; } // else if (col == "selectOperator" && \$("#selectDescription"+tab+"_"+row_nr).val() != 14) { // } if (col == "selectOperator") { // || (col == "selectDescription" && \$("#selectDescription_"+tab+"_"+row_nr).val( return ; } calc_totals(row_nr,tab) ; } // \$("$vat_field_ids_string").change(function() { \$("#myTabContent").on("change","[id^='checkboxVat_']", function () { const id = this.id ; changed_vat(id) ; }) ; \$("#myTabContent").on("change","[id^='checkboxExcl_'],[id^='selectDescription_'],[id^='inputQty_'],[id^='inputAmount_usd_'],[id^='inputAmount_ttl_']", function () { // \$("$excl_field_ids_string,$description_field_ids_string,$qty_field_ids_string,$amount_usd_field_ids_string,$operator_field_ids_string").change(function() { const id = this.id ; changed_others(id) ; }) ; ~ ; my $event_quotes_jquery = qq~~ ; if (!$demo_page) { $event_quotes_jquery .= qq~ let profit_loss = parseFloat(\$("input[name='income']").val().replace(/,/g, '')) - parseFloat(\$("input[name='expenses']").val().replace(/,/g, '')) ; \$("input[name='profit_loss']").val(profit_loss.toFixed(2)) ; ~ ; } $trigger_jquery_raw .= qq~ \$("#myTabContent").on("click","[id^='btn_']", function () { // \$("$btn_ids_string").click(function () { const id = this.id ; let tab = get_tab (id) ; let row_nr = get_row_nr(id) ; \$("#"+tab+"_"+row_nr).show(); let row_html = "" ; if (tab == "workings_event") { row_html = add_quote_expenses_row(row_nr,tab,"$description_options_workings","$operator_options") ; } else if (tab == "costing_event") { row_html = add_quote_expenses_row(row_nr,tab,"$description_options_costing","") ; } \$("#"+tab+"_"+row_nr).html(row_html); // \$("#$suffix\_"+row_nr).trigger("chosen:updated") ; \$("#selectDescription_"+tab+"_"+row_nr).chosen({ allow_single_deselect:true }) ; if (tab == "workings_event") { \$("#selectOperator_"+tab+"_"+row_nr).chosen({ allow_single_deselect:true }); \$("#inputRemarks_"+tab+"_"+row_nr).css("text-align","") ; \$("#inputSupplier_"+tab+"_"+row_nr).css("text-align","") ; \$("#inputRef_nr_"+tab+"_"+row_nr).css("text-align","") ; } \$("#btn_"+tab+"_"+row_nr).hide(); var v = row_nr + 1 ; // \$("#btn_$suffix\_"+v).css("padding-left","16px") ; \$("#btn_"+tab+"_"+v).html("") ; \$("#btn_"+tab+"_"+v).show(); \$("#btn_row_"+tab+"_"+v).show() ; \$("#2_"+tab+"_"+row_nr).show() ; \$("#checkboxExcl_"+tab+"_"+row_nr).prop('checked',false) ; }); ~ if $btn_ids_string ; $trigger_jquery_raw .= qq~ \$("#selectCurrency").change(function () { }) ; \$("input[name='roe']").change(function () { let roe = \$(this).val() ; if (roe < 0 || !roe) { roe = 1 ; } \$(this).val(parseFloat(roe).toFixed(2)) ; var sub_total = 0 ; var vat_total = 0 ; var sub_total_quote = 0 ; var vat_total_quote = 0 ; [sub_total,vat_total] = add_up_totals("workings_event",50,roe,1) ; [sub_total_quote,vat_total_quote] = add_up_totals("costing_event",30,roe,1) ; // // // \$("input[name='income']").val((sub_total_quote+vat_total_quote).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})) ; // // // \$("input[name='expenses']").val((sub_total+vat_total).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})) ; \$("input[name='income']").val((sub_total_quote+vat_total_quote).toFixed(2)) ; \$("input[name='expenses']").val((sub_total+vat_total).toFixed(2)) ; update_overall_totals(sub_total,vat_total,"workings_event") ; update_overall_totals(sub_total_quote,vat_total_quote,"costing_event") ; }) ; function add_up_totals (tab,nr_of_rows,roe,recalc_totals) { let sub_total = 0 ; let vat_total = 0 ; for (let i=1; i<=nr_of_rows; i++) { if (!\$("#"+tab+"_"+i).html()) { break ; } if (\$("#selectDescription_"+tab+"_"+i).val()) { if (\$("#checkboxExcl_"+tab+"_"+i).is(":checked")) { continue ; } let ttl = 0 ; if (recalc_totals) { ttl = parseFloat(\$("#inputAmount_usd_"+tab+"_"+i).val()) * parseFloat(\$("#inputQty_"+tab+"_"+i).val()) * parseFloat(roe) ; } else { ttl = parseFloat(\$("#inputAmount_ttl_"+tab+"_"+i).val().replace(/,/g, '')) } // // // // \$("#inputAmount_ttl_"+tab+"_"+i).val(ttl.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})) ; \$("#inputAmount_ttl_"+tab+"_"+i).val(ttl.toFixed(2)) ; if (!\$("#inputAmount_ttl_"+tab+"_"+i).val() || \$("#inputAmount_ttl_"+tab+"_"+i).val() == "NaN") { \$("#inputAmount_ttl_"+tab+"_"+i).val("0.00") ; ttl = 0 ; } sub_total += ttl ; if (\$("#checkboxVat_"+tab+"_"+i).is(":checked")) { vat_total += ttl*0.15 ; } } else if (!\$("#checkboxExcl_"+tab+"_"+i).is(":checked")) { \$("#checkboxExcl_"+tab+"_"+i).prop('checked',true) ; } } return [sub_total,vat_total] ; } // function getNum(val) { // if (isNaN(val)) { // return 0; // } // return val; // } function calc_totals (row_cnt,tab) { var qty = \$("#inputQty_"+tab+"_"+row_cnt) ; var usd = \$("#inputAmount_usd_"+tab+"_"+row_cnt) ; var conv = \$("#inputAmount_ttl_"+tab+"_"+row_cnt) ; var excl = \$("#checkboxExcl_"+tab+"_"+row_cnt) ; var item = \$("#selectDescription_"+tab+"_"+row_cnt) ; if (!usd.val() && !conv.val() && !usd.val()) { // console.log("skip calc_totals_workings") ; if (!item.val()) { excl.prop("checked",true) ; } return ; } var vat = \$("#checkboxVat_"+tab+"_"+row_cnt) ; if (!item.val()) { excl.prop("checked",true) ; vat.prop("checked",true) ; qty.val("") ; usd.val("") ; conv.val(""); if (tab == "workings_event") { var rem = \$("#inputRemarks_"+tab+"_"+row_cnt) ; var sup = \$("#inputSupplier_"+tab+"_"+row_cnt) ; var ref = \$("#inputRef_nr_"+tab+"_"+row_cnt) ; var op = \$("#selectOperator_"+tab+"_"+row_cnt) ; rem.val("") ; sup.val("") ; ref.val("") ; op.val("") ; op.trigger("chosen:updated") ; } } else if (excl.is(":checked") && item.val() && conv.val() == "0.00") { excl.prop("checked",false) ; } if (!\$("#inputRoe").val()) { \$("#inputRoe").val(1) ; } let roe = parseFloat(\$("#inputRoe").val()) ; let ttl = usd.val() * qty.val() * roe ; // // // conv.val(ttl.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})) ; conv.val(ttl.toFixed(2)) ; let sub_total = 0 ; let vat_total = 0 ; let nr_of_rows = 50 ; if (tab == "costing_event") { nr_of_rows = 30 ; } [sub_total,vat_total] = add_up_totals (tab,nr_of_rows,roe,0) ; console.log("add_up_totals : "+sub_total) ; if (tab == "workings_event") { // // // \$("input[name='expenses']").val((sub_total+vat_total).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})) ; \$("input[name='expenses']").val((sub_total+vat_total).toFixed(2)) ; update_overall_totals(sub_total,vat_total,tab) ; } else { // // // \$("input[name='income']").val((sub_total+vat_total).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})) ; \$("input[name='income']").val((sub_total+vat_total).toFixed(2)) ; update_overall_totals(sub_total,vat_total,tab) ; // update_overall_totals_costings(sub_total,vat_total) ; } } function update_overall_totals (sub_total,vat_total,tab) { $event_quotes_jquery // // // \$("input[name='profit_loss']").val(profit_loss.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})) ; // // // \$("input[name='sub_total_"+tab+"']").val(sub_total.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})) ; // // // \$("input[name='vat_total_"+tab+"']").val(vat_total.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})) ; // // // \$("input[name='grand_total_"+tab+"']").val((sub_total+vat_total).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})) ; \$("input[name='sub_total_"+tab+"']").val(sub_total.toFixed(2)) ; \$("input[name='vat_total_"+tab+"']").val(vat_total.toFixed(2)) ; \$("input[name='grand_total_"+tab+"']").val((sub_total+vat_total).toFixed(2)) ; } function add_quote_expenses_row (row_nr,tab,options1,options2) { let tindex = $tindex ; tindex = parseInt(tindex) ; row_nr = parseInt(row_nr) ; tindex = tindex - 10*(1+50-row_nr) ; let row = add_checkbox(row_nr,"excl_"+tab+"_"+row_nr,"checkboxExcl_"+tab+"_"+row_nr,tindex,1) ; tindex++ ; row = row+add_select(row_nr,"description_"+tab+"_"+row_nr,"selectDescription_"+tab+"_"+row_nr,"Select Description "+row_nr,options1,tindex,2,90,'','') ; tindex++ ; if (tab == "workings_event") { row = row+add_select(row_nr,"operator_workings_event_"+row_nr,"selectOperator_"+tab+"_"+row_nr,"Select Operator "+row_nr,options2,tindex,2,90,'','') ; tindex++ ; row = row+add_input(row_nr,"remarks_workings_event_"+row_nr,"inputRemarks_"+tab+"_"+row_nr,"Remarks "+row_nr,tindex,'',1) ; tindex++ ; row = row+add_input(row_nr,"supplier_workings_event_"+row_nr,"inputSupplier_"+tab+"_"+row_nr,"Supplier "+row_nr,tindex,'',1) ; tindex++ ; row = row+add_input(row_nr,"ref_nr_workings_event_"+row_nr,"inputRef_nr_"+tab+"_"+row_nr,"Ref Nr "+row_nr,tindex,'',1) ; tindex++ ; } row = row+add_input(row_nr,"qty_"+tab+"_"+row_nr,"inputQty_"+tab+"_"+row_nr,"Qty "+row_nr,tindex,'',1) ; tindex++ ; row = row+add_input(row_nr,"amount_usd_"+tab+"_"+row_nr,"inputAmount_usd_"+tab+"_"+row_nr,"Amount "+row_nr,tindex,'',1) ; tindex++ ; row = row+add_input(row_nr,"amount_ttl_"+tab+"_"+row_nr,"inputAmount_ttl_"+tab+"_"+row_nr,"Total Amount "+row_nr,tindex,"readonly",1) ; tindex++ ; row = row+add_checkbox(row_nr,"vat_"+tab+"_"+row_nr,"checkboxVat_"+tab+"_"+row_nr,tindex,1) ; tindex++ ; return row ; } ~ ; } #------------------------------------------------------------------------------------------ sub build_boxes_right { my ($id,$tab) = @_ ; tab_build_qt_right($id,$tab) ; } #---------------------------------------------------------------------------------------- sub view_screen { &edit_screen ; } #------------------------------------------------------------------------------------------ sub edit_screen { unless ($i{id}) { $warning = qq(NO ID) ; return ; } our ($lcol,$fcol) = &common_min_columns($label_col,$field_col) ; # called from common_add_screen &select_opts($i{id}) ; our $savjqy = 1 ; # incorporate jquery into the save event to accommodate the multiple chosen options &build_boxes_edit($i{id}) ; &common_min_extra_crumb("search-$lcpage\s","Search Screen") ; } #------------------------------------------------------------------------------------------ sub build_boxes_bottom { my ($id) = @_ ; our ($lcol,$fcol) = &common_min_columns(2,2) ; $add_form_fields = '' ; # --------------- START GRAND TOTAL ---------------------------------------------------------------------------------------------------------------------- $print_box_content_rows .= &common_min_form_input('activetab',$db{$table}{$id}{activetab},'hidden') ; # --------------- END RAND TOTAL ------------------------------------------------------------------------------------------------------------------------ } #---------------------------------------------------------------------------------------- sub build_boxes_top { my ($id) = @_ ; &event_tabs_build_boxes_top($id,1) ; } #---------------------------------------------------------------------------------------- sub build_extra_name_row_1 { my ($row_cnt,$display) = @_ ; my $count_dates_in_first_extra_row = 0 ; $display = ($display) ? "style='display:none;'" : "" ; my $extra_row_hearders_1 = qq~
~ ; for (1 .. 20) { $count_dates_in_first_extra_row++ if $days_active_arr[$_ - 1] ; $date_is_displayed_in_first_extra_row{$_} = 1 if $days_active_arr[$_ - 1] && $count_dates_in_first_extra_row <= 10 ; $extra_row_hearders_1 .= ($days_active_arr[$_ - 1] && $count_dates_in_first_extra_row <= 10 && $some_row_has_daily_op_1) ? qq~
~ : qq~~ ; } $extra_row_hearders_1 .= qq~
~ ; return $extra_row_hearders_1 ; } #---------------------------------------------------------------------------------------- sub build_extra_name_row_2 { my ($row_cnt,$display) = @_ ; $display = ($display) ? "style='display:none;'" : "" ; my $extra_row_hearders_2 = qq~
~ ; for (11 .. 20) { $extra_row_hearders_2 .= ($some_row_has_daily_op_2 && $days_active_arr[$_ - 1] && !$date_is_displayed_in_first_extra_row{$_}) ? qq~
~ : qq~~ ; } $extra_row_hearders_2 .= qq~
~ ; return $extra_row_hearders_2; } #---------------------------------------------------------------------------------------- sub build_system_name_form { my ($system_ids,$club_ids,$op_ids,$quote_accepted,$quote_rejected,$quote_cancelled,$quote_completed) = @_ ; my @system_name_ids = split(/\;/,$system_ids) ; my @club_ids = split(/\;/,$club_ids) ; # our @days_active_arr = split(/\;/,$days_active) ; my @table_op_ids = ($op_ids =~ /;/) ? split(/\;/,$op_ids) : split(/\,/,$op_ids) ; local $system_count = 0 ; local $system_day_cnt = 0 ; my %row_has_daily_op = () ; my $some_row_has_daily_op = 0 ; our $some_row_has_daily_op_1 = 0 ; our $some_row_has_daily_op_2 = 0 ; my $active_days_count = 0 ; foreach my $row (split(/\|/,$daily_operator_ids)) { $system_count++ ; next unless $row ; $system_day_cnt = 0 ; foreach my $default_op (split(/\;/,$row)) { $system_day_cnt++ ; # next if !$days_active_arr[$system_day_cnt-1] ; # $active_days_count++ ; # $default_op_ids{$system_count}{$system_day_cnt} = $default_op if $default_op ; } } # $active_days_count = 0 ; my $total_days = 0 ; # foreach (@days_active_arr) { # $active_days_count++ if $_ ; # $total_days++ ; # } # $some_row_has_daily_op = 0 if $active_days_count > 6 ; $fcol = 2 ; $lcol = 2 ; # $dlg_add_club = ($glod_user_level < 3 && ($quote_accepted || $quote_rejected || $quote_cancelled)) ? '
' : qq~
~ ; $dlg_add_club = ((($quote_accepted || $quote_rejected || $quote_cancelled) && $glod_user_level < 3) || ($quote_completed && $glod_user_level <= 3)) ? '
' : qq~
~ ; # if ($glod_user_level > 2 || ($glod_user_level < 3 && ($quote_accepted || $quote_rejected || $quote_cancelled))) { $add_form_fields .= qq~
$dlg_add_club
~ ; our %date_is_displayed_in_first_extra_row = () ; # if ($active_days_count <= 6) { # for (1 .. 20) { # $add_form_fields .= ($some_row_has_daily_op && $days_active_arr[$_ - 1]) ? qq~
~ : ($some_row_has_daily_op && !$days_active_arr[$_ - 1] && $final_day >= $_) ? qq~~ : # qq~~ ; # } # $add_form_fields .= qq~~ ; # } else { # for (1 .. 20) { # $add_form_fields .= qq~~ ; # } # $add_form_fields .= qq~~ ; # } my $note_display_butt = qq~~ ; my $system_name_id = "" ; my $club_name_id = "" ; my @plus_button_ids = () ; my @event_system_ids = () ; my @event_club_ids = () ; my @event_operator_ids = () ; my @overall_op_ids = () ; my @table_system_name_ids = () ; my @table_club_name_ids = () ; my @table_operator_calibration_ids = () ; my $old_op_opts = $opts{operator_ids} ; $opts{operator_ids} =~ s/\SELECTED//g ; for my $row_cnt (1 .. $nr_of_system_names_and_clubs) { my $select_sys_name = 0 ; my $select_club_name = 0 ; $add_form_fields .= qq~~ if $row_cnt > 1 and not $system_name_ids[$row_cnt - 1] and not $club_ids[$row_cnt - 1] ; $add_form_fields .= qq~
~ if $row_cnt == 1 or $system_name_ids[$row_cnt - 1] or $club_ids[$row_cnt - 1] ; push @plus_button_ids,"#btn_system_name_$row_cnt" ; my $input_fields_dates_1 = qq~~ ; my $input_fields_1 = qq~~ ; my $input_fields_dates_2 = qq~~ ; my $input_fields_2 = qq~~ ; if ($row_cnt == 1 || $row_has_daily_op{$row_cnt} || $system_name_ids[$row_cnt - 1] || $club_ids[$row_cnt - 1]) { # if ($glod_user_level < 3 && ($quote_accepted || $quote_rejected || $quote_cancelled)) { if ((($quote_accepted || $quote_rejected || $quote_cancelled) && $glod_user_level < 3) || ($quote_completed && $glod_user_level <= 3)) { $system_name_id = "inputSystem_name_" ; $club_name_id = "inputClub_name_" ; $readonly{"system_name_$row_cnt"} = "READONLY" ; $readonly{"club_name_$row_cnt"} = "READONLY" ; $readonly{"operator_id_calibration_$row_cnt"} = "READONLY" ; $add_form_fields .= qq~
~ ; $add_form_fields .= qq~
~ ; $fcol = 4 ; $add_form_fields .= &common_min_form_input_col("system_name_$row_cnt",$db{event_systems}{$system_name_ids[$row_cnt - 1]}{name}) ; $add_form_fields .= &common_min_form_input_col("club_name_$row_cnt",$db{clubs}{$club_ids[$row_cnt - 1]}{name}) ; $add_form_fields .= &common_min_form_input_col("operator_id_calibration_$row_cnt",$db{users}{$table_op_ids[$row_cnt - 1]}{name}) ; $add_form_fields .= qq~
~ ; } else { $system_name_id = "selectSystem_name_" ; $club_name_id = "selectClub_name_" ; $op_name_id = "selectOperator_id_calibration_" ; push @event_system_ids,"#$system_name_id$row_cnt\_chosen" ; push @event_club_ids,"#$club_name_id$row_cnt\_chosen" ; push @event_operator_ids,"#$op_name_id$row_cnt\_chosen" ; push @overall_op_ids,"#selectOperator_id_calibration_$row_cnt" ; $opts{"system_name_$row_cnt"} = $opts{event_system_id} ; $opts{"club_name_$row_cnt"} = $opts{club_ids} ; $opts{"operator_id_calibration_$row_cnt"} = $opts{operator_ids} ; # $allow_deselect{"system_name_$row_cnt"} = 1 ; $allow_deselect{"club_name_$row_cnt"} = 1 ; $allow_deselect{"operator_id_calibration_$row_cnt"} = 1 ; my $sys_name_id = $system_name_ids[$row_cnt - 1] ; if ($sys_name_id) { $trigger_jquery_raw .= qq~\$("#selectSystem_name_$row_cnt").val('$sys_name_id') ; \$("#selectSystem_name_$row_cnt").trigger("chosen:updated") ; ~ ; } else { push @table_system_name_ids,"#selectSystem_name_$row_cnt" ; } my $club_id = $club_ids[$row_cnt - 1] ; if ($club_id) { $trigger_jquery_raw .= qq~\$("#selectClub_name_$row_cnt").val('$club_id') ; \$("#selectClub_name_$row_cnt").trigger("chosen:updated") ; ~ ; } else { push @table_club_name_ids,"#selectClub_name_$row_cnt" ; } my $op_id = $table_op_ids[$row_cnt - 1] ; $preferred_title{"operator_id_calibration_$row_cnt"} = "Operator $row_cnt" ; $fcol = 4 ; $add_form_fields .= qq~
~ ; $add_form_fields .= qq~
~ ; $add_form_fields .= &common_min_form_select_col("system_name_$row_cnt",$system_name_ids[$row_cnt - 1]) if $row_cnt == 1 ; $add_form_fields .= &common_min_form_select_col("system_name_$row_cnt",'') if $row_cnt > 1 ; $add_form_fields .= &common_min_form_select_col("club_name_$row_cnt",$club_ids[$row_cnt - 1]) if $row_cnt == 1 ; $add_form_fields .= &common_min_form_select_col("club_name_$row_cnt",'') if $row_cnt > 1 ; $add_form_fields .= &common_min_form_select_col("operator_id_calibration_$row_cnt",'') ; $add_form_fields .= qq~
~ ; $fcol = 2 ; my $clicked_op_butt = ($row_has_daily_op{$row_cnt}) ? qq~value="1"~ : qq~~ ; if (!$row_has_daily_op{$row_cnt} && $op_id) { $trigger_jquery_raw .= qq~\$("#selectOperator_id_calibration_$row_cnt").val('$op_id') ; \$("#selectOperator_id_calibration_$row_cnt").trigger("chosen:updated") ; ~ ; } else { push @table_operator_calibration_ids,"#selectOperator_id_calibration_$row_cnt" ; } for (1 .. 20) { push @daily_op_ids,"#selectCustom_operator_$row_cnt\_$_" ; } if ($active_days_count <= 6) { } else { } $select_sys_name = $system_name_ids[$row_cnt] ; $select_sys_name = '' unless $select_sys_name ; } $add_form_fields .= qq~
~ ; } # $add_form_fields .= ($active_days_count > 6 && $some_row_has_daily_op_1 && ($row_cnt == 1 || $row_has_daily_op{$row_cnt} || $system_name_ids[$row_cnt - 1] || $club_ids[$row_cnt - 1] || $table_op_ids[$row_cnt - 1])) ? qq~
 
~ : qq~~ ; $note_display_butt = '' ; # if ($glod_user_level < 3 && ($quote_accepted || $quote_rejected || $quote_cancelled)) { if ((($quote_accepted || $quote_rejected || $quote_cancelled) && $glod_user_level < 3) || ($quote_completed && $glod_user_level <= 3)) { $note_display_butt = qq~display:none;~ ; } else { if ($row_cnt > 1 and not $system_name_ids[$row_cnt-1] and not $club_ids[$row_cnt-1]) { $note_display_butt = qq~display:none;~ ; } if ($system_name_ids[$row_cnt] or $club_ids[$row_cnt]) { $note_display_butt = qq~display:none;~ ; } $add_form_fields .= qq~
~ ; } } $opts{operator_ids} = $old_op_opts ; my $table_system_name_ids_string = join(",",@table_system_name_ids) ; my $table_club_name_ids_string = join(",",@table_club_name_ids) ; my $table_operator_calibration_ids_string = join(",",@table_operator_calibration_ids) ; my @all_table_ids = () ; push @all_table_ids,$table_system_name_ids_string if $table_system_name_ids_string ; push @all_table_ids,$table_club_name_ids_string if $table_club_name_ids_string ; push @all_table_ids,$table_operator_calibration_ids_string if $table_operator_calibration_ids_string ; my $all_table_ids_string = join(",",@all_table_ids) ; $trigger_jquery_raw .= qq~ \$("$all_table_ids_string").val('') ; \$("$all_table_ids_string").trigger("chosen:updated") ; ~ if $all_table_ids_string ; my $plus_button_ids_string = join(",",@plus_button_ids) ; # if ($glod_user_level < 3 && ($quote_accepted || $quote_rejected || $quote_cancelled)) { if ((($quote_accepted || $quote_rejected || $quote_cancelled) && $glod_user_level < 3) || ($quote_completed && $glod_user_level <= 3)) { } else { my $system_name_options = &fix_options_for_javascript($opts{"system_name_1"}) ; my $club_name_options = &fix_options_for_javascript($opts{"club_name_1"}) ; our $operator_options = &fix_options_for_javascript($opts{"operator_id_calibration_1"}) ; my $event_system_ids_string = join(",",@event_system_ids) ; my $event_club_ids_string = join(",",@event_club_ids) ; my $event_operator_ids_string = join(",",@event_operator_ids) ; my $daily_op_ids_string = join(",",@daily_op_ids) ; my $overall_op_ids_string = join(",",@overall_op_ids) ; $trigger_jquery .= qq~\$("$event_system_ids_string,$event_club_ids_string").css("width","100%");~ ; $trigger_jquery .= qq~\$("$event_operator_ids_string").css("width","100%");~ ; my $table_plus_button_ids_string = join (",",@table_plus_button_ids) ; # $table_plus_button_ids_string = "#selectCustom_operator_1_1,#selectCustom_operator_1_3,#selectCustom_operator_1_2" ; # $table_plus_button_ids_string = "#selectCustom_operator_1_1,#selectCustom_operator_1_3,#selectCustom_operator_1_2" ; $trigger_jquery_raw .= qq~ function get_row_nr (id) { let lastIndex = id.lastIndexOf('_'); lastIndex = parseInt(lastIndex) ; let row_nr = id.substring(1+lastIndex); row_nr = parseInt(row_nr) ; return row_nr ; } function add_checkbox (row_nr,field_name,field_id,tindex,fcol) { let checkbox = "
" ; return checkbox ; } function add_input (row_nr,field_name,field_id,placeholder,tindex,readonly,fcol) { let input = "
" ; return input ; } function add_select (row_nr,field_name,field_id,placeholder,options,tindex,fcol,width,div_id,hide_div) { let select = "
" ; select = select + add_select_raw(row_nr,field_name,field_id,placeholder,options,tindex,width) ; select = select + "
" ; return select ; } function add_select_raw (row_nr,field_name,field_id,placeholder,options,tindex,width) { let select_raw = "
" ; return select_raw ; } function add_event_system_extra_row (row_cnt,nr_of_active_days) { } function add_event_system_row (row_cnt,nr_of_active_days) { let new_row = "
" ; new_row = new_row + add_select (row_cnt,"system_name_"+row_cnt,"selectSystem_name_"+row_cnt,"Select System Name "+row_cnt,"$system_name_options",-1,4,100,'','') ; new_row = new_row + add_select (row_cnt,"club_name_"+row_cnt,"selectClub_name_"+row_cnt,"Select Club Name "+row_cnt,"$club_name_options",-1,4,100,'','') ; new_row = new_row + add_select (row_cnt,"operator_id_calibration_"+row_cnt,"selectOperator_id_calibration_"+row_cnt,"Select Operator "+row_cnt,"$operator_options",-1,4,100,'','') ; // let glod_user_level = parseInt("$glod_user_level") ; // if (glod_user_level < 3) { return new_row ; } // new_row = new_row +"
" ; // let extra_row_1,extra_row_2,extra_name_row_1,extra_name_row_2 ; // // if (nr_of_active_days <= 6) { // for (let col=1; col<=20; col++) { // // if (\$("#day_"+col).val()) { // // new_row = new_row + add_select (row_cnt,"custom_operator_"+row_cnt+"_"+col,"selectCustom_operator_"+row_cnt+"_"+col,"Select an Option","$operator_options",-1,1,100,"id='day_"+row_cnt+"_"+col+"'","style='display:none;'") ; // // } else { // new_row = new_row + "" ; // // } // } // new_row = new_row+"" ; // extra_row_1 = "