aisa/libs/modules/common.pm
2025-11-26 11:31:54 +02:00

1913 lines
69 KiB
Perl
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

use common_min ;
sub common_upload_files {
my ($folder) = @_ ;
for my $p ($q->param) {
if (substr($p,0,7) eq 'iattach') {
next if $ignore_attach{$p} ;
my $val = $q->param($p) ;
my $fol = substr($p,7) ;
&common_upload_file($val,$p,$fol,$folder) ;
}
}
} #------------------------------------------------------------------------------------------
sub common_append_log {
my ($log,$nline) = @_ ;
unless ($log) { return ; }
if (substr($now_min,0,1)==3) { &common_large_log($log,$nline) ; return ; } # run on 30 min for 10 min
$nline =~ s/[ ]+/ /g ; # Replaces all occurances of two spaces with one space
# my $serverpath = (substr($ENV{SERVER_NAME},0,6) eq 'client') ? 'gwtruckassist' : 'gatewaytruckassa' ;
my $logfile = "/home/libs/data/logs/$log";
open (LFILE, ">>$logfile") or die "can't open $logfile : $!" ;
flock (LFILE, LOCK_EX) or die "can't lock $logfile : $!" ;
print LFILE $nline . "\n" ;
close (LFILE) ;
} #----------------------------------------------------------------------------------------
sub common_large_log {
my ($log,$nline) = @_ ;
unless ($log) { return ; }
$nline =~ s/[ ]+/ /g ; # Replaces all occurances of two spaces with one space
$nline =~ s/\n/ /g ; # substitutes a whitespace (\t\n\r\f) by a nothing - ie : removes all CR / LF etc
$nline =~ s/\t/ /g ; # substitutes a whitespace (\t\n\r\f) by a nothing - ie : removes all CR / LF etc
$nline =~ s/\r/ /g ; # substitutes a whitespace (\t\n\r\f) by a nothing - ie : removes all CR / LF etc
my $logfile = "/home/libs/data/logs/$log";
open (LFILE, "+>>$logfile") or die "can't open $logfile : $!" ;
flock (LFILE, LOCK_EX) or die "can't lock $logfile : $!" ;
seek (LFILE, 0, 0) or die "can't rewind $logfile : $!" ;
@lines = <LFILE> ;
seek (LFILE, 0, 0) or die "can't rewind $logfile : $!" ;
truncate (LFILE, 0) or die "can't truncate $logfile : $!" ;
my @sort_lines = reverse sort @lines ; # put newest ones first
my $log_cnt = 0 ;
print LFILE $nline . "\n" ;
foreach my $line (@sort_lines) { # 20181109104451||||
chomp $line;
@linex = split(/\|/,$line);
# my $hashkey = $linex[2] . $linex[3] . $linex[4] . substr($linex[5],0,12) ;
my $hashkey = $linex[2] . $linex[3] . $linex[4] . substr($linex[0],0,8) ;
if ($done_log_line{$hashkey}) { next ; }
if ($log_cnt > 10000) { last ; } # only retain 10000 lines
print LFILE "$line\n";
$done_log_line{$hashkey} = 1 ;
$log_cnt++;
}
close (LFILE) ;
} #----------------------------------------------------------------------------------------
sub common_write_log {
my ($log,$nline) = @_ ;
unless ($log) { return ; }
$nline =~ s/\n//g ; # substitutes a whitespace (\t\n\r\f) by a nothing - ie : removes all CR / LF etc
$nline =~ s/\t//g ; # substitutes a whitespace (\t\n\r\f) by a nothing - ie : removes all CR / LF etc
$nline =~ s/\r//g ; # substitutes a whitespace (\t\n\r\f) by a nothing - ie : removes all CR / LF etc
$nline =~ s/\f//g ; # substitutes a whitespace (\t\n\r\f) by a nothing - ie : removes all CR / LF etc
$nline =~ s/[ ]+/ /g ; # Replaces all occurances of two spaces with one space
$nline =~ s/> </></g ; # Replaces '> <' with '><'
# my $serverpath = (substr($ENV{SERVER_NAME},0,6) eq 'client') ? 'gwtruckassist' : 'gatewaytruckassa' ;
my $logfile = "/home/libs/data/logs/$log";
open (LFILE, "+>>$logfile") or die "can't open $logfile : $!" ;
flock (LFILE, LOCK_EX) or die "can't lock $logfile : $!" ;
seek (LFILE, 0, 0) or die "can't rewind $logfile : $!" ;
@lines = <LFILE> ;
seek (LFILE, 0, 0) or die "can't rewind $logfile : $!" ;
truncate (LFILE, 0) or die "can't truncate $logfile : $!" ;
my @sort_lines = reverse sort @lines ; # put newest ones first
my $log_cnt = 0 ;
print LFILE $nline . "\n" ;
foreach my $line (@sort_lines) { # 20181109104451||||
chomp $line;
@linex = split(/\|/,$line);
if ($log_cnt > 5000) { last ; } # only retain 5000 lines
print LFILE "$line\n";
$log_cnt++;
}
close (LFILE) ;
} #----------------------------------------------------------------------------------------
sub common_upload_file {
my ($filename,$param,$type,$folder) = @_ ;
unless ($filename) { return ; }
$CGI::POST_MAX = 1024 * 5000;
# my $safe_filename_characters = "a-zA-Z0-9_.-";
my $upload_dir = ($upload_files_to_sss) ? "$htmlpath_sss/uploads/$folder" : "$htmlpath/uploads/$folder";
mkdir $upload_dir unless -d $upload_dir ;
# my ($name,$path,$extension) = fileparse ($filename, '..*') ;
# $filename = $name . $extension;
# $filename =~ tr/ /_/;
# $filename =~ s/[^$safe_filename_characters]//g;
# if ( $filename =~ /^([$safe_filename_characters]+)$/ ) { $filename = "$type-$1" ; } else { die "Filename contains invalid characters" ; }
$filename = &common_process_uploaded_file_names($filename,$type) ;
$uploads_hash{$type}{$filename} = 1 if $type ;
$uploads_file{$type} = $filename if $type ;
if (($testing == 1) and ($username eq 'rory')) { &common_debug("Upload $type - $filename") ; return; }
my $upload_filehandle = $q->upload($param) ;
open ( UPLOADFILE, ">$upload_dir/$filename" ) or die "can't open $upload_dir/$filename: $!" ;
flock (UPLOADFILE, LOCK_EX) or die "can't lock $upload_dir/$filename: $!" ;
binmode UPLOADFILE or die "$!" ;
while ( <$upload_filehandle> ) {
print UPLOADFILE ;
}
close UPLOADFILE;
# my ($filename,$param,$type,$folder) = @_ ;
# unless ($filename) { return ; }
# $CGI::POST_MAX = 1024 * 5000;
# my $safe_filename_characters = "a-zA-Z0-9_.-";
# my $upload_dir = "$htmlpath/uploads/$folder";
# mkdir $upload_dir unless -d $upload_dir ;
# my ($name,$path,$extension) = fileparse ($filename, '..*') ;
# $filename = $name . $extension;
# $filename =~ tr/ /_/;
# $filename =~ s/[^$safe_filename_characters]//g;
# if ( $filename =~ /^([$safe_filename_characters]+)$/ ) {
# $filename = $type . '_' . $now_ccyymmdd . $now_hour . $now_min . $now_sec . '_' . $1 ;
# }
# else
# {
# die "Filename contains invalid characters" ;
# }
# my $upload_filehandle = $q->upload($param) ;
# open ( UPLOADFILE, ">$upload_dir/$filename" ) or die "can't open $upload_dir/$filename $!" ;
# flock (UPLOADFILE, LOCK_EX) or die "can't lock $upload_dir/$filename: $!" ;
# binmode UPLOADFILE or die "$!" ;
# while ( <$upload_filehandle> ) {
# print UPLOADFILE ;
# }
# close UPLOADFILE;
} #------------------------------------------------------------------------------------------
sub common_process_uploaded_file_names {
my ($filename,$type) = @_ ;
my $safe_filename_characters = "a-zA-Z0-9_.-";
my ($name,$path,$extension) = fileparse ($filename, '..*') ;
$filename = $name . $extension;
$filename =~ tr/ /_/;
$filename =~ s/[^$safe_filename_characters]//g;
if ($filename =~ /^([$safe_filename_characters]+)$/ && $type) {
$filename = "$type-$1" ;
} elsif ($filename =~ /^([$safe_filename_characters]+)$/ && !$type) {
$filename = "$1" ;
} else {
die "Filename contains invalid characters" ;
}
return ($filename) ;
} #------------------------------------------------------------------------------------------
sub common_get_field_uploads {
my ($id,$type,$folder,$custom_delete_attach_id) = @_ ;
unless ($id and $type) { return() ; }
my $uploads = '' ; my %uploads = () ;
my $field = $type ; my ($doctype,$num) = split(/\_/,$field) ; $doctype .= 's' ;
$table = $doctype unless $table ;
my $doc = $db{$table}{$id}{$field} ;
&common_debug("$doc") ;
if ($doc){
my $tooltip = qq~data-toggle="tooltip" data-placement="top" data-title="$doc"~ ;
my @docarr = split(/\./,$doc); my $ext = pop @docarr ; my $file = pop @docarr ;
my $dlg_title = uc substr($doc,0,6) . 'ED ' . $ext ; ## UPLOADED ...
$file_cnt++ ;
my $delete_attach_id = ($custom_delete_attach_id) ? $custom_delete_attach_id : "delete-attach-$id-$file_cnt" ;
my $test_icon_loc = qq~$htmlpath/img/icons/doc/$ext.png~;
my $icon_loc = qq~/img/icons/doc/$ext.png~; $icon_loc = qq~/img/icons/doc/def.png~ unless -f $test_icon_loc ;
# $uploads{$type} .= qq~<a id="attach-$tag_id-$file_cnt" style='margin-left:10px;' $tooltip href="javascript:dlgMdl('/uploads/$doctype/$db{$table}{$id}{$folder}/$doc','$dlg_title','','max-dialog');"><img src='/img/icons/doc/$ext.png' style='width:40px;height:40px;'></a><a href="javascript:void(0);" id="delete-attach-$id-$file_cnt"><i class="glyphicon glyphicon-trash"></i></a>~ ;
$uploads{$type} .= qq~<a id="attach-$id-$file_cnt" style='margin-left:10px;' $tooltip href="javascript:dlgMdl('/uploads/$doctype/$db{$table}{$id}{$folder}/$doc','$dlg_title','','max-dialog');"><img src='$icon_loc' style='width:30px;height:30px;'></a><a href="javascript:void(0);" id="$delete_attach_id"><i class="glyphicon glyphicon-trash"></i></a>~ ;
$trigger_jquery_raw .= qq(\$('#delete-attach-$id-$file_cnt').click(function (e) {
BootstrapDialog.confirm({
title: 'Confirm Delete',
message: 'Are you sure you want to delete <strong>$doc</strong>?',
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?$doctype/$db{$table}{$id}{$folder}&$doc&$table&$id&$field" ;
\$.get(url);
\$('#attach-$id-$file_cnt').hide() ;
\$('#delete-attach-$id-$file_cnt').hide() ;
} else {
// alert('Nope.');
}
}
});
});) unless $custom_delete_attach_id ;
# $uploads .= qq~<a id="attach-$tag_id-$file_cnt" style='margin-left:10px;' href="javascript:dlgMdl('/uploads/$doctype\s/$db{$table}{$id}{$folder}/$db{$table}{$id}{$field}','$dlg_title','','max-dialog');"><img src='/img/icons/doc/$ext.png' style='width:40px;height:40px;'></a><a href="javascript:void(0);" id="delete-attach-$tag_id-$file_cnt"><i class="glyphicon glyphicon-trash"></i></a>~;
}
if ($uploads{$type}) { $uploads = $uploads{$type} ; }
return ($uploads) ;
} #------------------------------------------------------------------------------------------
sub common_get_uploads {
my ($id,$type) = @_ ;
unless ($id and $type) { return() ; }
my $upload_dir = "$htmlpath/uploads/$id";
&common_debug("$upload_dir") ;
unless (-e $upload_dir) { return ; }
my $uploads = '' ;
opendir(DIR, "$upload_dir") or die "cant open directory $upload_dir: $!\n";
while(defined($folder = readdir(DIR))) {
if ($type ne 'all') { unless ((substr($folder,0,4) eq $type) or (substr($folder,0,5) eq $type)) { next ; } }
if (length($folder) > 2) {
my @docarr = split(/\./,$folder); my $ext = pop @docarr ; my $file = pop @docarr ;
my $dlg_title = uc substr($folder,0,4) . ' ' . $ext ; if (substr($folder,0,5) eq $type) { $dlg_title = uc substr($folder,0,5) . ' ' . $ext ; } # leave
$file_cnt++;
my $tag_id = $id ; $tag_id =~ s/\//\-/gi ;
if ($type eq 'all'){
$uploads .= qq(<a title='$dlg_title' data-toggle='tooltip' href=javascript:dlgMdl('/uploads/$id/$folder','$folder','','max-dialog');><img src='/img/icons/doc/$ext.png' style='width:20px;height:20px;'></a>&nbsp;) ;
}
elsif ($type eq 'canx'){
$uploads .= qq(<a id="attach-$tag_id-$file_cnt" style='margin-left:10px;' href="javascript:parent.dlgMdl('/uploads/$id/$folder','$dlg_title','','max-dialog');"><img src='/img/icons/doc/$ext.png' style='width:40px;height:40px;'></a><a href="javascript:void(0);" id="delete-attach-$tag_id-$file_cnt"><i class="glyphicon glyphicon-trash"></i></a>);
}
else
{
$uploads .= qq(<a id="attach-$tag_id-$file_cnt" style='margin-left:10px;' href="javascript:dlgMdl('/uploads/$id/$folder','$dlg_title','','max-dialog');"><img src='/img/icons/doc/$ext.png' style='width:40px;height:40px;'></a><a href="javascript:void(0);" id="delete-attach-$tag_id-$file_cnt"><i class="glyphicon glyphicon-trash"></i></a>);
}
$trigger_jquery_raw .= qq(\$('#delete-attach-$tag_id-$file_cnt').click(function (e) {
BootstrapDialog.confirm({
title: 'Confirm Delete',
message: 'Are you sure you want to delete <strong>$folder</strong>?',
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?$id&$folder" ;
\$.get(url);
\$('#attach-$tag_id-$file_cnt').hide() ;
\$('#delete-attach-$tag_id-$file_cnt').hide() ;
}else {
// alert('Nope.');
}
}
});
});) ;
}
}
return ($uploads) ;
} #-------------------------------------------------------------------------------
# sub common_load_params {
# for my $p ($q->param) {
# my $val = $q->param($p) ;
# $val =~ s/\"//g ;
# $i{$p} = $val ;
# # &common_debug("$p -> $p1 -> $p1cnt -> $val") ;
# if ($p =~ /\_/g){
# my ($p1,$p1cnt) = split(/\_/,$p) ;
# $i{$p1}{$p1cnt} = $val ;
# # print "<br>$p -> $p1 -> $p1cnt -> $val" ;
# }
# }
# } #------------------------------------------------------------------------------------------
sub common_time_diff_seconds {
my ($date1,$date2) = @_ ;
my $difference = Time::Piece->strptime("$date2", '%Y-%m-%d %H:%M:%S') - Time::Piece->strptime("$date1", '%Y-%m-%d %H:%M:%S') ;
my $seconds = $difference->seconds ;
return $seconds ;
} #------------------------------------------------------------------------------------------
sub common_time_opts {
for (1 .. 24) {
my $hh = sprintf("%02s",$_) ;
$hour_opts .= qq(<option value="$hh">$hh</option>) ;
}
for (1 .. 60) {
my $mm = sprintf("%02s",$_) ;
$min_opts .= qq(<option value="$mm">$mm</option>) ;
}
} #------------------------------------------------------------------------------------------
sub common_curr_opts {
$curr_opts = qq(<option value="ZAR">ZAR</option><option value="USD">USD</option><option value="GBP">GBP</option><option value="EUR">EUR</option>) ;
$curr_opts_2 = qq(<option SELECTED value="ZAR">ZAR</option><option value="USD">USD</option><option value="GBP">GBP</option><option value="EUR">EUR</option><option value="CAD">CAD</option><option value="AUD">AUD</option><option value="NZD">NZD</option>) ;
} #------------------------------------------------------------------------------------------
# sub common_select_opts {
# my ($field,$table,$dispfield,$fid,$required,$addfield,$where,$valfield,$addmore) = @_ ;
# $select{$field} = 1 ;
# my $val = '' ;
# if ($required) { $required{$field} = 1 ; }
# &db_min_ro($table,'*',$where,'','') ;
# foreach my $id (keys %{$db{$table}}) {
# # &common_debug("$table : $fid == $id") ;
# if ($fid == $id) { $selected = 'SELECTED'; } else { $selected = ''; }
# if (($db{$table}{$id}{$addfield}) and ($db{$table}{$id}{$dispfield} ne $db{$table}{$id}{$addfield})) { $disp_addfield = " ($db{$table}{$id}{$addfield})" ; } else { $disp_addfield = '' ; }
# my $disp_addmore = '' ;
# if ($display_addmore{$table}{$addmore}) {
# my $glyph = '' ;
# if ($db{$table}{$id}{$addmore} == 1) {
# # $glyph = qq(<i class="glyphicons glyphicons-tick"></i>);
# $disp_addmore = " - $addmore" ;
# }
# }
# if ($valfield) { $val = $db{$table}{$id}{$valfield} ; } else { $val = $id ; }
# $opts{$field} .= qq(<option value="$val" $selected $selected_multi{$val}>$db{$table}{$id}{$dispfield}$disp_addfield$disp_addmore</option>) ;
# }
# } #------------------------------------------------------------------------------------------
sub common_curr_symbols {
$common{'symbol'}{'GBP'} = '&pound' ;
$common{'symbol'}{'ZAR'} = 'R' ;
$common{'symbol'}{'USD'} = '&#36' ;
$common{'symbol'}{'EUR'} = '&#128' ;
$common{'pdfsymbol'}{'GBP'} = qq(£) ;
$common{'pdfsymbol'}{'ZAR'} = 'R' ;
$common{'pdfsymbol'}{'USD'} = '$' ;
$common{'pdfsymbol'}{'EUR'} = '€' ;
} #------------------------------------------------------------------------------------------
sub common_exchange_rates {
my $exchgfile = "/usr/lib/cgi-bin/scripts/cron/feed.dat";
open (IFILE, "$exchgfile") or print "Unable to open $exchgfile: $!" ;
flock (IFILE, LOCK_SH) or print "Can't lock $exchgfile: $!";
@exchng = <IFILE> ;
close (IFILE);
@exchng = sort @exchng ;
foreach $line (@exchng) {
chomp $line;
@linex = split(/\|/,$line);
my $from = $linex[0] ;
my $to = $linex[1] ;
my $rate = $linex[2] ;
my $prate = $linex[3] ;
my $ccapirate = $linex[4] ;
my $glyphicon = 'minus' ; if ($prate > $rate){ $glyphicon = 'arrow-down' ; } elsif ($rate > $prate) { $glyphicon = 'arrow-up' ; }
$x++ ;
# my $cushion = 10 ; # % cushion on exchange rate
# my $sell_rate = sprintf("%.2f", ( $rate / ((100+$cushion) / 100) )) ;
my $buy_rate = $ccapirate ;
my $sell_rate = sprintf("%.2f", ( $ccapirate / 0.975) ) ; # add 2.5%
$roe{$to} = $sell_rate ;
$roe_buy{$to} = $buy_rate ;
}
} #------------------------------------------------------------------------------------------
sub common_customer_hidden_db_fields {
&common_customer_sort_fields;
$ignore{iaction} = 1 ;
$ignore{logo} = 1 ;
$ignore{customer_nr} = 1 ;
$required{name} = 1 ; # alphanumeric
# $required{contact_email} = 6 ; # email
# $required{phone} = 1 ;
# $required{customer_nr} = 1 ;
$checkbox{active} = 1 ;
$checkbox{events} = 1 ;
$checkbox{analytics} = 1 ;
$hidden{last_updated} = 2 ;
$hidden{last_edited_by} = 2 ;
$hidden{date_time} = 2 ;
$hidden{user_id} = 2 ;
} #------------------------------------------------------------------------------------------
sub common_customer_sort_fields {
%sort_field = () ;
$sort_field{1} = 'active' ;
$sort_field{2} = 'events' ;
$sort_field{3} = 'analytics' ;
$sort_field{4} = 'name' ; # $preferred_title{name} = 'Customer Name' ;
$sort_field{5} = 'customer_nr' ;
$sort_field{6} = 'phone' ; $preferred_title{phone} = 'Tel' ;
$sort_field{7} = 'company_email' ;
$sort_field{8} = 'contact_name' ;
$sort_field{9} = 'contact_email' ;
$sort_field{10} = 'physical_address' ;
$sort_field{11} = 'postal_address' ;
$sort_field{12} = 'city' ;
$sort_field{13} = 'province' ;
$sort_field{14} = 'country' ;
$sort_field{15} = 'vat_nr' ;
} #-------------------------------------------------------------------------------
sub common_load_quote_vars {
my ($sql_where) = @_ ;
my $t1 = 'cameras' ;
my $t2 = 'quotes' ;
my $tables = "$t1,$t2" ;
# my $sql_match_credits = '' ;
# if ($cnt_match_credits) { # match_credits_report.pl
# for (1 .. $cnt_match_credits) {
# $sql_match_credits .= qq~,$t2.item_$_\_costing_match_credits~ ;
# }
# }
my $sel_fields = qq~$t1.id AS 'cam_id',$t1.camera_nr,$t1.serial_nr,$t1.quote_linked_vpu,$t1.quote_delivery_date,$t1.quote_active_date,$t1.quote_cam_num,$t2.quote_nr AS 'q_nr',$t2.id AS 'quote_id',$t2.ref,$t2.camera_system_id,$t2.type,$t2.quote_to,$t2.quote_accepted,$t2.quote_cancelled,$t2.invoice_date,$t2.qty,$t2.total_1_purchase_summary,$t2.total_2_purchase_summary,$t2.total_3_purchase_summary$sql_match_credits~ ;
&db_min_ro($tables,"$sel_fields",$sql_where,'','') ;
foreach my $id (keys %{$db{$tables}}) {
my $quote_id = $db{$tables}{$id}{quote_id} ;
my $q_nr = $db{$tables}{$id}{q_nr} ;
my $cam_id = $db{$tables}{$id}{cam_id} ;
my $camera_nr = $db{$tables}{$id}{camera_nr} ;
my $serial_nr = $db{$tables}{$id}{serial_nr} ;
my $quote_linked_vpu = $db{$tables}{$id}{quote_linked_vpu} ;
my $quote_cam_num = $db{$tables}{$id}{quote_cam_num} ;
my $quote_delivery_date = $db{$tables}{$id}{quote_delivery_date} ;
my $quote_active_date = $db{$tables}{$id}{quote_active_date} ;
$quote_id{$q_nr} = $quote_id ;
$cnt_cams{$q_nr}++ ;
$quote_cam_active_date{$q_nr}{$quote_cam_num} = $quote_active_date ;
$quote_cam_delivery_date{$q_nr}{$quote_cam_num} = $quote_delivery_date ;
if (substr($camera_nr,0,3) eq 'VPU' and $quote_linked_vpu) {
$linked_sn{$quote_linked_vpu} = $serial_nr ;
$linked_cn{$quote_linked_vpu} = $camera_nr ;
}
$quote_customer{$cam_id} = $customer{$db{$tables}{$id}{quote_to}} ;
$quote_ref{$cam_id} = $db{$tables}{$id}{ref} ;
$quote_type{$cam_id} = ucfirst $db{$tables}{$id}{type} ;
# $quote_date_from{$cam_id} = $db{$tables}{$id}{date_from} ;
# $quote_date_to{$cam_id} = $db{$tables}{$id}{date_to} ;
$quote_accepted{$cam_id} = $db{$tables}{$id}{quote_accepted} ;
$quote_cancelled{$cam_id} = $db{$tables}{$id}{quote_cancelled} ;
$invoice_date{$cam_id} = $db{$tables}{$id}{invoice_date} ;
$quote_qty{$cam_id} = $db{$tables}{$id}{qty} ;
$quote_camera_system_id{$cam_id} = $db{$tables}{$id}{camera_system_id} ;
$quote_amount{$cam_id} = &common_commify(sprintf("%0.2f",($db{$tables}{$id}{total_1_purchase_summary} + $db{$tables}{$id}{total_2_purchase_summary} + $db{$tables}{$id}{total_3_purchase_summary}))) ;
$quote_camera_serial_nr{$cam_id} = $serial_nr ;
$quote_camera_camera_nr{$cam_id} = $camera_nr ;
$quote_nr{$cam_id} = $q_nr ;
# if ($cnt_match_credits) {
# for (1 .. $cnt_match_credits) {
# $quote_match_credits{$_}{$cam_id} = $db{$tables}{$id}{"item_$_\_costing_match_credits"} ;
# }
# }
}
} #------------------------------------------------------------------------------------------
sub common_status_txt {
my ($completed,$accepted,$pending,$cancelled,$rejected) = @_ ;
my $txt = ($completed) ? 'Completed' : ($accepted) ? 'Accepted' : ($pending) ? 'Pending' : ($cancelled) ? 'Cancelled' : ($rejected) ? 'Rejected' : 'Changed' ;
return ($txt) ;
} #------------------------------------------------------------------------------------------
# sub common_load_quote_vars {
# my ($sql_camera_nr_where) = @_ ;
# my $suffix = '_camera_details' ;
# # my $add_quote_fields = '' ; my $sql_or_where = '' ; my @sqlorwhere = () ;
# # for (1 .. 10) {
# # $add_quote_fields .= ",camera_nr_$_$suffix,delivery_date_$_$suffix,active_date_$_$suffix,ew_date_from_$_$suffix,ew_date_to_$_$suffix,ref_$_$suffix" ;
# # push @sqlorwhere, "camera_nr_$_$suffix $sql_camera_nr_where" ;
# # }
# # $sql_or_where = join(" OR ",@sqlorwhere) ;
# my $sel_fields = qq~id,quote_nr,ref,camera_system_id,date_from,date_to,type,quote_to$add_quote_fields~ ;
# &db_min_ro('quotes',"$sel_fields",$sql_or_where,'','') ;
# foreach my $id (keys %{$db{quotes}}) {
# my $quote_id = $id ;
# my $quote_nr = $db{quotes}{$id}{quote_nr} ;
# $quote_customer{$quote_nr} = $customer{$db{quotes}{$id}{quote_to}} ;
# $quote_ref{$quote_nr} = $db{quotes}{$id}{ref} ;
# $quote_type{$quote_nr} = ucfirst $db{quotes}{$id}{type} ;
# $quote_date_from{$quote_nr} = $db{quotes}{$id}{date_from} ;
# $quote_date_to{$quote_nr} = $db{quotes}{$id}{date_to} ;
# # for (1 .. 10) {
# # my $field = $db{quotes}{$id}{"camera_nr_$_$suffix"} ;
# # my $delivery_date = $db{quotes}{$id}{"delivery_date_$_$suffix"} ;
# # my $active_date = $db{quotes}{$id}{"active_date_$_$suffix"} ;
# # my $ew_date_from = $db{quotes}{$id}{"ew_date_from_$_$suffix"} ;
# # my $ew_date_to = $db{quotes}{$id}{"ew_date_to_$_$suffix"} ;
# # my $ref = $db{quotes}{$id}{"ref_$_$suffix"} ;
# # if ($field) {
# # $camera_exists_on_quote{$field} = $id ;
# # $quote_nr{$field} = $db{quotes}{$id}{quote_nr} ;
# # $camera_on_quote_cnt{$quote_nr{$field}}{$_} = $field ;
# # $quote_ref{$field} = $db{quotes}{$id}{ref} ;
# # $quote_type{$field} = ucfirst $db{quotes}{$id}{type} ;
# # $quote_date_from{$field} = $db{quotes}{$id}{date_from} ;
# # $quote_date_to{$field} = $db{quotes}{$id}{date_to} ;
# # $quote_customer{$field} = $customer{$db{quotes}{$id}{quote_to}} ;
# # $quote_cam_ref{$field} = $ref ;
# # $quote_delivery_date{$field} = $delivery_date ;
# # $quote_active_date{$field} = $active_date ;
# # $quote_ew_date_from{$field} = $ew_date_from ;
# # $quote_ew_date_to{$field} = $ew_date_to ;
# # }
# }
# }
# } #------------------------------------------------------------------------------------------
sub common_check_for_linked_vpu {
my ($camera_nr,$quote_nr,$id,$req) = @_ ;
# unless (substr($camera_nr,0,2) eq 'S1' or substr($camera_nr,0,5) eq 'Prime' or substr($camera_nr,0,5) eq 'Coach') { return('','') ;
# &db_min_ro('cameras',"$sel_fields",$sql_or_where,'','') ;
# foreach my $id (keys %{$db{quotes}}) {
# my $quote_id = $id ;
# my $quote_nr = $db{quotes}{$id}{quote_nr} ;
# }
# }
$req = 'SN' unless $req ;
my $val = '' ;
# if (substr($camera_nr,0,2) eq 'S1' or substr($camera_nr,0,5) eq 'Prime' or substr($camera_nr,0,5) eq 'Coach') {
if (substr($camera_nr,0,2) eq 'S1' or substr($camera_nr,0,2) eq 'S2' or substr($camera_nr,0,5) eq 'Prime' or substr($camera_nr,0,5) eq 'Coach') {
# &common_debug("vpu_serial_nr : $camera_nr") ;
# foreach $camcnt (sort {$camera_on_quote_cnt{$quote_nr}{$a} cmp $camera_on_quote_cnt{$quote_nr}{$b}} keys %{$camera_on_quote_cnt{$quote_nr}}) {
foreach $camcnt (sort {$a <=> $b} keys %{$camera_on_quote_cnt{$quote_nr}}) {
my $camid = $camera_on_quote_cnt{$quote_nr}{$camcnt} ;
my $camnrabrv = substr($cam_nr{$camid},0,3) ;
# &common_debug("vpu_serial_nr [3] camnrabrv=$camnrabrv, getnext=$getnext") ;
if ($getnext and $camnrabrv eq 'VPU') { $val = $req eq 'CN' ? $cam_nr{$camid} : $serial_nr{$camid} ; }
$getnext=0; if ($camid eq $id) { $getnext=1; }
# &common_debug("vpu_serial_nr [$camcnt], camid=$camid, id=$id, camnrabrv=$camnrabrv, getnext=$getnext") ;
}
}
return ($val) ;
} #------------------------------------------------------------------------------------------
sub common_camera_system_filter {
my ($table,$id) = @_ ;
my $next = 0 ;
if ($i{stock} eq 'stock') { if ($db{$table}{$id}{quote_nr} or $db{$table}{$id}{demo_recipient} or $db{$table}{$id}{replacement_date}) { $next = 1 ; } }
if ($i{stock} eq 'purchased') { unless ($db{$table}{$id}{quote_nr}) { $next = 1 ; } }
if ($i{stock} eq 'purchase') { unless (lc $quote_type{$id} eq 'purchase' and $db{$table}{$id}{quote_nr}) { $next = 1 ; } }
if ($i{stock} eq 'demo') { unless ($db{$table}{$id}{demo_recipient} ) { $next = 1 ; } }
if ($i{stock} eq 'rental') { unless ($db{$table}{$id}{camera_system_id}<7 and lc $quote_type{$id} eq 'rental') { $next = 1 ; } }
if ($i{stock} eq 'event') { unless ($db{$table}{$id}{event_system_id} > 0) { $next = 1 ; } }
if ($i{camera_system_id} eq 'main') { unless ($db{$table}{$id}{camera_system_id}<7) { $next = 1 ; } }
if ($i{camera_system_id} eq 'other') { unless ($db{$table}{$id}{camera_system_id}>7) { $next = 1 ; } }
if ($db{$table}{$id}{event_system_id} > 0) { unless ($i{stock} eq 'event' or $i{stock} eq '') { $next = 1 ; } }
# &common_debug("common_camera_system_filter : next [$next], stock=$i{stock}, event_system_id=$db{$table}{$id}{event_system_id}, quote_type=$quote_type{$id}, camera_system_id=$db{$table}{$id}{camera_system_id}, quote_nr=$db{$table}{$id}{quote_nr}, demo_recipient=$db{$table}{$id}{demo_recipient}") ;
return ($next) ;
} #------------------------------------------------------------------------------------------
sub common_camera_opts {
$opts{camera_system_id} = qq~<option SELECTED value="all">All</option><option value="main">Main</option><option value="other">Other</option>~ ;
$opts{stock} = qq~<option value=""></option>
<option value="purchase">Purchased</option>
<option value="stock">In Stock</option>
<option value="rental">Rental</option>
<option value="demo">Demo</option>
<option value="event">Event</option>~ ;
# <option value="active">Active</option>
} #------------------------------------------------------------------------------------------
sub common_camera_links {
my ($table,$id,$val) = @_ ;
if ($_ eq 'camera_nr') {
my $class = 'info' ; $class = 'warning' if $db{$table}{$id}{quote_nr} ;
my $style = '' ; $style = "background-color:purple;border:purple;" if $db{$table}{$id}{demo_recipient} ; $style = "background-color:#ff00fb;border:#ff00fb;" if $db{$table}{$id}{event_system_id} ;
# &common_debug("event_system_id=$db{$table}{$id}{event_system_id}, camera_system_id=$db{$table}{$id}{camera_system_id}, camera_nr=$db{$table}{$id}{camera_nr} [style=$style]") ;
# my $tooltip = qq~data-toggle="tooltip" data-placement="top" data-title=""~ ;
$val = qq~<a class="btn btn-$class btn-xs" href="javascript:editMinItem('$id','cameras');" style="padding: 0px 3px 0px 3px;font-size:12px;$style" $tooltip>$val</a>~ ;
}
if ($_ eq 'quote_nr' or $_ eq 'ref_nr' or $_ eq 'ref') {
my $class = 'info' ; $class = 'warning' if $val ;
my $style = '' ; $style = "style='background-color:purple;'" if $db{$table}{$id}{demo_recipient} ; $class = 'success' if $db{$table}{$id}{quote_accepted} or $quote_accepted{$id} ; $class = 'danger' if $db{$table}{$id}{quote_cancelled} or $quote_cancelled{$id} ;
my $quote_id = $quote_id{$val} ? $quote_id{$val} : $id ;
my $js_func = ($table eq 'event_quotes') ? 'editEventQuote' : 'editQuote' ;
$val = $val ? qq~<a class="btn btn-$class btn-xs" href="javascript:$js_func('$quote_id');" style="padding: 0px 3px 0px 3px;font-size:12px">$val</a>~ : '' ;
}
return ($val) ;
} #------------------------------------------------------------------------------------------
sub common_write_date_interval {
my ($date_from,$date_to) = @_ ;
my @months = ("","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec") ;
$date_from = substr($date_from,0,10) ;
$date_to = substr($date_to,0,10) ;
my ($start_year,$start_mon,$start_day) = split("-",$date_from) ;
my ($end_year,$end_mon,$end_day) = split("-",$date_to) ;
$start_mon = int($start_mon) ; $end_mon = int($end_mon) ;
my $date = "" ;
if ($start_year ne $end_year) {
$date = "$start_day $months[$start_mon] $start_year - $end_day $months[$end_mon] $end_year" ;
} elsif ($start_mon ne $end_mon) {
$date = "$start_day $months[$start_mon]- $end_day $months[$end_mon] $end_year" ;
} elsif ($start_day ne $end_day) {
$date = "$start_day - $end_day $months[$end_mon] $end_year" ;
} elsif ($start_day eq $end_day) {
$date = "$end_day $months[$end_mon] $end_year" ;
}
return ($date) ;
} #-------------------------------------------------------------------------------
sub common_check_if_string_contains_an_integer {
my $string = shift;
return $string =~ /\d/ ;
} #-------------------------------------------------------------------------------
sub common_check_if_time_is_greater {
local ($time1,$time2) = @_ ;
local $epoch1 = Time::Piece->strptime($time1, '%Y-%m-%d %H:%M:%S');
local $epoch2 = Time::Piece->strptime($time2, '%Y-%m-%d %H:%M:%S');
local $moving_forward = 0 ;
if ($epoch1 <= $epoch2) {
$moving_forward = 1 ;
}
return ($moving_forward) ;
} #------------------------------------------------------------------------------------------
sub common_add_delta_days {
my ($days) = @_ ;
my ($year,$month,$day) = Add_Delta_Days($now_year,$now_mm,$now_dd,$days); #
$month = sprintf("%02s", $month) ;
$day = sprintf("%02s", $day) ;
return("$year-$month-$day");
} #-------------------------------------------------------------------------------
sub common_add_delta_ymd {
my ($nyear,$nmonth,$nday) = @_ ;
my ($syear,$smonth,$sday) = Add_Delta_YMD($now_year,$now_mm,$now_dd, $nyear,$nmonth,$nday);
$smonth = sprintf("%02s", $smonth) ;
$sday = sprintf("%02s", $sday) ;
return ($syear,$smonth,$sday) ;
} #-------------------------------------------------------------------------------
sub common_add_delta_dhms {
my ($year,$mm,$dd,$hour,$min,$sec,$days_diff,$hrs_diff,$min_diff,$sec_diff) = @_ ;
my ($syear,$smonth,$sday,$shour,$smin,$ssec) = Add_Delta_DHMS($year,$mm,$dd,$hour,$min,$sec,$days_diff,$hrs_diff,$min_diff,$sec_diff) ; #
$smonth = sprintf("%02s", $smonth) ;
$sday = sprintf("%02s", $sday) ;
$shour = sprintf("%02s", $shour) ;
$smin = sprintf("%02s", $smin) ;
$ssec = sprintf("%02s", $ssec) ;
return("$syear-$smonth-$sday","$shour:$smin:$ssec","$syear$smonth$sday$shour$smin$ssec");
} #-------------------------------------------------------------------------------
sub common_split_sql_time {
my ($datetime) = @_ ; # 2015-10-06 17:35:39
my ($date,$time) = split(/ /,$datetime) ;
my $dy = substr($date,0,4) ;
my $dm = substr($date,5,2) ;
my $dd = substr($date,8,2) ;
my ($th,$tm,$ts) = split(/:/,$time) ;
return ($dy,$dm,$dd,$th,$tm,$ts) ;
} #-------------------------------------------------------------------------------
sub common_get_next_monday_sunday {
my $dow = Day_of_Week($now_year,$now_mm,$now_dd);
my ($next_monday_year, $next_monday_month, $next_monday_day) = Add_Delta_Days($now_year,$now_mm,$now_dd, 8 - $dow);
$next_monday_month = sprintf("%02s", $next_monday_month) ;
$next_monday_day = sprintf("%02s", $next_monday_day) ;
my ($next_sunday_year, $next_sunday_month, $next_sunday_day) = Add_Delta_Days($next_monday_year,$next_monday_month,$next_monday_day,6);
$next_sunday_month = sprintf("%02s", $next_sunday_month) ;
$next_sunday_day = sprintf("%02s", $next_sunday_day) ;
return("$next_monday_year-$next_monday_month-$next_monday_day","$next_sunday_year-$next_sunday_month-$next_sunday_day");
} #-------------------------------------------------------------------------------
sub common_get_this_monday_sunday {
my $dow = Day_of_Week($now_year,$now_mm,$now_dd);
my ($this_monday_year, $this_monday_month, $this_monday_day) = Add_Delta_Days($now_year,$now_mm,$now_dd, 1 - $dow);
$this_monday_month = sprintf("%02s", $this_monday_month) ;
$this_monday_day = sprintf("%02s", $this_monday_day) ;
my ($this_sunday_year, $this_sunday_month, $this_sunday_day) = Add_Delta_Days($this_monday_year,$this_monday_month,$this_monday_day,6);
$this_sunday_month = sprintf("%02s", $this_sunday_month) ;
$this_sunday_day = sprintf("%02s", $this_sunday_day) ;
return("$this_monday_year-$this_monday_month-$this_monday_day","$this_sunday_year-$this_sunday_month-$this_sunday_day");
} #-------------------------------------------------------------------------------
sub common_page_name {
my @splitlcpage = split(/\-/,$lcpage) ;
my @ucfirstpage = map(ucfirst, map(lc,@splitlcpage));
our $ucfirstpage = join(' ', @ucfirstpage);
our $ucpage = uc $ucfirstpage ;
} #-------------------------------------------------------------------------------
sub common_commify {
local($_) = shift;
1 while s/^(-?\d+)(\d{3})/$1,$2/;
return $_;
} #-------------------------------------------------------------------------------
sub common_debug {
my ($msg) = @_ ;
unless ((substr($username,0,4) eq 'rory' || $username eq 'handre') && ($testing || $debug)) { return ; }
print $msg . "\n" ;
} #------------------------------------------------------------------------------------------
sub common_send_mail {
my ($to,$cc,$bcc,$html,$thead,$msg,$subj,$tmsg) = @_ ;
return if $env eq 'DEV' ;
return unless $msg ;
return unless $subj ;
# my $cc = 'cc1@example.com, cc2@example.com'; # multiple cc's
# $smtp->to(split(/\s*,\s*/, $cc)); # split and add each
use Net::SMTPS;
# # SMTP configuration
# my $smtp_host = $afrihost_smtp ;
# my $smtp_port = $afrihost_port ;
# my $smtp_user = $afrihost_from ;
# my $smtp_pass = $afrihost_psw ;
my $from = $afrihost_from ;
# # Create SMTPS object
# my $smtp = Net::SMTPS->new(
# $smtp_host,
# Port => $smtp_port,
# doSSL => 'ssl', # Ensure SSL from start (port 465)
# Timeout => 30,
# Debug => 1, # Optional: for debug output
# );
# # Authenticate
# $smtp->auth($smtp_user, $smtp_pass) or die "SMTP Auth failed: $!";
my $smtp = Net::SMTPS->new('localhost') or die "Can't connect";
# Send the email
$smtp->mail($from);
$smtp->to($to);
# $smtp->to($cc) if $cc ;
$cc =~ s/\;/\,/g ;
$smtp->to(split(/\s*,\s*/, $cc)) if $cc ; # split and add each
$bcc =~ s/\;/\,/g ;
$smtp->to(split(/\s*,\s*/, $bcc)) if $bcc;
my $body = ($html) ? &common_get_mail_body($msg,$tmsg,$thead) : $msg ;
$smtp->data();
$smtp->datasend("From: $from\n");
$smtp->datasend("To: $to\n");
$smtp->datasend("Cc: $cc\n") if $cc ; # visible
# Do NOT include Bcc in headers
$smtp->datasend("Subject: $subj\n");
$smtp->datasend("MIME-Version: 1.0\n") if $html ;
$smtp->datasend("Content-Type: text/html; charset=UTF-8\n") if $html ;
$smtp->datasend("\n"); # empty line between headers and body
$smtp->datasend("$body\n");
$smtp->dataend();
$smtp->quit;
} #------------------------------------------------------------------------------------------
sub common_send_smtp_mail {
my ($from,$to,$cc,$bcc,$subj,$msg,$table_msg,$html,$thead,$attachpath,$attachname,$attachapplication,$uploaded_doc,$operator_email) = @_ ;
&common_debug("common_send_smtp_mail [$from,$to,$cc,$bcc,$subj,$msg,$table_msg,$html,$thead,$attachpath,$attachname,$attachapplication,$uploaded_doc,$operator_email]") ;
return if $env eq 'DEV' ;
return unless $msg ;
return unless $subj ;
# my $htype = (-f "$attachpath/$attachname" || $uploaded_doc || $operator_email) ? 'htmlattach' : ($html eq 'html') ? $html : 'text' ;
# my $res = &common_mailsend_sendgrid($htype,$to,$subj,$msg,$attachpath,$attachname,"$useropts{short} Events",'events@itvadmin.co.za',$cc,$bcc,$uploaded_doc,$operator_email);
# return if $res eq 'success' ; # carry on if mailsend_sendgrid failed
my $main_email = $email_add{'events'} ;
$to = $main_email unless $to ;
$from = $afrihost_from unless $from ;
my $mail_body = ($html) ? &common_get_mail_body($msg,$table_msg,$thead) : $msg ;
if ($html) {
if ($attachname && -f "$attachpath/$attachname") {
&common_debug("common_send_smtp_mail attach : $attachpath/$attachname [$attachapplication]") ;
&common_email_with_attachments($from,$to,$cc,$bcc,$subj,$msg,$table_msg,$html,$thead,$attachpath,$attachname,$attachapplication) ;
return ;
}
if ($uploaded_doc) {
my @parts = split(/\//,$uploaded_doc) ;
$attachname = $parts[-1] ;
pop @parts ;
$attachpath = join("/",@parts) ;
&common_email_with_attachments($from,$to,$cc,$bcc,$subj,$msg,$table_msg,$html,$thead,$attachpath,$attachname,'') ;
return ;
}
if ($operator_email) {
&common_email_with_attachments($from,$to,$cc,$bcc,$subj,$msg,$table_msg,$html,$thead,"$htmlpath/pdf/operator_flyer/operator_email_attach.pdf",'operator_email_attach.pdf','pdf') ;
return ;
}
&common_send_mail($to,$cc,$bcc,$html,$thead,$msg,$subj,$table_msg) ;
} else {
&common_send_mail($to,$cc,$bcc,$html,$thead,$msg,$subj,$table_msg) ;
}
} #------------------------------------------------------------------------------------------
sub common_get_mail_body {
my ($email_msg,$table_msg,$thead) = @_ ;
my $br = ($email_msg) ? '<br><br>' : '' ;
my $mail_body = <<END_OF_BODY;
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
<title></title>
<style type="text/css">
body { background-color:#ffffff; color:#222222; }
tbody tr td { font-size: 11px; }
.table th{background-color:#fff !important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}
.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#EEEEEE; color:#222222; }
.table-striped>tbody>tr:nth-child(even)>td,.table-striped>tbody>tr:nth-child(even)>th{ background-color:#A4A2A2; color:#ffffff; }
.table-striped>tbody>tr:nth-child(odd)>td a:not(.btn) { text-decoration: none; color: #FF6600; font-weight: bold; }
.table-striped>tbody>tr:nth-child(even)>td a:not(.btn) { text-decoration: none; color: #EC1C24; font-weight: bold; }
.table>thead>tr>th, .table>tbody>tr>th, .table>tfoot>tr>th, .table>thead>tr>td, .table>tbody>tr>td, .table>tfoot>tr>td { height: 8px; vertical-align: middle; }
</style>
</head>
<body style="background-color: #FFFFFF; font-family: Arial, Helvetica, sans-serif; font-size: 13px">
<div align="center">
<a href="https://interactivetvafrica.com/"><img alt="$useropts{short}" src="https://$useropts{web}/img/email_logo.jpg" border="0"></a>
<br><br>
$email_msg
$br
<table id="safet-table" class="table table-striped table-bordered bootstrap-datatable datatable responsive">
$thead
<tbody>
$table_msg
</tbody>
</table>
<br>
<p>$display_notif_msg
Best regards,
<br>
<br>
The $useropts{short} Team.
</p>
</div>
</body>
</html>
END_OF_BODY
return ($mail_body) ;
} #----------------------------------------------------------------------------------------
sub common_email_with_attachments {
my ($from,$to,$cc,$bcc,$subj,$text_msg,$table_msg,$html,$thead,$attachpath,$attachname,$attachapplication) = @_ ;
use MIME::Lite;
use Net::SMTP_auth;
return if $env eq 'DEV' ;
# # SMTP configuration
# my $smtp_host = $afrihost_smtp ;
# my $smtp_port = $afrihost_port ;
# my $smtp_user = $afrihost_from ;
# my $smtp_pass = $afrihost_psw ;
$from = $afrihost_from ;
# HTML body part
my $mail_body = &common_get_mail_body($text_msg,$table_msg) ;
my $fullattachpath = "$attachpath/$attachname";
die "Attachment file not found: $fullattachpath" unless -e $fullattachpath;
# === build the MulitPart MIME Message ===
# Create the Message
my $msg = MIME::Lite::->new(
'From' => "$useropts{short} Events <$from>",
'Reply-To' => $email_reply_to,
'To' => $to,
'Cc' => $cc,
'Bcc' => $bcc,
'Subject' => $subj,
'Type' => 'multipart/mixed',
);
# Create the HTML part
my $html_part = MIME::Lite::->new(
'Type' => 'multipart/related',
);
$html_part->attach(
'Type' => 'text/html',
'Data' => $mail_body,
) ;
# === Attachments ===
my $attachtype = ($attachapplication) ? "application/$attachapplication" : 'AUTO' ; # application/pdf or application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
my $attach_part = MIME::Lite::->new(
'Type' => 'multipart/mixed',
);
$attach_part->attach (
Type => "$attachtype",
Encoding => 'base64',
Path => "$fullattachpath",
Filename => $attachname,
Disposition => 'attachement'
) ;
$msg->attach($attach_part);
$msg->attach($html_part);
my $email = $msg->as_string();
my $smtp_msg = Net::SMTP_auth->new('localhost') or die "Can't connect";
# my $smtp_msg = Net::SMTP_auth->new($smtp_host, Port=>587) or die "Can't connect";
# $smtp_msg->auth('PLAIN', $smtp_user, $smtp_pass) or die "Can't authenticate:" . $smtp_msg->message();
$smtp_msg->mail($from) or die "Error:" . $smtp_msg->message();
$smtp_msg->to($_) for split(/\s*,\s*/, join(',', $to, $cc, $bcc));
# $smtp_msg->recipient($to) or die "Error:".$smtp_msg->message();
$smtp_msg->data() or die "Error:".$smtp_msg->message();
$smtp_msg->datasend($email) or die "Error:".$smtp_msg->message();
$smtp_msg->dataend() or die "Error:".$smtp_msg->message();
$smtp_msg->quit or die "Error:".$smtp_msg->message();
} #----------------------------------------------------------------------------------------
# sub common_send_mail {
# my ($to,$cc,$bcc,$html,$thead,$msg,$subj) = @_ ;
# return unless $msg ;
# return unless $subj ;
# # my $res = &common_mailsend_sendgrid('html',$to,$subject,$emailmsg,'','','Film Freight','pod@ffwaybill.co.za');
# # return if $res eq 'success' ; # carry on if mailsend_sendgrid failed
# use Mail::Sendmail;
# my $main_email = 'tickets@interactivetvafrica.com' ;
# $to = $main_email unless $to ;
# my %mail = () ;
# %mail = (
# smtp => 'localhost',
# From => $main_email,
# To => $to,
# Cc => $cc,
# Bcc => $bcc,
# Subject => $subj
# );
# $mail{smtp} = "smtp.interactivetvafrica.com";
# # $mail{Debug} = 6;
# $mail{port} = 587;
# # $mail{port} = 465;
# $mail{Auth} = {user => $main_email, pass => $send_mail_psw, method => "LOGIN", required => 1};
# $mail{body} = <<END_OF_BODY;
# $msg
# END_OF_BODY
# if ($html) {
# my $boundary = "====" . time() . "====";
# $mail{'content-type'} = "multipart/alternative; boundary=\"$boundary\"";
# $boundary = '--'.$boundary;
# $mail{body} = <<END_OF_BODY;
# $boundary
# Content-Type: text/html; charset=ISO-8859-1
# Content-Transfer-Encoding: 7bit
# <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
# <html>
# <head>
# <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
# <title>$useropts{short}</title>
# <style type="text/css">
# body { background-color:#ffffff; color:#222222; }
# tbody tr td { font-size: 11px; }
# .table th{background-color:#fff !important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}
# .table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#EEEEEE; color:#222222; }
# .table-striped>tbody>tr:nth-child(even)>td,.table-striped>tbody>tr:nth-child(even)>th{ background-color:#A4A2A2; color:#ffffff; }
# .table-striped>tbody>tr:nth-child(odd)>td a:not(.btn) { text-decoration: none; color: #FF6600; font-weight: bold; }
# .table-striped>tbody>tr:nth-child(even)>td a:not(.btn) { text-decoration: none; color: #EC1C24; font-weight: bold; }
# .table>thead>tr>th, .table>tbody>tr>th, .table>tfoot>tr>th, .table>thead>tr>td, .table>tbody>tr>td, .table>tfoot>tr>td { height: 8px; vertical-align: middle; }
# </style>
# </head>
# <body style="background-color: #FFFFFF; font-family: Arial, Helvetica, sans-serif; font-size: 13px">
# <div align="center">
# <a href="https://interactivetvafrica.com/"><img alt="$useropts{short}" src="https://$ENV{SERVER_NAME}/img/email_logo.jpg" border="0"></a>
# <br><br>
# <table id="itv-table" class="table table-striped table-bordered bootstrap-datatable datatable responsive">
# $thead
# <tbody>
# $msg
# </tbody>
# </table>
# <br>
# <p>
# Best regards,
# <br>
# <br>
# The $useropts{short} Team.
# </p>
# </div>
# </body>
# </html>
# $boundary--
# END_OF_BODY
# }
# sendmail(%mail) ;
# } #------------------------------------------------------------------------------------------
# sub common_send_smtp_mail {
# my ($from,$to,$cc,$bcc,$subj,$msg,$table_msg,$html,$thead,$attachpath,$attachname,$attachapplication,$uploaded_doc,$operator_email) = @_ ;
# &common_debug("common_send_smtp_mail [$from,$to,$cc,$bcc,$subj,$msg,$table_msg,$html,$thead,$attachpath,$attachname,$attachapplication,$uploaded_doc,$operator_email]") ;
# return unless $msg ;
# return unless $subj ;
# # my $htype = (-f "$attachpath/$attachname" || $uploaded_doc || $operator_email) ? 'htmlattach' : ($html eq 'html') ? $html : 'text' ;
# # my $res = &common_mailsend_sendgrid($htype,$to,$subj,$msg,$attachpath,$attachname,"$useropts{short} Events",'events@itvadmin.co.za',$cc,$bcc,$uploaded_doc,$operator_email);
# # return if $res eq 'success' ; # carry on if mailsend_sendgrid failed
# my $main_email = $email_add{'events'} ;
# $to = $main_email unless $to ;
# $from = $main_email unless $from ;
# my $mail_body = ($html) ? &common_get_mail_body($msg,$table_msg,$thead) : $msg ;
# if ($html) {
# if (($attachname && -f "$attachpath/$attachname") or $uploaded_doc) {
# use MIME::Lite;
# use Net::SMTP_auth;
# # #################################################################
# # Lets build the MulitPart MIME Message
# # #################################################################
# # Create the Message
# my $msg = MIME::Lite::->new(
# 'From' => "$useropts{short} Events <$from>",
# 'Reply-To' => $email_reply_to,
# 'To' => $to,
# 'Cc' => $cc,
# 'Bcc' => $bcc,
# 'Subject' => $subj,
# 'Type' => 'multipart/mixed',
# );
# # Create the text part
# # my $text_part = MIME::Lite::->new(
# # 'Type' => 'text/plain',
# # 'Data' => 'Hi\nThis is a test message',
# # );
# # Create the HTML part
# my $html_part = MIME::Lite::->new(
# 'Type' => 'multipart/related',
# );
# $html_part->attach(
# 'Type' => 'text/html',
# 'Data' => $mail_body,
# ) ;
# if ($attachname && -f "$attachpath/$attachname") {
# my $attachtype = ($attachapplication) ? "application/$attachapplication" : 'AUTO' ;
# my $attach_part = MIME::Lite::->new(
# 'Type' => 'multipart/mixed',
# );
# $attach_part->attach (
# Type => "$attachtype",
# Encoding => 'base64',
# Path => "$attachpath/$attachname",
# Filename => $attachname,
# Disposition => 'attachement'
# ) or &common_send_mail('rory@kre8it.co.za','','','',"$useropts{short} ERROR : common.pm","common_send_smtp_mail cant attach $attachpath/$attachname : $!") ;
# $msg->attach($attach_part);
# }
# if ($uploaded_doc) {
# my $upload_part = MIME::Lite::->new(
# 'Type' => 'multipart/mixed',
# );
# $upload_part->attach (
# Type => 'AUTO',
# FH => $uploaded_doc,
# Filename => $uploaded_doc,
# Disposition => 'attachment'
# ) or die "Error adding : $uploaded_doc $!\n";
# $msg->attach($upload_part);
# }
# if ($operator_email) {
# my $attach_flyer = MIME::Lite::->new(
# 'Type' => 'multipart/mixed',
# );
# $attach_flyer->attach (
# Type => "application/$attachapplication",
# Encoding => 'base64',
# Path => "$htmlpath/pdf/operator_flyer",
# Filename => "operator_email_attach.pdf",
# Disposition => 'attachement'
# ) or &common_send_mail('handre@kre8it.co.za','','','',"$useropts{short} ERROR : common.pm","common_send_smtp_mail cant attach $attachpath/$attachname : $!") ;
# $msg->attach($attach_flyer);
# }
# # Now lets attach the text and html parts to the message
# # $msg->attach($text_part);
# $msg->attach($html_part);
# my $email = $msg->as_string();
# # #################################################################
# # Lets sent the Message
# # #################################################################
# my $smtp_msg = Net::SMTP_auth->new($smtp_server, Port=>587) or die "Can't connect";
# # my $smtp_msg = Net::SMTP_auth->new($smtp_server, Port=>465) or die "Can't connect";
# $smtp_msg->auth('PLAIN', $main_email, $send_mail_psw_events) or die "Can't authenticate:".$smtp_msg->message();
# $smtp_msg->mail($from) or die "Error:".$smtp_msg->message();
# $smtp_msg->recipient($to) or die "Error:".$smtp_msg->message();
# $smtp_msg->data() or die "Error:".$smtp_msg->message();
# $smtp_msg->datasend($email) or die "Error:".$smtp_msg->message();
# $smtp_msg->dataend() or die "Error:".$smtp_msg->message();
# $smtp_msg->quit or die "Error:".$smtp_msg->message();
# } else {
# &common_send_mail($to,$cc,$bcc,$html,$thead,$msg,$subj,$table_msg) ;
# }
# } else {
# &common_send_mail($to,$cc,$bcc,$html,$thead,$msg,$subj,$table_msg) ;
# }
# } #------------------------------------------------------------------------------------------
# sub common_mailsend_sendgrid {
# local ($qtype,$qemail,$qsubject,$qbody,$qattachfilepath,$qattachfilename,$qfromname,$qfromemail,$qccemail,$qbccemail,$uploaded_doc,$operator_email) = @_;
# $qccemail =~ s/\;/\,/g ;
# $qbccemail =~ s/\;/\,/g ;
# use Email::SendGrid::V3;
# &common_debug("common_mailsend_sendgrid [$qtype,$qemail,$qsubject,$qbody,$qattachfilepath,$qattachfilename,$qfromname,$qfromemail,$qccemail,$qbccemail,$uploaded_doc,$operator_email]") ;
# #=======================
# #REF1: https://docs.sendgrid.com/for-developers/sending-email/curl-examples
# #REF2: https://github.com/GrantStreetGroup/Email-SendGrid-V3
# #To Install:
# #cpan -i Email::SendGrid::V3
# #cd /root/perl5/lib/perl5
# #cp -R Email /usr/local/lib64/perl5
# #=======================
# my $sg = Email::SendGrid::V3->new(api_key => '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');
# $qbody =~ s/'/`/gi;
# $qbody =~ s/\r//gi;
# $qbody =~ s/\n//gi;
# #------------------------------------------------
# #SEND TEXT ONLY MAIL
# if ($qtype eq "text") {
# # , cc => [ $qccemail ], bcc => [ $qbccemail ]
# my %cc_args = ($qccemail) ? (cc => [ "$qccemail" ]) : () ;
# my %bcc_args = ($qbccemail) ? (bcc => [ "$qbccemail" ]) : () ;
# my $result = $sg->from($qfromemail,$qfromname)
# ->reply_to($email_reply_to, "$useropts{short} Events")
# ->subject($qsubject)
# ->add_content('text/plain', $qbody)
# ->add_envelope( to => [ "$qemail" ], %cc_args, %bcc_args)
# ->send;
# $qres = $result->{success} ? "success" : "error: " . $result->{reason};
# }
# #------------------------------------------------
# #SEND HTML ONLY MAIL
# if ($qtype eq "html") {
# my $logo_domain = ($useropts{web}) ? $useropts{web} : $ENV{SERVER_NAME} ;
# $qbody = qq~<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
# <html xmlns="http://www.w3.org/1999/xhtml">
# <head>
# <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
# <title>$useropts{short}</title>
# <style type="text/css"> .font { font-family: Tahoma, Geneva, sans-serif; } .font { font-size: 12px; }</style>
# </head>
# <body>
# <p>
# <img alt="" src="https://$logo_domain/img/email_logo.jpg" border="0">
# </p>
# <p>
# $qbody
# </p>
# <br />
# <br />
# </body>
# </html>
# ~;
# my %cc_args = ($qccemail) ? (cc => [ "$qccemail" ]) : () ;
# my %bcc_args = ($qbccemail) ? (bcc => [ "$qbccemail" ]) : () ;
# my $result = $sg->from($qfromemail,$qfromname)
# ->reply_to($email_reply_to, "$useropts{short} Events")
# ->subject($qsubject)
# ->add_content('text/html', $qbody)
# ->add_envelope( to => [ "$qemail" ], %cc_args, %bcc_args)
# ->send;
# $qres = $result->{success} ? "success" : "error: " . $result->{reason};
# }
# #------------------------------------------------
# #SEND HTML WITH ATTACHMENT MAIL
# if ($qtype eq "htmlattach") {
# my $encodedcontent = &encode_attachment("$qattachfilepath/$qattachfilename");
# my %args = (
# type => 'AUTO',
# disposition => 'attachment'
# );
# my $logo_domain = ($useropts{web}) ? $useropts{web} : $ENV{SERVER_NAME} ;
# $qbody = qq~<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
# <html xmlns="http://www.w3.org/1999/xhtml">
# <head>
# <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
# <title>$useropts{short}</title>
# <style type="text/css"> .font { font-family: Tahoma, Geneva, sans-serif; } .font { font-size: 12px; }</style>
# </head>
# <body>
# <p>
# <img alt="" src="https://$logo_domain/img/email_logo.jpg" border="0">
# </p>
# <p>
# $qbody
# </p>
# <br />
# <br />
# </body>
# </html>
# ~;
# my @attachments = ($qattachfilename, $encodedcontent, %args) ;
# if ($uploaded_doc) {
# my $encodedcontent = &encode_attachment("$uploaded_doc") ;
# push @attachments, ($uploaded_doc, $encodedcontent, %args) ;
# }
# if ($operator_email) {
# my $encodedcontent = &encode_attachment("$htmlpath/pdf/operator_flyer") ;
# push @attachments, ("operator_email_attach.pdf", $encodedcontent, %args) ;
# }
# my %cc_args = ($qccemail) ? (cc => [ "$qccemail" ]) : () ;
# my %bcc_args = ($qbccemail) ? (bcc => [ "$qbccemail" ]) : () ;
# my $result = $sg->from($qfromemail,$qfromname)
# ->reply_to($email_reply_to, "$useropts{short} Events")
# ->subject($qsubject)
# ->add_content('text/html', $qbody)
# ->add_attachment(@attachments)
# ->add_envelope( to => [ "$qemail" ], %cc_args, %bcc_args)
# ->send;
# $qres = $result->{success} ? "success" : "error: " . $result->{reason};
# #NOTE: Cannot use command line cURL here as the body (base64 pdf) is too large - below works for smaller content
# #$qres = `/usr/bin/curl --request POST --url https://api.sendgrid.com/v3/mail/send --header 'authorization: Bearer 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' --header 'Content-Type: application/json' --data '{"personalizations": [{"to": [{"email": "$qemail"}]}],"from": {"email": "no-reply\@myappointment.co.za"},"subject":"$qsubject","content": [{"type": "text/html","value": "$qbody"}], "attachments": [{"content": "$encodedcontent", "type": "text/plain", "filename": "$qattachfilename"}]}'`;
# }
# #------------------------------------------------
# &common_debug("common_mailsend_sendgrid [$qres]") ;
# return "$qres";
# } #------------------------------------------------------------------------------------------
sub encode_attachment {
my ($fh) = @_ ;
use MIME::Base64 qw(encode_base64);
my $myfilecontents = '' ;
open (infile, "$fh");
binmode infile;
while (<infile>) {
$myfilecontents .= "$_";
}
close(infile);
my $encodedcontent = encode_base64($myfilecontents);
$encodedcontent =~ s/'/`/gi;
$encodedcontent =~ s/\r//gi;
$encodedcontent =~ s/\n//gi;
return($encodedcontent) ;
} #------------------------------------------------------------------------------------------
sub common_fix_str {
my ($txt) = @_ ;
$txt = lc $txt ;
$txt =~ s/\'//iog ;
$txt =~ s/^\s+|\s+$//g; # remove whitespace before and after
local $txt_new = '' ;
foreach (split(/ /,$txt)) {
if ($_ ne 'and' and $_ ne 'or' and $_ ne 'of' and $_ ne 'in') {
$txt_new .= ucfirst $_ ;
} else {
$txt_new .= "$_" ;
}
$txt_new .= ' ' ;
}
chop $txt_new if $txt_new ;
return ($txt_new) ;
} #-------------------------------------------------------------------------------
sub common_date_array {
my ($from_date, $to_date) = @_ ;
my $date_array_date = $from_date ;
@common_date_array = () ;
# &common_debug ("common_date_array : $from_date, $to_date") ;
while ($date_array_date <= $to_date) {
# &common_debug ("common_date_array : push \@common_date_array, $date_array_date") ;
push @common_date_array, $date_array_date ;
my $array_date_dd = substr($date_array_date,6,2) ;
my $array_date_mm = substr($date_array_date,4,2) ;
my $array_date_ccyy = substr($date_array_date,0,4) ;
$day_of_week{$date_array_date} = Day_of_Week($array_date_ccyy,$array_date_mm,$array_date_dd) unless $day_of_week{$date_array_date} ; # 1 is Monday
# $day_of_week{"$array_date_ccyy-$array_date_mm-$array_date_dd"} = Day_of_Week($array_date_ccyy,$array_date_mm,$array_date_dd) unless $day_of_week{"$array_date_ccyy-$array_date_mm-$array_date_dd"} ; # 1 is Monday
# $date_hash{$date_array_date} = 1 ;
my ($ccyy,$month,$day) = Add_Delta_Days($array_date_ccyy,$array_date_mm,$array_date_dd,1) ;
$month = sprintf("%02s", $month) ;
$day = sprintf("%02s", $day) ;
$date_array_date = "$ccyy$month$day" ;
}
&common_debug ("common_date_array : @common_date_array") ;
} #-------------------------------------------------------------------------------
sub common_clean_json_one {
my ($txt) = @_ ;
# $txt =~ s/ //g;
$txt =~ s/\s+//g; # remove all spaces
$txt =~ s/\r\n|\n//g;
$txt =~ s/\t//g;
$txt = &common_clean_json_two($txt) ;
return ($txt) ;
} #----------------------------------------------------------------------------------------
sub common_clean_json_two {
my ($txt) = @_ ;
$txt =~ s/\r\n|\n/ /g;
$txt =~ s/\t/ /g;
$txt =~ s/\"//g;
$txt =~ s/\'//g;
$txt =~ s/\//g;
$txt =~ s/\</&lt;/g;
$txt =~ s/\>/&gt;/g;
$txt =~ s/\&/&amp;/g;
$txt =~ s/\Ë/E/g;
$txt =~ s/ +/ /g; # remove excess spaces
return ($txt) ;
} #----------------------------------------------------------------------------------------
sub common_reverse_geocode_osm_address {
my ($lat,$lng,$typ) = @_ ;
my $address = '' ; my $decoded_json = '' ;
my $url = "http://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=$lat&lon=$lng" ; # http://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=-32.851705&lon=24.727521&zoom=18&addressdetails=1&extratags=1 # https://wiki.openstreetmap.org/wiki/Key:highway # Google Roads API : https://roads.googleapis.com/v1/speedLimits?path=-32.851705,24.727521|-32.856349,24.730925|-32.89585,24.693126|-32.923483,24.675421&key=AIzaSyBVeP-dp1VpeceSo-80pukUBFaPsN_mcRw (https://developers.google.com/maps/documentation/roads/speed-limits)
my $json = get ($url) ; # or die "Couldn't get $url : $!";
if ($json) {
$decoded_json = decode_json $json ;
}
if ($typ eq 'min') {
my @add = () ; %gotpart = () ;
push @add, $decoded_json->{'address'}->{'road'} if $decoded_json->{'address'}->{'road'} ;
my ($suburb,$junk) = split / Ward /, $decoded_json->{'address'}->{'suburb'} ;
my ($suburb,$junk) = split / Industria /, $suburb ; $suburb =~ s/ Industrial//g ;
push @add, $suburb if $suburb ;
$gotpart{$suburb} = 1 ;
my $city = $decoded_json->{'address'}->{'city'} ; $city =~ s/ Local Municipality//g ;
if ($gotpart{$city}) {
push @add, $decoded_json->{'address'}->{'state'} if $decoded_json->{'address'}->{'state'} ;
} else {
push @add, $city if $city ;
}
my $country = $decoded_json->{'address'}->{'country'} ;
push @add, $country if $country and $country ne 'South Africa' ;
$address = join ", ", @add ;
} elsif ($json) {
$address = $decoded_json->{'display_name'} ;
&common_debug("[API] common_get_osm_address : [$url] [$address] ") ;
}
return ($address) ;
} #----------------------------------------------------------------------------------------
sub common_location_osm_address {
my ($loc) = @_ ;
my $address = '' ; my $postcode = '' ; my $suburb = '' ; my $city = '' ; my $decoded_json = '' ;
my $url = "https://nominatim.openstreetmap.org/search?q=$loc&format=json&addressdetails=1" ;
my $json = get ($url) ; # or die "Couldn't get $url : $!";
if ($json) {
$decoded_json = decode_json $json ;
}
&common_debug("[API] common_location_osm_address : [$url] [$decoded_json] ") ;
if (ref $decoded_json eq 'ARRAY' && @$decoded_json) {
my $amenity = $decoded_json->[0]->{'address'}->{'amenity'} ; # "Rondebosch Boys' High School"
my $road = $decoded_json->[0]->{'address'}->{'road'} ; # "Canigou Avenue"
$postcode = $decoded_json->[0]->{'address'}->{'postcode'} ; # "7700"
my @add = () ; %gotpart = () ;
push @add, $amenity if $amenity ;
push @add, $road if $road ;
($suburb,$junk) = split / Ward /, $decoded_json->[0]->{'address'}->{'suburb'} ;
($suburb,$junk) = split / Industria /, $suburb ; $suburb =~ s/ Industrial//g ;
push @add, $suburb if $suburb ;
$gotpart{$suburb} = 1 ;
$city = $decoded_json->[0]->{'address'}->{'city'} ; $city =~ s/ Local Municipality//g ; # "Cape Town"
if ($gotpart{$city}) {
push @add, $decoded_json->[0]->{'address'}->{'state'} if $decoded_json->[0]->{'address'}->{'state'} ;
} else {
push @add, $city if $city ;
}
my $country = $decoded_json->[0]->{'address'}->{'country'} ;
push @add, $country if $country and $country ne 'South Africa' ;
$address = join ", ", @add ;
} else {
return ('', '', '');
}
&common_debug("[API] common_location_osm_address : [suburb=$suburb] [postcode=$postcode] [address=$address]") ;
# 0
# place_id 60085165
# licence "Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright"
# osm_type "relation"
# osm_id 3068903
# lat "-33.9696668"
# lon "18.477931506136713"
# class "amenity"
# type "school"
# place_rank 30
# importance 0.3041234681398241
# addresstype "amenity"
# name "Rondebosch Boys' High School"
# display_name "Rondebosch Boys' High School, Canigou Avenue, Cape Town Ward 59, Cape Town, City of Cape Town, Western Cape, 7700, South Africa"
# address
# amenity "Rondebosch Boys' High School"
# road "Canigou Avenue"
# suburb "Cape Town Ward 59"
# city "Cape Town"
# county "City of Cape Town"
# state "Western Cape"
# ISO3166-2-lvl4 "ZA-WC"
# postcode "7700"
# country "South Africa"
# country_code "za"
# boundingbox
# 0 "-33.9728789"
# 1 "-33.9664854"
# 2 "18.4755388"
# 3 "18.4820403"
return ($suburb,$city,$postcode,$address) ;
} #----------------------------------------------------------------------------------------
sub common_log_changes {
my ($log,$nline) = @_ ;
unless ($log) { return ; }
$nline =~ s/[ ]+/ /g ; # Replaces all occurances of two spaces with one space
$nline =~ s/\n/ /g ; # substitutes a whitespace (\t\n\r\f) by a nothing - ie : removes all CR / LF etc
$nline =~ s/\t/ /g ; # substitutes a whitespace (\t\n\r\f) by a nothing - ie : removes all CR / LF etc
$nline =~ s/\r/ /g ; # substitutes a whitespace (\t\n\r\f) by a nothing - ie : removes all CR / LF etc
my $logfile = "/home/libs/data/logs/$log";
open (LFILE, "+>>$logfile") or die "can't open $logfile : $!" ;
flock (LFILE, LOCK_EX) or die "can't lock $logfile : $!" ;
seek (LFILE, 0, 0) or die "can't rewind $logfile : $!" ;
@lines = <LFILE> ;
seek (LFILE, 0, 0) or die "can't rewind $logfile : $!" ;
truncate (LFILE, 0) or die "can't truncate $logfile : $!" ;
my @sort_lines = reverse sort @lines ; # put newest ones first
my $log_cnt = 0 ;
print LFILE $nline . "\n" ;
foreach my $line (@sort_lines) { # 20181109104451||||
next unless $line ;
chomp $line;
@linex = split(/\|/,$line);
my $data_col = ($linex[4] eq 'changed_from' || $linex[4] =~/action='Add'/ || $linex[4] =~/action='Edit'/) ? 5 : 4 ;
my $num_of_data_splits = scalar @linex ;
for ($data_col+1 .. $num_of_data_splits) {
$linex[$data_col] .= qq~|$linex[$_]~ ;
}
my @changes = split(",","$linex[$data_col]") ;
my $num_of_changes = scalar @changes ;
next if $num_of_changes == 1 && ($changes[0] =~ /last_update/) ;
my $hashkey = $linex[2] . $linex[3] . $linex[$data_col] ;
# my $hashkey = $linex[2] . $linex[3] . $linex[5] . substr($linex[0],0,8) ;
if ($done_log_line{$hashkey}) { next ; }
if ($log_cnt > 10000) { last ; } # only retain 10000 lines
print LFILE "$line\n";
$done_log_line{$hashkey} = 1 ;
$log_cnt++;
}
close (LFILE) ;
} #----------------------------------------------------------------------------------------
sub common_fix_cell {
my ($cell) = @_ ;
$cell =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$cell =~ s/amp;//g;
$cell =~ s/\(//g;
$cell =~ s/\)//g;
$cell =~ s/ //g;
if ($cell == 0) {
return ;
} elsif ((substr($cell,0,1) == 0) and (length($cell) == 10)) { # e.g. 0825564120
$cell = 27 . substr($cell,1) ; # 27825564120
} elsif (substr($cell,0,1) eq '+') {
$cell = substr($cell,1) ; # 27825564120
}
return ($cell) ;
} #------------------------------------------------------------------------------------------
sub add_extra_region_filter {
my ($regions_sql) = @_ ;
my $sql_limit_user_regions = ($is_schools_manager || $is_operator) ? join(' OR ', map { "id = '$_'" } keys %{$glob_regids{$userid}}) : '' ;
if ($regions_sql && $sql_limit_user_regions) {
$regions_sql = "$regions_sql AND ($sql_limit_user_regions)" ;
} elsif (!$regions_sql && $sql_limit_user_regions) {
$regions_sql = $sql_limit_user_regions ;
}
return $regions_sql ;
}#-------------------------------------------------------------------------------
1;